├── .gitignore ├── LICENSE ├── README.md ├── lambdas ├── add-item-geolocation │ ├── .npmignore │ ├── app.js │ ├── package-lock.json │ └── package.json ├── delete-item │ ├── .npmignore │ ├── app.js │ ├── package-lock.json │ └── package.json ├── get-items-by-location │ ├── .npmignore │ ├── app.js │ ├── package-lock.json │ └── package.json └── update-item-geolocation │ ├── .npmignore │ ├── app.js │ ├── package-lock.json │ └── package.json ├── package.json └── template.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | packaged.yaml 9 | .aws 10 | .aws-sam 11 | # Diagnostic reports (https://nodejs.org/api/report.html) 12 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | *.pid.lock 19 | 20 | # Directory for instrumented libs generated by jscoverage/JSCover 21 | lib-cov 22 | 23 | # Coverage directory used by tools like istanbul 24 | coverage 25 | *.lcov 26 | 27 | # nyc test coverage 28 | .nyc_output 29 | 30 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 31 | .grunt 32 | 33 | # Bower dependency directory (https://bower.io/) 34 | bower_components 35 | 36 | # node-waf configuration 37 | .lock-wscript 38 | 39 | # Compiled binary addons (https://nodejs.org/api/addons.html) 40 | build/Release 41 | 42 | # Dependency directories 43 | node_modules/ 44 | jspm_packages/ 45 | 46 | # TypeScript v1 declaration files 47 | typings/ 48 | 49 | # TypeScript cache 50 | *.tsbuildinfo 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Microbundle cache 59 | .rpt2_cache/ 60 | .rts2_cache_cjs/ 61 | .rts2_cache_es/ 62 | .rts2_cache_umd/ 63 | 64 | # Optional REPL history 65 | .node_repl_history 66 | 67 | # Output of 'npm pack' 68 | *.tgz 69 | 70 | # Yarn Integrity file 71 | .yarn-integrity 72 | 73 | # dotenv environment variables file 74 | .env 75 | .env.test 76 | 77 | # parcel-bundler cache (https://parceljs.org/) 78 | .cache 79 | 80 | # Next.js build output 81 | .next 82 | 83 | # Nuxt.js build / generate output 84 | .nuxt 85 | dist 86 | 87 | # Gatsby files 88 | .cache/ 89 | # Comment in the public line in if your project uses Gatsby and *not* Next.js 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # public 92 | 93 | # vuepress build output 94 | .vuepress/dist 95 | 96 | # Serverless directories 97 | .serverless/ 98 | 99 | # FuseBox cache 100 | .fusebox/ 101 | 102 | # DynamoDB Local files 103 | .dynamodb/ 104 | 105 | # TernJS port file 106 | .tern-port 107 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 allenheltondev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Twitter][1.1]][1] [![GitHub][2.1]][2] [![LinkedIn][3.1]][3] [![Medium][4.1]][4] 2 | # Dynamodb-geosearch Proof of Concept # 3 | ## Description ## 4 | This proof of concept was built to show the ability to do geosearching in AWS DynamoDB. It uses open source software to geocode and store/read/update geopoints in dynamo. For a detailed breakdown of this repository, refer to the [article on Medium](https://medium.com/better-programming/how-i-built-a-serverless-geo-search-app-with-dynamodb-491879233754). 5 | * [Dynamodb-geo](https://www.npmjs.com/package/dynamodb-geo) 6 | * [Geocodio](geocod.io) 7 | 8 | ## AWS Resources ## 9 | The CloudFormation script (template.yaml) will deploy a handful of serverless resources to your AWS account: 10 | * **1 x Public API** (API Gateway) 11 | * **1 x NoSQL Table** (DynamoDB) 12 | * **4 x CRUD Functions** (Lambda) 13 | * **4 x Roles with Policies** (IAM) 14 | 15 | ## Prerequisites ## 16 | In order to properly run and deploy this app, you must perform the following 17 | 1. [Setup an AWS account](https://aws.amazon.com/premiumsupport/knowledge-center/create-and-activate-aws-account/) 18 | 2. [Install the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) 19 | 3. [Configure the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) to use your account 20 | 4. [Setup an S3 bucket](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-bucket.html) 21 | 5. [Sign up](https://dash.geocod.io/register) for a free Geocodio api key 22 | 6. [Install Git](https://git-scm.com/downloads) 23 | 24 | ## Setup ## 25 | 1. Clone the repository to your local machine 26 | 2. In the **template.yaml** file, change REPLACE_ME with your Geocodio api key 27 | 3. In the root **package.json**, change REPLACE_ME with the name of your S3 bucket 28 | 29 | ## Deployment ## 30 | You are able to deploy the solution any way you'd like, but included in the root package.json is a script that will automatically build, package, and deploy the solution to AWS for you. Just run the following command to deploy 31 | ``` 32 | npm run deploy 33 | ``` 34 | [1.1]: http://i.imgur.com/tXSoThF.png 35 | [2.1]: http://i.imgur.com/0o48UoR.png 36 | [3.1]: http://i.imgur.com/lGwB1Hk.png 37 | [4.1]: http://i.imgur.com/BrJQF7t.png 38 | 39 | [1]: http://www.twitter.com/allenheltondev 40 | [2]: http://www.github.com/allenheltondev 41 | [3]: https://www.linkedin.com/in/allen-helton-85aa9650/ 42 | [4]: https://medium.com/@allen.helton 43 | -------------------------------------------------------------------------------- /lambdas/add-item-geolocation/.npmignore: -------------------------------------------------------------------------------- 1 | tests/* 2 | -------------------------------------------------------------------------------- /lambdas/add-item-geolocation/app.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk'); 2 | const ddb = new AWS.DynamoDB(); 3 | const DYNAMO_CLIENT = require('aws-sdk/clients/dynamodb'); 4 | const documentClient = new DYNAMO_CLIENT.DocumentClient(); 5 | const Geocodio = require('geocodio-library-node'); 6 | const ddbGeo = require('dynamodb-geo'); 7 | const httpStatusCode = require('http-status-codes'); 8 | const short = require('short-uuid'); 9 | let response; 10 | 11 | exports.lambdaHandler = async (event, context) => { 12 | const item = JSON.parse(event.body); 13 | if (!item.name || !item.address) { 14 | response = { 15 | statusCode: httpStatusCode.BAD_REQUEST, 16 | body: JSON.stringify({ 17 | message: 'A name and address are required.' 18 | }) 19 | }; 20 | 21 | return response; 22 | } 23 | 24 | const geoData = await geocodeItem(item); 25 | if (geoData) { 26 | await saveGeolocationMetadata(geoData); 27 | response = { 28 | statusCode: httpStatusCode.CREATED, 29 | body: JSON.stringify({ id: geoData.RangeKeyValue.S }) 30 | }; 31 | } 32 | else { 33 | response = { 34 | statusCode: httpStatusCode.INTERNAL_SERVER_ERROR, 35 | body: JSON.stringify({ 36 | message: 'An error occurred trying to save the item' 37 | }) 38 | }; 39 | } 40 | 41 | return response; 42 | }; 43 | 44 | /** 45 | * Attempt to geocode an item's address and add it to the database 46 | * @param {any} item - Item details from the request body 47 | * @return {string} - Generated id for the item 48 | */ 49 | async function geocodeItem(item) { 50 | const coords = await geocodeAddress(item.address); 51 | if (!coords) { 52 | return; 53 | } 54 | 55 | try { 56 | const config = 57 | new ddbGeo.GeoDataManagerConfiguration(ddb, process.env.DynamoDBTableName); 58 | config.hashKeyLength = 5; 59 | 60 | const geoTableManager = new ddbGeo.GeoDataManager(config); 61 | 62 | const id = short.generate(); 63 | const geoData = { 64 | RangeKeyValue: { S: id }, 65 | GeoPoint: { 66 | latitude: coords.lat, 67 | longitude: coords.lng, 68 | }, 69 | PutItemInput: { 70 | Item: { 71 | name: { S: item.name }, 72 | address: { S: item.address }, 73 | }, 74 | }, 75 | }; 76 | 77 | await geoTableManager.putPoint(geoData).promise(); 78 | 79 | return geoData; 80 | } catch (err) { 81 | console.log('An error occurred adding coordinates to Dynamo'); 82 | console.log(err); 83 | } 84 | } 85 | 86 | /** 87 | * Uses Geocodio to geocode a specific address 88 | * @param {string} address - Address (line 1, line 2, city, state, zip) you want to geocode 89 | * @return {any} - Coordinates of the address passed in 90 | */ 91 | async function geocodeAddress(address) { 92 | let coords; 93 | try { 94 | const geocoder = new Geocodio(process.env.GeocodioApiKey); 95 | const response = await geocoder.geocode(address); 96 | 97 | if (response && response.results && response.results.length > 0) { 98 | // Results are returned with highest likelihood first, so grab the first one 99 | coords = response.results[0].location; 100 | } 101 | } 102 | catch (err) { 103 | console.log('An error occurred while geocoding the address: ' + address); 104 | console.log(err); 105 | } 106 | 107 | return coords; 108 | } 109 | 110 | /** 111 | * Save metadata about the item we are saving. Dynamodb-geo has a 112 | * limitation with updating existing points. So we need to be able 113 | * to lookup the data for any PUTs 114 | * @param {any} geoData - All data passed into dynamodb-geo 115 | */ 116 | async function saveGeolocationMetadata(geoData) { 117 | try { 118 | let hash = Number(geoData.RangeKeyValue.S.replace(/\D/g, '')); 119 | const params = { 120 | TableName: process.env.DynamoDBTableName, 121 | Item: { 122 | hashKey: hash, 123 | rangeKey: geoData.RangeKeyValue.S, 124 | GeoPoint: geoData.GeoPoint 125 | } 126 | }; 127 | 128 | await documentClient.put(params).promise(); 129 | } 130 | catch (err) { 131 | console.log('An error occurred saving the geolocation metadata'); 132 | console.log(err); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /lambdas/add-item-geolocation/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "add-item-geolocation", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/decimal.js": { 8 | "version": "0.0.30", 9 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/decimal.js/-/decimal.js-0.0.30.tgz", 10 | "integrity": "sha1-B3mNkFldvzk28Q8kDvOMW5KO1fw=" 11 | }, 12 | "@types/long": { 13 | "version": "4.0.0", 14 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/long/-/long-4.0.0.tgz", 15 | "integrity": "sha1-cZVR0jUtMBrIuB23Mqy2vcKNve8=" 16 | }, 17 | "ansi-colors": { 18 | "version": "3.2.3", 19 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-colors/-/ansi-colors-3.2.3.tgz", 20 | "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", 21 | "dev": true 22 | }, 23 | "ansi-regex": { 24 | "version": "3.0.0", 25 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-3.0.0.tgz", 26 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 27 | "dev": true 28 | }, 29 | "ansi-styles": { 30 | "version": "3.2.1", 31 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-styles/-/ansi-styles-3.2.1.tgz", 32 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 33 | "dev": true, 34 | "requires": { 35 | "color-convert": "^1.9.0" 36 | } 37 | }, 38 | "any-base": { 39 | "version": "1.1.0", 40 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/any-base/-/any-base-1.1.0.tgz", 41 | "integrity": "sha1-rhAaYrwIpZe0yatbcInUVmMFSf4=" 42 | }, 43 | "argparse": { 44 | "version": "1.0.10", 45 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/argparse/-/argparse-1.0.10.tgz", 46 | "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", 47 | "dev": true, 48 | "requires": { 49 | "sprintf-js": "~1.0.2" 50 | } 51 | }, 52 | "assertion-error": { 53 | "version": "1.1.0", 54 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/assertion-error/-/assertion-error-1.1.0.tgz", 55 | "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", 56 | "dev": true 57 | }, 58 | "aws-sdk": { 59 | "version": "2.543.0", 60 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.543.0.tgz", 61 | "integrity": "sha512-ABHsA4W7LLYnTBCgtbTt0NF7+66nMCtdcJuAn30+RGzF0bOw3lCguqzootFrMlIOXklddQFJ9kKTXd+p/+uCVQ==", 62 | "dev": true, 63 | "requires": { 64 | "buffer": "4.9.1", 65 | "events": "1.1.1", 66 | "ieee754": "1.1.13", 67 | "jmespath": "0.15.0", 68 | "querystring": "0.2.0", 69 | "sax": "1.2.1", 70 | "url": "0.10.3", 71 | "uuid": "3.3.2", 72 | "xml2js": "0.4.19" 73 | }, 74 | "dependencies": { 75 | "uuid": { 76 | "version": "3.3.2", 77 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/uuid/-/uuid-3.3.2.tgz", 78 | "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", 79 | "dev": true 80 | } 81 | } 82 | }, 83 | "balanced-match": { 84 | "version": "1.0.0", 85 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/balanced-match/-/balanced-match-1.0.0.tgz", 86 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 87 | "dev": true 88 | }, 89 | "base64-js": { 90 | "version": "1.3.1", 91 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 92 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 93 | "dev": true 94 | }, 95 | "brace-expansion": { 96 | "version": "1.1.11", 97 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", 98 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 99 | "dev": true, 100 | "requires": { 101 | "balanced-match": "^1.0.0", 102 | "concat-map": "0.0.1" 103 | } 104 | }, 105 | "browser-stdout": { 106 | "version": "1.3.1", 107 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/browser-stdout/-/browser-stdout-1.3.1.tgz", 108 | "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", 109 | "dev": true 110 | }, 111 | "buffer": { 112 | "version": "4.9.1", 113 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 114 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 115 | "dev": true, 116 | "requires": { 117 | "base64-js": "^1.0.2", 118 | "ieee754": "^1.1.4", 119 | "isarray": "^1.0.0" 120 | } 121 | }, 122 | "camelcase": { 123 | "version": "5.3.1", 124 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/camelcase/-/camelcase-5.3.1.tgz", 125 | "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", 126 | "dev": true 127 | }, 128 | "chai": { 129 | "version": "4.2.0", 130 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chai/-/chai-4.2.0.tgz", 131 | "integrity": "sha1-dgqnLPION5XoSxKHfODoNzeqKeU=", 132 | "dev": true, 133 | "requires": { 134 | "assertion-error": "^1.1.0", 135 | "check-error": "^1.0.2", 136 | "deep-eql": "^3.0.1", 137 | "get-func-name": "^2.0.0", 138 | "pathval": "^1.1.0", 139 | "type-detect": "^4.0.5" 140 | } 141 | }, 142 | "chalk": { 143 | "version": "2.4.2", 144 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chalk/-/chalk-2.4.2.tgz", 145 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 146 | "dev": true, 147 | "requires": { 148 | "ansi-styles": "^3.2.1", 149 | "escape-string-regexp": "^1.0.5", 150 | "supports-color": "^5.3.0" 151 | }, 152 | "dependencies": { 153 | "supports-color": { 154 | "version": "5.5.0", 155 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-5.5.0.tgz", 156 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 157 | "dev": true, 158 | "requires": { 159 | "has-flag": "^3.0.0" 160 | } 161 | } 162 | } 163 | }, 164 | "check-error": { 165 | "version": "1.0.2", 166 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/check-error/-/check-error-1.0.2.tgz", 167 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 168 | "dev": true 169 | }, 170 | "cliui": { 171 | "version": "5.0.0", 172 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/cliui/-/cliui-5.0.0.tgz", 173 | "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", 174 | "dev": true, 175 | "requires": { 176 | "string-width": "^3.1.0", 177 | "strip-ansi": "^5.2.0", 178 | "wrap-ansi": "^5.1.0" 179 | }, 180 | "dependencies": { 181 | "ansi-regex": { 182 | "version": "4.1.0", 183 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 184 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 185 | "dev": true 186 | }, 187 | "string-width": { 188 | "version": "3.1.0", 189 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 190 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 191 | "dev": true, 192 | "requires": { 193 | "emoji-regex": "^7.0.1", 194 | "is-fullwidth-code-point": "^2.0.0", 195 | "strip-ansi": "^5.1.0" 196 | } 197 | }, 198 | "strip-ansi": { 199 | "version": "5.2.0", 200 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 201 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 202 | "dev": true, 203 | "requires": { 204 | "ansi-regex": "^4.1.0" 205 | } 206 | } 207 | } 208 | }, 209 | "color-convert": { 210 | "version": "1.9.3", 211 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-convert/-/color-convert-1.9.3.tgz", 212 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 213 | "dev": true, 214 | "requires": { 215 | "color-name": "1.1.3" 216 | } 217 | }, 218 | "color-name": { 219 | "version": "1.1.3", 220 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-name/-/color-name-1.1.3.tgz", 221 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 222 | "dev": true 223 | }, 224 | "concat-map": { 225 | "version": "0.0.1", 226 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/concat-map/-/concat-map-0.0.1.tgz", 227 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 228 | "dev": true 229 | }, 230 | "debug": { 231 | "version": "3.1.0", 232 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.1.0.tgz", 233 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 234 | "requires": { 235 | "ms": "2.0.0" 236 | } 237 | }, 238 | "decamelize": { 239 | "version": "1.2.0", 240 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decamelize/-/decamelize-1.2.0.tgz", 241 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 242 | "dev": true 243 | }, 244 | "decimal.js": { 245 | "version": "6.0.0", 246 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decimal.js/-/decimal.js-6.0.0.tgz", 247 | "integrity": "sha1-T9WNBjfzb9vBq6EyC8Pyzug8oPI=" 248 | }, 249 | "deep-eql": { 250 | "version": "3.0.1", 251 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/deep-eql/-/deep-eql-3.0.1.tgz", 252 | "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", 253 | "dev": true, 254 | "requires": { 255 | "type-detect": "^4.0.0" 256 | } 257 | }, 258 | "define-properties": { 259 | "version": "1.1.3", 260 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/define-properties/-/define-properties-1.1.3.tgz", 261 | "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", 262 | "dev": true, 263 | "requires": { 264 | "object-keys": "^1.0.12" 265 | } 266 | }, 267 | "diff": { 268 | "version": "3.5.0", 269 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/diff/-/diff-3.5.0.tgz", 270 | "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", 271 | "dev": true 272 | }, 273 | "dynamodb-geo": { 274 | "version": "0.4.0", 275 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/dynamodb-geo/-/dynamodb-geo-0.4.0.tgz", 276 | "integrity": "sha1-T0EF39urEsuEjmQjesibNhLNrh4=", 277 | "requires": { 278 | "@types/decimal.js": "^0.0.30", 279 | "@types/long": ">=3", 280 | "nodes2ts": "^1.1.10" 281 | } 282 | }, 283 | "emoji-regex": { 284 | "version": "7.0.3", 285 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/emoji-regex/-/emoji-regex-7.0.3.tgz", 286 | "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", 287 | "dev": true 288 | }, 289 | "es-abstract": { 290 | "version": "1.17.0", 291 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-abstract/-/es-abstract-1.17.0.tgz", 292 | "integrity": "sha1-9CpRfQA2pVkduyxGNZHci7UDCbE=", 293 | "dev": true, 294 | "requires": { 295 | "es-to-primitive": "^1.2.1", 296 | "function-bind": "^1.1.1", 297 | "has": "^1.0.3", 298 | "has-symbols": "^1.0.1", 299 | "is-callable": "^1.1.5", 300 | "is-regex": "^1.0.5", 301 | "object-inspect": "^1.7.0", 302 | "object-keys": "^1.1.1", 303 | "object.assign": "^4.1.0", 304 | "string.prototype.trimleft": "^2.1.1", 305 | "string.prototype.trimright": "^2.1.1" 306 | } 307 | }, 308 | "es-to-primitive": { 309 | "version": "1.2.1", 310 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 311 | "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", 312 | "dev": true, 313 | "requires": { 314 | "is-callable": "^1.1.4", 315 | "is-date-object": "^1.0.1", 316 | "is-symbol": "^1.0.2" 317 | } 318 | }, 319 | "escape-string-regexp": { 320 | "version": "1.0.5", 321 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 322 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 323 | "dev": true 324 | }, 325 | "esprima": { 326 | "version": "4.0.1", 327 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/esprima/-/esprima-4.0.1.tgz", 328 | "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", 329 | "dev": true 330 | }, 331 | "events": { 332 | "version": "1.1.1", 333 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 334 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 335 | "dev": true 336 | }, 337 | "find-up": { 338 | "version": "3.0.0", 339 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/find-up/-/find-up-3.0.0.tgz", 340 | "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", 341 | "dev": true, 342 | "requires": { 343 | "locate-path": "^3.0.0" 344 | } 345 | }, 346 | "flat": { 347 | "version": "4.1.0", 348 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/flat/-/flat-4.1.0.tgz", 349 | "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", 350 | "dev": true, 351 | "requires": { 352 | "is-buffer": "~2.0.3" 353 | } 354 | }, 355 | "follow-redirects": { 356 | "version": "1.5.10", 357 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/follow-redirects/-/follow-redirects-1.5.10.tgz", 358 | "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", 359 | "requires": { 360 | "debug": "=3.1.0" 361 | } 362 | }, 363 | "fs.realpath": { 364 | "version": "1.0.0", 365 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", 366 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 367 | "dev": true 368 | }, 369 | "function-bind": { 370 | "version": "1.1.1", 371 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/function-bind/-/function-bind-1.1.1.tgz", 372 | "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", 373 | "dev": true 374 | }, 375 | "geocodio-library-node": { 376 | "version": "1.0.0", 377 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/geocodio-library-node/-/geocodio-library-node-1.0.0.tgz", 378 | "integrity": "sha1-oYEt4LcbCQhl862cbHwQewvpBkE=", 379 | "requires": { 380 | "axios": "^0.19.0" 381 | }, 382 | "dependencies": { 383 | "axios": { 384 | "version": "0.19.0", 385 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/axios/-/axios-0.19.0.tgz", 386 | "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=", 387 | "requires": { 388 | "follow-redirects": "1.5.10", 389 | "is-buffer": "^2.0.2" 390 | } 391 | } 392 | } 393 | }, 394 | "get-caller-file": { 395 | "version": "2.0.5", 396 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", 397 | "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", 398 | "dev": true 399 | }, 400 | "get-func-name": { 401 | "version": "2.0.0", 402 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-func-name/-/get-func-name-2.0.0.tgz", 403 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 404 | "dev": true 405 | }, 406 | "glob": { 407 | "version": "7.1.3", 408 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/glob/-/glob-7.1.3.tgz", 409 | "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", 410 | "dev": true, 411 | "requires": { 412 | "fs.realpath": "^1.0.0", 413 | "inflight": "^1.0.4", 414 | "inherits": "2", 415 | "minimatch": "^3.0.4", 416 | "once": "^1.3.0", 417 | "path-is-absolute": "^1.0.0" 418 | } 419 | }, 420 | "growl": { 421 | "version": "1.10.5", 422 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/growl/-/growl-1.10.5.tgz", 423 | "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", 424 | "dev": true 425 | }, 426 | "has": { 427 | "version": "1.0.3", 428 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has/-/has-1.0.3.tgz", 429 | "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", 430 | "dev": true, 431 | "requires": { 432 | "function-bind": "^1.1.1" 433 | } 434 | }, 435 | "has-flag": { 436 | "version": "3.0.0", 437 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-flag/-/has-flag-3.0.0.tgz", 438 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 439 | "dev": true 440 | }, 441 | "has-symbols": { 442 | "version": "1.0.1", 443 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-symbols/-/has-symbols-1.0.1.tgz", 444 | "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", 445 | "dev": true 446 | }, 447 | "he": { 448 | "version": "1.2.0", 449 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/he/-/he-1.2.0.tgz", 450 | "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", 451 | "dev": true 452 | }, 453 | "http-status-codes": { 454 | "version": "1.4.0", 455 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/http-status-codes/-/http-status-codes-1.4.0.tgz", 456 | "integrity": "sha1-bkwV0W/zqeLfA7ifOlXhquBftHc=" 457 | }, 458 | "ieee754": { 459 | "version": "1.1.13", 460 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 461 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 462 | "dev": true 463 | }, 464 | "inflight": { 465 | "version": "1.0.6", 466 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inflight/-/inflight-1.0.6.tgz", 467 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 468 | "dev": true, 469 | "requires": { 470 | "once": "^1.3.0", 471 | "wrappy": "1" 472 | } 473 | }, 474 | "inherits": { 475 | "version": "2.0.4", 476 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inherits/-/inherits-2.0.4.tgz", 477 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", 478 | "dev": true 479 | }, 480 | "is-buffer": { 481 | "version": "2.0.4", 482 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-buffer/-/is-buffer-2.0.4.tgz", 483 | "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=" 484 | }, 485 | "is-callable": { 486 | "version": "1.1.5", 487 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-callable/-/is-callable-1.1.5.tgz", 488 | "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", 489 | "dev": true 490 | }, 491 | "is-date-object": { 492 | "version": "1.0.2", 493 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-date-object/-/is-date-object-1.0.2.tgz", 494 | "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", 495 | "dev": true 496 | }, 497 | "is-fullwidth-code-point": { 498 | "version": "2.0.0", 499 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 500 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 501 | "dev": true 502 | }, 503 | "is-regex": { 504 | "version": "1.0.5", 505 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-regex/-/is-regex-1.0.5.tgz", 506 | "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", 507 | "dev": true, 508 | "requires": { 509 | "has": "^1.0.3" 510 | } 511 | }, 512 | "is-symbol": { 513 | "version": "1.0.3", 514 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-symbol/-/is-symbol-1.0.3.tgz", 515 | "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", 516 | "dev": true, 517 | "requires": { 518 | "has-symbols": "^1.0.1" 519 | } 520 | }, 521 | "isarray": { 522 | "version": "1.0.0", 523 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 524 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 525 | "dev": true 526 | }, 527 | "isexe": { 528 | "version": "2.0.0", 529 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/isexe/-/isexe-2.0.0.tgz", 530 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 531 | "dev": true 532 | }, 533 | "jmespath": { 534 | "version": "0.15.0", 535 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 536 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", 537 | "dev": true 538 | }, 539 | "js-yaml": { 540 | "version": "3.13.1", 541 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/js-yaml/-/js-yaml-3.13.1.tgz", 542 | "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", 543 | "dev": true, 544 | "requires": { 545 | "argparse": "^1.0.7", 546 | "esprima": "^4.0.0" 547 | } 548 | }, 549 | "locate-path": { 550 | "version": "3.0.0", 551 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/locate-path/-/locate-path-3.0.0.tgz", 552 | "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", 553 | "dev": true, 554 | "requires": { 555 | "p-locate": "^3.0.0", 556 | "path-exists": "^3.0.0" 557 | } 558 | }, 559 | "lodash": { 560 | "version": "4.17.15", 561 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/lodash/-/lodash-4.17.15.tgz", 562 | "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", 563 | "dev": true 564 | }, 565 | "log-symbols": { 566 | "version": "2.2.0", 567 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/log-symbols/-/log-symbols-2.2.0.tgz", 568 | "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", 569 | "dev": true, 570 | "requires": { 571 | "chalk": "^2.0.1" 572 | } 573 | }, 574 | "long": { 575 | "version": "3.2.0", 576 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/long/-/long-3.2.0.tgz", 577 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 578 | }, 579 | "minimatch": { 580 | "version": "3.0.4", 581 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimatch/-/minimatch-3.0.4.tgz", 582 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 583 | "dev": true, 584 | "requires": { 585 | "brace-expansion": "^1.1.7" 586 | } 587 | }, 588 | "minimist": { 589 | "version": "0.0.8", 590 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimist/-/minimist-0.0.8.tgz", 591 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 592 | "dev": true 593 | }, 594 | "mkdirp": { 595 | "version": "0.5.1", 596 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mkdirp/-/mkdirp-0.5.1.tgz", 597 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 598 | "dev": true, 599 | "requires": { 600 | "minimist": "0.0.8" 601 | } 602 | }, 603 | "mocha": { 604 | "version": "6.2.2", 605 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mocha/-/mocha-6.2.2.tgz", 606 | "integrity": "sha1-XYmH4olAyviVen12ZLkQ3Fsv6iA=", 607 | "dev": true, 608 | "requires": { 609 | "ansi-colors": "3.2.3", 610 | "browser-stdout": "1.3.1", 611 | "debug": "3.2.6", 612 | "diff": "3.5.0", 613 | "escape-string-regexp": "1.0.5", 614 | "find-up": "3.0.0", 615 | "glob": "7.1.3", 616 | "growl": "1.10.5", 617 | "he": "1.2.0", 618 | "js-yaml": "3.13.1", 619 | "log-symbols": "2.2.0", 620 | "minimatch": "3.0.4", 621 | "mkdirp": "0.5.1", 622 | "ms": "2.1.1", 623 | "node-environment-flags": "1.0.5", 624 | "object.assign": "4.1.0", 625 | "strip-json-comments": "2.0.1", 626 | "supports-color": "6.0.0", 627 | "which": "1.3.1", 628 | "wide-align": "1.1.3", 629 | "yargs": "13.3.0", 630 | "yargs-parser": "13.1.1", 631 | "yargs-unparser": "1.6.0" 632 | }, 633 | "dependencies": { 634 | "debug": { 635 | "version": "3.2.6", 636 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.2.6.tgz", 637 | "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", 638 | "dev": true, 639 | "requires": { 640 | "ms": "^2.1.1" 641 | } 642 | }, 643 | "ms": { 644 | "version": "2.1.1", 645 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.1.1.tgz", 646 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", 647 | "dev": true 648 | } 649 | } 650 | }, 651 | "ms": { 652 | "version": "2.0.0", 653 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.0.0.tgz", 654 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 655 | }, 656 | "node-environment-flags": { 657 | "version": "1.0.5", 658 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 659 | "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", 660 | "dev": true, 661 | "requires": { 662 | "object.getownpropertydescriptors": "^2.0.3", 663 | "semver": "^5.7.0" 664 | } 665 | }, 666 | "nodes2ts": { 667 | "version": "1.1.10", 668 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/nodes2ts/-/nodes2ts-1.1.10.tgz", 669 | "integrity": "sha1-eCjhNDyn1B0WWNgzUkUnQKKcJ3M=", 670 | "requires": { 671 | "decimal.js": "^6.0.0", 672 | "long": "^3.2.0" 673 | } 674 | }, 675 | "object-inspect": { 676 | "version": "1.7.0", 677 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-inspect/-/object-inspect-1.7.0.tgz", 678 | "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", 679 | "dev": true 680 | }, 681 | "object-keys": { 682 | "version": "1.1.1", 683 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-keys/-/object-keys-1.1.1.tgz", 684 | "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", 685 | "dev": true 686 | }, 687 | "object.assign": { 688 | "version": "4.1.0", 689 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.assign/-/object.assign-4.1.0.tgz", 690 | "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", 691 | "dev": true, 692 | "requires": { 693 | "define-properties": "^1.1.2", 694 | "function-bind": "^1.1.1", 695 | "has-symbols": "^1.0.0", 696 | "object-keys": "^1.0.11" 697 | } 698 | }, 699 | "object.getownpropertydescriptors": { 700 | "version": "2.1.0", 701 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 702 | "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", 703 | "dev": true, 704 | "requires": { 705 | "define-properties": "^1.1.3", 706 | "es-abstract": "^1.17.0-next.1" 707 | } 708 | }, 709 | "once": { 710 | "version": "1.4.0", 711 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/once/-/once-1.4.0.tgz", 712 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 713 | "dev": true, 714 | "requires": { 715 | "wrappy": "1" 716 | } 717 | }, 718 | "p-limit": { 719 | "version": "2.2.2", 720 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-limit/-/p-limit-2.2.2.tgz", 721 | "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", 722 | "dev": true, 723 | "requires": { 724 | "p-try": "^2.0.0" 725 | } 726 | }, 727 | "p-locate": { 728 | "version": "3.0.0", 729 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-locate/-/p-locate-3.0.0.tgz", 730 | "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", 731 | "dev": true, 732 | "requires": { 733 | "p-limit": "^2.0.0" 734 | } 735 | }, 736 | "p-try": { 737 | "version": "2.2.0", 738 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-try/-/p-try-2.2.0.tgz", 739 | "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", 740 | "dev": true 741 | }, 742 | "path-exists": { 743 | "version": "3.0.0", 744 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-exists/-/path-exists-3.0.0.tgz", 745 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 746 | "dev": true 747 | }, 748 | "path-is-absolute": { 749 | "version": "1.0.1", 750 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 751 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 752 | "dev": true 753 | }, 754 | "pathval": { 755 | "version": "1.1.0", 756 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/pathval/-/pathval-1.1.0.tgz", 757 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 758 | "dev": true 759 | }, 760 | "punycode": { 761 | "version": "1.3.2", 762 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 763 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 764 | "dev": true 765 | }, 766 | "querystring": { 767 | "version": "0.2.0", 768 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 769 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 770 | "dev": true 771 | }, 772 | "require-directory": { 773 | "version": "2.1.1", 774 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-directory/-/require-directory-2.1.1.tgz", 775 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 776 | "dev": true 777 | }, 778 | "require-main-filename": { 779 | "version": "2.0.0", 780 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-main-filename/-/require-main-filename-2.0.0.tgz", 781 | "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", 782 | "dev": true 783 | }, 784 | "sax": { 785 | "version": "1.2.1", 786 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 787 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", 788 | "dev": true 789 | }, 790 | "semver": { 791 | "version": "5.7.1", 792 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/semver/-/semver-5.7.1.tgz", 793 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", 794 | "dev": true 795 | }, 796 | "set-blocking": { 797 | "version": "2.0.0", 798 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/set-blocking/-/set-blocking-2.0.0.tgz", 799 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 800 | "dev": true 801 | }, 802 | "short-uuid": { 803 | "version": "3.1.1", 804 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/short-uuid/-/short-uuid-3.1.1.tgz", 805 | "integrity": "sha1-P/QnB0tfp4IsN5OZTRinqC4vc6Q=", 806 | "requires": { 807 | "any-base": "^1.1.0", 808 | "uuid": "^3.3.2" 809 | } 810 | }, 811 | "sprintf-js": { 812 | "version": "1.0.3", 813 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/sprintf-js/-/sprintf-js-1.0.3.tgz", 814 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 815 | "dev": true 816 | }, 817 | "string-width": { 818 | "version": "2.1.1", 819 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-2.1.1.tgz", 820 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 821 | "dev": true, 822 | "requires": { 823 | "is-fullwidth-code-point": "^2.0.0", 824 | "strip-ansi": "^4.0.0" 825 | } 826 | }, 827 | "string.prototype.trimleft": { 828 | "version": "2.1.1", 829 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 830 | "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", 831 | "dev": true, 832 | "requires": { 833 | "define-properties": "^1.1.3", 834 | "function-bind": "^1.1.1" 835 | } 836 | }, 837 | "string.prototype.trimright": { 838 | "version": "2.1.1", 839 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 840 | "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", 841 | "dev": true, 842 | "requires": { 843 | "define-properties": "^1.1.3", 844 | "function-bind": "^1.1.1" 845 | } 846 | }, 847 | "strip-ansi": { 848 | "version": "4.0.0", 849 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-4.0.0.tgz", 850 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 851 | "dev": true, 852 | "requires": { 853 | "ansi-regex": "^3.0.0" 854 | } 855 | }, 856 | "strip-json-comments": { 857 | "version": "2.0.1", 858 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 859 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 860 | "dev": true 861 | }, 862 | "supports-color": { 863 | "version": "6.0.0", 864 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-6.0.0.tgz", 865 | "integrity": "sha1-ds/nQs8fQbubHCmtAwaMBbTA5Ao=", 866 | "dev": true, 867 | "requires": { 868 | "has-flag": "^3.0.0" 869 | } 870 | }, 871 | "type-detect": { 872 | "version": "4.0.8", 873 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/type-detect/-/type-detect-4.0.8.tgz", 874 | "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", 875 | "dev": true 876 | }, 877 | "url": { 878 | "version": "0.10.3", 879 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 880 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 881 | "dev": true, 882 | "requires": { 883 | "punycode": "1.3.2", 884 | "querystring": "0.2.0" 885 | } 886 | }, 887 | "uuid": { 888 | "version": "3.3.3", 889 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/uuid/-/uuid-3.3.3.tgz", 890 | "integrity": "sha1-RWjwIW54dg7h2/Ok0s9T4iQRKGY=" 891 | }, 892 | "which": { 893 | "version": "1.3.1", 894 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which/-/which-1.3.1.tgz", 895 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 896 | "dev": true, 897 | "requires": { 898 | "isexe": "^2.0.0" 899 | } 900 | }, 901 | "which-module": { 902 | "version": "2.0.0", 903 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which-module/-/which-module-2.0.0.tgz", 904 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 905 | "dev": true 906 | }, 907 | "wide-align": { 908 | "version": "1.1.3", 909 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wide-align/-/wide-align-1.1.3.tgz", 910 | "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", 911 | "dev": true, 912 | "requires": { 913 | "string-width": "^1.0.2 || 2" 914 | } 915 | }, 916 | "wrap-ansi": { 917 | "version": "5.1.0", 918 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 919 | "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", 920 | "dev": true, 921 | "requires": { 922 | "ansi-styles": "^3.2.0", 923 | "string-width": "^3.0.0", 924 | "strip-ansi": "^5.0.0" 925 | }, 926 | "dependencies": { 927 | "ansi-regex": { 928 | "version": "4.1.0", 929 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 930 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 931 | "dev": true 932 | }, 933 | "string-width": { 934 | "version": "3.1.0", 935 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 936 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 937 | "dev": true, 938 | "requires": { 939 | "emoji-regex": "^7.0.1", 940 | "is-fullwidth-code-point": "^2.0.0", 941 | "strip-ansi": "^5.1.0" 942 | } 943 | }, 944 | "strip-ansi": { 945 | "version": "5.2.0", 946 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 947 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 948 | "dev": true, 949 | "requires": { 950 | "ansi-regex": "^4.1.0" 951 | } 952 | } 953 | } 954 | }, 955 | "wrappy": { 956 | "version": "1.0.2", 957 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrappy/-/wrappy-1.0.2.tgz", 958 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 959 | "dev": true 960 | }, 961 | "xml2js": { 962 | "version": "0.4.19", 963 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 964 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 965 | "dev": true, 966 | "requires": { 967 | "sax": ">=0.6.0", 968 | "xmlbuilder": "~9.0.1" 969 | } 970 | }, 971 | "xmlbuilder": { 972 | "version": "9.0.7", 973 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 974 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 975 | "dev": true 976 | }, 977 | "y18n": { 978 | "version": "4.0.0", 979 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/y18n/-/y18n-4.0.0.tgz", 980 | "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", 981 | "dev": true 982 | }, 983 | "yargs": { 984 | "version": "13.3.0", 985 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs/-/yargs-13.3.0.tgz", 986 | "integrity": "sha1-TGV6VeB+Xyz5R/ijZlZ8BKDe3IM=", 987 | "dev": true, 988 | "requires": { 989 | "cliui": "^5.0.0", 990 | "find-up": "^3.0.0", 991 | "get-caller-file": "^2.0.1", 992 | "require-directory": "^2.1.1", 993 | "require-main-filename": "^2.0.0", 994 | "set-blocking": "^2.0.0", 995 | "string-width": "^3.0.0", 996 | "which-module": "^2.0.0", 997 | "y18n": "^4.0.0", 998 | "yargs-parser": "^13.1.1" 999 | }, 1000 | "dependencies": { 1001 | "ansi-regex": { 1002 | "version": "4.1.0", 1003 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 1004 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 1005 | "dev": true 1006 | }, 1007 | "string-width": { 1008 | "version": "3.1.0", 1009 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 1010 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 1011 | "dev": true, 1012 | "requires": { 1013 | "emoji-regex": "^7.0.1", 1014 | "is-fullwidth-code-point": "^2.0.0", 1015 | "strip-ansi": "^5.1.0" 1016 | } 1017 | }, 1018 | "strip-ansi": { 1019 | "version": "5.2.0", 1020 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 1021 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 1022 | "dev": true, 1023 | "requires": { 1024 | "ansi-regex": "^4.1.0" 1025 | } 1026 | } 1027 | } 1028 | }, 1029 | "yargs-parser": { 1030 | "version": "13.1.1", 1031 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-parser/-/yargs-parser-13.1.1.tgz", 1032 | "integrity": "sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=", 1033 | "dev": true, 1034 | "requires": { 1035 | "camelcase": "^5.0.0", 1036 | "decamelize": "^1.2.0" 1037 | } 1038 | }, 1039 | "yargs-unparser": { 1040 | "version": "1.6.0", 1041 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1042 | "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", 1043 | "dev": true, 1044 | "requires": { 1045 | "flat": "^4.1.0", 1046 | "lodash": "^4.17.15", 1047 | "yargs": "^13.3.0" 1048 | } 1049 | } 1050 | } 1051 | } 1052 | -------------------------------------------------------------------------------- /lambdas/add-item-geolocation/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "add-item-geolocation", 3 | "version": "1.0.0", 4 | "description": "Add an item by address into the geolocation table", 5 | "main": "app.js", 6 | "license": "MIT", 7 | "dependencies": { 8 | "dynamodb-geo": "^0.4.0", 9 | "geocodio-library-node": "^1.0.0", 10 | "http-status-codes": "^1.4.0", 11 | "short-uuid": "^3.1.1" 12 | }, 13 | "scripts": { 14 | "test": "mocha **/tests/unit/*.js" 15 | }, 16 | "devDependencies": { 17 | "aws-sdk": "^2.543.0", 18 | "chai": "^4.2.0", 19 | "mocha": "^6.1.4" 20 | }, 21 | "jshintConfig": { 22 | "esversion": 8 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /lambdas/delete-item/.npmignore: -------------------------------------------------------------------------------- 1 | tests/* 2 | -------------------------------------------------------------------------------- /lambdas/delete-item/app.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk'); 2 | const ddb = new AWS.DynamoDB(); 3 | const DYNAMO_CLIENT = require('aws-sdk/clients/dynamodb'); 4 | const documentClient = new DYNAMO_CLIENT.DocumentClient(); 5 | const ddbGeo = require('dynamodb-geo'); 6 | const httpStatusCode = require('http-status-codes'); 7 | let response; 8 | 9 | exports.lambdaHandler = async (event, context) => { 10 | const id = event.pathParameters.itemId; 11 | 12 | const item = await getItem(id); 13 | if (!item) { 14 | response = { 15 | statusCode: httpStatusCode.NOT_FOUND, 16 | body: JSON.stringify({ 17 | message: `An item with the id '${id}' could not be found` 18 | }) 19 | }; 20 | } else { 21 | await deleteExistingItem(item); 22 | await deleteExistingItemMetadata(id); 23 | 24 | response = { 25 | statusCode: httpStatusCode.NO_CONTENT 26 | }; 27 | } 28 | 29 | return response; 30 | }; 31 | 32 | /** 33 | * @param {string} id - Id of the geolocated item 34 | */ 35 | async function getItem(id) { 36 | try { 37 | let hash = Number(id.replace(/\D/g, '')); 38 | const params = { 39 | TableName: process.env.DynamoDBTableName, 40 | Key: { 41 | hashKey: hash, 42 | rangeKey: id 43 | } 44 | }; 45 | 46 | const result = await documentClient.get(params).promise(); 47 | return result.Item; 48 | } 49 | catch (err) { 50 | console.log('An error occurred loading the geolocation metadata'); 51 | console.log(err); 52 | } 53 | } 54 | 55 | /** 56 | * Deletes the existing item using GeoDataManager 57 | * @param {any} item - Item details currently stored in Dynamo 58 | */ 59 | async function deleteExistingItem(item) { 60 | try { 61 | const config = 62 | new ddbGeo.GeoDataManagerConfiguration(ddb, process.env.DynamoDBTableName); 63 | config.hashKeyLength = 5; 64 | 65 | const geoTableManager = new ddbGeo.GeoDataManager(config); 66 | 67 | const oldGeoData = { 68 | RangeKeyValue: { S: item.rangeKey }, 69 | GeoPoint: item.GeoPoint 70 | }; 71 | 72 | await geoTableManager.deletePoint(oldGeoData).promise(); 73 | } catch (err) { 74 | console.log('An error occurred deleting the item'); 75 | console.log(err); 76 | } 77 | } 78 | 79 | /** 80 | * Delete the item metadata out of DynamoDB 81 | * @param {string} id - Identifier for the item metadata 82 | */ 83 | async function deleteExistingItemMetadata(id) { 84 | try { 85 | let hash = Number(id.replace(/\D/g, '')); 86 | const params = { 87 | TableName: process.env.DynamoDBTableName, 88 | Key: { 89 | hashKey: hash, 90 | rangeKey: id 91 | } 92 | }; 93 | 94 | await documentClient.delete(params).promise(); 95 | } 96 | catch (err) { 97 | console.log('An error occurred deleting item metadata'); 98 | console.log(err); 99 | } 100 | } 101 | 102 | -------------------------------------------------------------------------------- /lambdas/delete-item/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "add-item-geolocation", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/decimal.js": { 8 | "version": "0.0.30", 9 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/decimal.js/-/decimal.js-0.0.30.tgz", 10 | "integrity": "sha1-B3mNkFldvzk28Q8kDvOMW5KO1fw=" 11 | }, 12 | "@types/long": { 13 | "version": "4.0.0", 14 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/long/-/long-4.0.0.tgz", 15 | "integrity": "sha1-cZVR0jUtMBrIuB23Mqy2vcKNve8=" 16 | }, 17 | "ansi-colors": { 18 | "version": "3.2.3", 19 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-colors/-/ansi-colors-3.2.3.tgz", 20 | "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", 21 | "dev": true 22 | }, 23 | "ansi-regex": { 24 | "version": "3.0.0", 25 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-3.0.0.tgz", 26 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 27 | "dev": true 28 | }, 29 | "ansi-styles": { 30 | "version": "3.2.1", 31 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-styles/-/ansi-styles-3.2.1.tgz", 32 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 33 | "dev": true, 34 | "requires": { 35 | "color-convert": "^1.9.0" 36 | } 37 | }, 38 | "any-base": { 39 | "version": "1.1.0", 40 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/any-base/-/any-base-1.1.0.tgz", 41 | "integrity": "sha1-rhAaYrwIpZe0yatbcInUVmMFSf4=" 42 | }, 43 | "argparse": { 44 | "version": "1.0.10", 45 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/argparse/-/argparse-1.0.10.tgz", 46 | "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", 47 | "dev": true, 48 | "requires": { 49 | "sprintf-js": "~1.0.2" 50 | } 51 | }, 52 | "assertion-error": { 53 | "version": "1.1.0", 54 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/assertion-error/-/assertion-error-1.1.0.tgz", 55 | "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", 56 | "dev": true 57 | }, 58 | "aws-sdk": { 59 | "version": "2.543.0", 60 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.543.0.tgz", 61 | "integrity": "sha512-ABHsA4W7LLYnTBCgtbTt0NF7+66nMCtdcJuAn30+RGzF0bOw3lCguqzootFrMlIOXklddQFJ9kKTXd+p/+uCVQ==", 62 | "dev": true, 63 | "requires": { 64 | "buffer": "4.9.1", 65 | "events": "1.1.1", 66 | "ieee754": "1.1.13", 67 | "jmespath": "0.15.0", 68 | "querystring": "0.2.0", 69 | "sax": "1.2.1", 70 | "url": "0.10.3", 71 | "uuid": "3.3.2", 72 | "xml2js": "0.4.19" 73 | }, 74 | "dependencies": { 75 | "uuid": { 76 | "version": "3.3.2", 77 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/uuid/-/uuid-3.3.2.tgz", 78 | "integrity": "sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE=", 79 | "dev": true 80 | } 81 | } 82 | }, 83 | "balanced-match": { 84 | "version": "1.0.0", 85 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/balanced-match/-/balanced-match-1.0.0.tgz", 86 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 87 | "dev": true 88 | }, 89 | "base64-js": { 90 | "version": "1.3.1", 91 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 92 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 93 | "dev": true 94 | }, 95 | "brace-expansion": { 96 | "version": "1.1.11", 97 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", 98 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 99 | "dev": true, 100 | "requires": { 101 | "balanced-match": "^1.0.0", 102 | "concat-map": "0.0.1" 103 | } 104 | }, 105 | "browser-stdout": { 106 | "version": "1.3.1", 107 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/browser-stdout/-/browser-stdout-1.3.1.tgz", 108 | "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", 109 | "dev": true 110 | }, 111 | "buffer": { 112 | "version": "4.9.1", 113 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 114 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 115 | "dev": true, 116 | "requires": { 117 | "base64-js": "^1.0.2", 118 | "ieee754": "^1.1.4", 119 | "isarray": "^1.0.0" 120 | } 121 | }, 122 | "camelcase": { 123 | "version": "5.3.1", 124 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/camelcase/-/camelcase-5.3.1.tgz", 125 | "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", 126 | "dev": true 127 | }, 128 | "chai": { 129 | "version": "4.2.0", 130 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chai/-/chai-4.2.0.tgz", 131 | "integrity": "sha1-dgqnLPION5XoSxKHfODoNzeqKeU=", 132 | "dev": true, 133 | "requires": { 134 | "assertion-error": "^1.1.0", 135 | "check-error": "^1.0.2", 136 | "deep-eql": "^3.0.1", 137 | "get-func-name": "^2.0.0", 138 | "pathval": "^1.1.0", 139 | "type-detect": "^4.0.5" 140 | } 141 | }, 142 | "chalk": { 143 | "version": "2.4.2", 144 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chalk/-/chalk-2.4.2.tgz", 145 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 146 | "dev": true, 147 | "requires": { 148 | "ansi-styles": "^3.2.1", 149 | "escape-string-regexp": "^1.0.5", 150 | "supports-color": "^5.3.0" 151 | }, 152 | "dependencies": { 153 | "supports-color": { 154 | "version": "5.5.0", 155 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-5.5.0.tgz", 156 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 157 | "dev": true, 158 | "requires": { 159 | "has-flag": "^3.0.0" 160 | } 161 | } 162 | } 163 | }, 164 | "check-error": { 165 | "version": "1.0.2", 166 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/check-error/-/check-error-1.0.2.tgz", 167 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 168 | "dev": true 169 | }, 170 | "cliui": { 171 | "version": "5.0.0", 172 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/cliui/-/cliui-5.0.0.tgz", 173 | "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", 174 | "dev": true, 175 | "requires": { 176 | "string-width": "^3.1.0", 177 | "strip-ansi": "^5.2.0", 178 | "wrap-ansi": "^5.1.0" 179 | }, 180 | "dependencies": { 181 | "ansi-regex": { 182 | "version": "4.1.0", 183 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 184 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 185 | "dev": true 186 | }, 187 | "string-width": { 188 | "version": "3.1.0", 189 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 190 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 191 | "dev": true, 192 | "requires": { 193 | "emoji-regex": "^7.0.1", 194 | "is-fullwidth-code-point": "^2.0.0", 195 | "strip-ansi": "^5.1.0" 196 | } 197 | }, 198 | "strip-ansi": { 199 | "version": "5.2.0", 200 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 201 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 202 | "dev": true, 203 | "requires": { 204 | "ansi-regex": "^4.1.0" 205 | } 206 | } 207 | } 208 | }, 209 | "color-convert": { 210 | "version": "1.9.3", 211 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-convert/-/color-convert-1.9.3.tgz", 212 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 213 | "dev": true, 214 | "requires": { 215 | "color-name": "1.1.3" 216 | } 217 | }, 218 | "color-name": { 219 | "version": "1.1.3", 220 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-name/-/color-name-1.1.3.tgz", 221 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 222 | "dev": true 223 | }, 224 | "concat-map": { 225 | "version": "0.0.1", 226 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/concat-map/-/concat-map-0.0.1.tgz", 227 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 228 | "dev": true 229 | }, 230 | "debug": { 231 | "version": "3.1.0", 232 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.1.0.tgz", 233 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 234 | "requires": { 235 | "ms": "2.0.0" 236 | } 237 | }, 238 | "decamelize": { 239 | "version": "1.2.0", 240 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decamelize/-/decamelize-1.2.0.tgz", 241 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 242 | "dev": true 243 | }, 244 | "decimal.js": { 245 | "version": "6.0.0", 246 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decimal.js/-/decimal.js-6.0.0.tgz", 247 | "integrity": "sha1-T9WNBjfzb9vBq6EyC8Pyzug8oPI=" 248 | }, 249 | "deep-eql": { 250 | "version": "3.0.1", 251 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/deep-eql/-/deep-eql-3.0.1.tgz", 252 | "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", 253 | "dev": true, 254 | "requires": { 255 | "type-detect": "^4.0.0" 256 | } 257 | }, 258 | "define-properties": { 259 | "version": "1.1.3", 260 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/define-properties/-/define-properties-1.1.3.tgz", 261 | "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", 262 | "dev": true, 263 | "requires": { 264 | "object-keys": "^1.0.12" 265 | } 266 | }, 267 | "diff": { 268 | "version": "3.5.0", 269 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/diff/-/diff-3.5.0.tgz", 270 | "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", 271 | "dev": true 272 | }, 273 | "dynamodb-geo": { 274 | "version": "0.4.0", 275 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/dynamodb-geo/-/dynamodb-geo-0.4.0.tgz", 276 | "integrity": "sha1-T0EF39urEsuEjmQjesibNhLNrh4=", 277 | "requires": { 278 | "@types/decimal.js": "^0.0.30", 279 | "@types/long": ">=3", 280 | "nodes2ts": "^1.1.10" 281 | } 282 | }, 283 | "emoji-regex": { 284 | "version": "7.0.3", 285 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/emoji-regex/-/emoji-regex-7.0.3.tgz", 286 | "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", 287 | "dev": true 288 | }, 289 | "es-abstract": { 290 | "version": "1.17.0", 291 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-abstract/-/es-abstract-1.17.0.tgz", 292 | "integrity": "sha1-9CpRfQA2pVkduyxGNZHci7UDCbE=", 293 | "dev": true, 294 | "requires": { 295 | "es-to-primitive": "^1.2.1", 296 | "function-bind": "^1.1.1", 297 | "has": "^1.0.3", 298 | "has-symbols": "^1.0.1", 299 | "is-callable": "^1.1.5", 300 | "is-regex": "^1.0.5", 301 | "object-inspect": "^1.7.0", 302 | "object-keys": "^1.1.1", 303 | "object.assign": "^4.1.0", 304 | "string.prototype.trimleft": "^2.1.1", 305 | "string.prototype.trimright": "^2.1.1" 306 | } 307 | }, 308 | "es-to-primitive": { 309 | "version": "1.2.1", 310 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 311 | "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", 312 | "dev": true, 313 | "requires": { 314 | "is-callable": "^1.1.4", 315 | "is-date-object": "^1.0.1", 316 | "is-symbol": "^1.0.2" 317 | } 318 | }, 319 | "escape-string-regexp": { 320 | "version": "1.0.5", 321 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 322 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 323 | "dev": true 324 | }, 325 | "esprima": { 326 | "version": "4.0.1", 327 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/esprima/-/esprima-4.0.1.tgz", 328 | "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", 329 | "dev": true 330 | }, 331 | "events": { 332 | "version": "1.1.1", 333 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 334 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 335 | "dev": true 336 | }, 337 | "find-up": { 338 | "version": "3.0.0", 339 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/find-up/-/find-up-3.0.0.tgz", 340 | "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", 341 | "dev": true, 342 | "requires": { 343 | "locate-path": "^3.0.0" 344 | } 345 | }, 346 | "flat": { 347 | "version": "4.1.0", 348 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/flat/-/flat-4.1.0.tgz", 349 | "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", 350 | "dev": true, 351 | "requires": { 352 | "is-buffer": "~2.0.3" 353 | } 354 | }, 355 | "follow-redirects": { 356 | "version": "1.5.10", 357 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/follow-redirects/-/follow-redirects-1.5.10.tgz", 358 | "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", 359 | "requires": { 360 | "debug": "=3.1.0" 361 | } 362 | }, 363 | "fs.realpath": { 364 | "version": "1.0.0", 365 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", 366 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 367 | "dev": true 368 | }, 369 | "function-bind": { 370 | "version": "1.1.1", 371 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/function-bind/-/function-bind-1.1.1.tgz", 372 | "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", 373 | "dev": true 374 | }, 375 | "geocodio-library-node": { 376 | "version": "1.0.0", 377 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/geocodio-library-node/-/geocodio-library-node-1.0.0.tgz", 378 | "integrity": "sha1-oYEt4LcbCQhl862cbHwQewvpBkE=", 379 | "requires": { 380 | "axios": "^0.19.0" 381 | }, 382 | "dependencies": { 383 | "axios": { 384 | "version": "0.19.0", 385 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/axios/-/axios-0.19.0.tgz", 386 | "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=", 387 | "requires": { 388 | "follow-redirects": "1.5.10", 389 | "is-buffer": "^2.0.2" 390 | } 391 | } 392 | } 393 | }, 394 | "get-caller-file": { 395 | "version": "2.0.5", 396 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", 397 | "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", 398 | "dev": true 399 | }, 400 | "get-func-name": { 401 | "version": "2.0.0", 402 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-func-name/-/get-func-name-2.0.0.tgz", 403 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 404 | "dev": true 405 | }, 406 | "glob": { 407 | "version": "7.1.3", 408 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/glob/-/glob-7.1.3.tgz", 409 | "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", 410 | "dev": true, 411 | "requires": { 412 | "fs.realpath": "^1.0.0", 413 | "inflight": "^1.0.4", 414 | "inherits": "2", 415 | "minimatch": "^3.0.4", 416 | "once": "^1.3.0", 417 | "path-is-absolute": "^1.0.0" 418 | } 419 | }, 420 | "growl": { 421 | "version": "1.10.5", 422 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/growl/-/growl-1.10.5.tgz", 423 | "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", 424 | "dev": true 425 | }, 426 | "has": { 427 | "version": "1.0.3", 428 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has/-/has-1.0.3.tgz", 429 | "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", 430 | "dev": true, 431 | "requires": { 432 | "function-bind": "^1.1.1" 433 | } 434 | }, 435 | "has-flag": { 436 | "version": "3.0.0", 437 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-flag/-/has-flag-3.0.0.tgz", 438 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 439 | "dev": true 440 | }, 441 | "has-symbols": { 442 | "version": "1.0.1", 443 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-symbols/-/has-symbols-1.0.1.tgz", 444 | "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", 445 | "dev": true 446 | }, 447 | "he": { 448 | "version": "1.2.0", 449 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/he/-/he-1.2.0.tgz", 450 | "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", 451 | "dev": true 452 | }, 453 | "http-status-codes": { 454 | "version": "1.4.0", 455 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/http-status-codes/-/http-status-codes-1.4.0.tgz", 456 | "integrity": "sha1-bkwV0W/zqeLfA7ifOlXhquBftHc=" 457 | }, 458 | "ieee754": { 459 | "version": "1.1.13", 460 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 461 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 462 | "dev": true 463 | }, 464 | "inflight": { 465 | "version": "1.0.6", 466 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inflight/-/inflight-1.0.6.tgz", 467 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 468 | "dev": true, 469 | "requires": { 470 | "once": "^1.3.0", 471 | "wrappy": "1" 472 | } 473 | }, 474 | "inherits": { 475 | "version": "2.0.4", 476 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inherits/-/inherits-2.0.4.tgz", 477 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", 478 | "dev": true 479 | }, 480 | "is-buffer": { 481 | "version": "2.0.4", 482 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-buffer/-/is-buffer-2.0.4.tgz", 483 | "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=" 484 | }, 485 | "is-callable": { 486 | "version": "1.1.5", 487 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-callable/-/is-callable-1.1.5.tgz", 488 | "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", 489 | "dev": true 490 | }, 491 | "is-date-object": { 492 | "version": "1.0.2", 493 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-date-object/-/is-date-object-1.0.2.tgz", 494 | "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", 495 | "dev": true 496 | }, 497 | "is-fullwidth-code-point": { 498 | "version": "2.0.0", 499 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 500 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 501 | "dev": true 502 | }, 503 | "is-regex": { 504 | "version": "1.0.5", 505 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-regex/-/is-regex-1.0.5.tgz", 506 | "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", 507 | "dev": true, 508 | "requires": { 509 | "has": "^1.0.3" 510 | } 511 | }, 512 | "is-symbol": { 513 | "version": "1.0.3", 514 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-symbol/-/is-symbol-1.0.3.tgz", 515 | "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", 516 | "dev": true, 517 | "requires": { 518 | "has-symbols": "^1.0.1" 519 | } 520 | }, 521 | "isarray": { 522 | "version": "1.0.0", 523 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 524 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 525 | "dev": true 526 | }, 527 | "isexe": { 528 | "version": "2.0.0", 529 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/isexe/-/isexe-2.0.0.tgz", 530 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 531 | "dev": true 532 | }, 533 | "jmespath": { 534 | "version": "0.15.0", 535 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 536 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", 537 | "dev": true 538 | }, 539 | "js-yaml": { 540 | "version": "3.13.1", 541 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/js-yaml/-/js-yaml-3.13.1.tgz", 542 | "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", 543 | "dev": true, 544 | "requires": { 545 | "argparse": "^1.0.7", 546 | "esprima": "^4.0.0" 547 | } 548 | }, 549 | "locate-path": { 550 | "version": "3.0.0", 551 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/locate-path/-/locate-path-3.0.0.tgz", 552 | "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", 553 | "dev": true, 554 | "requires": { 555 | "p-locate": "^3.0.0", 556 | "path-exists": "^3.0.0" 557 | } 558 | }, 559 | "lodash": { 560 | "version": "4.17.15", 561 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/lodash/-/lodash-4.17.15.tgz", 562 | "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", 563 | "dev": true 564 | }, 565 | "log-symbols": { 566 | "version": "2.2.0", 567 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/log-symbols/-/log-symbols-2.2.0.tgz", 568 | "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", 569 | "dev": true, 570 | "requires": { 571 | "chalk": "^2.0.1" 572 | } 573 | }, 574 | "long": { 575 | "version": "3.2.0", 576 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/long/-/long-3.2.0.tgz", 577 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 578 | }, 579 | "minimatch": { 580 | "version": "3.0.4", 581 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimatch/-/minimatch-3.0.4.tgz", 582 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 583 | "dev": true, 584 | "requires": { 585 | "brace-expansion": "^1.1.7" 586 | } 587 | }, 588 | "minimist": { 589 | "version": "0.0.8", 590 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimist/-/minimist-0.0.8.tgz", 591 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 592 | "dev": true 593 | }, 594 | "mkdirp": { 595 | "version": "0.5.1", 596 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mkdirp/-/mkdirp-0.5.1.tgz", 597 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 598 | "dev": true, 599 | "requires": { 600 | "minimist": "0.0.8" 601 | } 602 | }, 603 | "mocha": { 604 | "version": "6.2.2", 605 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mocha/-/mocha-6.2.2.tgz", 606 | "integrity": "sha1-XYmH4olAyviVen12ZLkQ3Fsv6iA=", 607 | "dev": true, 608 | "requires": { 609 | "ansi-colors": "3.2.3", 610 | "browser-stdout": "1.3.1", 611 | "debug": "3.2.6", 612 | "diff": "3.5.0", 613 | "escape-string-regexp": "1.0.5", 614 | "find-up": "3.0.0", 615 | "glob": "7.1.3", 616 | "growl": "1.10.5", 617 | "he": "1.2.0", 618 | "js-yaml": "3.13.1", 619 | "log-symbols": "2.2.0", 620 | "minimatch": "3.0.4", 621 | "mkdirp": "0.5.1", 622 | "ms": "2.1.1", 623 | "node-environment-flags": "1.0.5", 624 | "object.assign": "4.1.0", 625 | "strip-json-comments": "2.0.1", 626 | "supports-color": "6.0.0", 627 | "which": "1.3.1", 628 | "wide-align": "1.1.3", 629 | "yargs": "13.3.0", 630 | "yargs-parser": "13.1.1", 631 | "yargs-unparser": "1.6.0" 632 | }, 633 | "dependencies": { 634 | "debug": { 635 | "version": "3.2.6", 636 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.2.6.tgz", 637 | "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", 638 | "dev": true, 639 | "requires": { 640 | "ms": "^2.1.1" 641 | } 642 | }, 643 | "ms": { 644 | "version": "2.1.1", 645 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.1.1.tgz", 646 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", 647 | "dev": true 648 | } 649 | } 650 | }, 651 | "ms": { 652 | "version": "2.0.0", 653 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.0.0.tgz", 654 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 655 | }, 656 | "node-environment-flags": { 657 | "version": "1.0.5", 658 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 659 | "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", 660 | "dev": true, 661 | "requires": { 662 | "object.getownpropertydescriptors": "^2.0.3", 663 | "semver": "^5.7.0" 664 | } 665 | }, 666 | "nodes2ts": { 667 | "version": "1.1.10", 668 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/nodes2ts/-/nodes2ts-1.1.10.tgz", 669 | "integrity": "sha1-eCjhNDyn1B0WWNgzUkUnQKKcJ3M=", 670 | "requires": { 671 | "decimal.js": "^6.0.0", 672 | "long": "^3.2.0" 673 | } 674 | }, 675 | "object-inspect": { 676 | "version": "1.7.0", 677 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-inspect/-/object-inspect-1.7.0.tgz", 678 | "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", 679 | "dev": true 680 | }, 681 | "object-keys": { 682 | "version": "1.1.1", 683 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-keys/-/object-keys-1.1.1.tgz", 684 | "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", 685 | "dev": true 686 | }, 687 | "object.assign": { 688 | "version": "4.1.0", 689 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.assign/-/object.assign-4.1.0.tgz", 690 | "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", 691 | "dev": true, 692 | "requires": { 693 | "define-properties": "^1.1.2", 694 | "function-bind": "^1.1.1", 695 | "has-symbols": "^1.0.0", 696 | "object-keys": "^1.0.11" 697 | } 698 | }, 699 | "object.getownpropertydescriptors": { 700 | "version": "2.1.0", 701 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 702 | "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", 703 | "dev": true, 704 | "requires": { 705 | "define-properties": "^1.1.3", 706 | "es-abstract": "^1.17.0-next.1" 707 | } 708 | }, 709 | "once": { 710 | "version": "1.4.0", 711 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/once/-/once-1.4.0.tgz", 712 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 713 | "dev": true, 714 | "requires": { 715 | "wrappy": "1" 716 | } 717 | }, 718 | "p-limit": { 719 | "version": "2.2.2", 720 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-limit/-/p-limit-2.2.2.tgz", 721 | "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", 722 | "dev": true, 723 | "requires": { 724 | "p-try": "^2.0.0" 725 | } 726 | }, 727 | "p-locate": { 728 | "version": "3.0.0", 729 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-locate/-/p-locate-3.0.0.tgz", 730 | "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", 731 | "dev": true, 732 | "requires": { 733 | "p-limit": "^2.0.0" 734 | } 735 | }, 736 | "p-try": { 737 | "version": "2.2.0", 738 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-try/-/p-try-2.2.0.tgz", 739 | "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", 740 | "dev": true 741 | }, 742 | "path-exists": { 743 | "version": "3.0.0", 744 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-exists/-/path-exists-3.0.0.tgz", 745 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 746 | "dev": true 747 | }, 748 | "path-is-absolute": { 749 | "version": "1.0.1", 750 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 751 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 752 | "dev": true 753 | }, 754 | "pathval": { 755 | "version": "1.1.0", 756 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/pathval/-/pathval-1.1.0.tgz", 757 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 758 | "dev": true 759 | }, 760 | "punycode": { 761 | "version": "1.3.2", 762 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 763 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 764 | "dev": true 765 | }, 766 | "querystring": { 767 | "version": "0.2.0", 768 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 769 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 770 | "dev": true 771 | }, 772 | "require-directory": { 773 | "version": "2.1.1", 774 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-directory/-/require-directory-2.1.1.tgz", 775 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 776 | "dev": true 777 | }, 778 | "require-main-filename": { 779 | "version": "2.0.0", 780 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-main-filename/-/require-main-filename-2.0.0.tgz", 781 | "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", 782 | "dev": true 783 | }, 784 | "sax": { 785 | "version": "1.2.1", 786 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 787 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", 788 | "dev": true 789 | }, 790 | "semver": { 791 | "version": "5.7.1", 792 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/semver/-/semver-5.7.1.tgz", 793 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", 794 | "dev": true 795 | }, 796 | "set-blocking": { 797 | "version": "2.0.0", 798 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/set-blocking/-/set-blocking-2.0.0.tgz", 799 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 800 | "dev": true 801 | }, 802 | "short-uuid": { 803 | "version": "3.1.1", 804 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/short-uuid/-/short-uuid-3.1.1.tgz", 805 | "integrity": "sha1-P/QnB0tfp4IsN5OZTRinqC4vc6Q=", 806 | "requires": { 807 | "any-base": "^1.1.0", 808 | "uuid": "^3.3.2" 809 | } 810 | }, 811 | "sprintf-js": { 812 | "version": "1.0.3", 813 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/sprintf-js/-/sprintf-js-1.0.3.tgz", 814 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 815 | "dev": true 816 | }, 817 | "string-width": { 818 | "version": "2.1.1", 819 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-2.1.1.tgz", 820 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 821 | "dev": true, 822 | "requires": { 823 | "is-fullwidth-code-point": "^2.0.0", 824 | "strip-ansi": "^4.0.0" 825 | } 826 | }, 827 | "string.prototype.trimleft": { 828 | "version": "2.1.1", 829 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 830 | "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", 831 | "dev": true, 832 | "requires": { 833 | "define-properties": "^1.1.3", 834 | "function-bind": "^1.1.1" 835 | } 836 | }, 837 | "string.prototype.trimright": { 838 | "version": "2.1.1", 839 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 840 | "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", 841 | "dev": true, 842 | "requires": { 843 | "define-properties": "^1.1.3", 844 | "function-bind": "^1.1.1" 845 | } 846 | }, 847 | "strip-ansi": { 848 | "version": "4.0.0", 849 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-4.0.0.tgz", 850 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 851 | "dev": true, 852 | "requires": { 853 | "ansi-regex": "^3.0.0" 854 | } 855 | }, 856 | "strip-json-comments": { 857 | "version": "2.0.1", 858 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 859 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 860 | "dev": true 861 | }, 862 | "supports-color": { 863 | "version": "6.0.0", 864 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-6.0.0.tgz", 865 | "integrity": "sha1-ds/nQs8fQbubHCmtAwaMBbTA5Ao=", 866 | "dev": true, 867 | "requires": { 868 | "has-flag": "^3.0.0" 869 | } 870 | }, 871 | "type-detect": { 872 | "version": "4.0.8", 873 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/type-detect/-/type-detect-4.0.8.tgz", 874 | "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", 875 | "dev": true 876 | }, 877 | "url": { 878 | "version": "0.10.3", 879 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 880 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 881 | "dev": true, 882 | "requires": { 883 | "punycode": "1.3.2", 884 | "querystring": "0.2.0" 885 | } 886 | }, 887 | "uuid": { 888 | "version": "3.3.3", 889 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/uuid/-/uuid-3.3.3.tgz", 890 | "integrity": "sha1-RWjwIW54dg7h2/Ok0s9T4iQRKGY=" 891 | }, 892 | "which": { 893 | "version": "1.3.1", 894 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which/-/which-1.3.1.tgz", 895 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 896 | "dev": true, 897 | "requires": { 898 | "isexe": "^2.0.0" 899 | } 900 | }, 901 | "which-module": { 902 | "version": "2.0.0", 903 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which-module/-/which-module-2.0.0.tgz", 904 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 905 | "dev": true 906 | }, 907 | "wide-align": { 908 | "version": "1.1.3", 909 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wide-align/-/wide-align-1.1.3.tgz", 910 | "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", 911 | "dev": true, 912 | "requires": { 913 | "string-width": "^1.0.2 || 2" 914 | } 915 | }, 916 | "wrap-ansi": { 917 | "version": "5.1.0", 918 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 919 | "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", 920 | "dev": true, 921 | "requires": { 922 | "ansi-styles": "^3.2.0", 923 | "string-width": "^3.0.0", 924 | "strip-ansi": "^5.0.0" 925 | }, 926 | "dependencies": { 927 | "ansi-regex": { 928 | "version": "4.1.0", 929 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 930 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 931 | "dev": true 932 | }, 933 | "string-width": { 934 | "version": "3.1.0", 935 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 936 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 937 | "dev": true, 938 | "requires": { 939 | "emoji-regex": "^7.0.1", 940 | "is-fullwidth-code-point": "^2.0.0", 941 | "strip-ansi": "^5.1.0" 942 | } 943 | }, 944 | "strip-ansi": { 945 | "version": "5.2.0", 946 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 947 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 948 | "dev": true, 949 | "requires": { 950 | "ansi-regex": "^4.1.0" 951 | } 952 | } 953 | } 954 | }, 955 | "wrappy": { 956 | "version": "1.0.2", 957 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrappy/-/wrappy-1.0.2.tgz", 958 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 959 | "dev": true 960 | }, 961 | "xml2js": { 962 | "version": "0.4.19", 963 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 964 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 965 | "dev": true, 966 | "requires": { 967 | "sax": ">=0.6.0", 968 | "xmlbuilder": "~9.0.1" 969 | } 970 | }, 971 | "xmlbuilder": { 972 | "version": "9.0.7", 973 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 974 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 975 | "dev": true 976 | }, 977 | "y18n": { 978 | "version": "4.0.0", 979 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/y18n/-/y18n-4.0.0.tgz", 980 | "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", 981 | "dev": true 982 | }, 983 | "yargs": { 984 | "version": "13.3.0", 985 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs/-/yargs-13.3.0.tgz", 986 | "integrity": "sha1-TGV6VeB+Xyz5R/ijZlZ8BKDe3IM=", 987 | "dev": true, 988 | "requires": { 989 | "cliui": "^5.0.0", 990 | "find-up": "^3.0.0", 991 | "get-caller-file": "^2.0.1", 992 | "require-directory": "^2.1.1", 993 | "require-main-filename": "^2.0.0", 994 | "set-blocking": "^2.0.0", 995 | "string-width": "^3.0.0", 996 | "which-module": "^2.0.0", 997 | "y18n": "^4.0.0", 998 | "yargs-parser": "^13.1.1" 999 | }, 1000 | "dependencies": { 1001 | "ansi-regex": { 1002 | "version": "4.1.0", 1003 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 1004 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 1005 | "dev": true 1006 | }, 1007 | "string-width": { 1008 | "version": "3.1.0", 1009 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 1010 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 1011 | "dev": true, 1012 | "requires": { 1013 | "emoji-regex": "^7.0.1", 1014 | "is-fullwidth-code-point": "^2.0.0", 1015 | "strip-ansi": "^5.1.0" 1016 | } 1017 | }, 1018 | "strip-ansi": { 1019 | "version": "5.2.0", 1020 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 1021 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 1022 | "dev": true, 1023 | "requires": { 1024 | "ansi-regex": "^4.1.0" 1025 | } 1026 | } 1027 | } 1028 | }, 1029 | "yargs-parser": { 1030 | "version": "13.1.1", 1031 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-parser/-/yargs-parser-13.1.1.tgz", 1032 | "integrity": "sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=", 1033 | "dev": true, 1034 | "requires": { 1035 | "camelcase": "^5.0.0", 1036 | "decamelize": "^1.2.0" 1037 | } 1038 | }, 1039 | "yargs-unparser": { 1040 | "version": "1.6.0", 1041 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1042 | "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", 1043 | "dev": true, 1044 | "requires": { 1045 | "flat": "^4.1.0", 1046 | "lodash": "^4.17.15", 1047 | "yargs": "^13.3.0" 1048 | } 1049 | } 1050 | } 1051 | } 1052 | -------------------------------------------------------------------------------- /lambdas/delete-item/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "delete-item", 3 | "version": "1.0.0", 4 | "description": "Delete an item and the associated metadata by id", 5 | "main": "app.js", 6 | "license": "MIT", 7 | "dependencies": { 8 | "dynamodb-geo": "^0.4.0", 9 | "http-status-codes": "^1.4.0" 10 | }, 11 | "scripts": { 12 | "test": "mocha **/tests/unit/*.js" 13 | }, 14 | "devDependencies": { 15 | "aws-sdk": "^2.543.0", 16 | "chai": "^4.2.0", 17 | "mocha": "^6.1.4" 18 | }, 19 | "jshintConfig": { 20 | "esversion": 8 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /lambdas/get-items-by-location/.npmignore: -------------------------------------------------------------------------------- 1 | tests/* 2 | -------------------------------------------------------------------------------- /lambdas/get-items-by-location/app.js: -------------------------------------------------------------------------------- 1 | const AWS = require('aws-sdk'); 2 | const ddb = new AWS.DynamoDB(); 3 | const ddbGeo = require('dynamodb-geo'); 4 | const Geocodio = require('geocodio-library-node'); 5 | const httpStatusCode = require('http-status-codes'); 6 | 7 | const DefaultRadius = 5000; 8 | let response; 9 | 10 | exports.lambdaHandler = async (event, context) => { 11 | let coords; 12 | if (event.queryStringParameters.address) { 13 | const geoCoords = await geocodeAddress(event.queryStringParameters.address); 14 | coords = { 15 | latitude: geoCoords.lat, 16 | longitude: geoCoords.lng, 17 | radius: event.queryStringParameters.radius ? Number(event.queryStringParameters.radius) : DefaultRadius 18 | }; 19 | } 20 | else { 21 | coords = parseCoordinates(event); 22 | } 23 | if (!coords) { 24 | response = { 25 | statusCode: httpStatusCode.BAD_REQUEST, 26 | body: JSON.stringify({ 27 | message: 'Unable to parse the input coordinates and radius' 28 | }) 29 | }; 30 | return response; 31 | } 32 | 33 | const items = await runGeosearch(coords); 34 | const transformedItems = transformItems(items); 35 | response = { 36 | statusCode: httpStatusCode.OK, 37 | body: JSON.stringify(transformedItems), 38 | }; 39 | 40 | 41 | return response; 42 | }; 43 | 44 | /** 45 | * Search for items in Dynamo based on coordinates 46 | * @param {any} coords - Coordinates with radius for search 47 | * @return {Array} Found items based on coordinates 48 | */ 49 | async function runGeosearch(coords) { 50 | try { 51 | const config = new ddbGeo.GeoDataManagerConfiguration(ddb, process.env.DynamoDBTableName); 52 | config.hashKeyLength = 5; 53 | const geoTableManager = new ddbGeo.GeoDataManager(config); 54 | const query = { 55 | RadiusInMeter: coords.radius, 56 | CenterPoint: { 57 | latitude: coords.latitude, 58 | longitude: coords.longitude, 59 | }, 60 | }; 61 | const items = await geoTableManager.queryRadius(query); 62 | return items; 63 | } 64 | catch (err) { 65 | console.log('An error occurred while searching DynamoDB'); 66 | console.log(err); 67 | } 68 | } 69 | 70 | function parseCoordinates(event) { 71 | if(!event.queryStringParameters.lat || !event.queryStringParameters.lng){ 72 | return; 73 | } 74 | 75 | let coords; 76 | 77 | try { 78 | coords = { 79 | latitude: Number(event.queryStringParameters.lat), 80 | longitude: Number(event.queryStringParameters.lng), 81 | radius: event.queryStringParameters.radius ? Number(event.queryStringParameters.radius) : DefaultRadius 82 | }; 83 | } catch (err) { 84 | console.log('The request did not have the correct query ' + 85 | 'parameters or they were the wrong type'); 86 | } 87 | 88 | return coords; 89 | } 90 | 91 | /** 92 | * Transform the raw item values to workable objects 93 | * @param {Array} items - Array of raw geo data for matching items 94 | * @return {Array} Transformed data transfer items 95 | */ 96 | function transformItems(items) { 97 | const transformedItems = []; 98 | if (items) { 99 | items.map(item => { 100 | try { 101 | const coords = JSON.parse(item.geoJson.S); 102 | const transformedItem = { 103 | id: item.rangeKey.S, 104 | name: item.name.S, 105 | address: item.address.S, 106 | coords: { 107 | lat: coords.coordinates[1], 108 | lng: coords.coordinates[0], 109 | }, 110 | }; 111 | 112 | transformedItems.push(transformedItem); 113 | } catch (err) { } 114 | }); 115 | } 116 | 117 | return transformedItems; 118 | } 119 | 120 | /** 121 | * Uses Geocodio to geocode a specific address 122 | * @param {string} address - Address (line 1, line 2, city, state, zip) you want to geocode 123 | * @return {any} - Coordinates of the address passed in 124 | */ 125 | async function geocodeAddress(address) { 126 | let coords; 127 | try { 128 | const geocoder = new Geocodio(process.env.GeocodioApiKey); 129 | const response = await geocoder.geocode(address); 130 | 131 | if (response && response.results && response.results.length > 0) { 132 | // Results are returned with highest likelihood first, so grab the first one 133 | coords = response.results[0].location; 134 | } 135 | } 136 | catch (err) { 137 | console.log('An error occurred while geocoding the address: ' + address); 138 | console.log(err); 139 | } 140 | 141 | return coords; 142 | } 143 | -------------------------------------------------------------------------------- /lambdas/get-items-by-location/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "get-items-by-location", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/decimal.js": { 8 | "version": "0.0.30", 9 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/decimal.js/-/decimal.js-0.0.30.tgz", 10 | "integrity": "sha1-B3mNkFldvzk28Q8kDvOMW5KO1fw=" 11 | }, 12 | "@types/long": { 13 | "version": "4.0.0", 14 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/long/-/long-4.0.0.tgz", 15 | "integrity": "sha1-cZVR0jUtMBrIuB23Mqy2vcKNve8=" 16 | }, 17 | "ansi-colors": { 18 | "version": "3.2.3", 19 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-colors/-/ansi-colors-3.2.3.tgz", 20 | "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", 21 | "dev": true 22 | }, 23 | "ansi-regex": { 24 | "version": "3.0.0", 25 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-3.0.0.tgz", 26 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 27 | "dev": true 28 | }, 29 | "ansi-styles": { 30 | "version": "3.2.1", 31 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-styles/-/ansi-styles-3.2.1.tgz", 32 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 33 | "dev": true, 34 | "requires": { 35 | "color-convert": "^1.9.0" 36 | } 37 | }, 38 | "argparse": { 39 | "version": "1.0.10", 40 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/argparse/-/argparse-1.0.10.tgz", 41 | "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", 42 | "dev": true, 43 | "requires": { 44 | "sprintf-js": "~1.0.2" 45 | } 46 | }, 47 | "assertion-error": { 48 | "version": "1.1.0", 49 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/assertion-error/-/assertion-error-1.1.0.tgz", 50 | "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", 51 | "dev": true 52 | }, 53 | "aws-sdk": { 54 | "version": "2.543.0", 55 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.543.0.tgz", 56 | "integrity": "sha512-ABHsA4W7LLYnTBCgtbTt0NF7+66nMCtdcJuAn30+RGzF0bOw3lCguqzootFrMlIOXklddQFJ9kKTXd+p/+uCVQ==", 57 | "dev": true, 58 | "requires": { 59 | "buffer": "4.9.1", 60 | "events": "1.1.1", 61 | "ieee754": "1.1.13", 62 | "jmespath": "0.15.0", 63 | "querystring": "0.2.0", 64 | "sax": "1.2.1", 65 | "url": "0.10.3", 66 | "uuid": "3.3.2", 67 | "xml2js": "0.4.19" 68 | } 69 | }, 70 | "axios": { 71 | "version": "0.19.2", 72 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/axios/-/axios-0.19.2.tgz", 73 | "integrity": "sha1-PqNsXYgY0NX4qKl6bTa4bNwAyyc=", 74 | "requires": { 75 | "follow-redirects": "1.5.10" 76 | } 77 | }, 78 | "balanced-match": { 79 | "version": "1.0.0", 80 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/balanced-match/-/balanced-match-1.0.0.tgz", 81 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 82 | "dev": true 83 | }, 84 | "base64-js": { 85 | "version": "1.3.1", 86 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 87 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 88 | "dev": true 89 | }, 90 | "brace-expansion": { 91 | "version": "1.1.11", 92 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", 93 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 94 | "dev": true, 95 | "requires": { 96 | "balanced-match": "^1.0.0", 97 | "concat-map": "0.0.1" 98 | } 99 | }, 100 | "browser-stdout": { 101 | "version": "1.3.1", 102 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/browser-stdout/-/browser-stdout-1.3.1.tgz", 103 | "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", 104 | "dev": true 105 | }, 106 | "buffer": { 107 | "version": "4.9.1", 108 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 109 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 110 | "dev": true, 111 | "requires": { 112 | "base64-js": "^1.0.2", 113 | "ieee754": "^1.1.4", 114 | "isarray": "^1.0.0" 115 | } 116 | }, 117 | "camelcase": { 118 | "version": "5.3.1", 119 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/camelcase/-/camelcase-5.3.1.tgz", 120 | "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", 121 | "dev": true 122 | }, 123 | "chai": { 124 | "version": "4.2.0", 125 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chai/-/chai-4.2.0.tgz", 126 | "integrity": "sha1-dgqnLPION5XoSxKHfODoNzeqKeU=", 127 | "dev": true, 128 | "requires": { 129 | "assertion-error": "^1.1.0", 130 | "check-error": "^1.0.2", 131 | "deep-eql": "^3.0.1", 132 | "get-func-name": "^2.0.0", 133 | "pathval": "^1.1.0", 134 | "type-detect": "^4.0.5" 135 | } 136 | }, 137 | "chalk": { 138 | "version": "2.4.2", 139 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chalk/-/chalk-2.4.2.tgz", 140 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 141 | "dev": true, 142 | "requires": { 143 | "ansi-styles": "^3.2.1", 144 | "escape-string-regexp": "^1.0.5", 145 | "supports-color": "^5.3.0" 146 | }, 147 | "dependencies": { 148 | "supports-color": { 149 | "version": "5.5.0", 150 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-5.5.0.tgz", 151 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 152 | "dev": true, 153 | "requires": { 154 | "has-flag": "^3.0.0" 155 | } 156 | } 157 | } 158 | }, 159 | "check-error": { 160 | "version": "1.0.2", 161 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/check-error/-/check-error-1.0.2.tgz", 162 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 163 | "dev": true 164 | }, 165 | "cliui": { 166 | "version": "5.0.0", 167 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/cliui/-/cliui-5.0.0.tgz", 168 | "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", 169 | "dev": true, 170 | "requires": { 171 | "string-width": "^3.1.0", 172 | "strip-ansi": "^5.2.0", 173 | "wrap-ansi": "^5.1.0" 174 | }, 175 | "dependencies": { 176 | "ansi-regex": { 177 | "version": "4.1.0", 178 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 179 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 180 | "dev": true 181 | }, 182 | "string-width": { 183 | "version": "3.1.0", 184 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 185 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 186 | "dev": true, 187 | "requires": { 188 | "emoji-regex": "^7.0.1", 189 | "is-fullwidth-code-point": "^2.0.0", 190 | "strip-ansi": "^5.1.0" 191 | } 192 | }, 193 | "strip-ansi": { 194 | "version": "5.2.0", 195 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 196 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 197 | "dev": true, 198 | "requires": { 199 | "ansi-regex": "^4.1.0" 200 | } 201 | } 202 | } 203 | }, 204 | "color-convert": { 205 | "version": "1.9.3", 206 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-convert/-/color-convert-1.9.3.tgz", 207 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 208 | "dev": true, 209 | "requires": { 210 | "color-name": "1.1.3" 211 | } 212 | }, 213 | "color-name": { 214 | "version": "1.1.3", 215 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-name/-/color-name-1.1.3.tgz", 216 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 217 | "dev": true 218 | }, 219 | "concat-map": { 220 | "version": "0.0.1", 221 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/concat-map/-/concat-map-0.0.1.tgz", 222 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 223 | "dev": true 224 | }, 225 | "debug": { 226 | "version": "3.1.0", 227 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.1.0.tgz", 228 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 229 | "requires": { 230 | "ms": "2.0.0" 231 | } 232 | }, 233 | "decamelize": { 234 | "version": "1.2.0", 235 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decamelize/-/decamelize-1.2.0.tgz", 236 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 237 | "dev": true 238 | }, 239 | "decimal.js": { 240 | "version": "6.0.0", 241 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decimal.js/-/decimal.js-6.0.0.tgz", 242 | "integrity": "sha1-T9WNBjfzb9vBq6EyC8Pyzug8oPI=" 243 | }, 244 | "deep-eql": { 245 | "version": "3.0.1", 246 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/deep-eql/-/deep-eql-3.0.1.tgz", 247 | "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", 248 | "dev": true, 249 | "requires": { 250 | "type-detect": "^4.0.0" 251 | } 252 | }, 253 | "define-properties": { 254 | "version": "1.1.3", 255 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/define-properties/-/define-properties-1.1.3.tgz", 256 | "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", 257 | "dev": true, 258 | "requires": { 259 | "object-keys": "^1.0.12" 260 | } 261 | }, 262 | "diff": { 263 | "version": "3.5.0", 264 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/diff/-/diff-3.5.0.tgz", 265 | "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", 266 | "dev": true 267 | }, 268 | "dynamodb-geo": { 269 | "version": "0.4.0", 270 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/dynamodb-geo/-/dynamodb-geo-0.4.0.tgz", 271 | "integrity": "sha1-T0EF39urEsuEjmQjesibNhLNrh4=", 272 | "requires": { 273 | "@types/decimal.js": "^0.0.30", 274 | "@types/long": ">=3", 275 | "nodes2ts": "^1.1.10" 276 | } 277 | }, 278 | "emoji-regex": { 279 | "version": "7.0.3", 280 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/emoji-regex/-/emoji-regex-7.0.3.tgz", 281 | "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", 282 | "dev": true 283 | }, 284 | "es-abstract": { 285 | "version": "1.17.0", 286 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-abstract/-/es-abstract-1.17.0.tgz", 287 | "integrity": "sha1-9CpRfQA2pVkduyxGNZHci7UDCbE=", 288 | "dev": true, 289 | "requires": { 290 | "es-to-primitive": "^1.2.1", 291 | "function-bind": "^1.1.1", 292 | "has": "^1.0.3", 293 | "has-symbols": "^1.0.1", 294 | "is-callable": "^1.1.5", 295 | "is-regex": "^1.0.5", 296 | "object-inspect": "^1.7.0", 297 | "object-keys": "^1.1.1", 298 | "object.assign": "^4.1.0", 299 | "string.prototype.trimleft": "^2.1.1", 300 | "string.prototype.trimright": "^2.1.1" 301 | } 302 | }, 303 | "es-to-primitive": { 304 | "version": "1.2.1", 305 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 306 | "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", 307 | "dev": true, 308 | "requires": { 309 | "is-callable": "^1.1.4", 310 | "is-date-object": "^1.0.1", 311 | "is-symbol": "^1.0.2" 312 | } 313 | }, 314 | "escape-string-regexp": { 315 | "version": "1.0.5", 316 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 317 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 318 | "dev": true 319 | }, 320 | "esprima": { 321 | "version": "4.0.1", 322 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/esprima/-/esprima-4.0.1.tgz", 323 | "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", 324 | "dev": true 325 | }, 326 | "events": { 327 | "version": "1.1.1", 328 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 329 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 330 | "dev": true 331 | }, 332 | "find-up": { 333 | "version": "3.0.0", 334 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/find-up/-/find-up-3.0.0.tgz", 335 | "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", 336 | "dev": true, 337 | "requires": { 338 | "locate-path": "^3.0.0" 339 | } 340 | }, 341 | "flat": { 342 | "version": "4.1.0", 343 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/flat/-/flat-4.1.0.tgz", 344 | "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", 345 | "dev": true, 346 | "requires": { 347 | "is-buffer": "~2.0.3" 348 | } 349 | }, 350 | "follow-redirects": { 351 | "version": "1.5.10", 352 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/follow-redirects/-/follow-redirects-1.5.10.tgz", 353 | "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", 354 | "requires": { 355 | "debug": "=3.1.0" 356 | } 357 | }, 358 | "fs.realpath": { 359 | "version": "1.0.0", 360 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", 361 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 362 | "dev": true 363 | }, 364 | "function-bind": { 365 | "version": "1.1.1", 366 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/function-bind/-/function-bind-1.1.1.tgz", 367 | "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", 368 | "dev": true 369 | }, 370 | "geocodio-library-node": { 371 | "version": "1.1.0", 372 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/geocodio-library-node/-/geocodio-library-node-1.1.0.tgz", 373 | "integrity": "sha1-90wjgNU8SyibrkeU1Kg3ClMVabs=", 374 | "requires": { 375 | "axios": "^0.19.0" 376 | } 377 | }, 378 | "get-caller-file": { 379 | "version": "2.0.5", 380 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", 381 | "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", 382 | "dev": true 383 | }, 384 | "get-func-name": { 385 | "version": "2.0.0", 386 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-func-name/-/get-func-name-2.0.0.tgz", 387 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 388 | "dev": true 389 | }, 390 | "glob": { 391 | "version": "7.1.3", 392 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/glob/-/glob-7.1.3.tgz", 393 | "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", 394 | "dev": true, 395 | "requires": { 396 | "fs.realpath": "^1.0.0", 397 | "inflight": "^1.0.4", 398 | "inherits": "2", 399 | "minimatch": "^3.0.4", 400 | "once": "^1.3.0", 401 | "path-is-absolute": "^1.0.0" 402 | } 403 | }, 404 | "growl": { 405 | "version": "1.10.5", 406 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/growl/-/growl-1.10.5.tgz", 407 | "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", 408 | "dev": true 409 | }, 410 | "has": { 411 | "version": "1.0.3", 412 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has/-/has-1.0.3.tgz", 413 | "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", 414 | "dev": true, 415 | "requires": { 416 | "function-bind": "^1.1.1" 417 | } 418 | }, 419 | "has-flag": { 420 | "version": "3.0.0", 421 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-flag/-/has-flag-3.0.0.tgz", 422 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 423 | "dev": true 424 | }, 425 | "has-symbols": { 426 | "version": "1.0.1", 427 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-symbols/-/has-symbols-1.0.1.tgz", 428 | "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", 429 | "dev": true 430 | }, 431 | "he": { 432 | "version": "1.2.0", 433 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/he/-/he-1.2.0.tgz", 434 | "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", 435 | "dev": true 436 | }, 437 | "http-status-codes": { 438 | "version": "1.4.0", 439 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/http-status-codes/-/http-status-codes-1.4.0.tgz", 440 | "integrity": "sha1-bkwV0W/zqeLfA7ifOlXhquBftHc=" 441 | }, 442 | "ieee754": { 443 | "version": "1.1.13", 444 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 445 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 446 | "dev": true 447 | }, 448 | "inflight": { 449 | "version": "1.0.6", 450 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inflight/-/inflight-1.0.6.tgz", 451 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 452 | "dev": true, 453 | "requires": { 454 | "once": "^1.3.0", 455 | "wrappy": "1" 456 | } 457 | }, 458 | "inherits": { 459 | "version": "2.0.4", 460 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inherits/-/inherits-2.0.4.tgz", 461 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", 462 | "dev": true 463 | }, 464 | "is-buffer": { 465 | "version": "2.0.4", 466 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-buffer/-/is-buffer-2.0.4.tgz", 467 | "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=", 468 | "dev": true 469 | }, 470 | "is-callable": { 471 | "version": "1.1.5", 472 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-callable/-/is-callable-1.1.5.tgz", 473 | "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", 474 | "dev": true 475 | }, 476 | "is-date-object": { 477 | "version": "1.0.2", 478 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-date-object/-/is-date-object-1.0.2.tgz", 479 | "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", 480 | "dev": true 481 | }, 482 | "is-fullwidth-code-point": { 483 | "version": "2.0.0", 484 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 485 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 486 | "dev": true 487 | }, 488 | "is-regex": { 489 | "version": "1.0.5", 490 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-regex/-/is-regex-1.0.5.tgz", 491 | "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", 492 | "dev": true, 493 | "requires": { 494 | "has": "^1.0.3" 495 | } 496 | }, 497 | "is-symbol": { 498 | "version": "1.0.3", 499 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-symbol/-/is-symbol-1.0.3.tgz", 500 | "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", 501 | "dev": true, 502 | "requires": { 503 | "has-symbols": "^1.0.1" 504 | } 505 | }, 506 | "isarray": { 507 | "version": "1.0.0", 508 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 509 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 510 | "dev": true 511 | }, 512 | "isexe": { 513 | "version": "2.0.0", 514 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/isexe/-/isexe-2.0.0.tgz", 515 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 516 | "dev": true 517 | }, 518 | "jmespath": { 519 | "version": "0.15.0", 520 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 521 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", 522 | "dev": true 523 | }, 524 | "js-yaml": { 525 | "version": "3.13.1", 526 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/js-yaml/-/js-yaml-3.13.1.tgz", 527 | "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", 528 | "dev": true, 529 | "requires": { 530 | "argparse": "^1.0.7", 531 | "esprima": "^4.0.0" 532 | } 533 | }, 534 | "locate-path": { 535 | "version": "3.0.0", 536 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/locate-path/-/locate-path-3.0.0.tgz", 537 | "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", 538 | "dev": true, 539 | "requires": { 540 | "p-locate": "^3.0.0", 541 | "path-exists": "^3.0.0" 542 | } 543 | }, 544 | "lodash": { 545 | "version": "4.17.15", 546 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/lodash/-/lodash-4.17.15.tgz", 547 | "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", 548 | "dev": true 549 | }, 550 | "log-symbols": { 551 | "version": "2.2.0", 552 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/log-symbols/-/log-symbols-2.2.0.tgz", 553 | "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", 554 | "dev": true, 555 | "requires": { 556 | "chalk": "^2.0.1" 557 | } 558 | }, 559 | "long": { 560 | "version": "3.2.0", 561 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/long/-/long-3.2.0.tgz", 562 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 563 | }, 564 | "minimatch": { 565 | "version": "3.0.4", 566 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimatch/-/minimatch-3.0.4.tgz", 567 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 568 | "dev": true, 569 | "requires": { 570 | "brace-expansion": "^1.1.7" 571 | } 572 | }, 573 | "minimist": { 574 | "version": "0.0.8", 575 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimist/-/minimist-0.0.8.tgz", 576 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 577 | "dev": true 578 | }, 579 | "mkdirp": { 580 | "version": "0.5.1", 581 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mkdirp/-/mkdirp-0.5.1.tgz", 582 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 583 | "dev": true, 584 | "requires": { 585 | "minimist": "0.0.8" 586 | } 587 | }, 588 | "mocha": { 589 | "version": "6.2.2", 590 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mocha/-/mocha-6.2.2.tgz", 591 | "integrity": "sha1-XYmH4olAyviVen12ZLkQ3Fsv6iA=", 592 | "dev": true, 593 | "requires": { 594 | "ansi-colors": "3.2.3", 595 | "browser-stdout": "1.3.1", 596 | "debug": "3.2.6", 597 | "diff": "3.5.0", 598 | "escape-string-regexp": "1.0.5", 599 | "find-up": "3.0.0", 600 | "glob": "7.1.3", 601 | "growl": "1.10.5", 602 | "he": "1.2.0", 603 | "js-yaml": "3.13.1", 604 | "log-symbols": "2.2.0", 605 | "minimatch": "3.0.4", 606 | "mkdirp": "0.5.1", 607 | "ms": "2.1.1", 608 | "node-environment-flags": "1.0.5", 609 | "object.assign": "4.1.0", 610 | "strip-json-comments": "2.0.1", 611 | "supports-color": "6.0.0", 612 | "which": "1.3.1", 613 | "wide-align": "1.1.3", 614 | "yargs": "13.3.0", 615 | "yargs-parser": "13.1.1", 616 | "yargs-unparser": "1.6.0" 617 | }, 618 | "dependencies": { 619 | "debug": { 620 | "version": "3.2.6", 621 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.2.6.tgz", 622 | "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", 623 | "dev": true, 624 | "requires": { 625 | "ms": "^2.1.1" 626 | } 627 | }, 628 | "ms": { 629 | "version": "2.1.1", 630 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.1.1.tgz", 631 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", 632 | "dev": true 633 | } 634 | } 635 | }, 636 | "ms": { 637 | "version": "2.0.0", 638 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.0.0.tgz", 639 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 640 | }, 641 | "node-environment-flags": { 642 | "version": "1.0.5", 643 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 644 | "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", 645 | "dev": true, 646 | "requires": { 647 | "object.getownpropertydescriptors": "^2.0.3", 648 | "semver": "^5.7.0" 649 | } 650 | }, 651 | "nodes2ts": { 652 | "version": "1.1.10", 653 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/nodes2ts/-/nodes2ts-1.1.10.tgz", 654 | "integrity": "sha1-eCjhNDyn1B0WWNgzUkUnQKKcJ3M=", 655 | "requires": { 656 | "decimal.js": "^6.0.0", 657 | "long": "^3.2.0" 658 | } 659 | }, 660 | "object-inspect": { 661 | "version": "1.7.0", 662 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-inspect/-/object-inspect-1.7.0.tgz", 663 | "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", 664 | "dev": true 665 | }, 666 | "object-keys": { 667 | "version": "1.1.1", 668 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-keys/-/object-keys-1.1.1.tgz", 669 | "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", 670 | "dev": true 671 | }, 672 | "object.assign": { 673 | "version": "4.1.0", 674 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.assign/-/object.assign-4.1.0.tgz", 675 | "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", 676 | "dev": true, 677 | "requires": { 678 | "define-properties": "^1.1.2", 679 | "function-bind": "^1.1.1", 680 | "has-symbols": "^1.0.0", 681 | "object-keys": "^1.0.11" 682 | } 683 | }, 684 | "object.getownpropertydescriptors": { 685 | "version": "2.1.0", 686 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 687 | "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", 688 | "dev": true, 689 | "requires": { 690 | "define-properties": "^1.1.3", 691 | "es-abstract": "^1.17.0-next.1" 692 | } 693 | }, 694 | "once": { 695 | "version": "1.4.0", 696 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/once/-/once-1.4.0.tgz", 697 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 698 | "dev": true, 699 | "requires": { 700 | "wrappy": "1" 701 | } 702 | }, 703 | "p-limit": { 704 | "version": "2.2.2", 705 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-limit/-/p-limit-2.2.2.tgz", 706 | "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", 707 | "dev": true, 708 | "requires": { 709 | "p-try": "^2.0.0" 710 | } 711 | }, 712 | "p-locate": { 713 | "version": "3.0.0", 714 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-locate/-/p-locate-3.0.0.tgz", 715 | "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", 716 | "dev": true, 717 | "requires": { 718 | "p-limit": "^2.0.0" 719 | } 720 | }, 721 | "p-try": { 722 | "version": "2.2.0", 723 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-try/-/p-try-2.2.0.tgz", 724 | "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", 725 | "dev": true 726 | }, 727 | "path-exists": { 728 | "version": "3.0.0", 729 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-exists/-/path-exists-3.0.0.tgz", 730 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 731 | "dev": true 732 | }, 733 | "path-is-absolute": { 734 | "version": "1.0.1", 735 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 736 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 737 | "dev": true 738 | }, 739 | "pathval": { 740 | "version": "1.1.0", 741 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/pathval/-/pathval-1.1.0.tgz", 742 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 743 | "dev": true 744 | }, 745 | "punycode": { 746 | "version": "1.3.2", 747 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 748 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 749 | "dev": true 750 | }, 751 | "querystring": { 752 | "version": "0.2.0", 753 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 754 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 755 | "dev": true 756 | }, 757 | "require-directory": { 758 | "version": "2.1.1", 759 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-directory/-/require-directory-2.1.1.tgz", 760 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 761 | "dev": true 762 | }, 763 | "require-main-filename": { 764 | "version": "2.0.0", 765 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-main-filename/-/require-main-filename-2.0.0.tgz", 766 | "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", 767 | "dev": true 768 | }, 769 | "sax": { 770 | "version": "1.2.1", 771 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 772 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", 773 | "dev": true 774 | }, 775 | "semver": { 776 | "version": "5.7.1", 777 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/semver/-/semver-5.7.1.tgz", 778 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", 779 | "dev": true 780 | }, 781 | "set-blocking": { 782 | "version": "2.0.0", 783 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/set-blocking/-/set-blocking-2.0.0.tgz", 784 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 785 | "dev": true 786 | }, 787 | "sprintf-js": { 788 | "version": "1.0.3", 789 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/sprintf-js/-/sprintf-js-1.0.3.tgz", 790 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 791 | "dev": true 792 | }, 793 | "string-width": { 794 | "version": "2.1.1", 795 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-2.1.1.tgz", 796 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 797 | "dev": true, 798 | "requires": { 799 | "is-fullwidth-code-point": "^2.0.0", 800 | "strip-ansi": "^4.0.0" 801 | } 802 | }, 803 | "string.prototype.trimleft": { 804 | "version": "2.1.1", 805 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 806 | "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", 807 | "dev": true, 808 | "requires": { 809 | "define-properties": "^1.1.3", 810 | "function-bind": "^1.1.1" 811 | } 812 | }, 813 | "string.prototype.trimright": { 814 | "version": "2.1.1", 815 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 816 | "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", 817 | "dev": true, 818 | "requires": { 819 | "define-properties": "^1.1.3", 820 | "function-bind": "^1.1.1" 821 | } 822 | }, 823 | "strip-ansi": { 824 | "version": "4.0.0", 825 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-4.0.0.tgz", 826 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 827 | "dev": true, 828 | "requires": { 829 | "ansi-regex": "^3.0.0" 830 | } 831 | }, 832 | "strip-json-comments": { 833 | "version": "2.0.1", 834 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 835 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 836 | "dev": true 837 | }, 838 | "supports-color": { 839 | "version": "6.0.0", 840 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-6.0.0.tgz", 841 | "integrity": "sha1-ds/nQs8fQbubHCmtAwaMBbTA5Ao=", 842 | "dev": true, 843 | "requires": { 844 | "has-flag": "^3.0.0" 845 | } 846 | }, 847 | "type-detect": { 848 | "version": "4.0.8", 849 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/type-detect/-/type-detect-4.0.8.tgz", 850 | "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", 851 | "dev": true 852 | }, 853 | "url": { 854 | "version": "0.10.3", 855 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 856 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 857 | "dev": true, 858 | "requires": { 859 | "punycode": "1.3.2", 860 | "querystring": "0.2.0" 861 | } 862 | }, 863 | "uuid": { 864 | "version": "3.3.2", 865 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 866 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 867 | "dev": true 868 | }, 869 | "which": { 870 | "version": "1.3.1", 871 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which/-/which-1.3.1.tgz", 872 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 873 | "dev": true, 874 | "requires": { 875 | "isexe": "^2.0.0" 876 | } 877 | }, 878 | "which-module": { 879 | "version": "2.0.0", 880 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which-module/-/which-module-2.0.0.tgz", 881 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 882 | "dev": true 883 | }, 884 | "wide-align": { 885 | "version": "1.1.3", 886 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wide-align/-/wide-align-1.1.3.tgz", 887 | "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", 888 | "dev": true, 889 | "requires": { 890 | "string-width": "^1.0.2 || 2" 891 | } 892 | }, 893 | "wrap-ansi": { 894 | "version": "5.1.0", 895 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 896 | "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", 897 | "dev": true, 898 | "requires": { 899 | "ansi-styles": "^3.2.0", 900 | "string-width": "^3.0.0", 901 | "strip-ansi": "^5.0.0" 902 | }, 903 | "dependencies": { 904 | "ansi-regex": { 905 | "version": "4.1.0", 906 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 907 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 908 | "dev": true 909 | }, 910 | "string-width": { 911 | "version": "3.1.0", 912 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 913 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 914 | "dev": true, 915 | "requires": { 916 | "emoji-regex": "^7.0.1", 917 | "is-fullwidth-code-point": "^2.0.0", 918 | "strip-ansi": "^5.1.0" 919 | } 920 | }, 921 | "strip-ansi": { 922 | "version": "5.2.0", 923 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 924 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 925 | "dev": true, 926 | "requires": { 927 | "ansi-regex": "^4.1.0" 928 | } 929 | } 930 | } 931 | }, 932 | "wrappy": { 933 | "version": "1.0.2", 934 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrappy/-/wrappy-1.0.2.tgz", 935 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 936 | "dev": true 937 | }, 938 | "xml2js": { 939 | "version": "0.4.19", 940 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 941 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 942 | "dev": true, 943 | "requires": { 944 | "sax": ">=0.6.0", 945 | "xmlbuilder": "~9.0.1" 946 | } 947 | }, 948 | "xmlbuilder": { 949 | "version": "9.0.7", 950 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 951 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 952 | "dev": true 953 | }, 954 | "y18n": { 955 | "version": "4.0.0", 956 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/y18n/-/y18n-4.0.0.tgz", 957 | "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", 958 | "dev": true 959 | }, 960 | "yargs": { 961 | "version": "13.3.0", 962 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs/-/yargs-13.3.0.tgz", 963 | "integrity": "sha1-TGV6VeB+Xyz5R/ijZlZ8BKDe3IM=", 964 | "dev": true, 965 | "requires": { 966 | "cliui": "^5.0.0", 967 | "find-up": "^3.0.0", 968 | "get-caller-file": "^2.0.1", 969 | "require-directory": "^2.1.1", 970 | "require-main-filename": "^2.0.0", 971 | "set-blocking": "^2.0.0", 972 | "string-width": "^3.0.0", 973 | "which-module": "^2.0.0", 974 | "y18n": "^4.0.0", 975 | "yargs-parser": "^13.1.1" 976 | }, 977 | "dependencies": { 978 | "ansi-regex": { 979 | "version": "4.1.0", 980 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 981 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 982 | "dev": true 983 | }, 984 | "string-width": { 985 | "version": "3.1.0", 986 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 987 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 988 | "dev": true, 989 | "requires": { 990 | "emoji-regex": "^7.0.1", 991 | "is-fullwidth-code-point": "^2.0.0", 992 | "strip-ansi": "^5.1.0" 993 | } 994 | }, 995 | "strip-ansi": { 996 | "version": "5.2.0", 997 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 998 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 999 | "dev": true, 1000 | "requires": { 1001 | "ansi-regex": "^4.1.0" 1002 | } 1003 | } 1004 | } 1005 | }, 1006 | "yargs-parser": { 1007 | "version": "13.1.1", 1008 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-parser/-/yargs-parser-13.1.1.tgz", 1009 | "integrity": "sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=", 1010 | "dev": true, 1011 | "requires": { 1012 | "camelcase": "^5.0.0", 1013 | "decamelize": "^1.2.0" 1014 | } 1015 | }, 1016 | "yargs-unparser": { 1017 | "version": "1.6.0", 1018 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1019 | "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", 1020 | "dev": true, 1021 | "requires": { 1022 | "flat": "^4.1.0", 1023 | "lodash": "^4.17.15", 1024 | "yargs": "^13.3.0" 1025 | } 1026 | } 1027 | } 1028 | } 1029 | -------------------------------------------------------------------------------- /lambdas/get-items-by-location/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "get-items-by-location", 3 | "version": "1.0.0", 4 | "description": "Returns a list of items in a given radius to the passed in location", 5 | "main": "app.js", 6 | "license": "MIT", 7 | "dependencies": { 8 | "dynamodb-geo": "^0.4.0", 9 | "geocodio-library-node": "^1.1.0", 10 | "http-status-codes": "^1.4.0" 11 | }, 12 | "scripts": { 13 | "test": "mocha **/tests/unit/*.js" 14 | }, 15 | "devDependencies": { 16 | "aws-sdk": "^2.543.0", 17 | "chai": "^4.2.0", 18 | "mocha": "^6.1.4" 19 | }, 20 | "jshintConfig": { 21 | "esversion": 8 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /lambdas/update-item-geolocation/.npmignore: -------------------------------------------------------------------------------- 1 | tests/* 2 | -------------------------------------------------------------------------------- /lambdas/update-item-geolocation/app.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable object-curly-spacing */ 2 | const AWS = require('aws-sdk'); 3 | const ddb = new AWS.DynamoDB(); 4 | const DYNAMO_CLIENT = require('aws-sdk/clients/dynamodb'); 5 | const documentClient = new DYNAMO_CLIENT.DocumentClient(); 6 | const httpStatusCode = require('http-status-codes'); 7 | const Geocodio = require('geocodio-library-node'); 8 | const ddbGeo = require('dynamodb-geo'); 9 | 10 | let response; 11 | 12 | exports.lambdaHandler = async (event, context) => { 13 | try { 14 | const input = JSON.parse(event.body); 15 | if (!input.address || !input.name) { 16 | response = { 17 | statusCode: httpStatusCode.BAD_REQUEST, 18 | body: JSON.stringify({ 19 | message: 'Name and address are required fields.' 20 | }) 21 | }; 22 | return response; 23 | } 24 | 25 | const item = await getItem(event.pathParameters.itemId); 26 | if (!item) { 27 | response = { 28 | statusCode: httpStatusCode.NOT_FOUND, 29 | body: JSON.stringify({ 30 | message: `Item with id '${event.pathParameters.itemId}' could not be found` 31 | }) 32 | }; 33 | return response; 34 | } 35 | 36 | await deleteExistingItem(item); 37 | const geoPoint = await saveNewGeolocation(item.rangeKey, input); 38 | await saveGeoPointToItem(item, geoPoint); 39 | 40 | response = { 41 | statusCode: httpStatusCode.NO_CONTENT, 42 | }; 43 | 44 | } catch (err) { 45 | console.log(err); 46 | response = { 47 | statusCode: httpStatusCode.INTERNAL_SERVER_ERROR, 48 | body: JSON.stringify(err), 49 | }; 50 | } 51 | 52 | return response; 53 | }; 54 | 55 | 56 | 57 | /** 58 | * @param {string} id - Id of the geolocated item 59 | */ 60 | async function getItem(id) { 61 | try { 62 | let hash = Number(id.replace(/\D/g, '')); 63 | const params = { 64 | TableName: process.env.DynamoDBTableName, 65 | Key: { 66 | hashKey: hash, 67 | rangeKey: id 68 | } 69 | }; 70 | 71 | const result = await documentClient.get(params).promise(); 72 | return result.Item; 73 | } 74 | catch (err) { 75 | console.log('An error occurred loading the item metadata'); 76 | console.log(err); 77 | } 78 | } 79 | 80 | /** 81 | * Deletes the existing item using GeoDataManager 82 | * @param {any} item - Item details currently stored in Dynamo 83 | */ 84 | async function deleteExistingItem(item) { 85 | try { 86 | const config = 87 | new ddbGeo.GeoDataManagerConfiguration(ddb, process.env.DynamoDBTableName); 88 | config.hashKeyLength = 5; 89 | 90 | const geoTableManager = new ddbGeo.GeoDataManager(config); 91 | 92 | const oldGeoData = { 93 | RangeKeyValue: { S: item.rangeKey }, 94 | GeoPoint: item.GeoPoint 95 | }; 96 | 97 | await geoTableManager.deletePoint(oldGeoData).promise(); 98 | } catch (err) { 99 | console.log('An error occurred deleting the item'); 100 | console.log(err); 101 | } 102 | } 103 | 104 | /** 105 | * Updates the name in the database. Does not change address information 106 | * @param {string} id - Id of the item to update 107 | * @param {any} input - Input passed into the lambda function 108 | * @return {any} Recorded GeoPoint for future lookups 109 | */ 110 | async function saveNewGeolocation(id, input) { 111 | try { 112 | const coords = await geocodeAddress(input.address); 113 | if (!coords) { 114 | return; 115 | } 116 | 117 | const config = new ddbGeo.GeoDataManagerConfiguration(ddb, process.env.DynamoDBTableName); 118 | config.hashKeyLength = 5; 119 | 120 | const geoTableManager = new ddbGeo.GeoDataManager(config); 121 | const geoData = { 122 | RangeKeyValue: { S: id }, 123 | GeoPoint: { 124 | latitude: coords.lat, 125 | longitude: coords.lng, 126 | }, 127 | PutItemInput: { 128 | Item: { 129 | name: { S: input.name }, 130 | address: { S: input.address }, 131 | }, 132 | }, 133 | }; 134 | 135 | await geoTableManager.putPoint(geoData).promise(); 136 | 137 | return geoData.GeoPoint; 138 | } catch (err) { 139 | console.log('Unable to save geolocation for item'); 140 | console.log(err); 141 | } 142 | } 143 | 144 | /** 145 | * Uses Geocodio to geocode a specific address 146 | * @param {string} address - Address (line 1, line 2, city, state, zip) you want to geocode 147 | * @return {any} - Coordinates of the address passed in 148 | */ 149 | async function geocodeAddress(address) { 150 | let coords; 151 | try { 152 | const geocoder = new Geocodio(process.env.GeocodioApiKey); 153 | const response = await geocoder.geocode(address); 154 | 155 | if (response && response.results && response.results.length > 0) { 156 | // Results are returned with highest likelihood first, so grab the first one 157 | coords = response.results[0].location; 158 | } 159 | } 160 | catch (err) { 161 | console.log('An error occurred while geocoding the address: ' + address); 162 | console.log(err); 163 | } 164 | 165 | return coords; 166 | } 167 | 168 | /** 169 | * Save metadata about the item for future lookups. This is to work around the 170 | * limitation in dynamodb-geo that doesn't let you update addresses/geopoints 171 | * @param {any} item - Data about the geolocation to store for future lookup 172 | * @param {*} geoPoint - Geocoded coordinates for the passed in address 173 | */ 174 | async function saveGeoPointToItem(item, geoPoint) { 175 | item.GeoPoint = geoPoint; 176 | const params = { 177 | TableName: process.env.DynamoDBTableName, 178 | Item: item 179 | }; 180 | 181 | await documentClient.put(params).promise(); 182 | } 183 | -------------------------------------------------------------------------------- /lambdas/update-item-geolocation/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello_world", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/decimal.js": { 8 | "version": "0.0.30", 9 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/decimal.js/-/decimal.js-0.0.30.tgz", 10 | "integrity": "sha1-B3mNkFldvzk28Q8kDvOMW5KO1fw=" 11 | }, 12 | "@types/long": { 13 | "version": "4.0.0", 14 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/@types/long/-/long-4.0.0.tgz", 15 | "integrity": "sha1-cZVR0jUtMBrIuB23Mqy2vcKNve8=" 16 | }, 17 | "ansi-colors": { 18 | "version": "3.2.3", 19 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-colors/-/ansi-colors-3.2.3.tgz", 20 | "integrity": "sha1-V9NbhoboUeLMBMQD8cACA5dqGBM=", 21 | "dev": true 22 | }, 23 | "ansi-regex": { 24 | "version": "3.0.0", 25 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-3.0.0.tgz", 26 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 27 | "dev": true 28 | }, 29 | "ansi-styles": { 30 | "version": "3.2.1", 31 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-styles/-/ansi-styles-3.2.1.tgz", 32 | "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", 33 | "dev": true, 34 | "requires": { 35 | "color-convert": "^1.9.0" 36 | } 37 | }, 38 | "argparse": { 39 | "version": "1.0.10", 40 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/argparse/-/argparse-1.0.10.tgz", 41 | "integrity": "sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE=", 42 | "dev": true, 43 | "requires": { 44 | "sprintf-js": "~1.0.2" 45 | } 46 | }, 47 | "assertion-error": { 48 | "version": "1.1.0", 49 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/assertion-error/-/assertion-error-1.1.0.tgz", 50 | "integrity": "sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs=", 51 | "dev": true 52 | }, 53 | "aws-sdk": { 54 | "version": "2.543.0", 55 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.543.0.tgz", 56 | "integrity": "sha512-ABHsA4W7LLYnTBCgtbTt0NF7+66nMCtdcJuAn30+RGzF0bOw3lCguqzootFrMlIOXklddQFJ9kKTXd+p/+uCVQ==", 57 | "dev": true, 58 | "requires": { 59 | "buffer": "4.9.1", 60 | "events": "1.1.1", 61 | "ieee754": "1.1.13", 62 | "jmespath": "0.15.0", 63 | "querystring": "0.2.0", 64 | "sax": "1.2.1", 65 | "url": "0.10.3", 66 | "uuid": "3.3.2", 67 | "xml2js": "0.4.19" 68 | } 69 | }, 70 | "axios": { 71 | "version": "0.18.1", 72 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/axios/-/axios-0.18.1.tgz", 73 | "integrity": "sha1-/z8N4ue10YDnV62YAA8Qgbh7zqM=", 74 | "requires": { 75 | "follow-redirects": "1.5.10", 76 | "is-buffer": "^2.0.2" 77 | } 78 | }, 79 | "balanced-match": { 80 | "version": "1.0.0", 81 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/balanced-match/-/balanced-match-1.0.0.tgz", 82 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 83 | "dev": true 84 | }, 85 | "base64-js": { 86 | "version": "1.3.1", 87 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 88 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", 89 | "dev": true 90 | }, 91 | "brace-expansion": { 92 | "version": "1.1.11", 93 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/brace-expansion/-/brace-expansion-1.1.11.tgz", 94 | "integrity": "sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0=", 95 | "dev": true, 96 | "requires": { 97 | "balanced-match": "^1.0.0", 98 | "concat-map": "0.0.1" 99 | } 100 | }, 101 | "browser-stdout": { 102 | "version": "1.3.1", 103 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/browser-stdout/-/browser-stdout-1.3.1.tgz", 104 | "integrity": "sha1-uqVZ7hTO1zRSIputcyZGfGH6vWA=", 105 | "dev": true 106 | }, 107 | "buffer": { 108 | "version": "4.9.1", 109 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 110 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 111 | "dev": true, 112 | "requires": { 113 | "base64-js": "^1.0.2", 114 | "ieee754": "^1.1.4", 115 | "isarray": "^1.0.0" 116 | } 117 | }, 118 | "camelcase": { 119 | "version": "5.3.1", 120 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/camelcase/-/camelcase-5.3.1.tgz", 121 | "integrity": "sha1-48mzFWnhBoEd8kL3FXJaH0xJQyA=", 122 | "dev": true 123 | }, 124 | "chai": { 125 | "version": "4.2.0", 126 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chai/-/chai-4.2.0.tgz", 127 | "integrity": "sha1-dgqnLPION5XoSxKHfODoNzeqKeU=", 128 | "dev": true, 129 | "requires": { 130 | "assertion-error": "^1.1.0", 131 | "check-error": "^1.0.2", 132 | "deep-eql": "^3.0.1", 133 | "get-func-name": "^2.0.0", 134 | "pathval": "^1.1.0", 135 | "type-detect": "^4.0.5" 136 | } 137 | }, 138 | "chalk": { 139 | "version": "2.4.2", 140 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/chalk/-/chalk-2.4.2.tgz", 141 | "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", 142 | "dev": true, 143 | "requires": { 144 | "ansi-styles": "^3.2.1", 145 | "escape-string-regexp": "^1.0.5", 146 | "supports-color": "^5.3.0" 147 | }, 148 | "dependencies": { 149 | "supports-color": { 150 | "version": "5.5.0", 151 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-5.5.0.tgz", 152 | "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", 153 | "dev": true, 154 | "requires": { 155 | "has-flag": "^3.0.0" 156 | } 157 | } 158 | } 159 | }, 160 | "check-error": { 161 | "version": "1.0.2", 162 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/check-error/-/check-error-1.0.2.tgz", 163 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 164 | "dev": true 165 | }, 166 | "cliui": { 167 | "version": "5.0.0", 168 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/cliui/-/cliui-5.0.0.tgz", 169 | "integrity": "sha1-3u/P2y6AB4SqNPRvoI4GhRx7u8U=", 170 | "dev": true, 171 | "requires": { 172 | "string-width": "^3.1.0", 173 | "strip-ansi": "^5.2.0", 174 | "wrap-ansi": "^5.1.0" 175 | }, 176 | "dependencies": { 177 | "ansi-regex": { 178 | "version": "4.1.0", 179 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 180 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 181 | "dev": true 182 | }, 183 | "string-width": { 184 | "version": "3.1.0", 185 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 186 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 187 | "dev": true, 188 | "requires": { 189 | "emoji-regex": "^7.0.1", 190 | "is-fullwidth-code-point": "^2.0.0", 191 | "strip-ansi": "^5.1.0" 192 | } 193 | }, 194 | "strip-ansi": { 195 | "version": "5.2.0", 196 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 197 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 198 | "dev": true, 199 | "requires": { 200 | "ansi-regex": "^4.1.0" 201 | } 202 | } 203 | } 204 | }, 205 | "color-convert": { 206 | "version": "1.9.3", 207 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-convert/-/color-convert-1.9.3.tgz", 208 | "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", 209 | "dev": true, 210 | "requires": { 211 | "color-name": "1.1.3" 212 | } 213 | }, 214 | "color-name": { 215 | "version": "1.1.3", 216 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/color-name/-/color-name-1.1.3.tgz", 217 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 218 | "dev": true 219 | }, 220 | "concat-map": { 221 | "version": "0.0.1", 222 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/concat-map/-/concat-map-0.0.1.tgz", 223 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 224 | "dev": true 225 | }, 226 | "debug": { 227 | "version": "3.1.0", 228 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.1.0.tgz", 229 | "integrity": "sha1-W7WgZyYotkFJVmuhaBnmFRjGcmE=", 230 | "requires": { 231 | "ms": "2.0.0" 232 | } 233 | }, 234 | "decamelize": { 235 | "version": "1.2.0", 236 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decamelize/-/decamelize-1.2.0.tgz", 237 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 238 | "dev": true 239 | }, 240 | "decimal.js": { 241 | "version": "6.0.0", 242 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/decimal.js/-/decimal.js-6.0.0.tgz", 243 | "integrity": "sha1-T9WNBjfzb9vBq6EyC8Pyzug8oPI=" 244 | }, 245 | "deep-eql": { 246 | "version": "3.0.1", 247 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/deep-eql/-/deep-eql-3.0.1.tgz", 248 | "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", 249 | "dev": true, 250 | "requires": { 251 | "type-detect": "^4.0.0" 252 | } 253 | }, 254 | "define-properties": { 255 | "version": "1.1.3", 256 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/define-properties/-/define-properties-1.1.3.tgz", 257 | "integrity": "sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE=", 258 | "dev": true, 259 | "requires": { 260 | "object-keys": "^1.0.12" 261 | } 262 | }, 263 | "diff": { 264 | "version": "3.5.0", 265 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/diff/-/diff-3.5.0.tgz", 266 | "integrity": "sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI=", 267 | "dev": true 268 | }, 269 | "dynamodb-geo": { 270 | "version": "0.4.0", 271 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/dynamodb-geo/-/dynamodb-geo-0.4.0.tgz", 272 | "integrity": "sha1-T0EF39urEsuEjmQjesibNhLNrh4=", 273 | "requires": { 274 | "@types/decimal.js": "^0.0.30", 275 | "@types/long": ">=3", 276 | "nodes2ts": "^1.1.10" 277 | } 278 | }, 279 | "emoji-regex": { 280 | "version": "7.0.3", 281 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/emoji-regex/-/emoji-regex-7.0.3.tgz", 282 | "integrity": "sha1-kzoEBShgyF6DwSJHnEdIqOTHIVY=", 283 | "dev": true 284 | }, 285 | "es-abstract": { 286 | "version": "1.17.0", 287 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-abstract/-/es-abstract-1.17.0.tgz", 288 | "integrity": "sha1-9CpRfQA2pVkduyxGNZHci7UDCbE=", 289 | "dev": true, 290 | "requires": { 291 | "es-to-primitive": "^1.2.1", 292 | "function-bind": "^1.1.1", 293 | "has": "^1.0.3", 294 | "has-symbols": "^1.0.1", 295 | "is-callable": "^1.1.5", 296 | "is-regex": "^1.0.5", 297 | "object-inspect": "^1.7.0", 298 | "object-keys": "^1.1.1", 299 | "object.assign": "^4.1.0", 300 | "string.prototype.trimleft": "^2.1.1", 301 | "string.prototype.trimright": "^2.1.1" 302 | } 303 | }, 304 | "es-to-primitive": { 305 | "version": "1.2.1", 306 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 307 | "integrity": "sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo=", 308 | "dev": true, 309 | "requires": { 310 | "is-callable": "^1.1.4", 311 | "is-date-object": "^1.0.1", 312 | "is-symbol": "^1.0.2" 313 | } 314 | }, 315 | "escape-string-regexp": { 316 | "version": "1.0.5", 317 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 318 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 319 | "dev": true 320 | }, 321 | "esprima": { 322 | "version": "4.0.1", 323 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/esprima/-/esprima-4.0.1.tgz", 324 | "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=", 325 | "dev": true 326 | }, 327 | "events": { 328 | "version": "1.1.1", 329 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 330 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", 331 | "dev": true 332 | }, 333 | "find-up": { 334 | "version": "3.0.0", 335 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/find-up/-/find-up-3.0.0.tgz", 336 | "integrity": "sha1-SRafHXmTQwZG2mHsxa41XCHJe3M=", 337 | "dev": true, 338 | "requires": { 339 | "locate-path": "^3.0.0" 340 | } 341 | }, 342 | "flat": { 343 | "version": "4.1.0", 344 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/flat/-/flat-4.1.0.tgz", 345 | "integrity": "sha1-CQvsiwXjnLowl0fx1YjwTbr5jbI=", 346 | "dev": true, 347 | "requires": { 348 | "is-buffer": "~2.0.3" 349 | } 350 | }, 351 | "follow-redirects": { 352 | "version": "1.5.10", 353 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/follow-redirects/-/follow-redirects-1.5.10.tgz", 354 | "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=", 355 | "requires": { 356 | "debug": "=3.1.0" 357 | } 358 | }, 359 | "fs.realpath": { 360 | "version": "1.0.0", 361 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/fs.realpath/-/fs.realpath-1.0.0.tgz", 362 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 363 | "dev": true 364 | }, 365 | "function-bind": { 366 | "version": "1.1.1", 367 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/function-bind/-/function-bind-1.1.1.tgz", 368 | "integrity": "sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=", 369 | "dev": true 370 | }, 371 | "geocodio-library-node": { 372 | "version": "1.0.0", 373 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/geocodio-library-node/-/geocodio-library-node-1.0.0.tgz", 374 | "integrity": "sha1-oYEt4LcbCQhl862cbHwQewvpBkE=", 375 | "requires": { 376 | "axios": "^0.19.0" 377 | }, 378 | "dependencies": { 379 | "axios": { 380 | "version": "0.19.0", 381 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/axios/-/axios-0.19.0.tgz", 382 | "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=", 383 | "requires": { 384 | "follow-redirects": "1.5.10", 385 | "is-buffer": "^2.0.2" 386 | } 387 | } 388 | } 389 | }, 390 | "get-caller-file": { 391 | "version": "2.0.5", 392 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-caller-file/-/get-caller-file-2.0.5.tgz", 393 | "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=", 394 | "dev": true 395 | }, 396 | "get-func-name": { 397 | "version": "2.0.0", 398 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/get-func-name/-/get-func-name-2.0.0.tgz", 399 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 400 | "dev": true 401 | }, 402 | "glob": { 403 | "version": "7.1.3", 404 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/glob/-/glob-7.1.3.tgz", 405 | "integrity": "sha1-OWCDLT8VdBCDQtr9OmezMsCWnfE=", 406 | "dev": true, 407 | "requires": { 408 | "fs.realpath": "^1.0.0", 409 | "inflight": "^1.0.4", 410 | "inherits": "2", 411 | "minimatch": "^3.0.4", 412 | "once": "^1.3.0", 413 | "path-is-absolute": "^1.0.0" 414 | } 415 | }, 416 | "growl": { 417 | "version": "1.10.5", 418 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/growl/-/growl-1.10.5.tgz", 419 | "integrity": "sha1-8nNdwig2dPpnR4sQGBBZNVw2nl4=", 420 | "dev": true 421 | }, 422 | "has": { 423 | "version": "1.0.3", 424 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has/-/has-1.0.3.tgz", 425 | "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", 426 | "dev": true, 427 | "requires": { 428 | "function-bind": "^1.1.1" 429 | } 430 | }, 431 | "has-flag": { 432 | "version": "3.0.0", 433 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-flag/-/has-flag-3.0.0.tgz", 434 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 435 | "dev": true 436 | }, 437 | "has-symbols": { 438 | "version": "1.0.1", 439 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/has-symbols/-/has-symbols-1.0.1.tgz", 440 | "integrity": "sha1-n1IUdYpEGWxAbZvXbOv4HsLdMeg=", 441 | "dev": true 442 | }, 443 | "he": { 444 | "version": "1.2.0", 445 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/he/-/he-1.2.0.tgz", 446 | "integrity": "sha1-hK5l+n6vsWX922FWauFLrwVmTw8=", 447 | "dev": true 448 | }, 449 | "http-status-codes": { 450 | "version": "1.4.0", 451 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/http-status-codes/-/http-status-codes-1.4.0.tgz", 452 | "integrity": "sha1-bkwV0W/zqeLfA7ifOlXhquBftHc=" 453 | }, 454 | "ieee754": { 455 | "version": "1.1.13", 456 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", 457 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", 458 | "dev": true 459 | }, 460 | "inflight": { 461 | "version": "1.0.6", 462 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inflight/-/inflight-1.0.6.tgz", 463 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 464 | "dev": true, 465 | "requires": { 466 | "once": "^1.3.0", 467 | "wrappy": "1" 468 | } 469 | }, 470 | "inherits": { 471 | "version": "2.0.4", 472 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/inherits/-/inherits-2.0.4.tgz", 473 | "integrity": "sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w=", 474 | "dev": true 475 | }, 476 | "is-buffer": { 477 | "version": "2.0.4", 478 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-buffer/-/is-buffer-2.0.4.tgz", 479 | "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM=" 480 | }, 481 | "is-callable": { 482 | "version": "1.1.5", 483 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-callable/-/is-callable-1.1.5.tgz", 484 | "integrity": "sha1-9+RrWWiQRW23Tn9ul2yzJz0G+qs=", 485 | "dev": true 486 | }, 487 | "is-date-object": { 488 | "version": "1.0.2", 489 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-date-object/-/is-date-object-1.0.2.tgz", 490 | "integrity": "sha1-vac28s2P0G0yhE53Q7+nSUw7/X4=", 491 | "dev": true 492 | }, 493 | "is-fullwidth-code-point": { 494 | "version": "2.0.0", 495 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 496 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 497 | "dev": true 498 | }, 499 | "is-regex": { 500 | "version": "1.0.5", 501 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-regex/-/is-regex-1.0.5.tgz", 502 | "integrity": "sha1-OdWJo1i/GJZ/cmlnEguPwa7XTq4=", 503 | "dev": true, 504 | "requires": { 505 | "has": "^1.0.3" 506 | } 507 | }, 508 | "is-symbol": { 509 | "version": "1.0.3", 510 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/is-symbol/-/is-symbol-1.0.3.tgz", 511 | "integrity": "sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc=", 512 | "dev": true, 513 | "requires": { 514 | "has-symbols": "^1.0.1" 515 | } 516 | }, 517 | "isarray": { 518 | "version": "1.0.0", 519 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 520 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", 521 | "dev": true 522 | }, 523 | "isexe": { 524 | "version": "2.0.0", 525 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/isexe/-/isexe-2.0.0.tgz", 526 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 527 | "dev": true 528 | }, 529 | "jmespath": { 530 | "version": "0.15.0", 531 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 532 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", 533 | "dev": true 534 | }, 535 | "js-yaml": { 536 | "version": "3.13.1", 537 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/js-yaml/-/js-yaml-3.13.1.tgz", 538 | "integrity": "sha1-r/FRswv9+o5J4F2iLnQV6d+jeEc=", 539 | "dev": true, 540 | "requires": { 541 | "argparse": "^1.0.7", 542 | "esprima": "^4.0.0" 543 | } 544 | }, 545 | "locate-path": { 546 | "version": "3.0.0", 547 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/locate-path/-/locate-path-3.0.0.tgz", 548 | "integrity": "sha1-2+w7OrdZdYBxtY/ln8QYca8hQA4=", 549 | "dev": true, 550 | "requires": { 551 | "p-locate": "^3.0.0", 552 | "path-exists": "^3.0.0" 553 | } 554 | }, 555 | "lodash": { 556 | "version": "4.17.15", 557 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/lodash/-/lodash-4.17.15.tgz", 558 | "integrity": "sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=", 559 | "dev": true 560 | }, 561 | "log-symbols": { 562 | "version": "2.2.0", 563 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/log-symbols/-/log-symbols-2.2.0.tgz", 564 | "integrity": "sha1-V0Dhxdbw39pK2TI7UzIQfva0xAo=", 565 | "dev": true, 566 | "requires": { 567 | "chalk": "^2.0.1" 568 | } 569 | }, 570 | "long": { 571 | "version": "3.2.0", 572 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/long/-/long-3.2.0.tgz", 573 | "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" 574 | }, 575 | "minimatch": { 576 | "version": "3.0.4", 577 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimatch/-/minimatch-3.0.4.tgz", 578 | "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", 579 | "dev": true, 580 | "requires": { 581 | "brace-expansion": "^1.1.7" 582 | } 583 | }, 584 | "minimist": { 585 | "version": "0.0.8", 586 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/minimist/-/minimist-0.0.8.tgz", 587 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 588 | "dev": true 589 | }, 590 | "mkdirp": { 591 | "version": "0.5.1", 592 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mkdirp/-/mkdirp-0.5.1.tgz", 593 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 594 | "dev": true, 595 | "requires": { 596 | "minimist": "0.0.8" 597 | } 598 | }, 599 | "mocha": { 600 | "version": "6.2.2", 601 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/mocha/-/mocha-6.2.2.tgz", 602 | "integrity": "sha1-XYmH4olAyviVen12ZLkQ3Fsv6iA=", 603 | "dev": true, 604 | "requires": { 605 | "ansi-colors": "3.2.3", 606 | "browser-stdout": "1.3.1", 607 | "debug": "3.2.6", 608 | "diff": "3.5.0", 609 | "escape-string-regexp": "1.0.5", 610 | "find-up": "3.0.0", 611 | "glob": "7.1.3", 612 | "growl": "1.10.5", 613 | "he": "1.2.0", 614 | "js-yaml": "3.13.1", 615 | "log-symbols": "2.2.0", 616 | "minimatch": "3.0.4", 617 | "mkdirp": "0.5.1", 618 | "ms": "2.1.1", 619 | "node-environment-flags": "1.0.5", 620 | "object.assign": "4.1.0", 621 | "strip-json-comments": "2.0.1", 622 | "supports-color": "6.0.0", 623 | "which": "1.3.1", 624 | "wide-align": "1.1.3", 625 | "yargs": "13.3.0", 626 | "yargs-parser": "13.1.1", 627 | "yargs-unparser": "1.6.0" 628 | }, 629 | "dependencies": { 630 | "debug": { 631 | "version": "3.2.6", 632 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/debug/-/debug-3.2.6.tgz", 633 | "integrity": "sha1-6D0X3hbYp++3cX7b5fsQE17uYps=", 634 | "dev": true, 635 | "requires": { 636 | "ms": "^2.1.1" 637 | } 638 | }, 639 | "ms": { 640 | "version": "2.1.1", 641 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.1.1.tgz", 642 | "integrity": "sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo=", 643 | "dev": true 644 | } 645 | } 646 | }, 647 | "ms": { 648 | "version": "2.0.0", 649 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ms/-/ms-2.0.0.tgz", 650 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 651 | }, 652 | "node-environment-flags": { 653 | "version": "1.0.5", 654 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 655 | "integrity": "sha1-+pMCdfW/Xa4YjWGSsktMi7rD12o=", 656 | "dev": true, 657 | "requires": { 658 | "object.getownpropertydescriptors": "^2.0.3", 659 | "semver": "^5.7.0" 660 | } 661 | }, 662 | "nodes2ts": { 663 | "version": "1.1.10", 664 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/nodes2ts/-/nodes2ts-1.1.10.tgz", 665 | "integrity": "sha1-eCjhNDyn1B0WWNgzUkUnQKKcJ3M=", 666 | "requires": { 667 | "decimal.js": "^6.0.0", 668 | "long": "^3.2.0" 669 | } 670 | }, 671 | "object-inspect": { 672 | "version": "1.7.0", 673 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-inspect/-/object-inspect-1.7.0.tgz", 674 | "integrity": "sha1-9Pa9GBrXfwBrXs5gvQtvOY/3Smc=", 675 | "dev": true 676 | }, 677 | "object-keys": { 678 | "version": "1.1.1", 679 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object-keys/-/object-keys-1.1.1.tgz", 680 | "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=", 681 | "dev": true 682 | }, 683 | "object.assign": { 684 | "version": "4.1.0", 685 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.assign/-/object.assign-4.1.0.tgz", 686 | "integrity": "sha1-lovxEA15Vrs8oIbwBvhGs7xACNo=", 687 | "dev": true, 688 | "requires": { 689 | "define-properties": "^1.1.2", 690 | "function-bind": "^1.1.1", 691 | "has-symbols": "^1.0.0", 692 | "object-keys": "^1.0.11" 693 | } 694 | }, 695 | "object.getownpropertydescriptors": { 696 | "version": "2.1.0", 697 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 698 | "integrity": "sha1-Npvx+VktiridcS3O1cuBx8U1Jkk=", 699 | "dev": true, 700 | "requires": { 701 | "define-properties": "^1.1.3", 702 | "es-abstract": "^1.17.0-next.1" 703 | } 704 | }, 705 | "once": { 706 | "version": "1.4.0", 707 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/once/-/once-1.4.0.tgz", 708 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 709 | "dev": true, 710 | "requires": { 711 | "wrappy": "1" 712 | } 713 | }, 714 | "p-limit": { 715 | "version": "2.2.2", 716 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-limit/-/p-limit-2.2.2.tgz", 717 | "integrity": "sha1-YSebZ3IfUoeqHBOpp/u8SMkpGx4=", 718 | "dev": true, 719 | "requires": { 720 | "p-try": "^2.0.0" 721 | } 722 | }, 723 | "p-locate": { 724 | "version": "3.0.0", 725 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-locate/-/p-locate-3.0.0.tgz", 726 | "integrity": "sha1-Mi1poFwCZLJZl9n0DNiokasAZKQ=", 727 | "dev": true, 728 | "requires": { 729 | "p-limit": "^2.0.0" 730 | } 731 | }, 732 | "p-try": { 733 | "version": "2.2.0", 734 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/p-try/-/p-try-2.2.0.tgz", 735 | "integrity": "sha1-yyhoVA4xPWHeWPr741zpAE1VQOY=", 736 | "dev": true 737 | }, 738 | "path-exists": { 739 | "version": "3.0.0", 740 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-exists/-/path-exists-3.0.0.tgz", 741 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 742 | "dev": true 743 | }, 744 | "path-is-absolute": { 745 | "version": "1.0.1", 746 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 747 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 748 | "dev": true 749 | }, 750 | "pathval": { 751 | "version": "1.1.0", 752 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/pathval/-/pathval-1.1.0.tgz", 753 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 754 | "dev": true 755 | }, 756 | "punycode": { 757 | "version": "1.3.2", 758 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 759 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", 760 | "dev": true 761 | }, 762 | "querystring": { 763 | "version": "0.2.0", 764 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 765 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", 766 | "dev": true 767 | }, 768 | "require-directory": { 769 | "version": "2.1.1", 770 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-directory/-/require-directory-2.1.1.tgz", 771 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 772 | "dev": true 773 | }, 774 | "require-main-filename": { 775 | "version": "2.0.0", 776 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/require-main-filename/-/require-main-filename-2.0.0.tgz", 777 | "integrity": "sha1-0LMp7MfMD2Fkn2IhW+aa9UqomJs=", 778 | "dev": true 779 | }, 780 | "sax": { 781 | "version": "1.2.1", 782 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 783 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=", 784 | "dev": true 785 | }, 786 | "semver": { 787 | "version": "5.7.1", 788 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/semver/-/semver-5.7.1.tgz", 789 | "integrity": "sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=", 790 | "dev": true 791 | }, 792 | "set-blocking": { 793 | "version": "2.0.0", 794 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/set-blocking/-/set-blocking-2.0.0.tgz", 795 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 796 | "dev": true 797 | }, 798 | "sprintf-js": { 799 | "version": "1.0.3", 800 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/sprintf-js/-/sprintf-js-1.0.3.tgz", 801 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 802 | "dev": true 803 | }, 804 | "string-width": { 805 | "version": "2.1.1", 806 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-2.1.1.tgz", 807 | "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", 808 | "dev": true, 809 | "requires": { 810 | "is-fullwidth-code-point": "^2.0.0", 811 | "strip-ansi": "^4.0.0" 812 | } 813 | }, 814 | "string.prototype.trimleft": { 815 | "version": "2.1.1", 816 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", 817 | "integrity": "sha1-m9uKxqvW1gKxek7TIYcNL43O/HQ=", 818 | "dev": true, 819 | "requires": { 820 | "define-properties": "^1.1.3", 821 | "function-bind": "^1.1.1" 822 | } 823 | }, 824 | "string.prototype.trimright": { 825 | "version": "2.1.1", 826 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", 827 | "integrity": "sha1-RAMUsVmWyGbOigNBiU1FGGIAxdk=", 828 | "dev": true, 829 | "requires": { 830 | "define-properties": "^1.1.3", 831 | "function-bind": "^1.1.1" 832 | } 833 | }, 834 | "strip-ansi": { 835 | "version": "4.0.0", 836 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-4.0.0.tgz", 837 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 838 | "dev": true, 839 | "requires": { 840 | "ansi-regex": "^3.0.0" 841 | } 842 | }, 843 | "strip-json-comments": { 844 | "version": "2.0.1", 845 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 846 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 847 | "dev": true 848 | }, 849 | "supports-color": { 850 | "version": "6.0.0", 851 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/supports-color/-/supports-color-6.0.0.tgz", 852 | "integrity": "sha1-ds/nQs8fQbubHCmtAwaMBbTA5Ao=", 853 | "dev": true, 854 | "requires": { 855 | "has-flag": "^3.0.0" 856 | } 857 | }, 858 | "type-detect": { 859 | "version": "4.0.8", 860 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/type-detect/-/type-detect-4.0.8.tgz", 861 | "integrity": "sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw=", 862 | "dev": true 863 | }, 864 | "url": { 865 | "version": "0.10.3", 866 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 867 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 868 | "dev": true, 869 | "requires": { 870 | "punycode": "1.3.2", 871 | "querystring": "0.2.0" 872 | } 873 | }, 874 | "uuid": { 875 | "version": "3.3.2", 876 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 877 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 878 | "dev": true 879 | }, 880 | "which": { 881 | "version": "1.3.1", 882 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which/-/which-1.3.1.tgz", 883 | "integrity": "sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo=", 884 | "dev": true, 885 | "requires": { 886 | "isexe": "^2.0.0" 887 | } 888 | }, 889 | "which-module": { 890 | "version": "2.0.0", 891 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/which-module/-/which-module-2.0.0.tgz", 892 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 893 | "dev": true 894 | }, 895 | "wide-align": { 896 | "version": "1.1.3", 897 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wide-align/-/wide-align-1.1.3.tgz", 898 | "integrity": "sha1-rgdOa9wMFKQx6ATmJFScYzsABFc=", 899 | "dev": true, 900 | "requires": { 901 | "string-width": "^1.0.2 || 2" 902 | } 903 | }, 904 | "wrap-ansi": { 905 | "version": "5.1.0", 906 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 907 | "integrity": "sha1-H9H2cjXVttD+54EFYAG/tpTAOwk=", 908 | "dev": true, 909 | "requires": { 910 | "ansi-styles": "^3.2.0", 911 | "string-width": "^3.0.0", 912 | "strip-ansi": "^5.0.0" 913 | }, 914 | "dependencies": { 915 | "ansi-regex": { 916 | "version": "4.1.0", 917 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 918 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 919 | "dev": true 920 | }, 921 | "string-width": { 922 | "version": "3.1.0", 923 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 924 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 925 | "dev": true, 926 | "requires": { 927 | "emoji-regex": "^7.0.1", 928 | "is-fullwidth-code-point": "^2.0.0", 929 | "strip-ansi": "^5.1.0" 930 | } 931 | }, 932 | "strip-ansi": { 933 | "version": "5.2.0", 934 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 935 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 936 | "dev": true, 937 | "requires": { 938 | "ansi-regex": "^4.1.0" 939 | } 940 | } 941 | } 942 | }, 943 | "wrappy": { 944 | "version": "1.0.2", 945 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/wrappy/-/wrappy-1.0.2.tgz", 946 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 947 | "dev": true 948 | }, 949 | "xml2js": { 950 | "version": "0.4.19", 951 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", 952 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", 953 | "dev": true, 954 | "requires": { 955 | "sax": ">=0.6.0", 956 | "xmlbuilder": "~9.0.1" 957 | } 958 | }, 959 | "xmlbuilder": { 960 | "version": "9.0.7", 961 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", 962 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=", 963 | "dev": true 964 | }, 965 | "y18n": { 966 | "version": "4.0.0", 967 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/y18n/-/y18n-4.0.0.tgz", 968 | "integrity": "sha1-le+U+F7MgdAHwmThkKEg8KPIVms=", 969 | "dev": true 970 | }, 971 | "yargs": { 972 | "version": "13.3.0", 973 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs/-/yargs-13.3.0.tgz", 974 | "integrity": "sha1-TGV6VeB+Xyz5R/ijZlZ8BKDe3IM=", 975 | "dev": true, 976 | "requires": { 977 | "cliui": "^5.0.0", 978 | "find-up": "^3.0.0", 979 | "get-caller-file": "^2.0.1", 980 | "require-directory": "^2.1.1", 981 | "require-main-filename": "^2.0.0", 982 | "set-blocking": "^2.0.0", 983 | "string-width": "^3.0.0", 984 | "which-module": "^2.0.0", 985 | "y18n": "^4.0.0", 986 | "yargs-parser": "^13.1.1" 987 | }, 988 | "dependencies": { 989 | "ansi-regex": { 990 | "version": "4.1.0", 991 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/ansi-regex/-/ansi-regex-4.1.0.tgz", 992 | "integrity": "sha1-i5+PCM8ay4Q3Vqg5yox+MWjFGZc=", 993 | "dev": true 994 | }, 995 | "string-width": { 996 | "version": "3.1.0", 997 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/string-width/-/string-width-3.1.0.tgz", 998 | "integrity": "sha1-InZ74htirxCBV0MG9prFG2IgOWE=", 999 | "dev": true, 1000 | "requires": { 1001 | "emoji-regex": "^7.0.1", 1002 | "is-fullwidth-code-point": "^2.0.0", 1003 | "strip-ansi": "^5.1.0" 1004 | } 1005 | }, 1006 | "strip-ansi": { 1007 | "version": "5.2.0", 1008 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/strip-ansi/-/strip-ansi-5.2.0.tgz", 1009 | "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=", 1010 | "dev": true, 1011 | "requires": { 1012 | "ansi-regex": "^4.1.0" 1013 | } 1014 | } 1015 | } 1016 | }, 1017 | "yargs-parser": { 1018 | "version": "13.1.1", 1019 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-parser/-/yargs-parser-13.1.1.tgz", 1020 | "integrity": "sha1-0mBYUyqgbTZf4JH2ofwGsvfl7KA=", 1021 | "dev": true, 1022 | "requires": { 1023 | "camelcase": "^5.0.0", 1024 | "decamelize": "^1.2.0" 1025 | } 1026 | }, 1027 | "yargs-unparser": { 1028 | "version": "1.6.0", 1029 | "resolved": "https://tylertech.jfrog.io/tylertech/api/npm/npm/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1030 | "integrity": "sha1-7yXCx2n/a9CeSw+dfGBfsnhG6p8=", 1031 | "dev": true, 1032 | "requires": { 1033 | "flat": "^4.1.0", 1034 | "lodash": "^4.17.15", 1035 | "yargs": "^13.3.0" 1036 | } 1037 | } 1038 | } 1039 | } 1040 | -------------------------------------------------------------------------------- /lambdas/update-item-geolocation/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "update-item-geolocation", 3 | "version": "1.0.0", 4 | "description": "Update details about an item and regeocode the address", 5 | "main": "app.js", 6 | "license": "MIT", 7 | "dependencies": { 8 | "dynamodb-geo": "^0.4.0", 9 | "geocodio-library-node": "^1.0.0", 10 | "http-status-codes": "^1.4.0" 11 | }, 12 | "scripts": { 13 | "test": "mocha **/tests/unit/*.js" 14 | }, 15 | "devDependencies": { 16 | "aws-sdk": "^2.543.0", 17 | "chai": "^4.2.0", 18 | "mocha": "^6.1.4" 19 | }, 20 | "jshintConfig": { 21 | "esversion": 8 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dynamodb-geosearch", 3 | "version": "1.0.0", 4 | "description": "This is a proof of concept to build a serverless geosearching app using dynamodb", 5 | "devDependencies": { 6 | "aws-sdk": "^2.543.0", 7 | "chai": "^4.2.0", 8 | "eslint": "^6.6.0", 9 | "eslint-config-google": "^0.14.0", 10 | "mocha": "^6.2.1" 11 | }, 12 | "scripts": { 13 | "test": "mocha **/tests/unit/*.js", 14 | "deploy": "sam build && sam package --output-template-file packaged.yaml --s3-bucket REPLACE_ME && sam deploy --template-file packaged.yaml --stack-name dynamodb-geosearch --capabilities CAPABILITY_IAM" 15 | }, 16 | "license": "MIT" 17 | } 18 | -------------------------------------------------------------------------------- /template.yaml: -------------------------------------------------------------------------------- 1 | AWSTemplateFormatVersion: '2010-09-09' 2 | Transform: AWS::Serverless-2016-10-31 3 | Description: > 4 | dynamodb-geosearch 5 | 6 | SAM Template for proof of concept using DynamoDB and geosearching utilities 7 | 8 | Parameters: 9 | GeocodioApiKey: 10 | Type: String 11 | Default: REPLACE_ME 12 | 13 | DynamoDBTableName: 14 | Type: String 15 | Default: geolocation 16 | 17 | Globals: 18 | Function: 19 | Runtime: nodejs12.x 20 | Tracing: Active 21 | Timeout: 8 22 | 23 | Resources: 24 | AddItemGeolocation: 25 | Type: AWS::Serverless::Function 26 | Properties: 27 | CodeUri: lambdas/add-item-geolocation/ 28 | Handler: app.lambdaHandler 29 | Role: !GetAtt AddItemGeolocationRole.Arn 30 | Events: 31 | AddItem: 32 | Type: Api 33 | Properties: 34 | Path: /items 35 | Method: POST 36 | Environment: 37 | Variables: 38 | GeocodioApiKey: !Ref GeocodioApiKey 39 | DynamoDBTableName: !Ref DynamoDBTableName 40 | 41 | AddItemGeolocationRole: 42 | Type: AWS::IAM::Role 43 | Properties: 44 | AssumeRolePolicyDocument: 45 | Version: 2012-10-17 46 | Statement: 47 | - Effect: Allow 48 | Principal: 49 | Service: 50 | - lambda.amazonaws.com 51 | Action: 52 | - sts:AssumeRole 53 | Policies: 54 | - PolicyName: AddItemGeolocationPolicy 55 | PolicyDocument: 56 | Version: '2012-10-17' 57 | Statement: 58 | - Effect: 'Allow' 59 | Action: 60 | - 'dynamodb:PutItem' 61 | Resource: !GetAtt GeoLocationTable.Arn 62 | - Effect: 'Allow' 63 | Action: 64 | - 'xray:PutTelemetryRecords' 65 | - 'xray:PutTraceSegments' 66 | Resource: '*' 67 | ManagedPolicyArns: 68 | - arn:aws:iam::aws:policy/AWSLambdaExecute 69 | 70 | GetItemsByLocation: 71 | Type: AWS::Serverless::Function 72 | Properties: 73 | CodeUri: lambdas/get-items-by-location/ 74 | Handler: app.lambdaHandler 75 | Role: !GetAtt GetItemsByLocationRole.Arn 76 | MemorySize: 320 77 | Events: 78 | AddItem: 79 | Type: Api 80 | Properties: 81 | Path: /items 82 | Method: GET 83 | Environment: 84 | Variables: 85 | GeocodioApiKey: !Ref GeocodioApiKey 86 | DynamoDBTableName: !Ref DynamoDBTableName 87 | 88 | GetItemsByLocationRole: 89 | Type: AWS::IAM::Role 90 | Properties: 91 | AssumeRolePolicyDocument: 92 | Version: 2012-10-17 93 | Statement: 94 | - Effect: Allow 95 | Principal: 96 | Service: 97 | - lambda.amazonaws.com 98 | Action: 99 | - sts:AssumeRole 100 | Policies: 101 | - PolicyName: GetItemsByLocationPolicy 102 | PolicyDocument: 103 | Version: '2012-10-17' 104 | Statement: 105 | - Effect: 'Allow' 106 | Action: 107 | - 'dynamodb:GetItem' 108 | - 'dynamodb:Query' 109 | Resource: !GetAtt GeoLocationTable.Arn 110 | - Effect: 'Allow' 111 | Action: 112 | - 'dynamodb:GetItem' 113 | - 'dynamodb:Query' 114 | Resource: 115 | !Join [ 116 | '/', 117 | [!GetAtt GeoLocationTable.Arn, 'index', 'geohash-index'], 118 | ] 119 | - Effect: 'Allow' 120 | Action: 121 | - 'xray:PutTelemetryRecords' 122 | - 'xray:PutTraceSegments' 123 | Resource: '*' 124 | ManagedPolicyArns: 125 | - arn:aws:iam::aws:policy/AWSLambdaExecute 126 | 127 | UpdateItemGeolocation: 128 | Type: AWS::Serverless::Function 129 | Properties: 130 | CodeUri: lambdas/update-item-geolocation/ 131 | Handler: app.lambdaHandler 132 | Role: !GetAtt UpdateItemGeolocationRole.Arn 133 | Events: 134 | AddItem: 135 | Type: Api 136 | Properties: 137 | Path: /items/{itemId} 138 | Method: PUT 139 | Environment: 140 | Variables: 141 | GeocodioApiKey: !Ref GeocodioApiKey 142 | DynamoDBTableName: !Ref DynamoDBTableName 143 | 144 | UpdateItemGeolocationRole: 145 | Type: AWS::IAM::Role 146 | Properties: 147 | AssumeRolePolicyDocument: 148 | Version: 2012-10-17 149 | Statement: 150 | - Effect: Allow 151 | Principal: 152 | Service: 153 | - lambda.amazonaws.com 154 | Action: 155 | - sts:AssumeRole 156 | Policies: 157 | - PolicyName: UpdateItemGeolocationPolicy 158 | PolicyDocument: 159 | Version: '2012-10-17' 160 | Statement: 161 | - Effect: 'Allow' 162 | Action: 163 | - 'dynamodb:GetItem' 164 | - 'dynamodb:PutItem' 165 | - 'dynamodb:DeleteItem' 166 | Resource: !GetAtt GeoLocationTable.Arn 167 | - Effect: 'Allow' 168 | Action: 169 | - 'xray:PutTelemetryRecords' 170 | - 'xray:PutTraceSegments' 171 | Resource: '*' 172 | ManagedPolicyArns: 173 | - arn:aws:iam::aws:policy/AWSLambdaExecute 174 | 175 | DeleteItem: 176 | Type: AWS::Serverless::Function 177 | Properties: 178 | CodeUri: lambdas/delete-item/ 179 | Handler: app.lambdaHandler 180 | Role: !GetAtt DeleteItemRole.Arn 181 | Events: 182 | AddItem: 183 | Type: Api 184 | Properties: 185 | Path: /items/{itemId} 186 | Method: DELETE 187 | Environment: 188 | Variables: 189 | DynamoDBTableName: !Ref DynamoDBTableName 190 | 191 | DeleteItemRole: 192 | Type: AWS::IAM::Role 193 | Properties: 194 | AssumeRolePolicyDocument: 195 | Version: 2012-10-17 196 | Statement: 197 | - Effect: Allow 198 | Principal: 199 | Service: 200 | - lambda.amazonaws.com 201 | Action: 202 | - sts:AssumeRole 203 | Policies: 204 | - PolicyName: DeleteItemPolicy 205 | PolicyDocument: 206 | Version: '2012-10-17' 207 | Statement: 208 | - Effect: 'Allow' 209 | Action: 210 | - 'dynamodb:GetItem' 211 | - 'dynamodb:DeleteItem' 212 | Resource: !GetAtt GeoLocationTable.Arn 213 | - Effect: 'Allow' 214 | Action: 215 | - 'xray:PutTelemetryRecords' 216 | - 'xray:PutTraceSegments' 217 | Resource: '*' 218 | ManagedPolicyArns: 219 | - arn:aws:iam::aws:policy/AWSLambdaExecute 220 | 221 | GeoLocationTable: 222 | Type: AWS::DynamoDB::Table 223 | Properties: 224 | TableName: !Ref DynamoDBTableName 225 | AttributeDefinitions: 226 | - AttributeName: hashKey 227 | AttributeType: N 228 | - AttributeName: rangeKey 229 | AttributeType: S 230 | - AttributeName: geohash 231 | AttributeType: N 232 | KeySchema: 233 | - AttributeName: hashKey 234 | KeyType: HASH 235 | - AttributeName: rangeKey 236 | KeyType: RANGE 237 | BillingMode: PROVISIONED 238 | ProvisionedThroughput: 239 | ReadCapacityUnits: 5 240 | WriteCapacityUnits: 5 241 | LocalSecondaryIndexes: 242 | - IndexName: geohash-index 243 | KeySchema: 244 | - AttributeName: hashKey 245 | KeyType: HASH 246 | - AttributeName: geohash 247 | KeyType: RANGE 248 | Projection: 249 | ProjectionType: ALL 250 | --------------------------------------------------------------------------------