├── .eslintrc ├── .gitignore ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── bin └── mapbox-file-sniff.js ├── index.js ├── lib └── invalid.js ├── mapbox-file-sniff.jpg ├── package-lock.json ├── package.json └── test ├── data ├── atiff.tif.gz ├── blank_rows.csv ├── bom.kml ├── crs-geojson.json ├── empty-shapefile │ └── empty.shp ├── invalid-blank.csv ├── invalid-empty.tm2z ├── invalid-malformed.tm2z ├── invalid-type.json ├── invalid.tilejson ├── invalid_geometries.csv ├── small.csv ├── valid-bigtiff.tif ├── valid-coordinates.json ├── valid-empty_rows.csv ├── valid-geometries.json ├── valid-lines.csv ├── valid-nested-type.json ├── valid-not-csv.serialtiles.gz ├── valid-one-field.csv ├── valid-paxheader.gz ├── valid-points.csv ├── valid-serialtiles.gz ├── valid.mbtiles ├── valid.tilejson ├── valid.tm2z └── xtracharacters.json └── index.test.js /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "es6": true 4 | }, 5 | "extends": "eslint-config-unstyled" 6 | } 7 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | .nyc_output/ 4 | coverage/ -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | test 2 | .travis.yml 3 | mapbox-file-sniff.jpg 4 | .nyc_output/ 5 | coverage/ 6 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | sudo: false 4 | 5 | matrix: 6 | include: 7 | - node_js: 10 8 | script: 9 | - npm test 10 | - node_js: 12 11 | script: 12 | - npm test -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## 1.0.6 2 | 3 | - Dependency update to resolve security issues [#65](https://github.com/mapbox/mapbox-file-sniff/pull/65) 4 | - Update dev dependencies eslint, tape 5 | - Update dependency yargs to latest 16.x version 6 | - Remove nyc and coverage utilities 7 | - Remove semver module 8 | 9 | ## 1.0.5 10 | 11 | - Update eslint + yargs dependencies for security audit 12 | - Use `Buffer.alloc()` instead of `Buffer()` 13 | - Test on node v10 + v12 14 | - Replace coveralls with codecov + upload coverage from travis file 15 | - Update dev dependencies 16 | 17 | ## 1.0.4 18 | 19 | - Bugfix: Remove unneeded "deflate" magic number [#63](https://github.com/mapbox/mapbox-file-sniff/pull/63) 20 | 21 | ## 1.0.3 22 | 23 | - Bugfix: Properly detect `tiff+gz` files [#62](https://github.com/mapbox/mapbox-file-sniff/pull/62) 24 | 25 | ## 1.0.2 26 | 27 | - Add check for zero byte files [#59](https://github.com/mapbox/mapbox-file-sniff/issues/59) 28 | 29 | ## 1.0.1 30 | 31 | - Update to @mapbox namespace for detect-geocsv 32 | 33 | ## 1.0.0 34 | 35 | - :tada: restructure the API into two methods: 1) `fromBuffer` and 2) `fromFile`, which makes mapbox-file-sniff more readable and simpler to use. Each method returns BOTH `protocol` and `type` information, which reduces redundancy. So long fun method names :( 36 | - :tada: update CLI into a single command `mapbox-file-sniff` which returns a JSON of both file types. You can pass the `--protocol` or `--type` flags to get just a protocol or filetype back. 37 | - :warning: remove support for Node 0.10.x 38 | - :package: .npmignore file added to reduce package size 39 | - :package: officially publishing under the `@mapbox/mapbox-file-sniff` namespace, which was introduced in version `0.5.3`. 40 | 41 | ## 0.5.3 42 | 43 | - Bug: using `process.version` resulted in browserify incompatibility, adding a quick check for `process.version` fixes the issue. [#48](https://github.com/mapbox/mapbox-file-sniff/issues/48) 44 | 45 | ## 0.5.2 46 | 47 | - expand GeoJSON filetype detection with smarter sniffing 48 | - gunzip node v6 support by adding `{finishFlush: zlib.Z_SYNC_FLUSH}` option, but keeping support for node v0.10.x 49 | 50 | ## 0.5.1 51 | 52 | - bump `detect-geocsv` to 0.1.0 53 | 54 | ## 0.5.0 55 | 56 | - gzip support for single tiff uploads 57 | 58 | ## 0.4.4 59 | 60 | - handle errors on non-string properties for particular JSONs 61 | 62 | ## 0.4.3 63 | 64 | - add eslint 65 | - fix global leak from missing `var` 66 | - bump `detect-geocsv` module to 0.0.3 67 | 68 | ## 0.4.2 69 | 70 | - fix handling for very small CSV files 71 | 72 | ## 0.4.1 (DEPRECATED) 73 | 74 | ## 0.4.0 75 | 76 | - remove CSV internal support to use new module `detect-geocsv` 77 | 78 | ## 0.3.5 79 | 80 | - CSV support 81 | - use `Buffer.isBuffer` instead of `instanceof` 82 | 83 | ## 0.3.4 84 | 85 | - allow JSON with spaces inbetween properties 86 | 87 | ## 0.3.3 88 | 89 | - increase JSON validation for GeoJSON and TopoJSON 90 | - fix `-1` bug with `indexOf` 91 | 92 | ## 0.3.2 93 | 94 | - improved `ustar` check 95 | 96 | ## 0.3.1 97 | 98 | - tm2z `ustar` check 99 | 100 | ## 0.3.0 101 | 102 | - bigTIFF support 103 | 104 | ## 0.2.0 105 | 106 | - TopoJSON support 107 | 108 | ## 0.1.0 109 | 110 | - remove `run.js` 111 | - VRT support 112 | 113 | ## 0.0.9 114 | 115 | - increase buffer size to take certain GPX files into account [#50](https://github.com/mapbox/mapnik-omnivore/issues/50) 116 | 117 | ## 0.0.8 118 | 119 | - use GDAL logic for validating geotiffs 120 | 121 | ## 0.0.7 122 | 123 | - exit codes added to command line tools using `quaft` 124 | 125 | ## 0.0.6 126 | 127 | - add `quaft` method to detect filepath vs buffer inputs 128 | - `fs.close` the file after reading is complete 129 | - add shapefile sniffing for unzipped shapefiles 130 | 131 | ## 0.0.5 132 | 133 | - add `waft` method as a first-class citizen with `sniff` 134 | - only partial read of a file in the command line tool 135 | - adds `mapbox-file-type` and `mapbox-file-protocol` command line tools 136 | 137 | ## 0.0.4 138 | 139 | - updated Buffer type check 140 | 141 | ## 0.0.3 142 | 143 | - use Node core `zlib` instead of `pako`. 144 | 145 | ## 0.0.2 146 | 147 | - `sniff` first parameter is a Buffer type instead of a filepath string 148 | 149 | ## 0.0.1 150 | 151 | - initial release 152 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](mapbox-file-sniff.jpg) 2 | 3 | ## Mapbox File Sniff [![Build Status](https://travis-ci.com/mapbox/mapbox-file-sniff.svg?branch=master)](https://travis-ci.com/mapbox/mapbox-file-sniff) 4 | 5 | Node module that returns a spatial filetype and protocol. 6 | 7 | File types: 8 | 9 | - Zipped shapefile: `zip` 10 | - Unziped shapefile: `shp` 11 | - GPX: `gpx` 12 | - KML: `kml` 13 | - GeoJSON: `geojson` 14 | - GeoTIFF: `tif` 15 | - Zipped GeoTIFF: `tif` 16 | - Mbtiles: `mbtiles` 17 | - TileJSON: `tilejson` 18 | - Serialtiles: `serialtiles` 19 | - tm2z: `tm2z` 20 | - csv: `csv` 21 | 22 | Protocols (matching tilelive protocols): 23 | 24 | - `omnivore:` [tilelive-omnivore](https://github.com/mapbox/tilelive-omnivore) 25 | - `mbtiles:` [node-mbtiles](https://github.com/mapbox/node-mbtiles) 26 | - `tilejson:` [node-tilejson](https://github.com/mapbox/node-tilejson) 27 | - `serialtiles`: *special case* 28 | - `tm2z`: [tilelive-vector](https://github.com/mapbox/tilelive-vector) 29 | 30 | # Install 31 | 32 | With npm: 33 | ``` 34 | npm install @mapbox/mapbox-file-sniff 35 | ``` 36 | 37 | # Usage 38 | 39 | ```Javascript 40 | var sniffer = require('@mapbox/mapbox-file-sniff'); 41 | ``` 42 | 43 | ### Javascript 44 | 45 | **`fromBuffer(Buffer)`** - Sniff a file from a buffer. 46 | 47 | ```javascript 48 | var buffer = fs.readFileSync('path/to/data/file.geojson'); 49 | sniffer.fromBuffer(buffer, function(err, info) { 50 | if (err) throw err; 51 | console.log(info); 52 | // { 53 | // protocol: 'omnivore:', 54 | // type: 'geojson' 55 | // } 56 | }); 57 | ``` 58 | 59 | **`fromFile(String)`** - Sniff a file from a file path. 60 | 61 | ```javascript 62 | var file = './path/to/data/file.geojson'; 63 | sniffer.fromFile(file, function(err, info) { 64 | if (err) throw err; 65 | console.log(info); 66 | // { 67 | // protocol: 'omnivore:', 68 | // type: 'geojson' 69 | // } 70 | }); 71 | ``` 72 | 73 | ### CLI 74 | 75 | ```sh 76 | $ mapbox-file-sniff path/to/data/file.geojson 77 | # {"protocol":"omnivore:","type":"geojson"} 78 | $ mapbox-file-sniff path/to/data/file.geojson --type 79 | # geojson 80 | $ mapbox-file-sniff path/to/data/file.geojson --protocol 81 | # omnivore: 82 | ``` 83 | 84 | # Tests 85 | 86 | Full test suite: 87 | 88 | `npm test` 89 | -------------------------------------------------------------------------------- /bin/mapbox-file-sniff.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var filesniffer = require('..'); 4 | var path = require('path'); 5 | var argv = require('yargs').argv; 6 | var filepath = path.resolve(process.argv[2]); 7 | 8 | var method = Buffer.isBuffer(filepath) ? 'fromBuffer' : 'fromFile'; 9 | 10 | filesniffer[method](filepath, function(err, info) { 11 | if (err) { 12 | console.error(err.message); 13 | process.exit(err.code === 'EINVALID' ? 3 : 1); 14 | } 15 | 16 | if (argv.protocol || argv.p) { 17 | console.log(info.protocol); 18 | } else if (argv.type || argv.t) { 19 | console.log(info.type); 20 | } else { 21 | console.log(JSON.stringify(info)); 22 | } 23 | }); 24 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | var zlib = require('zlib'); 2 | var isgeocsv = require('@mapbox/detect-geocsv'); 3 | var invalid = require('./lib/invalid'); 4 | var fs = require('fs'); 5 | var bf = require('buffer'); 6 | 7 | module.exports.fromBuffer = fromBuffer; 8 | module.exports.fromFile = fromFile; 9 | 10 | /** 11 | * Main sniffer. 12 | */ 13 | function fromBuffer(buffer, callback) { 14 | if (!callback || typeof callback !== 'function') throw new Error('Invalid callback. Must be a function.'); 15 | 16 | if (!Buffer.isBuffer(buffer)) return callback(invalid('Input is not a valid buffer.')); 17 | 18 | detect(buffer, function(err, type) { 19 | if (err) return callback(err); 20 | var protocol = getProtocol(type); 21 | return callback(null, {type: type, protocol: protocol}); 22 | }); 23 | }; 24 | 25 | function fromFile(file, callback) { 26 | if (!callback || typeof callback !== 'function') throw new Error('Invalid callback. Must be a function.'); 27 | 28 | fs.open(file, 'r', function(err, fd) { 29 | if (err) return callback(err); 30 | fs.fstat(fd, function(err, stats) { 31 | if (err) return callback(err); 32 | if (stats.size === 0) return callback(invalid('File is zero bytes.')); 33 | var size = stats.size < 512 ? stats.size : 512; 34 | fs.read(fd, new Buffer.alloc(size), 0, size, 0, function(err, bytes, buffer) { 35 | if (bytes <= 2) 36 | err = err || invalid('File too small'); 37 | fs.close(fd, function(closeErr) { 38 | if (err || closeErr) return callback(err || closeErr); 39 | detect(buffer, function(err, type) { 40 | if (err) return callback(err); 41 | var protocol = getProtocol(type); 42 | return callback(null, {type: type, protocol: protocol}); 43 | }); 44 | }); 45 | }); 46 | }); 47 | }); 48 | } 49 | 50 | 51 | /** 52 | * promisify zlib.gunzip. 53 | * 54 | * @param {buffer} buffer - 55 | * @returns {promise} 56 | */ 57 | 58 | function gunzipPromise (buffer) { 59 | return new Promise((resolve, reject) => { 60 | zlib.gunzip(buffer, {finishFlush: zlib.Z_SYNC_FLUSH }, (err, data) => { 61 | if (err) return reject(err); 62 | return resolve(data); 63 | }); 64 | }); 65 | }; 66 | 67 | /** 68 | * Check if a buffer is compressed. 69 | * From: http://www.zlib.org/rfc-gzip.html 70 | * The three first value of the buffer should be: 71 | * - ID1 = 31 (0x1f) 72 | * - ID2 = 139 (0x8b) 73 | * - CM = 8 (0x08) 74 | * 75 | * @param {buffer} buffer - 76 | * @returns {bool} 77 | */ 78 | function isGzip (buffer) { 79 | return buffer[0] === 0x1F 80 | && buffer[1] === 0x8B; 81 | } 82 | 83 | 84 | function detect(buffer, callback) { 85 | 86 | if (isGzip(buffer)) { 87 | 88 | gunzipPromise(buffer) 89 | .then(data => { 90 | //check for tm2z 91 | if (data.toString('ascii', 257, 262) === 'ustar') return callback(null, 'tm2z'); 92 | 93 | //check for serial tiles 94 | const head = data.slice(0, 50); 95 | if (head.toString().indexOf('JSONBREAKFASTTIME') === 0) return callback(null, 'serialtiles'); 96 | 97 | //check for tif+gz 98 | if ( 99 | (data.slice(0, 2).toString() === 'II' || data.slice(0, 2).toString() === 'MM') 100 | && ((data[2] === 42) || data[3] === 42 || data[2] === 43)) { 101 | return callback(null, 'tif+gz'); 102 | } 103 | return callback(invalid('Unknown filetype')); 104 | }) 105 | .catch(err => { 106 | return callback(invalid('Unknown filetype')); 107 | }) 108 | 109 | } else { 110 | 111 | var header = buffer.toString().substring(0, 400); 112 | 113 | // check for topojson/geojson 114 | if (header.trim().indexOf('{') == 0) { 115 | 116 | // Remove spaces 117 | var str = JSON.stringify(header); 118 | var nospaces = str.replace(/\s/g, ''); 119 | header = JSON.parse(nospaces); 120 | 121 | if (header.indexOf('\"tilejson\":') !== -1) return callback(null, 'tilejson'); 122 | if ((header.indexOf('\"arcs\":') !== -1) || (header.indexOf('\"objects\":') !== -1)) return callback(null, 'topojson'); 123 | if ((header.indexOf('\"features\":') !== -1) || (header.indexOf('\"geometries\":') !== -1) || (header.indexOf('\"coordinates\":') !== -1)) return callback(null, 'geojson'); 124 | if (header.indexOf('\"type\":') !== -1) { 125 | var m = /"type":\s?"(.+?)"/.exec(header); 126 | if (!m) { 127 | return callback(invalid('Unknown filetype')); 128 | } 129 | if (m[1] === 'Topology') return callback(null, 'topojson'); 130 | if (m[1] === 'Feature' || 131 | m[1] === 'FeatureCollection' || 132 | m[1] === 'Point' || 133 | m[1] === 'MultiPoint' || 134 | m[1] === 'LineString' || 135 | m[1] === 'MultiLineString' || 136 | m[1] === 'Polygon' || 137 | m[1] === 'MultiPolygon' || 138 | m[1] === 'GeometryCollection') return callback(null, 'geojson'); 139 | } 140 | return callback(invalid('Unknown filetype')); 141 | } 142 | 143 | var head = header.substring(0, 100); 144 | if (head.indexOf('SQLite format 3') === 0) { 145 | return callback(null, 'mbtiles'); 146 | } 147 | if ((head[0] + head[1]) === 'PK') { 148 | return callback(null, 'zip'); 149 | } 150 | // check if geotiff/bigtiff 151 | // matches gdal validation logic: https://github.com/OSGeo/gdal/blob/trunk/gdal/frmts/gtiff/geotiff.cpp#L6892-L6893 152 | if ((head.slice(0, 2).toString() === 'II' || head.slice(0, 2).toString() === 'MM') && ((buffer[2] === 42) || buffer[3] === 42 || buffer[2] === 43)) { 153 | return callback(null, 'tif'); 154 | } 155 | // take into account BOM char at index 0 156 | if (((head.indexOf(' 32 && buffer.readUInt32BE(0) === 9994) { 168 | return callback(null, 'shp'); 169 | } 170 | 171 | // Check for geocsv 172 | if (isgeocsv(buffer)) { 173 | return callback(null, 'csv'); 174 | } 175 | 176 | // If not one of the test is valid then return "Unknown" 177 | return callback(invalid('Unknown filetype')); 178 | } 179 | } 180 | 181 | function getProtocol(type) { 182 | var mapping = { 183 | csv: 'omnivore:', 184 | mbtiles: 'mbtiles:', 185 | shp: 'omnivore:', 186 | zip: 'omnivore:', 187 | tif: 'omnivore:', 188 | 'tif+gz': 'omnivore:', 189 | vrt: 'omnivore:', 190 | geojson: 'omnivore:', 191 | topojson: 'omnivore:', 192 | kml: 'omnivore:', 193 | gpx: 'omnivore:', 194 | tilejson: 'tilejson:', 195 | tm2z: 'tm2z:', 196 | serialtiles: 'serialtiles:' 197 | }; 198 | 199 | return mapping[type]; 200 | } 201 | -------------------------------------------------------------------------------- /lib/invalid.js: -------------------------------------------------------------------------------- 1 | module.exports = function invalid(message) { 2 | var err = message instanceof Error ? message : new Error(message); 3 | err.code = 'EINVALID'; 4 | return err; 5 | }; 6 | -------------------------------------------------------------------------------- /mapbox-file-sniff.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/mapbox-file-sniff.jpg -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mapbox/mapbox-file-sniff", 3 | "version": "1.0.6", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@aashutoshrathi/word-wrap": { 8 | "version": "1.2.6", 9 | "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", 10 | "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", 11 | "dev": true 12 | }, 13 | "@babel/code-frame": { 14 | "version": "7.12.11", 15 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", 16 | "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", 17 | "dev": true, 18 | "requires": { 19 | "@babel/highlight": "^7.10.4" 20 | } 21 | }, 22 | "@babel/helper-validator-identifier": { 23 | "version": "7.22.5", 24 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", 25 | "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", 26 | "dev": true 27 | }, 28 | "@babel/highlight": { 29 | "version": "7.22.5", 30 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", 31 | "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", 32 | "dev": true, 33 | "requires": { 34 | "@babel/helper-validator-identifier": "^7.22.5", 35 | "chalk": "^2.0.0", 36 | "js-tokens": "^4.0.0" 37 | }, 38 | "dependencies": { 39 | "chalk": { 40 | "version": "2.4.2", 41 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 42 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 43 | "dev": true, 44 | "requires": { 45 | "ansi-styles": "^3.2.1", 46 | "escape-string-regexp": "^1.0.5", 47 | "supports-color": "^5.3.0" 48 | } 49 | }, 50 | "escape-string-regexp": { 51 | "version": "1.0.5", 52 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 53 | "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 54 | "dev": true 55 | } 56 | } 57 | }, 58 | "@eslint/eslintrc": { 59 | "version": "0.4.3", 60 | "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", 61 | "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", 62 | "dev": true, 63 | "requires": { 64 | "ajv": "^6.12.4", 65 | "debug": "^4.1.1", 66 | "espree": "^7.3.0", 67 | "globals": "^13.9.0", 68 | "ignore": "^4.0.6", 69 | "import-fresh": "^3.2.1", 70 | "js-yaml": "^3.13.1", 71 | "minimatch": "^3.0.4", 72 | "strip-json-comments": "^3.1.1" 73 | } 74 | }, 75 | "@humanwhocodes/config-array": { 76 | "version": "0.5.0", 77 | "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", 78 | "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", 79 | "dev": true, 80 | "requires": { 81 | "@humanwhocodes/object-schema": "^1.2.0", 82 | "debug": "^4.1.1", 83 | "minimatch": "^3.0.4" 84 | } 85 | }, 86 | "@humanwhocodes/object-schema": { 87 | "version": "1.2.1", 88 | "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", 89 | "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", 90 | "dev": true 91 | }, 92 | "@mapbox/detect-geocsv": { 93 | "version": "0.1.0", 94 | "resolved": "https://registry.npmjs.org/@mapbox/detect-geocsv/-/detect-geocsv-0.1.0.tgz", 95 | "integrity": "sha1-3KHc0ZAFSnDhHliFx4tvsy5hvaA=" 96 | }, 97 | "acorn": { 98 | "version": "7.4.1", 99 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", 100 | "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", 101 | "dev": true 102 | }, 103 | "acorn-jsx": { 104 | "version": "5.3.2", 105 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", 106 | "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", 107 | "dev": true 108 | }, 109 | "ajv": { 110 | "version": "6.12.6", 111 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", 112 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", 113 | "dev": true, 114 | "requires": { 115 | "fast-deep-equal": "^3.1.1", 116 | "fast-json-stable-stringify": "^2.0.0", 117 | "json-schema-traverse": "^0.4.1", 118 | "uri-js": "^4.2.2" 119 | } 120 | }, 121 | "ansi-colors": { 122 | "version": "4.1.3", 123 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", 124 | "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", 125 | "dev": true 126 | }, 127 | "ansi-regex": { 128 | "version": "5.0.1", 129 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 130 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" 131 | }, 132 | "ansi-styles": { 133 | "version": "3.2.1", 134 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 135 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 136 | "dev": true, 137 | "requires": { 138 | "color-convert": "^1.9.0" 139 | } 140 | }, 141 | "argparse": { 142 | "version": "1.0.10", 143 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 144 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 145 | "dev": true, 146 | "requires": { 147 | "sprintf-js": "~1.0.2" 148 | } 149 | }, 150 | "array-buffer-byte-length": { 151 | "version": "1.0.0", 152 | "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", 153 | "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", 154 | "dev": true, 155 | "requires": { 156 | "call-bind": "^1.0.2", 157 | "is-array-buffer": "^3.0.1" 158 | } 159 | }, 160 | "array.prototype.every": { 161 | "version": "1.1.4", 162 | "resolved": "https://registry.npmjs.org/array.prototype.every/-/array.prototype.every-1.1.4.tgz", 163 | "integrity": "sha512-Aui35iRZk1HHLRAyF7QP0KAnOnduaQ6fo6k1NVWfRc0xTs2AZ70ytlXvOmkC6Di4JmUs2Wv3DYzGtCQFSk5uGg==", 164 | "dev": true, 165 | "requires": { 166 | "call-bind": "^1.0.2", 167 | "define-properties": "^1.1.4", 168 | "es-abstract": "^1.20.4", 169 | "is-string": "^1.0.7" 170 | } 171 | }, 172 | "astral-regex": { 173 | "version": "2.0.0", 174 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", 175 | "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", 176 | "dev": true 177 | }, 178 | "available-typed-arrays": { 179 | "version": "1.0.5", 180 | "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", 181 | "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", 182 | "dev": true 183 | }, 184 | "balanced-match": { 185 | "version": "1.0.0", 186 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 187 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 188 | "dev": true 189 | }, 190 | "base64-js": { 191 | "version": "0.0.8", 192 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-0.0.8.tgz", 193 | "integrity": "sha1-EQHpVE9KdrG8OybUUsqW16NeeXg=" 194 | }, 195 | "brace-expansion": { 196 | "version": "1.1.11", 197 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 198 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 199 | "dev": true, 200 | "requires": { 201 | "balanced-match": "^1.0.0", 202 | "concat-map": "0.0.1" 203 | } 204 | }, 205 | "buffer": { 206 | "version": "3.6.2", 207 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-3.6.2.tgz", 208 | "integrity": "sha512-c3M77NkHJxS0zx/ErxXhDLr1v3y2MDXPeTJPvLNOaIYJ4ymHBUFQ9EXzt9HYuqAJllMoNb/EZ8hIiulnQFAUuQ==", 209 | "requires": { 210 | "base64-js": "0.0.8", 211 | "ieee754": "^1.1.4", 212 | "isarray": "^1.0.0" 213 | } 214 | }, 215 | "call-bind": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", 218 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", 219 | "dev": true, 220 | "requires": { 221 | "function-bind": "^1.1.1", 222 | "get-intrinsic": "^1.0.2" 223 | } 224 | }, 225 | "callsites": { 226 | "version": "3.1.0", 227 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 228 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 229 | "dev": true 230 | }, 231 | "chalk": { 232 | "version": "4.1.2", 233 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 234 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 235 | "dev": true, 236 | "requires": { 237 | "ansi-styles": "^4.1.0", 238 | "supports-color": "^7.1.0" 239 | }, 240 | "dependencies": { 241 | "ansi-styles": { 242 | "version": "4.3.0", 243 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 244 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 245 | "dev": true, 246 | "requires": { 247 | "color-convert": "^2.0.1" 248 | } 249 | }, 250 | "color-convert": { 251 | "version": "2.0.1", 252 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 253 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 254 | "dev": true, 255 | "requires": { 256 | "color-name": "~1.1.4" 257 | } 258 | }, 259 | "color-name": { 260 | "version": "1.1.4", 261 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 262 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 263 | "dev": true 264 | }, 265 | "has-flag": { 266 | "version": "4.0.0", 267 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 268 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 269 | "dev": true 270 | }, 271 | "supports-color": { 272 | "version": "7.2.0", 273 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 274 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 275 | "dev": true, 276 | "requires": { 277 | "has-flag": "^4.0.0" 278 | } 279 | } 280 | } 281 | }, 282 | "cliui": { 283 | "version": "7.0.4", 284 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 285 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 286 | "requires": { 287 | "string-width": "^4.2.0", 288 | "strip-ansi": "^6.0.0", 289 | "wrap-ansi": "^7.0.0" 290 | } 291 | }, 292 | "color-convert": { 293 | "version": "1.9.3", 294 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 295 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 296 | "dev": true, 297 | "requires": { 298 | "color-name": "1.1.3" 299 | } 300 | }, 301 | "color-name": { 302 | "version": "1.1.3", 303 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 304 | "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 305 | "dev": true 306 | }, 307 | "concat-map": { 308 | "version": "0.0.1", 309 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 310 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 311 | "dev": true 312 | }, 313 | "cross-spawn": { 314 | "version": "7.0.3", 315 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", 316 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", 317 | "dev": true, 318 | "requires": { 319 | "path-key": "^3.1.0", 320 | "shebang-command": "^2.0.0", 321 | "which": "^2.0.1" 322 | } 323 | }, 324 | "debug": { 325 | "version": "4.2.0", 326 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz", 327 | "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==", 328 | "dev": true, 329 | "requires": { 330 | "ms": "2.1.2" 331 | } 332 | }, 333 | "deep-equal": { 334 | "version": "2.2.2", 335 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.2.tgz", 336 | "integrity": "sha512-xjVyBf0w5vH0I42jdAZzOKVldmPgSulmiyPRywoyq7HXC9qdgo17kxJE+rdnif5Tz6+pIrpJI8dCpMNLIGkUiA==", 337 | "dev": true, 338 | "requires": { 339 | "array-buffer-byte-length": "^1.0.0", 340 | "call-bind": "^1.0.2", 341 | "es-get-iterator": "^1.1.3", 342 | "get-intrinsic": "^1.2.1", 343 | "is-arguments": "^1.1.1", 344 | "is-array-buffer": "^3.0.2", 345 | "is-date-object": "^1.0.5", 346 | "is-regex": "^1.1.4", 347 | "is-shared-array-buffer": "^1.0.2", 348 | "isarray": "^2.0.5", 349 | "object-is": "^1.1.5", 350 | "object-keys": "^1.1.1", 351 | "object.assign": "^4.1.4", 352 | "regexp.prototype.flags": "^1.5.0", 353 | "side-channel": "^1.0.4", 354 | "which-boxed-primitive": "^1.0.2", 355 | "which-collection": "^1.0.1", 356 | "which-typed-array": "^1.1.9" 357 | }, 358 | "dependencies": { 359 | "isarray": { 360 | "version": "2.0.5", 361 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 362 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 363 | "dev": true 364 | } 365 | } 366 | }, 367 | "deep-is": { 368 | "version": "0.1.4", 369 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", 370 | "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", 371 | "dev": true 372 | }, 373 | "define-properties": { 374 | "version": "1.2.0", 375 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", 376 | "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", 377 | "dev": true, 378 | "requires": { 379 | "has-property-descriptors": "^1.0.0", 380 | "object-keys": "^1.1.1" 381 | } 382 | }, 383 | "defined": { 384 | "version": "1.0.1", 385 | "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", 386 | "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", 387 | "dev": true 388 | }, 389 | "doctrine": { 390 | "version": "3.0.0", 391 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 392 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 393 | "dev": true, 394 | "requires": { 395 | "esutils": "^2.0.2" 396 | } 397 | }, 398 | "dotignore": { 399 | "version": "0.1.2", 400 | "resolved": "https://registry.npmjs.org/dotignore/-/dotignore-0.1.2.tgz", 401 | "integrity": "sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==", 402 | "dev": true, 403 | "requires": { 404 | "minimatch": "^3.0.4" 405 | } 406 | }, 407 | "enquirer": { 408 | "version": "2.3.6", 409 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", 410 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", 411 | "dev": true, 412 | "requires": { 413 | "ansi-colors": "^4.1.1" 414 | } 415 | }, 416 | "es-abstract": { 417 | "version": "1.21.3", 418 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.3.tgz", 419 | "integrity": "sha512-ZU4miiY1j3sGPFLJ34VJXEqhpmL+HGByCinGHv4HC+Fxl2fI2Z4yR6tl0mORnDr6PA8eihWo4LmSWDbvhALckg==", 420 | "dev": true, 421 | "requires": { 422 | "array-buffer-byte-length": "^1.0.0", 423 | "available-typed-arrays": "^1.0.5", 424 | "call-bind": "^1.0.2", 425 | "es-set-tostringtag": "^2.0.1", 426 | "es-to-primitive": "^1.2.1", 427 | "function.prototype.name": "^1.1.5", 428 | "get-intrinsic": "^1.2.1", 429 | "get-symbol-description": "^1.0.0", 430 | "globalthis": "^1.0.3", 431 | "gopd": "^1.0.1", 432 | "has": "^1.0.3", 433 | "has-property-descriptors": "^1.0.0", 434 | "has-proto": "^1.0.1", 435 | "has-symbols": "^1.0.3", 436 | "internal-slot": "^1.0.5", 437 | "is-array-buffer": "^3.0.2", 438 | "is-callable": "^1.2.7", 439 | "is-negative-zero": "^2.0.2", 440 | "is-regex": "^1.1.4", 441 | "is-shared-array-buffer": "^1.0.2", 442 | "is-string": "^1.0.7", 443 | "is-typed-array": "^1.1.10", 444 | "is-weakref": "^1.0.2", 445 | "object-inspect": "^1.12.3", 446 | "object-keys": "^1.1.1", 447 | "object.assign": "^4.1.4", 448 | "regexp.prototype.flags": "^1.5.0", 449 | "safe-regex-test": "^1.0.0", 450 | "string.prototype.trim": "^1.2.7", 451 | "string.prototype.trimend": "^1.0.6", 452 | "string.prototype.trimstart": "^1.0.6", 453 | "typed-array-byte-offset": "^1.0.0", 454 | "typed-array-length": "^1.0.4", 455 | "unbox-primitive": "^1.0.2", 456 | "which-typed-array": "^1.1.10" 457 | } 458 | }, 459 | "es-get-iterator": { 460 | "version": "1.1.3", 461 | "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", 462 | "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", 463 | "dev": true, 464 | "requires": { 465 | "call-bind": "^1.0.2", 466 | "get-intrinsic": "^1.1.3", 467 | "has-symbols": "^1.0.3", 468 | "is-arguments": "^1.1.1", 469 | "is-map": "^2.0.2", 470 | "is-set": "^2.0.2", 471 | "is-string": "^1.0.7", 472 | "isarray": "^2.0.5", 473 | "stop-iteration-iterator": "^1.0.0" 474 | }, 475 | "dependencies": { 476 | "isarray": { 477 | "version": "2.0.5", 478 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", 479 | "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", 480 | "dev": true 481 | } 482 | } 483 | }, 484 | "es-set-tostringtag": { 485 | "version": "2.0.1", 486 | "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", 487 | "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", 488 | "dev": true, 489 | "requires": { 490 | "get-intrinsic": "^1.1.3", 491 | "has": "^1.0.3", 492 | "has-tostringtag": "^1.0.0" 493 | } 494 | }, 495 | "es-to-primitive": { 496 | "version": "1.2.1", 497 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 498 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 499 | "dev": true, 500 | "requires": { 501 | "is-callable": "^1.1.4", 502 | "is-date-object": "^1.0.1", 503 | "is-symbol": "^1.0.2" 504 | } 505 | }, 506 | "escalade": { 507 | "version": "3.1.1", 508 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 509 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" 510 | }, 511 | "escape-string-regexp": { 512 | "version": "4.0.0", 513 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 514 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 515 | "dev": true 516 | }, 517 | "eslint": { 518 | "version": "7.32.0", 519 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", 520 | "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", 521 | "dev": true, 522 | "requires": { 523 | "@babel/code-frame": "7.12.11", 524 | "@eslint/eslintrc": "^0.4.3", 525 | "@humanwhocodes/config-array": "^0.5.0", 526 | "ajv": "^6.10.0", 527 | "chalk": "^4.0.0", 528 | "cross-spawn": "^7.0.2", 529 | "debug": "^4.0.1", 530 | "doctrine": "^3.0.0", 531 | "enquirer": "^2.3.5", 532 | "escape-string-regexp": "^4.0.0", 533 | "eslint-scope": "^5.1.1", 534 | "eslint-utils": "^2.1.0", 535 | "eslint-visitor-keys": "^2.0.0", 536 | "espree": "^7.3.1", 537 | "esquery": "^1.4.0", 538 | "esutils": "^2.0.2", 539 | "fast-deep-equal": "^3.1.3", 540 | "file-entry-cache": "^6.0.1", 541 | "functional-red-black-tree": "^1.0.1", 542 | "glob-parent": "^5.1.2", 543 | "globals": "^13.6.0", 544 | "ignore": "^4.0.6", 545 | "import-fresh": "^3.0.0", 546 | "imurmurhash": "^0.1.4", 547 | "is-glob": "^4.0.0", 548 | "js-yaml": "^3.13.1", 549 | "json-stable-stringify-without-jsonify": "^1.0.1", 550 | "levn": "^0.4.1", 551 | "lodash.merge": "^4.6.2", 552 | "minimatch": "^3.0.4", 553 | "natural-compare": "^1.4.0", 554 | "optionator": "^0.9.1", 555 | "progress": "^2.0.0", 556 | "regexpp": "^3.1.0", 557 | "semver": "^7.2.1", 558 | "strip-ansi": "^6.0.0", 559 | "strip-json-comments": "^3.1.0", 560 | "table": "^6.0.9", 561 | "text-table": "^0.2.0", 562 | "v8-compile-cache": "^2.0.3" 563 | }, 564 | "dependencies": { 565 | "semver": { 566 | "version": "7.5.4", 567 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", 568 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", 569 | "dev": true, 570 | "requires": { 571 | "lru-cache": "^6.0.0" 572 | } 573 | } 574 | } 575 | }, 576 | "eslint-config-unstyled": { 577 | "version": "1.1.0", 578 | "resolved": "https://registry.npmjs.org/eslint-config-unstyled/-/eslint-config-unstyled-1.1.0.tgz", 579 | "integrity": "sha1-NY9QTTXjOAHZEauhQzAkxmF+Nfo=", 580 | "dev": true 581 | }, 582 | "eslint-scope": { 583 | "version": "5.1.1", 584 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", 585 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", 586 | "dev": true, 587 | "requires": { 588 | "esrecurse": "^4.3.0", 589 | "estraverse": "^4.1.1" 590 | } 591 | }, 592 | "eslint-utils": { 593 | "version": "2.1.0", 594 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", 595 | "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", 596 | "dev": true, 597 | "requires": { 598 | "eslint-visitor-keys": "^1.1.0" 599 | }, 600 | "dependencies": { 601 | "eslint-visitor-keys": { 602 | "version": "1.3.0", 603 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 604 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 605 | "dev": true 606 | } 607 | } 608 | }, 609 | "eslint-visitor-keys": { 610 | "version": "2.1.0", 611 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", 612 | "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", 613 | "dev": true 614 | }, 615 | "espree": { 616 | "version": "7.3.1", 617 | "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", 618 | "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", 619 | "dev": true, 620 | "requires": { 621 | "acorn": "^7.4.0", 622 | "acorn-jsx": "^5.3.1", 623 | "eslint-visitor-keys": "^1.3.0" 624 | }, 625 | "dependencies": { 626 | "eslint-visitor-keys": { 627 | "version": "1.3.0", 628 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", 629 | "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", 630 | "dev": true 631 | } 632 | } 633 | }, 634 | "esprima": { 635 | "version": "4.0.1", 636 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 637 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 638 | "dev": true 639 | }, 640 | "esquery": { 641 | "version": "1.5.0", 642 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", 643 | "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", 644 | "dev": true, 645 | "requires": { 646 | "estraverse": "^5.1.0" 647 | }, 648 | "dependencies": { 649 | "estraverse": { 650 | "version": "5.3.0", 651 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 652 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 653 | "dev": true 654 | } 655 | } 656 | }, 657 | "esrecurse": { 658 | "version": "4.3.0", 659 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", 660 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", 661 | "dev": true, 662 | "requires": { 663 | "estraverse": "^5.2.0" 664 | }, 665 | "dependencies": { 666 | "estraverse": { 667 | "version": "5.3.0", 668 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", 669 | "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", 670 | "dev": true 671 | } 672 | } 673 | }, 674 | "estraverse": { 675 | "version": "4.3.0", 676 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 677 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 678 | "dev": true 679 | }, 680 | "esutils": { 681 | "version": "2.0.3", 682 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 683 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 684 | "dev": true 685 | }, 686 | "fast-deep-equal": { 687 | "version": "3.1.3", 688 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", 689 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", 690 | "dev": true 691 | }, 692 | "fast-json-stable-stringify": { 693 | "version": "2.1.0", 694 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", 695 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", 696 | "dev": true 697 | }, 698 | "fast-levenshtein": { 699 | "version": "2.0.6", 700 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 701 | "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", 702 | "dev": true 703 | }, 704 | "file-entry-cache": { 705 | "version": "6.0.1", 706 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", 707 | "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", 708 | "dev": true, 709 | "requires": { 710 | "flat-cache": "^3.0.4" 711 | } 712 | }, 713 | "flat-cache": { 714 | "version": "3.0.4", 715 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", 716 | "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", 717 | "dev": true, 718 | "requires": { 719 | "flatted": "^3.1.0", 720 | "rimraf": "^3.0.2" 721 | } 722 | }, 723 | "flatted": { 724 | "version": "3.2.7", 725 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", 726 | "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", 727 | "dev": true 728 | }, 729 | "for-each": { 730 | "version": "0.3.3", 731 | "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", 732 | "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", 733 | "dev": true, 734 | "requires": { 735 | "is-callable": "^1.1.3" 736 | } 737 | }, 738 | "fs.realpath": { 739 | "version": "1.0.0", 740 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 741 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 742 | "dev": true 743 | }, 744 | "function-bind": { 745 | "version": "1.1.1", 746 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 747 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 748 | "dev": true 749 | }, 750 | "function.prototype.name": { 751 | "version": "1.1.5", 752 | "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", 753 | "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", 754 | "dev": true, 755 | "requires": { 756 | "call-bind": "^1.0.2", 757 | "define-properties": "^1.1.3", 758 | "es-abstract": "^1.19.0", 759 | "functions-have-names": "^1.2.2" 760 | } 761 | }, 762 | "functional-red-black-tree": { 763 | "version": "1.0.1", 764 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 765 | "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", 766 | "dev": true 767 | }, 768 | "functions-have-names": { 769 | "version": "1.2.3", 770 | "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", 771 | "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", 772 | "dev": true 773 | }, 774 | "get-caller-file": { 775 | "version": "2.0.5", 776 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 777 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 778 | }, 779 | "get-intrinsic": { 780 | "version": "1.2.1", 781 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", 782 | "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", 783 | "dev": true, 784 | "requires": { 785 | "function-bind": "^1.1.1", 786 | "has": "^1.0.3", 787 | "has-proto": "^1.0.1", 788 | "has-symbols": "^1.0.3" 789 | } 790 | }, 791 | "get-package-type": { 792 | "version": "0.1.0", 793 | "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", 794 | "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", 795 | "dev": true 796 | }, 797 | "get-symbol-description": { 798 | "version": "1.0.0", 799 | "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", 800 | "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", 801 | "dev": true, 802 | "requires": { 803 | "call-bind": "^1.0.2", 804 | "get-intrinsic": "^1.1.1" 805 | } 806 | }, 807 | "glob": { 808 | "version": "7.2.3", 809 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", 810 | "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", 811 | "dev": true, 812 | "requires": { 813 | "fs.realpath": "^1.0.0", 814 | "inflight": "^1.0.4", 815 | "inherits": "2", 816 | "minimatch": "^3.1.1", 817 | "once": "^1.3.0", 818 | "path-is-absolute": "^1.0.0" 819 | } 820 | }, 821 | "glob-parent": { 822 | "version": "5.1.2", 823 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 824 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 825 | "dev": true, 826 | "requires": { 827 | "is-glob": "^4.0.1" 828 | } 829 | }, 830 | "globals": { 831 | "version": "13.20.0", 832 | "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", 833 | "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", 834 | "dev": true, 835 | "requires": { 836 | "type-fest": "^0.20.2" 837 | } 838 | }, 839 | "globalthis": { 840 | "version": "1.0.3", 841 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 842 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 843 | "dev": true, 844 | "requires": { 845 | "define-properties": "^1.1.3" 846 | } 847 | }, 848 | "gopd": { 849 | "version": "1.0.1", 850 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 851 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 852 | "dev": true, 853 | "requires": { 854 | "get-intrinsic": "^1.1.3" 855 | } 856 | }, 857 | "has": { 858 | "version": "1.0.3", 859 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 860 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 861 | "dev": true, 862 | "requires": { 863 | "function-bind": "^1.1.1" 864 | } 865 | }, 866 | "has-bigints": { 867 | "version": "1.0.2", 868 | "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", 869 | "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", 870 | "dev": true 871 | }, 872 | "has-dynamic-import": { 873 | "version": "2.0.1", 874 | "resolved": "https://registry.npmjs.org/has-dynamic-import/-/has-dynamic-import-2.0.1.tgz", 875 | "integrity": "sha512-X3fbtsZmwb6W7fJGR9o7x65fZoodygCrZ3TVycvghP62yYQfS0t4RS0Qcz+j5tQYUKeSWS09tHkWW6WhFV3XhQ==", 876 | "dev": true, 877 | "requires": { 878 | "call-bind": "^1.0.2", 879 | "get-intrinsic": "^1.1.1" 880 | } 881 | }, 882 | "has-flag": { 883 | "version": "3.0.0", 884 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 885 | "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 886 | "dev": true 887 | }, 888 | "has-property-descriptors": { 889 | "version": "1.0.0", 890 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", 891 | "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", 892 | "dev": true, 893 | "requires": { 894 | "get-intrinsic": "^1.1.1" 895 | } 896 | }, 897 | "has-proto": { 898 | "version": "1.0.1", 899 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", 900 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", 901 | "dev": true 902 | }, 903 | "has-symbols": { 904 | "version": "1.0.3", 905 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 906 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 907 | "dev": true 908 | }, 909 | "has-tostringtag": { 910 | "version": "1.0.0", 911 | "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", 912 | "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", 913 | "dev": true, 914 | "requires": { 915 | "has-symbols": "^1.0.2" 916 | } 917 | }, 918 | "ieee754": { 919 | "version": "1.1.13", 920 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 921 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" 922 | }, 923 | "ignore": { 924 | "version": "4.0.6", 925 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 926 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 927 | "dev": true 928 | }, 929 | "import-fresh": { 930 | "version": "3.3.0", 931 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", 932 | "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", 933 | "dev": true, 934 | "requires": { 935 | "parent-module": "^1.0.0", 936 | "resolve-from": "^4.0.0" 937 | } 938 | }, 939 | "imurmurhash": { 940 | "version": "0.1.4", 941 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 942 | "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", 943 | "dev": true 944 | }, 945 | "inflight": { 946 | "version": "1.0.6", 947 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 948 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 949 | "dev": true, 950 | "requires": { 951 | "once": "^1.3.0", 952 | "wrappy": "1" 953 | } 954 | }, 955 | "inherits": { 956 | "version": "2.0.4", 957 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 958 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 959 | "dev": true 960 | }, 961 | "internal-slot": { 962 | "version": "1.0.5", 963 | "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", 964 | "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", 965 | "dev": true, 966 | "requires": { 967 | "get-intrinsic": "^1.2.0", 968 | "has": "^1.0.3", 969 | "side-channel": "^1.0.4" 970 | } 971 | }, 972 | "is-arguments": { 973 | "version": "1.1.1", 974 | "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", 975 | "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", 976 | "dev": true, 977 | "requires": { 978 | "call-bind": "^1.0.2", 979 | "has-tostringtag": "^1.0.0" 980 | } 981 | }, 982 | "is-array-buffer": { 983 | "version": "3.0.2", 984 | "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", 985 | "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", 986 | "dev": true, 987 | "requires": { 988 | "call-bind": "^1.0.2", 989 | "get-intrinsic": "^1.2.0", 990 | "is-typed-array": "^1.1.10" 991 | } 992 | }, 993 | "is-bigint": { 994 | "version": "1.0.4", 995 | "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", 996 | "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", 997 | "dev": true, 998 | "requires": { 999 | "has-bigints": "^1.0.1" 1000 | } 1001 | }, 1002 | "is-boolean-object": { 1003 | "version": "1.1.2", 1004 | "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", 1005 | "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", 1006 | "dev": true, 1007 | "requires": { 1008 | "call-bind": "^1.0.2", 1009 | "has-tostringtag": "^1.0.0" 1010 | } 1011 | }, 1012 | "is-callable": { 1013 | "version": "1.2.7", 1014 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", 1015 | "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", 1016 | "dev": true 1017 | }, 1018 | "is-core-module": { 1019 | "version": "2.12.1", 1020 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", 1021 | "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", 1022 | "dev": true, 1023 | "requires": { 1024 | "has": "^1.0.3" 1025 | } 1026 | }, 1027 | "is-date-object": { 1028 | "version": "1.0.5", 1029 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", 1030 | "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", 1031 | "dev": true, 1032 | "requires": { 1033 | "has-tostringtag": "^1.0.0" 1034 | } 1035 | }, 1036 | "is-extglob": { 1037 | "version": "2.1.1", 1038 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1039 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1040 | "dev": true 1041 | }, 1042 | "is-fullwidth-code-point": { 1043 | "version": "3.0.0", 1044 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1045 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" 1046 | }, 1047 | "is-glob": { 1048 | "version": "4.0.3", 1049 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1050 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1051 | "dev": true, 1052 | "requires": { 1053 | "is-extglob": "^2.1.1" 1054 | } 1055 | }, 1056 | "is-map": { 1057 | "version": "2.0.2", 1058 | "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", 1059 | "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", 1060 | "dev": true 1061 | }, 1062 | "is-negative-zero": { 1063 | "version": "2.0.2", 1064 | "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", 1065 | "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", 1066 | "dev": true 1067 | }, 1068 | "is-number-object": { 1069 | "version": "1.0.7", 1070 | "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", 1071 | "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", 1072 | "dev": true, 1073 | "requires": { 1074 | "has-tostringtag": "^1.0.0" 1075 | } 1076 | }, 1077 | "is-regex": { 1078 | "version": "1.1.4", 1079 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", 1080 | "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", 1081 | "dev": true, 1082 | "requires": { 1083 | "call-bind": "^1.0.2", 1084 | "has-tostringtag": "^1.0.0" 1085 | } 1086 | }, 1087 | "is-set": { 1088 | "version": "2.0.2", 1089 | "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", 1090 | "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", 1091 | "dev": true 1092 | }, 1093 | "is-shared-array-buffer": { 1094 | "version": "1.0.2", 1095 | "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", 1096 | "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", 1097 | "dev": true, 1098 | "requires": { 1099 | "call-bind": "^1.0.2" 1100 | } 1101 | }, 1102 | "is-string": { 1103 | "version": "1.0.7", 1104 | "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", 1105 | "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", 1106 | "dev": true, 1107 | "requires": { 1108 | "has-tostringtag": "^1.0.0" 1109 | } 1110 | }, 1111 | "is-symbol": { 1112 | "version": "1.0.4", 1113 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", 1114 | "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", 1115 | "dev": true, 1116 | "requires": { 1117 | "has-symbols": "^1.0.2" 1118 | } 1119 | }, 1120 | "is-typed-array": { 1121 | "version": "1.1.10", 1122 | "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", 1123 | "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", 1124 | "dev": true, 1125 | "requires": { 1126 | "available-typed-arrays": "^1.0.5", 1127 | "call-bind": "^1.0.2", 1128 | "for-each": "^0.3.3", 1129 | "gopd": "^1.0.1", 1130 | "has-tostringtag": "^1.0.0" 1131 | } 1132 | }, 1133 | "is-weakmap": { 1134 | "version": "2.0.1", 1135 | "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", 1136 | "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", 1137 | "dev": true 1138 | }, 1139 | "is-weakref": { 1140 | "version": "1.0.2", 1141 | "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", 1142 | "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", 1143 | "dev": true, 1144 | "requires": { 1145 | "call-bind": "^1.0.2" 1146 | } 1147 | }, 1148 | "is-weakset": { 1149 | "version": "2.0.2", 1150 | "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", 1151 | "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", 1152 | "dev": true, 1153 | "requires": { 1154 | "call-bind": "^1.0.2", 1155 | "get-intrinsic": "^1.1.1" 1156 | } 1157 | }, 1158 | "isarray": { 1159 | "version": "1.0.0", 1160 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1161 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1162 | }, 1163 | "isexe": { 1164 | "version": "2.0.0", 1165 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1166 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1167 | "dev": true 1168 | }, 1169 | "js-tokens": { 1170 | "version": "4.0.0", 1171 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1172 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1173 | "dev": true 1174 | }, 1175 | "js-yaml": { 1176 | "version": "3.14.1", 1177 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 1178 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 1179 | "dev": true, 1180 | "requires": { 1181 | "argparse": "^1.0.7", 1182 | "esprima": "^4.0.0" 1183 | } 1184 | }, 1185 | "json-schema-traverse": { 1186 | "version": "0.4.1", 1187 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 1188 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 1189 | "dev": true 1190 | }, 1191 | "json-stable-stringify-without-jsonify": { 1192 | "version": "1.0.1", 1193 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1194 | "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", 1195 | "dev": true 1196 | }, 1197 | "levn": { 1198 | "version": "0.4.1", 1199 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", 1200 | "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", 1201 | "dev": true, 1202 | "requires": { 1203 | "prelude-ls": "^1.2.1", 1204 | "type-check": "~0.4.0" 1205 | } 1206 | }, 1207 | "lodash.merge": { 1208 | "version": "4.6.2", 1209 | "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", 1210 | "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", 1211 | "dev": true 1212 | }, 1213 | "lodash.truncate": { 1214 | "version": "4.4.2", 1215 | "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", 1216 | "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", 1217 | "dev": true 1218 | }, 1219 | "lru-cache": { 1220 | "version": "6.0.0", 1221 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1222 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1223 | "dev": true, 1224 | "requires": { 1225 | "yallist": "^4.0.0" 1226 | } 1227 | }, 1228 | "mapnik-test-data": { 1229 | "version": "2.2.0", 1230 | "resolved": "https://registry.npmjs.org/mapnik-test-data/-/mapnik-test-data-2.2.0.tgz", 1231 | "integrity": "sha1-LG7sgHg0Fpv4IwbgkxUXMrQlF7o=", 1232 | "dev": true 1233 | }, 1234 | "minimatch": { 1235 | "version": "3.1.2", 1236 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 1237 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 1238 | "dev": true, 1239 | "requires": { 1240 | "brace-expansion": "^1.1.7" 1241 | } 1242 | }, 1243 | "minimist": { 1244 | "version": "1.2.8", 1245 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1246 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1247 | "dev": true 1248 | }, 1249 | "ms": { 1250 | "version": "2.1.2", 1251 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1252 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 1253 | "dev": true 1254 | }, 1255 | "natural-compare": { 1256 | "version": "1.4.0", 1257 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1258 | "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", 1259 | "dev": true 1260 | }, 1261 | "object-inspect": { 1262 | "version": "1.12.3", 1263 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", 1264 | "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", 1265 | "dev": true 1266 | }, 1267 | "object-is": { 1268 | "version": "1.1.5", 1269 | "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", 1270 | "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", 1271 | "dev": true, 1272 | "requires": { 1273 | "call-bind": "^1.0.2", 1274 | "define-properties": "^1.1.3" 1275 | } 1276 | }, 1277 | "object-keys": { 1278 | "version": "1.1.1", 1279 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1280 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1281 | "dev": true 1282 | }, 1283 | "object.assign": { 1284 | "version": "4.1.4", 1285 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", 1286 | "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", 1287 | "dev": true, 1288 | "requires": { 1289 | "call-bind": "^1.0.2", 1290 | "define-properties": "^1.1.4", 1291 | "has-symbols": "^1.0.3", 1292 | "object-keys": "^1.1.1" 1293 | } 1294 | }, 1295 | "once": { 1296 | "version": "1.4.0", 1297 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1298 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1299 | "dev": true, 1300 | "requires": { 1301 | "wrappy": "1" 1302 | } 1303 | }, 1304 | "optionator": { 1305 | "version": "0.9.3", 1306 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", 1307 | "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", 1308 | "dev": true, 1309 | "requires": { 1310 | "@aashutoshrathi/word-wrap": "^1.2.3", 1311 | "deep-is": "^0.1.3", 1312 | "fast-levenshtein": "^2.0.6", 1313 | "levn": "^0.4.1", 1314 | "prelude-ls": "^1.2.1", 1315 | "type-check": "^0.4.0" 1316 | } 1317 | }, 1318 | "parent-module": { 1319 | "version": "1.0.1", 1320 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 1321 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 1322 | "dev": true, 1323 | "requires": { 1324 | "callsites": "^3.0.0" 1325 | } 1326 | }, 1327 | "path-is-absolute": { 1328 | "version": "1.0.1", 1329 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1330 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1331 | "dev": true 1332 | }, 1333 | "path-key": { 1334 | "version": "3.1.1", 1335 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 1336 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 1337 | "dev": true 1338 | }, 1339 | "path-parse": { 1340 | "version": "1.0.7", 1341 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1342 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1343 | "dev": true 1344 | }, 1345 | "prelude-ls": { 1346 | "version": "1.2.1", 1347 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", 1348 | "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", 1349 | "dev": true 1350 | }, 1351 | "progress": { 1352 | "version": "2.0.3", 1353 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1354 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1355 | "dev": true 1356 | }, 1357 | "punycode": { 1358 | "version": "2.3.0", 1359 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", 1360 | "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", 1361 | "dev": true 1362 | }, 1363 | "regexp.prototype.flags": { 1364 | "version": "1.5.0", 1365 | "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", 1366 | "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", 1367 | "dev": true, 1368 | "requires": { 1369 | "call-bind": "^1.0.2", 1370 | "define-properties": "^1.2.0", 1371 | "functions-have-names": "^1.2.3" 1372 | } 1373 | }, 1374 | "regexpp": { 1375 | "version": "3.2.0", 1376 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", 1377 | "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", 1378 | "dev": true 1379 | }, 1380 | "require-directory": { 1381 | "version": "2.1.1", 1382 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1383 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" 1384 | }, 1385 | "require-from-string": { 1386 | "version": "2.0.2", 1387 | "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", 1388 | "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", 1389 | "dev": true 1390 | }, 1391 | "resolve": { 1392 | "version": "2.0.0-next.4", 1393 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", 1394 | "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", 1395 | "dev": true, 1396 | "requires": { 1397 | "is-core-module": "^2.9.0", 1398 | "path-parse": "^1.0.7", 1399 | "supports-preserve-symlinks-flag": "^1.0.0" 1400 | } 1401 | }, 1402 | "resolve-from": { 1403 | "version": "4.0.0", 1404 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1405 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1406 | "dev": true 1407 | }, 1408 | "resumer": { 1409 | "version": "0.0.0", 1410 | "resolved": "https://registry.npmjs.org/resumer/-/resumer-0.0.0.tgz", 1411 | "integrity": "sha512-Fn9X8rX8yYF4m81rZCK/5VmrmsSbqS/i3rDLl6ZZHAXgC2nTAx3dhwG8q8odP/RmdLa2YrybDJaAMg+X1ajY3w==", 1412 | "dev": true, 1413 | "requires": { 1414 | "through": "~2.3.4" 1415 | } 1416 | }, 1417 | "rimraf": { 1418 | "version": "3.0.2", 1419 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", 1420 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", 1421 | "dev": true, 1422 | "requires": { 1423 | "glob": "^7.1.3" 1424 | } 1425 | }, 1426 | "safe-regex-test": { 1427 | "version": "1.0.0", 1428 | "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", 1429 | "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", 1430 | "dev": true, 1431 | "requires": { 1432 | "call-bind": "^1.0.2", 1433 | "get-intrinsic": "^1.1.3", 1434 | "is-regex": "^1.1.4" 1435 | } 1436 | }, 1437 | "shebang-command": { 1438 | "version": "2.0.0", 1439 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 1440 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 1441 | "dev": true, 1442 | "requires": { 1443 | "shebang-regex": "^3.0.0" 1444 | } 1445 | }, 1446 | "shebang-regex": { 1447 | "version": "3.0.0", 1448 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 1449 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 1450 | "dev": true 1451 | }, 1452 | "side-channel": { 1453 | "version": "1.0.4", 1454 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", 1455 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", 1456 | "dev": true, 1457 | "requires": { 1458 | "call-bind": "^1.0.0", 1459 | "get-intrinsic": "^1.0.2", 1460 | "object-inspect": "^1.9.0" 1461 | } 1462 | }, 1463 | "slice-ansi": { 1464 | "version": "4.0.0", 1465 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", 1466 | "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", 1467 | "dev": true, 1468 | "requires": { 1469 | "ansi-styles": "^4.0.0", 1470 | "astral-regex": "^2.0.0", 1471 | "is-fullwidth-code-point": "^3.0.0" 1472 | }, 1473 | "dependencies": { 1474 | "ansi-styles": { 1475 | "version": "4.3.0", 1476 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1477 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1478 | "dev": true, 1479 | "requires": { 1480 | "color-convert": "^2.0.1" 1481 | } 1482 | }, 1483 | "color-convert": { 1484 | "version": "2.0.1", 1485 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1486 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1487 | "dev": true, 1488 | "requires": { 1489 | "color-name": "~1.1.4" 1490 | } 1491 | }, 1492 | "color-name": { 1493 | "version": "1.1.4", 1494 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1495 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1496 | "dev": true 1497 | } 1498 | } 1499 | }, 1500 | "sprintf-js": { 1501 | "version": "1.0.3", 1502 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1503 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1504 | "dev": true 1505 | }, 1506 | "stop-iteration-iterator": { 1507 | "version": "1.0.0", 1508 | "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", 1509 | "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", 1510 | "dev": true, 1511 | "requires": { 1512 | "internal-slot": "^1.0.4" 1513 | } 1514 | }, 1515 | "string-width": { 1516 | "version": "4.2.3", 1517 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1518 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1519 | "requires": { 1520 | "emoji-regex": "^8.0.0", 1521 | "is-fullwidth-code-point": "^3.0.0", 1522 | "strip-ansi": "^6.0.1" 1523 | }, 1524 | "dependencies": { 1525 | "emoji-regex": { 1526 | "version": "8.0.0", 1527 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1528 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1529 | } 1530 | } 1531 | }, 1532 | "string.prototype.trim": { 1533 | "version": "1.2.7", 1534 | "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", 1535 | "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", 1536 | "dev": true, 1537 | "requires": { 1538 | "call-bind": "^1.0.2", 1539 | "define-properties": "^1.1.4", 1540 | "es-abstract": "^1.20.4" 1541 | } 1542 | }, 1543 | "string.prototype.trimend": { 1544 | "version": "1.0.6", 1545 | "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", 1546 | "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", 1547 | "dev": true, 1548 | "requires": { 1549 | "call-bind": "^1.0.2", 1550 | "define-properties": "^1.1.4", 1551 | "es-abstract": "^1.20.4" 1552 | } 1553 | }, 1554 | "string.prototype.trimstart": { 1555 | "version": "1.0.6", 1556 | "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", 1557 | "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", 1558 | "dev": true, 1559 | "requires": { 1560 | "call-bind": "^1.0.2", 1561 | "define-properties": "^1.1.4", 1562 | "es-abstract": "^1.20.4" 1563 | } 1564 | }, 1565 | "strip-ansi": { 1566 | "version": "6.0.1", 1567 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1568 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1569 | "requires": { 1570 | "ansi-regex": "^5.0.1" 1571 | } 1572 | }, 1573 | "strip-json-comments": { 1574 | "version": "3.1.1", 1575 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1576 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1577 | "dev": true 1578 | }, 1579 | "supports-color": { 1580 | "version": "5.5.0", 1581 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1582 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1583 | "dev": true, 1584 | "requires": { 1585 | "has-flag": "^3.0.0" 1586 | } 1587 | }, 1588 | "supports-preserve-symlinks-flag": { 1589 | "version": "1.0.0", 1590 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 1591 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 1592 | "dev": true 1593 | }, 1594 | "table": { 1595 | "version": "6.8.1", 1596 | "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", 1597 | "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", 1598 | "dev": true, 1599 | "requires": { 1600 | "ajv": "^8.0.1", 1601 | "lodash.truncate": "^4.4.2", 1602 | "slice-ansi": "^4.0.0", 1603 | "string-width": "^4.2.3", 1604 | "strip-ansi": "^6.0.1" 1605 | }, 1606 | "dependencies": { 1607 | "ajv": { 1608 | "version": "8.12.0", 1609 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", 1610 | "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", 1611 | "dev": true, 1612 | "requires": { 1613 | "fast-deep-equal": "^3.1.1", 1614 | "json-schema-traverse": "^1.0.0", 1615 | "require-from-string": "^2.0.2", 1616 | "uri-js": "^4.2.2" 1617 | } 1618 | }, 1619 | "json-schema-traverse": { 1620 | "version": "1.0.0", 1621 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", 1622 | "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", 1623 | "dev": true 1624 | } 1625 | } 1626 | }, 1627 | "tape": { 1628 | "version": "5.6.5", 1629 | "resolved": "https://registry.npmjs.org/tape/-/tape-5.6.5.tgz", 1630 | "integrity": "sha512-r6XcLeO3h5rOFpkYWifAjlhSSSXbFSSBF86lhb6J0KAQbY91H1MzOeIWG6TH0iWS52ypwr6fenJgCGQGtL8CxA==", 1631 | "dev": true, 1632 | "requires": { 1633 | "array.prototype.every": "^1.1.4", 1634 | "call-bind": "^1.0.2", 1635 | "deep-equal": "^2.2.2", 1636 | "defined": "^1.0.1", 1637 | "dotignore": "^0.1.2", 1638 | "for-each": "^0.3.3", 1639 | "get-package-type": "^0.1.0", 1640 | "glob": "^7.2.3", 1641 | "has": "^1.0.3", 1642 | "has-dynamic-import": "^2.0.1", 1643 | "inherits": "^2.0.4", 1644 | "is-regex": "^1.1.4", 1645 | "minimist": "^1.2.8", 1646 | "object-inspect": "^1.12.3", 1647 | "object-is": "^1.1.5", 1648 | "object-keys": "^1.1.1", 1649 | "object.assign": "^4.1.4", 1650 | "resolve": "^2.0.0-next.4", 1651 | "resumer": "^0.0.0", 1652 | "string.prototype.trim": "^1.2.7", 1653 | "through": "^2.3.8" 1654 | } 1655 | }, 1656 | "text-table": { 1657 | "version": "0.2.0", 1658 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1659 | "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", 1660 | "dev": true 1661 | }, 1662 | "through": { 1663 | "version": "2.3.8", 1664 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1665 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", 1666 | "dev": true 1667 | }, 1668 | "type-check": { 1669 | "version": "0.4.0", 1670 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", 1671 | "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", 1672 | "dev": true, 1673 | "requires": { 1674 | "prelude-ls": "^1.2.1" 1675 | } 1676 | }, 1677 | "type-fest": { 1678 | "version": "0.20.2", 1679 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", 1680 | "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", 1681 | "dev": true 1682 | }, 1683 | "typed-array-byte-offset": { 1684 | "version": "1.0.0", 1685 | "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", 1686 | "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", 1687 | "dev": true, 1688 | "requires": { 1689 | "available-typed-arrays": "^1.0.5", 1690 | "call-bind": "^1.0.2", 1691 | "for-each": "^0.3.3", 1692 | "has-proto": "^1.0.1", 1693 | "is-typed-array": "^1.1.10" 1694 | } 1695 | }, 1696 | "typed-array-length": { 1697 | "version": "1.0.4", 1698 | "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", 1699 | "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", 1700 | "dev": true, 1701 | "requires": { 1702 | "call-bind": "^1.0.2", 1703 | "for-each": "^0.3.3", 1704 | "is-typed-array": "^1.1.9" 1705 | } 1706 | }, 1707 | "unbox-primitive": { 1708 | "version": "1.0.2", 1709 | "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", 1710 | "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", 1711 | "dev": true, 1712 | "requires": { 1713 | "call-bind": "^1.0.2", 1714 | "has-bigints": "^1.0.2", 1715 | "has-symbols": "^1.0.3", 1716 | "which-boxed-primitive": "^1.0.2" 1717 | } 1718 | }, 1719 | "uri-js": { 1720 | "version": "4.4.1", 1721 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", 1722 | "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", 1723 | "dev": true, 1724 | "requires": { 1725 | "punycode": "^2.1.0" 1726 | } 1727 | }, 1728 | "v8-compile-cache": { 1729 | "version": "2.3.0", 1730 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", 1731 | "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", 1732 | "dev": true 1733 | }, 1734 | "which": { 1735 | "version": "2.0.2", 1736 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1737 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1738 | "dev": true, 1739 | "requires": { 1740 | "isexe": "^2.0.0" 1741 | } 1742 | }, 1743 | "which-boxed-primitive": { 1744 | "version": "1.0.2", 1745 | "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", 1746 | "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", 1747 | "dev": true, 1748 | "requires": { 1749 | "is-bigint": "^1.0.1", 1750 | "is-boolean-object": "^1.1.0", 1751 | "is-number-object": "^1.0.4", 1752 | "is-string": "^1.0.5", 1753 | "is-symbol": "^1.0.3" 1754 | } 1755 | }, 1756 | "which-collection": { 1757 | "version": "1.0.1", 1758 | "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", 1759 | "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", 1760 | "dev": true, 1761 | "requires": { 1762 | "is-map": "^2.0.1", 1763 | "is-set": "^2.0.1", 1764 | "is-weakmap": "^2.0.1", 1765 | "is-weakset": "^2.0.1" 1766 | } 1767 | }, 1768 | "which-typed-array": { 1769 | "version": "1.1.10", 1770 | "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", 1771 | "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", 1772 | "dev": true, 1773 | "requires": { 1774 | "available-typed-arrays": "^1.0.5", 1775 | "call-bind": "^1.0.2", 1776 | "for-each": "^0.3.3", 1777 | "gopd": "^1.0.1", 1778 | "has-tostringtag": "^1.0.0", 1779 | "is-typed-array": "^1.1.10" 1780 | } 1781 | }, 1782 | "wrap-ansi": { 1783 | "version": "7.0.0", 1784 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1785 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1786 | "requires": { 1787 | "ansi-styles": "^4.0.0", 1788 | "string-width": "^4.1.0", 1789 | "strip-ansi": "^6.0.0" 1790 | }, 1791 | "dependencies": { 1792 | "ansi-styles": { 1793 | "version": "4.3.0", 1794 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 1795 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 1796 | "requires": { 1797 | "color-convert": "^2.0.1" 1798 | } 1799 | }, 1800 | "color-convert": { 1801 | "version": "2.0.1", 1802 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1803 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1804 | "requires": { 1805 | "color-name": "~1.1.4" 1806 | } 1807 | }, 1808 | "color-name": { 1809 | "version": "1.1.4", 1810 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1811 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 1812 | } 1813 | } 1814 | }, 1815 | "wrappy": { 1816 | "version": "1.0.2", 1817 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1818 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1819 | "dev": true 1820 | }, 1821 | "y18n": { 1822 | "version": "5.0.8", 1823 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1824 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" 1825 | }, 1826 | "yallist": { 1827 | "version": "4.0.0", 1828 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 1829 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", 1830 | "dev": true 1831 | }, 1832 | "yargs": { 1833 | "version": "16.2.0", 1834 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1835 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1836 | "requires": { 1837 | "cliui": "^7.0.2", 1838 | "escalade": "^3.1.1", 1839 | "get-caller-file": "^2.0.5", 1840 | "require-directory": "^2.1.1", 1841 | "string-width": "^4.2.0", 1842 | "y18n": "^5.0.5", 1843 | "yargs-parser": "^20.2.2" 1844 | } 1845 | }, 1846 | "yargs-parser": { 1847 | "version": "20.2.9", 1848 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", 1849 | "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" 1850 | } 1851 | } 1852 | } 1853 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@mapbox/mapbox-file-sniff", 3 | "version": "1.0.6", 4 | "description": "Detects type of spatial file", 5 | "main": "index.js", 6 | "repository": { 7 | "type": "git", 8 | "url": "https://github.com/mapbox/mapbox-file-sniff" 9 | }, 10 | "dependencies": { 11 | "@mapbox/detect-geocsv": "0.1.0", 12 | "buffer": "^3.2.2", 13 | "yargs": "^16.2.0" 14 | }, 15 | "devDependencies": { 16 | "eslint": "^7.32.0", 17 | "eslint-config-unstyled": "^1.1.0", 18 | "mapnik-test-data": "2.2.0", 19 | "tape": "^5.6.5" 20 | }, 21 | "scripts": { 22 | "test": "npm run lint && tape test/*.test.js", 23 | "lint": "eslint index.js lib" 24 | }, 25 | "bin": { 26 | "mapbox-file-sniff": "bin/mapbox-file-sniff.js" 27 | }, 28 | "keywords": [ 29 | "mapbox", 30 | "geodata" 31 | ], 32 | "author": "Carol B. Hansen" 33 | } 34 | -------------------------------------------------------------------------------- /test/data/atiff.tif.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/test/data/atiff.tif.gz -------------------------------------------------------------------------------- /test/data/blank_rows.csv: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | x,y,name 5 | 0,0,a 6 | 7 | 8 | 0,0,b 9 | 10 | -------------------------------------------------------------------------------- /test/data/bom.kml: -------------------------------------------------------------------------------- 1 |  6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | unpacker/invalid-tm2z-empty.tm2z at master · mapbox/unpacker 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | Skip to content 67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | 196 | 197 | 198 | 199 | 200 | 201 | 202 |
203 |
204 |
205 | 206 |
207 |
208 |
209 | 210 |
    211 | 212 |
  • 213 |
    214 | 215 |
    216 | 219 | 221 | 222 | 223 | Unwatch 224 | 225 | 226 | 227 |
    228 | 278 |
    279 |
    280 | 281 |
    282 |
  • 283 | 284 |
  • 285 | 286 |
    287 | 288 |
    289 | 295 | 298 |
    299 |
    300 | 306 | 309 |
    310 | 311 |
  • 312 | 313 | 314 |
  • 315 | 316 | 317 | Fork 318 | 319 | 320 |
  • 321 | 322 |
323 | 324 |

325 | 326 | /unpacker 329 | private 330 | 331 | 332 | 333 | 334 | 335 |

336 |
337 |
338 | 339 |
340 |
341 |
342 | 343 | 395 | 396 |
397 | 398 | 399 |
402 |

HTTPS clone URL

403 |
404 | 406 | 407 | 408 | 409 |
410 |
411 | 412 | 413 |
416 |

SSH clone URL

417 |
418 | 420 | 421 | 422 | 423 |
424 |
425 | 426 | 427 |
430 |

Subversion checkout URL

431 |
432 | 434 | 435 | 436 | 437 |
438 |
439 | 440 | 441 |

You can clone with 442 | HTTPS, 443 | SSH, 444 | or Subversion. 445 | 446 | 447 | 448 |

449 | 450 | 451 | 452 | Clone in Desktop 453 | 454 | 455 | 456 | 461 | 462 | Download ZIP 463 | 464 |
465 |
466 | 467 |
468 | 469 | 470 | 471 | 472 | 473 | 474 |
475 | 476 |
477 | 482 | 483 | branch: 484 | master 485 | 486 | 487 | 587 |
588 | 589 |
590 | 595 | 596 | 597 | 603 |
604 | 605 | 608 |
609 | 610 | 611 |
612 |
613 | Mike Morris 614 | mikemorris 615 | 616 | 619 |
620 | 621 |
622 |

623 | 624 | 1 625 | contributor 626 | 627 |

628 | 629 |
630 | 639 |
640 | 641 |
642 |
643 |
644 |
645 | 0.119 kb 646 |
647 |
648 |
649 | Raw 650 | History 651 |
652 | 653 | 658 | 659 | 660 | 661 | 662 | 665 | 666 | 667 |
668 |
669 | 670 |
671 |
672 | View Raw 673 |
674 |
675 | 676 |
677 |
678 | 679 | Jump to Line 680 | 686 | 687 |
688 | 689 |
690 | 691 |
692 |
693 | 694 | 695 |
696 | 697 |
698 | 721 |
722 | 723 | 724 |
725 |
726 |
727 | 728 |
729 |
730 | 739 |
740 | 741 | 742 | 743 |
744 | 745 | 746 | Something went wrong with that request. Please try again. 747 |
748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | -------------------------------------------------------------------------------- /test/data/invalid-malformed.tm2z: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | unpacker/invalid-tm2z-malformed.tm2z at master · mapbox/unpacker 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | Skip to content 67 |
68 | 69 | 70 | 71 | 72 | 73 | 74 | 196 | 197 | 198 | 199 | 200 | 201 | 202 |
203 |
204 |
205 | 206 |
207 |
208 |
209 | 210 |
    211 | 212 |
  • 213 |
    214 | 215 |
    216 | 219 | 221 | 222 | 223 | Unwatch 224 | 225 | 226 | 227 |
    228 | 278 |
    279 |
    280 | 281 |
    282 |
  • 283 | 284 |
  • 285 | 286 |
    287 | 288 |
    289 | 295 | 298 |
    299 |
    300 | 306 | 309 |
    310 | 311 |
  • 312 | 313 | 314 |
  • 315 | 316 | 317 | Fork 318 | 319 | 320 |
  • 321 | 322 |
323 | 324 |

325 | 326 | /unpacker 329 | private 330 | 331 | 332 | 333 | 334 | 335 |

336 |
337 |
338 | 339 |
340 |
341 |
342 | 343 | 395 | 396 |
397 | 398 | 399 |
402 |

HTTPS clone URL

403 |
404 | 406 | 407 | 408 | 409 |
410 |
411 | 412 | 413 |
416 |

SSH clone URL

417 |
418 | 420 | 421 | 422 | 423 |
424 |
425 | 426 | 427 |
430 |

Subversion checkout URL

431 |
432 | 434 | 435 | 436 | 437 |
438 |
439 | 440 | 441 |

You can clone with 442 | HTTPS, 443 | SSH, 444 | or Subversion. 445 | 446 | 447 | 448 |

449 | 450 | 451 | 452 | Clone in Desktop 453 | 454 | 455 | 456 | 461 | 462 | Download ZIP 463 | 464 |
465 |
466 | 467 |
468 | 469 | 470 | 471 | 472 | 473 | 474 |
475 | 476 |
477 | 482 | 483 | branch: 484 | master 485 | 486 | 487 | 587 |
588 | 589 |
590 | 595 | 596 | 597 | 603 |
604 | 605 | 608 |
609 | 610 | 611 |
612 |
613 | Mike Morris 614 | mikemorris 615 | 616 | 619 |
620 | 621 |
622 |

623 | 624 | 1 625 | contributor 626 | 627 |

628 | 629 |
630 | 639 |
640 | 641 |
642 |
643 |
644 |
645 | 0.181 kb 646 |
647 |
648 |
649 | Raw 650 | History 651 |
652 | 653 | 658 | 659 | 660 | 661 | 662 | 665 | 666 | 667 |
668 |
669 | 670 |
671 |
672 | View Raw 673 |
674 |
675 | 676 |
677 |
678 | 679 | Jump to Line 680 | 686 | 687 |
688 | 689 |
690 | 691 |
692 |
693 | 694 | 695 |
696 | 697 |
698 | 721 |
722 | 723 | 724 |
725 |
726 |
727 | 728 |
729 |
730 | 739 |
740 | 741 | 742 | 743 |
744 | 745 | 746 | Something went wrong with that request. Please try again. 747 |
748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | -------------------------------------------------------------------------------- /test/data/invalid-type.json: -------------------------------------------------------------------------------- 1 | {"type": 42} 2 | -------------------------------------------------------------------------------- /test/data/invalid.tilejson: -------------------------------------------------------------------------------- 1 | { 2 | "invalid": true 3 | } -------------------------------------------------------------------------------- /test/data/invalid_geometries.csv: -------------------------------------------------------------------------------- 1 | a,b,c,d,e,f,g 2 | 1,2,3,4,5,6,7 -------------------------------------------------------------------------------- /test/data/small.csv: -------------------------------------------------------------------------------- 1 | s 2 | -------------------------------------------------------------------------------- /test/data/valid-bigtiff.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/test/data/valid-bigtiff.tif -------------------------------------------------------------------------------- /test/data/valid-coordinates.json: -------------------------------------------------------------------------------- 1 | { "coordinates": [ 2 | [[[102.0, 2.0], [102.0, 3.0], [103.0, 3.0], [103.0, 2.0], [102.0, 2.0]]], 3 | [[[100.0, 0.0], [100.0, 1.0], [101.0, 1.0], [101.0, 0.0], [100.0, 0.0]], 4 | [[100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2]]] 5 | ], "type": "MultiPolygon" 6 | } -------------------------------------------------------------------------------- /test/data/valid-empty_rows.csv: -------------------------------------------------------------------------------- 1 | "x","y","text","date","integer","boolean","float","time","datetime","empty_column" 2 | 0,0,a b,1971-01-01,40,True,1.0,04:14:00,1971-01-01T04:14:00, 3 | 0,0,c d,1948-01-01,63,True,1.27,14:57:13,1948-01-01T14:57:13, 4 | 0,0,e f,1920-01-01,164,False,41800000.01,00:00:00,1920-01-01T00:00:00, 5 | 0,0,This row has empties,,,,,,, -------------------------------------------------------------------------------- /test/data/valid-geometries.json: -------------------------------------------------------------------------------- 1 | { "geometries": [ 2 | { "type": "Point", 3 | "coordinates": [100.0, 0.0] 4 | }, 5 | { "type": "LineString", 6 | "coordinates": [ [101.0, 0.0], [102.0, 1.0] ] 7 | } 8 | ], 9 | "type": "GeometryCollection" 10 | } -------------------------------------------------------------------------------- /test/data/valid-lines.csv: -------------------------------------------------------------------------------- 1 | wkt,name,nr 2 | "LineString(0.194483 -0.117354,0.23691 -0.137246,0.252846 -0.181313,0.232953 -0.223741,0.188886 -0.239676,0.146458 -0.219784,0.130523 -0.175717,0.150415 -0.133289,0.194483 -0.117354)","Circle",6 3 | "LineString(0.747335 -0.107159,0.789763 -0.127051,0.805698 -0.171118,0.785806 -0.213546,0.741739 -0.229481,0.699311 -0.209589,0.683376 -0.165522,0.703268 -0.123094,0.747335 -0.107159)","Circle with long name",7 4 | "LineString(0.346487 -0.240215,0.535306 -0.240215)","Short line with long name",5 5 | "LineString(0.347059 -0.122112,0.535878 -0.122112)","Short line",4 6 | "LineString(0 0,0.9 0)","Rendered @ integer pos. ABCDEFGHIJKLMNOPQRSTUVWXYZ",3 7 | "LineString(0.002268 0.073178,0.902268 0.073178)","Long line with long name",2 8 | "LineString(0.003411 0.172529,0.103411 0.172529,0.203411 0.172529,0.303411 0.172529,0.403411 0.172529,0.503411 0.172529,0.603411 0.172529,0.703411 0.172529,0.803411 0.172529,0.903411 0.172529)","Long line with long name and many points",1 9 | "LineString(0.002841 0.250458,0.902841 0.250458)","Short name",8 10 | "LineString(0 -0.051,0.9 -0.051)","Rendered @ non-integer p. ABCDEFGHIJKLMNOPQRSTUVWXYZ",9 11 | -------------------------------------------------------------------------------- /test/data/valid-nested-type.json: -------------------------------------------------------------------------------- 1 | {"bbox": [151.1762091637833, -33.915824644189165, 151.2356068334641, -33.85847652573928], "type" : "FeatureCollection" , "features" : [{"type":"Feature","properties":{"AREA":null,"PERIMETER":null,"ID":"Frontier Governates","CAPTION":"Frontier Governates"},"geometry":{"type":"Polygon","coordinates":[[[29.58397999999579,30.99531999998726],[29.626329999999143,30.386690000013914],[29.63607000000775,30.23681000000215],[30.28132999999798,29.90679999999702],[30.319409999996424,29.875499999994645],[29.576479999988806,29.487679999991087],[28.736780000006547,28.76248000000487],[27.80457999999635,28.565059999993537],[27.379140000004554,27.66868999999133],[28.695539999986067,27.67133000001195],[30.6860100000049,27.620579999987967],[30.717579999996815,27.515569999988656],[30.846729999990202,27.300849999999627],[30.981369999994058,27.186790000007022],[31.11683000001358,27.129450000007637],[31.20848999998998,27.059940000006463],[31.415689999994356,26.711139999999432],[31.47803999998723,26.643860000011045],[31.589990000007674,26.58833999998751],[31.658230000000913,26.517179999995278],[31.71940000000177,26.41313000000082],[31.875410000007832,26.250009999988833],[32.018410000018775,26.07785000000149],[32.126619999995455,25.99262999999337],[32.193499999993946,25.968920000013895],[32.351000000024214,25.96478000000934],[32.60811999998987,26.06400000001304],[32.741500000003725,26.069270000007236],[32.76474000001326,26.03005000000121],[32.752969999972265,25.925849999999627],[32.68051999999443,25.779420000006212],[32.4951599999913,25.606850000011036],[32.46452999999747,25.54169000001275],[32.49625000002561,25.384939999989],[32.57211000000825,25.212269999989076],[32.72548999998253,25.09088000000338],[32.81011000002036,25.038380000012694],[32.86160000000382,24.94330000001355],[32.8635999999824,24.884580000012647],[32.90205999999307,24.767900000006193],[32.94206999999005,24.69698999999673],[32.929500000027474,24.57092999998713],[32.89821999997366,24.428979999996955],[32.87598000001162,24.081579999998212],[32.792740000004414,24.00172999998904],[32.69228000001749,23.944339999987278],[32.69617000001017,23.88013000000501],[32.77630000002682,23.813610000011977],[32.73609999998007,23.752570000011474],[32.64279999997234,23.722409999987576],[32.55696999997599,23.673660000000382],[32.52558999997564,23.632459999993443],[32.47960000002058,23.443410000007134],[32.51055000000633,23.409580000006827],[32.68554999999469,23.376989999989746],[32.769909999973606,23.387249999999767],[32.77386999997543,23.32673000000068],[32.603240000025835,23.057399999990594],[32.55797000002349,22.950799999991432],[32.47148000000743,22.79600999999093],[32.435080000024755,22.776929999992717],[32.35863999999128,22.81563999998616],[32.22200000000885,22.83945999998832],[31.821309999999357,22.73615000001155],[31.6879299999855,22.73008999999729],[31.636479999986477,22.65629000001354],[31.646420000004582,22.487920000014128],[31.61712000000989,22.42277999999351],[31.4795199999935,22.297850000002654],[31.269819999986794,22.212590000010096],[31.272629999992205,22.155910000001313],[31.349420000013197,22.10303999998723],[31.317500000004657,22.000189999991562],[30.896039999992354,21.99609000000055],[30.07892999998876,21.999420000007376],[29.27467000001343,21.99989999999525],[28.472789999999804,21.998950000008335],[27.671390000003157,21.999420000007376],[26.855710000003455,21.999420000007376],[26.04289000001154,21.998469999991357],[25.642190000013215,21.999420000007376],[24.99877999999444,22.00036999999429],[25,22.49900000001071],[25,23.165399999998044],[25,23.831800000014482],[25,24.748099999997066],[25,25.333199999993667],[25,26.08290000000852],[25,26.974459999997634],[25,27.454529999988154],[25,28.24869999999646],[25,28.9151000000129],[24.999440000014147,29.250159999995958],[24.883039999986067,29.481100000004517],[24.857719999999972,29.548340000008466],[24.895799999998417,29.631359999999404],[24.819409999996424,29.789010000007693],[24.81317000000854,29.9189100000076],[24.75331999998889,30.095739999989746],[24.698100000008708,30.148849999997765],[24.783090000011725,30.331349999993108],[24.834399999992456,30.368929999996908],[24.926529999997,30.48113000000012],[24.955080000014277,30.598599999997532],[25.018270000000484,30.777980000013486],[24.877739999996265,31.16708000001381],[24.88693000000785,31.30390999998781],[24.861109999998007,31.405910000001313],[25.06254000001354,31.541800000006333],[25.090120000008028,31.61960000000545],[25.145019999996293,31.639439999999013],[25.1904499999946,31.52416999998968],[25.3851399999985,31.49965000001248],[25.506090000009863,31.515500000008615],[25.82363999998779,31.612410000001546],[25.915769999992335,31.623770000005607],[26.088939999986906,31.594060000003083],[26.337809999997262,31.52351999998791],[26.51571999999578,31.491130000009434],[26.739910000003874,31.480409999989206],[26.832360000000335,31.440990000002785],[26.97758999999496,31.440609999990556],[27.08426000000327,31.382110000005923],[27.273240000009537,31.36567999998806],[27.34450000000652,31.37001000001328],[27.39199999999255,31.25596000000951],[27.443430000013905,31.216300000000047],[27.730279999988852,31.185779999999795],[27.829830000002403,31.219080000009853],[27.88857999999891,31.17329000000609],[27.90103999999701,31.112380000005942],[27.95115999999689,31.092269999993732],[28.15708999999333,31.093610000010813],[28.319920000009006,31.067190000001574],[28.42412000001059,31.08937000000151],[28.55838999999105,31.051940000004834],[28.611089999991236,31.01636999999755],[28.71040000001085,31.003189999988535],[28.852879999991274,30.90987000000314],[29,30.832350000011502],[29.09328000000096,30.81744000001345],[29.22164000000339,30.837369999993825],[29.348120000009658,30.87661000000662],[29.58397999999579,30.99531999998726]]]}}]} -------------------------------------------------------------------------------- /test/data/valid-not-csv.serialtiles.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/test/data/valid-not-csv.serialtiles.gz -------------------------------------------------------------------------------- /test/data/valid-one-field.csv: -------------------------------------------------------------------------------- 1 | wkt 2 | "LINESTRING(0.8511083807156015 0.03967486460801543, 0.5994991376749135 0.2096131480715248)" 3 | "LINESTRING(0.27084293293759165 0.26302812355087024, 0.04604697152647152 0.05893796680132844)" 4 | "LINESTRING(0.07145061369178042 0.3118185090592599, 0.3750701157617382 0.3105586956821123)" 5 | "LINESTRING(0.8179010492787097 0.3099287889371784, 0.514281547208752 0.3111886023894954)" 6 | -------------------------------------------------------------------------------- /test/data/valid-paxheader.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/test/data/valid-paxheader.gz -------------------------------------------------------------------------------- /test/data/valid-points.csv: -------------------------------------------------------------------------------- 1 | lat,long,name,nr,color,placements 2 | 0,0,Test one,1,#ff0000,"N,S,E,W,SW,10,5" 3 | 0,0.1,Test two,2,red,"N,S,E,W,SW,10,5" 4 | 0,0.2,Test three,3,#00ff00,"N,S,E,W,SW,10,5" 5 | 0,0.3,Test four,4,green,"N,S,E,W,SW,10,5" 6 | 0,0.4,Test five,5,#0000ff,"N,S,E,W,SW,10,5" 7 | 0,0.5,Test six,6,blue,"N,S,E,W,SW,10,5" 8 | 0,0.6,Test seven,7,#000000,"N,S,E,W,SW,10,5" 9 | 0,0.7,Test eight,8,black,"N,S,E,W,SW,10,5" 10 | 0,0.8,Test nine,9,#ffffff,"N,S,E,W,SW,10,5" 11 | 0,0.9,Test ten,10,white,"N,S,E,W,SW,10,5" -------------------------------------------------------------------------------- /test/data/valid-serialtiles.gz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/test/data/valid-serialtiles.gz -------------------------------------------------------------------------------- /test/data/valid.mbtiles: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/test/data/valid.mbtiles -------------------------------------------------------------------------------- /test/data/valid.tilejson: -------------------------------------------------------------------------------- 1 | { 2 | "tilejson": "1.0.0", 3 | "name": "OpenStreetMap", 4 | "description": "A free editable map of the whole world.", 5 | "version": "1.0.0", 6 | "attribution": "(c) OpenStreetMap contributors, CC-BY-SA", 7 | "scheme": "xyz", 8 | "tiles": [ 9 | "http://a.tile.openstreetmap.org/${z}/${x}/${y}.png", 10 | "http://b.tile.openstreetmap.org/${z}/${x}/${y}.png", 11 | "http://c.tile.openstreetmap.org/${z}/${x}/${y}.png" 12 | ], 13 | "minzoom": 0, 14 | "maxzoom": 18, 15 | "bounds": [ -180, -85, 180, 85 ] 16 | } -------------------------------------------------------------------------------- /test/data/valid.tm2z: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mapbox/mapbox-file-sniff/50510998db151c0a7e27f1cb05d76e9341319d1e/test/data/valid.tm2z -------------------------------------------------------------------------------- /test/data/xtracharacters.json: -------------------------------------------------------------------------------- 1 | { 2 | "features": [ 3 | { 4 | "properties": { 5 | "name": "Phasellus nec bibendum lacus. Nullam sit amet leo ipsum. Aliquam erat volutpat. Morbi sollicitudin risus at tristique gravida. Duis ornare ullamcorper arcu ut malesuada. Ut sapien massa, aliquet lobortis iaculis sed, venenatis eget ante. Sed aliquet nunc nunc, sit amet tincidunt libero aliquet nec. Curabitur nec dui ut ex blandit sagittis id at augue. Suspendisse et metus eget lorem lacinia congue. Aenean dictum finibus condimentum. Donec ultricies convallis orci, sit amet sodales orci gravida id. Nam sagittis neque vel congue maximus. Mauris porta quam non hendrerit consectetur. Aliquam congue nibh at nisl pulvinar varius. Nunc in ullamcorper tellus. Sed hendrerit metus metus, quis tincidunt felis consectetur eu." 6 | }, 7 | "type": "Feature", 8 | "geometry": { 9 | "type": "Point", 10 | "coordinates": [125.6, 10.1] 11 | } 12 | }, 13 | { 14 | "type": "Feature", 15 | "geometry": { 16 | "type": "Point", 17 | "coordinates": [125.6, 10.1] 18 | }, 19 | "properties": { 20 | "name": "Dinagat Islands" 21 | } 22 | } 23 | ], 24 | "type": "FeatureCollection" 25 | } -------------------------------------------------------------------------------- /test/index.test.js: -------------------------------------------------------------------------------- 1 | var tape = require('tape'); 2 | var path = require('path'); 3 | var fs = require('fs'); 4 | var exec = require('child_process').exec; 5 | var testData = path.dirname(require.resolve('mapnik-test-data')); 6 | var sniffer = require('../index.js'); 7 | 8 | function getBuffer(path) { 9 | var buffer; 10 | try { 11 | fs.statSync(path); 12 | buffer = new Buffer(512); 13 | var fd = fs.openSync(path, 'r'); 14 | fs.readSync(fd, buffer, 0, 512, 0); 15 | fs.closeSync(fd); 16 | return buffer; 17 | } catch (err) { 18 | throw err; 19 | } 20 | } 21 | 22 | /** 23 | * Testing filesniffer 24 | */ 25 | tape('error: no callback', function(assert) { 26 | var filepath = testData + '/data/kml/1week_earthquake.kml'; 27 | try { 28 | sniffer.fromFile(filepath); 29 | assert.fail(); // do not get here 30 | } catch (err) { 31 | assert.ok(err); 32 | assert.equal(err.message, 'Invalid callback. Must be a function.', 'expected error message'); 33 | assert.end(); 34 | } 35 | }); 36 | tape('error: file does not exist', function(assert) { 37 | var filepath = 'not/here/file.geojson'; 38 | sniffer.fromFile(filepath, function(err, result) { 39 | assert.ok(err); 40 | assert.equal(err.code, 'ENOENT'); 41 | assert.equal(err.message, 'ENOENT: no such file or directory, open \'not/here/file.geojson\'', 'expected message'); 42 | assert.end(); 43 | }); 44 | }); 45 | tape('error: small file', function(assert) { 46 | var filepath = path.resolve('./test/data/small.csv'); 47 | assert.notOk(Buffer.isBuffer(filepath)); 48 | sniffer.fromFile(filepath, function(err, result) { 49 | assert.ok(err); 50 | assert.equal(err.message, 'File too small', 'expected error message'); 51 | assert.equal(err.code, 'EINVALID', 'expected error code'); 52 | assert.end(); 53 | }); 54 | }); 55 | tape('error: zero byte file', function(assert) { 56 | var filepath = path.resolve('./test/data/empty-shapefile/empty.shp'); 57 | assert.notOk(Buffer.isBuffer(filepath)); 58 | sniffer.fromFile(filepath, function(err, result) { 59 | assert.ok(err); 60 | assert.equal(err.message, 'File is zero bytes.', 'expected error message'); 61 | assert.equal(err.code, 'EINVALID', 'expected error code'); 62 | assert.end(); 63 | }); 64 | }); 65 | 66 | tape('[KML] success: file path', function(assert) { 67 | var filepath = testData + '/data/kml/1week_earthquake.kml'; 68 | assert.notOk(Buffer.isBuffer(filepath)); 69 | sniffer.fromFile(filepath, function(err, result) { 70 | assert.notOk(err, 'no error'); 71 | assert.equal(result.type, 'kml', 'expected file type'); 72 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 73 | assert.end(); 74 | }); 75 | }); 76 | tape('[KML] success: buffer', function(assert) { 77 | var filepath = testData + '/data/kml/1week_earthquake.kml'; 78 | var buffer = getBuffer(filepath); 79 | assert.ok(Buffer.isBuffer(buffer)); 80 | sniffer.fromBuffer(buffer, function(err, result) { 81 | assert.notOk(err, 'no error'); 82 | assert.equal(result.type, 'kml', 'expected file type'); 83 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 84 | assert.end(); 85 | }); 86 | }); 87 | tape('[KML BOM] success: file path', function(assert) { 88 | var filepath = path.resolve('./test/data/bom.kml'); 89 | assert.notOk(Buffer.isBuffer(filepath)); 90 | sniffer.fromFile(filepath, function(err, result) { 91 | assert.notOk(err, 'no error'); 92 | assert.equal(result.type, 'kml', 'expected file type'); 93 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 94 | assert.end(); 95 | }); 96 | }); 97 | tape('[KML BOM] success: buffer', function(assert) { 98 | var filepath = path.resolve('./test/data/bom.kml'); 99 | var buffer = getBuffer(filepath); 100 | assert.ok(Buffer.isBuffer(buffer)); 101 | sniffer.fromBuffer(buffer, function(err, result) { 102 | assert.notOk(err, 'no error'); 103 | assert.equal(result.type, 'kml', 'expected file type'); 104 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 105 | assert.end(); 106 | }); 107 | }); 108 | 109 | tape('[VRT] success: file path', function(assert) { 110 | var filepath = testData + '/data/vrt/sample.vrt'; 111 | assert.notOk(Buffer.isBuffer(filepath)); 112 | sniffer.fromFile(filepath, function(err, result) { 113 | assert.notOk(err, 'no error'); 114 | assert.equal(result.type, 'vrt', 'expected file type'); 115 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 116 | assert.end(); 117 | }); 118 | }); 119 | tape('[VRT] success: buffer', function(assert) { 120 | var filepath = testData + '/data/vrt/sample.vrt'; 121 | var buffer = getBuffer(filepath); 122 | assert.ok(Buffer.isBuffer(buffer)); 123 | sniffer.fromBuffer(buffer, function(err, result) { 124 | assert.notOk(err, 'no error'); 125 | assert.equal(result.type, 'vrt', 'expected file type'); 126 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 127 | assert.end(); 128 | }); 129 | }); 130 | 131 | tape('[GEOJSON - basic] success: file path', function(assert) { 132 | var filepath = testData + '/data/geojson/DC_polygon.geo.json'; 133 | assert.notOk(Buffer.isBuffer(filepath)); 134 | sniffer.fromFile(filepath, function(err, result) { 135 | assert.notOk(err, 'no error'); 136 | assert.equal(result.type, 'geojson', 'expected file type'); 137 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 138 | assert.end(); 139 | }); 140 | }); 141 | tape('[GEOJSON - basic] success: buffer', function(assert) { 142 | var filepath = testData + '/data/geojson/DC_polygon.geo.json'; 143 | var buffer = getBuffer(filepath); 144 | assert.ok(Buffer.isBuffer(buffer)); 145 | sniffer.fromBuffer(buffer, function(err, result) { 146 | assert.notOk(err, 'no error'); 147 | assert.equal(result.type, 'geojson', 'expected file type'); 148 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 149 | assert.end(); 150 | }); 151 | }); 152 | 153 | tape('[GEOJSON - crs] success: file path', function(assert) { 154 | var filepath = path.resolve('./test/data/crs-geojson.json'); 155 | assert.notOk(Buffer.isBuffer(filepath)); 156 | sniffer.fromFile(filepath, function(err, result) { 157 | assert.notOk(err, 'no error'); 158 | assert.equal(result.type, 'geojson', 'expected file type'); 159 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 160 | assert.end(); 161 | }); 162 | }); 163 | tape('[GEOJSON - crs] success: buffer', function(assert) { 164 | var filepath = path.resolve('./test/data/crs-geojson.json'); 165 | var buffer = getBuffer(filepath); 166 | assert.ok(Buffer.isBuffer(buffer)); 167 | sniffer.fromBuffer(buffer, function(err, result) { 168 | assert.notOk(err, 'no error'); 169 | assert.equal(result.type, 'geojson', 'expected file type'); 170 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 171 | assert.end(); 172 | }); 173 | }); 174 | 175 | tape('[GEOJSON - geometries] success: file path', function(assert) { 176 | var filepath = path.resolve('./test/data/valid-geometries.json'); 177 | assert.notOk(Buffer.isBuffer(filepath)); 178 | sniffer.fromFile(filepath, function(err, result) { 179 | assert.notOk(err, 'no error'); 180 | assert.equal(result.type, 'geojson', 'expected file type'); 181 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 182 | assert.end(); 183 | }); 184 | }); 185 | tape('[GEOJSON - geometries] success: buffer', function(assert) { 186 | var filepath = path.resolve('./test/data/valid-geometries.json'); 187 | var buffer = getBuffer(filepath); 188 | assert.ok(Buffer.isBuffer(buffer)); 189 | sniffer.fromBuffer(buffer, function(err, result) { 190 | assert.notOk(err, 'no error'); 191 | assert.equal(result.type, 'geojson', 'expected file type'); 192 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 193 | assert.end(); 194 | }); 195 | }); 196 | 197 | tape('[GEOJSON - coordinates] success: file path', function(assert) { 198 | var filepath = path.resolve('./test/data/valid-coordinates.json'); 199 | assert.notOk(Buffer.isBuffer(filepath)); 200 | sniffer.fromFile(filepath, function(err, result) { 201 | assert.notOk(err, 'no error'); 202 | assert.equal(result.type, 'geojson', 'expected file type'); 203 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 204 | assert.end(); 205 | }); 206 | }); 207 | tape('[GEOJSON - coordinates] success: buffer', function(assert) { 208 | var filepath = path.resolve('./test/data/valid-coordinates.json'); 209 | var buffer = getBuffer(filepath); 210 | assert.ok(Buffer.isBuffer(buffer)); 211 | sniffer.fromBuffer(buffer, function(err, result) { 212 | assert.notOk(err, 'no error'); 213 | assert.equal(result.type, 'geojson', 'expected file type'); 214 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 215 | assert.end(); 216 | }); 217 | }); 218 | 219 | tape('[GEOJSON - extra characters] success: file path', function(assert) { 220 | var filepath = path.resolve('./test/data/xtracharacters.json'); 221 | assert.notOk(Buffer.isBuffer(filepath)); 222 | sniffer.fromFile(filepath, function(err, result) { 223 | assert.notOk(err, 'no error'); 224 | assert.equal(result.type, 'geojson', 'expected file type'); 225 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 226 | assert.end(); 227 | }); 228 | }); 229 | tape('[GEOJSON - extra characters] success: buffer', function(assert) { 230 | var filepath = path.resolve('./test/data/xtracharacters.json'); 231 | var buffer = getBuffer(filepath); 232 | assert.ok(Buffer.isBuffer(buffer)); 233 | sniffer.fromBuffer(buffer, function(err, result) { 234 | assert.notOk(err, 'no error'); 235 | assert.equal(result.type, 'geojson', 'expected file type'); 236 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 237 | assert.end(); 238 | }); 239 | }); 240 | 241 | tape('[GEOJSON - valid nested type] success: file path', function(assert) { 242 | var filepath = path.resolve('./test/data/valid-nested-type.json'); 243 | assert.notOk(Buffer.isBuffer(filepath)); 244 | sniffer.fromFile(filepath, function(err, result) { 245 | assert.notOk(err, 'no error'); 246 | assert.equal(result.type, 'geojson', 'expected file type'); 247 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 248 | assert.end(); 249 | }); 250 | }); 251 | tape('[GEOJSON - valid nested type] success: buffer', function(assert) { 252 | var filepath = path.resolve('./test/data/valid-nested-type.json'); 253 | var buffer = getBuffer(filepath); 254 | assert.ok(Buffer.isBuffer(buffer)); 255 | sniffer.fromBuffer(buffer, function(err, result) { 256 | assert.notOk(err, 'no error'); 257 | assert.equal(result.type, 'geojson', 'expected file type'); 258 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 259 | assert.end(); 260 | }); 261 | }); 262 | tape('[GEOJSON - invalid type value] errors', function(assert) { 263 | var filepath = path.resolve('./test/data/invalid-type.json'); 264 | var buffer = getBuffer(filepath); 265 | assert.ok(Buffer.isBuffer(buffer)); 266 | sniffer.fromBuffer(buffer, function(err, result) { 267 | assert.ok(err); 268 | assert.equal(err.message, 'Unknown filetype', 'expected error message'); 269 | assert.equal(err.code, 'EINVALID', 'expected error code'); 270 | assert.end(); 271 | }); 272 | }); 273 | 274 | tape('[TOPOJSON] success: file path', function(assert) { 275 | var filepath = testData + '/data/topojson/topo.json'; 276 | assert.notOk(Buffer.isBuffer(filepath)); 277 | sniffer.fromFile(filepath, function(err, result) { 278 | assert.notOk(err, 'no error'); 279 | assert.equal(result.type, 'topojson', 'expected file type'); 280 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 281 | assert.end(); 282 | }); 283 | }); 284 | tape('[TOPOJSON] success: buffer', function(assert) { 285 | var filepath = testData + '/data/topojson/topo.json'; 286 | var buffer = getBuffer(filepath); 287 | assert.ok(Buffer.isBuffer(buffer)); 288 | sniffer.fromBuffer(buffer, function(err, result) { 289 | assert.notOk(err, 'no error'); 290 | assert.equal(result.type, 'topojson', 'expected file type'); 291 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 292 | assert.end(); 293 | }); 294 | }); 295 | 296 | tape('[GPX] success: file path', function(assert) { 297 | var filepath = testData + '/data/gpx/fells_loop.gpx'; 298 | assert.notOk(Buffer.isBuffer(filepath)); 299 | sniffer.fromFile(filepath, function(err, result) { 300 | assert.notOk(err, 'no error'); 301 | assert.equal(result.type, 'gpx', 'expected file type'); 302 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 303 | assert.end(); 304 | }); 305 | }); 306 | tape('[GPX] success: buffer', function(assert) { 307 | var filepath = testData + '/data/gpx/fells_loop.gpx'; 308 | var buffer = getBuffer(filepath); 309 | assert.ok(Buffer.isBuffer(buffer)); 310 | sniffer.fromBuffer(buffer, function(err, result) { 311 | assert.notOk(err, 'no error'); 312 | assert.equal(result.type, 'gpx', 'expected file type'); 313 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 314 | assert.end(); 315 | }); 316 | }); 317 | 318 | tape('[ZIP] success: file path', function(assert) { 319 | var filepath = testData + '/data/zip/us_states.zip'; 320 | assert.notOk(Buffer.isBuffer(filepath)); 321 | sniffer.fromFile(filepath, function(err, result) { 322 | assert.notOk(err, 'no error'); 323 | assert.equal(result.type, 'zip', 'expected file type'); 324 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 325 | assert.end(); 326 | }); 327 | }); 328 | tape('[ZIP] success: buffer', function(assert) { 329 | var filepath = testData + '/data/zip/us_states.zip'; 330 | var buffer = getBuffer(filepath); 331 | assert.ok(Buffer.isBuffer(buffer)); 332 | sniffer.fromBuffer(buffer, function(err, result) { 333 | assert.notOk(err, 'no error'); 334 | assert.equal(result.type, 'zip', 'expected file type'); 335 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 336 | assert.end(); 337 | }); 338 | }); 339 | 340 | tape('[SHP] success: file path', function(assert) { 341 | var filepath = testData + '/data/shp/world_merc/world_merc.shp'; 342 | assert.notOk(Buffer.isBuffer(filepath)); 343 | sniffer.fromFile(filepath, function(err, result) { 344 | assert.notOk(err, 'no error'); 345 | assert.equal(result.type, 'shp', 'expected file type'); 346 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 347 | assert.end(); 348 | }); 349 | }); 350 | tape('[SHP] success: buffer', function(assert) { 351 | var filepath = testData + '/data/shp/world_merc/world_merc.shp'; 352 | var buffer = getBuffer(filepath); 353 | assert.ok(Buffer.isBuffer(buffer)); 354 | sniffer.fromBuffer(buffer, function(err, result) { 355 | assert.notOk(err, 'no error'); 356 | assert.equal(result.type, 'shp', 'expected file type'); 357 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 358 | assert.end(); 359 | }); 360 | }); 361 | 362 | tape('[TIF] success: file path', function(assert) { 363 | var filepath = testData + '/data/geotiff/sample.tif'; 364 | assert.notOk(Buffer.isBuffer(filepath)); 365 | sniffer.fromFile(filepath, function(err, result) { 366 | assert.notOk(err, 'no error'); 367 | assert.equal(result.type, 'tif', 'expected file type'); 368 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 369 | assert.end(); 370 | }); 371 | }); 372 | tape('[TIF] success: buffer', function(assert) { 373 | var filepath = testData + '/data/geotiff/sample.tif'; 374 | var buffer = getBuffer(filepath); 375 | assert.ok(Buffer.isBuffer(buffer)); 376 | sniffer.fromBuffer(buffer, function(err, result) { 377 | assert.notOk(err, 'no error'); 378 | assert.equal(result.type, 'tif', 'expected file type'); 379 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 380 | assert.end(); 381 | }); 382 | }); 383 | 384 | tape('[TIF - gzip] success: file path', function(assert) { 385 | var filepath = path.resolve('./test/data/atiff.tif.gz'); 386 | assert.notOk(Buffer.isBuffer(filepath)); 387 | sniffer.fromFile(filepath, function(err, result) { 388 | assert.notOk(err, 'no error'); 389 | assert.equal(result.type, 'tif+gz', 'expected file type'); 390 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 391 | assert.end(); 392 | }); 393 | }); 394 | tape('[TIF - gzip] success: buffer', function(assert) { 395 | var filepath = path.resolve('./test/data/atiff.tif.gz'); 396 | var buffer = getBuffer(filepath); 397 | assert.ok(Buffer.isBuffer(buffer)); 398 | sniffer.fromBuffer(buffer, function(err, result) { 399 | assert.notOk(err, 'no error'); 400 | assert.equal(result.type, 'tif+gz', 'expected file type'); 401 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 402 | assert.end(); 403 | }); 404 | }); 405 | 406 | tape('[BIGTIFF] success: file path', function(assert) { 407 | var filepath = path.resolve('./test/data/valid-bigtiff.tif'); 408 | assert.notOk(Buffer.isBuffer(filepath)); 409 | sniffer.fromFile(filepath, function(err, result) { 410 | assert.notOk(err, 'no error'); 411 | assert.equal(result.type, 'tif', 'expected file type'); 412 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 413 | assert.end(); 414 | }); 415 | }); 416 | tape('[BIGTIFF] success: buffer', function(assert) { 417 | var filepath = path.resolve('./test/data/valid-bigtiff.tif'); 418 | var buffer = getBuffer(filepath); 419 | assert.ok(Buffer.isBuffer(buffer)); 420 | sniffer.fromBuffer(buffer, function(err, result) { 421 | assert.notOk(err, 'no error'); 422 | assert.equal(result.type, 'tif', 'expected file type'); 423 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 424 | assert.end(); 425 | }); 426 | }); 427 | 428 | tape('[MBTILES] success: file path', function(assert) { 429 | var filepath = path.resolve('./test/data/valid.mbtiles'); 430 | assert.notOk(Buffer.isBuffer(filepath)); 431 | sniffer.fromFile(filepath, function(err, result) { 432 | assert.notOk(err, 'no error'); 433 | assert.equal(result.type, 'mbtiles', 'expected file type'); 434 | assert.equal(result.protocol, 'mbtiles:', 'expected protocol'); 435 | assert.end(); 436 | }); 437 | }); 438 | tape('[MBTILES] success: buffer', function(assert) { 439 | var filepath = path.resolve('./test/data/valid.mbtiles'); 440 | var buffer = getBuffer(filepath); 441 | assert.ok(Buffer.isBuffer(buffer)); 442 | sniffer.fromBuffer(buffer, function(err, result) { 443 | assert.notOk(err, 'no error'); 444 | assert.equal(result.type, 'mbtiles', 'expected file type'); 445 | assert.equal(result.protocol, 'mbtiles:', 'expected protocol'); 446 | assert.end(); 447 | }); 448 | }); 449 | 450 | tape('[TILEJSON - valid] success: file path', function(assert) { 451 | var filepath = path.resolve('./test/data/valid.tilejson'); 452 | assert.notOk(Buffer.isBuffer(filepath)); 453 | sniffer.fromFile(filepath, function(err, result) { 454 | assert.notOk(err, 'no error'); 455 | assert.equal(result.type, 'tilejson', 'expected file type'); 456 | assert.equal(result.protocol, 'tilejson:', 'expected protocol'); 457 | assert.end(); 458 | }); 459 | }); 460 | tape('[TILEJSON - valid] success: buffer', function(assert) { 461 | var filepath = path.resolve('./test/data/valid.tilejson'); 462 | var buffer = getBuffer(filepath); 463 | assert.ok(Buffer.isBuffer(buffer)); 464 | sniffer.fromBuffer(buffer, function(err, result) { 465 | assert.notOk(err, 'no error'); 466 | assert.equal(result.type, 'tilejson', 'expected file type'); 467 | assert.equal(result.protocol, 'tilejson:', 'expected protocol'); 468 | assert.end(); 469 | }); 470 | }); 471 | tape('[TILEJSON - invalid] errors', function(assert) { 472 | var filepath = path.resolve('./test/data/invalid.tilejson'); 473 | var buffer = getBuffer(filepath); 474 | assert.ok(Buffer.isBuffer(buffer)); 475 | sniffer.fromBuffer(buffer, function(err, result) { 476 | assert.ok(err); 477 | assert.equal(err.message, 'Unknown filetype', 'expected file type'); 478 | assert.end(); 479 | }); 480 | }); 481 | 482 | tape('[SERIALTILES] success: file path', function(assert) { 483 | var filepath = path.resolve('./test/data/valid-serialtiles.gz'); 484 | assert.notOk(Buffer.isBuffer(filepath)); 485 | sniffer.fromFile(filepath, function(err, result) { 486 | assert.notOk(err, 'no error'); 487 | assert.equal(result.type, 'serialtiles', 'expected file type'); 488 | assert.equal(result.protocol, 'serialtiles:', 'expected protocol'); 489 | assert.end(); 490 | }); 491 | }); 492 | tape('[SERIALTILES] success: buffer', function(assert) { 493 | var filepath = path.resolve('./test/data/valid-serialtiles.gz'); 494 | var buffer = getBuffer(filepath); 495 | assert.ok(Buffer.isBuffer(buffer)); 496 | sniffer.fromBuffer(buffer, function(err, result) { 497 | assert.notOk(err, 'no error'); 498 | assert.equal(result.type, 'serialtiles', 'expected file type'); 499 | assert.equal(result.protocol, 'serialtiles:', 'expected protocol'); 500 | assert.end(); 501 | }); 502 | }); 503 | 504 | 505 | tape('[SERIALTILES - not csv] success: file path', function(assert) { 506 | var filepath = path.resolve('./test/data/valid-not-csv.serialtiles.gz'); 507 | assert.notOk(Buffer.isBuffer(filepath)); 508 | sniffer.fromFile(filepath, function(err, result) { 509 | assert.notOk(err, 'no error'); 510 | assert.equal(result.type, 'serialtiles', 'expected file type'); 511 | assert.equal(result.protocol, 'serialtiles:', 'expected protocol'); 512 | assert.end(); 513 | }); 514 | }); 515 | tape('[SERIALTILES - not csv] success: buffer', function(assert) { 516 | var filepath = path.resolve('./test/data/valid-not-csv.serialtiles.gz'); 517 | var buffer = getBuffer(filepath); 518 | assert.ok(Buffer.isBuffer(buffer)); 519 | sniffer.fromBuffer(buffer, function(err, result) { 520 | assert.notOk(err, 'no error'); 521 | assert.equal(result.type, 'serialtiles', 'expected file type'); 522 | assert.equal(result.protocol, 'serialtiles:', 'expected protocol'); 523 | assert.end(); 524 | }); 525 | }); 526 | 527 | 528 | tape('[TM2Z] success: file path', function(assert) { 529 | var filepath = path.resolve('./test/data/valid.tm2z'); 530 | assert.notOk(Buffer.isBuffer(filepath)); 531 | sniffer.fromFile(filepath, function(err, result) { 532 | assert.notOk(err, 'no error'); 533 | assert.equal(result.type, 'tm2z', 'expected file type'); 534 | assert.equal(result.protocol, 'tm2z:', 'expected protocol'); 535 | assert.end(); 536 | }); 537 | }); 538 | tape('[TM2Z] success: buffer', function(assert) { 539 | var filepath = path.resolve('./test/data/valid.tm2z'); 540 | var buffer = getBuffer(filepath); 541 | assert.ok(Buffer.isBuffer(buffer)); 542 | sniffer.fromBuffer(buffer, function(err, result) { 543 | assert.notOk(err, 'no error'); 544 | assert.equal(result.type, 'tm2z', 'expected file type'); 545 | assert.equal(result.protocol, 'tm2z:', 'expected protocol'); 546 | assert.end(); 547 | }); 548 | }); 549 | tape('[TM2Z - valid paxheader] success: file path', function(assert) { 550 | var filepath = path.resolve('./test/data/valid-paxheader.gz'); 551 | assert.notOk(Buffer.isBuffer(filepath)); 552 | sniffer.fromFile(filepath, function(err, result) { 553 | assert.notOk(err, 'no error'); 554 | assert.equal(result.type, 'tm2z', 'expected file type'); 555 | assert.equal(result.protocol, 'tm2z:', 'expected protocol'); 556 | assert.end(); 557 | }); 558 | }); 559 | tape('[TM2Z - valid paxheader] success: buffer', function(assert) { 560 | var filepath = path.resolve('./test/data/valid-paxheader.gz'); 561 | var buffer = getBuffer(filepath); 562 | assert.ok(Buffer.isBuffer(buffer)); 563 | sniffer.fromBuffer(buffer, function(err, result) { 564 | assert.notOk(err, 'no error'); 565 | assert.equal(result.type, 'tm2z', 'expected file type'); 566 | assert.equal(result.protocol, 'tm2z:', 'expected protocol'); 567 | assert.end(); 568 | }); 569 | }); 570 | tape('[TM2Z - invalid malformed] errors', function(assert) { 571 | var filepath = path.resolve('./test/data/invalid-malformed.tm2z'); 572 | var buffer = getBuffer(filepath); 573 | assert.ok(Buffer.isBuffer(buffer)); 574 | sniffer.fromBuffer(buffer, function(err, result) { 575 | assert.ok(err); 576 | assert.equal(err.message, 'Unknown filetype', 'expected error message'); 577 | assert.end(); 578 | }); 579 | }); 580 | tape('[TM2Z - invalid empty] errors', function(assert) { 581 | var filepath = path.resolve('./test/data/invalid-empty.tm2z'); 582 | var buffer = getBuffer(filepath); 583 | assert.ok(Buffer.isBuffer(buffer)); 584 | sniffer.fromBuffer(buffer, function(err, result) { 585 | assert.ok(err); 586 | assert.equal(err.message, 'Unknown filetype', 'expected error message'); 587 | assert.end(); 588 | }); 589 | }); 590 | 591 | tape('[CSV] success: file path', function(assert) { 592 | var filepath = path.resolve('./test/data/valid-points.csv'); 593 | assert.notOk(Buffer.isBuffer(filepath)); 594 | sniffer.fromFile(filepath, function(err, result) { 595 | assert.notOk(err, 'no error'); 596 | assert.equal(result.type, 'csv', 'expected file type'); 597 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 598 | assert.end(); 599 | }); 600 | }); 601 | tape('[CSV] success: buffer', function(assert) { 602 | var filepath = path.resolve('./test/data/valid-points.csv'); 603 | var buffer = getBuffer(filepath); 604 | assert.ok(Buffer.isBuffer(buffer)); 605 | sniffer.fromBuffer(buffer, function(err, result) { 606 | assert.notOk(err, 'no error'); 607 | assert.equal(result.type, 'csv', 'expected file type'); 608 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 609 | assert.end(); 610 | }); 611 | }); 612 | tape('[CSV - blank rows] success: file path', function(assert) { 613 | var filepath = path.resolve('./test/data/blank_rows.csv'); 614 | assert.notOk(Buffer.isBuffer(filepath)); 615 | sniffer.fromFile(filepath, function(err, result) { 616 | assert.notOk(err, 'no error'); 617 | assert.equal(result.type, 'csv', 'expected file type'); 618 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 619 | assert.end(); 620 | }); 621 | }); 622 | tape('[CSV - blank rows] success: buffer', function(assert) { 623 | var filepath = path.resolve('./test/data/blank_rows.csv'); 624 | var buffer = getBuffer(filepath); 625 | assert.ok(Buffer.isBuffer(buffer)); 626 | sniffer.fromBuffer(buffer, function(err, result) { 627 | assert.notOk(err, 'no error'); 628 | assert.equal(result.type, 'csv', 'expected file type'); 629 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 630 | assert.end(); 631 | }); 632 | }); 633 | tape('[CSV - valid one field] success: file path', function(assert) { 634 | var filepath = path.resolve('./test/data/valid-one-field.csv'); 635 | assert.notOk(Buffer.isBuffer(filepath)); 636 | sniffer.fromFile(filepath, function(err, result) { 637 | assert.notOk(err, 'no error'); 638 | assert.equal(result.type, 'csv', 'expected file type'); 639 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 640 | assert.end(); 641 | }); 642 | }); 643 | tape('[CSV - valid one field] success: buffer', function(assert) { 644 | var filepath = path.resolve('./test/data/valid-one-field.csv'); 645 | var buffer = getBuffer(filepath); 646 | assert.ok(Buffer.isBuffer(buffer)); 647 | sniffer.fromBuffer(buffer, function(err, result) { 648 | assert.notOk(err, 'no error'); 649 | assert.equal(result.type, 'csv', 'expected file type'); 650 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 651 | assert.end(); 652 | }); 653 | }); 654 | tape('[CSV - valid empty rows] success: file path', function(assert) { 655 | var filepath = path.resolve('./test/data/valid-empty_rows.csv'); 656 | assert.notOk(Buffer.isBuffer(filepath)); 657 | sniffer.fromFile(filepath, function(err, result) { 658 | assert.notOk(err, 'no error'); 659 | assert.equal(result.type, 'csv', 'expected file type'); 660 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 661 | assert.end(); 662 | }); 663 | }); 664 | tape('[CSV - valid empty rows] success: buffer', function(assert) { 665 | var filepath = path.resolve('./test/data/valid-empty_rows.csv'); 666 | var buffer = getBuffer(filepath); 667 | assert.ok(Buffer.isBuffer(buffer)); 668 | sniffer.fromBuffer(buffer, function(err, result) { 669 | assert.notOk(err, 'no error'); 670 | assert.equal(result.type, 'csv', 'expected file type'); 671 | assert.equal(result.protocol, 'omnivore:', 'expected protocol'); 672 | assert.end(); 673 | }); 674 | }); 675 | tape('[CSV - invalid empty] errors filepath', function(assert) { 676 | var filepath = path.resolve('./test/data/invalid-blank.csv'); 677 | assert.notOk(Buffer.isBuffer(filepath)); 678 | sniffer.fromFile(filepath, function(err, result) { 679 | assert.ok(err); 680 | assert.equal(err.message, 'File too small', 'expected error message'); 681 | assert.equal(err.code, 'EINVALID', 'expected error code'); 682 | assert.end(); 683 | }); 684 | }); 685 | tape('[CSV - invalid empty] errors buffer', function(assert) { 686 | var filepath = path.resolve('./test/data/invalid-blank.csv'); 687 | var buffer = getBuffer(filepath); 688 | assert.ok(Buffer.isBuffer(buffer)); 689 | sniffer.fromBuffer(buffer, function(err, result) { 690 | assert.ok(err); 691 | assert.equal(err.message, 'Unknown filetype', 'expected error message'); 692 | assert.equal(err.code, 'EINVALID', 'expected error code'); 693 | assert.end(); 694 | }); 695 | }); 696 | tape('[CSV - invalid geometries] errors filepath', function(assert) { 697 | var filepath = path.resolve('./test/data/invalid_geometries.csv'); 698 | assert.notOk(Buffer.isBuffer(filepath)); 699 | sniffer.fromFile(filepath, function(err, result) { 700 | assert.ok(err); 701 | assert.equal(err.message, 'Unknown filetype', 'expected error message'); 702 | assert.equal(err.code, 'EINVALID', 'expected error code'); 703 | assert.end(); 704 | }); 705 | }); 706 | tape('[CSV - invalid geometries] errors buffer', function(assert) { 707 | var filepath = path.resolve('./test/data/invalid_geometries.csv'); 708 | var buffer = getBuffer(filepath); 709 | assert.ok(Buffer.isBuffer(buffer)); 710 | sniffer.fromBuffer(buffer, function(err, result) { 711 | assert.ok(err); 712 | assert.equal(err.message, 'Unknown filetype', 'expected error message'); 713 | assert.equal(err.code, 'EINVALID', 'expected error code'); 714 | assert.end(); 715 | }); 716 | }); 717 | 718 | tape('cli - success', function(assert) { 719 | var filepath = path.resolve('./test/data/valid-lines.csv'); 720 | exec([__dirname + '/../bin/mapbox-file-sniff.js', filepath].join(' '), { 721 | env: process.env, 722 | timeout: 2000 723 | }, function(err, stdout) { 724 | assert.ifError(err); 725 | assert.equal(stdout, '{"type":"csv","protocol":"omnivore:"}\n', 'expected output'); 726 | assert.end(); 727 | }); 728 | }); 729 | tape('cli - success, --protocol flag', function(assert) { 730 | var filepath = path.resolve('./test/data/valid-lines.csv'); 731 | exec([__dirname + '/../bin/mapbox-file-sniff.js', filepath, '--protocol'].join(' '), { 732 | env: process.env, 733 | timeout: 2000 734 | }, function(err, stdout) { 735 | assert.ifError(err); 736 | assert.equal(stdout, 'omnivore:\n', 'expected output'); 737 | assert.end(); 738 | }); 739 | }); 740 | tape('cli - success, --type flag', function(assert) { 741 | var filepath = path.resolve('./test/data/valid-lines.csv'); 742 | exec([__dirname + '/../bin/mapbox-file-sniff.js', filepath, '--type'].join(' '), { 743 | env: process.env, 744 | timeout: 2000 745 | }, function(err, stdout) { 746 | assert.ifError(err); 747 | assert.equal(stdout, 'csv\n', 'expected output'); 748 | assert.end(); 749 | }); 750 | }); 751 | tape('cli - error, invalid file', function(assert) { 752 | var filepath = path.resolve('./test/data/invalid_geometries.csv'); 753 | exec([__dirname + '/../bin/mapbox-file-sniff.js', filepath].join(' '), { 754 | env: process.env, 755 | timeout: 2000 756 | }, function(err, stdout, stderr) { 757 | assert.ok(err); 758 | assert.notOk(stdout); 759 | assert.equal(stderr, 'Unknown filetype\n', 'expected output'); 760 | assert.end(); 761 | }); 762 | }); 763 | --------------------------------------------------------------------------------