├── .eslintrc.js ├── .gitignore ├── .npmignore ├── .travis.yml ├── CHANGELOG.md ├── LICENSE ├── README.md ├── demo ├── arcgis-js-api-demo.html ├── config │ ├── custom-environment-variables.json │ └── default.json ├── data │ ├── pasadena-bus.geojson │ ├── pasadena-parks.geojson │ └── trees.geojson ├── index.js ├── mapbox-demo.html ├── package-lock.json ├── package.json └── server.js ├── package.json ├── src ├── esri-metadata.js ├── esri-rendering-info.js ├── esri-root.js ├── esri-template-metadata.js ├── esri-template-root.js ├── index.js ├── metadata.js ├── serve.js ├── tile-set-config.js ├── tile-sets-cache.js └── utils.js └── test ├── esri-metadata.spec.js ├── esri-rendering-info.spec.js ├── esri-root.spec.js ├── fixtures ├── esri-metadata-result.json └── trees.json ├── metadata.spec.js ├── serve.spec.js ├── tile-sets-cache.spec.js ├── tile-sets-config.spec.js └── utils.spec.js /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['standard'] 3 | } 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | complexity 4 | /lib 5 | /public 6 | test/test.log.** 7 | .flowconfig 8 | .vscode 9 | .idea 10 | dist 11 | package-lock.json 12 | yarn.lock 13 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | src 2 | test 3 | demo 4 | .babelrc 5 | .gitignore 6 | node_modules 7 | .travis.yml 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - "10" 4 | sudo: false 5 | cache: 6 | - node_modules 7 | script: 8 | - npm test 9 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | All notable changes to this project will be documented in this file. 3 | This project adheres to [Semantic Versioning](http://semver.org/). 4 | 5 | ## [2.2.0] - 2021-12-14 6 | ### Added 7 | * Support for POST requests to tile endpoints 8 | 9 | ## [2.1.1] - 2020-08-17 10 | ### Fixed 11 | * Use baseUrl if there is one 12 | 13 | ## [2.1.0] - 2019-07-02 14 | ### Changed 15 | * Added `rest/services` to routes targeting ArcGIS clients 16 | 17 | ### Added 18 | * trailing slash route - `VectorTileServer/` needed for ArcGIS clients 19 | 20 | ## [2.0.0] - 2019-06-26 21 | ### Breaking Change 22 | * plugin class name (and thus routes) changed to `VectorTileServer` to accomodate ArcGIS requirements 23 | 24 | ### Added 25 | * ArcGIS metadata route 26 | * ArcGIS root.json route 27 | 28 | ## [1.0.1] - 2019-06-21 29 | ### Fixed 30 | * strip undefined properties from tile-config object 31 | 32 | ## [1.0.0] - 2019-06-21 33 | ### Changed 34 | * path to package.json 35 | * refactor into source directory 36 | * update demo 37 | 38 | ### Added 39 | * Unit tests 40 | 41 | ## [0.0.3] - 2019-06-14 42 | ### Added 43 | * Linting and travis build. 44 | 45 | [2.2.0]: https://github.com/koopjs/koop-output-vector-tiles/compare/v2.1.1...v2.2.0 46 | [2.1.1]: https://github.com/koopjs/koop-output-vector-tiles/compare/v2.1.0...v2.1.1 47 | [2.1.0]: https://github.com/koopjs/koop-output-vector-tiles/compare/v2.0.0...v2.1.0 48 | [2.0.0]: https://github.com/koopjs/koop-output-vector-tiles/compare/v1.0.1...v2.0.0 49 | [1.0.1]: https://github.com/koopjs/koop-output-vector-tiles/compare/v1.0.0...v1.0.1 50 | [1.0.0]: https://github.com/koopjs/koop-output-vector-tiles/compare/v0.0.3...v1.0.0 51 | [0.0.3]: https://github.com/koopjs/koop-output-vector-tiles/releases/tag/v0.0.3 52 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "{}" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright {yyyy} {name of copyright owner} 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # @koopjs/output-vector-tiles 2 | 3 | This output-services plugin converts GeoJSON to `pbf` vector tiles. 4 | 5 | ## Install 6 | 7 | ```bash 8 | npm install --save @koopjs/output-vector-tiles 9 | ``` 10 | 11 | ## Usage 12 | 13 | Register this plugin with koop before your plugins to ensure that the `VectorTiles` routes are bound to the providers. 14 | 15 | ``` 16 | const tile = require('@koopjs/output-vector-tiles') 17 | koop.register(tiles) 18 | 19 | // Register providers 20 | ``` 21 | 22 | After startup, Koop will include `VectorTileServer` routes for each registered provider. For example, if you had registered the Github provider, the following routes would be available: 23 | 24 | ```bash 25 | /github/:id/VectorTileServer/:z([0-9]+)/:x([0-9]+)/:y([0-9]+).pbf GET, POST 26 | /github/rest/services/:id/VectorTileServer/tiles.json GET 27 | /github/rest/services/:id/VectorTileServer GET, POST 28 | /github/rest/services/:id/VectorTileServer/ GET, POST 29 | /github/rest/services/:id/VectorTileServer/resources/styles/root.json GET 30 | ``` 31 | 32 | ## Routes 33 | | Route | Method | Description | 34 | | --- | --- | --- | 35 | |`/VectorTileServer/:z([0-9]+)/:x([0-9]+)/:y([0-9]+).pbf`| GET, POST | Get a specific tile. | 36 | |`/VectorTileServer/tiles.json`| GET | Standard vector tile metadata. | 37 | |`/VectorTileServer`| GET, POST | ArcGIS vector tile metadata. | 38 | |`/VectorTileServer/`| GET, POST | ArcGIS vector tile metadata. | 39 | |`/VectorTileServer/resources/styles/root.json`| GET | ArcGIS vector tile styling info. | 40 | 41 | 42 | ## Options and configuration 43 | 44 | ### Using a tile set cache 45 | This output plugin has a built-in in-memory cache for storing generated tile sets for a set period of time. This may improve performance. It is disabled by default. You can use it by setting your Koop config like: 46 | 47 | ```javascript 48 | { 49 | "koopOutputVectorTiles": { 50 | "cache": true, 51 | "cacheExpiration": 3600 // seconds to cache; defaults to 300 52 | } 53 | } 54 | ``` 55 | 56 | ### Tile generation settings 57 | This plugin leverages [geojsonvt](https://github.com/mapbox/geojson-vt) to create tiles from GeoJSON. If you want to adjust any of the geojsonvt settings, you can do so in the Config: 58 | 59 | ```javascript 60 | { 61 | "koopOutputVectorTiles": { 62 | "geojsonVT":{ 63 | "maxZoom": , // max zoom to preserve detail on; can't be higher than 24 64 | "tolerance": , // simplification tolerance (higher means simpler) 65 | "extent": , // tile extent (both width and height) 66 | "buffer": , // 64 is the original default, using a higher number like 512, 1024 or 2048 gets rid of some geojson artifacts but increases the tilesSetCache size // tile buffer on each side 67 | "debug": , // logging level (0 to disable, 1 or 2) 68 | "lineMetrics": , // whether to enable line metrics tracking for LineString/MultiLineString features 69 | "promoteId": , // name of a feature property to promote to feature.id. Cannot be used with `generateId` 70 | "generateId": , // whether to generate feature ids. Cannot be used with `promoteId` 71 | "indexMaxZoom": , // max zoom in the initial tile index 72 | "indexMaxPoints": // max number of points per tile in the index 73 | } 74 | } 75 | } 76 | ``` 77 | 78 | ### ArcGIS tile styling 79 | ArcGIS applications make style requests to the vector tile server at `/VectorTileServer/resources/styles/root.json`. You can control the style served by this endpoint by either (1) setting default values in your config file, or (2) adding styling info to the GeoJSON metadata in your provider. 80 | 81 | #### ArcGIS style via config 82 | 83 | Add `paint` configuration for each `circle`, `line`,and `fill` types: 84 | 85 | ```javascript 86 | { 87 | "koopOutputVectorTiles": { 88 | "circle": { 89 | "paint": { 90 | "circle-radius": 3 91 | } 92 | }, 93 | "line": { 94 | "paint": { 95 | "line-width": 7 96 | } 97 | }, 98 | "fill": { 99 | "paint": { 100 | "fill-opacity": 0.25 101 | } 102 | } 103 | } 104 | } 105 | ``` 106 | 107 | See the [Mapbox style specification](https://docs.mapbox.com/mapbox-gl-js/style-spec/) for additional properties that can be set in `paint`. 108 | 109 | #### ArcGIS style via your provider: 110 | You can modify the GeoJSON metadata of your provider to handle styling: 111 | 112 | ```javascript 113 | // inside your getData function 114 | 115 | geojson.metadata = {} 116 | geojson.metadata.vt = {} 117 | geojson.metadata.vt = { 118 | type: 'circle', 119 | paint: { 120 | 'circle-radius': 4 121 | } 122 | } 123 | 124 | ``` 125 | 126 | ## Demos 127 | This repo ships with both MapBoxGL and ArcGIS demo applications that consume Koop vector tiles. To try it out: 128 | 129 | ```bash 130 | # Install plugin dependencies 131 | npm install 132 | 133 | # Move to demo directory 134 | cd demo 135 | 136 | # Install demo dependencies and start Express Koop server 137 | npm install 138 | npm start 139 | ``` 140 | 141 | Then open `mapbox-demo/index.html` or `arcgis-js-api-demo.html` in the browser of your choice. You should see vector tile rendered data around the city of Pasadena, CA. 142 | -------------------------------------------------------------------------------- /demo/arcgis-js-api-demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | VectorTileLayer sample 7 | 8 | 18 | 19 | 40 | 41 | 42 |
43 | 44 | -------------------------------------------------------------------------------- /demo/config/custom-environment-variables.json: -------------------------------------------------------------------------------- 1 | { 2 | "googlesheets": { 3 | "auth": "GOOGLESHEETS_AUTH" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /demo/config/default.json: -------------------------------------------------------------------------------- 1 | { 2 | "koopOutputVectorTiles": { 3 | "geojsonVT": { 4 | "maxZoom": 14, 5 | "tolerance": 3, 6 | "extent": 4096, 7 | "buffer": 64, 8 | "debug": 0, 9 | "lineMetrics": false, 10 | "promoteId": null, 11 | "generateId": false, 12 | "indexMaxZoom": 5, 13 | "indexMaxPoints": 100000 14 | }, 15 | "maxAge": 3600 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /demo/index.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/koopjs/koop-output-vector-tiles/3bf31fba6ca17d2ac812698c9394a468d0b1ee86/demo/index.js -------------------------------------------------------------------------------- /demo/mapbox-demo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 13 | 14 | 15 | 16 |
17 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /demo/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@esri/proj-codes": { 8 | "version": "2.3.0", 9 | "resolved": "https://registry.npmjs.org/@esri/proj-codes/-/proj-codes-2.3.0.tgz", 10 | "integrity": "sha512-MdHLW52b3UBgr0nPYTARjYnxd77u7sM+8ulq3rQqHzSYS6VLrK91dU/SDmogeRvJlnwSWHlIEJVTifEmNpDPLA==" 11 | }, 12 | "@koopjs/logger": { 13 | "version": "2.0.4", 14 | "resolved": "https://registry.npmjs.org/@koopjs/logger/-/logger-2.0.4.tgz", 15 | "integrity": "sha512-jF14sMYNGx0ko8SGcGCwh+RAH/m0IA0Pv3C3PGG6cT7hprNkGMbtL2d94xyudkKWR+ssBKtCV0INVi+s3MO8Rg==", 16 | "requires": { 17 | "winston": "^2.3.1" 18 | } 19 | }, 20 | "@koopjs/provider-file-geojson": { 21 | "version": "1.0.1", 22 | "resolved": "https://registry.npmjs.org/@koopjs/provider-file-geojson/-/provider-file-geojson-1.0.1.tgz", 23 | "integrity": "sha512-hBIVPwpSYWhhrD9MKC4KIgicfise25Z9/qqJNZ3bZxIeEvZwuNQ3z4aIxOhE2bWECR7k+6UKni6bttHmnCsotg==", 24 | "requires": { 25 | "koop": "^3.7.0" 26 | } 27 | }, 28 | "@mapbox/geojsonhint": { 29 | "version": "3.0.0", 30 | "resolved": "https://registry.npmjs.org/@mapbox/geojsonhint/-/geojsonhint-3.0.0.tgz", 31 | "integrity": "sha512-zHcyh1rDHYnEBd6NvOWoeHLuvazlDkIjvz9MJx4cKwcKTlfrqgxVnTv1QLnVJnsSU5neJnhQJcgscR/Zl4uYgw==", 32 | "requires": { 33 | "concat-stream": "^1.6.1", 34 | "jsonlint-lines": "1.7.1", 35 | "minimist": "1.2.0", 36 | "vfile": "^4.0.0", 37 | "vfile-reporter": "^5.1.1" 38 | } 39 | }, 40 | "@turf/bbox-polygon": { 41 | "version": "6.0.1", 42 | "resolved": "https://registry.npmjs.org/@turf/bbox-polygon/-/bbox-polygon-6.0.1.tgz", 43 | "integrity": "sha512-f6BK6GOzUNjmJeOYHklk/5LNcQMQbo51gvAM10dTM5IqzKP01KM5bgV88uOKfSZB0HRQVpaRV1tgXk2bg5cPRg==", 44 | "requires": { 45 | "@turf/helpers": "6.x" 46 | } 47 | }, 48 | "@turf/centroid": { 49 | "version": "6.0.2", 50 | "resolved": "https://registry.npmjs.org/@turf/centroid/-/centroid-6.0.2.tgz", 51 | "integrity": "sha512-auyDauOtC4eddH7GC3CHFTDu2PKhpSeKCRhwhHhXtJqn2dWCJQNIoCeJRmfXRIbzCWhWvgvQafvvhq8HNvmvWw==", 52 | "requires": { 53 | "@turf/helpers": "6.x", 54 | "@turf/meta": "6.x" 55 | } 56 | }, 57 | "@turf/helpers": { 58 | "version": "6.1.4", 59 | "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-6.1.4.tgz", 60 | "integrity": "sha512-vJvrdOZy1ngC7r3MDA7zIGSoIgyrkWcGnNIEaqn/APmw+bVLF2gAW7HIsdTxd12s5wQMqEpqIQrmrbRRZ0xC7g==" 61 | }, 62 | "@turf/meta": { 63 | "version": "6.0.2", 64 | "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-6.0.2.tgz", 65 | "integrity": "sha512-VA7HJkx7qF1l3+GNGkDVn2oXy4+QoLP6LktXAaZKjuT1JI0YESat7quUkbCMy4zP9lAUuvS4YMslLyTtr919FA==", 66 | "requires": { 67 | "@turf/helpers": "6.x" 68 | } 69 | }, 70 | "@types/geojson": { 71 | "version": "7946.0.7", 72 | "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz", 73 | "integrity": "sha512-wE2v81i4C4Ol09RtsWFAqg3BUitWbHSpSlIo+bNdsCJijO9sjme+zm+73ZMCa/qMC8UEERxzGbvmr1cffo2SiQ==" 74 | }, 75 | "@types/unist": { 76 | "version": "2.0.3", 77 | "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", 78 | "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==" 79 | }, 80 | "JSV": { 81 | "version": "4.0.2", 82 | "resolved": "https://registry.npmjs.org/JSV/-/JSV-4.0.2.tgz", 83 | "integrity": "sha1-0Hf2glVx+CEy+d/67Vh7QCn+/1c=" 84 | }, 85 | "accepts": { 86 | "version": "1.3.7", 87 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 88 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 89 | "requires": { 90 | "mime-types": "~2.1.24", 91 | "negotiator": "0.6.2" 92 | } 93 | }, 94 | "acorn": { 95 | "version": "5.7.3", 96 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", 97 | "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", 98 | "dev": true 99 | }, 100 | "acorn-jsx": { 101 | "version": "3.0.1", 102 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 103 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 104 | "dev": true, 105 | "requires": { 106 | "acorn": "^3.0.4" 107 | }, 108 | "dependencies": { 109 | "acorn": { 110 | "version": "3.3.0", 111 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 112 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", 113 | "dev": true 114 | } 115 | } 116 | }, 117 | "adler-32": { 118 | "version": "1.2.0", 119 | "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.2.0.tgz", 120 | "integrity": "sha1-aj5r8KY5ALoVZSgIyxXGgT0aXyU=", 121 | "requires": { 122 | "exit-on-epipe": "~1.0.1", 123 | "printj": "~1.1.0" 124 | } 125 | }, 126 | "ajv": { 127 | "version": "6.10.0", 128 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 129 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 130 | "requires": { 131 | "fast-deep-equal": "^2.0.1", 132 | "fast-json-stable-stringify": "^2.0.0", 133 | "json-schema-traverse": "^0.4.1", 134 | "uri-js": "^4.2.2" 135 | } 136 | }, 137 | "ajv-keywords": { 138 | "version": "1.5.1", 139 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-1.5.1.tgz", 140 | "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", 141 | "dev": true 142 | }, 143 | "alasql": { 144 | "version": "0.4.11", 145 | "resolved": "https://registry.npmjs.org/alasql/-/alasql-0.4.11.tgz", 146 | "integrity": "sha512-U1x1+NjIiG24crW34OwB3I8mpl0s0gS8xUcZ6unddLkRWaIWV/R/dqc/zTKwoE0YDwss0yI05WOYg5Psb62VRA==", 147 | "requires": { 148 | "dom-storage": "^2.0.1", 149 | "es6-promise": "^4.2.2", 150 | "lodash": "^4.17.4", 151 | "request": "^2.83.0", 152 | "xlsx": "^0.13.2", 153 | "yargs": "^5.0.0" 154 | } 155 | }, 156 | "ansi-escapes": { 157 | "version": "1.4.0", 158 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", 159 | "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", 160 | "dev": true 161 | }, 162 | "ansi-regex": { 163 | "version": "3.0.0", 164 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 165 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 166 | }, 167 | "ansi-styles": { 168 | "version": "3.2.1", 169 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 170 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 171 | "requires": { 172 | "color-convert": "^1.9.0" 173 | } 174 | }, 175 | "aproba": { 176 | "version": "1.2.0", 177 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 178 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 179 | "optional": true 180 | }, 181 | "are-we-there-yet": { 182 | "version": "1.1.5", 183 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 184 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 185 | "optional": true, 186 | "requires": { 187 | "delegates": "^1.0.0", 188 | "readable-stream": "^2.0.6" 189 | } 190 | }, 191 | "argparse": { 192 | "version": "1.0.10", 193 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 194 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 195 | "dev": true, 196 | "requires": { 197 | "sprintf-js": "~1.0.2" 198 | } 199 | }, 200 | "array-flatten": { 201 | "version": "1.1.1", 202 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 203 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 204 | }, 205 | "array.prototype.find": { 206 | "version": "2.1.0", 207 | "resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.0.tgz", 208 | "integrity": "sha512-Wn41+K1yuO5p7wRZDl7890c3xvv5UBrfVXTVIe28rSQb6LS0fZMDrQB6PAcxQFRFy6vJTLDc3A2+3CjQdzVKRg==", 209 | "dev": true, 210 | "requires": { 211 | "define-properties": "^1.1.3", 212 | "es-abstract": "^1.13.0" 213 | } 214 | }, 215 | "asn1": { 216 | "version": "0.2.4", 217 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 218 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 219 | "requires": { 220 | "safer-buffer": "~2.1.0" 221 | } 222 | }, 223 | "assert-plus": { 224 | "version": "1.0.0", 225 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 226 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 227 | }, 228 | "asynckit": { 229 | "version": "0.4.0", 230 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 231 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 232 | }, 233 | "aws-sign2": { 234 | "version": "0.7.0", 235 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 236 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 237 | }, 238 | "aws4": { 239 | "version": "1.8.0", 240 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 241 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" 242 | }, 243 | "babel-code-frame": { 244 | "version": "6.26.0", 245 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 246 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 247 | "dev": true, 248 | "requires": { 249 | "chalk": "^1.1.3", 250 | "esutils": "^2.0.2", 251 | "js-tokens": "^3.0.2" 252 | }, 253 | "dependencies": { 254 | "ansi-regex": { 255 | "version": "2.1.1", 256 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 257 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 258 | "dev": true 259 | }, 260 | "ansi-styles": { 261 | "version": "2.2.1", 262 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 263 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 264 | "dev": true 265 | }, 266 | "chalk": { 267 | "version": "1.1.3", 268 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 269 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 270 | "dev": true, 271 | "requires": { 272 | "ansi-styles": "^2.2.1", 273 | "escape-string-regexp": "^1.0.2", 274 | "has-ansi": "^2.0.0", 275 | "strip-ansi": "^3.0.0", 276 | "supports-color": "^2.0.0" 277 | } 278 | }, 279 | "strip-ansi": { 280 | "version": "3.0.1", 281 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 282 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 283 | "dev": true, 284 | "requires": { 285 | "ansi-regex": "^2.0.0" 286 | } 287 | }, 288 | "supports-color": { 289 | "version": "2.0.0", 290 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 291 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 292 | "dev": true 293 | } 294 | } 295 | }, 296 | "balanced-match": { 297 | "version": "1.0.0", 298 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 299 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 300 | }, 301 | "bbox2extent": { 302 | "version": "1.1.1", 303 | "resolved": "https://registry.npmjs.org/bbox2extent/-/bbox2extent-1.1.1.tgz", 304 | "integrity": "sha1-NRoKCzwBGaIDn42kd2RtGuxPSGw=" 305 | }, 306 | "bcrypt-pbkdf": { 307 | "version": "1.0.2", 308 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 309 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 310 | "requires": { 311 | "tweetnacl": "^0.14.3" 312 | } 313 | }, 314 | "bl": { 315 | "version": "1.2.2", 316 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 317 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 318 | "optional": true, 319 | "requires": { 320 | "readable-stream": "^2.3.5", 321 | "safe-buffer": "^5.1.1" 322 | } 323 | }, 324 | "body-parser": { 325 | "version": "1.19.0", 326 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 327 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 328 | "requires": { 329 | "bytes": "3.1.0", 330 | "content-type": "~1.0.4", 331 | "debug": "2.6.9", 332 | "depd": "~1.1.2", 333 | "http-errors": "1.7.2", 334 | "iconv-lite": "0.4.24", 335 | "on-finished": "~2.3.0", 336 | "qs": "6.7.0", 337 | "raw-body": "2.4.0", 338 | "type-is": "~1.6.17" 339 | }, 340 | "dependencies": { 341 | "qs": { 342 | "version": "6.7.0", 343 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 344 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 345 | } 346 | } 347 | }, 348 | "brace-expansion": { 349 | "version": "1.1.11", 350 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 351 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 352 | "requires": { 353 | "balanced-match": "^1.0.0", 354 | "concat-map": "0.0.1" 355 | } 356 | }, 357 | "buffer-alloc": { 358 | "version": "1.2.0", 359 | "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", 360 | "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", 361 | "optional": true, 362 | "requires": { 363 | "buffer-alloc-unsafe": "^1.1.0", 364 | "buffer-fill": "^1.0.0" 365 | } 366 | }, 367 | "buffer-alloc-unsafe": { 368 | "version": "1.1.0", 369 | "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", 370 | "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", 371 | "optional": true 372 | }, 373 | "buffer-fill": { 374 | "version": "1.0.0", 375 | "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", 376 | "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", 377 | "optional": true 378 | }, 379 | "buffer-from": { 380 | "version": "1.1.1", 381 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 382 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 383 | }, 384 | "builtin-modules": { 385 | "version": "1.1.1", 386 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 387 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 388 | "dev": true 389 | }, 390 | "bytes": { 391 | "version": "3.1.0", 392 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 393 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 394 | }, 395 | "caller-path": { 396 | "version": "0.1.0", 397 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 398 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 399 | "dev": true, 400 | "requires": { 401 | "callsites": "^0.2.0" 402 | } 403 | }, 404 | "callsites": { 405 | "version": "0.2.0", 406 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 407 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", 408 | "dev": true 409 | }, 410 | "camelcase": { 411 | "version": "3.0.0", 412 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", 413 | "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=" 414 | }, 415 | "caseless": { 416 | "version": "0.12.0", 417 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 418 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 419 | }, 420 | "cfb": { 421 | "version": "1.0.8", 422 | "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.0.8.tgz", 423 | "integrity": "sha1-d/ITST1pfXVP2cD1UR6rWtctAs8=", 424 | "requires": { 425 | "commander": "^2.14.1", 426 | "printj": "~1.1.2" 427 | } 428 | }, 429 | "chalk": { 430 | "version": "2.4.2", 431 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 432 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 433 | "requires": { 434 | "ansi-styles": "^3.2.1", 435 | "escape-string-regexp": "^1.0.5", 436 | "supports-color": "^5.3.0" 437 | } 438 | }, 439 | "chownr": { 440 | "version": "1.1.1", 441 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", 442 | "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", 443 | "optional": true 444 | }, 445 | "chroma-js": { 446 | "version": "2.0.4", 447 | "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.0.4.tgz", 448 | "integrity": "sha512-gk71qOrSdBTLbsd0DIUO3QjZL8tTvMwpG1EoXYScy7rI4rcO4EyYH6zGuvCgUDumKumqg0pt6Ua+vWnMJsTYhw==" 449 | }, 450 | "circular-json": { 451 | "version": "0.3.3", 452 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 453 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", 454 | "dev": true 455 | }, 456 | "classybrew": { 457 | "version": "0.0.3", 458 | "resolved": "https://registry.npmjs.org/classybrew/-/classybrew-0.0.3.tgz", 459 | "integrity": "sha1-fbkd9W3XCF8IZI/YL4PU7wMExzs=" 460 | }, 461 | "cli-cursor": { 462 | "version": "1.0.2", 463 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", 464 | "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", 465 | "dev": true, 466 | "requires": { 467 | "restore-cursor": "^1.0.1" 468 | } 469 | }, 470 | "cli-width": { 471 | "version": "2.2.0", 472 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 473 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 474 | "dev": true 475 | }, 476 | "cliui": { 477 | "version": "3.2.0", 478 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", 479 | "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", 480 | "requires": { 481 | "string-width": "^1.0.1", 482 | "strip-ansi": "^3.0.1", 483 | "wrap-ansi": "^2.0.0" 484 | }, 485 | "dependencies": { 486 | "ansi-regex": { 487 | "version": "2.1.1", 488 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 489 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 490 | }, 491 | "is-fullwidth-code-point": { 492 | "version": "1.0.0", 493 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 494 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 495 | "requires": { 496 | "number-is-nan": "^1.0.0" 497 | } 498 | }, 499 | "string-width": { 500 | "version": "1.0.2", 501 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 502 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 503 | "requires": { 504 | "code-point-at": "^1.0.0", 505 | "is-fullwidth-code-point": "^1.0.0", 506 | "strip-ansi": "^3.0.0" 507 | } 508 | }, 509 | "strip-ansi": { 510 | "version": "3.0.1", 511 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 512 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 513 | "requires": { 514 | "ansi-regex": "^2.0.0" 515 | } 516 | } 517 | } 518 | }, 519 | "clone": { 520 | "version": "1.0.4", 521 | "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", 522 | "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", 523 | "optional": true 524 | }, 525 | "co": { 526 | "version": "4.6.0", 527 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 528 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", 529 | "dev": true 530 | }, 531 | "code-point-at": { 532 | "version": "1.1.0", 533 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 534 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 535 | }, 536 | "codepage": { 537 | "version": "1.14.0", 538 | "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.14.0.tgz", 539 | "integrity": "sha1-jL4lSBMjVZ19MHVxsP/5HnodL5k=", 540 | "requires": { 541 | "commander": "~2.14.1", 542 | "exit-on-epipe": "~1.0.1" 543 | }, 544 | "dependencies": { 545 | "commander": { 546 | "version": "2.14.1", 547 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", 548 | "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==" 549 | } 550 | } 551 | }, 552 | "color-convert": { 553 | "version": "1.9.3", 554 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 555 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 556 | "requires": { 557 | "color-name": "1.1.3" 558 | } 559 | }, 560 | "color-name": { 561 | "version": "1.1.3", 562 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 563 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 564 | }, 565 | "colors": { 566 | "version": "1.0.3", 567 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 568 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 569 | }, 570 | "combined-stream": { 571 | "version": "1.0.8", 572 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 573 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 574 | "requires": { 575 | "delayed-stream": "~1.0.0" 576 | } 577 | }, 578 | "commander": { 579 | "version": "2.15.1", 580 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 581 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" 582 | }, 583 | "compressible": { 584 | "version": "2.0.17", 585 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", 586 | "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", 587 | "requires": { 588 | "mime-db": ">= 1.40.0 < 2" 589 | } 590 | }, 591 | "compression": { 592 | "version": "1.7.4", 593 | "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", 594 | "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", 595 | "requires": { 596 | "accepts": "~1.3.5", 597 | "bytes": "3.0.0", 598 | "compressible": "~2.0.16", 599 | "debug": "2.6.9", 600 | "on-headers": "~1.0.2", 601 | "safe-buffer": "5.1.2", 602 | "vary": "~1.1.2" 603 | }, 604 | "dependencies": { 605 | "bytes": { 606 | "version": "3.0.0", 607 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 608 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 609 | } 610 | } 611 | }, 612 | "concat-map": { 613 | "version": "0.0.1", 614 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 615 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 616 | }, 617 | "concat-stream": { 618 | "version": "1.6.2", 619 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 620 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 621 | "requires": { 622 | "buffer-from": "^1.0.0", 623 | "inherits": "^2.0.3", 624 | "readable-stream": "^2.2.2", 625 | "typedarray": "^0.0.6" 626 | } 627 | }, 628 | "config": { 629 | "version": "1.31.0", 630 | "resolved": "https://registry.npmjs.org/config/-/config-1.31.0.tgz", 631 | "integrity": "sha512-Ep/l9Rd1J9IPueztJfpbOqVzuKHQh4ZODMNt9xqTYdBBNRXbV4oTu34kCkkfdRVcDq0ohtpaeXGgb+c0LQxFRA==", 632 | "requires": { 633 | "json5": "^1.0.1" 634 | } 635 | }, 636 | "console-control-strings": { 637 | "version": "1.1.0", 638 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 639 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", 640 | "optional": true 641 | }, 642 | "contains-path": { 643 | "version": "0.1.0", 644 | "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", 645 | "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", 646 | "dev": true 647 | }, 648 | "content-disposition": { 649 | "version": "0.5.3", 650 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 651 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 652 | "requires": { 653 | "safe-buffer": "5.1.2" 654 | } 655 | }, 656 | "content-type": { 657 | "version": "1.0.4", 658 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 659 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 660 | }, 661 | "cookie": { 662 | "version": "0.4.0", 663 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 664 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 665 | }, 666 | "cookie-signature": { 667 | "version": "1.0.6", 668 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 669 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 670 | }, 671 | "core-util-is": { 672 | "version": "1.0.2", 673 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 674 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 675 | }, 676 | "cors": { 677 | "version": "2.8.5", 678 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 679 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 680 | "requires": { 681 | "object-assign": "^4", 682 | "vary": "^1" 683 | } 684 | }, 685 | "crc-32": { 686 | "version": "1.2.0", 687 | "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.0.tgz", 688 | "integrity": "sha512-1uBwHxF+Y/4yF5G48fwnKq6QsIXheor3ZLPT80yGBV1oEUwpPojlEhQbWKVw1VwcTQyMGHK1/XMmTjmlsmTTGA==", 689 | "requires": { 690 | "exit-on-epipe": "~1.0.1", 691 | "printj": "~1.1.0" 692 | } 693 | }, 694 | "cycle": { 695 | "version": "1.0.3", 696 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 697 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 698 | }, 699 | "d": { 700 | "version": "1.0.1", 701 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", 702 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", 703 | "dev": true, 704 | "requires": { 705 | "es5-ext": "^0.10.50", 706 | "type": "^1.0.1" 707 | } 708 | }, 709 | "dashdash": { 710 | "version": "1.14.1", 711 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 712 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 713 | "requires": { 714 | "assert-plus": "^1.0.0" 715 | } 716 | }, 717 | "debug": { 718 | "version": "2.6.9", 719 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 720 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 721 | "requires": { 722 | "ms": "2.0.0" 723 | } 724 | }, 725 | "debug-log": { 726 | "version": "1.0.1", 727 | "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", 728 | "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", 729 | "dev": true 730 | }, 731 | "decamelize": { 732 | "version": "1.2.0", 733 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 734 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 735 | }, 736 | "decompress-response": { 737 | "version": "3.3.0", 738 | "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", 739 | "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", 740 | "optional": true, 741 | "requires": { 742 | "mimic-response": "^1.0.0" 743 | } 744 | }, 745 | "deep-extend": { 746 | "version": "0.6.0", 747 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 748 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", 749 | "optional": true 750 | }, 751 | "deep-is": { 752 | "version": "0.1.3", 753 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 754 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 755 | "dev": true 756 | }, 757 | "defaults": { 758 | "version": "1.0.3", 759 | "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", 760 | "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", 761 | "optional": true, 762 | "requires": { 763 | "clone": "^1.0.2" 764 | } 765 | }, 766 | "define-properties": { 767 | "version": "1.1.3", 768 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 769 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 770 | "dev": true, 771 | "requires": { 772 | "object-keys": "^1.0.12" 773 | } 774 | }, 775 | "deglob": { 776 | "version": "2.1.1", 777 | "resolved": "https://registry.npmjs.org/deglob/-/deglob-2.1.1.tgz", 778 | "integrity": "sha512-2kjwuGGonL7gWE1XU4Fv79+vVzpoQCl0V+boMwWtOQJV2AGDabCwez++nB1Nli/8BabAfZQ/UuHPlp6AymKdWw==", 779 | "dev": true, 780 | "requires": { 781 | "find-root": "^1.0.0", 782 | "glob": "^7.0.5", 783 | "ignore": "^3.0.9", 784 | "pkg-config": "^1.1.0", 785 | "run-parallel": "^1.1.2", 786 | "uniq": "^1.0.1" 787 | } 788 | }, 789 | "delayed-stream": { 790 | "version": "1.0.0", 791 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 792 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 793 | }, 794 | "delegates": { 795 | "version": "1.0.0", 796 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 797 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 798 | "optional": true 799 | }, 800 | "depd": { 801 | "version": "1.1.2", 802 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 803 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 804 | }, 805 | "destroy": { 806 | "version": "1.0.4", 807 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 808 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 809 | }, 810 | "detect-libc": { 811 | "version": "1.0.3", 812 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 813 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", 814 | "optional": true 815 | }, 816 | "doctrine": { 817 | "version": "2.1.0", 818 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 819 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 820 | "dev": true, 821 | "requires": { 822 | "esutils": "^2.0.2" 823 | } 824 | }, 825 | "dom-storage": { 826 | "version": "2.1.0", 827 | "resolved": "https://registry.npmjs.org/dom-storage/-/dom-storage-2.1.0.tgz", 828 | "integrity": "sha512-g6RpyWXzl0RR6OTElHKBl7nwnK87GUyZMYC7JWsB/IA73vpqK2K6LT39x4VepLxlSsWBFrPVLnsSR5Jyty0+2Q==" 829 | }, 830 | "easy-table": { 831 | "version": "1.1.1", 832 | "resolved": "https://registry.npmjs.org/easy-table/-/easy-table-1.1.1.tgz", 833 | "integrity": "sha512-C9Lvm0WFcn2RgxbMnTbXZenMIWcBtkzMr+dWqq/JsVoGFSVUVlPqeOa5LP5kM0I3zoOazFpckOEb2/0LDFfToQ==", 834 | "requires": { 835 | "ansi-regex": "^3.0.0", 836 | "wcwidth": ">=1.0.1" 837 | } 838 | }, 839 | "ecc-jsbn": { 840 | "version": "0.1.2", 841 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 842 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 843 | "requires": { 844 | "jsbn": "~0.1.0", 845 | "safer-buffer": "^2.1.0" 846 | } 847 | }, 848 | "ee-first": { 849 | "version": "1.1.1", 850 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 851 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 852 | }, 853 | "ejs": { 854 | "version": "2.6.2", 855 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", 856 | "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" 857 | }, 858 | "encodeurl": { 859 | "version": "1.0.2", 860 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 861 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 862 | }, 863 | "end-of-stream": { 864 | "version": "1.4.1", 865 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 866 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 867 | "optional": true, 868 | "requires": { 869 | "once": "^1.4.0" 870 | } 871 | }, 872 | "error-ex": { 873 | "version": "1.3.2", 874 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 875 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 876 | "requires": { 877 | "is-arrayish": "^0.2.1" 878 | } 879 | }, 880 | "es-abstract": { 881 | "version": "1.13.0", 882 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", 883 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", 884 | "dev": true, 885 | "requires": { 886 | "es-to-primitive": "^1.2.0", 887 | "function-bind": "^1.1.1", 888 | "has": "^1.0.3", 889 | "is-callable": "^1.1.4", 890 | "is-regex": "^1.0.4", 891 | "object-keys": "^1.0.12" 892 | } 893 | }, 894 | "es-to-primitive": { 895 | "version": "1.2.0", 896 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", 897 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", 898 | "dev": true, 899 | "requires": { 900 | "is-callable": "^1.1.4", 901 | "is-date-object": "^1.0.1", 902 | "is-symbol": "^1.0.2" 903 | } 904 | }, 905 | "es5-ext": { 906 | "version": "0.10.50", 907 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", 908 | "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", 909 | "dev": true, 910 | "requires": { 911 | "es6-iterator": "~2.0.3", 912 | "es6-symbol": "~3.1.1", 913 | "next-tick": "^1.0.0" 914 | } 915 | }, 916 | "es6-iterator": { 917 | "version": "2.0.3", 918 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 919 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 920 | "dev": true, 921 | "requires": { 922 | "d": "1", 923 | "es5-ext": "^0.10.35", 924 | "es6-symbol": "^3.1.1" 925 | } 926 | }, 927 | "es6-map": { 928 | "version": "0.1.5", 929 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 930 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 931 | "dev": true, 932 | "requires": { 933 | "d": "1", 934 | "es5-ext": "~0.10.14", 935 | "es6-iterator": "~2.0.1", 936 | "es6-set": "~0.1.5", 937 | "es6-symbol": "~3.1.1", 938 | "event-emitter": "~0.3.5" 939 | } 940 | }, 941 | "es6-promise": { 942 | "version": "4.2.8", 943 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 944 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 945 | }, 946 | "es6-set": { 947 | "version": "0.1.5", 948 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 949 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 950 | "dev": true, 951 | "requires": { 952 | "d": "1", 953 | "es5-ext": "~0.10.14", 954 | "es6-iterator": "~2.0.1", 955 | "es6-symbol": "3.1.1", 956 | "event-emitter": "~0.3.5" 957 | } 958 | }, 959 | "es6-symbol": { 960 | "version": "3.1.1", 961 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 962 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 963 | "dev": true, 964 | "requires": { 965 | "d": "1", 966 | "es5-ext": "~0.10.14" 967 | } 968 | }, 969 | "es6-weak-map": { 970 | "version": "2.0.3", 971 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", 972 | "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", 973 | "dev": true, 974 | "requires": { 975 | "d": "1", 976 | "es5-ext": "^0.10.46", 977 | "es6-iterator": "^2.0.3", 978 | "es6-symbol": "^3.1.1" 979 | } 980 | }, 981 | "escape-html": { 982 | "version": "1.0.3", 983 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 984 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 985 | }, 986 | "escape-string-regexp": { 987 | "version": "1.0.5", 988 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 989 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 990 | }, 991 | "escope": { 992 | "version": "3.6.0", 993 | "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", 994 | "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", 995 | "dev": true, 996 | "requires": { 997 | "es6-map": "^0.1.3", 998 | "es6-weak-map": "^2.0.1", 999 | "esrecurse": "^4.1.0", 1000 | "estraverse": "^4.1.1" 1001 | } 1002 | }, 1003 | "eslint": { 1004 | "version": "3.19.0", 1005 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-3.19.0.tgz", 1006 | "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", 1007 | "dev": true, 1008 | "requires": { 1009 | "babel-code-frame": "^6.16.0", 1010 | "chalk": "^1.1.3", 1011 | "concat-stream": "^1.5.2", 1012 | "debug": "^2.1.1", 1013 | "doctrine": "^2.0.0", 1014 | "escope": "^3.6.0", 1015 | "espree": "^3.4.0", 1016 | "esquery": "^1.0.0", 1017 | "estraverse": "^4.2.0", 1018 | "esutils": "^2.0.2", 1019 | "file-entry-cache": "^2.0.0", 1020 | "glob": "^7.0.3", 1021 | "globals": "^9.14.0", 1022 | "ignore": "^3.2.0", 1023 | "imurmurhash": "^0.1.4", 1024 | "inquirer": "^0.12.0", 1025 | "is-my-json-valid": "^2.10.0", 1026 | "is-resolvable": "^1.0.0", 1027 | "js-yaml": "^3.5.1", 1028 | "json-stable-stringify": "^1.0.0", 1029 | "levn": "^0.3.0", 1030 | "lodash": "^4.0.0", 1031 | "mkdirp": "^0.5.0", 1032 | "natural-compare": "^1.4.0", 1033 | "optionator": "^0.8.2", 1034 | "path-is-inside": "^1.0.1", 1035 | "pluralize": "^1.2.1", 1036 | "progress": "^1.1.8", 1037 | "require-uncached": "^1.0.2", 1038 | "shelljs": "^0.7.5", 1039 | "strip-bom": "^3.0.0", 1040 | "strip-json-comments": "~2.0.1", 1041 | "table": "^3.7.8", 1042 | "text-table": "~0.2.0", 1043 | "user-home": "^2.0.0" 1044 | }, 1045 | "dependencies": { 1046 | "ansi-regex": { 1047 | "version": "2.1.1", 1048 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1049 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1050 | "dev": true 1051 | }, 1052 | "ansi-styles": { 1053 | "version": "2.2.1", 1054 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 1055 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 1056 | "dev": true 1057 | }, 1058 | "chalk": { 1059 | "version": "1.1.3", 1060 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1061 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1062 | "dev": true, 1063 | "requires": { 1064 | "ansi-styles": "^2.2.1", 1065 | "escape-string-regexp": "^1.0.2", 1066 | "has-ansi": "^2.0.0", 1067 | "strip-ansi": "^3.0.0", 1068 | "supports-color": "^2.0.0" 1069 | } 1070 | }, 1071 | "strip-ansi": { 1072 | "version": "3.0.1", 1073 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1074 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1075 | "dev": true, 1076 | "requires": { 1077 | "ansi-regex": "^2.0.0" 1078 | } 1079 | }, 1080 | "strip-bom": { 1081 | "version": "3.0.0", 1082 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1083 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 1084 | "dev": true 1085 | }, 1086 | "supports-color": { 1087 | "version": "2.0.0", 1088 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1089 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1090 | "dev": true 1091 | } 1092 | } 1093 | }, 1094 | "eslint-config-standard": { 1095 | "version": "10.2.1", 1096 | "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", 1097 | "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", 1098 | "dev": true 1099 | }, 1100 | "eslint-config-standard-jsx": { 1101 | "version": "4.0.2", 1102 | "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz", 1103 | "integrity": "sha512-F8fRh2WFnTek7dZH9ZaE0PCBwdVGkwVWZmizla/DDNOmg7Tx6B/IlK5+oYpiX29jpu73LszeJj5i1axEZv6VMw==", 1104 | "dev": true 1105 | }, 1106 | "eslint-import-resolver-node": { 1107 | "version": "0.2.3", 1108 | "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz", 1109 | "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", 1110 | "dev": true, 1111 | "requires": { 1112 | "debug": "^2.2.0", 1113 | "object-assign": "^4.0.1", 1114 | "resolve": "^1.1.6" 1115 | } 1116 | }, 1117 | "eslint-module-utils": { 1118 | "version": "2.4.0", 1119 | "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.0.tgz", 1120 | "integrity": "sha512-14tltLm38Eu3zS+mt0KvILC3q8jyIAH518MlG+HO0p+yK885Lb1UHTY/UgR91eOyGdmxAPb+OLoW4znqIT6Ndw==", 1121 | "dev": true, 1122 | "requires": { 1123 | "debug": "^2.6.8", 1124 | "pkg-dir": "^2.0.0" 1125 | } 1126 | }, 1127 | "eslint-plugin-import": { 1128 | "version": "2.2.0", 1129 | "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.2.0.tgz", 1130 | "integrity": "sha1-crowb60wXWfEgWNIpGmaQimsi04=", 1131 | "dev": true, 1132 | "requires": { 1133 | "builtin-modules": "^1.1.1", 1134 | "contains-path": "^0.1.0", 1135 | "debug": "^2.2.0", 1136 | "doctrine": "1.5.0", 1137 | "eslint-import-resolver-node": "^0.2.0", 1138 | "eslint-module-utils": "^2.0.0", 1139 | "has": "^1.0.1", 1140 | "lodash.cond": "^4.3.0", 1141 | "minimatch": "^3.0.3", 1142 | "pkg-up": "^1.0.0" 1143 | }, 1144 | "dependencies": { 1145 | "doctrine": { 1146 | "version": "1.5.0", 1147 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 1148 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 1149 | "dev": true, 1150 | "requires": { 1151 | "esutils": "^2.0.2", 1152 | "isarray": "^1.0.0" 1153 | } 1154 | } 1155 | } 1156 | }, 1157 | "eslint-plugin-node": { 1158 | "version": "4.2.3", 1159 | "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-4.2.3.tgz", 1160 | "integrity": "sha512-vIUQPuwbVYdz/CYnlTLsJrRy7iXHQjdEe5wz0XhhdTym3IInM/zZLlPf9nZ2mThsH0QcsieCOWs2vOeCy/22LQ==", 1161 | "dev": true, 1162 | "requires": { 1163 | "ignore": "^3.0.11", 1164 | "minimatch": "^3.0.2", 1165 | "object-assign": "^4.0.1", 1166 | "resolve": "^1.1.7", 1167 | "semver": "5.3.0" 1168 | }, 1169 | "dependencies": { 1170 | "semver": { 1171 | "version": "5.3.0", 1172 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1173 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", 1174 | "dev": true 1175 | } 1176 | } 1177 | }, 1178 | "eslint-plugin-promise": { 1179 | "version": "3.5.0", 1180 | "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.5.0.tgz", 1181 | "integrity": "sha1-ePu2/+BHIBYnVp6FpsU3OvKmj8o=", 1182 | "dev": true 1183 | }, 1184 | "eslint-plugin-react": { 1185 | "version": "6.10.3", 1186 | "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz", 1187 | "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", 1188 | "dev": true, 1189 | "requires": { 1190 | "array.prototype.find": "^2.0.1", 1191 | "doctrine": "^1.2.2", 1192 | "has": "^1.0.1", 1193 | "jsx-ast-utils": "^1.3.4", 1194 | "object.assign": "^4.0.4" 1195 | }, 1196 | "dependencies": { 1197 | "doctrine": { 1198 | "version": "1.5.0", 1199 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", 1200 | "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", 1201 | "dev": true, 1202 | "requires": { 1203 | "esutils": "^2.0.2", 1204 | "isarray": "^1.0.0" 1205 | } 1206 | } 1207 | } 1208 | }, 1209 | "eslint-plugin-standard": { 1210 | "version": "3.0.1", 1211 | "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", 1212 | "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", 1213 | "dev": true 1214 | }, 1215 | "espree": { 1216 | "version": "3.5.4", 1217 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", 1218 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", 1219 | "dev": true, 1220 | "requires": { 1221 | "acorn": "^5.5.0", 1222 | "acorn-jsx": "^3.0.0" 1223 | } 1224 | }, 1225 | "esprima": { 1226 | "version": "4.0.1", 1227 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 1228 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 1229 | "dev": true 1230 | }, 1231 | "esquery": { 1232 | "version": "1.0.1", 1233 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 1234 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 1235 | "dev": true, 1236 | "requires": { 1237 | "estraverse": "^4.0.0" 1238 | } 1239 | }, 1240 | "esrecurse": { 1241 | "version": "4.2.1", 1242 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 1243 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 1244 | "dev": true, 1245 | "requires": { 1246 | "estraverse": "^4.1.0" 1247 | } 1248 | }, 1249 | "esri-extent": { 1250 | "version": "1.1.3", 1251 | "resolved": "https://registry.npmjs.org/esri-extent/-/esri-extent-1.1.3.tgz", 1252 | "integrity": "sha512-NimS0bZmeLwXOVwZ56JPx5gnVZ3pDW7FzqkbgXkBXA4Vy9jKiM8vIOd6uCjzZbg/hbN4qJvsKIelSfOp2EhSXg==", 1253 | "requires": { 1254 | "@types/geojson": "^7946.0.0", 1255 | "bbox2extent": "^1.0.1" 1256 | } 1257 | }, 1258 | "estraverse": { 1259 | "version": "4.2.0", 1260 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 1261 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", 1262 | "dev": true 1263 | }, 1264 | "esutils": { 1265 | "version": "2.0.2", 1266 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 1267 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 1268 | "dev": true 1269 | }, 1270 | "etag": { 1271 | "version": "1.8.1", 1272 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 1273 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 1274 | }, 1275 | "event-emitter": { 1276 | "version": "0.3.5", 1277 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 1278 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 1279 | "dev": true, 1280 | "requires": { 1281 | "d": "1", 1282 | "es5-ext": "~0.10.14" 1283 | } 1284 | }, 1285 | "exit-hook": { 1286 | "version": "1.1.1", 1287 | "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", 1288 | "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", 1289 | "dev": true 1290 | }, 1291 | "exit-on-epipe": { 1292 | "version": "1.0.1", 1293 | "resolved": "https://registry.npmjs.org/exit-on-epipe/-/exit-on-epipe-1.0.1.tgz", 1294 | "integrity": "sha512-h2z5mrROTxce56S+pnvAV890uu7ls7f1kEvVGJbw1OlFH3/mlJ5bkXu0KRyW94v37zzHPiUd55iLn3DA7TjWpw==" 1295 | }, 1296 | "expand-template": { 1297 | "version": "1.1.1", 1298 | "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.1.tgz", 1299 | "integrity": "sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg==", 1300 | "optional": true 1301 | }, 1302 | "express": { 1303 | "version": "4.17.1", 1304 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 1305 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 1306 | "requires": { 1307 | "accepts": "~1.3.7", 1308 | "array-flatten": "1.1.1", 1309 | "body-parser": "1.19.0", 1310 | "content-disposition": "0.5.3", 1311 | "content-type": "~1.0.4", 1312 | "cookie": "0.4.0", 1313 | "cookie-signature": "1.0.6", 1314 | "debug": "2.6.9", 1315 | "depd": "~1.1.2", 1316 | "encodeurl": "~1.0.2", 1317 | "escape-html": "~1.0.3", 1318 | "etag": "~1.8.1", 1319 | "finalhandler": "~1.1.2", 1320 | "fresh": "0.5.2", 1321 | "merge-descriptors": "1.0.1", 1322 | "methods": "~1.1.2", 1323 | "on-finished": "~2.3.0", 1324 | "parseurl": "~1.3.3", 1325 | "path-to-regexp": "0.1.7", 1326 | "proxy-addr": "~2.0.5", 1327 | "qs": "6.7.0", 1328 | "range-parser": "~1.2.1", 1329 | "safe-buffer": "5.1.2", 1330 | "send": "0.17.1", 1331 | "serve-static": "1.14.1", 1332 | "setprototypeof": "1.1.1", 1333 | "statuses": "~1.5.0", 1334 | "type-is": "~1.6.18", 1335 | "utils-merge": "1.0.1", 1336 | "vary": "~1.1.2" 1337 | }, 1338 | "dependencies": { 1339 | "qs": { 1340 | "version": "6.7.0", 1341 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 1342 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 1343 | } 1344 | } 1345 | }, 1346 | "extend": { 1347 | "version": "3.0.2", 1348 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 1349 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 1350 | }, 1351 | "extsprintf": { 1352 | "version": "1.3.0", 1353 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 1354 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 1355 | }, 1356 | "eyes": { 1357 | "version": "0.1.8", 1358 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 1359 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 1360 | }, 1361 | "farmhash": { 1362 | "version": "2.1.0", 1363 | "resolved": "https://registry.npmjs.org/farmhash/-/farmhash-2.1.0.tgz", 1364 | "integrity": "sha512-X2cdtc4AxiH3tVdJ/h87dOU22Ojt3JYruw3L0gAp/SJzHqUUoxMcYzX7wnVzSUeEj6CwzOwcY+v6vdfP0KVx2g==", 1365 | "optional": true, 1366 | "requires": { 1367 | "nan": "^2.10.0", 1368 | "prebuild-install": "^2.5.3" 1369 | } 1370 | }, 1371 | "fast-deep-equal": { 1372 | "version": "2.0.1", 1373 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 1374 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 1375 | }, 1376 | "fast-json-stable-stringify": { 1377 | "version": "2.0.0", 1378 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 1379 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 1380 | }, 1381 | "fast-levenshtein": { 1382 | "version": "2.0.6", 1383 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 1384 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 1385 | "dev": true 1386 | }, 1387 | "featureserver": { 1388 | "version": "2.18.0", 1389 | "resolved": "https://registry.npmjs.org/featureserver/-/featureserver-2.18.0.tgz", 1390 | "integrity": "sha512-Ab/IGILX3Y3/XTF33QnvlBv3m1ln/o7GejbNs7+hCnfhQ5XETeASyljJrln+kMBTSY8rX7cQGy5scK3GiqtpIQ==", 1391 | "requires": { 1392 | "@mapbox/geojsonhint": "^3.0.0", 1393 | "chalk": "^2.4.2", 1394 | "chroma-js": "^2.0.0", 1395 | "classybrew": "0.0.3", 1396 | "esri-extent": "^1.1.1", 1397 | "lodash": "^4.12.0", 1398 | "moment": "^2.13.0", 1399 | "terraformer-arcgis-parser": "^1.0.4", 1400 | "winnow": "^1.16.5" 1401 | } 1402 | }, 1403 | "figures": { 1404 | "version": "1.7.0", 1405 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 1406 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 1407 | "dev": true, 1408 | "requires": { 1409 | "escape-string-regexp": "^1.0.5", 1410 | "object-assign": "^4.1.0" 1411 | } 1412 | }, 1413 | "file-entry-cache": { 1414 | "version": "2.0.0", 1415 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 1416 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 1417 | "dev": true, 1418 | "requires": { 1419 | "flat-cache": "^1.2.1", 1420 | "object-assign": "^4.0.1" 1421 | } 1422 | }, 1423 | "finalhandler": { 1424 | "version": "1.1.2", 1425 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 1426 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 1427 | "requires": { 1428 | "debug": "2.6.9", 1429 | "encodeurl": "~1.0.2", 1430 | "escape-html": "~1.0.3", 1431 | "on-finished": "~2.3.0", 1432 | "parseurl": "~1.3.3", 1433 | "statuses": "~1.5.0", 1434 | "unpipe": "~1.0.0" 1435 | } 1436 | }, 1437 | "find-root": { 1438 | "version": "1.1.0", 1439 | "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", 1440 | "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", 1441 | "dev": true 1442 | }, 1443 | "find-up": { 1444 | "version": "1.1.2", 1445 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 1446 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 1447 | "requires": { 1448 | "path-exists": "^2.0.0", 1449 | "pinkie-promise": "^2.0.0" 1450 | } 1451 | }, 1452 | "flat-cache": { 1453 | "version": "1.3.4", 1454 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", 1455 | "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", 1456 | "dev": true, 1457 | "requires": { 1458 | "circular-json": "^0.3.1", 1459 | "graceful-fs": "^4.1.2", 1460 | "rimraf": "~2.6.2", 1461 | "write": "^0.2.1" 1462 | } 1463 | }, 1464 | "flora-errors": { 1465 | "version": "0.9.1", 1466 | "resolved": "https://registry.npmjs.org/flora-errors/-/flora-errors-0.9.1.tgz", 1467 | "integrity": "sha512-rjZGrqlBFox0g0FQbRyYSntkPW1HZhSqBKEndJ9Rc/R1kWURX/9m0vz5ue6Cj0xC/tnGMK5KpbP07m79uyooww==", 1468 | "requires": { 1469 | "has": "^1.0.1" 1470 | } 1471 | }, 1472 | "flora-sql-parser": { 1473 | "version": "0.9.3", 1474 | "resolved": "https://registry.npmjs.org/flora-sql-parser/-/flora-sql-parser-0.9.3.tgz", 1475 | "integrity": "sha512-FoEw89tHxKkftlH9aP7pdlJqWHVcteWM4KALOJ8Qrx5dHqNSNwgKUA99xi4ZTZCAXKfqwZ3mw9dYgAMs5/3Eeg==", 1476 | "requires": { 1477 | "flora-errors": "^0.9.1", 1478 | "has": "^1.0.3" 1479 | } 1480 | }, 1481 | "forever-agent": { 1482 | "version": "0.6.1", 1483 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1484 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 1485 | }, 1486 | "form-data": { 1487 | "version": "2.3.3", 1488 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 1489 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 1490 | "requires": { 1491 | "asynckit": "^0.4.0", 1492 | "combined-stream": "^1.0.6", 1493 | "mime-types": "^2.1.12" 1494 | } 1495 | }, 1496 | "forwarded": { 1497 | "version": "0.1.2", 1498 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1499 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1500 | }, 1501 | "frac": { 1502 | "version": "1.1.2", 1503 | "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", 1504 | "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==" 1505 | }, 1506 | "fresh": { 1507 | "version": "0.5.2", 1508 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1509 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1510 | }, 1511 | "fs-constants": { 1512 | "version": "1.0.0", 1513 | "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", 1514 | "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", 1515 | "optional": true 1516 | }, 1517 | "fs.realpath": { 1518 | "version": "1.0.0", 1519 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1520 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1521 | }, 1522 | "function-bind": { 1523 | "version": "1.1.1", 1524 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 1525 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 1526 | }, 1527 | "gauge": { 1528 | "version": "2.7.4", 1529 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 1530 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 1531 | "optional": true, 1532 | "requires": { 1533 | "aproba": "^1.0.3", 1534 | "console-control-strings": "^1.0.0", 1535 | "has-unicode": "^2.0.0", 1536 | "object-assign": "^4.1.0", 1537 | "signal-exit": "^3.0.0", 1538 | "string-width": "^1.0.1", 1539 | "strip-ansi": "^3.0.1", 1540 | "wide-align": "^1.1.0" 1541 | }, 1542 | "dependencies": { 1543 | "ansi-regex": { 1544 | "version": "2.1.1", 1545 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1546 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1547 | "optional": true 1548 | }, 1549 | "is-fullwidth-code-point": { 1550 | "version": "1.0.0", 1551 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1552 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1553 | "optional": true, 1554 | "requires": { 1555 | "number-is-nan": "^1.0.0" 1556 | } 1557 | }, 1558 | "string-width": { 1559 | "version": "1.0.2", 1560 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1561 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1562 | "optional": true, 1563 | "requires": { 1564 | "code-point-at": "^1.0.0", 1565 | "is-fullwidth-code-point": "^1.0.0", 1566 | "strip-ansi": "^3.0.0" 1567 | } 1568 | }, 1569 | "strip-ansi": { 1570 | "version": "3.0.1", 1571 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1572 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1573 | "optional": true, 1574 | "requires": { 1575 | "ansi-regex": "^2.0.0" 1576 | } 1577 | } 1578 | } 1579 | }, 1580 | "generate-function": { 1581 | "version": "2.3.1", 1582 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 1583 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 1584 | "dev": true, 1585 | "requires": { 1586 | "is-property": "^1.0.2" 1587 | } 1588 | }, 1589 | "generate-object-property": { 1590 | "version": "1.2.0", 1591 | "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", 1592 | "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", 1593 | "dev": true, 1594 | "requires": { 1595 | "is-property": "^1.0.0" 1596 | } 1597 | }, 1598 | "get-caller-file": { 1599 | "version": "1.0.3", 1600 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", 1601 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" 1602 | }, 1603 | "get-stdin": { 1604 | "version": "5.0.1", 1605 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", 1606 | "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", 1607 | "dev": true 1608 | }, 1609 | "getpass": { 1610 | "version": "0.1.7", 1611 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1612 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1613 | "requires": { 1614 | "assert-plus": "^1.0.0" 1615 | } 1616 | }, 1617 | "github-from-package": { 1618 | "version": "0.0.0", 1619 | "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", 1620 | "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", 1621 | "optional": true 1622 | }, 1623 | "glob": { 1624 | "version": "7.1.4", 1625 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 1626 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 1627 | "requires": { 1628 | "fs.realpath": "^1.0.0", 1629 | "inflight": "^1.0.4", 1630 | "inherits": "2", 1631 | "minimatch": "^3.0.4", 1632 | "once": "^1.3.0", 1633 | "path-is-absolute": "^1.0.0" 1634 | } 1635 | }, 1636 | "globals": { 1637 | "version": "9.18.0", 1638 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 1639 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", 1640 | "dev": true 1641 | }, 1642 | "graceful-fs": { 1643 | "version": "4.1.15", 1644 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 1645 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==" 1646 | }, 1647 | "har-schema": { 1648 | "version": "2.0.0", 1649 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1650 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1651 | }, 1652 | "har-validator": { 1653 | "version": "5.1.3", 1654 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 1655 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 1656 | "requires": { 1657 | "ajv": "^6.5.5", 1658 | "har-schema": "^2.0.0" 1659 | } 1660 | }, 1661 | "has": { 1662 | "version": "1.0.3", 1663 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 1664 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 1665 | "requires": { 1666 | "function-bind": "^1.1.1" 1667 | } 1668 | }, 1669 | "has-ansi": { 1670 | "version": "2.0.0", 1671 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1672 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1673 | "dev": true, 1674 | "requires": { 1675 | "ansi-regex": "^2.0.0" 1676 | }, 1677 | "dependencies": { 1678 | "ansi-regex": { 1679 | "version": "2.1.1", 1680 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1681 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1682 | "dev": true 1683 | } 1684 | } 1685 | }, 1686 | "has-color": { 1687 | "version": "0.1.7", 1688 | "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", 1689 | "integrity": "sha1-ZxRKUmDDT8PMpnfQQdr1L+e3iy8=" 1690 | }, 1691 | "has-flag": { 1692 | "version": "3.0.0", 1693 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1694 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1695 | }, 1696 | "has-symbols": { 1697 | "version": "1.0.0", 1698 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", 1699 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", 1700 | "dev": true 1701 | }, 1702 | "has-unicode": { 1703 | "version": "2.0.1", 1704 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1705 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 1706 | "optional": true 1707 | }, 1708 | "highland": { 1709 | "version": "3.0.0-beta.9", 1710 | "resolved": "https://registry.npmjs.org/highland/-/highland-3.0.0-beta.9.tgz", 1711 | "integrity": "sha512-623vry4wR8hSKY+ne+XHLndi7yw4vUPncCkkPiSAmv/EMDA4qZQoSy4EdV1tRiYbVnvwy04P12TyxQ9clujn5g==" 1712 | }, 1713 | "hosted-git-info": { 1714 | "version": "2.7.1", 1715 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", 1716 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==" 1717 | }, 1718 | "http-errors": { 1719 | "version": "1.7.2", 1720 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 1721 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 1722 | "requires": { 1723 | "depd": "~1.1.2", 1724 | "inherits": "2.0.3", 1725 | "setprototypeof": "1.1.1", 1726 | "statuses": ">= 1.5.0 < 2", 1727 | "toidentifier": "1.0.0" 1728 | } 1729 | }, 1730 | "http-signature": { 1731 | "version": "1.2.0", 1732 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1733 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1734 | "requires": { 1735 | "assert-plus": "^1.0.0", 1736 | "jsprim": "^1.2.2", 1737 | "sshpk": "^1.7.0" 1738 | } 1739 | }, 1740 | "iconv-lite": { 1741 | "version": "0.4.24", 1742 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 1743 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 1744 | "requires": { 1745 | "safer-buffer": ">= 2.1.2 < 3" 1746 | } 1747 | }, 1748 | "ignore": { 1749 | "version": "3.3.10", 1750 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", 1751 | "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", 1752 | "dev": true 1753 | }, 1754 | "imurmurhash": { 1755 | "version": "0.1.4", 1756 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1757 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 1758 | "dev": true 1759 | }, 1760 | "inflight": { 1761 | "version": "1.0.6", 1762 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1763 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1764 | "requires": { 1765 | "once": "^1.3.0", 1766 | "wrappy": "1" 1767 | } 1768 | }, 1769 | "inherits": { 1770 | "version": "2.0.3", 1771 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1772 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1773 | }, 1774 | "ini": { 1775 | "version": "1.3.5", 1776 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 1777 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", 1778 | "optional": true 1779 | }, 1780 | "inquirer": { 1781 | "version": "0.12.0", 1782 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-0.12.0.tgz", 1783 | "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", 1784 | "dev": true, 1785 | "requires": { 1786 | "ansi-escapes": "^1.1.0", 1787 | "ansi-regex": "^2.0.0", 1788 | "chalk": "^1.0.0", 1789 | "cli-cursor": "^1.0.1", 1790 | "cli-width": "^2.0.0", 1791 | "figures": "^1.3.5", 1792 | "lodash": "^4.3.0", 1793 | "readline2": "^1.0.1", 1794 | "run-async": "^0.1.0", 1795 | "rx-lite": "^3.1.2", 1796 | "string-width": "^1.0.1", 1797 | "strip-ansi": "^3.0.0", 1798 | "through": "^2.3.6" 1799 | }, 1800 | "dependencies": { 1801 | "ansi-regex": { 1802 | "version": "2.1.1", 1803 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 1804 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 1805 | "dev": true 1806 | }, 1807 | "ansi-styles": { 1808 | "version": "2.2.1", 1809 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 1810 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 1811 | "dev": true 1812 | }, 1813 | "chalk": { 1814 | "version": "1.1.3", 1815 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 1816 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 1817 | "dev": true, 1818 | "requires": { 1819 | "ansi-styles": "^2.2.1", 1820 | "escape-string-regexp": "^1.0.2", 1821 | "has-ansi": "^2.0.0", 1822 | "strip-ansi": "^3.0.0", 1823 | "supports-color": "^2.0.0" 1824 | } 1825 | }, 1826 | "is-fullwidth-code-point": { 1827 | "version": "1.0.0", 1828 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1829 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1830 | "dev": true, 1831 | "requires": { 1832 | "number-is-nan": "^1.0.0" 1833 | } 1834 | }, 1835 | "string-width": { 1836 | "version": "1.0.2", 1837 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1838 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1839 | "dev": true, 1840 | "requires": { 1841 | "code-point-at": "^1.0.0", 1842 | "is-fullwidth-code-point": "^1.0.0", 1843 | "strip-ansi": "^3.0.0" 1844 | } 1845 | }, 1846 | "strip-ansi": { 1847 | "version": "3.0.1", 1848 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1849 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1850 | "dev": true, 1851 | "requires": { 1852 | "ansi-regex": "^2.0.0" 1853 | } 1854 | }, 1855 | "supports-color": { 1856 | "version": "2.0.0", 1857 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1858 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 1859 | "dev": true 1860 | } 1861 | } 1862 | }, 1863 | "interpret": { 1864 | "version": "1.2.0", 1865 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", 1866 | "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", 1867 | "dev": true 1868 | }, 1869 | "invert-kv": { 1870 | "version": "1.0.0", 1871 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 1872 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 1873 | }, 1874 | "ipaddr.js": { 1875 | "version": "1.9.0", 1876 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 1877 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 1878 | }, 1879 | "is-arrayish": { 1880 | "version": "0.2.1", 1881 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1882 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1883 | }, 1884 | "is-buffer": { 1885 | "version": "2.0.3", 1886 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", 1887 | "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==" 1888 | }, 1889 | "is-callable": { 1890 | "version": "1.1.4", 1891 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 1892 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 1893 | "dev": true 1894 | }, 1895 | "is-date-object": { 1896 | "version": "1.0.1", 1897 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 1898 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 1899 | "dev": true 1900 | }, 1901 | "is-fullwidth-code-point": { 1902 | "version": "2.0.0", 1903 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1904 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1905 | }, 1906 | "is-my-ip-valid": { 1907 | "version": "1.0.0", 1908 | "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", 1909 | "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", 1910 | "dev": true 1911 | }, 1912 | "is-my-json-valid": { 1913 | "version": "2.20.0", 1914 | "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.20.0.tgz", 1915 | "integrity": "sha512-XTHBZSIIxNsIsZXg7XB5l8z/OBFosl1Wao4tXLpeC7eKU4Vm/kdop2azkPqULwnfGQjmeDIyey9g7afMMtdWAA==", 1916 | "dev": true, 1917 | "requires": { 1918 | "generate-function": "^2.0.0", 1919 | "generate-object-property": "^1.1.0", 1920 | "is-my-ip-valid": "^1.0.0", 1921 | "jsonpointer": "^4.0.0", 1922 | "xtend": "^4.0.0" 1923 | } 1924 | }, 1925 | "is-property": { 1926 | "version": "1.0.2", 1927 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 1928 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", 1929 | "dev": true 1930 | }, 1931 | "is-regex": { 1932 | "version": "1.0.4", 1933 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 1934 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 1935 | "dev": true, 1936 | "requires": { 1937 | "has": "^1.0.1" 1938 | } 1939 | }, 1940 | "is-resolvable": { 1941 | "version": "1.1.0", 1942 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1943 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", 1944 | "dev": true 1945 | }, 1946 | "is-symbol": { 1947 | "version": "1.0.2", 1948 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", 1949 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", 1950 | "dev": true, 1951 | "requires": { 1952 | "has-symbols": "^1.0.0" 1953 | } 1954 | }, 1955 | "is-typedarray": { 1956 | "version": "1.0.0", 1957 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1958 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1959 | }, 1960 | "is-utf8": { 1961 | "version": "0.2.1", 1962 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1963 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 1964 | }, 1965 | "isarray": { 1966 | "version": "1.0.0", 1967 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1968 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1969 | }, 1970 | "isstream": { 1971 | "version": "0.1.2", 1972 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1973 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1974 | }, 1975 | "js-tokens": { 1976 | "version": "3.0.2", 1977 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1978 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 1979 | "dev": true 1980 | }, 1981 | "js-yaml": { 1982 | "version": "3.13.1", 1983 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 1984 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 1985 | "dev": true, 1986 | "requires": { 1987 | "argparse": "^1.0.7", 1988 | "esprima": "^4.0.0" 1989 | } 1990 | }, 1991 | "jsbn": { 1992 | "version": "0.1.1", 1993 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1994 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 1995 | }, 1996 | "json-parse-better-errors": { 1997 | "version": "1.0.2", 1998 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 1999 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", 2000 | "dev": true 2001 | }, 2002 | "json-schema": { 2003 | "version": "0.2.3", 2004 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 2005 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 2006 | }, 2007 | "json-schema-traverse": { 2008 | "version": "0.4.1", 2009 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 2010 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 2011 | }, 2012 | "json-stable-stringify": { 2013 | "version": "1.0.1", 2014 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 2015 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 2016 | "dev": true, 2017 | "requires": { 2018 | "jsonify": "~0.0.0" 2019 | } 2020 | }, 2021 | "json-stringify-safe": { 2022 | "version": "5.0.1", 2023 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 2024 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 2025 | }, 2026 | "json5": { 2027 | "version": "1.0.1", 2028 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", 2029 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", 2030 | "requires": { 2031 | "minimist": "^1.2.0" 2032 | } 2033 | }, 2034 | "jsonify": { 2035 | "version": "0.0.0", 2036 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 2037 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", 2038 | "dev": true 2039 | }, 2040 | "jsonlint-lines": { 2041 | "version": "1.7.1", 2042 | "resolved": "https://registry.npmjs.org/jsonlint-lines/-/jsonlint-lines-1.7.1.tgz", 2043 | "integrity": "sha1-UH3mgNP7jEvhZBzFfW9nnynxeP8=", 2044 | "requires": { 2045 | "JSV": ">= 4.0.x", 2046 | "nomnom": ">= 1.5.x" 2047 | } 2048 | }, 2049 | "jsonpointer": { 2050 | "version": "4.0.1", 2051 | "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", 2052 | "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", 2053 | "dev": true 2054 | }, 2055 | "jsprim": { 2056 | "version": "1.4.1", 2057 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 2058 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 2059 | "requires": { 2060 | "assert-plus": "1.0.0", 2061 | "extsprintf": "1.3.0", 2062 | "json-schema": "0.2.3", 2063 | "verror": "1.10.0" 2064 | } 2065 | }, 2066 | "jsx-ast-utils": { 2067 | "version": "1.4.1", 2068 | "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz", 2069 | "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", 2070 | "dev": true 2071 | }, 2072 | "koop": { 2073 | "version": "3.12.2", 2074 | "resolved": "https://registry.npmjs.org/koop/-/koop-3.12.2.tgz", 2075 | "integrity": "sha512-MPa+dPQMYkjEHyVaL57Aw/KsLL/2F8QQx8piSeowVlm32y/WVWvrH7N2jct1S82Rd0pxcA5t884GBpwZSgEN/Q==", 2076 | "requires": { 2077 | "@koopjs/logger": "^2.0.2", 2078 | "body-parser": "^1.16.0", 2079 | "chalk": "^2.4.2", 2080 | "compression": "^1.7.4", 2081 | "config": "^3.0.0", 2082 | "cors": "^2.8.1", 2083 | "easy-table": "^1.1.1", 2084 | "ejs": "^2.3.3", 2085 | "express": "^4.14.1", 2086 | "koop-cache-memory": "^1.0.2", 2087 | "koop-localfs": "^1.1.1", 2088 | "koop-output-geoservices": "^2.0.0", 2089 | "lodash": "^4.17.10" 2090 | }, 2091 | "dependencies": { 2092 | "config": { 2093 | "version": "3.1.0", 2094 | "resolved": "https://registry.npmjs.org/config/-/config-3.1.0.tgz", 2095 | "integrity": "sha512-t6oDeNQbsIWa+D/KF4959TANzjSHLv1BA/hvL8tHEA3OUSWgBXELKaONSI6nr9oanbKs0DXonjOWLcrtZ3yTAA==", 2096 | "requires": { 2097 | "json5": "^1.0.1" 2098 | } 2099 | } 2100 | } 2101 | }, 2102 | "koop-cache-memory": { 2103 | "version": "1.1.0", 2104 | "resolved": "https://registry.npmjs.org/koop-cache-memory/-/koop-cache-memory-1.1.0.tgz", 2105 | "integrity": "sha1-0A7MF3a16/8YFAPD8MW+IKnwEzM=", 2106 | "requires": { 2107 | "highland": "^3.0.0-beta.2", 2108 | "lodash": "^4.17.4" 2109 | } 2110 | }, 2111 | "koop-localfs": { 2112 | "version": "1.1.2", 2113 | "resolved": "https://registry.npmjs.org/koop-localfs/-/koop-localfs-1.1.2.tgz", 2114 | "integrity": "sha512-72mmTTyAKR9Rhc0ckLQW9pg/cbibbVeHNIR4dBSfqkmnkhpzAowwf79+tS7U7xdwem4iZ1jjbG6xZpBsakX5Pw==", 2115 | "requires": { 2116 | "config": "^1.20.1", 2117 | "highland": "^2.7.4", 2118 | "mkdirp": "^0.5.1", 2119 | "rimraf": "^2.5.2" 2120 | }, 2121 | "dependencies": { 2122 | "highland": { 2123 | "version": "2.13.4", 2124 | "resolved": "https://registry.npmjs.org/highland/-/highland-2.13.4.tgz", 2125 | "integrity": "sha512-r+YlbnBhCTcrcVzBpzPcrvB0llVjeDWKuXSZVuNBe5WgQJtN2xGUUMZC9WzHCntNIx0rskVernxLoFJUCkmb/Q==", 2126 | "requires": { 2127 | "util-deprecate": "^1.0.2" 2128 | } 2129 | } 2130 | } 2131 | }, 2132 | "koop-output-geoservices": { 2133 | "version": "2.0.0", 2134 | "resolved": "https://registry.npmjs.org/koop-output-geoservices/-/koop-output-geoservices-2.0.0.tgz", 2135 | "integrity": "sha512-Z2nHtpQrF6TV6US8QigznVLl73yn3iMhrBEfDnm4PIuUFrigSElUt0arsD5caLSAPxLaZYfhjHuEtk4r8XdqsA==", 2136 | "requires": { 2137 | "featureserver": "^2.15.0" 2138 | } 2139 | }, 2140 | "lcid": { 2141 | "version": "1.0.0", 2142 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 2143 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 2144 | "requires": { 2145 | "invert-kv": "^1.0.0" 2146 | } 2147 | }, 2148 | "levn": { 2149 | "version": "0.3.0", 2150 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 2151 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 2152 | "dev": true, 2153 | "requires": { 2154 | "prelude-ls": "~1.1.2", 2155 | "type-check": "~0.3.2" 2156 | } 2157 | }, 2158 | "load-json-file": { 2159 | "version": "1.1.0", 2160 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 2161 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 2162 | "requires": { 2163 | "graceful-fs": "^4.1.2", 2164 | "parse-json": "^2.2.0", 2165 | "pify": "^2.0.0", 2166 | "pinkie-promise": "^2.0.0", 2167 | "strip-bom": "^2.0.0" 2168 | } 2169 | }, 2170 | "locate-path": { 2171 | "version": "2.0.0", 2172 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 2173 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 2174 | "dev": true, 2175 | "requires": { 2176 | "p-locate": "^2.0.0", 2177 | "path-exists": "^3.0.0" 2178 | }, 2179 | "dependencies": { 2180 | "path-exists": { 2181 | "version": "3.0.0", 2182 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 2183 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 2184 | "dev": true 2185 | } 2186 | } 2187 | }, 2188 | "lodash": { 2189 | "version": "4.17.19", 2190 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", 2191 | "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" 2192 | }, 2193 | "lodash.assign": { 2194 | "version": "4.2.0", 2195 | "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", 2196 | "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" 2197 | }, 2198 | "lodash.cond": { 2199 | "version": "4.5.2", 2200 | "resolved": "https://registry.npmjs.org/lodash.cond/-/lodash.cond-4.5.2.tgz", 2201 | "integrity": "sha1-9HGh2khr5g9quVXRcRVSPdHSVdU=", 2202 | "dev": true 2203 | }, 2204 | "media-typer": { 2205 | "version": "0.3.0", 2206 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2207 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2208 | }, 2209 | "merge-descriptors": { 2210 | "version": "1.0.1", 2211 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2212 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2213 | }, 2214 | "methods": { 2215 | "version": "1.1.2", 2216 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2217 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2218 | }, 2219 | "mgrs": { 2220 | "version": "1.0.0", 2221 | "resolved": "https://registry.npmjs.org/mgrs/-/mgrs-1.0.0.tgz", 2222 | "integrity": "sha1-+5FYjnjJACVnI5XLQLJffNatGCk=" 2223 | }, 2224 | "mime": { 2225 | "version": "1.6.0", 2226 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 2227 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 2228 | }, 2229 | "mime-db": { 2230 | "version": "1.40.0", 2231 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 2232 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 2233 | }, 2234 | "mime-types": { 2235 | "version": "2.1.24", 2236 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 2237 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 2238 | "requires": { 2239 | "mime-db": "1.40.0" 2240 | } 2241 | }, 2242 | "mimic-response": { 2243 | "version": "1.0.1", 2244 | "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", 2245 | "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", 2246 | "optional": true 2247 | }, 2248 | "minimatch": { 2249 | "version": "3.0.4", 2250 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2251 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2252 | "requires": { 2253 | "brace-expansion": "^1.1.7" 2254 | } 2255 | }, 2256 | "minimist": { 2257 | "version": "1.2.0", 2258 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2259 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 2260 | }, 2261 | "mkdirp": { 2262 | "version": "0.5.1", 2263 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2264 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2265 | "requires": { 2266 | "minimist": "0.0.8" 2267 | }, 2268 | "dependencies": { 2269 | "minimist": { 2270 | "version": "0.0.8", 2271 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2272 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 2273 | } 2274 | } 2275 | }, 2276 | "moment": { 2277 | "version": "2.24.0", 2278 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", 2279 | "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" 2280 | }, 2281 | "ms": { 2282 | "version": "2.0.0", 2283 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2284 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2285 | }, 2286 | "mute-stream": { 2287 | "version": "0.0.5", 2288 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.5.tgz", 2289 | "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", 2290 | "dev": true 2291 | }, 2292 | "nan": { 2293 | "version": "2.14.0", 2294 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 2295 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==", 2296 | "optional": true 2297 | }, 2298 | "natural-compare": { 2299 | "version": "1.4.0", 2300 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 2301 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 2302 | "dev": true 2303 | }, 2304 | "negotiator": { 2305 | "version": "0.6.2", 2306 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 2307 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 2308 | }, 2309 | "next-tick": { 2310 | "version": "1.0.0", 2311 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", 2312 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", 2313 | "dev": true 2314 | }, 2315 | "ngeohash": { 2316 | "version": "0.6.3", 2317 | "resolved": "https://registry.npmjs.org/ngeohash/-/ngeohash-0.6.3.tgz", 2318 | "integrity": "sha512-kltF0cOxgx1AbmVzKxYZaoB0aj7mOxZeHaerEtQV0YaqnkXNq26WWqMmJ6lTqShYxVRWZ/mwvvTrNeOwdslWiw==" 2319 | }, 2320 | "node-abi": { 2321 | "version": "2.9.0", 2322 | "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.9.0.tgz", 2323 | "integrity": "sha512-jmEOvv0eanWjhX8dX1pmjb7oJl1U1oR4FOh0b2GnvALwSYoOdU7sj+kLDSAyjo4pfC9aj/IxkloxdLJQhSSQBA==", 2324 | "optional": true, 2325 | "requires": { 2326 | "semver": "^5.4.1" 2327 | } 2328 | }, 2329 | "nomnom": { 2330 | "version": "1.8.1", 2331 | "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.8.1.tgz", 2332 | "integrity": "sha1-IVH3Ikcrp55Qp2/BJbuMjy5Nwqc=", 2333 | "requires": { 2334 | "chalk": "~0.4.0", 2335 | "underscore": "~1.6.0" 2336 | }, 2337 | "dependencies": { 2338 | "ansi-styles": { 2339 | "version": "1.0.0", 2340 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", 2341 | "integrity": "sha1-yxAt8cVvUSPquLZ817mAJ6AnkXg=" 2342 | }, 2343 | "chalk": { 2344 | "version": "0.4.0", 2345 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", 2346 | "integrity": "sha1-UZmj3c0MHv4jvAjBsCewYXbgxk8=", 2347 | "requires": { 2348 | "ansi-styles": "~1.0.0", 2349 | "has-color": "~0.1.0", 2350 | "strip-ansi": "~0.1.0" 2351 | } 2352 | } 2353 | } 2354 | }, 2355 | "noop-logger": { 2356 | "version": "0.1.1", 2357 | "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", 2358 | "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", 2359 | "optional": true 2360 | }, 2361 | "normalize-package-data": { 2362 | "version": "2.5.0", 2363 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 2364 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 2365 | "requires": { 2366 | "hosted-git-info": "^2.1.4", 2367 | "resolve": "^1.10.0", 2368 | "semver": "2 || 3 || 4 || 5", 2369 | "validate-npm-package-license": "^3.0.1" 2370 | } 2371 | }, 2372 | "npmlog": { 2373 | "version": "4.1.2", 2374 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 2375 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 2376 | "optional": true, 2377 | "requires": { 2378 | "are-we-there-yet": "~1.1.2", 2379 | "console-control-strings": "~1.1.0", 2380 | "gauge": "~2.7.3", 2381 | "set-blocking": "~2.0.0" 2382 | } 2383 | }, 2384 | "number-is-nan": { 2385 | "version": "1.0.1", 2386 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2387 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2388 | }, 2389 | "oauth-sign": { 2390 | "version": "0.9.0", 2391 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 2392 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 2393 | }, 2394 | "object-assign": { 2395 | "version": "4.1.1", 2396 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2397 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2398 | }, 2399 | "object-keys": { 2400 | "version": "1.1.1", 2401 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 2402 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 2403 | "dev": true 2404 | }, 2405 | "object.assign": { 2406 | "version": "4.1.0", 2407 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 2408 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 2409 | "dev": true, 2410 | "requires": { 2411 | "define-properties": "^1.1.2", 2412 | "function-bind": "^1.1.1", 2413 | "has-symbols": "^1.0.0", 2414 | "object-keys": "^1.0.11" 2415 | } 2416 | }, 2417 | "on-finished": { 2418 | "version": "2.3.0", 2419 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2420 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2421 | "requires": { 2422 | "ee-first": "1.1.1" 2423 | } 2424 | }, 2425 | "on-headers": { 2426 | "version": "1.0.2", 2427 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", 2428 | "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" 2429 | }, 2430 | "once": { 2431 | "version": "1.4.0", 2432 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2433 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2434 | "requires": { 2435 | "wrappy": "1" 2436 | } 2437 | }, 2438 | "onetime": { 2439 | "version": "1.1.0", 2440 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", 2441 | "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", 2442 | "dev": true 2443 | }, 2444 | "optionator": { 2445 | "version": "0.8.2", 2446 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 2447 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 2448 | "dev": true, 2449 | "requires": { 2450 | "deep-is": "~0.1.3", 2451 | "fast-levenshtein": "~2.0.4", 2452 | "levn": "~0.3.0", 2453 | "prelude-ls": "~1.1.2", 2454 | "type-check": "~0.3.2", 2455 | "wordwrap": "~1.0.0" 2456 | } 2457 | }, 2458 | "os-homedir": { 2459 | "version": "1.0.2", 2460 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 2461 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 2462 | }, 2463 | "os-locale": { 2464 | "version": "1.4.0", 2465 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", 2466 | "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", 2467 | "requires": { 2468 | "lcid": "^1.0.0" 2469 | } 2470 | }, 2471 | "p-limit": { 2472 | "version": "1.3.0", 2473 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 2474 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 2475 | "dev": true, 2476 | "requires": { 2477 | "p-try": "^1.0.0" 2478 | } 2479 | }, 2480 | "p-locate": { 2481 | "version": "2.0.0", 2482 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 2483 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 2484 | "dev": true, 2485 | "requires": { 2486 | "p-limit": "^1.1.0" 2487 | } 2488 | }, 2489 | "p-try": { 2490 | "version": "1.0.0", 2491 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 2492 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", 2493 | "dev": true 2494 | }, 2495 | "parse-json": { 2496 | "version": "2.2.0", 2497 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 2498 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 2499 | "requires": { 2500 | "error-ex": "^1.2.0" 2501 | } 2502 | }, 2503 | "parseurl": { 2504 | "version": "1.3.3", 2505 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 2506 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 2507 | }, 2508 | "path-exists": { 2509 | "version": "2.1.0", 2510 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 2511 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 2512 | "requires": { 2513 | "pinkie-promise": "^2.0.0" 2514 | } 2515 | }, 2516 | "path-is-absolute": { 2517 | "version": "1.0.1", 2518 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2519 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2520 | }, 2521 | "path-is-inside": { 2522 | "version": "1.0.2", 2523 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 2524 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 2525 | "dev": true 2526 | }, 2527 | "path-parse": { 2528 | "version": "1.0.6", 2529 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 2530 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" 2531 | }, 2532 | "path-to-regexp": { 2533 | "version": "0.1.7", 2534 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2535 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2536 | }, 2537 | "path-type": { 2538 | "version": "1.1.0", 2539 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 2540 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 2541 | "requires": { 2542 | "graceful-fs": "^4.1.2", 2543 | "pify": "^2.0.0", 2544 | "pinkie-promise": "^2.0.0" 2545 | } 2546 | }, 2547 | "performance-now": { 2548 | "version": "2.1.0", 2549 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2550 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2551 | }, 2552 | "pify": { 2553 | "version": "2.3.0", 2554 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2555 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 2556 | }, 2557 | "pinkie": { 2558 | "version": "2.0.4", 2559 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2560 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 2561 | }, 2562 | "pinkie-promise": { 2563 | "version": "2.0.1", 2564 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2565 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2566 | "requires": { 2567 | "pinkie": "^2.0.0" 2568 | } 2569 | }, 2570 | "pkg-conf": { 2571 | "version": "2.1.0", 2572 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", 2573 | "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", 2574 | "dev": true, 2575 | "requires": { 2576 | "find-up": "^2.0.0", 2577 | "load-json-file": "^4.0.0" 2578 | }, 2579 | "dependencies": { 2580 | "find-up": { 2581 | "version": "2.1.0", 2582 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 2583 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 2584 | "dev": true, 2585 | "requires": { 2586 | "locate-path": "^2.0.0" 2587 | } 2588 | }, 2589 | "load-json-file": { 2590 | "version": "4.0.0", 2591 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 2592 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 2593 | "dev": true, 2594 | "requires": { 2595 | "graceful-fs": "^4.1.2", 2596 | "parse-json": "^4.0.0", 2597 | "pify": "^3.0.0", 2598 | "strip-bom": "^3.0.0" 2599 | } 2600 | }, 2601 | "parse-json": { 2602 | "version": "4.0.0", 2603 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 2604 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 2605 | "dev": true, 2606 | "requires": { 2607 | "error-ex": "^1.3.1", 2608 | "json-parse-better-errors": "^1.0.1" 2609 | } 2610 | }, 2611 | "pify": { 2612 | "version": "3.0.0", 2613 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 2614 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", 2615 | "dev": true 2616 | }, 2617 | "strip-bom": { 2618 | "version": "3.0.0", 2619 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 2620 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", 2621 | "dev": true 2622 | } 2623 | } 2624 | }, 2625 | "pkg-config": { 2626 | "version": "1.1.1", 2627 | "resolved": "https://registry.npmjs.org/pkg-config/-/pkg-config-1.1.1.tgz", 2628 | "integrity": "sha1-VX7yLXPaPIg3EHdmxS6tq94pj+Q=", 2629 | "dev": true, 2630 | "requires": { 2631 | "debug-log": "^1.0.0", 2632 | "find-root": "^1.0.0", 2633 | "xtend": "^4.0.1" 2634 | } 2635 | }, 2636 | "pkg-dir": { 2637 | "version": "2.0.0", 2638 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", 2639 | "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", 2640 | "dev": true, 2641 | "requires": { 2642 | "find-up": "^2.1.0" 2643 | }, 2644 | "dependencies": { 2645 | "find-up": { 2646 | "version": "2.1.0", 2647 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 2648 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 2649 | "dev": true, 2650 | "requires": { 2651 | "locate-path": "^2.0.0" 2652 | } 2653 | } 2654 | } 2655 | }, 2656 | "pkg-up": { 2657 | "version": "1.0.0", 2658 | "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-1.0.0.tgz", 2659 | "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", 2660 | "dev": true, 2661 | "requires": { 2662 | "find-up": "^1.0.0" 2663 | } 2664 | }, 2665 | "pluralize": { 2666 | "version": "1.2.1", 2667 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-1.2.1.tgz", 2668 | "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", 2669 | "dev": true 2670 | }, 2671 | "prebuild-install": { 2672 | "version": "2.5.3", 2673 | "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.5.3.tgz", 2674 | "integrity": "sha512-/rI36cN2g7vDQnKWN8Uzupi++KjyqS9iS+/fpwG4Ea8d0Pip0PQ5bshUNzVwt+/D2MRfhVAplYMMvWLqWrCF/g==", 2675 | "optional": true, 2676 | "requires": { 2677 | "detect-libc": "^1.0.3", 2678 | "expand-template": "^1.0.2", 2679 | "github-from-package": "0.0.0", 2680 | "minimist": "^1.2.0", 2681 | "mkdirp": "^0.5.1", 2682 | "node-abi": "^2.2.0", 2683 | "noop-logger": "^0.1.1", 2684 | "npmlog": "^4.0.1", 2685 | "os-homedir": "^1.0.1", 2686 | "pump": "^2.0.1", 2687 | "rc": "^1.1.6", 2688 | "simple-get": "^2.7.0", 2689 | "tar-fs": "^1.13.0", 2690 | "tunnel-agent": "^0.6.0", 2691 | "which-pm-runs": "^1.0.0" 2692 | } 2693 | }, 2694 | "prelude-ls": { 2695 | "version": "1.1.2", 2696 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 2697 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 2698 | "dev": true 2699 | }, 2700 | "printj": { 2701 | "version": "1.1.2", 2702 | "resolved": "https://registry.npmjs.org/printj/-/printj-1.1.2.tgz", 2703 | "integrity": "sha512-zA2SmoLaxZyArQTOPj5LXecR+RagfPSU5Kw1qP+jkWeNlrq+eJZyY2oS68SU1Z/7/myXM4lo9716laOFAVStCQ==" 2704 | }, 2705 | "process-nextick-args": { 2706 | "version": "2.0.1", 2707 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 2708 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 2709 | }, 2710 | "progress": { 2711 | "version": "1.1.8", 2712 | "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", 2713 | "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", 2714 | "dev": true 2715 | }, 2716 | "proj4": { 2717 | "version": "2.5.0", 2718 | "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.5.0.tgz", 2719 | "integrity": "sha512-XZTRT7OPdLzgvtTqL8DG2cEj8lYdovztOwiwpwRSYayOty5Ipf3H68dh/fiL+HKDEyetmQSMhkkMGiJoyziz3w==", 2720 | "requires": { 2721 | "mgrs": "1.0.0", 2722 | "wkt-parser": "^1.2.0" 2723 | } 2724 | }, 2725 | "proxy-addr": { 2726 | "version": "2.0.5", 2727 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 2728 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 2729 | "requires": { 2730 | "forwarded": "~0.1.2", 2731 | "ipaddr.js": "1.9.0" 2732 | } 2733 | }, 2734 | "psl": { 2735 | "version": "1.1.33", 2736 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.33.tgz", 2737 | "integrity": "sha512-LTDP2uSrsc7XCb5lO7A8BI1qYxRe/8EqlRvMeEl6rsnYAqDOl8xHR+8lSAIVfrNaSAlTPTNOCgNjWcoUL3AZsw==" 2738 | }, 2739 | "pump": { 2740 | "version": "2.0.1", 2741 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 2742 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 2743 | "optional": true, 2744 | "requires": { 2745 | "end-of-stream": "^1.1.0", 2746 | "once": "^1.3.1" 2747 | } 2748 | }, 2749 | "punycode": { 2750 | "version": "2.1.1", 2751 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 2752 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 2753 | }, 2754 | "qs": { 2755 | "version": "6.5.2", 2756 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2757 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2758 | }, 2759 | "range-parser": { 2760 | "version": "1.2.1", 2761 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 2762 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 2763 | }, 2764 | "raw-body": { 2765 | "version": "2.4.0", 2766 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 2767 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 2768 | "requires": { 2769 | "bytes": "3.1.0", 2770 | "http-errors": "1.7.2", 2771 | "iconv-lite": "0.4.24", 2772 | "unpipe": "1.0.0" 2773 | } 2774 | }, 2775 | "rc": { 2776 | "version": "1.2.8", 2777 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 2778 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 2779 | "optional": true, 2780 | "requires": { 2781 | "deep-extend": "^0.6.0", 2782 | "ini": "~1.3.0", 2783 | "minimist": "^1.2.0", 2784 | "strip-json-comments": "~2.0.1" 2785 | } 2786 | }, 2787 | "read-pkg": { 2788 | "version": "1.1.0", 2789 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 2790 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 2791 | "requires": { 2792 | "load-json-file": "^1.0.0", 2793 | "normalize-package-data": "^2.3.2", 2794 | "path-type": "^1.0.0" 2795 | } 2796 | }, 2797 | "read-pkg-up": { 2798 | "version": "1.0.1", 2799 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 2800 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 2801 | "requires": { 2802 | "find-up": "^1.0.0", 2803 | "read-pkg": "^1.0.0" 2804 | } 2805 | }, 2806 | "readable-stream": { 2807 | "version": "2.3.6", 2808 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2809 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2810 | "requires": { 2811 | "core-util-is": "~1.0.0", 2812 | "inherits": "~2.0.3", 2813 | "isarray": "~1.0.0", 2814 | "process-nextick-args": "~2.0.0", 2815 | "safe-buffer": "~5.1.1", 2816 | "string_decoder": "~1.1.1", 2817 | "util-deprecate": "~1.0.1" 2818 | } 2819 | }, 2820 | "readline2": { 2821 | "version": "1.0.1", 2822 | "resolved": "https://registry.npmjs.org/readline2/-/readline2-1.0.1.tgz", 2823 | "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", 2824 | "dev": true, 2825 | "requires": { 2826 | "code-point-at": "^1.0.0", 2827 | "is-fullwidth-code-point": "^1.0.0", 2828 | "mute-stream": "0.0.5" 2829 | }, 2830 | "dependencies": { 2831 | "is-fullwidth-code-point": { 2832 | "version": "1.0.0", 2833 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 2834 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 2835 | "dev": true, 2836 | "requires": { 2837 | "number-is-nan": "^1.0.0" 2838 | } 2839 | } 2840 | } 2841 | }, 2842 | "rechoir": { 2843 | "version": "0.6.2", 2844 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 2845 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 2846 | "dev": true, 2847 | "requires": { 2848 | "resolve": "^1.1.6" 2849 | } 2850 | }, 2851 | "repeat-string": { 2852 | "version": "1.6.1", 2853 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2854 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 2855 | }, 2856 | "replace-ext": { 2857 | "version": "1.0.0", 2858 | "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", 2859 | "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" 2860 | }, 2861 | "request": { 2862 | "version": "2.88.0", 2863 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 2864 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 2865 | "requires": { 2866 | "aws-sign2": "~0.7.0", 2867 | "aws4": "^1.8.0", 2868 | "caseless": "~0.12.0", 2869 | "combined-stream": "~1.0.6", 2870 | "extend": "~3.0.2", 2871 | "forever-agent": "~0.6.1", 2872 | "form-data": "~2.3.2", 2873 | "har-validator": "~5.1.0", 2874 | "http-signature": "~1.2.0", 2875 | "is-typedarray": "~1.0.0", 2876 | "isstream": "~0.1.2", 2877 | "json-stringify-safe": "~5.0.1", 2878 | "mime-types": "~2.1.19", 2879 | "oauth-sign": "~0.9.0", 2880 | "performance-now": "^2.1.0", 2881 | "qs": "~6.5.2", 2882 | "safe-buffer": "^5.1.2", 2883 | "tough-cookie": "~2.4.3", 2884 | "tunnel-agent": "^0.6.0", 2885 | "uuid": "^3.3.2" 2886 | } 2887 | }, 2888 | "require-directory": { 2889 | "version": "2.1.1", 2890 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2891 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 2892 | }, 2893 | "require-main-filename": { 2894 | "version": "1.0.1", 2895 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 2896 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 2897 | }, 2898 | "require-uncached": { 2899 | "version": "1.0.3", 2900 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 2901 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 2902 | "dev": true, 2903 | "requires": { 2904 | "caller-path": "^0.1.0", 2905 | "resolve-from": "^1.0.0" 2906 | } 2907 | }, 2908 | "resolve": { 2909 | "version": "1.11.0", 2910 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz", 2911 | "integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==", 2912 | "requires": { 2913 | "path-parse": "^1.0.6" 2914 | } 2915 | }, 2916 | "resolve-from": { 2917 | "version": "1.0.1", 2918 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 2919 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", 2920 | "dev": true 2921 | }, 2922 | "restore-cursor": { 2923 | "version": "1.0.1", 2924 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", 2925 | "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", 2926 | "dev": true, 2927 | "requires": { 2928 | "exit-hook": "^1.0.0", 2929 | "onetime": "^1.0.0" 2930 | } 2931 | }, 2932 | "rimraf": { 2933 | "version": "2.6.3", 2934 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 2935 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 2936 | "requires": { 2937 | "glob": "^7.1.3" 2938 | } 2939 | }, 2940 | "run-async": { 2941 | "version": "0.1.0", 2942 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-0.1.0.tgz", 2943 | "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", 2944 | "dev": true, 2945 | "requires": { 2946 | "once": "^1.3.0" 2947 | } 2948 | }, 2949 | "run-parallel": { 2950 | "version": "1.1.9", 2951 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", 2952 | "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", 2953 | "dev": true 2954 | }, 2955 | "rx-lite": { 2956 | "version": "3.1.2", 2957 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-3.1.2.tgz", 2958 | "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", 2959 | "dev": true 2960 | }, 2961 | "safe-buffer": { 2962 | "version": "5.1.2", 2963 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 2964 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 2965 | }, 2966 | "safer-buffer": { 2967 | "version": "2.1.2", 2968 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2969 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2970 | }, 2971 | "semver": { 2972 | "version": "5.7.0", 2973 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 2974 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 2975 | }, 2976 | "send": { 2977 | "version": "0.17.1", 2978 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 2979 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 2980 | "requires": { 2981 | "debug": "2.6.9", 2982 | "depd": "~1.1.2", 2983 | "destroy": "~1.0.4", 2984 | "encodeurl": "~1.0.2", 2985 | "escape-html": "~1.0.3", 2986 | "etag": "~1.8.1", 2987 | "fresh": "0.5.2", 2988 | "http-errors": "~1.7.2", 2989 | "mime": "1.6.0", 2990 | "ms": "2.1.1", 2991 | "on-finished": "~2.3.0", 2992 | "range-parser": "~1.2.1", 2993 | "statuses": "~1.5.0" 2994 | }, 2995 | "dependencies": { 2996 | "ms": { 2997 | "version": "2.1.1", 2998 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 2999 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 3000 | } 3001 | } 3002 | }, 3003 | "serve-static": { 3004 | "version": "1.14.1", 3005 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 3006 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 3007 | "requires": { 3008 | "encodeurl": "~1.0.2", 3009 | "escape-html": "~1.0.3", 3010 | "parseurl": "~1.3.3", 3011 | "send": "0.17.1" 3012 | } 3013 | }, 3014 | "set-blocking": { 3015 | "version": "2.0.0", 3016 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 3017 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 3018 | }, 3019 | "setprototypeof": { 3020 | "version": "1.1.1", 3021 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 3022 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 3023 | }, 3024 | "shelljs": { 3025 | "version": "0.7.8", 3026 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.7.8.tgz", 3027 | "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", 3028 | "dev": true, 3029 | "requires": { 3030 | "glob": "^7.0.0", 3031 | "interpret": "^1.0.0", 3032 | "rechoir": "^0.6.2" 3033 | } 3034 | }, 3035 | "signal-exit": { 3036 | "version": "3.0.2", 3037 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 3038 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 3039 | "optional": true 3040 | }, 3041 | "simple-concat": { 3042 | "version": "1.0.0", 3043 | "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", 3044 | "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", 3045 | "optional": true 3046 | }, 3047 | "simple-get": { 3048 | "version": "2.8.1", 3049 | "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-2.8.1.tgz", 3050 | "integrity": "sha512-lSSHRSw3mQNUGPAYRqo7xy9dhKmxFXIjLjp4KHpf99GEH2VH7C3AM+Qfx6du6jhfUi6Vm7XnbEVEf7Wb6N8jRw==", 3051 | "optional": true, 3052 | "requires": { 3053 | "decompress-response": "^3.3.0", 3054 | "once": "^1.3.1", 3055 | "simple-concat": "^1.0.0" 3056 | } 3057 | }, 3058 | "simple-statistics": { 3059 | "version": "7.0.2", 3060 | "resolved": "https://registry.npmjs.org/simple-statistics/-/simple-statistics-7.0.2.tgz", 3061 | "integrity": "sha512-wqTjlmbiaL6Fqaw28tSjQrthjxVV17MMfi/H/qvE0jAvtLspB2S7gEtcR27uvhSRAa64LhjhoO169rX8sFW3pg==" 3062 | }, 3063 | "slice-ansi": { 3064 | "version": "0.0.4", 3065 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", 3066 | "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", 3067 | "dev": true 3068 | }, 3069 | "spdx-correct": { 3070 | "version": "3.1.0", 3071 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", 3072 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", 3073 | "requires": { 3074 | "spdx-expression-parse": "^3.0.0", 3075 | "spdx-license-ids": "^3.0.0" 3076 | } 3077 | }, 3078 | "spdx-exceptions": { 3079 | "version": "2.2.0", 3080 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", 3081 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==" 3082 | }, 3083 | "spdx-expression-parse": { 3084 | "version": "3.0.0", 3085 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 3086 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 3087 | "requires": { 3088 | "spdx-exceptions": "^2.1.0", 3089 | "spdx-license-ids": "^3.0.0" 3090 | } 3091 | }, 3092 | "spdx-license-ids": { 3093 | "version": "3.0.4", 3094 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz", 3095 | "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==" 3096 | }, 3097 | "sprintf-js": { 3098 | "version": "1.0.3", 3099 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 3100 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 3101 | "dev": true 3102 | }, 3103 | "ssf": { 3104 | "version": "0.10.2", 3105 | "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.10.2.tgz", 3106 | "integrity": "sha512-rDhAPm9WyIsY8eZEKyE8Qsotb3j/wBdvMWBUsOhJdfhKGLfQidRjiBUV0y/MkyCLiXQ38FG6LWW/VYUtqlIDZQ==", 3107 | "requires": { 3108 | "frac": "~1.1.2" 3109 | } 3110 | }, 3111 | "sshpk": { 3112 | "version": "1.16.1", 3113 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 3114 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 3115 | "requires": { 3116 | "asn1": "~0.2.3", 3117 | "assert-plus": "^1.0.0", 3118 | "bcrypt-pbkdf": "^1.0.0", 3119 | "dashdash": "^1.12.0", 3120 | "ecc-jsbn": "~0.1.1", 3121 | "getpass": "^0.1.1", 3122 | "jsbn": "~0.1.0", 3123 | "safer-buffer": "^2.0.2", 3124 | "tweetnacl": "~0.14.0" 3125 | } 3126 | }, 3127 | "stack-trace": { 3128 | "version": "0.0.10", 3129 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 3130 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 3131 | }, 3132 | "standard": { 3133 | "version": "10.0.3", 3134 | "resolved": "https://registry.npmjs.org/standard/-/standard-10.0.3.tgz", 3135 | "integrity": "sha512-JURZ+85ExKLQULckDFijdX5WHzN6RC7fgiZNSV4jFQVo+3tPoQGHyBrGekye/yf0aOfb4210EM5qPNlc2cRh4w==", 3136 | "dev": true, 3137 | "requires": { 3138 | "eslint": "~3.19.0", 3139 | "eslint-config-standard": "10.2.1", 3140 | "eslint-config-standard-jsx": "4.0.2", 3141 | "eslint-plugin-import": "~2.2.0", 3142 | "eslint-plugin-node": "~4.2.2", 3143 | "eslint-plugin-promise": "~3.5.0", 3144 | "eslint-plugin-react": "~6.10.0", 3145 | "eslint-plugin-standard": "~3.0.1", 3146 | "standard-engine": "~7.0.0" 3147 | } 3148 | }, 3149 | "standard-engine": { 3150 | "version": "7.0.0", 3151 | "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-7.0.0.tgz", 3152 | "integrity": "sha1-67d7nI/CyBZf+jU72Rug3/Qa9pA=", 3153 | "dev": true, 3154 | "requires": { 3155 | "deglob": "^2.1.0", 3156 | "get-stdin": "^5.0.1", 3157 | "minimist": "^1.1.0", 3158 | "pkg-conf": "^2.0.0" 3159 | } 3160 | }, 3161 | "statuses": { 3162 | "version": "1.5.0", 3163 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 3164 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 3165 | }, 3166 | "string-hash": { 3167 | "version": "1.1.3", 3168 | "resolved": "https://registry.npmjs.org/string-hash/-/string-hash-1.1.3.tgz", 3169 | "integrity": "sha1-6Kr8CsGFW0Zmkp7X3RJ1311sgRs=" 3170 | }, 3171 | "string-width": { 3172 | "version": "2.1.1", 3173 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 3174 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 3175 | "requires": { 3176 | "is-fullwidth-code-point": "^2.0.0", 3177 | "strip-ansi": "^4.0.0" 3178 | }, 3179 | "dependencies": { 3180 | "strip-ansi": { 3181 | "version": "4.0.0", 3182 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 3183 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 3184 | "requires": { 3185 | "ansi-regex": "^3.0.0" 3186 | } 3187 | } 3188 | } 3189 | }, 3190 | "string_decoder": { 3191 | "version": "1.1.1", 3192 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 3193 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 3194 | "requires": { 3195 | "safe-buffer": "~5.1.0" 3196 | } 3197 | }, 3198 | "strip-ansi": { 3199 | "version": "0.1.1", 3200 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", 3201 | "integrity": "sha1-OeipjQRNFQZgq+SmgIrPcLt7yZE=" 3202 | }, 3203 | "strip-bom": { 3204 | "version": "2.0.0", 3205 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 3206 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 3207 | "requires": { 3208 | "is-utf8": "^0.2.0" 3209 | } 3210 | }, 3211 | "strip-json-comments": { 3212 | "version": "2.0.1", 3213 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 3214 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 3215 | }, 3216 | "supports-color": { 3217 | "version": "5.5.0", 3218 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 3219 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 3220 | "requires": { 3221 | "has-flag": "^3.0.0" 3222 | } 3223 | }, 3224 | "table": { 3225 | "version": "3.8.3", 3226 | "resolved": "https://registry.npmjs.org/table/-/table-3.8.3.tgz", 3227 | "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", 3228 | "dev": true, 3229 | "requires": { 3230 | "ajv": "^4.7.0", 3231 | "ajv-keywords": "^1.0.0", 3232 | "chalk": "^1.1.1", 3233 | "lodash": "^4.0.0", 3234 | "slice-ansi": "0.0.4", 3235 | "string-width": "^2.0.0" 3236 | }, 3237 | "dependencies": { 3238 | "ajv": { 3239 | "version": "4.11.8", 3240 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 3241 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 3242 | "dev": true, 3243 | "requires": { 3244 | "co": "^4.6.0", 3245 | "json-stable-stringify": "^1.0.1" 3246 | } 3247 | }, 3248 | "ansi-regex": { 3249 | "version": "2.1.1", 3250 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 3251 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 3252 | "dev": true 3253 | }, 3254 | "ansi-styles": { 3255 | "version": "2.2.1", 3256 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 3257 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 3258 | "dev": true 3259 | }, 3260 | "chalk": { 3261 | "version": "1.1.3", 3262 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 3263 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 3264 | "dev": true, 3265 | "requires": { 3266 | "ansi-styles": "^2.2.1", 3267 | "escape-string-regexp": "^1.0.2", 3268 | "has-ansi": "^2.0.0", 3269 | "strip-ansi": "^3.0.0", 3270 | "supports-color": "^2.0.0" 3271 | } 3272 | }, 3273 | "strip-ansi": { 3274 | "version": "3.0.1", 3275 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3276 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3277 | "dev": true, 3278 | "requires": { 3279 | "ansi-regex": "^2.0.0" 3280 | } 3281 | }, 3282 | "supports-color": { 3283 | "version": "2.0.0", 3284 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 3285 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 3286 | "dev": true 3287 | } 3288 | } 3289 | }, 3290 | "tar-fs": { 3291 | "version": "1.16.3", 3292 | "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.3.tgz", 3293 | "integrity": "sha512-NvCeXpYx7OsmOh8zIOP/ebG55zZmxLE0etfWRbWok+q2Qo8x/vOR/IJT1taADXPe+jsiu9axDb3X4B+iIgNlKw==", 3294 | "optional": true, 3295 | "requires": { 3296 | "chownr": "^1.0.1", 3297 | "mkdirp": "^0.5.1", 3298 | "pump": "^1.0.0", 3299 | "tar-stream": "^1.1.2" 3300 | }, 3301 | "dependencies": { 3302 | "pump": { 3303 | "version": "1.0.3", 3304 | "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", 3305 | "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", 3306 | "optional": true, 3307 | "requires": { 3308 | "end-of-stream": "^1.1.0", 3309 | "once": "^1.3.1" 3310 | } 3311 | } 3312 | } 3313 | }, 3314 | "tar-stream": { 3315 | "version": "1.6.2", 3316 | "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", 3317 | "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", 3318 | "optional": true, 3319 | "requires": { 3320 | "bl": "^1.0.0", 3321 | "buffer-alloc": "^1.2.0", 3322 | "end-of-stream": "^1.0.0", 3323 | "fs-constants": "^1.0.0", 3324 | "readable-stream": "^2.3.0", 3325 | "to-buffer": "^1.1.1", 3326 | "xtend": "^4.0.0" 3327 | } 3328 | }, 3329 | "terraformer": { 3330 | "version": "1.0.9", 3331 | "resolved": "https://registry.npmjs.org/terraformer/-/terraformer-1.0.9.tgz", 3332 | "integrity": "sha512-YlmQ1fsMWTkKGDGibCRWgmLzrpDRUr63Q025LJ/taYQ6j1Yb8q9McKF7NBi6ACAyUXO6F/bl9w6v4MY307y5Ag==", 3333 | "requires": { 3334 | "@types/geojson": "^1.0.0" 3335 | }, 3336 | "dependencies": { 3337 | "@types/geojson": { 3338 | "version": "1.0.6", 3339 | "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.6.tgz", 3340 | "integrity": "sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==", 3341 | "optional": true 3342 | } 3343 | } 3344 | }, 3345 | "terraformer-arcgis-parser": { 3346 | "version": "1.1.0", 3347 | "resolved": "https://registry.npmjs.org/terraformer-arcgis-parser/-/terraformer-arcgis-parser-1.1.0.tgz", 3348 | "integrity": "sha512-bvxEtpiS22Lz1ciaXP/MMLTlJkrHWLBV/y7VBeTLHtZnz/Ngq4wF3RqrpjzP6ojJjxvcdDlvs+UFs3wicoT1Vg==", 3349 | "requires": { 3350 | "@types/geojson": "^1.0.0", 3351 | "terraformer": "~1.0.4" 3352 | }, 3353 | "dependencies": { 3354 | "@types/geojson": { 3355 | "version": "1.0.6", 3356 | "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-1.0.6.tgz", 3357 | "integrity": "sha512-Xqg/lIZMrUd0VRmSRbCAewtwGZiAk3mEUDvV4op1tGl+LvyPcb/MIOSxTl9z+9+J+R4/vpjiCAT4xeKzH9ji1w==" 3358 | } 3359 | } 3360 | }, 3361 | "text-table": { 3362 | "version": "0.2.0", 3363 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 3364 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 3365 | "dev": true 3366 | }, 3367 | "through": { 3368 | "version": "2.3.8", 3369 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3370 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3371 | "dev": true 3372 | }, 3373 | "to-buffer": { 3374 | "version": "1.1.1", 3375 | "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", 3376 | "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", 3377 | "optional": true 3378 | }, 3379 | "toidentifier": { 3380 | "version": "1.0.0", 3381 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 3382 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 3383 | }, 3384 | "tough-cookie": { 3385 | "version": "2.4.3", 3386 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 3387 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 3388 | "requires": { 3389 | "psl": "^1.1.24", 3390 | "punycode": "^1.4.1" 3391 | }, 3392 | "dependencies": { 3393 | "punycode": { 3394 | "version": "1.4.1", 3395 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3396 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 3397 | } 3398 | } 3399 | }, 3400 | "tunnel-agent": { 3401 | "version": "0.6.0", 3402 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3403 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3404 | "requires": { 3405 | "safe-buffer": "^5.0.1" 3406 | } 3407 | }, 3408 | "tweetnacl": { 3409 | "version": "0.14.5", 3410 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3411 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 3412 | }, 3413 | "type": { 3414 | "version": "1.0.1", 3415 | "resolved": "https://registry.npmjs.org/type/-/type-1.0.1.tgz", 3416 | "integrity": "sha512-MAM5dBMJCJNKs9E7JXo4CXRAansRfG0nlJxW7Wf6GZzSOvH31zClSaHdIMWLehe/EGMBkqeC55rrkaOr5Oo7Nw==", 3417 | "dev": true 3418 | }, 3419 | "type-check": { 3420 | "version": "0.3.2", 3421 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 3422 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 3423 | "dev": true, 3424 | "requires": { 3425 | "prelude-ls": "~1.1.2" 3426 | } 3427 | }, 3428 | "type-is": { 3429 | "version": "1.6.18", 3430 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 3431 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 3432 | "requires": { 3433 | "media-typer": "0.3.0", 3434 | "mime-types": "~2.1.24" 3435 | } 3436 | }, 3437 | "typedarray": { 3438 | "version": "0.0.6", 3439 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 3440 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 3441 | }, 3442 | "underscore": { 3443 | "version": "1.6.0", 3444 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", 3445 | "integrity": "sha1-izixDKze9jM3uLJOT/htRa6lKag=" 3446 | }, 3447 | "uniq": { 3448 | "version": "1.0.1", 3449 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", 3450 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", 3451 | "dev": true 3452 | }, 3453 | "unist-util-stringify-position": { 3454 | "version": "2.0.1", 3455 | "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.1.tgz", 3456 | "integrity": "sha512-Zqlf6+FRI39Bah8Q6ZnNGrEHUhwJOkHde2MHVk96lLyftfJJckaPslKgzhVcviXj8KcE9UJM9F+a4JEiBUTYgA==", 3457 | "requires": { 3458 | "@types/unist": "^2.0.2" 3459 | } 3460 | }, 3461 | "unpipe": { 3462 | "version": "1.0.0", 3463 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3464 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3465 | }, 3466 | "uri-js": { 3467 | "version": "4.2.2", 3468 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 3469 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 3470 | "requires": { 3471 | "punycode": "^2.1.0" 3472 | } 3473 | }, 3474 | "user-home": { 3475 | "version": "2.0.0", 3476 | "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", 3477 | "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", 3478 | "dev": true, 3479 | "requires": { 3480 | "os-homedir": "^1.0.0" 3481 | } 3482 | }, 3483 | "util-deprecate": { 3484 | "version": "1.0.2", 3485 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3486 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3487 | }, 3488 | "utils-merge": { 3489 | "version": "1.0.1", 3490 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3491 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3492 | }, 3493 | "uuid": { 3494 | "version": "3.3.2", 3495 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 3496 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" 3497 | }, 3498 | "validate-npm-package-license": { 3499 | "version": "3.0.4", 3500 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 3501 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 3502 | "requires": { 3503 | "spdx-correct": "^3.0.0", 3504 | "spdx-expression-parse": "^3.0.0" 3505 | } 3506 | }, 3507 | "vary": { 3508 | "version": "1.1.2", 3509 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3510 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3511 | }, 3512 | "verror": { 3513 | "version": "1.10.0", 3514 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3515 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3516 | "requires": { 3517 | "assert-plus": "^1.0.0", 3518 | "core-util-is": "1.0.2", 3519 | "extsprintf": "^1.2.0" 3520 | } 3521 | }, 3522 | "vfile": { 3523 | "version": "4.0.1", 3524 | "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.0.1.tgz", 3525 | "integrity": "sha512-lRHFCuC4SQBFr7Uq91oJDJxlnftoTLQ7eKIpMdubhYcVMho4781a8MWXLy3qZrZ0/STD1kRiKc0cQOHm4OkPeA==", 3526 | "requires": { 3527 | "@types/unist": "^2.0.0", 3528 | "is-buffer": "^2.0.0", 3529 | "replace-ext": "1.0.0", 3530 | "unist-util-stringify-position": "^2.0.0", 3531 | "vfile-message": "^2.0.0" 3532 | } 3533 | }, 3534 | "vfile-message": { 3535 | "version": "2.0.1", 3536 | "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.1.tgz", 3537 | "integrity": "sha512-KtasSV+uVU7RWhUn4Lw+wW1Zl/nW8JWx7JCPps10Y9JRRIDeDXf8wfBLoOSsJLyo27DqMyAi54C6Jf/d6Kr2Bw==", 3538 | "requires": { 3539 | "@types/unist": "^2.0.2", 3540 | "unist-util-stringify-position": "^2.0.0" 3541 | } 3542 | }, 3543 | "vfile-reporter": { 3544 | "version": "5.1.2", 3545 | "resolved": "https://registry.npmjs.org/vfile-reporter/-/vfile-reporter-5.1.2.tgz", 3546 | "integrity": "sha512-b15sTuss1wOPWVlyWOvu+n6wGJ/eTYngz3uqMLimQvxZ+Q5oFQGYZZP1o3dR9sk58G5+wej0UPCZSwQBX/mzrQ==", 3547 | "requires": { 3548 | "repeat-string": "^1.5.0", 3549 | "string-width": "^2.0.0", 3550 | "supports-color": "^5.0.0", 3551 | "unist-util-stringify-position": "^2.0.0", 3552 | "vfile-sort": "^2.1.2", 3553 | "vfile-statistics": "^1.1.0" 3554 | } 3555 | }, 3556 | "vfile-sort": { 3557 | "version": "2.2.1", 3558 | "resolved": "https://registry.npmjs.org/vfile-sort/-/vfile-sort-2.2.1.tgz", 3559 | "integrity": "sha512-5dt7xEhC44h0uRQKhbM2JAe0z/naHphIZlMOygtMBM9Nn0pZdaX5fshhwWit9wvsuP8t/wp43nTDRRErO1WK8g==" 3560 | }, 3561 | "vfile-statistics": { 3562 | "version": "1.1.3", 3563 | "resolved": "https://registry.npmjs.org/vfile-statistics/-/vfile-statistics-1.1.3.tgz", 3564 | "integrity": "sha512-CstaK/ebTz1W3Qp41Bt9Lj/2DmumFsCwC2sKahDNSPh0mPh7/UyMLCoU8ZBX34CRU0d61B4W41yIFsV0NKMZeA==" 3565 | }, 3566 | "wcwidth": { 3567 | "version": "1.0.1", 3568 | "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", 3569 | "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", 3570 | "optional": true, 3571 | "requires": { 3572 | "defaults": "^1.0.3" 3573 | } 3574 | }, 3575 | "which-module": { 3576 | "version": "1.0.0", 3577 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", 3578 | "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=" 3579 | }, 3580 | "which-pm-runs": { 3581 | "version": "1.0.0", 3582 | "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", 3583 | "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=", 3584 | "optional": true 3585 | }, 3586 | "wide-align": { 3587 | "version": "1.1.3", 3588 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 3589 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 3590 | "optional": true, 3591 | "requires": { 3592 | "string-width": "^1.0.2 || 2" 3593 | } 3594 | }, 3595 | "window-size": { 3596 | "version": "0.2.0", 3597 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.2.0.tgz", 3598 | "integrity": "sha1-tDFbtCFKPXBY6+7okuE/ok2YsHU=" 3599 | }, 3600 | "winnow": { 3601 | "version": "1.16.7", 3602 | "resolved": "https://registry.npmjs.org/winnow/-/winnow-1.16.7.tgz", 3603 | "integrity": "sha512-a/hMymkGYQJn34R1thro4PJP8xjSJ0tltJJBoXjaPhDhM3HNer4z6hWR0/3ltTHQCCT1/PnaM+ZoyUsxB+agYw==", 3604 | "requires": { 3605 | "@esri/proj-codes": "^2.2.0", 3606 | "@turf/bbox-polygon": "^6.0.1", 3607 | "@turf/centroid": "^6.0.0", 3608 | "alasql": "^0.4.0", 3609 | "classybrew": "0.0.3", 3610 | "farmhash": "^2.1.0", 3611 | "flora-sql-parser": "^0.9.3", 3612 | "highland": "^3.0.0-beta.3", 3613 | "lodash": "^4.17.4", 3614 | "moment": "^2.18.1", 3615 | "ngeohash": "^0.6.3", 3616 | "proj4": "^2.3.17", 3617 | "simple-statistics": "^7.0.0", 3618 | "string-hash": "^1.1.3", 3619 | "terraformer": "^1.0.7", 3620 | "wkt-parser": "^1.2.2" 3621 | } 3622 | }, 3623 | "winston": { 3624 | "version": "2.4.4", 3625 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz", 3626 | "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==", 3627 | "requires": { 3628 | "async": "~1.0.0", 3629 | "colors": "1.0.x", 3630 | "cycle": "1.0.x", 3631 | "eyes": "0.1.x", 3632 | "isstream": "0.1.x", 3633 | "stack-trace": "0.0.x" 3634 | }, 3635 | "dependencies": { 3636 | "async": { 3637 | "version": "1.0.0", 3638 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 3639 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 3640 | } 3641 | } 3642 | }, 3643 | "wkt-parser": { 3644 | "version": "1.2.3", 3645 | "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.2.3.tgz", 3646 | "integrity": "sha512-s7zrOedGuHbbzMaQOuf8HacuCYp3LmmrHjkkN//7UEAzsYz7xJ6J+j/84ZWZkQcrRqi3xXyuc4odPHj7PEB0bw==" 3647 | }, 3648 | "wordwrap": { 3649 | "version": "1.0.0", 3650 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 3651 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 3652 | "dev": true 3653 | }, 3654 | "wrap-ansi": { 3655 | "version": "2.1.0", 3656 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 3657 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 3658 | "requires": { 3659 | "string-width": "^1.0.1", 3660 | "strip-ansi": "^3.0.1" 3661 | }, 3662 | "dependencies": { 3663 | "ansi-regex": { 3664 | "version": "2.1.1", 3665 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 3666 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 3667 | }, 3668 | "is-fullwidth-code-point": { 3669 | "version": "1.0.0", 3670 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 3671 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 3672 | "requires": { 3673 | "number-is-nan": "^1.0.0" 3674 | } 3675 | }, 3676 | "string-width": { 3677 | "version": "1.0.2", 3678 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3679 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3680 | "requires": { 3681 | "code-point-at": "^1.0.0", 3682 | "is-fullwidth-code-point": "^1.0.0", 3683 | "strip-ansi": "^3.0.0" 3684 | } 3685 | }, 3686 | "strip-ansi": { 3687 | "version": "3.0.1", 3688 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3689 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3690 | "requires": { 3691 | "ansi-regex": "^2.0.0" 3692 | } 3693 | } 3694 | } 3695 | }, 3696 | "wrappy": { 3697 | "version": "1.0.2", 3698 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3699 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 3700 | }, 3701 | "write": { 3702 | "version": "0.2.1", 3703 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 3704 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 3705 | "dev": true, 3706 | "requires": { 3707 | "mkdirp": "^0.5.1" 3708 | } 3709 | }, 3710 | "xlsx": { 3711 | "version": "0.13.5", 3712 | "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.13.5.tgz", 3713 | "integrity": "sha512-AQo8Anyuv8ZxegAH2EUJ9ZauLf3lIDPfmV7OpJi79LNW6jO4gsviJyQCjNCJY7Deu1SLCrr7LY6rM9N91ixaDQ==", 3714 | "requires": { 3715 | "adler-32": "~1.2.0", 3716 | "cfb": "~1.0.8", 3717 | "codepage": "~1.14.0", 3718 | "commander": "~2.15.1", 3719 | "crc-32": "~1.2.0", 3720 | "exit-on-epipe": "~1.0.1", 3721 | "ssf": "~0.10.2" 3722 | } 3723 | }, 3724 | "xtend": { 3725 | "version": "4.0.1", 3726 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 3727 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 3728 | }, 3729 | "y18n": { 3730 | "version": "3.2.1", 3731 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 3732 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 3733 | }, 3734 | "yargs": { 3735 | "version": "5.0.0", 3736 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-5.0.0.tgz", 3737 | "integrity": "sha1-M1UUSXfQV1fbuG1uOOwFYSOzpm4=", 3738 | "requires": { 3739 | "cliui": "^3.2.0", 3740 | "decamelize": "^1.1.1", 3741 | "get-caller-file": "^1.0.1", 3742 | "lodash.assign": "^4.2.0", 3743 | "os-locale": "^1.4.0", 3744 | "read-pkg-up": "^1.0.1", 3745 | "require-directory": "^2.1.1", 3746 | "require-main-filename": "^1.0.1", 3747 | "set-blocking": "^2.0.0", 3748 | "string-width": "^1.0.2", 3749 | "which-module": "^1.0.0", 3750 | "window-size": "^0.2.0", 3751 | "y18n": "^3.2.1", 3752 | "yargs-parser": "^3.2.0" 3753 | }, 3754 | "dependencies": { 3755 | "ansi-regex": { 3756 | "version": "2.1.1", 3757 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 3758 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 3759 | }, 3760 | "is-fullwidth-code-point": { 3761 | "version": "1.0.0", 3762 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 3763 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 3764 | "requires": { 3765 | "number-is-nan": "^1.0.0" 3766 | } 3767 | }, 3768 | "string-width": { 3769 | "version": "1.0.2", 3770 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 3771 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 3772 | "requires": { 3773 | "code-point-at": "^1.0.0", 3774 | "is-fullwidth-code-point": "^1.0.0", 3775 | "strip-ansi": "^3.0.0" 3776 | } 3777 | }, 3778 | "strip-ansi": { 3779 | "version": "3.0.1", 3780 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 3781 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 3782 | "requires": { 3783 | "ansi-regex": "^2.0.0" 3784 | } 3785 | } 3786 | } 3787 | }, 3788 | "yargs-parser": { 3789 | "version": "3.2.0", 3790 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-3.2.0.tgz", 3791 | "integrity": "sha1-UIE1XRnZ0MjF2BrakIy05tGGZk8=", 3792 | "requires": { 3793 | "camelcase": "^3.0.0", 3794 | "lodash.assign": "^4.1.0" 3795 | } 3796 | } 3797 | } 3798 | } 3799 | -------------------------------------------------------------------------------- /demo/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demo", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "Daniel Fenton ", 10 | "license": "ISC", 11 | "devDependencies": { 12 | "standard": "^10.0.3" 13 | }, 14 | "dependencies": { 15 | "@koopjs/provider-file-geojson": "^1.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /demo/server.js: -------------------------------------------------------------------------------- 1 | const Koop = require('koop') 2 | const koop = new Koop() 3 | const vectorTiles = require('../src') 4 | const files = require('@koopjs/provider-file-geojson') 5 | koop.register(vectorTiles) 6 | koop.register(files) 7 | koop.server.listen(8085) 8 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@koopjs/output-vector-tiles", 3 | "version": "2.2.0", 4 | "description": "Koop output-plugin for generating Vector-tiles from GeoJSON", 5 | "main": "dist/index.js", 6 | "directories": { 7 | "test": "test" 8 | }, 9 | "scripts": { 10 | "clean": "rm -rf dist", 11 | "compile": "buble -i src -o dist", 12 | "package": "npm run clean && npm run compile", 13 | "start": "node server.js", 14 | "test": "standard && tape test/*.js | tap-spec" 15 | }, 16 | "author": "Daniel Fenton ", 17 | "license": "Apache-2.0", 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/koopjs/koop-output-vector-tiles.git" 21 | }, 22 | "bugs": { 23 | "url": "https://github.com/koopjs/koop-output-vector-tiles/issues" 24 | }, 25 | "homepage": "https://github.com/koopjs/koop-output-vector-tiles#readme", 26 | "dependencies": { 27 | "@koopjs/logger": "^2.0.4", 28 | "config": "^3.1.0", 29 | "esri-extent": "^1.1.3", 30 | "geojson-vt": "^3.2.1", 31 | "lodash": "^4.17.11", 32 | "proj4": "^2.5.0", 33 | "vt-pbf": "^3.1.1", 34 | "winnow": "^1.16.8" 35 | }, 36 | "devDependencies": { 37 | "buble": "^0.19.7", 38 | "proxyquire": "^2.1.0", 39 | "standard": "^10.0.3", 40 | "tap-spec": "^5.0.0", 41 | "tape": "^4.10.2" 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/esri-metadata.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | const esriExtent = require('esri-extent') 3 | const proj4 = require('proj4') 4 | const template = require('./esri-template-metadata') 5 | 6 | /** 7 | * Generate a Esri extent object (web mercator) from GeoJSON data 8 | * @param {object} geojson 9 | */ 10 | function esriExtentWebMercator (geojson) { 11 | const extentWgs84 = esriExtent(geojson) 12 | const mins = proj4('EPSG:4326', 'EPSG:3857', [extentWgs84.xmin, extentWgs84.ymin]) 13 | const maxs = proj4('EPSG:4326', 'EPSG:3857', [extentWgs84.xmax, extentWgs84.ymax]) 14 | return { 15 | xmin: mins[0], 16 | ymin: mins[1], 17 | xmax: maxs[0], 18 | ymax: maxs[1], 19 | spatialReference: { 20 | cs: 'pcs', 21 | wkid: 102100 22 | } 23 | } 24 | } 25 | 26 | module.exports = function (req, res) { 27 | // Adjust layer specific properties 28 | this.model.pull(req, (e, geojson) => { 29 | if (e) return res.status(500).json(e) 30 | if (!geojson) return res.status(404).send() 31 | 32 | // Process metadata through Winnow so we get a data extent 33 | const { metadata = {} } = geojson 34 | const extent = metadata.extent || esriExtentWebMercator(geojson) 35 | 36 | const body = _.cloneDeep(template) 37 | if (metadata.name) body.name = metadata.name 38 | body.initialExtent = extent 39 | body.fullExtent = extent 40 | 41 | res.status(200).json(body) 42 | }) 43 | } 44 | -------------------------------------------------------------------------------- /src/esri-rendering-info.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | const config = require('config') 3 | 4 | // Get configured paint properties and overwrite hardcoded properties 5 | const linePaint = Object.assign({ 'line-width': 2, 'line-color': '#FF0000' }, _.get(config, 'koopOutputVectorTiles.line.paint')) 6 | const fillPaint = Object.assign({ 'fill-opacity': 0.5, 'fill-color': '#008000' }, _.get(config, 'koopOutputVectorTiles.fill.paint')) 7 | const circlePaint = Object.assign({ 'circle-radius': 3, 'circle-color': '#007cbf' }, _.get(config, 'koopOutputVectorTiles.circle.paint')) 8 | 9 | function getRenderingInfo (type, paint = {}) { 10 | let result 11 | switch (type) { 12 | case 'LineString': 13 | case 'MultiLineString': 14 | case 'line': 15 | result = { 16 | type: 'line', 17 | paint: Object.assign({}, linePaint, paint) 18 | } 19 | break 20 | case 'Polygon': 21 | case 'MultiPolygon': 22 | case 'fill': 23 | result = { 24 | type: 'fill', 25 | paint: Object.assign({}, fillPaint, paint) 26 | } 27 | break 28 | case 'Point': 29 | case 'circle': 30 | default: 31 | result = { 32 | type: 'circle', 33 | paint: Object.assign({}, circlePaint, paint) 34 | } 35 | } 36 | return result 37 | } 38 | 39 | module.exports = function (type, paint) { 40 | return getRenderingInfo(type, paint) 41 | } 42 | -------------------------------------------------------------------------------- /src/esri-root.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | const Utils = require('./utils') 3 | const template = require('./esri-template-root') 4 | const esriRenderingInfo = require('./esri-rendering-info') 5 | 6 | module.exports = function (req, res) { 7 | this.model.pull(req, (e, geojson) => { 8 | if (e) return res.status(500).json(e) 9 | if (!geojson) return res.status(404).send() 10 | 11 | // clone the root.json template 12 | const body = _.cloneDeep(template) 13 | 14 | // extract geojson metadata property 15 | const { metadata = {} } = geojson 16 | 17 | // compose the layer id from request parameters 18 | const id = Utils.getTileSetKey(req.params.host, req.params.id) 19 | 20 | // Fetch the vector-tile feature type if set in metadata; otherwise use geometry type 21 | const metadataType = _.get(metadata, 'vt.type', metadata.geometryType) 22 | 23 | // Fetch the vector-tile paint object if set in metadata 24 | const metadataPaint = _.get(metadata, 'vt.paint') 25 | 26 | // compose the rendering type and paint object 27 | const { type, paint } = esriRenderingInfo(metadataType, metadataPaint) 28 | 29 | // add the composed layer properties to the response body 30 | Object.assign(body.layers[0], { id, 'source-layer': id, type, paint }) 31 | 32 | // set the tile url 33 | body.sources.esri.url = `${req.protocol}://${req.headers.host || req.host}${req.baseUrl || ''}${req.path.replace('resources/styles/root.json', '')}` 34 | 35 | res.status(200).json(body) 36 | }) 37 | } 38 | -------------------------------------------------------------------------------- /src/esri-template-metadata.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'currentVersion': 10.61, 3 | 'name': 'Koop Tiles', 4 | 'capabilities': 'TilesOnly', 5 | 'type': 'indexedVector', 6 | 'defaultStyles': '/resources/styles', 7 | 'tiles': [ 8 | '/{z}/{x}/{y}.pbf' 9 | ], 10 | 'exportTilesAllowed': true, 11 | 'initialExtent': { 12 | 'xmin': -20037507.067161843, 13 | 'ymin': -20037507.067161843, 14 | 'xmax': 20037507.067161843, 15 | 'ymax': 20037507.067161843, 16 | 'spatialReference': { 17 | 'cs': 'pcs', 18 | 'wkid': 102100 19 | } 20 | }, 21 | 'fullExtent': { 22 | 'xmin': -20037507.067161843, 23 | 'ymin': -20037507.067161843, 24 | 'xmax': 20037507.067161843, 25 | 'ymax': 20037507.067161843, 26 | 'spatialReference': { 27 | 'cs': 'pcs', 28 | 'wkid': 102100 29 | } 30 | }, 31 | 'minScale': 0, 32 | 'maxScale': 0, 33 | 'tileInfo': { 34 | 'rows': 512, 35 | 'cols': 512, 36 | 'dpi': 96, 37 | 'format': 'pbf', 38 | 'origin': { 39 | 'x': -20037508.342787, 40 | 'y': 20037508.342787 41 | }, 42 | 'spatialReference': { 43 | 'wkid': 102100, 44 | 'latestWkid': 3857 45 | }, 46 | 'lods': [ 47 | { 48 | 'level': 0, 49 | 'resolution': 78271.51696399994, 50 | 'scale': 295828763.795777 51 | }, 52 | { 53 | 'level': 1, 54 | 'resolution': 39135.75848200009, 55 | 'scale': 147914381.897889 56 | }, 57 | { 58 | 'level': 2, 59 | 'resolution': 19567.87924099992, 60 | 'scale': 73957190.948944 61 | }, 62 | { 63 | 'level': 3, 64 | 'resolution': 9783.93962049996, 65 | 'scale': 36978595.474472 66 | }, 67 | { 68 | 'level': 4, 69 | 'resolution': 4891.96981024998, 70 | 'scale': 18489297.737236 71 | }, 72 | { 73 | 'level': 5, 74 | 'resolution': 2445.98490512499, 75 | 'scale': 9244648.868618 76 | }, 77 | { 78 | 'level': 6, 79 | 'resolution': 1222.992452562495, 80 | 'scale': 4622324.434309 81 | }, 82 | { 83 | 'level': 7, 84 | 'resolution': 611.4962262813797, 85 | 'scale': 2311162.217155 86 | }, 87 | { 88 | 'level': 8, 89 | 'resolution': 305.74811314055756, 90 | 'scale': 1155581.108577 91 | }, 92 | { 93 | 'level': 9, 94 | 'resolution': 152.87405657041106, 95 | 'scale': 577790.554289 96 | }, 97 | { 98 | 'level': 10, 99 | 'resolution': 76.43702828507324, 100 | 'scale': 288895.277144 101 | }, 102 | { 103 | 'level': 11, 104 | 'resolution': 38.21851414253662, 105 | 'scale': 144447.638572 106 | }, 107 | { 108 | 'level': 12, 109 | 'resolution': 19.10925707126831, 110 | 'scale': 72223.819286 111 | }, 112 | { 113 | 'level': 13, 114 | 'resolution': 9.554628535634155, 115 | 'scale': 36111.909643 116 | }, 117 | { 118 | 'level': 14, 119 | 'resolution': 4.77731426794937, 120 | 'scale': 18055.954822 121 | }, 122 | { 123 | 'level': 15, 124 | 'resolution': 2.388657133974685, 125 | 'scale': 9027.977411 126 | }, 127 | { 128 | 'level': 16, 129 | 'resolution': 1.1943285668550503, 130 | 'scale': 4513.988705 131 | }, 132 | { 133 | 'level': 17, 134 | 'resolution': 0.5971642835598172, 135 | 'scale': 2256.994353 136 | }, 137 | { 138 | 'level': 18, 139 | 'resolution': 0.29858214164761665, 140 | 'scale': 1128.497176 141 | }, 142 | { 143 | 'level': 19, 144 | 'resolution': 0.14929107082380833, 145 | 'scale': 564.248588 146 | }, 147 | { 148 | 'level': 20, 149 | 'resolution': 0.07464553541190416, 150 | 'scale': 282.124294 151 | }, 152 | { 153 | 'level': 21, 154 | 'resolution': 0.03732276770595208, 155 | 'scale': 141.062147 156 | }, 157 | { 158 | 'level': 22, 159 | 'resolution': 0.01866138385297604, 160 | 'scale': 70.5310735 161 | } 162 | ] 163 | }, 164 | 'resourceInfo': { 165 | 'styleVersion': 8, 166 | 'tileCompression': 'gzip', 167 | 'cacheInfo': { 168 | 'storageInfo': { 169 | 'packetSize': 128, 170 | 'storageFormat': 'compactV2' 171 | } 172 | } 173 | }, 174 | 'serviceItemId': 'na', 175 | 'minLOD': 0, 176 | 'maxLOD': 16, 177 | 'maxExportTilesCount': 10000 178 | } 179 | -------------------------------------------------------------------------------- /src/esri-template-root.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | 'version': 8, 3 | 'sources': { 4 | 'esri': { 5 | 'type': 'vector' 6 | } 7 | }, 8 | 'layers': [ 9 | { 10 | 'source': 'esri', 11 | 'source-layer': 'trees', 12 | 'minzoom': 0, 13 | 'layout': {} 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const serve = require('./serve') 2 | const metadata = require('./metadata') 3 | const esriMetadata = require('./esri-metadata') 4 | const esriRoot = require('./esri-root') 5 | 6 | function VectorTileServer () {} 7 | VectorTileServer.version = require('../package.json').version 8 | VectorTileServer.type = 'output' 9 | VectorTileServer.routes = [ 10 | { 11 | path: 'VectorTileServer/:z([0-9]+)/:x([0-9]+)/:y([0-9]+).pbf', 12 | methods: ['get', 'post'], 13 | handler: 'serve' 14 | }, 15 | { 16 | path: 'VectorTileServer/tiles.json', 17 | methods: ['get'], 18 | handler: 'metadata' 19 | }, 20 | { 21 | path: '$namespace/rest/services/$providerParams/VectorTileServer/:z([0-9]+)/:x([0-9]+)/:y([0-9]+).pbf', 22 | methods: ['get', 'post'], 23 | handler: 'serve' 24 | }, 25 | { 26 | path: '$namespace/rest/services/$providerParams/VectorTileServer', 27 | methods: ['get', 'post'], 28 | handler: 'esriMetadata' 29 | }, 30 | { 31 | path: '$namespace/rest/services/$providerParams/VectorTileServer/', 32 | methods: ['get', 'post'], 33 | handler: 'esriMetadata' 34 | }, 35 | { 36 | path: '$namespace/rest/services/$providerParams/VectorTileServer/resources/styles/root.json', 37 | methods: ['get'], 38 | handler: 'esriRoot' 39 | } 40 | ] 41 | 42 | VectorTileServer.prototype.serve = serve 43 | 44 | VectorTileServer.prototype.metadata = metadata 45 | 46 | VectorTileServer.prototype.esriMetadata = esriMetadata 47 | 48 | VectorTileServer.prototype.esriRoot = esriRoot 49 | 50 | module.exports = VectorTileServer 51 | -------------------------------------------------------------------------------- /src/metadata.js: -------------------------------------------------------------------------------- 1 | const esriExtent = require('esri-extent') 2 | const Winnow = require('winnow') 3 | const { getTileSetKey } = require('./utils') 4 | 5 | /** 6 | * Create "center" value for metadata 7 | * @param {object} extent 8 | */ 9 | function center (extent) { 10 | const x = (extent.xmax - extent.xmin) / 2 11 | const y = (extent.ymax - extent.ymin) / 2 12 | return `${x},${y},10` // @TODO - calculate best zoom level for this extent 13 | } 14 | 15 | module.exports = function (req, res) { 16 | const tileSetKey = getTileSetKey(req.params.host, req.params.id) 17 | this.model.pull(req, (e, geojson) => { 18 | if (e) return res.status(500).json(e) 19 | if (!geojson) return res.status(404).send() 20 | const metadata = Winnow.query(geojson).metadata 21 | const extent = esriExtent(geojson) 22 | 23 | const json = { 24 | attribution: metadata.attribution, 25 | bounds: `${extent.xmin},${extent.ymin},${extent.xmax},${extent.ymax}`, 26 | center: center(extent), 27 | created: metadata.created, 28 | description: metadata.description, 29 | filesize: 0, 30 | fillzoom: 8, 31 | format: 'pbf', 32 | id: metadata.name || tileSetKey, 33 | name: metadata.name || tileSetKey, 34 | private: false, 35 | scheme: 'zxy', 36 | tilejson: '2.2.0', 37 | tiles: [ `${req.protocol}://${req.headers.host || req.host}${req.path.replace('tiles.json', '{z}/{x}/{y}.pbf')}` ], 38 | vector_layers: [ 39 | { 40 | description: metadata.descriptions, 41 | fields: formatFields(metadata.fields), 42 | id: tileSetKey, 43 | source: metadata.source, 44 | source_name: metadata.source 45 | } 46 | ], 47 | webpage: metadata.webpage 48 | } 49 | res.status(200).json(json) 50 | }) 51 | } 52 | 53 | function formatFields (inFields) { 54 | return inFields.reduce((fields, field) => { 55 | fields[field.name] = field.description || field.type 56 | return fields 57 | }, {}) 58 | } 59 | -------------------------------------------------------------------------------- /src/serve.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | const geojsonVT = require('geojson-vt') 3 | const vtpbf = require('vt-pbf') 4 | const Logger = require('@koopjs/logger') 5 | const config = require('config') 6 | const tileSetConfig = require('./tile-set-config') 7 | const log = new Logger() 8 | const Utils = require('./utils') 9 | const TileSetsCache = require('./tile-sets-cache') 10 | 11 | const useTileSetCache = _.get(config, 'koopOutputVectorTiles.cache', true) 12 | 13 | // Tile response headers 14 | const responseHeaders = { 15 | 'Content-Type': _.get(config, 'koopOutputVectorTiles.contentType', 'application/x-protobuf'), 16 | 'Cache-Control': `public, max-age: ${_.get(config, 'koopOutputVectorTiles.maxAge', 3600)}` 17 | } 18 | 19 | const tileSetsCache = new TileSetsCache({ ttl: _.get(config, 'koopOutputVectorTiles.cacheExpiration') }) 20 | 21 | function getPbfTile (key, data, z, y, x, options = {}) { 22 | let tileSet 23 | 24 | // Use in-memory tileset cache if configured, otherwise generate tile set on-the-fly 25 | if (useTileSetCache) { 26 | tileSet = tileSetsCache.retrieve(key) 27 | if (!tileSet) tileSet = tileSetsCache.upsert(key, data) 28 | } else tileSet = geojsonVT(data, tileSetConfig) 29 | 30 | // Get tile from tile set 31 | const tile = tileSet.getTile(z, x, y) 32 | 33 | if (!tile) return 34 | 35 | // Make pbf 36 | return Buffer.from(vtpbf.fromGeojsonVt({ 37 | [key]: tile 38 | })) 39 | } 40 | 41 | module.exports = function (req, res) { 42 | this.model.pull(req, (e, data) => { 43 | if (!data) return res.status(404).send() 44 | 45 | const start = Date.now() 46 | 47 | // Error from provider 48 | if (e) return res.status(e.code || 500).json({ error: e.message }) 49 | 50 | // Extract Tile indicies 51 | const { z, x, y } = _.chain(req.params) 52 | .pick(['z', 'y', 'x']) 53 | .mapValues(index => { return Number(index) }) 54 | .value() 55 | 56 | // Make key for the cached tile layer 57 | const key = Utils.getTileSetKey(req.params.host, req.params.id) 58 | 59 | // Get PBF 60 | const pbfTile = getPbfTile(key, data, z, y, x) 61 | 62 | if (!pbfTile) return res.status(204).send() 63 | 64 | log.debug(`output=vector-tiles: ${key}, tile=${z},${x},${y} features=${data.features.length} duration=${(Date.now() - start) / 1000} seconds`) 65 | res.set(responseHeaders).status(200).send(pbfTile) 66 | }) 67 | } 68 | -------------------------------------------------------------------------------- /src/tile-set-config.js: -------------------------------------------------------------------------------- 1 | const _ = require('lodash') 2 | const config = require('config') 3 | // geojson-vt options; anything undefined will use geojsonVT defaults 4 | const settings = { 5 | maxZoom: _.get(config, 'koopOutputVectorTiles.geojsonVT.maxZoom'), // max zoom to preserve detail on; can't be higher than 24 6 | tolerance: _.get(config, 'koopOutputVectorTiles.geojsonVT.tolerance'), // simplification tolerance (higher means simpler) 7 | extent: _.get(config, 'koopOutputVectorTiles.geojsonVT.extent'), // tile extent (both width and height) 8 | buffer: _.get(config, 'koopOutputVectorTiles.geojsonVT.buffer'), // 64 is the original default, using a higher number like 512, 1024 or 2048 gets rid of some geojson artifacts but increases the tilesSetCache size // tile buffer on each side 9 | debug: _.get(config, 'koopOutputVectorTiles.geojsonVT.debug'), // logging level (0 to disable, 1 or 2) 10 | lineMetrics: _.get(config, 'koopOutputVectorTiles.geojsonVT.lineMetrics'), // whether to enable line metrics tracking for LineString/MultiLineString features 11 | promoteId: _.get(config, 'koopOutputVectorTiles.geojsonVT.promoteId'), // name of a feature property to promote to feature.id. Cannot be used with `generateId` 12 | generateId: _.get(config, 'koopOutputVectorTiles.geojsonVT.generateId'), // whether to generate feature ids. Cannot be used with `promoteId` 13 | indexMaxZoom: _.get(config, 'koopOutputVectorTiles.geojsonVT.indexMaxZoom'), // max zoom in the initial tile index 14 | indexMaxPoints: _.get(config, 'koopOutputVectorTiles.geojsonVT.indexMaxPoints') // max number of points per tile in the index 15 | } 16 | 17 | module.exports = _.omitBy(settings, _.isUndefined) 18 | -------------------------------------------------------------------------------- /src/tile-sets-cache.js: -------------------------------------------------------------------------------- 1 | const geojsonVT = require('geojson-vt') 2 | const tileSetConfig = require('./tile-set-config') 3 | 4 | // In-memory cache for geojsonVT results 5 | class TileSetCache { 6 | constructor (options = {}) { 7 | this.tileSetTtl = (options.ttl || 300) * 1000 8 | this.tileSets = new Map() 9 | } 10 | 11 | /** 12 | * Upsert data to cache 13 | * @param {string} key 14 | * @param {object} geojson 15 | */ 16 | upsert (key, geojson) { 17 | const tileSet = geojsonVT(geojson, tileSetConfig) 18 | this.tileSets.set(key, { 19 | data: tileSet, 20 | expirationTimestamp: Date.now() + this.tileSetTtl 21 | }) 22 | return tileSet 23 | } 24 | 25 | /** 26 | * Retrieve data from cache 27 | * @param {string} key 28 | */ 29 | retrieve (key) { 30 | const tileSet = this.tileSets.get(key) 31 | if (tileSet && tileSet.expirationTimestamp > Date.now()) return tileSet.data 32 | } 33 | } 34 | 35 | module.exports = TileSetCache 36 | -------------------------------------------------------------------------------- /src/utils.js: -------------------------------------------------------------------------------- 1 | const Utils = {} 2 | 3 | /** 4 | * Generate a tile set key/id from Koop host and id parameters 5 | */ 6 | Utils.getTileSetKey = function getTileSetKey (host, id) { 7 | const fragments = [] 8 | if (host) fragments.push(host) 9 | if (id) fragments.push(id) 10 | if (fragments.length > 0) return fragments.join('-') 11 | return '_' 12 | } 13 | 14 | module.exports = Utils 15 | -------------------------------------------------------------------------------- /test/esri-metadata.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const _ = require('lodash') 3 | const esriMetadata = require('../src/esri-metadata') 4 | const fixtureGeojson = _.cloneDeep(require('./fixtures/trees.json')) 5 | const fixtureEsriMetadataResult = require('./fixtures/esri-metadata-result.json') 6 | 7 | fixtureGeojson.metadata = { 8 | title: 'Koop File GeoJSON', 9 | id: 'trees', 10 | name: 'Test data' 11 | } 12 | 13 | let callbackErr = null 14 | let callbackData = fixtureGeojson 15 | 16 | function TestModel () { 17 | this.model = { 18 | pull: function (req, callback) { 19 | callback(callbackErr, callbackData) 20 | } 21 | } 22 | } 23 | 24 | TestModel.prototype.esriMetadata = esriMetadata 25 | 26 | const testModel = new TestModel() 27 | 28 | test('esriMetadata - success', t => { 29 | const req = { 30 | params: { z: 0, x: 0, y: 0 }, 31 | headers: {}, 32 | path: '/test/VectorTileServer', 33 | protocol: 'http', 34 | host: 'example.com' 35 | } 36 | const res = { 37 | status: (code) => { 38 | t.equals(code, 200, 'correct status code') 39 | return res 40 | }, 41 | json: (data) => { 42 | t.deepEquals(data, fixtureEsriMetadataResult, 'esriMetadata is sent') 43 | return res 44 | } 45 | } 46 | testModel.esriMetadata(req, res) 47 | t.end() 48 | }) 49 | 50 | test('esriMetadata - error handling', t => { 51 | const req = { 52 | params: { id: 'test' } 53 | } 54 | const res = { 55 | status: (code) => { 56 | t.equals(code, 500, 'correct status code') 57 | return res 58 | }, 59 | json: (data) => { 60 | t.equals(data.message, 'Internal server error', 'has error message') 61 | return res 62 | } 63 | } 64 | callbackErr = new Error('Internal server error') 65 | testModel.esriMetadata(req, res) 66 | t.end() 67 | }) 68 | 69 | test('esriMetadata - 404 handling', t => { 70 | const req = { 71 | params: { id: 'test' } 72 | } 73 | const res = { 74 | status: (code) => { 75 | t.equals(code, 404, 'correct status code') 76 | return res 77 | }, 78 | send: () => { 79 | t.pass('404 sent') 80 | return res 81 | } 82 | } 83 | callbackErr = null 84 | callbackData = null 85 | testModel.esriMetadata(req, res) 86 | t.end() 87 | }) 88 | -------------------------------------------------------------------------------- /test/esri-rendering-info.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const proxyquire = require('proxyquire') 3 | const modulePath = '../src/esri-rendering-info' 4 | const configStub = {} 5 | const esriRenderingInfo = proxyquire(modulePath, { 6 | 'config': configStub 7 | }) 8 | 9 | test('esriRenderingInfo - types "circle" and "Point" should return defaults', t => { 10 | t.plan(2) 11 | t.deepEquals(esriRenderingInfo('Point'), { type: 'circle', paint: { 'circle-radius': 3, 'circle-color': '#007cbf' } }, 'returns default rendering info') 12 | t.deepEquals(esriRenderingInfo('circle'), { type: 'circle', paint: { 'circle-radius': 3, 'circle-color': '#007cbf' } }, 'returns default rendering info') 13 | }) 14 | 15 | test('esriRenderingInfo - types "line", "LineString", and "MultiLineString" should return defaults', t => { 16 | t.plan(3) 17 | t.deepEquals(esriRenderingInfo('MultiLineString'), { type: 'line', paint: { 'line-width': 2, 'line-color': '#FF0000' } }, 'returns default rendering info') 18 | t.deepEquals(esriRenderingInfo('LineString'), { type: 'line', paint: { 'line-width': 2, 'line-color': '#FF0000' } }, 'returns default rendering info') 19 | t.deepEquals(esriRenderingInfo('line'), { type: 'line', paint: { 'line-width': 2, 'line-color': '#FF0000' } }, 'returns default rendering info') 20 | }) 21 | 22 | test('esriRenderingInfo - types "fill", "Polygon", and "MultiPolygon" should return defaults', t => { 23 | t.plan(3) 24 | t.deepEquals(esriRenderingInfo('MultiPolygon'), { type: 'fill', paint: { 'fill-opacity': 0.5, 'fill-color': '#008000' } }, 'returns default rendering info') 25 | t.deepEquals(esriRenderingInfo('Polygon'), { type: 'fill', paint: { 'fill-opacity': 0.5, 'fill-color': '#008000' } }, 'returns default rendering info') 26 | t.deepEquals(esriRenderingInfo('fill'), { type: 'fill', paint: { 'fill-opacity': 0.5, 'fill-color': '#008000' } }, 'returns default rendering info') 27 | }) 28 | 29 | test('esriRenderingInfo - point types should return configured properties', t => { 30 | t.plan(1) 31 | const esriRenderingInfo = proxyquire(modulePath, { 32 | 'config': { 33 | koopOutputVectorTiles: { 34 | circle: { paint: { 'circle-radius': 7 } } 35 | } 36 | } 37 | }) 38 | t.deepEquals(esriRenderingInfo('Point'), { type: 'circle', paint: { 'circle-radius': 7, 'circle-color': '#007cbf' } }, 'returns configured rendering info') 39 | }) 40 | 41 | test('esriRenderingInfo - line types should return passed in properties', t => { 42 | t.plan(1) 43 | const esriRenderingInfo = proxyquire(modulePath, { 44 | 'config': { 45 | koopOutputVectorTiles: { 46 | line: { paint: { 'line-width': 7 } } 47 | } 48 | } 49 | }) 50 | t.deepEquals(esriRenderingInfo('LineString'), { type: 'line', paint: { 'line-width': 7, 'line-color': '#FF0000' } }, 'returns configured rendering info') 51 | }) 52 | 53 | test('esriRenderingInfo - polygon types should return passed in properties', t => { 54 | t.plan(1) 55 | const esriRenderingInfo = proxyquire(modulePath, { 56 | 'config': { 57 | koopOutputVectorTiles: { 58 | fill: { paint: { 'fill-opacity': 0.25 } } 59 | } 60 | } 61 | }) 62 | t.deepEquals(esriRenderingInfo('Polygon'), { type: 'fill', paint: { 'fill-opacity': 0.25, 'fill-color': '#008000' } }, 'returns configured rendering info') 63 | }) 64 | 65 | test('esriRenderingInfo - point types should return passed in properties', t => { 66 | t.plan(2) 67 | t.deepEquals(esriRenderingInfo('Point', { 'circle-radius': 6 }), { type: 'circle', paint: { 'circle-radius': 6, 'circle-color': '#007cbf' } }, 'returns combined rendering info') 68 | t.deepEquals(esriRenderingInfo('Point', {'circle-color': '#000000'}), { type: 'circle', paint: { 'circle-radius': 3, 'circle-color': '#000000' } }, 'returns combined rendering info') 69 | }) 70 | 71 | test('esriRenderingInfo - line types should return passed in properties', t => { 72 | t.plan(2) 73 | t.deepEquals(esriRenderingInfo('LineString', { 'line-width': 4 }), { type: 'line', paint: { 'line-width': 4, 'line-color': '#FF0000' } }, 'returns combined rendering info') 74 | t.deepEquals(esriRenderingInfo('LineString', { 'line-color': '#000000' }), { type: 'line', paint: { 'line-width': 2, 'line-color': '#000000' } }, 'returns combined rendering info') 75 | }) 76 | 77 | test('esriRenderingInfo - polygon types should return passed in properties', t => { 78 | t.plan(2) 79 | t.deepEquals(esriRenderingInfo('Polygon', { 'fill-opacity': 1 }), { type: 'fill', paint: { 'fill-opacity': 1, 'fill-color': '#008000' } }, 'returns combined rendering info') 80 | t.deepEquals(esriRenderingInfo('Polygon', {'fill-color': '#000000'}), { type: 'fill', paint: { 'fill-opacity': 0.5, 'fill-color': '#000000' } }, 'returns combined rendering info') 81 | }) 82 | -------------------------------------------------------------------------------- /test/esri-root.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const _ = require('lodash') 3 | const esriRoot = require('../src/esri-root') 4 | const fixtureGeojson = _.cloneDeep(require('./fixtures/trees.json')) 5 | fixtureGeojson.metadata = { 6 | title: 'Koop File GeoJSON', 7 | id: 'trees', 8 | name: 'Test data', 9 | vt: { 10 | type: 'circle', 11 | paint: { 12 | 'circle-radius': 8 13 | } 14 | } 15 | } 16 | let callbackErr = null 17 | let callbackData = fixtureGeojson 18 | 19 | function TestModel () { 20 | this.model = { 21 | pull: function (req, callback) { 22 | callback(callbackErr, callbackData) 23 | } 24 | } 25 | } 26 | 27 | TestModel.prototype.esriRoot = esriRoot 28 | 29 | const testModel = new TestModel() 30 | 31 | test('esriRoot - success', t => { 32 | const req = { 33 | params: { id: 'test', z: 0, x: 0, y: 0 }, 34 | headers: {}, 35 | path: '/test/VectorTileServer/resources/styles/root.json', 36 | protocol: 'http', 37 | host: 'example.com' 38 | } 39 | const res = { 40 | status: (code) => { 41 | t.equals(code, 200, 'correct status code') 42 | return res 43 | }, 44 | json: (data) => { 45 | t.deepEquals(data, { 46 | version: 8, 47 | sources: { 48 | esri: { 49 | type: 'vector', 50 | url: 'http://example.com/test/VectorTileServer/' 51 | } 52 | }, 53 | layers: [{ 54 | source: 'esri', 55 | 'source-layer': 'test', 56 | minzoom: 0, 57 | layout: {}, 58 | id: 'test', 59 | type: 'circle', 60 | paint: { 61 | 'circle-radius': 8, 62 | 'circle-color': '#007cbf' 63 | } 64 | }] 65 | }, 'root.json data is sent') 66 | return res 67 | } 68 | } 69 | testModel.esriRoot(req, res) 70 | t.end() 71 | }) 72 | 73 | test('esriRoot - error handling', t => { 74 | const req = { 75 | params: { id: 'test', z: 0, x: 0, y: 0 } 76 | } 77 | const res = { 78 | status: (code) => { 79 | t.equals(code, 500, 'correct status code') 80 | return res 81 | }, 82 | json: (data) => { 83 | t.equals(data.message, 'Internal server error', 'has error message') 84 | return res 85 | } 86 | } 87 | callbackErr = new Error('Internal server error') 88 | testModel.esriRoot(req, res) 89 | t.end() 90 | }) 91 | 92 | test('esriRoot - 404 handling', t => { 93 | const req = { 94 | params: { id: 'test', z: 0, x: 0, y: 0 } 95 | } 96 | const res = { 97 | status: (code) => { 98 | t.equals(code, 404, 'correct status code') 99 | return res 100 | }, 101 | send: () => { 102 | t.pass('404 sent') 103 | return res 104 | } 105 | } 106 | callbackErr = null 107 | callbackData = null 108 | testModel.esriRoot(req, res) 109 | t.end() 110 | }) 111 | -------------------------------------------------------------------------------- /test/fixtures/esri-metadata-result.json: -------------------------------------------------------------------------------- 1 | { 2 | "currentVersion": 10.61, 3 | "name": "Test data", 4 | "capabilities": "TilesOnly", 5 | "type": "indexedVector", 6 | "defaultStyles": "/resources/styles", 7 | "tiles": [ 8 | "/{z}/{x}/{y}.pbf" 9 | ], 10 | "exportTilesAllowed": true, 11 | "initialExtent": { 12 | "xmin": -13156344.910207387, 13 | "ymin": 4044663.9691695776, 14 | "xmax": -13143281.94615243, 15 | "ymax": 4056192.3525933097, 16 | "spatialReference": { 17 | "cs": "pcs", 18 | "wkid": 102100 19 | } 20 | }, 21 | "fullExtent": { 22 | "xmin": -13156344.910207387, 23 | "ymin": 4044663.9691695776, 24 | "xmax": -13143281.94615243, 25 | "ymax": 4056192.3525933097, 26 | "spatialReference": { 27 | "cs": "pcs", 28 | "wkid": 102100 29 | } 30 | }, 31 | "minScale": 0, 32 | "maxScale": 0, 33 | "tileInfo": { 34 | "rows": 512, 35 | "cols": 512, 36 | "dpi": 96, 37 | "format": "pbf", 38 | "origin": { 39 | "x": -20037508.342787, 40 | "y": 20037508.342787 41 | }, 42 | "spatialReference": { 43 | "wkid": 102100, 44 | "latestWkid": 3857 45 | }, 46 | "lods": [ 47 | { 48 | "level": 0, 49 | "resolution": 78271.51696399994, 50 | "scale": 295828763.795777 51 | }, 52 | { 53 | "level": 1, 54 | "resolution": 39135.75848200009, 55 | "scale": 147914381.897889 56 | }, 57 | { 58 | "level": 2, 59 | "resolution": 19567.87924099992, 60 | "scale": 73957190.948944 61 | }, 62 | { 63 | "level": 3, 64 | "resolution": 9783.93962049996, 65 | "scale": 36978595.474472 66 | }, 67 | { 68 | "level": 4, 69 | "resolution": 4891.96981024998, 70 | "scale": 18489297.737236 71 | }, 72 | { 73 | "level": 5, 74 | "resolution": 2445.98490512499, 75 | "scale": 9244648.868618 76 | }, 77 | { 78 | "level": 6, 79 | "resolution": 1222.992452562495, 80 | "scale": 4622324.434309 81 | }, 82 | { 83 | "level": 7, 84 | "resolution": 611.4962262813797, 85 | "scale": 2311162.217155 86 | }, 87 | { 88 | "level": 8, 89 | "resolution": 305.74811314055756, 90 | "scale": 1155581.108577 91 | }, 92 | { 93 | "level": 9, 94 | "resolution": 152.87405657041106, 95 | "scale": 577790.554289 96 | }, 97 | { 98 | "level": 10, 99 | "resolution": 76.43702828507324, 100 | "scale": 288895.277144 101 | }, 102 | { 103 | "level": 11, 104 | "resolution": 38.21851414253662, 105 | "scale": 144447.638572 106 | }, 107 | { 108 | "level": 12, 109 | "resolution": 19.10925707126831, 110 | "scale": 72223.819286 111 | }, 112 | { 113 | "level": 13, 114 | "resolution": 9.554628535634155, 115 | "scale": 36111.909643 116 | }, 117 | { 118 | "level": 14, 119 | "resolution": 4.77731426794937, 120 | "scale": 18055.954822 121 | }, 122 | { 123 | "level": 15, 124 | "resolution": 2.388657133974685, 125 | "scale": 9027.977411 126 | }, 127 | { 128 | "level": 16, 129 | "resolution": 1.1943285668550503, 130 | "scale": 4513.988705 131 | }, 132 | { 133 | "level": 17, 134 | "resolution": 0.5971642835598172, 135 | "scale": 2256.994353 136 | }, 137 | { 138 | "level": 18, 139 | "resolution": 0.29858214164761665, 140 | "scale": 1128.497176 141 | }, 142 | { 143 | "level": 19, 144 | "resolution": 0.14929107082380833, 145 | "scale": 564.248588 146 | }, 147 | { 148 | "level": 20, 149 | "resolution": 0.07464553541190416, 150 | "scale": 282.124294 151 | }, 152 | { 153 | "level": 21, 154 | "resolution": 0.03732276770595208, 155 | "scale": 141.062147 156 | }, 157 | { 158 | "level": 22, 159 | "resolution": 0.01866138385297604, 160 | "scale": 70.5310735 161 | } 162 | ] 163 | }, 164 | "resourceInfo": { 165 | "styleVersion": 8, 166 | "tileCompression": "gzip", 167 | "cacheInfo": { 168 | "storageInfo": { 169 | "packetSize": 128, 170 | "storageFormat": "compactV2" 171 | } 172 | } 173 | }, 174 | "serviceItemId": "na", 175 | "minLOD": 0, 176 | "maxLOD": 16, 177 | "maxExportTilesCount": 10000 178 | } -------------------------------------------------------------------------------- /test/metadata.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const metadata = require('../src/metadata') 3 | const fixture = require('./fixtures/trees.json') 4 | fixture.metadata = { 5 | title: 'Koop File GeoJSON', 6 | id: 'trees', 7 | name: 'Test data', 8 | description: 'Test data description', 9 | attribution: 'Give some credit here', 10 | bounds: 'Bounds from metadata', 11 | source: 'Source from metadata', 12 | webpage: 'Webpage from metadata' 13 | 14 | } 15 | let callbackErr = null 16 | let callbackData = fixture 17 | 18 | function TestModel () { 19 | this.model = { 20 | pull: function (req, callback) { 21 | callback(callbackErr, callbackData) 22 | } 23 | } 24 | } 25 | 26 | TestModel.prototype.metadata = metadata 27 | 28 | const testModel = new TestModel() 29 | 30 | test('metadata - success', t => { 31 | const req = { 32 | params: { z: 0, x: 0, y: 0 }, 33 | headers: {}, 34 | path: '/test/VectorTileServer/tiles.json', 35 | protocol: 'http', 36 | host: 'example.com' 37 | } 38 | const res = { 39 | status: (code) => { 40 | t.equals(code, 200, 'correct status code') 41 | return res 42 | }, 43 | json: (data) => { 44 | t.deepEquals(data, { 45 | attribution: 'Give some credit here', 46 | bounds: '-118.18545715987369,34.11804759286581,-118.06811055720897,34.20374076923347', 47 | center: '0.05867330133236237,0.04284658818383136,10', 48 | created: undefined, 49 | description: 'Test data description', 50 | filesize: 0, 51 | fillzoom: 8, 52 | format: 'pbf', 53 | id: 'Test data', 54 | name: 'Test data', 55 | private: false, 56 | scheme: 'zxy', 57 | tilejson: '2.2.0', 58 | tiles: ['http://example.com/test/VectorTileServer/{z}/{x}/{y}.pbf'], 59 | vector_layers: [{ 60 | description: undefined, 61 | fields: { 62 | OBJECTID: 'Integer', 63 | Common_Name: 'String', 64 | Genus: 'String', 65 | Species: 'String', 66 | House_Number: 'Integer', 67 | Street_Direction: 'String', 68 | Street_Name: 'String', 69 | Street_Type: 'String', 70 | Street_Suffix: 'String', 71 | Trunk_Diameter: 'Integer', 72 | Longitude: 'Double', 73 | Latitude: 'Double' 74 | }, 75 | id: '_', 76 | source: 'Source from metadata', 77 | source_name: 'Source from metadata' 78 | }], 79 | webpage: 'Webpage from metadata' 80 | }, 'metadata is sent') 81 | return res 82 | } 83 | } 84 | testModel.metadata(req, res) 85 | t.end() 86 | }) 87 | 88 | test('metadata - error handling', t => { 89 | const req = { 90 | params: { id: 'test' } 91 | } 92 | const res = { 93 | status: (code) => { 94 | t.equals(code, 500, 'correct status code') 95 | return res 96 | }, 97 | json: (data) => { 98 | t.equals(data.message, 'Internal server error', 'has error message') 99 | return res 100 | } 101 | } 102 | callbackErr = new Error('Internal server error') 103 | testModel.metadata(req, res) 104 | t.end() 105 | }) 106 | 107 | test('metadata - 404 handling', t => { 108 | const req = { 109 | params: { id: 'test' } 110 | } 111 | const res = { 112 | status: (code) => { 113 | t.equals(code, 404, 'correct status code') 114 | return res 115 | }, 116 | send: () => { 117 | t.pass('404 sent') 118 | return res 119 | } 120 | } 121 | callbackErr = null 122 | callbackData = null 123 | testModel.metadata(req, res) 124 | t.end() 125 | }) 126 | -------------------------------------------------------------------------------- /test/serve.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const serve = require('../src/serve') 3 | const fixture = require('./fixtures/trees.json') 4 | 5 | function TestModel () { 6 | this.model = { 7 | pull: function (req, callback) { 8 | callback(null, fixture) 9 | } 10 | } 11 | } 12 | 13 | TestModel.prototype.serve = serve 14 | 15 | const testModel = new TestModel() 16 | 17 | test('serve', t => { 18 | const req = { 19 | params: { z: 0, x: 0, y: 0 } 20 | } 21 | const res = { 22 | status: (code) => { 23 | t.equals(code, 200, 'correct status code') 24 | return res 25 | }, 26 | send: (data) => { 27 | t.equals(data instanceof Buffer, true, 'buffer is sent') 28 | t.ok(data.length, true, 'buffer is not empty') 29 | return res 30 | }, 31 | set: (headers) => { 32 | t.deepEquals(headers, { 33 | 'Content-Type': 'application/x-protobuf', 34 | 'Cache-Control': `public, max-age: 3600` 35 | }, 'includes expected headers') 36 | return res 37 | } 38 | } 39 | testModel.serve(req, res) 40 | t.end() 41 | }) 42 | 43 | test('serve no content', t => { 44 | const req = { 45 | params: { z: 10, x: 0, y: 0 } 46 | } 47 | const res = { 48 | status: (code) => { 49 | t.equals(code, 204, 'correct status code') 50 | return res 51 | }, 52 | send: (data) => { 53 | t.notOk(data, 'nothing sent') 54 | return res 55 | } 56 | } 57 | testModel.serve(req, res) 58 | t.end() 59 | }) 60 | -------------------------------------------------------------------------------- /test/tile-sets-cache.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const TileSetsCache = require('../src/tile-sets-cache') 3 | const fixture = require('./fixtures/trees.json') 4 | 5 | test('should upsert geojson as tile set', t => { 6 | t.plan(1) 7 | const tileSetsCache = new TileSetsCache() 8 | const tileSet = tileSetsCache.upsert('key', fixture) 9 | const retrieved = tileSetsCache.retrieve('key') 10 | t.deepEquals(tileSet, retrieved, 'upsert equals retrieved') 11 | }) 12 | 13 | test('should return undefined for expired TileSet', t => { 14 | t.plan(1) 15 | const tileSetsCache = new TileSetsCache({ ttl: -1000 }) 16 | tileSetsCache.upsert('key', fixture) 17 | const retrieved = tileSetsCache.retrieve('key') 18 | t.notOk(retrieved, 'retrieve returns undefined') 19 | }) 20 | -------------------------------------------------------------------------------- /test/tile-sets-config.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const _ = require('lodash') 3 | const proxyquire = require('proxyquire') 4 | const modulePath = '../src/tile-set-config' 5 | const configStub = {} 6 | 7 | test('tileSetConfig should contain no undefined properties', t => { 8 | t.plan(1) 9 | const tileSetConfig = proxyquire(modulePath, { 10 | 'config': configStub 11 | }) 12 | const undefinedKeys = Object.keys(_.pickBy(tileSetConfig, _.isUndefined)) 13 | t.equals(undefinedKeys.length, 0, 'no undefinedKeys') 14 | }) 15 | 16 | test('tileSetConfig should contain any defined properties', t => { 17 | t.plan(1) 18 | _.set(configStub, 'koopOutputVectorTiles.geojsonVT.maxZoom', 10) 19 | const tileSetConfig = proxyquire(modulePath, { 20 | 'config': configStub 21 | }) 22 | const definedKeys = Object.keys(_.omitBy(tileSetConfig, _.isUndefined)) 23 | t.equals(definedKeys[0], 'maxZoom', 'has defined keys') 24 | }) 25 | -------------------------------------------------------------------------------- /test/utils.spec.js: -------------------------------------------------------------------------------- 1 | const test = require('tape') 2 | const Utils = require('../src/utils') 3 | 4 | test('Utils.getTileSetKey, with defined host and id args', t => { 5 | t.plan(1) 6 | const result = Utils.getTileSetKey('host_param', 'id_param') 7 | t.equals(result, 'host_param-id_param', 'correct key') 8 | }) 9 | 10 | test('Utils.getTileSetKey, with defined host and undefined id args', t => { 11 | t.plan(1) 12 | const result = Utils.getTileSetKey('host_param', undefined) 13 | t.equals(result, 'host_param', 'correct key') 14 | }) 15 | 16 | test('Utils.getTileSetKey, with undefined host and defined id args', t => { 17 | t.plan(1) 18 | const result = Utils.getTileSetKey(undefined, 'id_param') 19 | t.equals(result, 'id_param', 'correct key') 20 | }) 21 | 22 | test('Utils.getTileSetKey, with undefined host and undefined id args', t => { 23 | t.plan(1) 24 | const result = Utils.getTileSetKey(undefined, undefined) 25 | t.equals(result, '_', 'correct key') 26 | }) 27 | --------------------------------------------------------------------------------