diff --git a/.eslintrc.json b/.eslintrc.json index e42bce7..5efa523 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -4,6 +4,7 @@ "plugins": ["@typescript-eslint"], "root": true, "rules": { - "@typescript-eslint/ban-ts-comment": 1 + "@typescript-eslint/ban-ts-comment": 1, + "@typescript-eslint/no-explicit-any": 1 } } diff --git a/cli.ts b/cli.ts index bf5c3c5..6afd3f8 100755 --- a/cli.ts +++ b/cli.ts @@ -3,39 +3,61 @@ import EsriDump from './index.js'; import minimist from 'minimist'; const argv = minimist(process.argv, { - string: ['approach'], + string: ['approach', 'header'], boolean: ['help'] }); if (argv.help) { console.log(); console.log('Usage:'); - console.log(' node cli.js [--help] [--approach=bbox]'); + console.log(' node cli.js [mode] [--help]'); console.log(); console.log('Args:'); console.log(' --help Display this message'); + console.log('Mode: fetch [--approach] '); + console.log(' --header \'key=value\' IE --header \'Content-Type=123\''); console.log(' --approach [approach] Download Approach'); console.log(' "bbox" Download features by iterating over bboxes'); console.log(' slowest but most reliable approach'); console.log(' "iter" Iterate over OIDs'); console.log(' faster but not supported by all servers'); + console.log('Mode: schema '); console.log(); process.exit(); } -const url = argv._[2]; +if (!argv._[2]) throw new Error('Mode required'); +const url = argv._[3]; if (!url) throw new Error('url required'); +const headers: any = {}; +if (argv.header) { + if (typeof argv.header === 'string') argv.header = [ argv.header ]; + for (const header of argv.header) { + const parsed = header.split('='); + headers[parsed[0]] = parsed.slice(1, parsed.length).join('='); + } +} + + const esri = new EsriDump(url, { - approach: argv.approach + approach: argv.approach, + headers }); -esri.on('error', (err) => { - throw err; -}).on('feature', (feature) => { - console.log(JSON.stringify(feature)); -}); -await esri.fetch(); +if (argv._[2] === 'fetch') { + esri.on('error', (err) => { + throw err; + }).on('feature', (feature) => { + console.log(JSON.stringify(feature)); + }); + + await esri.fetch(); +} else if (argv._[2] === 'schema') { + await esri.schema(); +} else { + throw new Error('Unknown Mode'); +} diff --git a/dist/cli.js b/dist/cli.js index b85909c..9ba4817 100755 --- a/dist/cli.js +++ b/dist/cli.js @@ -2,34 +2,57 @@ import EsriDump from './index.js'; import minimist from 'minimist'; const argv = minimist(process.argv, { - string: ['approach'], + string: ['approach', 'header'], boolean: ['help'] }); if (argv.help) { console.log(); console.log('Usage:'); - console.log(' node cli.js [--help] [--approach=bbox]'); + console.log(' node cli.js [mode] [--help]'); console.log(); console.log('Args:'); console.log(' --help Display this message'); + console.log('Mode: fetch [--approach] '); + console.log(' --header \'key=value\' IE --header \'Content-Type=123\''); console.log(' --approach [approach] Download Approach'); console.log(' "bbox" Download features by iterating over bboxes'); console.log(' slowest but most reliable approach'); console.log(' "iter" Iterate over OIDs'); console.log(' faster but not supported by all servers'); + console.log('Mode: schema '); console.log(); process.exit(); } -const url = argv._[2]; +if (!argv._[2]) + throw new Error('Mode required'); +const url = argv._[3]; if (!url) throw new Error('url required'); +const headers = {}; +if (argv.header) { + if (typeof argv.header === 'string') + argv.header = [argv.header]; + for (const header of argv.header) { + const parsed = header.split('='); + headers[parsed[0]] = parsed.slice(1, parsed.length).join('='); + } +} const esri = new EsriDump(url, { - approach: argv.approach -}); -esri.on('error', (err) => { - throw err; -}).on('feature', (feature) => { - console.log(JSON.stringify(feature)); + approach: argv.approach, + headers }); -await esri.fetch(); +if (argv._[2] === 'fetch') { + esri.on('error', (err) => { + throw err; + }).on('feature', (feature) => { + console.log(JSON.stringify(feature)); + }); + await esri.fetch(); +} +else if (argv._[2] === 'schema') { + await esri.schema(); +} +else { + throw new Error('Unknown Mode'); +} //# sourceMappingURL=cli.js.map \ No newline at end of file diff --git a/dist/cli.js.map b/dist/cli.js.map index 487ce9a..a5d6d03 100644 --- a/dist/cli.js.map +++ b/dist/cli.js.map @@ -1 +1 @@ -{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":";AACA,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,QAAQ,MAAM,UAAU,CAAC;AAEhC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE;IAChC,MAAM,EAAE,CAAC,UAAU,CAAC;IACpB,OAAO,EAAE,CAAC,MAAM,CAAC;CACpB,CAAC,CAAC;AAEH,IAAI,IAAI,CAAC,IAAI,EAAE;IACX,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACtB,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;IAC/D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,uEAAuE,CAAC,CAAC;IACrF,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,IAAI,EAAE,CAAC;CAClB;AAED,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtB,IAAI,CAAC,GAAG;IAAE,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;AAE1C,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,GAAG,EAAE;IAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;CAC1B,CAAC,CAAC;AAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;IACrB,MAAM,GAAG,CAAC;AACd,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;IACzB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AACzC,CAAC,CAAC,CAAC;AAEH,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC"} \ No newline at end of file +{"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.js b/dist/index.js index dd975de..f1b8ffb 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,6 +1,24 @@ import Geometry from './lib/geometry.js'; import Fetch from './lib/fetch.js'; import EventEmitter from 'node:events'; +import Err from '@openaddresses/batch-error'; +import rewind from './lib/rewind.js'; +// Ref: https://help.arcgis.com/en/sdk/10.0/java_ao_adf/api/arcgiswebservices/com/esri/arcgisws/EsriFieldType.html +const Types = new Map([ + ['esriFieldTypeDate', 'string'], + ['esriFieldTypeString', 'string'], + ['esriFieldTypeDouble', 'number'], + ['esriFieldTypeSingle', 'number'], + ['esriFieldTypeOID', 'number'], + ['esriFieldTypeInteger', 'integer'], + ['esriFieldTypeSmallInteger', 'integer'], + ['esriFieldTypeGeometry', 'object'], + ['esriFieldTypeBlob', 'object'], + ['esriFieldTypeGlobalID', 'string'], + ['esriFieldTypeRaster', 'object'], + ['esriFieldTypeGUID', 'string'], + ['esriFieldTypeXML', 'string'], +]); const SUPPORTED = ['FeatureServer', 'MapServer']; export var EsriDumpConfigApproach; (function (EsriDumpConfigApproach) { @@ -27,7 +45,7 @@ export default class EsriDump extends EventEmitter { }; // Validate URL is a "/rest/services/" endpoint if (!this.url.pathname.includes('/rest/services/')) - throw new Error('Did not recognize ' + url + ' as an ArcGIS /rest/services/ endpoint.'); + throw new Err(400, null, 'Did not recognize ' + url + ' as an ArcGIS /rest/services/ endpoint.'); this.geomType = null; const occurrence = SUPPORTED.map((d) => { return url.lastIndexOf(d); }); const known = SUPPORTED[occurrence.indexOf(Math.max.apply(null, occurrence))]; @@ -36,10 +54,48 @@ export default class EsriDump extends EventEmitter { else if (known === 'FeatureServer') this.resourceType = EsriResourceType.FeatureServer; else - throw new Error('Unknown or unsupported ESRI URL Format'); + throw new Err(400, null, 'Unknown or unsupported ESRI URL Format'); this.emit('type', this.resourceType); } + async schema() { + const metadata = await this.#fetchMeta(); + if (!metadata.fields && !Array.isArray(metadata.fields)) + throw new Err(400, null, 'No Fields array present in response'); + const doc = { + type: 'object', + required: [], + additionalProperties: false, + properties: {} + }; + for (const field of metadata.fields) { + let type = Types.has(field.type) ? Types.get(field.type) : 'string'; + const prop = doc.properties[field.name] = { + type + }; + if (!isNaN(field.length) && prop.type === 'string') { + prop.maxLength = field.length; + } + } + return doc; + } async fetch() { + const metadata = await this.#fetchMeta(); + try { + const geom = new Geometry(this.url, metadata); + geom.fetch(this.config); + geom.on('feature', (feature) => { + this.emit('feature', rewind(feature)); + }).on('error', (error) => { + this.emit('error', error); + }).on('done', () => { + this.emit('done'); + }); + } + catch (err) { + this.emit('error', err); + } + } + async #fetchMeta() { const url = new URL(this.url); url.searchParams.append('f', 'json'); if (process.env.DEBUG) @@ -50,10 +106,10 @@ export default class EsriDump extends EventEmitter { // TODO: Type Defs const metadata = await res.json(); if (metadata.error) { - return this.emit('error', new Error('Server metadata error: ' + metadata.error.message)); + return this.emit('error', new Err(400, null, 'Server metadata error: ' + metadata.error.message)); } else if (metadata.capabilities && metadata.capabilities.indexOf('Query') === -1) { - return this.emit('error', new Error('Layer doesn\'t support query operation.')); + return this.emit('error', new Err(400, null, 'Layer doesn\'t support query operation.')); } else if (metadata.folders || metadata.services) { let errorMessage = 'Endpoint provided is not a Server resource.\n'; @@ -65,7 +121,7 @@ export default class EsriDump extends EventEmitter { errorMessage += '\nChoose a Layer from one of these Services: \n ' + metadata.services.map((d) => { return d.name; }).join('\n ') + '\n'; } - return this.emit('error', new Error(errorMessage)); + return this.emit('error', new Err(400, null, errorMessage)); } else if (metadata.layers) { let errorMessage = 'Endpoint provided is not a Server resource.\n'; @@ -73,35 +129,22 @@ export default class EsriDump extends EventEmitter { errorMessage += '\nChoose one of these Layers: \n ' + metadata.layers.map((d) => { return d.name; }).join('\n ') + '\n'; } - return this.emit('error', new Error(errorMessage)); + return this.emit('error', new Err(400, null, errorMessage)); } else if (!this.resourceType) { - return this.emit('error', new Error('Could not determine server type of ' + url)); + return this.emit('error', new Err(400, null, 'Could not determine server type of ' + url)); } this.geomType = metadata.geometryType; if (!this.geomType) { - return this.emit('error', new Error('no geometry')); + return this.emit('error', new Err(400, null, 'no geometry')); } else if (!metadata.extent) { - return this.emit('error', new Error('Layer doesn\'t list an extent.')); + return this.emit('error', new Err(400, null, 'Layer doesn\'t list an extent.')); } else if ('subLayers' in metadata && metadata.subLayers.length > 0) { - return this.emit('error', new Error('Specified layer has sublayers.')); - } - try { - const geom = new Geometry(this.url, metadata); - geom.fetch(this.config); - geom.on('feature', (feature) => { - this.emit('feature', feature); - }).on('error', (error) => { - this.emit('error', error); - }).on('done', () => { - this.emit('done'); - }); - } - catch (err) { - this.emit('error', err); + return this.emit('error', new Err(400, null, 'Specified layer has sublayers.')); } + return metadata; } } //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/dist/index.js.map b/dist/index.js.map index d468864..4682cbe 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/geometry.js b/dist/lib/geometry.js index 9492049..fcc885c 100644 --- a/dist/lib/geometry.js +++ b/dist/lib/geometry.js @@ -1,4 +1,5 @@ import EventEmitter from 'node:events'; +import Err from '@openaddresses/batch-error'; import rings2geojson from './rings2geojson.js'; import Fetch from './fetch.js'; import { EsriDumpConfigApproach } from '../index.js'; @@ -25,7 +26,7 @@ export default class Geometry extends EventEmitter { else if (config.approach === EsriDumpConfigApproach.ITER) await this.fetch_iter(config); else - throw new Error('Unknown Approach'); + throw new Err(400, null, 'Unknown Approach'); } catch (err) { this.emit('error', err); @@ -33,7 +34,7 @@ export default class Geometry extends EventEmitter { } async fetch_iter(config) { if (!this.oidField) - this.emit('error', new Error('Cannot use iter function as oidField could not be determined')); + this.emit('error', new Err(400, null, 'Cannot use iter function as oidField could not be determined')); const url = new URL(String(this.baseUrl) + '/query'); url.searchParams.append('returnCountOnly', 'true'); url.searchParams.append('where', '1=1'); @@ -80,10 +81,10 @@ export default class Geometry extends EventEmitter { break; } else if (!data) { - return this.emit('error', 'Data from' + url + ' undefined'); + return this.emit('error', new Err(400, null, 'Data from' + url + ' undefined')); } else { - return this.emit('error', 'Error with ' + url); + return this.emit('error', new Err(400, null, 'Error with ' + url)); } } if (attempts > 5) @@ -138,10 +139,10 @@ export default class Geometry extends EventEmitter { break; } else if (!data) { - return this.emit('error', 'Data from' + url + ' undefined'); + return this.emit('error', new Err(400, null, 'Data from' + url + ' undefined')); } else { - return this.emit('error', 'Error with ' + url); + return this.emit('error', new Err(400, null, 'Error with ' + url)); } } if (attempts > 5) @@ -206,7 +207,7 @@ export default class Geometry extends EventEmitter { return nextBestOidField.name; } else { - throw new Error('Could not determine OBJECTID field.'); + throw new Err(400, null, 'Could not determine OBJECTID field.'); } } } diff --git a/dist/lib/geometry.js.map b/dist/lib/geometry.js.map index 4602757..d2643d9 100644 --- a/dist/lib/geometry.js.map +++ b/dist/lib/geometry.js.map @@ -1 +1 @@ -{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../lib/geometry.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"geometry.js","sourceRoot":"","sources":["../../lib/geometry.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lib/rewind.js b/dist/lib/rewind.js new file mode 100644 index 0000000..899ecaa --- /dev/null +++ b/dist/lib/rewind.js @@ -0,0 +1,47 @@ +export default function rewind(gj, outer) { + const type = gj && gj.type; + if (type === 'FeatureCollection') { + gj = gj; + for (let i = 0; i < gj.features.length; i++) + rewind(gj.features[i], outer); + } + else if (type === 'GeometryCollection') { + gj = gj; + for (let i = 0; i < gj.geometries.length; i++) + rewind(gj.geometries[i], outer); + } + else if (type === 'Feature') { + gj = gj; + rewind(gj.geometry, outer); + } + else if (type === 'Polygon') { + gj = gj; + rewindRings(gj.coordinates, outer); + } + else if (type === 'MultiPolygon') { + gj = gj; + for (let i = 0; i < gj.coordinates.length; i++) + rewindRings(gj.coordinates[i], outer); + } + return gj; +} +function rewindRings(rings, outer) { + if (rings.length === 0) + return; + rewindRing(rings[0], outer); + for (let i = 1; i < rings.length; i++) { + rewindRing(rings[i], !outer); + } +} +function rewindRing(ring, dir) { + let area = 0, err = 0; + for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + let k = (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]); + let m = area + k; + err += Math.abs(area) >= Math.abs(k) ? area - m + k : k - m + area; + area = m; + } + if (area + err >= 0 !== !!dir) + ring.reverse(); +} +//# sourceMappingURL=rewind.js.map \ No newline at end of file diff --git a/dist/lib/rewind.js.map b/dist/lib/rewind.js.map new file mode 100644 index 0000000..817d3cd --- /dev/null +++ b/dist/lib/rewind.js.map @@ -0,0 +1 @@ +{"version":3,"file":"rewind.js","sourceRoot":"","sources":["../../lib/rewind.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/index.ts b/index.ts index 4364f9c..98c1327 100644 --- a/index.ts +++ b/index.ts @@ -2,6 +2,29 @@ import Geometry from './lib/geometry.js'; import Fetch from './lib/fetch.js'; import EventEmitter from 'node:events'; import { Feature } from 'geojson'; +import Err from '@openaddresses/batch-error'; +import rewind from './lib/rewind.js'; +import { + JSONSchema6, + JSONSchema6TypeName +} from 'json-schema'; + +// Ref: https://help.arcgis.com/en/sdk/10.0/java_ao_adf/api/arcgiswebservices/com/esri/arcgisws/EsriFieldType.html +const Types: Map = new Map([ + ['esriFieldTypeDate', 'string'], + ['esriFieldTypeString', 'string'], + ['esriFieldTypeDouble', 'number'], + ['esriFieldTypeSingle', 'number'], + ['esriFieldTypeOID', 'number'], + ['esriFieldTypeInteger', 'integer'], + ['esriFieldTypeSmallInteger', 'integer'], + ['esriFieldTypeGeometry', 'object'], + ['esriFieldTypeBlob', 'object'], + ['esriFieldTypeGlobalID', 'string'], + ['esriFieldTypeRaster', 'object'], + ['esriFieldTypeGUID', 'string'], + ['esriFieldTypeXML', 'string'], +]); const SUPPORTED = ['FeatureServer', 'MapServer']; @@ -45,7 +68,7 @@ export default class EsriDump extends EventEmitter { }; // Validate URL is a "/rest/services/" endpoint - if (!this.url.pathname.includes('/rest/services/')) throw new Error('Did not recognize ' + url + ' as an ArcGIS /rest/services/ endpoint.'); + if (!this.url.pathname.includes('/rest/services/')) throw new Err(400, null, 'Did not recognize ' + url + ' as an ArcGIS /rest/services/ endpoint.'); this.geomType = null; @@ -53,12 +76,58 @@ export default class EsriDump extends EventEmitter { const known = SUPPORTED[occurrence.indexOf(Math.max.apply(null, occurrence))]; if (known === 'MapServer') this.resourceType = EsriResourceType.MapServer; else if (known === 'FeatureServer') this.resourceType = EsriResourceType.FeatureServer; - else throw new Error('Unknown or unsupported ESRI URL Format'); + else throw new Err(400, null, 'Unknown or unsupported ESRI URL Format'); this.emit('type', this.resourceType); } + async schema(): Promise { + const metadata = await this.#fetchMeta(); + + if (!metadata.fields && !Array.isArray(metadata.fields)) throw new Err(400, null, 'No Fields array present in response'); + + const doc: JSONSchema6 = { + type: 'object', + required: [], + additionalProperties: false, + properties: {} + } + + for (const field of metadata.fields) { + const type = Types.has(field.type) ? Types.get(field.type) : 'string'; + + const prop: JSONSchema6 = doc.properties[field.name] = { + type + } + + if (!isNaN(field.length) && prop.type === 'string') { + prop.maxLength = field.length; + } + } + + return doc; + } + async fetch() { + const metadata = await this.#fetchMeta(); + + try { + const geom = new Geometry(this.url, metadata); + geom.fetch(this.config); + + geom.on('feature', (feature: Feature) => { + this.emit('feature', rewind(feature)); + }).on('error', (error: Err) => { + this.emit('error', error); + }).on('done', () => { + this.emit('done'); + }); + } catch (err) { + this.emit('error', err); + } + } + + async #fetchMeta() { const url = new URL(this.url); url.searchParams.append('f', 'json'); @@ -71,9 +140,9 @@ export default class EsriDump extends EventEmitter { const metadata: any = await res.json(); if (metadata.error) { - return this.emit('error', new Error('Server metadata error: ' + metadata.error.message)); + return this.emit('error', new Err(400, null, 'Server metadata error: ' + metadata.error.message)); } else if (metadata.capabilities && metadata.capabilities.indexOf('Query') === -1 ) { - return this.emit('error', new Error('Layer doesn\'t support query operation.')); + return this.emit('error', new Err(400, null, 'Layer doesn\'t support query operation.')); } else if (metadata.folders || metadata.services) { let errorMessage = 'Endpoint provided is not a Server resource.\n'; if (metadata.folders.length > 0) { @@ -86,41 +155,28 @@ export default class EsriDump extends EventEmitter { + metadata.services.map((d: any) => { return d.name; }).join('\n ') + '\n'; } - return this.emit('error', new Error(errorMessage)); + return this.emit('error', new Err(400, null, errorMessage)); } else if (metadata.layers) { let errorMessage = 'Endpoint provided is not a Server resource.\n'; if (metadata.layers.length > 0 && Array.isArray(metadata.layers)) { errorMessage += '\nChoose one of these Layers: \n ' + metadata.layers.map((d: any) => { return d.name; }).join('\n ') + '\n'; } - return this.emit('error', new Error(errorMessage)); + return this.emit('error', new Err(400, null, errorMessage)); } else if (!this.resourceType) { - return this.emit('error', new Error('Could not determine server type of ' + url)); + return this.emit('error', new Err(400, null, 'Could not determine server type of ' + url)); } this.geomType = metadata.geometryType; if (!this.geomType) { - return this.emit('error', new Error('no geometry')); + return this.emit('error', new Err(400, null, 'no geometry')); } else if (!metadata.extent) { - return this.emit('error', new Error('Layer doesn\'t list an extent.')); + return this.emit('error', new Err(400, null, 'Layer doesn\'t list an extent.')); } else if ('subLayers' in metadata && metadata.subLayers.length > 0) { - return this.emit('error', new Error('Specified layer has sublayers.')); + return this.emit('error', new Err(400, null, 'Specified layer has sublayers.')); } - try { - const geom = new Geometry(this.url, metadata); - geom.fetch(this.config); - - geom.on('feature', (feature: Feature) => { - this.emit('feature', feature); - }).on('error', (error: Error) => { - this.emit('error', error); - }).on('done', () => { - this.emit('done'); - }); - } catch (err) { - this.emit('error', err); - } + return metadata; } } diff --git a/lib/geometry.ts b/lib/geometry.ts index f1de396..347a83d 100644 --- a/lib/geometry.ts +++ b/lib/geometry.ts @@ -1,4 +1,5 @@ import EventEmitter from 'node:events'; +import Err from '@openaddresses/batch-error'; import rings2geojson from './rings2geojson.js'; import Fetch from './fetch.js'; import { Feature } from 'geojson'; @@ -45,14 +46,14 @@ export default class Geometry extends EventEmitter { try { if (config.approach === EsriDumpConfigApproach.BBOX) await this.fetch_bbox(config); else if (config.approach === EsriDumpConfigApproach.ITER) await this.fetch_iter(config); - else throw new Error('Unknown Approach'); + else throw new Err(400, null, 'Unknown Approach'); } catch (err) { this.emit('error', err); } } async fetch_iter(config: EsriDumpConfig) { - if (!this.oidField) this.emit('error', new Error('Cannot use iter function as oidField could not be determined')); + if (!this.oidField) this.emit('error', new Err(400, null, 'Cannot use iter function as oidField could not be determined')); const url = new URL(String(this.baseUrl) + '/query'); url.searchParams.append('returnCountOnly', 'true'); @@ -107,9 +108,9 @@ export default class Geometry extends EventEmitter { break; } else if (!data) { - return this.emit('error', 'Data from' + url + ' undefined'); + return this.emit('error', new Err(400, null, 'Data from' + url + ' undefined')); } else { - return this.emit('error', 'Error with ' + url); + return this.emit('error', new Err(400, null, 'Error with ' + url)); } } @@ -171,9 +172,9 @@ export default class Geometry extends EventEmitter { break; } else if (!data) { - return this.emit('error', 'Data from' + url + ' undefined'); + return this.emit('error', new Err(400, null, 'Data from' + url + ' undefined')); } else { - return this.emit('error', 'Error with ' + url); + return this.emit('error', new Err(400, null, 'Error with ' + url)); } } @@ -240,7 +241,7 @@ export default class Geometry extends EventEmitter { if (nextBestOidField) { return nextBestOidField.name; } else { - throw new Error('Could not determine OBJECTID field.'); + throw new Err(400, null, 'Could not determine OBJECTID field.'); } } } diff --git a/lib/rewind.ts b/lib/rewind.ts new file mode 100644 index 0000000..292ac33 --- /dev/null +++ b/lib/rewind.ts @@ -0,0 +1,54 @@ +import { + GeoJSON, + FeatureCollection, + GeometryCollection, + Feature, + Polygon, + MultiPolygon +} from 'geojson'; + +export default function rewind(gj: GeoJSON, outer?: any) { + const type = gj && gj.type; + + if (type === 'FeatureCollection') { + gj = gj as FeatureCollection; + for (let i = 0; i < gj.features.length; i++) rewind(gj.features[i], outer); + + } else if (type === 'GeometryCollection') { + gj = gj as GeometryCollection; + for (let i = 0; i < gj.geometries.length; i++) rewind(gj.geometries[i], outer); + + } else if (type === 'Feature') { + gj = gj as Feature; + rewind(gj.geometry, outer); + + } else if (type === 'Polygon') { + gj = gj as Polygon; + rewindRings(gj.coordinates, outer); + } else if (type === 'MultiPolygon') { + gj = gj as MultiPolygon; + for (let i = 0; i < gj.coordinates.length; i++) rewindRings(gj.coordinates[i], outer); + } + + return gj; +} + +function rewindRings(rings: Array, outer: any) { + if (rings.length === 0) return; + + rewindRing(rings[0], outer); + for (let i = 1; i < rings.length; i++) { + rewindRing(rings[i], !outer); + } +} + +function rewindRing(ring: Array, dir: any) { + let area = 0, err = 0; + for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + const k = (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]); + const m = area + k; + err += Math.abs(area) >= Math.abs(k) ? area - m + k : k - m + area; + area = m; + } + if (area + err >= 0 !== !!dir) ring.reverse(); +} diff --git a/package-lock.json b/package-lock.json index ac321e4..7254c3e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,27 +1,31 @@ { "name": "esri-dump", - "version": "2.0.0", + "version": "3.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "esri-dump", - "version": "2.0.0", + "version": "3.1.0", "license": "MIT", "dependencies": { + "@openaddresses/batch-error": "^2.2.0", + "@types/express": "^4.17.17", + "@types/json-schema": "^7.0.12", "minimist": "^1.2.8" }, "bin": { - "esri-dump": "ts-node cli.js" + "esri-dump": "dist/cli.js" }, "devDependencies": { "@types/geojson": "^7946.0.10", "@types/minimist": "^1.2.2", - "@types/tape": "^4.13.4", - "@typescript-eslint/eslint-plugin": "^5.59.0", - "@typescript-eslint/parser": "^5.59.0", + "@types/tape": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", "eslint": "^8.36.0", - "geojsonhint": "^1.2.0", + "eslint-plugin-node": "^11.1.0", + "geojsonhint": "^2.0.0", "tape": "^5.0.0", "ts-node": "^10.9.1", "ts-node-test": "^0.4.1", @@ -31,6 +35,15 @@ "node": ">=18" } }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -59,23 +72,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.0.tgz", + "integrity": "sha512-uiPeRISaglZnaZk8vwrjQZ1CxogZeY/4IYft6gBOTqu1WhVXWmCmZMWxUv2Q/pxSvPdp1JPaO62kLOcOkMqWrw==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -91,18 +104,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -157,6 +170,27 @@ "@jridgewell/sourcemap-codec": "^1.4.10" } }, + "node_modules/@ljharb/resumer": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/@ljharb/resumer/-/resumer-0.0.1.tgz", + "integrity": "sha512-skQiAOrCfO7vRTq53cxznMpks7wS1va95UCidALlOVWqvBAzwPVErwizDwoMqNVMEn1mDq0utxZd02eIrvF1lw==", + "dev": true, + "dependencies": { + "@ljharb/through": "^2.3.9" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@ljharb/through": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.9.tgz", + "integrity": "sha512-yN599ZBuMPPK4tdoToLlvgJB4CLK8fGl7ntfy0Wn7U6ttNvHYurd81bfUiK/6sMkiIwm65R6ck4L6+Y3DfVbNQ==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -192,6 +226,14 @@ "node": ">= 8" } }, + "node_modules/@openaddresses/batch-error": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@openaddresses/batch-error/-/batch-error-2.2.0.tgz", + "integrity": "sha512-q42rQRGG2X9jPxjTAzzJ2UUAV57GXBt7n7EzwVmsMmEy9oa34TAD58dGTnB4M6gD78fuhL5ZInEPzMN6LvfbHw==", + "engines": { + "node": ">= 18" + } + }, "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", @@ -211,22 +253,70 @@ "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, "node_modules/@types/geojson": { "version": "7946.0.10", "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.10.tgz", "integrity": "sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==", "dev": true }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/minimist": { "version": "1.2.2", @@ -235,21 +325,49 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true + "version": "20.4.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.4.tgz", + "integrity": "sha512-CukZhumInROvLq3+b5gLev+vgpsIqC2D0deQr/yS1WnxvmYLlJXZpaQrQiseMY+6xusl79E04UjWoqyr+t1/Ew==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", "dev": true }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, "node_modules/@types/tape": { - "version": "4.13.4", - "resolved": "https://registry.npmjs.org/@types/tape/-/tape-4.13.4.tgz", - "integrity": "sha512-0Mw8/FAMheD2MvyaFYDaAix7X5GfNjl/XI+zvqJdzC6N05BmHKz6Hwn+r7+8PEXDEKrC3V/irC9z7mrl5a130g==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/@types/tape/-/tape-5.6.0.tgz", + "integrity": "sha512-yt27qxGg45IVJ0i2PdbYopND9d4eaXwne/jpi0saYb7PHYu8ZYaQB+cADjj+YZkZZjCM4rnhMPYFGd6+M8sWKg==", "dev": true, "dependencies": { "@types/node": "*", @@ -266,32 +384,34 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.1.0.tgz", + "integrity": "sha512-qg7Bm5TyP/I7iilGyp6DRqqkt8na00lI6HbjWZObgk3FFSzH5ypRwAHXJhJkwiRtTcfn+xYQIMOR5kJgpo6upw==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/type-utils": "6.1.0", + "@typescript-eslint/utils": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -299,41 +419,27 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.0.tgz", - "integrity": "sha512-qK9TZ70eJtjojSUMrrEwA9ZDQ4N0e/AuoOIgXuNBorXYcBDk397D2r5MIe1B3cok/oCtdNC5j+lUUpVB+Dpb+w==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.1.0.tgz", + "integrity": "sha512-hIzCPvX4vDs4qL07SYzyomamcs2/tQYXg5DtdAfj35AyJ5PIUqhsLf4YrEIFzZcND7R2E8tpQIZKayxg8/6Wbw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/typescript-estree": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -342,16 +448,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.1.0.tgz", + "integrity": "sha512-AxjgxDn27hgPpe2rQe19k0tXw84YCOsjDJ2r61cIebq1t+AIxbgiXKvD4999Wk49GVaAcdJ/d49FYel+Pp3jjw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -359,25 +465,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.1.0.tgz", + "integrity": "sha512-kFXBx6QWS1ZZ5Ni89TyT1X9Ag6RXVIVhqDs0vZE/jUeWlBv/ixq2diua6G7ece6+fXw3TvNRxP77/5mOMusx2w==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "6.1.0", + "@typescript-eslint/utils": "6.1.0", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -386,12 +492,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.1.0.tgz", + "integrity": "sha512-+Gfd5NHCpDoHDOaU/yIF3WWRI2PcBRKKpP91ZcVbL0t5tQpqYWBs3z/GGhvU+EV1D0262g9XCnyqQh19prU0JQ==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -399,21 +505,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.1.0.tgz", + "integrity": "sha512-nUKAPWOaP/tQjU1IQw9sOPCDavs/iU5iYLiY/6u7gxS7oKQoi4aUxXS1nrrVGTyBBaGesjkcwwHkbkiD5eBvcg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/visitor-keys": "6.1.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -425,95 +531,42 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.1.0.tgz", + "integrity": "sha512-wp652EogZlKmQoMS5hAvWqRKplXvkuOnNzZSE0PVvsKjpexd/XznRVHAtrfHFYmqaJz0DFkjlDsGYC9OXw+OhQ==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.1.0", + "@typescript-eslint/types": "6.1.0", + "@typescript-eslint/typescript-estree": "6.1.0", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.1.0.tgz", + "integrity": "sha512-yQeh+EXhquh119Eis4k0kYhj9vmFzNpbhM3LftWQVwqVjipCkwHBQOZutcYW+JVkjtTG9k8nrZU1UoNedPDd1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.1.0", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -521,9 +574,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -642,6 +695,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", @@ -734,6 +807,38 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -759,16 +864,16 @@ "dev": true }, "node_modules/concat-stream": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.4.11.tgz", - "integrity": "sha512-X3JMh8+4je3U1cQpG87+f9lXHDrqcb2MVLg9L7o8b1UZ0DzhRrUpdn65ttzu10PpJPPI3MQNkis+oha6TSA9Mw==", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.2.tgz", + "integrity": "sha512-H6xsIBfQ94aESBG8jGHXQ7i5AEpy5ZeVaLDOisDICiTCKpqEfr34/KmTrspKQNoLKNu9gTkovlpQcUi630AKiQ==", "dev": true, "engines": [ "node >= 0.8" ], "dependencies": { "inherits": "~2.0.1", - "readable-stream": "~1.1.9", + "readable-stream": "~2.0.0", "typedarray": "~0.0.5" } }, @@ -816,16 +921,17 @@ } }, "node_modules/deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", + "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.1", "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", + "is-array-buffer": "^3.0.2", "is-date-object": "^1.0.5", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", @@ -833,7 +939,7 @@ "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", "side-channel": "^1.0.4", "which-boxed-primitive": "^1.0.2", "which-collection": "^1.0.1", @@ -932,18 +1038,19 @@ "dev": true }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -963,14 +1070,18 @@ "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", "safe-regex-test": "^1.0.0", "string.prototype.trim": "^1.2.7", "string.prototype.trimend": "^1.0.6", "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.10" }, "engines": { "node": ">= 0.4" @@ -1058,16 +1169,16 @@ } }, "node_modules/eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -1076,9 +1187,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -1086,22 +1197,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -1114,10 +1222,75 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint-plugin-es": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-3.0.1.tgz", + "integrity": "sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-node": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-11.1.0.tgz", + "integrity": "sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==", + "dev": true, + "dependencies": { + "eslint-plugin-es": "^3.0.0", + "eslint-utils": "^2.0.0", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "peerDependencies": { + "eslint": ">=5.16.0" + } + }, + "node_modules/eslint-plugin-node/node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-plugin-node/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -1125,12 +1298,39 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1140,14 +1340,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1205,9 +1405,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -1361,109 +1561,46 @@ } }, "node_modules/geojsonhint": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/geojsonhint/-/geojsonhint-1.2.1.tgz", - "integrity": "sha512-jR1pLHEjzO+6jNs4hAg3ZM1raFQZo8Lu9vyUpKCWZP6g6QqHSfk1Y9eWLURGqC7Vn5r3eROfcnfJ7vwPDKTgsg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/geojsonhint/-/geojsonhint-2.0.0.tgz", + "integrity": "sha512-+IuNGMPR5gfPSmA1LANZ/k0osdF6tY/tb9q6QxMrxqwWwp+jMdP0HAUXCXK05c90KVbaRG9y7wVUlAy1l7PtIw==", "deprecated": "This module is now under the @mapbox namespace: install @mapbox/geojsonhint instead", "dev": true, "dependencies": { - "chalk": "^1.1.0", - "concat-stream": "~1.4.4", + "concat-stream": "~1.5.1", "jsonlint-lines": "1.7.1", - "minimist": "1.1.1", - "text-table": "^0.2.0" + "minimist": "1.2.0", + "vfile": "2.0.0", + "vfile-reporter": "3.0.0" }, "bin": { "geojsonhint": "bin/geojsonhint" } }, - "node_modules/geojsonhint/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } + "node_modules/geojsonhint/node_modules/minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha512-7Wl+Jz+IGWuSdgsQEJ4JunV0si/iMhg42MnQQG6h1R6TNeVenp4U9x5CC5v/gYqz/fENLQITAWXidNtVL0NNbw==", + "dev": true }, - "node_modules/geojsonhint/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/geojsonhint/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/geojsonhint/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/geojsonhint/node_modules/minimist": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.1.1.tgz", - "integrity": "sha512-FzcUe2HULkO6NxOnADCRJos39lkw3Uy+i8hpVfHDrBK0fdbTLkeo6LveAY6dEJwoSxwB3z6MyQSOJDRZ6w9kvA==", - "dev": true - }, - "node_modules/geojsonhint/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/geojsonhint/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -1589,10 +1726,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/has": { @@ -1783,6 +1920,15 @@ "node": ">= 0.4" } }, + "node_modules/irregular-plurals": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-1.4.0.tgz", + "integrity": "sha512-kniTIJmaZYiwa17eTtWIfm0K342seyugl6vuC8DiiyiRAJWAVlLkqGCI0Im0neo0TkXw+pRcKaBPRdcKHnQJ6Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-arguments": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", @@ -1841,6 +1987,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -1854,9 +2006,9 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -1890,12 +2042,15 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", "dev": true, + "dependencies": { + "number-is-nan": "^1.0.0" + }, "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, "node_modules/is-glob": { @@ -2032,16 +2187,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -2085,9 +2236,9 @@ } }, "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true }, "node_modules/isexe": { @@ -2096,16 +2247,6 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2189,6 +2330,82 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha512-mmPrW0Fh2fxOzdBbFv4g1m6pR72haFLPJ2G5SJEELf1y+iaQrDG6cWCPjy54RHYbZAt7X+ls690Kw62AdWXBzQ==", + "dev": true, + "dependencies": { + "chalk": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2313,6 +2530,15 @@ "node": ">=0.8.0" } }, + "node_modules/number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -2375,17 +2601,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -2487,6 +2713,18 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/plur": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/plur/-/plur-2.1.2.tgz", + "integrity": "sha512-WhcHk576xg9y/iv6RWOuroZgsqvCbJN+XGvAypCJwLAYs2iWDp5LUmvaCdV6JR2O0SMBf8l6p7A94AyLCFVMlQ==", + "dev": true, + "dependencies": { + "irregular-plurals": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -2496,6 +2734,12 @@ "node": ">= 0.8.0" } }, + "node_modules/process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha512-yN0WQmuCX63LP/TMvAg31nvT6m4vDqJEiiv2CAZqWOGNWutc9DfDk1NPYYmKUFmaVM2UwDowH4u5AHWYP/jxKw==", + "dev": true + }, "node_modules/punycode": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", @@ -2526,26 +2770,28 @@ ] }, "node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", + "integrity": "sha512-TXcFfb63BQe1+ySzsHZI/5v1aJPCShfqvWJ64ayNImXMsN1Cd0YGk/wm8KB7/OeessgPc9QvS9Zou8QTkFzsLw==", "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -2554,6 +2800,36 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha512-vuNYXC7gG7IeVNBC1xUllqCcZKRbJoSPOBhnTEcAIiKCsbuef6zO3F0Rve3isPMMoNoQRWjQwbAgAjHUHniyEA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2563,6 +2839,23 @@ "node": ">=0.10.0" } }, + "node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -2572,15 +2865,6 @@ "node": ">=4" } }, - "node_modules/resumer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", - "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", - "dev": true, - "dependencies": { - "through": "~2.3.4" - } - }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -2629,6 +2913,30 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/safe-regex-test": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", @@ -2643,6 +2951,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2706,17 +3029,38 @@ "dev": true }, "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, "node_modules/string.prototype.trim": { @@ -2813,14 +3157,16 @@ } }, "node_modules/tape": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.3.tgz", - "integrity": "sha512-cUDDGSbyoSIpdUAqbqLI/r7i/S4BHuCB9M5j7E/LrLs/x/i4zeAJ798aqo+FGo+kr9seBZwr8AkZW6rjceyAMQ==", + "version": "5.6.6", + "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.6.tgz", + "integrity": "sha512-rGp2cZ3rfZ6QfTBm6yvohf8aXmDqPyzMKZwTMV12w4i+b/N2Adwlg8PlW8jLqWzlJUZhglyYaLOSrMt/ZlZkAA==", "dev": true, "dependencies": { + "@ljharb/resumer": "^0.0.1", + "@ljharb/through": "^2.3.9", "array.prototype.every": "^1.1.4", "call-bind": "^1.0.2", - "deep-equal": "^2.2.0", + "deep-equal": "^2.2.2", "defined": "^1.0.1", "dotignore": "^0.1.2", "for-each": "^0.3.3", @@ -2830,15 +3176,13 @@ "has-dynamic-import": "^2.0.1", "inherits": "^2.0.4", "is-regex": "^1.1.4", - "minimist": "^1.2.7", + "minimist": "^1.2.8", "object-inspect": "^1.12.3", "object-is": "^1.1.5", "object-keys": "^1.1.1", "object.assign": "^4.1.4", "resolve": "^2.0.0-next.4", - "resumer": "^0.0.0", - "string.prototype.trim": "^1.2.7", - "through": "^2.3.8" + "string.prototype.trim": "^1.2.7" }, "bin": { "tape": "bin/tape" @@ -2847,35 +3191,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tape/node_modules/resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -2888,6 +3209,25 @@ "node": ">=8.0" } }, + "node_modules/trim": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", + "integrity": "sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ==", + "deprecated": "Use String.prototype.trim() instead", + "dev": true + }, + "node_modules/ts-api-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", + "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -2932,13 +3272,13 @@ } }, "node_modules/ts-node-test": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/ts-node-test/-/ts-node-test-0.4.1.tgz", - "integrity": "sha512-grcCXvABRVB29+kRBK5AmoRZMiNAhrWxxhFS2Qe65DyRuKFnrOvvZRitm7+g0KFbl+AxiT03G9ABihWEU6icPw==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ts-node-test/-/ts-node-test-0.4.2.tgz", + "integrity": "sha512-N0lfXtJUNThwES9UkO4qATOOssn+v9KYrMicPTkBJpXq8gd7eLaTKB7pd9Azfneu+/yD8gs5kNeLngL8rBkM/A==", "dev": true, "dependencies": { "ts-node": "10.9.1", - "yargs": "17.7.1" + "yargs": "17.7.2" }, "bin": { "ts-node-test": "dist/bin.js" @@ -2950,27 +3290,6 @@ "typescript": "^4.0.0 || ^5.0.0" } }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -2995,6 +3314,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -3019,16 +3389,16 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.6.tgz", + "integrity": "sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -3052,6 +3422,12 @@ "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ==", "dev": true }, + "node_modules/unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -3061,12 +3437,111 @@ "punycode": "^2.1.0" } }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, + "node_modules/vfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.0.0.tgz", + "integrity": "sha512-SSMehBgGWpGCTYiXdBHJkV9lqjb1EAbfWvbDdUx7s2PUBVppRpQ4duLtU1KUVi8nEmWzxfU8LCgwZNLe1tIttQ==", + "dev": true, + "dependencies": { + "has": "^1.0.1", + "is-buffer": "^1.1.4", + "replace-ext": "1.0.0", + "unist-util-stringify-position": "^1.0.0", + "x-is-string": "^0.1.0" + } + }, + "node_modules/vfile-reporter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-3.0.0.tgz", + "integrity": "sha512-F373Ojbn6gE1JsEOdZ+cGv/mkh93iGlfr0NeO+UUX/yL9nb5efzZFIQbaGJedjmIcBKGgKV8IboaAAMpoVAw9Q==", + "dev": true, + "dependencies": { + "chalk": "^1.1.0", + "log-symbols": "^1.0.2", + "plur": "^2.0.0", + "repeat-string": "^1.5.0", + "string-width": "^1.0.0", + "strip-ansi": "^3.0.1", + "trim": "0.0.1", + "unist-util-stringify-position": "^1.0.0" + } + }, + "node_modules/vfile-reporter/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vfile-reporter/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vfile-reporter/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vfile-reporter/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/vfile-reporter/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vfile-reporter/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -3114,17 +3589,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3133,15 +3607,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -3159,12 +3624,41 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, + "node_modules/x-is-string": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz", + "integrity": "sha512-GojqklwG8gpzOVEVki5KudKNoq7MbbjYZCbyWzEz7tyPA7eleiE0+ePwOWQQRb5fm86rD3S8Tc0tSFf3AOv50w==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -3181,9 +3675,9 @@ "dev": true }, "node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -3207,6 +3701,29 @@ "node": ">=12" } }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", diff --git a/package.json b/package.json index 69bfc0c..342fcfd 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "scripts": { "test": "ts-node-test test/", "build": "tsc --build", - "lint": "eslint *.js test/*.js lib/*.js" + "lint": "eslint *.ts test/*.ts lib/*.ts" }, "repository": { "type": "git", @@ -25,17 +25,20 @@ "devDependencies": { "@types/geojson": "^7946.0.10", "@types/minimist": "^1.2.2", - "@types/tape": "^4.13.4", - "@typescript-eslint/eslint-plugin": "^5.59.0", - "@typescript-eslint/parser": "^5.59.0", + "@types/tape": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^6.0.0", + "@typescript-eslint/parser": "^6.0.0", "eslint": "^8.36.0", - "geojsonhint": "^1.2.0", + "geojsonhint": "^2.0.0", "tape": "^5.0.0", "ts-node": "^10.9.1", "ts-node-test": "^0.4.1", "typescript": "^5.0.4" }, "dependencies": { + "@openaddresses/batch-error": "^2.2.0", + "@types/express": "^4.17.17", + "@types/json-schema": "^7.0.12", "minimist": "^1.2.8" } } diff --git a/test/fixtures/rewind/collection.input.geojson b/test/fixtures/rewind/collection.input.geojson new file mode 100644 index 0000000..6246679 --- /dev/null +++ b/test/fixtures/rewind/collection.input.geojson @@ -0,0 +1,80 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [102.0, 0.5] + }, + "properties": { + "prop0": "value0" + } + }, + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [102.0, 0.0], + [103.0, 1.0], + [104.0, 0.0], + [105.0, 1.0] + ] + }, + "properties": { + "prop0": "value0", + "prop1": 0.0 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ], + [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } + } + ] +} diff --git a/test/fixtures/rewind/collection.output.geojson b/test/fixtures/rewind/collection.output.geojson new file mode 100644 index 0000000..0a2f5b2 --- /dev/null +++ b/test/fixtures/rewind/collection.output.geojson @@ -0,0 +1,140 @@ +{ + "type": "FeatureCollection", + "features": [ + { + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [ + 102, + 0.5 + ] + }, + "properties": { + "prop0": "value0" + } + }, + { + "type": "Feature", + "geometry": { + "type": "LineString", + "coordinates": [ + [ + 102, + 0 + ], + [ + 103, + 1 + ], + [ + 104, + 0 + ], + [ + 105, + 1 + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": 0 + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } + }, + { + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ], + [ + [ + 100.2, + 0.2 + ], + [ + 100.2, + 0.8 + ], + [ + 100.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ] + ] + ] + }, + "properties": { + "prop0": "value0", + "prop1": { + "this": "that" + } + } + } + ] +} \ No newline at end of file diff --git a/test/fixtures/rewind/featuregood.input.geojson b/test/fixtures/rewind/featuregood.input.geojson new file mode 100644 index 0000000..98f04f5 --- /dev/null +++ b/test/fixtures/rewind/featuregood.input.geojson @@ -0,0 +1,16 @@ +{ +"type": "Feature", +"geometry": { "type": "Polygon", + "coordinates": [ + [ [ 100, 0 ], + [ 100, 1 ], + [ 101, 1 ], + [ 101, 0 ], + [ 100, 0 ] ], + [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ] + ] + }, + "properties": { + "foo": "bar" + } + } diff --git a/test/fixtures/rewind/featuregood.output.geojson b/test/fixtures/rewind/featuregood.output.geojson new file mode 100644 index 0000000..9b72cc8 --- /dev/null +++ b/test/fixtures/rewind/featuregood.output.geojson @@ -0,0 +1,55 @@ +{ + "type": "Feature", + "geometry": { + "type": "Polygon", + "coordinates": [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ], + [ + [ + 100.2, + 0.2 + ], + [ + 100.2, + 0.8 + ], + [ + 100.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ] + ] + ] + }, + "properties": { + "foo": "bar" + } +} \ No newline at end of file diff --git a/test/fixtures/rewind/flip.input.geojson b/test/fixtures/rewind/flip.input.geojson new file mode 100644 index 0000000..633278a --- /dev/null +++ b/test/fixtures/rewind/flip.input.geojson @@ -0,0 +1,10 @@ +{ "type": "Polygon", + "coordinates": [ + [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ], + [ [ 100.2, 0.2 ], + [ 100.2, 0.8 ], + [ 100.8, 0.8 ], + [ 100.8, 0.2 ], + [ 100.2, 0.2 ] ] + ] + } diff --git a/test/fixtures/rewind/flip.output.geojson b/test/fixtures/rewind/flip.output.geojson new file mode 100644 index 0000000..236152a --- /dev/null +++ b/test/fixtures/rewind/flip.output.geojson @@ -0,0 +1,49 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ], + [ + [ + 100.2, + 0.2 + ], + [ + 100.2, + 0.8 + ], + [ + 100.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ] + ] + ] +} \ No newline at end of file diff --git a/test/fixtures/rewind/geomcollection.input.geojson b/test/fixtures/rewind/geomcollection.input.geojson new file mode 100644 index 0000000..31e411c --- /dev/null +++ b/test/fixtures/rewind/geomcollection.input.geojson @@ -0,0 +1,49 @@ +{ + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "coordinates": [102.0, 0.5] + }, + { + "type": "LineString", + "coordinates": [ + [102.0, 0.0], + [103.0, 1.0], + [104.0, 0.0], + [105.0, 1.0] + ] + }, + { + "type": "Polygon", + "coordinates": [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ] + ] + }, + { + "type": "Polygon", + "coordinates": [ + [ + [100.0, 0.0], + [101.0, 0.0], + [101.0, 1.0], + [100.0, 1.0], + [100.0, 0.0] + ], + [ + [100.2, 0.2], + [100.8, 0.2], + [100.8, 0.8], + [100.2, 0.8], + [100.2, 0.2] + ] + ] + } + ] +} diff --git a/test/fixtures/rewind/geomcollection.output.geojson b/test/fixtures/rewind/geomcollection.output.geojson new file mode 100644 index 0000000..1271633 --- /dev/null +++ b/test/fixtures/rewind/geomcollection.output.geojson @@ -0,0 +1,109 @@ +{ + "type": "GeometryCollection", + "geometries": [ + { + "type": "Point", + "coordinates": [ + 102, + 0.5 + ] + }, + { + "type": "LineString", + "coordinates": [ + [ + 102, + 0 + ], + [ + 103, + 1 + ], + [ + 104, + 0 + ], + [ + 105, + 1 + ] + ] + }, + { + "type": "Polygon", + "coordinates": [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ] + ] + }, + { + "type": "Polygon", + "coordinates": [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ], + [ + [ + 100.2, + 0.2 + ], + [ + 100.2, + 0.8 + ], + [ + 100.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ] + ] + ] + } + ] +} \ No newline at end of file diff --git a/test/fixtures/rewind/multipolygon.input.geojson b/test/fixtures/rewind/multipolygon.input.geojson new file mode 100644 index 0000000..ca75596 --- /dev/null +++ b/test/fixtures/rewind/multipolygon.input.geojson @@ -0,0 +1,7 @@ + { "type": "MultiPolygon", + "coordinates": [ + [[[102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0]]], + [[[100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0]], + [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]] + ] + } diff --git a/test/fixtures/rewind/multipolygon.output.geojson b/test/fixtures/rewind/multipolygon.output.geojson new file mode 100644 index 0000000..0bf7860 --- /dev/null +++ b/test/fixtures/rewind/multipolygon.output.geojson @@ -0,0 +1,75 @@ +{ + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 102, + 2 + ], + [ + 103, + 2 + ], + [ + 103, + 3 + ], + [ + 102, + 3 + ], + [ + 102, + 2 + ] + ] + ], + [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ], + [ + [ + 100.2, + 0.2 + ], + [ + 100.2, + 0.8 + ], + [ + 100.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ] + ] + ] + ] +} \ No newline at end of file diff --git a/test/fixtures/rewind/near-zero.input.geojson b/test/fixtures/rewind/near-zero.input.geojson new file mode 100644 index 0000000..8ae323d --- /dev/null +++ b/test/fixtures/rewind/near-zero.input.geojson @@ -0,0 +1,11 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [7.396768398983337, 43.72260793482001], + [7.396784857564814, 43.722607191112004], + [7.396784857564812, 43.722607191112004], + [7.396768398983337, 43.72260793482001] + ] + ] +} diff --git a/test/fixtures/rewind/near-zero.output.geojson b/test/fixtures/rewind/near-zero.output.geojson new file mode 100644 index 0000000..11fcf8e --- /dev/null +++ b/test/fixtures/rewind/near-zero.output.geojson @@ -0,0 +1,23 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 7.396768398983337, + 43.72260793482001 + ], + [ + 7.396784857564814, + 43.722607191112004 + ], + [ + 7.396784857564812, + 43.722607191112004 + ], + [ + 7.396768398983337, + 43.72260793482001 + ] + ] + ] +} diff --git a/test/fixtures/rewind/rev.input.geojson b/test/fixtures/rewind/rev.input.geojson new file mode 100644 index 0000000..49fe3b8 --- /dev/null +++ b/test/fixtures/rewind/rev.input.geojson @@ -0,0 +1,6 @@ +{ "type": "Polygon", + "coordinates": [ + [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ], + [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ] + ] + } diff --git a/test/fixtures/rewind/rev.output.geojson b/test/fixtures/rewind/rev.output.geojson new file mode 100644 index 0000000..236152a --- /dev/null +++ b/test/fixtures/rewind/rev.output.geojson @@ -0,0 +1,49 @@ +{ + "type": "Polygon", + "coordinates": [ + [ + [ + 100, + 0 + ], + [ + 101, + 0 + ], + [ + 101, + 1 + ], + [ + 100, + 1 + ], + [ + 100, + 0 + ] + ], + [ + [ + 100.2, + 0.2 + ], + [ + 100.2, + 0.8 + ], + [ + 100.8, + 0.8 + ], + [ + 100.8, + 0.2 + ], + [ + 100.2, + 0.2 + ] + ] + ] +} \ No newline at end of file diff --git a/test/rewind.test.ts b/test/rewind.test.ts new file mode 100644 index 0000000..4d5fe87 --- /dev/null +++ b/test/rewind.test.ts @@ -0,0 +1,36 @@ +import rewind from '../lib/rewind.js'; +import fs from 'node:fs'; +import path from 'node:path'; +import test from 'tape'; + +const base = new URL(path.parse(import.meta.url).dir).pathname; + +function f(_: string) { + return JSON.parse(fs.readFileSync(_, 'utf8')); +} + +function fixture(t: any, name: string, title: string) { + const result = rewind(f(name)); + const outputName = name.replace('.input.', '.output.'); + if (process.env.UPDATE) { + fs.writeFileSync(outputName, JSON.stringify(result, null, 4)); + } + const expect = f(outputName); + t.deepEqual(result, expect, title); +} + +test('rewind', (t) => { + fixture(t, base + '/fixtures/rewind/featuregood.input.geojson', 'feature-good'); + fixture(t, base + '/fixtures/rewind/flip.input.geojson', 'flip'); + fixture(t, base + '/fixtures/rewind/collection.input.geojson', 'feature-collection'); + fixture(t, base + '/fixtures/rewind/geomcollection.input.geojson', 'geometry-collection'); + fixture(t, base + '/fixtures/rewind/multipolygon.input.geojson', 'multipolygon'); + fixture(t, base + '/fixtures/rewind/rev.input.geojson', 'rev'); + fixture(t, base + '/fixtures/rewind/near-zero.input.geojson', 'near-zero'); + t.end(); +}); + +test('passthrough', (t) => { + t.equal(rewind(null), null); + t.end(); +}); diff --git a/test/schema.test.ts b/test/schema.test.ts new file mode 100644 index 0000000..d6195b2 --- /dev/null +++ b/test/schema.test.ts @@ -0,0 +1,30 @@ +import EsriDump from '../index.js'; +import test from 'tape'; +// @ts-ignore + +test('FeatureServer Schema', async (t) => { + const url = 'https://sampleserver6.arcgisonline.com/arcgis/rest/services/Wildfire/FeatureServer/0'; + + const esri = new EsriDump(url); + const schema = await esri.schema(); + + + t.deepEquals(schema, { + type: 'object', + required: [], + additionalProperties: false, + properties: { + objectid: { type: 'number' }, + rotation: { type: 'integer' }, + description: { type: 'string', maxLength: 75 }, + eventdate: { type: 'string', maxLength: 8 }, + eventtype: { type: 'integer' }, + created_user: { type: 'string', maxLength: 255 }, + created_date: { type: 'string', maxLength: 8 }, + last_edited_user: { type: 'string', maxLength: 255 }, + last_edited_date: { type: 'string', maxLength: 8 } + } + }); + + t.end(); +}); diff --git a/test/server.ts b/test/server.ts index 27b561e..28c0602 100644 --- a/test/server.ts +++ b/test/server.ts @@ -13,7 +13,7 @@ if (process.argv[2] === 'start') { })); } -export default function Server(opts: any, cb: Function) { +export default function Server(opts: any, cb: any) { if (!opts.mode) { throw new Error('options.mode must be set'); } options = opts;