xref: /aosp_15_r20/external/timezone-boundary-builder/lint-json.js (revision f0df97945b4fdddd066170b120f192941b8d7fbf)
1*f0df9794SNeil Fullerconst osmBoundarySources = require('./osmBoundarySources.json')
2*f0df9794SNeil Fullerconst zoneCfg = require('./timezones.json')
3*f0df9794SNeil Fullerconst expectedZoneOverlaps = require('./expectedZoneOverlaps.json')
4*f0df9794SNeil Fuller
5*f0df9794SNeil Fullerlet numErrors = 0
6*f0df9794SNeil Fuller
7*f0df9794SNeil Fullerconst sourcesUsage = {}
8*f0df9794SNeil FullerObject.keys(osmBoundarySources).forEach(source => {
9*f0df9794SNeil Fuller  sourcesUsage[source] = false
10*f0df9794SNeil Fuller})
11*f0df9794SNeil Fuller
12*f0df9794SNeil FullerObject.keys(zoneCfg).forEach(zone => {
13*f0df9794SNeil Fuller  zoneCfg[zone].forEach((operation, idx) => {
14*f0df9794SNeil Fuller    if (operation.source === 'overpass') {
15*f0df9794SNeil Fuller      // check if source is defined
16*f0df9794SNeil Fuller      if (!osmBoundarySources[operation.id]) {
17*f0df9794SNeil Fuller        numErrors++
18*f0df9794SNeil Fuller
19*f0df9794SNeil Fuller        console.error(`No osmBoundarySources config found for entry: ${operation.id}`)
20*f0df9794SNeil Fuller      } else {
21*f0df9794SNeil Fuller        sourcesUsage[operation.id] = true
22*f0df9794SNeil Fuller      }
23*f0df9794SNeil Fuller    } else if (operation.source.indexOf('manual') > -1 &&
24*f0df9794SNeil Fuller      (!operation.description ||
25*f0df9794SNeil Fuller        operation.description.length < 3)) {
26*f0df9794SNeil Fuller      numErrors++
27*f0df9794SNeil Fuller
28*f0df9794SNeil Fuller      console.error(`No description of ${operation.source} for operation ${idx} of zone: ${zone}`)
29*f0df9794SNeil Fuller    }
30*f0df9794SNeil Fuller  })
31*f0df9794SNeil Fuller})
32*f0df9794SNeil Fuller
33*f0df9794SNeil Fuller// check for sources not used in timezone building
34*f0df9794SNeil FullerObject.keys(sourcesUsage).forEach(source => {
35*f0df9794SNeil Fuller  if (!sourcesUsage[source]) {
36*f0df9794SNeil Fuller    numErrors++
37*f0df9794SNeil Fuller    console.error(`osmBoundarySources config "${source}" is never used in timezone boundary building`)
38*f0df9794SNeil Fuller  }
39*f0df9794SNeil Fuller})
40*f0df9794SNeil Fuller
41*f0df9794SNeil Fuller// Make sure all expected zone overlaps have a description
42*f0df9794SNeil FullerObject.keys(expectedZoneOverlaps).forEach(zoneOverlap => {
43*f0df9794SNeil Fuller  expectedZoneOverlaps[zoneOverlap].forEach((overlapBounds, idx) => {
44*f0df9794SNeil Fuller    if (!overlapBounds.description || overlapBounds.description.length < 3) {
45*f0df9794SNeil Fuller      numErrors++
46*f0df9794SNeil Fuller      console.error(`Expected overlap #${idx} of zones ${zoneOverlap} missing description`)
47*f0df9794SNeil Fuller    }
48*f0df9794SNeil Fuller  })
49*f0df9794SNeil Fuller})
50*f0df9794SNeil Fuller
51*f0df9794SNeil Fullerif (numErrors > 0) {
52*f0df9794SNeil Fuller  console.error(`${numErrors} errors found`)
53*f0df9794SNeil Fuller  process.exit(1)
54*f0df9794SNeil Fuller} else {
55*f0df9794SNeil Fuller  console.log('No linting errors!')
56*f0df9794SNeil Fuller}
57