├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── ServerlessPluginDemo.gif ├── package-lock.json ├── package.json ├── src ├── ServerlessPluginBespoken.ts ├── index.js └── injected_node_modules │ └── bespoken-lambda-passthru │ └── index.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore generated javascript 2 | lib/ 3 | 4 | # ignore vscode settings 5 | .vscode 6 | 7 | # Logs 8 | logs 9 | *.log 10 | npm-debug.log* 11 | yarn-debug.log* 12 | yarn-error.log* 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 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (http://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Typescript v1 declaration files 46 | typings/ 47 | 48 | # Optional npm cache directory 49 | .npm 50 | 51 | # Optional eslint cache 52 | .eslintcache 53 | 54 | # Optional REPL history 55 | .node_repl_history 56 | 57 | # Output of 'npm pack' 58 | *.tgz 59 | 60 | # Yarn Integrity file 61 | .yarn-integrity 62 | 63 | # dotenv environment variables file 64 | .env 65 | 66 | # webstorm 67 | .idea -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | # ignore vscode settings 2 | .vscode 3 | 4 | # Logs 5 | logs 6 | *.log 7 | npm-debug.log* 8 | yarn-debug.log* 9 | yarn-error.log* 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | *.pid.lock 16 | 17 | # Directory for instrumented libs generated by jscoverage/JSCover 18 | lib-cov 19 | 20 | # Coverage directory used by tools like istanbul 21 | coverage 22 | 23 | # nyc test coverage 24 | .nyc_output 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | # Bower dependency directory (https://bower.io/) 30 | bower_components 31 | 32 | # node-waf configuration 33 | .lock-wscript 34 | 35 | # Compiled binary addons (http://nodejs.org/api/addons.html) 36 | build/Release 37 | 38 | # Dependency directories 39 | node_modules/ 40 | jspm_packages/ 41 | 42 | # Typescript v1 declaration files 43 | typings/ 44 | 45 | # Optional npm cache directory 46 | .npm 47 | 48 | # Optional eslint cache 49 | .eslintcache 50 | 51 | # Optional REPL history 52 | .node_repl_history 53 | 54 | # Output of 'npm pack' 55 | *.tgz 56 | 57 | # Yarn Integrity file 58 | .yarn-integrity 59 | 60 | # dotenv environment variables file 61 | .env 62 | 63 | # webstorm 64 | .idea -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | https://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | Copyright 2017 Bespoken, Inc. 179 | 180 | Licensed under the Apache License, Version 2.0 (the "License"); 181 | you may not use this file except in compliance with the License. 182 | You may obtain a copy of the License at 183 | 184 | https://www.apache.org/licenses/LICENSE-2.0 185 | 186 | Unless required by applicable law or agreed to in writing, software 187 | distributed under the License is distributed on an "AS IS" BASIS, 188 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 189 | See the License for the specific language governing permissions and 190 | limitations under the License. 191 | 192 | Contact GitHub API Training Shop Blog About 193 | 194 | © 2017 GitHub, Inc. Terms Privacy Security Status Help 195 | 196 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bespoken Serverless Framework Plugin 2 | 3 | [![serverless](http://public.serverless.com/badges/v3.svg)](http://www.serverless.com) 4 | 5 | A [serverless](http://www.serverless.com) plugin using [bespoken](https://bespoken.io) proxy to test your work without deploying. 6 | 7 | If you have to deploy your work everytime you are making changes, this tool will help you reduce that time. We generate a local server 8 | that is a attached to a proxy online so that you can use that url to access the functionality that you have in your code in your laptop. 9 | # What Does This Do? 10 | The `bst proxy` service makes your local AWS Lambda available to debug and test via public URL. And though the URL is public, it is unique to you, and known only to you. 11 | 12 | It is great for developing and testing: 13 | * Webhooks 14 | * Callbacks 15 | * Anything where you want to try out your Lambda locally before deploying it 16 | 17 | It creates a unique public URL through which you can access it. Once installed, all you need to access it is: 18 | ```bash 19 | sls proxy 20 | ``` 21 | 22 | You can now send and receive data to your locally running Lambda! Here is a demo of in action using Postman: 23 | 24 | [![serverless Plugin](/ServerlessPluginDemo.gif)](/ServerlessPluginDemo.gif) 25 | 26 | More detailed info on how the proxy works can be [found here](http://docs.bespoken.io/en/latest/tutorials/tutorial_lambda_local/). 27 | # Install 28 | 29 | ``` 30 | npm install serverless-plugin-bespoken --save-dev 31 | ``` 32 | 33 | Add the plugin to your `serverless.yml` file: 34 | ```yaml 35 | plugins: 36 | - serverless-plugin-bespoken 37 | ``` 38 | 39 | You're set! The plugin will run by using `sls proxy`. 40 | 41 | Now you can use the generated url and access directly to your local server. 42 | -------------------------------------------------------------------------------- /ServerlessPluginDemo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bespoken-cookbook/serverless-plugin-bespoken/a64747a248419e2f241b312df2045d5b9eb933ad/ServerlessPluginDemo.gif -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "serverless-plugin-bespoken", 3 | "version": "0.1.3", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/chokidar": { 8 | "version": "1.7.5", 9 | "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-1.7.5.tgz", 10 | "integrity": "sha512-PDkSRY7KltW3M60hSBlerxI8SFPXsO3AL/aRVsO4Kh9IHRW74Ih75gUuTd/aE4LSSFqypb10UIX3QzOJwBQMGQ==", 11 | "dev": true, 12 | "requires": { 13 | "@types/events": "1.2.0", 14 | "@types/node": "8.10.18" 15 | } 16 | }, 17 | "@types/events": { 18 | "version": "1.2.0", 19 | "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", 20 | "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", 21 | "dev": true 22 | }, 23 | "@types/fs-extra": { 24 | "version": "5.0.2", 25 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.2.tgz", 26 | "integrity": "sha512-Q3FWsbdmkQd1ib11A4XNWQvRD//5KpPoGawA8aB2DR7pWKoW9XQv3+dGxD/Z1eVFze23Okdo27ZQytVFlweKvQ==", 27 | "dev": true, 28 | "requires": { 29 | "@types/node": "8.10.18" 30 | } 31 | }, 32 | "@types/lodash": { 33 | "version": "4.14.109", 34 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.109.tgz", 35 | "integrity": "sha512-hop8SdPUEzbcJm6aTsmuwjIYQo1tqLseKCM+s2bBqTU2gErwI4fE+aqUVOlscPSQbKHKgtMMPoC+h4AIGOJYvw==", 36 | "dev": true 37 | }, 38 | "@types/node": { 39 | "version": "8.10.18", 40 | "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.18.tgz", 41 | "integrity": "sha512-WoepSz+wJlU5Bjq5oK6cO1oXe2FgPcjMtQPgKPS8fVaTAD0lxkScMCCbMimdkVCsykqaA4lvHWz3cmj28yimhA==", 42 | "dev": true 43 | }, 44 | "@types/uuid": { 45 | "version": "3.4.3", 46 | "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz", 47 | "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==", 48 | "requires": { 49 | "@types/node": "10.3.1" 50 | }, 51 | "dependencies": { 52 | "@types/node": { 53 | "version": "10.3.1", 54 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.3.1.tgz", 55 | "integrity": "sha512-IsX9aDHDzJohkm3VCDB8tkzl5RQ34E/PFA29TQk6uDGb7Oc869ZBtmdKVDBzY3+h9GnXB8ssrRXEPVZrlIOPOw==" 56 | } 57 | } 58 | }, 59 | "accepts": { 60 | "version": "1.3.5", 61 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 62 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 63 | "requires": { 64 | "mime-types": "2.1.18", 65 | "negotiator": "0.6.1" 66 | } 67 | }, 68 | "ajv": { 69 | "version": "5.5.2", 70 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 71 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 72 | "requires": { 73 | "co": "4.6.0", 74 | "fast-deep-equal": "1.1.0", 75 | "fast-json-stable-stringify": "2.0.0", 76 | "json-schema-traverse": "0.3.1" 77 | } 78 | }, 79 | "ansi-regex": { 80 | "version": "2.1.1", 81 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 82 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 83 | }, 84 | "ansi-styles": { 85 | "version": "3.2.1", 86 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 87 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 88 | "requires": { 89 | "color-convert": "1.9.1" 90 | } 91 | }, 92 | "anymatch": { 93 | "version": "2.0.0", 94 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", 95 | "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", 96 | "requires": { 97 | "micromatch": "3.1.10", 98 | "normalize-path": "2.1.1" 99 | } 100 | }, 101 | "arr-diff": { 102 | "version": "4.0.0", 103 | "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", 104 | "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" 105 | }, 106 | "arr-flatten": { 107 | "version": "1.1.0", 108 | "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", 109 | "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" 110 | }, 111 | "arr-union": { 112 | "version": "3.1.0", 113 | "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", 114 | "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" 115 | }, 116 | "array-find-index": { 117 | "version": "1.0.2", 118 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 119 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 120 | }, 121 | "array-flatten": { 122 | "version": "1.1.1", 123 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 124 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 125 | }, 126 | "array-unique": { 127 | "version": "0.3.2", 128 | "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", 129 | "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" 130 | }, 131 | "asn1": { 132 | "version": "0.2.3", 133 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 134 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 135 | }, 136 | "assert-plus": { 137 | "version": "1.0.0", 138 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 139 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 140 | }, 141 | "assign-symbols": { 142 | "version": "1.0.0", 143 | "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", 144 | "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" 145 | }, 146 | "async": { 147 | "version": "2.6.1", 148 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 149 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 150 | "requires": { 151 | "lodash": "4.17.10" 152 | } 153 | }, 154 | "async-each": { 155 | "version": "1.0.1", 156 | "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", 157 | "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" 158 | }, 159 | "async-listener": { 160 | "version": "0.6.9", 161 | "resolved": "https://registry.npmjs.org/async-listener/-/async-listener-0.6.9.tgz", 162 | "integrity": "sha512-E7Z2/QMs0EPt/o9wpYO/J3hmMCDdr1aVDS3ttlur5D5JlZtxhfuOwi4e7S8zbYIxA5qOOYdxfqGj97XAfdNvkQ==", 163 | "requires": { 164 | "semver": "5.5.0", 165 | "shimmer": "1.2.0" 166 | } 167 | }, 168 | "asynckit": { 169 | "version": "0.4.0", 170 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 171 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 172 | }, 173 | "atob": { 174 | "version": "2.1.1", 175 | "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", 176 | "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=" 177 | }, 178 | "aws-sdk": { 179 | "version": "2.252.1", 180 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.252.1.tgz", 181 | "integrity": "sha1-TORbFtxAiIPiClZL2GJwxn8lu2A=", 182 | "requires": { 183 | "buffer": "4.9.1", 184 | "events": "1.1.1", 185 | "ieee754": "1.1.8", 186 | "jmespath": "0.15.0", 187 | "querystring": "0.2.0", 188 | "sax": "1.2.1", 189 | "url": "0.10.3", 190 | "uuid": "3.1.0", 191 | "xml2js": "0.4.17" 192 | }, 193 | "dependencies": { 194 | "uuid": { 195 | "version": "3.1.0", 196 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 197 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 198 | } 199 | } 200 | }, 201 | "aws-sign2": { 202 | "version": "0.7.0", 203 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 204 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 205 | }, 206 | "aws4": { 207 | "version": "1.7.0", 208 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 209 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" 210 | }, 211 | "balanced-match": { 212 | "version": "1.0.0", 213 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 214 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 215 | }, 216 | "base": { 217 | "version": "0.11.2", 218 | "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", 219 | "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", 220 | "requires": { 221 | "cache-base": "1.0.1", 222 | "class-utils": "0.3.6", 223 | "component-emitter": "1.2.1", 224 | "define-property": "1.0.0", 225 | "isobject": "3.0.1", 226 | "mixin-deep": "1.3.1", 227 | "pascalcase": "0.1.1" 228 | }, 229 | "dependencies": { 230 | "define-property": { 231 | "version": "1.0.0", 232 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 233 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 234 | "requires": { 235 | "is-descriptor": "1.0.2" 236 | } 237 | }, 238 | "is-accessor-descriptor": { 239 | "version": "1.0.0", 240 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 241 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 242 | "requires": { 243 | "kind-of": "6.0.2" 244 | } 245 | }, 246 | "is-data-descriptor": { 247 | "version": "1.0.0", 248 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 249 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 250 | "requires": { 251 | "kind-of": "6.0.2" 252 | } 253 | }, 254 | "is-descriptor": { 255 | "version": "1.0.2", 256 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 257 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 258 | "requires": { 259 | "is-accessor-descriptor": "1.0.0", 260 | "is-data-descriptor": "1.0.0", 261 | "kind-of": "6.0.2" 262 | } 263 | } 264 | } 265 | }, 266 | "base64-js": { 267 | "version": "1.3.0", 268 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", 269 | "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==" 270 | }, 271 | "bcrypt-pbkdf": { 272 | "version": "1.0.1", 273 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 274 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 275 | "optional": true, 276 | "requires": { 277 | "tweetnacl": "0.14.5" 278 | } 279 | }, 280 | "bespoken-tools": { 281 | "version": "1.2.10", 282 | "resolved": "https://registry.npmjs.org/bespoken-tools/-/bespoken-tools-1.2.10.tgz", 283 | "integrity": "sha1-Jmx0Ro3t8hi+J/jTwsXDNeG6yyA=", 284 | "requires": { 285 | "async": "2.6.1", 286 | "aws-sdk": "2.252.1", 287 | "body-parser": "1.18.3", 288 | "chalk": "2.4.1", 289 | "commander": "2.15.1", 290 | "console-stamp": "0.2.6", 291 | "continuation-local-storage": "3.2.1", 292 | "express": "4.16.3", 293 | "node-zip": "1.1.1", 294 | "properties-reader": "0.0.15", 295 | "request": "2.87.0", 296 | "request-promise-native": "1.0.5", 297 | "uuid": "3.0.0", 298 | "virtual-alexa": "0.3.11", 299 | "virtual-device-sdk": "1.4.5", 300 | "winston": "2.4.2" 301 | } 302 | }, 303 | "binary-extensions": { 304 | "version": "1.11.0", 305 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", 306 | "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" 307 | }, 308 | "body-parser": { 309 | "version": "1.18.3", 310 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 311 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 312 | "requires": { 313 | "bytes": "3.0.0", 314 | "content-type": "1.0.4", 315 | "debug": "2.6.9", 316 | "depd": "1.1.2", 317 | "http-errors": "1.6.3", 318 | "iconv-lite": "0.4.23", 319 | "on-finished": "2.3.0", 320 | "qs": "6.5.2", 321 | "raw-body": "2.3.3", 322 | "type-is": "1.6.16" 323 | } 324 | }, 325 | "brace-expansion": { 326 | "version": "1.1.11", 327 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 328 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 329 | "requires": { 330 | "balanced-match": "1.0.0", 331 | "concat-map": "0.0.1" 332 | } 333 | }, 334 | "braces": { 335 | "version": "2.3.2", 336 | "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", 337 | "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", 338 | "requires": { 339 | "arr-flatten": "1.1.0", 340 | "array-unique": "0.3.2", 341 | "extend-shallow": "2.0.1", 342 | "fill-range": "4.0.0", 343 | "isobject": "3.0.1", 344 | "repeat-element": "1.1.2", 345 | "snapdragon": "0.8.2", 346 | "snapdragon-node": "2.1.1", 347 | "split-string": "3.1.0", 348 | "to-regex": "3.0.2" 349 | }, 350 | "dependencies": { 351 | "extend-shallow": { 352 | "version": "2.0.1", 353 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 354 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 355 | "requires": { 356 | "is-extendable": "0.1.1" 357 | } 358 | } 359 | } 360 | }, 361 | "browser-stdout": { 362 | "version": "1.3.1", 363 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 364 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 365 | "dev": true 366 | }, 367 | "buffer": { 368 | "version": "4.9.1", 369 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", 370 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", 371 | "requires": { 372 | "base64-js": "1.3.0", 373 | "ieee754": "1.1.8", 374 | "isarray": "1.0.0" 375 | } 376 | }, 377 | "buffer-from": { 378 | "version": "1.1.0", 379 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", 380 | "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" 381 | }, 382 | "builtin-modules": { 383 | "version": "1.1.1", 384 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 385 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 386 | }, 387 | "bytes": { 388 | "version": "3.0.0", 389 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 390 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 391 | }, 392 | "cache-base": { 393 | "version": "1.0.1", 394 | "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", 395 | "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", 396 | "requires": { 397 | "collection-visit": "1.0.0", 398 | "component-emitter": "1.2.1", 399 | "get-value": "2.0.6", 400 | "has-value": "1.0.0", 401 | "isobject": "3.0.1", 402 | "set-value": "2.0.0", 403 | "to-object-path": "0.3.0", 404 | "union-value": "1.0.0", 405 | "unset-value": "1.0.0" 406 | } 407 | }, 408 | "camelcase": { 409 | "version": "2.1.1", 410 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", 411 | "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" 412 | }, 413 | "camelcase-keys": { 414 | "version": "2.1.0", 415 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", 416 | "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", 417 | "requires": { 418 | "camelcase": "2.1.1", 419 | "map-obj": "1.0.1" 420 | } 421 | }, 422 | "caseless": { 423 | "version": "0.12.0", 424 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 425 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 426 | }, 427 | "chalk": { 428 | "version": "2.4.1", 429 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 430 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 431 | "requires": { 432 | "ansi-styles": "3.2.1", 433 | "escape-string-regexp": "1.0.5", 434 | "supports-color": "5.4.0" 435 | } 436 | }, 437 | "chokidar": { 438 | "version": "2.0.3", 439 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.3.tgz", 440 | "integrity": "sha512-zW8iXYZtXMx4kux/nuZVXjkLP+CyIK5Al5FHnj1OgTKGZfp4Oy6/ymtMSKFv3GD8DviEmUPmJg9eFdJ/JzudMg==", 441 | "requires": { 442 | "anymatch": "2.0.0", 443 | "async-each": "1.0.1", 444 | "braces": "2.3.2", 445 | "fsevents": "1.2.4", 446 | "glob-parent": "3.1.0", 447 | "inherits": "2.0.3", 448 | "is-binary-path": "1.0.1", 449 | "is-glob": "4.0.0", 450 | "normalize-path": "2.1.1", 451 | "path-is-absolute": "1.0.1", 452 | "readdirp": "2.1.0", 453 | "upath": "1.1.0" 454 | } 455 | }, 456 | "class-utils": { 457 | "version": "0.3.6", 458 | "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", 459 | "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", 460 | "requires": { 461 | "arr-union": "3.1.0", 462 | "define-property": "0.2.5", 463 | "isobject": "3.0.1", 464 | "static-extend": "0.1.2" 465 | }, 466 | "dependencies": { 467 | "define-property": { 468 | "version": "0.2.5", 469 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 470 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 471 | "requires": { 472 | "is-descriptor": "0.1.6" 473 | } 474 | } 475 | } 476 | }, 477 | "co": { 478 | "version": "4.6.0", 479 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 480 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 481 | }, 482 | "collection-visit": { 483 | "version": "1.0.0", 484 | "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", 485 | "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", 486 | "requires": { 487 | "map-visit": "1.0.0", 488 | "object-visit": "1.0.1" 489 | } 490 | }, 491 | "color-convert": { 492 | "version": "1.9.1", 493 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 494 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 495 | "requires": { 496 | "color-name": "1.1.3" 497 | } 498 | }, 499 | "color-name": { 500 | "version": "1.1.3", 501 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 502 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 503 | }, 504 | "colors": { 505 | "version": "1.0.3", 506 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 507 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 508 | }, 509 | "combined-stream": { 510 | "version": "1.0.6", 511 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 512 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 513 | "requires": { 514 | "delayed-stream": "1.0.0" 515 | } 516 | }, 517 | "commander": { 518 | "version": "2.15.1", 519 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 520 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==" 521 | }, 522 | "component-emitter": { 523 | "version": "1.2.1", 524 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", 525 | "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" 526 | }, 527 | "concat-map": { 528 | "version": "0.0.1", 529 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 530 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 531 | }, 532 | "console-stamp": { 533 | "version": "0.2.6", 534 | "resolved": "https://registry.npmjs.org/console-stamp/-/console-stamp-0.2.6.tgz", 535 | "integrity": "sha512-7l2MJ93tXpCWh9n5rRJHu7tNMxa9SPx8pba8kBJDROOfMFVBHPpqv141lkhcnLEYMC5npvrywH7gZ5DzYE+cSg==", 536 | "requires": { 537 | "chalk": "1.1.3", 538 | "dateformat": "1.0.12", 539 | "merge": "1.2.0" 540 | }, 541 | "dependencies": { 542 | "ansi-styles": { 543 | "version": "2.2.1", 544 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 545 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 546 | }, 547 | "chalk": { 548 | "version": "1.1.3", 549 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 550 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 551 | "requires": { 552 | "ansi-styles": "2.2.1", 553 | "escape-string-regexp": "1.0.5", 554 | "has-ansi": "2.0.0", 555 | "strip-ansi": "3.0.1", 556 | "supports-color": "2.0.0" 557 | } 558 | }, 559 | "supports-color": { 560 | "version": "2.0.0", 561 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 562 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 563 | } 564 | } 565 | }, 566 | "content-disposition": { 567 | "version": "0.5.2", 568 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 569 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 570 | }, 571 | "content-type": { 572 | "version": "1.0.4", 573 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 574 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 575 | }, 576 | "continuation-local-storage": { 577 | "version": "3.2.1", 578 | "resolved": "https://registry.npmjs.org/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz", 579 | "integrity": "sha512-jx44cconVqkCEEyLSKWwkvUXwO561jXMa3LPjTPsm5QR22PA0/mhe33FT4Xb5y74JDvt/Cq+5lm8S8rskLv9ZA==", 580 | "requires": { 581 | "async-listener": "0.6.9", 582 | "emitter-listener": "1.1.1" 583 | } 584 | }, 585 | "cookie": { 586 | "version": "0.3.1", 587 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 588 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 589 | }, 590 | "cookie-signature": { 591 | "version": "1.0.6", 592 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 593 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 594 | }, 595 | "copy-descriptor": { 596 | "version": "0.1.1", 597 | "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", 598 | "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" 599 | }, 600 | "core-util-is": { 601 | "version": "1.0.2", 602 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 603 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 604 | }, 605 | "currently-unhandled": { 606 | "version": "0.4.1", 607 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 608 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 609 | "requires": { 610 | "array-find-index": "1.0.2" 611 | } 612 | }, 613 | "cycle": { 614 | "version": "1.0.3", 615 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 616 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 617 | }, 618 | "dashdash": { 619 | "version": "1.14.1", 620 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 621 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 622 | "requires": { 623 | "assert-plus": "1.0.0" 624 | } 625 | }, 626 | "dateformat": { 627 | "version": "1.0.12", 628 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", 629 | "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", 630 | "requires": { 631 | "get-stdin": "4.0.1", 632 | "meow": "3.7.0" 633 | } 634 | }, 635 | "debug": { 636 | "version": "2.6.9", 637 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 638 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 639 | "requires": { 640 | "ms": "2.0.0" 641 | } 642 | }, 643 | "decamelize": { 644 | "version": "1.2.0", 645 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 646 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 647 | }, 648 | "decode-uri-component": { 649 | "version": "0.2.0", 650 | "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", 651 | "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" 652 | }, 653 | "define-property": { 654 | "version": "2.0.2", 655 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", 656 | "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", 657 | "requires": { 658 | "is-descriptor": "1.0.2", 659 | "isobject": "3.0.1" 660 | }, 661 | "dependencies": { 662 | "is-accessor-descriptor": { 663 | "version": "1.0.0", 664 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 665 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 666 | "requires": { 667 | "kind-of": "6.0.2" 668 | } 669 | }, 670 | "is-data-descriptor": { 671 | "version": "1.0.0", 672 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 673 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 674 | "requires": { 675 | "kind-of": "6.0.2" 676 | } 677 | }, 678 | "is-descriptor": { 679 | "version": "1.0.2", 680 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 681 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 682 | "requires": { 683 | "is-accessor-descriptor": "1.0.0", 684 | "is-data-descriptor": "1.0.0", 685 | "kind-of": "6.0.2" 686 | } 687 | } 688 | } 689 | }, 690 | "delayed-stream": { 691 | "version": "1.0.0", 692 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 693 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 694 | }, 695 | "depd": { 696 | "version": "1.1.2", 697 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 698 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 699 | }, 700 | "destroy": { 701 | "version": "1.0.4", 702 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 703 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 704 | }, 705 | "diff": { 706 | "version": "3.5.0", 707 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 708 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 709 | "dev": true 710 | }, 711 | "dotenv": { 712 | "version": "4.0.0", 713 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", 714 | "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" 715 | }, 716 | "ecc-jsbn": { 717 | "version": "0.1.1", 718 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 719 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 720 | "optional": true, 721 | "requires": { 722 | "jsbn": "0.1.1" 723 | } 724 | }, 725 | "ee-first": { 726 | "version": "1.1.1", 727 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 728 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 729 | }, 730 | "emitter-listener": { 731 | "version": "1.1.1", 732 | "resolved": "https://registry.npmjs.org/emitter-listener/-/emitter-listener-1.1.1.tgz", 733 | "integrity": "sha1-6Lu+gkS8jg0LTvcc0UKUx/JBx+w=", 734 | "requires": { 735 | "shimmer": "1.2.0" 736 | } 737 | }, 738 | "encodeurl": { 739 | "version": "1.0.2", 740 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 741 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 742 | }, 743 | "error-ex": { 744 | "version": "1.3.1", 745 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 746 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 747 | "requires": { 748 | "is-arrayish": "0.2.1" 749 | } 750 | }, 751 | "escape-html": { 752 | "version": "1.0.3", 753 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 754 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 755 | }, 756 | "escape-string-regexp": { 757 | "version": "1.0.5", 758 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 759 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 760 | }, 761 | "etag": { 762 | "version": "1.8.1", 763 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 764 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 765 | }, 766 | "events": { 767 | "version": "1.1.1", 768 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", 769 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" 770 | }, 771 | "expand-brackets": { 772 | "version": "2.1.4", 773 | "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", 774 | "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", 775 | "requires": { 776 | "debug": "2.6.9", 777 | "define-property": "0.2.5", 778 | "extend-shallow": "2.0.1", 779 | "posix-character-classes": "0.1.1", 780 | "regex-not": "1.0.2", 781 | "snapdragon": "0.8.2", 782 | "to-regex": "3.0.2" 783 | }, 784 | "dependencies": { 785 | "define-property": { 786 | "version": "0.2.5", 787 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 788 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 789 | "requires": { 790 | "is-descriptor": "0.1.6" 791 | } 792 | }, 793 | "extend-shallow": { 794 | "version": "2.0.1", 795 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 796 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 797 | "requires": { 798 | "is-extendable": "0.1.1" 799 | } 800 | } 801 | } 802 | }, 803 | "express": { 804 | "version": "4.16.3", 805 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 806 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 807 | "requires": { 808 | "accepts": "1.3.5", 809 | "array-flatten": "1.1.1", 810 | "body-parser": "1.18.2", 811 | "content-disposition": "0.5.2", 812 | "content-type": "1.0.4", 813 | "cookie": "0.3.1", 814 | "cookie-signature": "1.0.6", 815 | "debug": "2.6.9", 816 | "depd": "1.1.2", 817 | "encodeurl": "1.0.2", 818 | "escape-html": "1.0.3", 819 | "etag": "1.8.1", 820 | "finalhandler": "1.1.1", 821 | "fresh": "0.5.2", 822 | "merge-descriptors": "1.0.1", 823 | "methods": "1.1.2", 824 | "on-finished": "2.3.0", 825 | "parseurl": "1.3.2", 826 | "path-to-regexp": "0.1.7", 827 | "proxy-addr": "2.0.3", 828 | "qs": "6.5.1", 829 | "range-parser": "1.2.0", 830 | "safe-buffer": "5.1.1", 831 | "send": "0.16.2", 832 | "serve-static": "1.13.2", 833 | "setprototypeof": "1.1.0", 834 | "statuses": "1.4.0", 835 | "type-is": "1.6.16", 836 | "utils-merge": "1.0.1", 837 | "vary": "1.1.2" 838 | }, 839 | "dependencies": { 840 | "body-parser": { 841 | "version": "1.18.2", 842 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 843 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 844 | "requires": { 845 | "bytes": "3.0.0", 846 | "content-type": "1.0.4", 847 | "debug": "2.6.9", 848 | "depd": "1.1.2", 849 | "http-errors": "1.6.3", 850 | "iconv-lite": "0.4.19", 851 | "on-finished": "2.3.0", 852 | "qs": "6.5.1", 853 | "raw-body": "2.3.2", 854 | "type-is": "1.6.16" 855 | } 856 | }, 857 | "iconv-lite": { 858 | "version": "0.4.19", 859 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 860 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 861 | }, 862 | "qs": { 863 | "version": "6.5.1", 864 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 865 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 866 | }, 867 | "raw-body": { 868 | "version": "2.3.2", 869 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 870 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 871 | "requires": { 872 | "bytes": "3.0.0", 873 | "http-errors": "1.6.2", 874 | "iconv-lite": "0.4.19", 875 | "unpipe": "1.0.0" 876 | }, 877 | "dependencies": { 878 | "depd": { 879 | "version": "1.1.1", 880 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 881 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 882 | }, 883 | "http-errors": { 884 | "version": "1.6.2", 885 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 886 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 887 | "requires": { 888 | "depd": "1.1.1", 889 | "inherits": "2.0.3", 890 | "setprototypeof": "1.0.3", 891 | "statuses": "1.4.0" 892 | } 893 | }, 894 | "setprototypeof": { 895 | "version": "1.0.3", 896 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 897 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 898 | } 899 | } 900 | }, 901 | "statuses": { 902 | "version": "1.4.0", 903 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 904 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 905 | } 906 | } 907 | }, 908 | "extend": { 909 | "version": "3.0.1", 910 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 911 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 912 | }, 913 | "extend-shallow": { 914 | "version": "3.0.2", 915 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", 916 | "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", 917 | "requires": { 918 | "assign-symbols": "1.0.0", 919 | "is-extendable": "1.0.1" 920 | }, 921 | "dependencies": { 922 | "is-extendable": { 923 | "version": "1.0.1", 924 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 925 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 926 | "requires": { 927 | "is-plain-object": "2.0.4" 928 | } 929 | } 930 | } 931 | }, 932 | "extglob": { 933 | "version": "2.0.4", 934 | "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", 935 | "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", 936 | "requires": { 937 | "array-unique": "0.3.2", 938 | "define-property": "1.0.0", 939 | "expand-brackets": "2.1.4", 940 | "extend-shallow": "2.0.1", 941 | "fragment-cache": "0.2.1", 942 | "regex-not": "1.0.2", 943 | "snapdragon": "0.8.2", 944 | "to-regex": "3.0.2" 945 | }, 946 | "dependencies": { 947 | "define-property": { 948 | "version": "1.0.0", 949 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 950 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 951 | "requires": { 952 | "is-descriptor": "1.0.2" 953 | } 954 | }, 955 | "extend-shallow": { 956 | "version": "2.0.1", 957 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 958 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 959 | "requires": { 960 | "is-extendable": "0.1.1" 961 | } 962 | }, 963 | "is-accessor-descriptor": { 964 | "version": "1.0.0", 965 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 966 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 967 | "requires": { 968 | "kind-of": "6.0.2" 969 | } 970 | }, 971 | "is-data-descriptor": { 972 | "version": "1.0.0", 973 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 974 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 975 | "requires": { 976 | "kind-of": "6.0.2" 977 | } 978 | }, 979 | "is-descriptor": { 980 | "version": "1.0.2", 981 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 982 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 983 | "requires": { 984 | "is-accessor-descriptor": "1.0.0", 985 | "is-data-descriptor": "1.0.0", 986 | "kind-of": "6.0.2" 987 | } 988 | } 989 | } 990 | }, 991 | "extsprintf": { 992 | "version": "1.3.0", 993 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 994 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 995 | }, 996 | "eyes": { 997 | "version": "0.1.8", 998 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 999 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 1000 | }, 1001 | "fast-deep-equal": { 1002 | "version": "1.1.0", 1003 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 1004 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 1005 | }, 1006 | "fast-json-stable-stringify": { 1007 | "version": "2.0.0", 1008 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 1009 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 1010 | }, 1011 | "fill-range": { 1012 | "version": "4.0.0", 1013 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", 1014 | "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", 1015 | "requires": { 1016 | "extend-shallow": "2.0.1", 1017 | "is-number": "3.0.0", 1018 | "repeat-string": "1.6.1", 1019 | "to-regex-range": "2.1.1" 1020 | }, 1021 | "dependencies": { 1022 | "extend-shallow": { 1023 | "version": "2.0.1", 1024 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 1025 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 1026 | "requires": { 1027 | "is-extendable": "0.1.1" 1028 | } 1029 | } 1030 | } 1031 | }, 1032 | "finalhandler": { 1033 | "version": "1.1.1", 1034 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 1035 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 1036 | "requires": { 1037 | "debug": "2.6.9", 1038 | "encodeurl": "1.0.2", 1039 | "escape-html": "1.0.3", 1040 | "on-finished": "2.3.0", 1041 | "parseurl": "1.3.2", 1042 | "statuses": "1.4.0", 1043 | "unpipe": "1.0.0" 1044 | }, 1045 | "dependencies": { 1046 | "statuses": { 1047 | "version": "1.4.0", 1048 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1049 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1050 | } 1051 | } 1052 | }, 1053 | "find-up": { 1054 | "version": "1.1.2", 1055 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", 1056 | "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", 1057 | "requires": { 1058 | "path-exists": "2.1.0", 1059 | "pinkie-promise": "2.0.1" 1060 | } 1061 | }, 1062 | "for-in": { 1063 | "version": "1.0.2", 1064 | "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", 1065 | "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" 1066 | }, 1067 | "forever-agent": { 1068 | "version": "0.6.1", 1069 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 1070 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 1071 | }, 1072 | "form-data": { 1073 | "version": "2.3.2", 1074 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 1075 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 1076 | "requires": { 1077 | "asynckit": "0.4.0", 1078 | "combined-stream": "1.0.6", 1079 | "mime-types": "2.1.18" 1080 | } 1081 | }, 1082 | "forwarded": { 1083 | "version": "0.1.2", 1084 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 1085 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 1086 | }, 1087 | "fragment-cache": { 1088 | "version": "0.2.1", 1089 | "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", 1090 | "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", 1091 | "requires": { 1092 | "map-cache": "0.2.2" 1093 | } 1094 | }, 1095 | "fresh": { 1096 | "version": "0.5.2", 1097 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 1098 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 1099 | }, 1100 | "fs-extra": { 1101 | "version": "6.0.1", 1102 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", 1103 | "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", 1104 | "requires": { 1105 | "graceful-fs": "4.1.11", 1106 | "jsonfile": "4.0.0", 1107 | "universalify": "0.1.1" 1108 | } 1109 | }, 1110 | "fs.realpath": { 1111 | "version": "1.0.0", 1112 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1113 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 1114 | "dev": true 1115 | }, 1116 | "fsevents": { 1117 | "version": "1.2.4", 1118 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", 1119 | "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", 1120 | "optional": true, 1121 | "requires": { 1122 | "nan": "2.10.0", 1123 | "node-pre-gyp": "0.10.0" 1124 | }, 1125 | "dependencies": { 1126 | "abbrev": { 1127 | "version": "1.1.1", 1128 | "bundled": true, 1129 | "optional": true 1130 | }, 1131 | "ansi-regex": { 1132 | "version": "2.1.1", 1133 | "bundled": true 1134 | }, 1135 | "aproba": { 1136 | "version": "1.2.0", 1137 | "bundled": true, 1138 | "optional": true 1139 | }, 1140 | "are-we-there-yet": { 1141 | "version": "1.1.4", 1142 | "bundled": true, 1143 | "optional": true, 1144 | "requires": { 1145 | "delegates": "1.0.0", 1146 | "readable-stream": "2.3.6" 1147 | } 1148 | }, 1149 | "balanced-match": { 1150 | "version": "1.0.0", 1151 | "bundled": true 1152 | }, 1153 | "brace-expansion": { 1154 | "version": "1.1.11", 1155 | "bundled": true, 1156 | "requires": { 1157 | "balanced-match": "1.0.0", 1158 | "concat-map": "0.0.1" 1159 | } 1160 | }, 1161 | "chownr": { 1162 | "version": "1.0.1", 1163 | "bundled": true, 1164 | "optional": true 1165 | }, 1166 | "code-point-at": { 1167 | "version": "1.1.0", 1168 | "bundled": true 1169 | }, 1170 | "concat-map": { 1171 | "version": "0.0.1", 1172 | "bundled": true 1173 | }, 1174 | "console-control-strings": { 1175 | "version": "1.1.0", 1176 | "bundled": true 1177 | }, 1178 | "core-util-is": { 1179 | "version": "1.0.2", 1180 | "bundled": true, 1181 | "optional": true 1182 | }, 1183 | "debug": { 1184 | "version": "2.6.9", 1185 | "bundled": true, 1186 | "optional": true, 1187 | "requires": { 1188 | "ms": "2.0.0" 1189 | } 1190 | }, 1191 | "deep-extend": { 1192 | "version": "0.5.1", 1193 | "bundled": true, 1194 | "optional": true 1195 | }, 1196 | "delegates": { 1197 | "version": "1.0.0", 1198 | "bundled": true, 1199 | "optional": true 1200 | }, 1201 | "detect-libc": { 1202 | "version": "1.0.3", 1203 | "bundled": true, 1204 | "optional": true 1205 | }, 1206 | "fs-minipass": { 1207 | "version": "1.2.5", 1208 | "bundled": true, 1209 | "optional": true, 1210 | "requires": { 1211 | "minipass": "2.2.4" 1212 | } 1213 | }, 1214 | "fs.realpath": { 1215 | "version": "1.0.0", 1216 | "bundled": true, 1217 | "optional": true 1218 | }, 1219 | "gauge": { 1220 | "version": "2.7.4", 1221 | "bundled": true, 1222 | "optional": true, 1223 | "requires": { 1224 | "aproba": "1.2.0", 1225 | "console-control-strings": "1.1.0", 1226 | "has-unicode": "2.0.1", 1227 | "object-assign": "4.1.1", 1228 | "signal-exit": "3.0.2", 1229 | "string-width": "1.0.2", 1230 | "strip-ansi": "3.0.1", 1231 | "wide-align": "1.1.2" 1232 | } 1233 | }, 1234 | "glob": { 1235 | "version": "7.1.2", 1236 | "bundled": true, 1237 | "optional": true, 1238 | "requires": { 1239 | "fs.realpath": "1.0.0", 1240 | "inflight": "1.0.6", 1241 | "inherits": "2.0.3", 1242 | "minimatch": "3.0.4", 1243 | "once": "1.4.0", 1244 | "path-is-absolute": "1.0.1" 1245 | } 1246 | }, 1247 | "has-unicode": { 1248 | "version": "2.0.1", 1249 | "bundled": true, 1250 | "optional": true 1251 | }, 1252 | "iconv-lite": { 1253 | "version": "0.4.21", 1254 | "bundled": true, 1255 | "optional": true, 1256 | "requires": { 1257 | "safer-buffer": "2.1.2" 1258 | } 1259 | }, 1260 | "ignore-walk": { 1261 | "version": "3.0.1", 1262 | "bundled": true, 1263 | "optional": true, 1264 | "requires": { 1265 | "minimatch": "3.0.4" 1266 | } 1267 | }, 1268 | "inflight": { 1269 | "version": "1.0.6", 1270 | "bundled": true, 1271 | "optional": true, 1272 | "requires": { 1273 | "once": "1.4.0", 1274 | "wrappy": "1.0.2" 1275 | } 1276 | }, 1277 | "inherits": { 1278 | "version": "2.0.3", 1279 | "bundled": true 1280 | }, 1281 | "ini": { 1282 | "version": "1.3.5", 1283 | "bundled": true, 1284 | "optional": true 1285 | }, 1286 | "is-fullwidth-code-point": { 1287 | "version": "1.0.0", 1288 | "bundled": true, 1289 | "requires": { 1290 | "number-is-nan": "1.0.1" 1291 | } 1292 | }, 1293 | "isarray": { 1294 | "version": "1.0.0", 1295 | "bundled": true, 1296 | "optional": true 1297 | }, 1298 | "minimatch": { 1299 | "version": "3.0.4", 1300 | "bundled": true, 1301 | "requires": { 1302 | "brace-expansion": "1.1.11" 1303 | } 1304 | }, 1305 | "minimist": { 1306 | "version": "0.0.8", 1307 | "bundled": true 1308 | }, 1309 | "minipass": { 1310 | "version": "2.2.4", 1311 | "bundled": true, 1312 | "requires": { 1313 | "safe-buffer": "5.1.1", 1314 | "yallist": "3.0.2" 1315 | } 1316 | }, 1317 | "minizlib": { 1318 | "version": "1.1.0", 1319 | "bundled": true, 1320 | "optional": true, 1321 | "requires": { 1322 | "minipass": "2.2.4" 1323 | } 1324 | }, 1325 | "mkdirp": { 1326 | "version": "0.5.1", 1327 | "bundled": true, 1328 | "requires": { 1329 | "minimist": "0.0.8" 1330 | } 1331 | }, 1332 | "ms": { 1333 | "version": "2.0.0", 1334 | "bundled": true, 1335 | "optional": true 1336 | }, 1337 | "needle": { 1338 | "version": "2.2.0", 1339 | "bundled": true, 1340 | "optional": true, 1341 | "requires": { 1342 | "debug": "2.6.9", 1343 | "iconv-lite": "0.4.21", 1344 | "sax": "1.2.4" 1345 | } 1346 | }, 1347 | "node-pre-gyp": { 1348 | "version": "0.10.0", 1349 | "bundled": true, 1350 | "optional": true, 1351 | "requires": { 1352 | "detect-libc": "1.0.3", 1353 | "mkdirp": "0.5.1", 1354 | "needle": "2.2.0", 1355 | "nopt": "4.0.1", 1356 | "npm-packlist": "1.1.10", 1357 | "npmlog": "4.1.2", 1358 | "rc": "1.2.7", 1359 | "rimraf": "2.6.2", 1360 | "semver": "5.5.0", 1361 | "tar": "4.4.1" 1362 | } 1363 | }, 1364 | "nopt": { 1365 | "version": "4.0.1", 1366 | "bundled": true, 1367 | "optional": true, 1368 | "requires": { 1369 | "abbrev": "1.1.1", 1370 | "osenv": "0.1.5" 1371 | } 1372 | }, 1373 | "npm-bundled": { 1374 | "version": "1.0.3", 1375 | "bundled": true, 1376 | "optional": true 1377 | }, 1378 | "npm-packlist": { 1379 | "version": "1.1.10", 1380 | "bundled": true, 1381 | "optional": true, 1382 | "requires": { 1383 | "ignore-walk": "3.0.1", 1384 | "npm-bundled": "1.0.3" 1385 | } 1386 | }, 1387 | "npmlog": { 1388 | "version": "4.1.2", 1389 | "bundled": true, 1390 | "optional": true, 1391 | "requires": { 1392 | "are-we-there-yet": "1.1.4", 1393 | "console-control-strings": "1.1.0", 1394 | "gauge": "2.7.4", 1395 | "set-blocking": "2.0.0" 1396 | } 1397 | }, 1398 | "number-is-nan": { 1399 | "version": "1.0.1", 1400 | "bundled": true 1401 | }, 1402 | "object-assign": { 1403 | "version": "4.1.1", 1404 | "bundled": true, 1405 | "optional": true 1406 | }, 1407 | "once": { 1408 | "version": "1.4.0", 1409 | "bundled": true, 1410 | "requires": { 1411 | "wrappy": "1.0.2" 1412 | } 1413 | }, 1414 | "os-homedir": { 1415 | "version": "1.0.2", 1416 | "bundled": true, 1417 | "optional": true 1418 | }, 1419 | "os-tmpdir": { 1420 | "version": "1.0.2", 1421 | "bundled": true, 1422 | "optional": true 1423 | }, 1424 | "osenv": { 1425 | "version": "0.1.5", 1426 | "bundled": true, 1427 | "optional": true, 1428 | "requires": { 1429 | "os-homedir": "1.0.2", 1430 | "os-tmpdir": "1.0.2" 1431 | } 1432 | }, 1433 | "path-is-absolute": { 1434 | "version": "1.0.1", 1435 | "bundled": true, 1436 | "optional": true 1437 | }, 1438 | "process-nextick-args": { 1439 | "version": "2.0.0", 1440 | "bundled": true, 1441 | "optional": true 1442 | }, 1443 | "rc": { 1444 | "version": "1.2.7", 1445 | "bundled": true, 1446 | "optional": true, 1447 | "requires": { 1448 | "deep-extend": "0.5.1", 1449 | "ini": "1.3.5", 1450 | "minimist": "1.2.0", 1451 | "strip-json-comments": "2.0.1" 1452 | }, 1453 | "dependencies": { 1454 | "minimist": { 1455 | "version": "1.2.0", 1456 | "bundled": true, 1457 | "optional": true 1458 | } 1459 | } 1460 | }, 1461 | "readable-stream": { 1462 | "version": "2.3.6", 1463 | "bundled": true, 1464 | "optional": true, 1465 | "requires": { 1466 | "core-util-is": "1.0.2", 1467 | "inherits": "2.0.3", 1468 | "isarray": "1.0.0", 1469 | "process-nextick-args": "2.0.0", 1470 | "safe-buffer": "5.1.1", 1471 | "string_decoder": "1.1.1", 1472 | "util-deprecate": "1.0.2" 1473 | } 1474 | }, 1475 | "rimraf": { 1476 | "version": "2.6.2", 1477 | "bundled": true, 1478 | "optional": true, 1479 | "requires": { 1480 | "glob": "7.1.2" 1481 | } 1482 | }, 1483 | "safe-buffer": { 1484 | "version": "5.1.1", 1485 | "bundled": true 1486 | }, 1487 | "safer-buffer": { 1488 | "version": "2.1.2", 1489 | "bundled": true, 1490 | "optional": true 1491 | }, 1492 | "sax": { 1493 | "version": "1.2.4", 1494 | "bundled": true, 1495 | "optional": true 1496 | }, 1497 | "semver": { 1498 | "version": "5.5.0", 1499 | "bundled": true, 1500 | "optional": true 1501 | }, 1502 | "set-blocking": { 1503 | "version": "2.0.0", 1504 | "bundled": true, 1505 | "optional": true 1506 | }, 1507 | "signal-exit": { 1508 | "version": "3.0.2", 1509 | "bundled": true, 1510 | "optional": true 1511 | }, 1512 | "string-width": { 1513 | "version": "1.0.2", 1514 | "bundled": true, 1515 | "requires": { 1516 | "code-point-at": "1.1.0", 1517 | "is-fullwidth-code-point": "1.0.0", 1518 | "strip-ansi": "3.0.1" 1519 | } 1520 | }, 1521 | "string_decoder": { 1522 | "version": "1.1.1", 1523 | "bundled": true, 1524 | "optional": true, 1525 | "requires": { 1526 | "safe-buffer": "5.1.1" 1527 | } 1528 | }, 1529 | "strip-ansi": { 1530 | "version": "3.0.1", 1531 | "bundled": true, 1532 | "requires": { 1533 | "ansi-regex": "2.1.1" 1534 | } 1535 | }, 1536 | "strip-json-comments": { 1537 | "version": "2.0.1", 1538 | "bundled": true, 1539 | "optional": true 1540 | }, 1541 | "tar": { 1542 | "version": "4.4.1", 1543 | "bundled": true, 1544 | "optional": true, 1545 | "requires": { 1546 | "chownr": "1.0.1", 1547 | "fs-minipass": "1.2.5", 1548 | "minipass": "2.2.4", 1549 | "minizlib": "1.1.0", 1550 | "mkdirp": "0.5.1", 1551 | "safe-buffer": "5.1.1", 1552 | "yallist": "3.0.2" 1553 | } 1554 | }, 1555 | "util-deprecate": { 1556 | "version": "1.0.2", 1557 | "bundled": true, 1558 | "optional": true 1559 | }, 1560 | "wide-align": { 1561 | "version": "1.1.2", 1562 | "bundled": true, 1563 | "optional": true, 1564 | "requires": { 1565 | "string-width": "1.0.2" 1566 | } 1567 | }, 1568 | "wrappy": { 1569 | "version": "1.0.2", 1570 | "bundled": true 1571 | }, 1572 | "yallist": { 1573 | "version": "3.0.2", 1574 | "bundled": true 1575 | } 1576 | } 1577 | }, 1578 | "get-stdin": { 1579 | "version": "4.0.1", 1580 | "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", 1581 | "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" 1582 | }, 1583 | "get-value": { 1584 | "version": "2.0.6", 1585 | "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", 1586 | "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" 1587 | }, 1588 | "getpass": { 1589 | "version": "0.1.7", 1590 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 1591 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 1592 | "requires": { 1593 | "assert-plus": "1.0.0" 1594 | } 1595 | }, 1596 | "glob": { 1597 | "version": "7.1.2", 1598 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 1599 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 1600 | "dev": true, 1601 | "requires": { 1602 | "fs.realpath": "1.0.0", 1603 | "inflight": "1.0.6", 1604 | "inherits": "2.0.3", 1605 | "minimatch": "3.0.4", 1606 | "once": "1.4.0", 1607 | "path-is-absolute": "1.0.1" 1608 | } 1609 | }, 1610 | "glob-parent": { 1611 | "version": "3.1.0", 1612 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 1613 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 1614 | "requires": { 1615 | "is-glob": "3.1.0", 1616 | "path-dirname": "1.0.2" 1617 | }, 1618 | "dependencies": { 1619 | "is-glob": { 1620 | "version": "3.1.0", 1621 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1622 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1623 | "requires": { 1624 | "is-extglob": "2.1.1" 1625 | } 1626 | } 1627 | } 1628 | }, 1629 | "graceful-fs": { 1630 | "version": "4.1.11", 1631 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 1632 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 1633 | }, 1634 | "growl": { 1635 | "version": "1.10.5", 1636 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 1637 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 1638 | "dev": true 1639 | }, 1640 | "har-schema": { 1641 | "version": "2.0.0", 1642 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1643 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1644 | }, 1645 | "har-validator": { 1646 | "version": "5.0.3", 1647 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 1648 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 1649 | "requires": { 1650 | "ajv": "5.5.2", 1651 | "har-schema": "2.0.0" 1652 | } 1653 | }, 1654 | "has-ansi": { 1655 | "version": "2.0.0", 1656 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1657 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1658 | "requires": { 1659 | "ansi-regex": "2.1.1" 1660 | } 1661 | }, 1662 | "has-flag": { 1663 | "version": "3.0.0", 1664 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1665 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1666 | }, 1667 | "has-value": { 1668 | "version": "1.0.0", 1669 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", 1670 | "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", 1671 | "requires": { 1672 | "get-value": "2.0.6", 1673 | "has-values": "1.0.0", 1674 | "isobject": "3.0.1" 1675 | } 1676 | }, 1677 | "has-values": { 1678 | "version": "1.0.0", 1679 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", 1680 | "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", 1681 | "requires": { 1682 | "is-number": "3.0.0", 1683 | "kind-of": "4.0.0" 1684 | }, 1685 | "dependencies": { 1686 | "kind-of": { 1687 | "version": "4.0.0", 1688 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", 1689 | "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", 1690 | "requires": { 1691 | "is-buffer": "1.1.6" 1692 | } 1693 | } 1694 | } 1695 | }, 1696 | "he": { 1697 | "version": "1.1.1", 1698 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 1699 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 1700 | "dev": true 1701 | }, 1702 | "hosted-git-info": { 1703 | "version": "2.6.0", 1704 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", 1705 | "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" 1706 | }, 1707 | "http-errors": { 1708 | "version": "1.6.3", 1709 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1710 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 1711 | "requires": { 1712 | "depd": "1.1.2", 1713 | "inherits": "2.0.3", 1714 | "setprototypeof": "1.1.0", 1715 | "statuses": "1.5.0" 1716 | } 1717 | }, 1718 | "http-signature": { 1719 | "version": "1.2.0", 1720 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1721 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1722 | "requires": { 1723 | "assert-plus": "1.0.0", 1724 | "jsprim": "1.4.1", 1725 | "sshpk": "1.14.2" 1726 | } 1727 | }, 1728 | "iconv-lite": { 1729 | "version": "0.4.23", 1730 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 1731 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 1732 | "requires": { 1733 | "safer-buffer": "2.1.2" 1734 | } 1735 | }, 1736 | "ieee754": { 1737 | "version": "1.1.8", 1738 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", 1739 | "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" 1740 | }, 1741 | "indent-string": { 1742 | "version": "2.1.0", 1743 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", 1744 | "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", 1745 | "requires": { 1746 | "repeating": "2.0.1" 1747 | } 1748 | }, 1749 | "inflight": { 1750 | "version": "1.0.6", 1751 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1752 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1753 | "dev": true, 1754 | "requires": { 1755 | "once": "1.4.0", 1756 | "wrappy": "1.0.2" 1757 | } 1758 | }, 1759 | "inherits": { 1760 | "version": "2.0.3", 1761 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1762 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1763 | }, 1764 | "ipaddr.js": { 1765 | "version": "1.6.0", 1766 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", 1767 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" 1768 | }, 1769 | "is-accessor-descriptor": { 1770 | "version": "0.1.6", 1771 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", 1772 | "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", 1773 | "requires": { 1774 | "kind-of": "3.2.2" 1775 | }, 1776 | "dependencies": { 1777 | "kind-of": { 1778 | "version": "3.2.2", 1779 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1780 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1781 | "requires": { 1782 | "is-buffer": "1.1.6" 1783 | } 1784 | } 1785 | } 1786 | }, 1787 | "is-arrayish": { 1788 | "version": "0.2.1", 1789 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 1790 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 1791 | }, 1792 | "is-binary-path": { 1793 | "version": "1.0.1", 1794 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", 1795 | "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", 1796 | "requires": { 1797 | "binary-extensions": "1.11.0" 1798 | } 1799 | }, 1800 | "is-buffer": { 1801 | "version": "1.1.6", 1802 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 1803 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" 1804 | }, 1805 | "is-builtin-module": { 1806 | "version": "1.0.0", 1807 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 1808 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 1809 | "requires": { 1810 | "builtin-modules": "1.1.1" 1811 | } 1812 | }, 1813 | "is-data-descriptor": { 1814 | "version": "0.1.4", 1815 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", 1816 | "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", 1817 | "requires": { 1818 | "kind-of": "3.2.2" 1819 | }, 1820 | "dependencies": { 1821 | "kind-of": { 1822 | "version": "3.2.2", 1823 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1824 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1825 | "requires": { 1826 | "is-buffer": "1.1.6" 1827 | } 1828 | } 1829 | } 1830 | }, 1831 | "is-descriptor": { 1832 | "version": "0.1.6", 1833 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", 1834 | "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", 1835 | "requires": { 1836 | "is-accessor-descriptor": "0.1.6", 1837 | "is-data-descriptor": "0.1.4", 1838 | "kind-of": "5.1.0" 1839 | }, 1840 | "dependencies": { 1841 | "kind-of": { 1842 | "version": "5.1.0", 1843 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", 1844 | "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" 1845 | } 1846 | } 1847 | }, 1848 | "is-extendable": { 1849 | "version": "0.1.1", 1850 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", 1851 | "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" 1852 | }, 1853 | "is-extglob": { 1854 | "version": "2.1.1", 1855 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1856 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1857 | }, 1858 | "is-finite": { 1859 | "version": "1.0.2", 1860 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 1861 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 1862 | "requires": { 1863 | "number-is-nan": "1.0.1" 1864 | } 1865 | }, 1866 | "is-glob": { 1867 | "version": "4.0.0", 1868 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", 1869 | "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", 1870 | "requires": { 1871 | "is-extglob": "2.1.1" 1872 | } 1873 | }, 1874 | "is-number": { 1875 | "version": "3.0.0", 1876 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", 1877 | "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", 1878 | "requires": { 1879 | "kind-of": "3.2.2" 1880 | }, 1881 | "dependencies": { 1882 | "kind-of": { 1883 | "version": "3.2.2", 1884 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 1885 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 1886 | "requires": { 1887 | "is-buffer": "1.1.6" 1888 | } 1889 | } 1890 | } 1891 | }, 1892 | "is-odd": { 1893 | "version": "2.0.0", 1894 | "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-2.0.0.tgz", 1895 | "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", 1896 | "requires": { 1897 | "is-number": "4.0.0" 1898 | }, 1899 | "dependencies": { 1900 | "is-number": { 1901 | "version": "4.0.0", 1902 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", 1903 | "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" 1904 | } 1905 | } 1906 | }, 1907 | "is-plain-object": { 1908 | "version": "2.0.4", 1909 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", 1910 | "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", 1911 | "requires": { 1912 | "isobject": "3.0.1" 1913 | } 1914 | }, 1915 | "is-typedarray": { 1916 | "version": "1.0.0", 1917 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1918 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1919 | }, 1920 | "is-utf8": { 1921 | "version": "0.2.1", 1922 | "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", 1923 | "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" 1924 | }, 1925 | "is-windows": { 1926 | "version": "1.0.2", 1927 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1928 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1929 | }, 1930 | "isarray": { 1931 | "version": "1.0.0", 1932 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1933 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1934 | }, 1935 | "isobject": { 1936 | "version": "3.0.1", 1937 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", 1938 | "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" 1939 | }, 1940 | "isstream": { 1941 | "version": "0.1.2", 1942 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1943 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1944 | }, 1945 | "jmespath": { 1946 | "version": "0.15.0", 1947 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", 1948 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" 1949 | }, 1950 | "jsbn": { 1951 | "version": "0.1.1", 1952 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1953 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1954 | "optional": true 1955 | }, 1956 | "json-schema": { 1957 | "version": "0.2.3", 1958 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1959 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1960 | }, 1961 | "json-schema-traverse": { 1962 | "version": "0.3.1", 1963 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1964 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 1965 | }, 1966 | "json-stringify-safe": { 1967 | "version": "5.0.1", 1968 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1969 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1970 | }, 1971 | "jsonfile": { 1972 | "version": "4.0.0", 1973 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 1974 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 1975 | "requires": { 1976 | "graceful-fs": "4.1.11" 1977 | } 1978 | }, 1979 | "jsprim": { 1980 | "version": "1.4.1", 1981 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1982 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1983 | "requires": { 1984 | "assert-plus": "1.0.0", 1985 | "extsprintf": "1.3.0", 1986 | "json-schema": "0.2.3", 1987 | "verror": "1.10.0" 1988 | } 1989 | }, 1990 | "jszip": { 1991 | "version": "2.5.0", 1992 | "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.5.0.tgz", 1993 | "integrity": "sha1-dET9hVHd8+XacZj+oMkbyDCMwnQ=", 1994 | "requires": { 1995 | "pako": "0.2.9" 1996 | } 1997 | }, 1998 | "kind-of": { 1999 | "version": "6.0.2", 2000 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", 2001 | "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" 2002 | }, 2003 | "load-json-file": { 2004 | "version": "1.1.0", 2005 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", 2006 | "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", 2007 | "requires": { 2008 | "graceful-fs": "4.1.11", 2009 | "parse-json": "2.2.0", 2010 | "pify": "2.3.0", 2011 | "pinkie-promise": "2.0.1", 2012 | "strip-bom": "2.0.0" 2013 | } 2014 | }, 2015 | "lodash": { 2016 | "version": "4.17.10", 2017 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 2018 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" 2019 | }, 2020 | "loud-rejection": { 2021 | "version": "1.6.0", 2022 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 2023 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 2024 | "requires": { 2025 | "currently-unhandled": "0.4.1", 2026 | "signal-exit": "3.0.2" 2027 | } 2028 | }, 2029 | "map-cache": { 2030 | "version": "0.2.2", 2031 | "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", 2032 | "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" 2033 | }, 2034 | "map-obj": { 2035 | "version": "1.0.1", 2036 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 2037 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 2038 | }, 2039 | "map-visit": { 2040 | "version": "1.0.0", 2041 | "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", 2042 | "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", 2043 | "requires": { 2044 | "object-visit": "1.0.1" 2045 | } 2046 | }, 2047 | "media-typer": { 2048 | "version": "0.3.0", 2049 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 2050 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 2051 | }, 2052 | "meow": { 2053 | "version": "3.7.0", 2054 | "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", 2055 | "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", 2056 | "requires": { 2057 | "camelcase-keys": "2.1.0", 2058 | "decamelize": "1.2.0", 2059 | "loud-rejection": "1.6.0", 2060 | "map-obj": "1.0.1", 2061 | "minimist": "1.2.0", 2062 | "normalize-package-data": "2.4.0", 2063 | "object-assign": "4.1.1", 2064 | "read-pkg-up": "1.0.1", 2065 | "redent": "1.0.0", 2066 | "trim-newlines": "1.0.0" 2067 | } 2068 | }, 2069 | "merge": { 2070 | "version": "1.2.0", 2071 | "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", 2072 | "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" 2073 | }, 2074 | "merge-descriptors": { 2075 | "version": "1.0.1", 2076 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 2077 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 2078 | }, 2079 | "methods": { 2080 | "version": "1.1.2", 2081 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 2082 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 2083 | }, 2084 | "micromatch": { 2085 | "version": "3.1.10", 2086 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", 2087 | "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", 2088 | "requires": { 2089 | "arr-diff": "4.0.0", 2090 | "array-unique": "0.3.2", 2091 | "braces": "2.3.2", 2092 | "define-property": "2.0.2", 2093 | "extend-shallow": "3.0.2", 2094 | "extglob": "2.0.4", 2095 | "fragment-cache": "0.2.1", 2096 | "kind-of": "6.0.2", 2097 | "nanomatch": "1.2.9", 2098 | "object.pick": "1.3.0", 2099 | "regex-not": "1.0.2", 2100 | "snapdragon": "0.8.2", 2101 | "to-regex": "3.0.2" 2102 | } 2103 | }, 2104 | "mime": { 2105 | "version": "1.4.1", 2106 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 2107 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 2108 | }, 2109 | "mime-db": { 2110 | "version": "1.33.0", 2111 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 2112 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 2113 | }, 2114 | "mime-types": { 2115 | "version": "2.1.18", 2116 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 2117 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 2118 | "requires": { 2119 | "mime-db": "1.33.0" 2120 | } 2121 | }, 2122 | "minimatch": { 2123 | "version": "3.0.4", 2124 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 2125 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 2126 | "requires": { 2127 | "brace-expansion": "1.1.11" 2128 | } 2129 | }, 2130 | "minimist": { 2131 | "version": "1.2.0", 2132 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 2133 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 2134 | }, 2135 | "mixin-deep": { 2136 | "version": "1.3.1", 2137 | "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", 2138 | "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", 2139 | "requires": { 2140 | "for-in": "1.0.2", 2141 | "is-extendable": "1.0.1" 2142 | }, 2143 | "dependencies": { 2144 | "is-extendable": { 2145 | "version": "1.0.1", 2146 | "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", 2147 | "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", 2148 | "requires": { 2149 | "is-plain-object": "2.0.4" 2150 | } 2151 | } 2152 | } 2153 | }, 2154 | "mkdirp": { 2155 | "version": "0.3.5", 2156 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", 2157 | "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" 2158 | }, 2159 | "mocha": { 2160 | "version": "5.2.0", 2161 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 2162 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 2163 | "dev": true, 2164 | "requires": { 2165 | "browser-stdout": "1.3.1", 2166 | "commander": "2.15.1", 2167 | "debug": "3.1.0", 2168 | "diff": "3.5.0", 2169 | "escape-string-regexp": "1.0.5", 2170 | "glob": "7.1.2", 2171 | "growl": "1.10.5", 2172 | "he": "1.1.1", 2173 | "minimatch": "3.0.4", 2174 | "mkdirp": "0.5.1", 2175 | "supports-color": "5.4.0" 2176 | }, 2177 | "dependencies": { 2178 | "debug": { 2179 | "version": "3.1.0", 2180 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 2181 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 2182 | "dev": true, 2183 | "requires": { 2184 | "ms": "2.0.0" 2185 | } 2186 | }, 2187 | "minimist": { 2188 | "version": "0.0.8", 2189 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 2190 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 2191 | "dev": true 2192 | }, 2193 | "mkdirp": { 2194 | "version": "0.5.1", 2195 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 2196 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 2197 | "dev": true, 2198 | "requires": { 2199 | "minimist": "0.0.8" 2200 | } 2201 | } 2202 | } 2203 | }, 2204 | "ms": { 2205 | "version": "2.0.0", 2206 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 2207 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 2208 | }, 2209 | "nan": { 2210 | "version": "2.10.0", 2211 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 2212 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", 2213 | "optional": true 2214 | }, 2215 | "nanomatch": { 2216 | "version": "1.2.9", 2217 | "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.9.tgz", 2218 | "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", 2219 | "requires": { 2220 | "arr-diff": "4.0.0", 2221 | "array-unique": "0.3.2", 2222 | "define-property": "2.0.2", 2223 | "extend-shallow": "3.0.2", 2224 | "fragment-cache": "0.2.1", 2225 | "is-odd": "2.0.0", 2226 | "is-windows": "1.0.2", 2227 | "kind-of": "6.0.2", 2228 | "object.pick": "1.3.0", 2229 | "regex-not": "1.0.2", 2230 | "snapdragon": "0.8.2", 2231 | "to-regex": "3.0.2" 2232 | } 2233 | }, 2234 | "negotiator": { 2235 | "version": "0.6.1", 2236 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 2237 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 2238 | }, 2239 | "node-zip": { 2240 | "version": "1.1.1", 2241 | "resolved": "https://registry.npmjs.org/node-zip/-/node-zip-1.1.1.tgz", 2242 | "integrity": "sha1-lNGtZ0o81GoViN1zb0qaeMdX62I=", 2243 | "requires": { 2244 | "jszip": "2.5.0" 2245 | } 2246 | }, 2247 | "normalize-package-data": { 2248 | "version": "2.4.0", 2249 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 2250 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 2251 | "requires": { 2252 | "hosted-git-info": "2.6.0", 2253 | "is-builtin-module": "1.0.0", 2254 | "semver": "5.5.0", 2255 | "validate-npm-package-license": "3.0.3" 2256 | } 2257 | }, 2258 | "normalize-path": { 2259 | "version": "2.1.1", 2260 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", 2261 | "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", 2262 | "requires": { 2263 | "remove-trailing-separator": "1.1.0" 2264 | } 2265 | }, 2266 | "number-is-nan": { 2267 | "version": "1.0.1", 2268 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 2269 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 2270 | }, 2271 | "oauth-sign": { 2272 | "version": "0.8.2", 2273 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 2274 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 2275 | }, 2276 | "object-assign": { 2277 | "version": "4.1.1", 2278 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2279 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 2280 | }, 2281 | "object-copy": { 2282 | "version": "0.1.0", 2283 | "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", 2284 | "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", 2285 | "requires": { 2286 | "copy-descriptor": "0.1.1", 2287 | "define-property": "0.2.5", 2288 | "kind-of": "3.2.2" 2289 | }, 2290 | "dependencies": { 2291 | "define-property": { 2292 | "version": "0.2.5", 2293 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2294 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2295 | "requires": { 2296 | "is-descriptor": "0.1.6" 2297 | } 2298 | }, 2299 | "kind-of": { 2300 | "version": "3.2.2", 2301 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2302 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2303 | "requires": { 2304 | "is-buffer": "1.1.6" 2305 | } 2306 | } 2307 | } 2308 | }, 2309 | "object-visit": { 2310 | "version": "1.0.1", 2311 | "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", 2312 | "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", 2313 | "requires": { 2314 | "isobject": "3.0.1" 2315 | } 2316 | }, 2317 | "object.pick": { 2318 | "version": "1.3.0", 2319 | "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", 2320 | "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", 2321 | "requires": { 2322 | "isobject": "3.0.1" 2323 | } 2324 | }, 2325 | "on-finished": { 2326 | "version": "2.3.0", 2327 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 2328 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 2329 | "requires": { 2330 | "ee-first": "1.1.1" 2331 | } 2332 | }, 2333 | "once": { 2334 | "version": "1.4.0", 2335 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2336 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 2337 | "dev": true, 2338 | "requires": { 2339 | "wrappy": "1.0.2" 2340 | } 2341 | }, 2342 | "pako": { 2343 | "version": "0.2.9", 2344 | "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", 2345 | "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=" 2346 | }, 2347 | "parse-json": { 2348 | "version": "2.2.0", 2349 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", 2350 | "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", 2351 | "requires": { 2352 | "error-ex": "1.3.1" 2353 | } 2354 | }, 2355 | "parseurl": { 2356 | "version": "1.3.2", 2357 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 2358 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 2359 | }, 2360 | "pascalcase": { 2361 | "version": "0.1.1", 2362 | "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", 2363 | "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" 2364 | }, 2365 | "path-dirname": { 2366 | "version": "1.0.2", 2367 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 2368 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 2369 | }, 2370 | "path-exists": { 2371 | "version": "2.1.0", 2372 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", 2373 | "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", 2374 | "requires": { 2375 | "pinkie-promise": "2.0.1" 2376 | } 2377 | }, 2378 | "path-is-absolute": { 2379 | "version": "1.0.1", 2380 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2381 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 2382 | }, 2383 | "path-to-regexp": { 2384 | "version": "0.1.7", 2385 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 2386 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 2387 | }, 2388 | "path-type": { 2389 | "version": "1.1.0", 2390 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", 2391 | "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", 2392 | "requires": { 2393 | "graceful-fs": "4.1.11", 2394 | "pify": "2.3.0", 2395 | "pinkie-promise": "2.0.1" 2396 | } 2397 | }, 2398 | "performance-now": { 2399 | "version": "2.1.0", 2400 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 2401 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 2402 | }, 2403 | "pify": { 2404 | "version": "2.3.0", 2405 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2406 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 2407 | }, 2408 | "pinkie": { 2409 | "version": "2.0.4", 2410 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 2411 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 2412 | }, 2413 | "pinkie-promise": { 2414 | "version": "2.0.1", 2415 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 2416 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 2417 | "requires": { 2418 | "pinkie": "2.0.4" 2419 | } 2420 | }, 2421 | "posix-character-classes": { 2422 | "version": "0.1.1", 2423 | "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", 2424 | "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" 2425 | }, 2426 | "process-nextick-args": { 2427 | "version": "2.0.0", 2428 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 2429 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 2430 | }, 2431 | "properties-reader": { 2432 | "version": "0.0.15", 2433 | "resolved": "https://registry.npmjs.org/properties-reader/-/properties-reader-0.0.15.tgz", 2434 | "integrity": "sha1-JgogoSKjKqf+FmvSN6Cr7s/1MIY=", 2435 | "requires": { 2436 | "mkdirp": "0.3.5" 2437 | } 2438 | }, 2439 | "proxy-addr": { 2440 | "version": "2.0.3", 2441 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", 2442 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", 2443 | "requires": { 2444 | "forwarded": "0.1.2", 2445 | "ipaddr.js": "1.6.0" 2446 | } 2447 | }, 2448 | "punycode": { 2449 | "version": "1.3.2", 2450 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", 2451 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" 2452 | }, 2453 | "qs": { 2454 | "version": "6.5.2", 2455 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 2456 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 2457 | }, 2458 | "querystring": { 2459 | "version": "0.2.0", 2460 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", 2461 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=" 2462 | }, 2463 | "range-parser": { 2464 | "version": "1.2.0", 2465 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 2466 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 2467 | }, 2468 | "raw-body": { 2469 | "version": "2.3.3", 2470 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 2471 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 2472 | "requires": { 2473 | "bytes": "3.0.0", 2474 | "http-errors": "1.6.3", 2475 | "iconv-lite": "0.4.23", 2476 | "unpipe": "1.0.0" 2477 | } 2478 | }, 2479 | "read-pkg": { 2480 | "version": "1.1.0", 2481 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", 2482 | "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", 2483 | "requires": { 2484 | "load-json-file": "1.1.0", 2485 | "normalize-package-data": "2.4.0", 2486 | "path-type": "1.1.0" 2487 | } 2488 | }, 2489 | "read-pkg-up": { 2490 | "version": "1.0.1", 2491 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", 2492 | "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", 2493 | "requires": { 2494 | "find-up": "1.1.2", 2495 | "read-pkg": "1.1.0" 2496 | } 2497 | }, 2498 | "readable-stream": { 2499 | "version": "2.3.6", 2500 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 2501 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 2502 | "requires": { 2503 | "core-util-is": "1.0.2", 2504 | "inherits": "2.0.3", 2505 | "isarray": "1.0.0", 2506 | "process-nextick-args": "2.0.0", 2507 | "safe-buffer": "5.1.1", 2508 | "string_decoder": "1.1.1", 2509 | "util-deprecate": "1.0.2" 2510 | } 2511 | }, 2512 | "readdirp": { 2513 | "version": "2.1.0", 2514 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", 2515 | "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", 2516 | "requires": { 2517 | "graceful-fs": "4.1.11", 2518 | "minimatch": "3.0.4", 2519 | "readable-stream": "2.3.6", 2520 | "set-immediate-shim": "1.0.1" 2521 | } 2522 | }, 2523 | "redent": { 2524 | "version": "1.0.0", 2525 | "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", 2526 | "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", 2527 | "requires": { 2528 | "indent-string": "2.1.0", 2529 | "strip-indent": "1.0.1" 2530 | } 2531 | }, 2532 | "regex-not": { 2533 | "version": "1.0.2", 2534 | "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", 2535 | "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", 2536 | "requires": { 2537 | "extend-shallow": "3.0.2", 2538 | "safe-regex": "1.1.0" 2539 | } 2540 | }, 2541 | "remove-trailing-separator": { 2542 | "version": "1.1.0", 2543 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 2544 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 2545 | }, 2546 | "repeat-element": { 2547 | "version": "1.1.2", 2548 | "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", 2549 | "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" 2550 | }, 2551 | "repeat-string": { 2552 | "version": "1.6.1", 2553 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 2554 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" 2555 | }, 2556 | "repeating": { 2557 | "version": "2.0.1", 2558 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 2559 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 2560 | "requires": { 2561 | "is-finite": "1.0.2" 2562 | } 2563 | }, 2564 | "request": { 2565 | "version": "2.87.0", 2566 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", 2567 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", 2568 | "requires": { 2569 | "aws-sign2": "0.7.0", 2570 | "aws4": "1.7.0", 2571 | "caseless": "0.12.0", 2572 | "combined-stream": "1.0.6", 2573 | "extend": "3.0.1", 2574 | "forever-agent": "0.6.1", 2575 | "form-data": "2.3.2", 2576 | "har-validator": "5.0.3", 2577 | "http-signature": "1.2.0", 2578 | "is-typedarray": "1.0.0", 2579 | "isstream": "0.1.2", 2580 | "json-stringify-safe": "5.0.1", 2581 | "mime-types": "2.1.18", 2582 | "oauth-sign": "0.8.2", 2583 | "performance-now": "2.1.0", 2584 | "qs": "6.5.2", 2585 | "safe-buffer": "5.1.1", 2586 | "tough-cookie": "2.3.4", 2587 | "tunnel-agent": "0.6.0", 2588 | "uuid": "3.2.1" 2589 | }, 2590 | "dependencies": { 2591 | "uuid": { 2592 | "version": "3.2.1", 2593 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 2594 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 2595 | } 2596 | } 2597 | }, 2598 | "request-promise-core": { 2599 | "version": "1.1.1", 2600 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", 2601 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", 2602 | "requires": { 2603 | "lodash": "4.17.10" 2604 | } 2605 | }, 2606 | "request-promise-native": { 2607 | "version": "1.0.5", 2608 | "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", 2609 | "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", 2610 | "requires": { 2611 | "request-promise-core": "1.1.1", 2612 | "stealthy-require": "1.1.1", 2613 | "tough-cookie": "2.3.4" 2614 | } 2615 | }, 2616 | "resolve-url": { 2617 | "version": "0.2.1", 2618 | "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", 2619 | "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" 2620 | }, 2621 | "ret": { 2622 | "version": "0.1.15", 2623 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", 2624 | "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" 2625 | }, 2626 | "safe-buffer": { 2627 | "version": "5.1.1", 2628 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 2629 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 2630 | }, 2631 | "safe-regex": { 2632 | "version": "1.1.0", 2633 | "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", 2634 | "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", 2635 | "requires": { 2636 | "ret": "0.1.15" 2637 | } 2638 | }, 2639 | "safer-buffer": { 2640 | "version": "2.1.2", 2641 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 2642 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 2643 | }, 2644 | "sax": { 2645 | "version": "1.2.1", 2646 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", 2647 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" 2648 | }, 2649 | "semver": { 2650 | "version": "5.5.0", 2651 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 2652 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" 2653 | }, 2654 | "send": { 2655 | "version": "0.16.2", 2656 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 2657 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 2658 | "requires": { 2659 | "debug": "2.6.9", 2660 | "depd": "1.1.2", 2661 | "destroy": "1.0.4", 2662 | "encodeurl": "1.0.2", 2663 | "escape-html": "1.0.3", 2664 | "etag": "1.8.1", 2665 | "fresh": "0.5.2", 2666 | "http-errors": "1.6.3", 2667 | "mime": "1.4.1", 2668 | "ms": "2.0.0", 2669 | "on-finished": "2.3.0", 2670 | "range-parser": "1.2.0", 2671 | "statuses": "1.4.0" 2672 | }, 2673 | "dependencies": { 2674 | "statuses": { 2675 | "version": "1.4.0", 2676 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 2677 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 2678 | } 2679 | } 2680 | }, 2681 | "serve-static": { 2682 | "version": "1.13.2", 2683 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 2684 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 2685 | "requires": { 2686 | "encodeurl": "1.0.2", 2687 | "escape-html": "1.0.3", 2688 | "parseurl": "1.3.2", 2689 | "send": "0.16.2" 2690 | } 2691 | }, 2692 | "set-immediate-shim": { 2693 | "version": "1.0.1", 2694 | "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", 2695 | "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" 2696 | }, 2697 | "set-value": { 2698 | "version": "2.0.0", 2699 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", 2700 | "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", 2701 | "requires": { 2702 | "extend-shallow": "2.0.1", 2703 | "is-extendable": "0.1.1", 2704 | "is-plain-object": "2.0.4", 2705 | "split-string": "3.1.0" 2706 | }, 2707 | "dependencies": { 2708 | "extend-shallow": { 2709 | "version": "2.0.1", 2710 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2711 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2712 | "requires": { 2713 | "is-extendable": "0.1.1" 2714 | } 2715 | } 2716 | } 2717 | }, 2718 | "setprototypeof": { 2719 | "version": "1.1.0", 2720 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 2721 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 2722 | }, 2723 | "shimmer": { 2724 | "version": "1.2.0", 2725 | "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.0.tgz", 2726 | "integrity": "sha512-xTCx2vohXC2EWWDqY/zb4+5Mu28D+HYNSOuFzsyRDRvI/e1ICb69afwaUwfjr+25ZXldbOLyp+iDUZHq8UnTag==" 2727 | }, 2728 | "signal-exit": { 2729 | "version": "3.0.2", 2730 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 2731 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 2732 | }, 2733 | "snapdragon": { 2734 | "version": "0.8.2", 2735 | "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", 2736 | "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", 2737 | "requires": { 2738 | "base": "0.11.2", 2739 | "debug": "2.6.9", 2740 | "define-property": "0.2.5", 2741 | "extend-shallow": "2.0.1", 2742 | "map-cache": "0.2.2", 2743 | "source-map": "0.5.7", 2744 | "source-map-resolve": "0.5.2", 2745 | "use": "3.1.0" 2746 | }, 2747 | "dependencies": { 2748 | "define-property": { 2749 | "version": "0.2.5", 2750 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2751 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2752 | "requires": { 2753 | "is-descriptor": "0.1.6" 2754 | } 2755 | }, 2756 | "extend-shallow": { 2757 | "version": "2.0.1", 2758 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 2759 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 2760 | "requires": { 2761 | "is-extendable": "0.1.1" 2762 | } 2763 | }, 2764 | "source-map": { 2765 | "version": "0.5.7", 2766 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 2767 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 2768 | } 2769 | } 2770 | }, 2771 | "snapdragon-node": { 2772 | "version": "2.1.1", 2773 | "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", 2774 | "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", 2775 | "requires": { 2776 | "define-property": "1.0.0", 2777 | "isobject": "3.0.1", 2778 | "snapdragon-util": "3.0.1" 2779 | }, 2780 | "dependencies": { 2781 | "define-property": { 2782 | "version": "1.0.0", 2783 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", 2784 | "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", 2785 | "requires": { 2786 | "is-descriptor": "1.0.2" 2787 | } 2788 | }, 2789 | "is-accessor-descriptor": { 2790 | "version": "1.0.0", 2791 | "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", 2792 | "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", 2793 | "requires": { 2794 | "kind-of": "6.0.2" 2795 | } 2796 | }, 2797 | "is-data-descriptor": { 2798 | "version": "1.0.0", 2799 | "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", 2800 | "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", 2801 | "requires": { 2802 | "kind-of": "6.0.2" 2803 | } 2804 | }, 2805 | "is-descriptor": { 2806 | "version": "1.0.2", 2807 | "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", 2808 | "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", 2809 | "requires": { 2810 | "is-accessor-descriptor": "1.0.0", 2811 | "is-data-descriptor": "1.0.0", 2812 | "kind-of": "6.0.2" 2813 | } 2814 | } 2815 | } 2816 | }, 2817 | "snapdragon-util": { 2818 | "version": "3.0.1", 2819 | "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", 2820 | "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", 2821 | "requires": { 2822 | "kind-of": "3.2.2" 2823 | }, 2824 | "dependencies": { 2825 | "kind-of": { 2826 | "version": "3.2.2", 2827 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 2828 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 2829 | "requires": { 2830 | "is-buffer": "1.1.6" 2831 | } 2832 | } 2833 | } 2834 | }, 2835 | "source-map": { 2836 | "version": "0.6.1", 2837 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 2838 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 2839 | }, 2840 | "source-map-resolve": { 2841 | "version": "0.5.2", 2842 | "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", 2843 | "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", 2844 | "requires": { 2845 | "atob": "2.1.1", 2846 | "decode-uri-component": "0.2.0", 2847 | "resolve-url": "0.2.1", 2848 | "source-map-url": "0.4.0", 2849 | "urix": "0.1.0" 2850 | } 2851 | }, 2852 | "source-map-support": { 2853 | "version": "0.5.6", 2854 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", 2855 | "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", 2856 | "requires": { 2857 | "buffer-from": "1.1.0", 2858 | "source-map": "0.6.1" 2859 | } 2860 | }, 2861 | "source-map-url": { 2862 | "version": "0.4.0", 2863 | "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", 2864 | "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" 2865 | }, 2866 | "spdx-correct": { 2867 | "version": "3.0.0", 2868 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", 2869 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", 2870 | "requires": { 2871 | "spdx-expression-parse": "3.0.0", 2872 | "spdx-license-ids": "3.0.0" 2873 | } 2874 | }, 2875 | "spdx-exceptions": { 2876 | "version": "2.1.0", 2877 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", 2878 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" 2879 | }, 2880 | "spdx-expression-parse": { 2881 | "version": "3.0.0", 2882 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 2883 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 2884 | "requires": { 2885 | "spdx-exceptions": "2.1.0", 2886 | "spdx-license-ids": "3.0.0" 2887 | } 2888 | }, 2889 | "spdx-license-ids": { 2890 | "version": "3.0.0", 2891 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", 2892 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" 2893 | }, 2894 | "split-string": { 2895 | "version": "3.1.0", 2896 | "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", 2897 | "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", 2898 | "requires": { 2899 | "extend-shallow": "3.0.2" 2900 | } 2901 | }, 2902 | "sshpk": { 2903 | "version": "1.14.2", 2904 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", 2905 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", 2906 | "requires": { 2907 | "asn1": "0.2.3", 2908 | "assert-plus": "1.0.0", 2909 | "bcrypt-pbkdf": "1.0.1", 2910 | "dashdash": "1.14.1", 2911 | "ecc-jsbn": "0.1.1", 2912 | "getpass": "0.1.7", 2913 | "jsbn": "0.1.1", 2914 | "safer-buffer": "2.1.2", 2915 | "tweetnacl": "0.14.5" 2916 | } 2917 | }, 2918 | "stack-trace": { 2919 | "version": "0.0.10", 2920 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 2921 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 2922 | }, 2923 | "static-extend": { 2924 | "version": "0.1.2", 2925 | "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", 2926 | "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", 2927 | "requires": { 2928 | "define-property": "0.2.5", 2929 | "object-copy": "0.1.0" 2930 | }, 2931 | "dependencies": { 2932 | "define-property": { 2933 | "version": "0.2.5", 2934 | "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", 2935 | "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", 2936 | "requires": { 2937 | "is-descriptor": "0.1.6" 2938 | } 2939 | } 2940 | } 2941 | }, 2942 | "statuses": { 2943 | "version": "1.5.0", 2944 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 2945 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 2946 | }, 2947 | "stealthy-require": { 2948 | "version": "1.1.1", 2949 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 2950 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 2951 | }, 2952 | "string_decoder": { 2953 | "version": "1.1.1", 2954 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2955 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2956 | "requires": { 2957 | "safe-buffer": "5.1.1" 2958 | } 2959 | }, 2960 | "strip-ansi": { 2961 | "version": "3.0.1", 2962 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2963 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2964 | "requires": { 2965 | "ansi-regex": "2.1.1" 2966 | } 2967 | }, 2968 | "strip-bom": { 2969 | "version": "2.0.0", 2970 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", 2971 | "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", 2972 | "requires": { 2973 | "is-utf8": "0.2.1" 2974 | } 2975 | }, 2976 | "strip-indent": { 2977 | "version": "1.0.1", 2978 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", 2979 | "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", 2980 | "requires": { 2981 | "get-stdin": "4.0.1" 2982 | } 2983 | }, 2984 | "supports-color": { 2985 | "version": "5.4.0", 2986 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 2987 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 2988 | "requires": { 2989 | "has-flag": "3.0.0" 2990 | } 2991 | }, 2992 | "to-object-path": { 2993 | "version": "0.3.0", 2994 | "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", 2995 | "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", 2996 | "requires": { 2997 | "kind-of": "3.2.2" 2998 | }, 2999 | "dependencies": { 3000 | "kind-of": { 3001 | "version": "3.2.2", 3002 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 3003 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 3004 | "requires": { 3005 | "is-buffer": "1.1.6" 3006 | } 3007 | } 3008 | } 3009 | }, 3010 | "to-regex": { 3011 | "version": "3.0.2", 3012 | "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", 3013 | "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", 3014 | "requires": { 3015 | "define-property": "2.0.2", 3016 | "extend-shallow": "3.0.2", 3017 | "regex-not": "1.0.2", 3018 | "safe-regex": "1.1.0" 3019 | } 3020 | }, 3021 | "to-regex-range": { 3022 | "version": "2.1.1", 3023 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", 3024 | "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", 3025 | "requires": { 3026 | "is-number": "3.0.0", 3027 | "repeat-string": "1.6.1" 3028 | } 3029 | }, 3030 | "tough-cookie": { 3031 | "version": "2.3.4", 3032 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 3033 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 3034 | "requires": { 3035 | "punycode": "1.4.1" 3036 | }, 3037 | "dependencies": { 3038 | "punycode": { 3039 | "version": "1.4.1", 3040 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 3041 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 3042 | } 3043 | } 3044 | }, 3045 | "trim-newlines": { 3046 | "version": "1.0.0", 3047 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", 3048 | "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" 3049 | }, 3050 | "tunnel-agent": { 3051 | "version": "0.6.0", 3052 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 3053 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 3054 | "requires": { 3055 | "safe-buffer": "5.1.1" 3056 | } 3057 | }, 3058 | "tweetnacl": { 3059 | "version": "0.14.5", 3060 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 3061 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 3062 | "optional": true 3063 | }, 3064 | "type-is": { 3065 | "version": "1.6.16", 3066 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 3067 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 3068 | "requires": { 3069 | "media-typer": "0.3.0", 3070 | "mime-types": "2.1.18" 3071 | } 3072 | }, 3073 | "typescript": { 3074 | "version": "2.9.1", 3075 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.1.tgz", 3076 | "integrity": "sha512-h6pM2f/GDchCFlldnriOhs1QHuwbnmj6/v7499eMHqPeW4V2G0elua2eIc2nu8v2NdHV0Gm+tzX83Hr6nUFjQA==", 3077 | "dev": true 3078 | }, 3079 | "union-value": { 3080 | "version": "1.0.0", 3081 | "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", 3082 | "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", 3083 | "requires": { 3084 | "arr-union": "3.1.0", 3085 | "get-value": "2.0.6", 3086 | "is-extendable": "0.1.1", 3087 | "set-value": "0.4.3" 3088 | }, 3089 | "dependencies": { 3090 | "extend-shallow": { 3091 | "version": "2.0.1", 3092 | "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", 3093 | "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", 3094 | "requires": { 3095 | "is-extendable": "0.1.1" 3096 | } 3097 | }, 3098 | "set-value": { 3099 | "version": "0.4.3", 3100 | "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", 3101 | "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", 3102 | "requires": { 3103 | "extend-shallow": "2.0.1", 3104 | "is-extendable": "0.1.1", 3105 | "is-plain-object": "2.0.4", 3106 | "to-object-path": "0.3.0" 3107 | } 3108 | } 3109 | } 3110 | }, 3111 | "universalify": { 3112 | "version": "0.1.1", 3113 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.1.tgz", 3114 | "integrity": "sha1-+nG63UQ3r0wUiEHjs7Fl+enlkLc=" 3115 | }, 3116 | "unpipe": { 3117 | "version": "1.0.0", 3118 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 3119 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 3120 | }, 3121 | "unset-value": { 3122 | "version": "1.0.0", 3123 | "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", 3124 | "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", 3125 | "requires": { 3126 | "has-value": "0.3.1", 3127 | "isobject": "3.0.1" 3128 | }, 3129 | "dependencies": { 3130 | "has-value": { 3131 | "version": "0.3.1", 3132 | "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", 3133 | "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", 3134 | "requires": { 3135 | "get-value": "2.0.6", 3136 | "has-values": "0.1.4", 3137 | "isobject": "2.1.0" 3138 | }, 3139 | "dependencies": { 3140 | "isobject": { 3141 | "version": "2.1.0", 3142 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", 3143 | "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", 3144 | "requires": { 3145 | "isarray": "1.0.0" 3146 | } 3147 | } 3148 | } 3149 | }, 3150 | "has-values": { 3151 | "version": "0.1.4", 3152 | "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", 3153 | "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" 3154 | } 3155 | } 3156 | }, 3157 | "upath": { 3158 | "version": "1.1.0", 3159 | "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", 3160 | "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==" 3161 | }, 3162 | "urix": { 3163 | "version": "0.1.0", 3164 | "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", 3165 | "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" 3166 | }, 3167 | "url": { 3168 | "version": "0.10.3", 3169 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", 3170 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", 3171 | "requires": { 3172 | "punycode": "1.3.2", 3173 | "querystring": "0.2.0" 3174 | } 3175 | }, 3176 | "use": { 3177 | "version": "3.1.0", 3178 | "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", 3179 | "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", 3180 | "requires": { 3181 | "kind-of": "6.0.2" 3182 | } 3183 | }, 3184 | "util-deprecate": { 3185 | "version": "1.0.2", 3186 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3187 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 3188 | }, 3189 | "utils-merge": { 3190 | "version": "1.0.1", 3191 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 3192 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 3193 | }, 3194 | "uuid": { 3195 | "version": "3.0.0", 3196 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", 3197 | "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" 3198 | }, 3199 | "validate-npm-package-license": { 3200 | "version": "3.0.3", 3201 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", 3202 | "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", 3203 | "requires": { 3204 | "spdx-correct": "3.0.0", 3205 | "spdx-expression-parse": "3.0.0" 3206 | } 3207 | }, 3208 | "vary": { 3209 | "version": "1.1.2", 3210 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 3211 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 3212 | }, 3213 | "verror": { 3214 | "version": "1.10.0", 3215 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 3216 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 3217 | "requires": { 3218 | "assert-plus": "1.0.0", 3219 | "core-util-is": "1.0.2", 3220 | "extsprintf": "1.3.0" 3221 | } 3222 | }, 3223 | "virtual-alexa": { 3224 | "version": "0.3.11", 3225 | "resolved": "https://registry.npmjs.org/virtual-alexa/-/virtual-alexa-0.3.11.tgz", 3226 | "integrity": "sha512-EUcROLSKA5xFi73AIOzyaqjMhg46ujmUXt4ds85zSq080PdrrPT46Jdki+Kn3roYyFOSGTq+85+5RYTYYPMtjQ==", 3227 | "requires": { 3228 | "@types/uuid": "3.4.3", 3229 | "uuid": "3.2.1" 3230 | }, 3231 | "dependencies": { 3232 | "uuid": { 3233 | "version": "3.2.1", 3234 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 3235 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 3236 | } 3237 | } 3238 | }, 3239 | "virtual-device-sdk": { 3240 | "version": "1.4.5", 3241 | "resolved": "https://registry.npmjs.org/virtual-device-sdk/-/virtual-device-sdk-1.4.5.tgz", 3242 | "integrity": "sha1-yiYsr1WyL9FFsZcE3Z7BegfrZFU=", 3243 | "requires": { 3244 | "chalk": "2.4.1", 3245 | "dotenv": "4.0.0" 3246 | } 3247 | }, 3248 | "winston": { 3249 | "version": "2.4.2", 3250 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.2.tgz", 3251 | "integrity": "sha512-4S/Ad4ZfSNl8OccCLxnJmNISWcm2joa6Q0YGDxlxMzH0fgSwWsjMt+SmlNwCqdpaPg3ev1HKkMBsIiXeSUwpbA==", 3252 | "requires": { 3253 | "async": "1.0.0", 3254 | "colors": "1.0.3", 3255 | "cycle": "1.0.3", 3256 | "eyes": "0.1.8", 3257 | "isstream": "0.1.2", 3258 | "stack-trace": "0.0.10" 3259 | }, 3260 | "dependencies": { 3261 | "async": { 3262 | "version": "1.0.0", 3263 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 3264 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 3265 | } 3266 | } 3267 | }, 3268 | "wrappy": { 3269 | "version": "1.0.2", 3270 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3271 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 3272 | "dev": true 3273 | }, 3274 | "xml2js": { 3275 | "version": "0.4.17", 3276 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", 3277 | "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", 3278 | "requires": { 3279 | "sax": "1.2.1", 3280 | "xmlbuilder": "4.2.1" 3281 | } 3282 | }, 3283 | "xmlbuilder": { 3284 | "version": "4.2.1", 3285 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", 3286 | "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", 3287 | "requires": { 3288 | "lodash": "4.17.10" 3289 | } 3290 | } 3291 | } 3292 | } 3293 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "serverless-plugin-bespoken", 3 | "description": "Serverless Plugin Bespoken", 4 | "version": "0.1.3", 5 | "license": "SEE LICENSE IN LICENSE", 6 | "main": "./lib/index.js", 7 | "scripts": { 8 | "build": "tsc", 9 | "preversion": "npm run build" 10 | }, 11 | "engines": { 12 | "node": ">=4.2.6" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "git+https://github.com/bespoken/serverless-plugin-bespoken.git" 17 | }, 18 | "dependencies": { 19 | "bespoken-tools": "^1.2.10", 20 | "chokidar": "^2.0.3", 21 | "fs-extra": "^6.0.1", 22 | "lodash": "^4.17.10", 23 | "source-map-support": "^0.5.6" 24 | }, 25 | "devDependencies": { 26 | "@types/chokidar": "^1.7.5", 27 | "@types/fs-extra": "^5.0.2", 28 | "@types/lodash": "^4.14.109", 29 | "@types/node": "^8.10.18", 30 | "mocha": "5.2.0", 31 | "typescript": "^2.9.1" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/ServerlessPluginBespoken.ts: -------------------------------------------------------------------------------- 1 | import { BSTProxy } from "bespoken-tools"; 2 | 3 | // TODO: investigate additions to bespoken-tools api to make this reaching into internal api's unecessary ...? 4 | import { Global } from "bespoken-tools/lib/core/global"; 5 | import { URLMangler } from "bespoken-tools/lib/client/url-mangler"; 6 | import { LoggingHelper } from "bespoken-tools/lib/core/logging-helper"; 7 | import { ModuleManager } from "bespoken-tools/lib/client/module-manager"; 8 | import { NodeUtil } from "bespoken-tools/lib/core/node-util"; 9 | 10 | import { homedir } from "os" 11 | 12 | import { 13 | outputFileSync, 14 | copySync, 15 | removeSync, 16 | writeJsonSync, 17 | ensureDirSync 18 | } from "fs-extra"; 19 | import { join } from "path"; 20 | import { watch } from "chokidar"; 21 | import { debounce } from "lodash"; 22 | 23 | /** 24 | * Monkey patch bespoken's NodeUtil.resetCache method to make it work with symlinks -- 25 | * Due to limitations of serverless project, symlinks are often needed to share code between stacks -- 26 | * allowing code reload to work with serverless projects that use symlinks is useful ... 27 | */ 28 | NodeUtil.resetCache = function () { 29 | // don't use a directory prefix when clearing require cache because the cache entry corresponds to 30 | // resolved filename -- if project uses symlinks the underlying file might be a path outside of project base directory 31 | // NOTE: this is true even if actual require(...) call refers to a path within project directory ... 32 | // let directory: string = process.cwd(); 33 | for (const file of Object.keys(require.cache)) { 34 | // if (file.startsWith(directory) && file.indexOf("node_modules") === -1) { 35 | if (file.indexOf("node_modules") === -1) { 36 | delete require.cache[require.resolve(file)]; 37 | } 38 | } 39 | }; 40 | 41 | /** 42 | Create a directory structure with passthru modules for each specified handler 43 | 44 | Example: 45 | buildPassThruModules(["foo/bar/baz.handler", "foo/bar/baz.otherhandler", "foo/been.handler"], "./someDirectory") 46 | Result: 47 | outputDirectory will contain files: 48 | - foo/bar/baz.js 49 | - foo/been.handler 50 | - node_modules/bespoken-lambda-passthru/index.js 51 | 52 | * @param handlers array of function path specifications as used in serverless/lambda -- example: ["foo/bar/baz.handler"] 53 | * @param outputDirectory directory into which passthru stubs will be written 54 | */ 55 | const buildPassThruModules = (handlers: string[], outputDirectory: string) => { 56 | let modulesWithHandlers: { [index: string]: string[] } = {}; 57 | 58 | for (const handler of handlers) { 59 | const [modulePath, handlerName] = handler.split("."); 60 | 61 | if (modulesWithHandlers[modulePath]) { 62 | modulesWithHandlers[modulePath].push(handlerName); 63 | } else { 64 | modulesWithHandlers[modulePath] = [handlerName]; 65 | } 66 | } 67 | 68 | for (const modulePath in modulesWithHandlers) { 69 | const handlerNames = modulesWithHandlers[modulePath]; 70 | // create a little shim which imports and re-exports the passthru handler with the correct handler name(s) 71 | const moduleContents = ` 72 | const passThruModule = require("bespoken-lambda-passthru") 73 | ${handlerNames.map(handlerName => { 74 | return `exports.${handlerName} = passThruModule.passThruHandler 75 | `; 76 | })} 77 | `; 78 | 79 | // then write the passthru stub module to filesystem 80 | outputFileSync(join(outputDirectory, `${modulePath}.js`), moduleContents); 81 | } 82 | 83 | // copy the passthru implementation into node_modules/ directory (so it can be required from the created module stubs) 84 | copySync( 85 | join(__dirname, "injected_node_modules"), 86 | join(outputDirectory, "node_modules") 87 | ); 88 | }; 89 | 90 | const mutateProcessEnvironmentVariables = (vars: any) => { 91 | for (const key in vars) { 92 | process.env[key] = vars[key]; 93 | } 94 | // filter out ridiculous number of npm_ env variables 95 | for (const key in process.env) { 96 | if (key.startsWith("npm_")) { 97 | delete process.env[key]; 98 | } 99 | } 100 | }; 101 | 102 | const extractHandlerObject = ( 103 | serverlessFunctions: any, 104 | specifiedFunction: string | undefined 105 | ) => { 106 | // We use the first function that provides a handler 107 | let sFunction; 108 | 109 | if (specifiedFunction) { 110 | sFunction = serverlessFunctions[specifiedFunction]; 111 | if (!sFunction || !sFunction.handler) { 112 | throw new Error("No available function found"); 113 | } 114 | } else { 115 | for (const key in serverlessFunctions) { 116 | // If the handler Function is specified only validate for it 117 | if (!serverlessFunctions[key].handler) { 118 | continue; 119 | } 120 | sFunction = serverlessFunctions[key]; 121 | break; 122 | } 123 | } 124 | 125 | if (!sFunction) { 126 | throw new Error("No available function found"); 127 | } 128 | 129 | return createFunctionObject(sFunction); 130 | }; 131 | 132 | const createFunctionObject = (serverlessFunction: { handler: string }) => { 133 | const splitHandler = serverlessFunction.handler.split("."); 134 | const file = splitHandler[0]; 135 | const exportedFunction = splitHandler[1]; 136 | return { 137 | file, 138 | exportedFunction 139 | }; 140 | }; 141 | 142 | type IServerlessPluginBespokenConfig = { 143 | ["serverless-plugin-bespoken"]?: { 144 | sourceID: string; 145 | secretKey: string; 146 | }; 147 | }; 148 | 149 | /** 150 | * Defines command: 151 | * - `serverless proxy` 152 | * Initiates connection to public bespoken proxy so requests to public url are forwarded to local machine and starts 153 | * a local server that responds to requests by dispatching to the appropriate lambda function. Can be started in 'single function' mode which will dispatch requests to a single specified lambda 154 | * or on ' 155 | * 156 | * 157 | * 158 | * - `serverless deploy --inject-passthru` 159 | * When --inject-passthru is passed on command line, the plugin will intercept the serverless package lifecycle and replace the deployed bundle with passthru lambda handlers 160 | * that forward requests to the bespoken proxy server (and subsequently back to developer machine) 161 | */ 162 | export class ServerlessPluginBespoken { 163 | private serverless: any; 164 | private options: any; 165 | private proxy!: BSTProxy; 166 | private originalServicePath!: string; 167 | private passThruServicePath!: string; 168 | 169 | private get pluginConfig(): IServerlessPluginBespokenConfig | null { 170 | const pluginConfig = this.serverless.service.custom[ 171 | "serverless-plugin-bespoken" 172 | ]; 173 | if (pluginConfig) { 174 | return pluginConfig; 175 | } 176 | return null; 177 | } 178 | 179 | private get selectedFunctionFromCommandLine(): string | undefined { 180 | return this.options.function; 181 | } 182 | 183 | private get injectPassThruOption(): string | undefined { 184 | return this.options["inject-passthru"]; 185 | } 186 | 187 | private get withPassThruRoutingOption(): string | undefined { 188 | return this.options["with-passthru-routing"]; 189 | } 190 | 191 | private get functionsFromServerlessConfig(): any { 192 | return this.serverless.service.functions; 193 | } 194 | 195 | private get environmentVariablesFromServerlessConfig(): object { 196 | const env = this.serverless.service.provider.environment; 197 | if (env) { 198 | this.serverless.cli.log( 199 | "Configuring environment variables from serverless config" 200 | ); 201 | } else { 202 | this.serverless.cli.log( 203 | "No Environment variables found in serverless config" 204 | ); 205 | } 206 | 207 | const envForLambdaProxy = { 208 | ...env, 209 | // add a variable to environment so its possible for lambda's to tell 210 | // they are running in the lambda proxy 211 | SERVERLESS_PLUGIN_BESPOKEN: "TRUE" 212 | } 213 | 214 | return envForLambdaProxy; 215 | } 216 | 217 | private get handlers(): string[] { 218 | const handlers = this.serverless.service.functions || {}; 219 | 220 | return Object.values(handlers).map((lambdaDefinition: any) => { 221 | return lambdaDefinition.handler; 222 | }); 223 | } 224 | 225 | /** 226 | * Enable security if --secure option specified or if in pass-thru routing mode. 227 | */ 228 | private get enableSecurity(): boolean { 229 | return ( 230 | !(this.options.secure == null) || 231 | !(this.withPassThruRoutingOption == null) 232 | ); 233 | } 234 | 235 | public commands = { 236 | proxy: { 237 | usage: "Plugin to call bespoken bst lambda service", 238 | lifecycleEvents: ["start"], 239 | options: { 240 | function: { 241 | usage: 242 | "Specify the function in your config that you want to use" + 243 | '(e.g. "--function myFunction" or "-f myFunction")', 244 | required: false, 245 | shortcut: "f" 246 | }, 247 | secure: { 248 | usage: 249 | "Make bespoken server to require that 'secure' token be specified -- used to reduce likelihood of arbitrary hosts contacting your service via the proxy server", 250 | required: false, 251 | shortcut: "s" 252 | }, 253 | "with-passthru-routing": { 254 | usage: 255 | "Configure local proxy server to route requests to lambda functions based on url. 'function' option is ignored if this option is specified. " + 256 | "This option would normally be enabled after deploying passthru's with `deploy-passthru`", 257 | required: false 258 | } 259 | } 260 | } 261 | }; 262 | 263 | public get hooks() { 264 | return { 265 | "proxy:start": this.proxyStart, 266 | "before:package:createDeploymentArtifacts": this.deployPassThru, 267 | "after:package:createDeploymentArtifacts": this.injectPassThruModules 268 | }; 269 | } 270 | 271 | constructor(serverless: any, options: any) { 272 | this.serverless = serverless; 273 | this.options = options; 274 | } 275 | 276 | loadBespokenPluginConfig = async () => { 277 | if (this.pluginConfig) { 278 | this.serverless.cli.log("Configuring bespoken to use parameters from serverless.yml") 279 | const directory = `${homedir()}/.bst` 280 | ensureDirSync(directory); 281 | writeJsonSync(`${directory}/config`, { 282 | ...this.pluginConfig, 283 | version: "1.0.7" 284 | }, { spaces: 2 }); 285 | } 286 | 287 | // parse the bespoken config 288 | await Global.loadConfig(); 289 | }; 290 | 291 | proxyStart = async () => { 292 | // create the bespoken config file if properties are specified in serverless config 293 | await this.loadBespokenPluginConfig(); 294 | 295 | // initialize the bespoken cli 296 | await Global.initializeCLI(); 297 | 298 | // enable verbose logging 299 | LoggingHelper.setVerbose(true); 300 | 301 | // ensure environment variables from serverless config are set 302 | mutateProcessEnvironmentVariables( 303 | this.environmentVariablesFromServerlessConfig 304 | ); 305 | 306 | // create the lambda proxy 307 | if (this.withPassThruRoutingOption == null) { 308 | // run local server in 'single function mode' -- all requests are dispatched to a single lambda specified either on command line or 309 | // by choosing first function from serverless config ... 310 | const handler = extractHandlerObject( 311 | this.functionsFromServerlessConfig, 312 | this.selectedFunctionFromCommandLine 313 | ); 314 | this.serverless.cli.log( 315 | `Server configured in single function mode.Requests will resolve via: ${ 316 | handler.file 317 | }: ${handler.exportedFunction}` 318 | ); 319 | this.proxy = BSTProxy.lambda(handler.file, handler.exportedFunction); 320 | } else { 321 | this.serverless.cli.log( 322 | "Server configured with passthru routing. Url of requests will be interpreted as serverless handler specifications and dispatched to lambda function based on filesystem path." 323 | ); 324 | // run local server in 'directory mode' -- requests are dispatched to appropriate lambda by mapping url to filesystem path 325 | this.proxy = BSTProxy.lambda(); 326 | } 327 | 328 | // enable secure mode if enabled 329 | if (this.enableSecurity) { 330 | this.proxy.activateSecurity(); 331 | } 332 | 333 | // start the lambda proxy 334 | this.proxy.start(async () => { 335 | // HACK: reach into proxy and grab the moduleManager instance 336 | const moduleManager = (this.proxy as any).lambdaServer 337 | .moduleManager as ModuleManager; 338 | 339 | // stop watching with watcher that uses node's fs.watch and use chokidar instead to allow for recursive symlink traversal 340 | (moduleManager as any).watcher.close(); 341 | 342 | const ignoreFunc = (filename: string) => { 343 | if (filename.indexOf("node_modules") !== -1) { 344 | return true; 345 | } else if (filename.endsWith("___")) { 346 | return true; 347 | } else if (filename.startsWith(".")) { 348 | return true; 349 | } 350 | return false; 351 | }; 352 | 353 | (moduleManager as any).watcher = watch(process.cwd(), { 354 | ignored: [ignoreFunc], 355 | followSymlinks: true 356 | }); 357 | 358 | (moduleManager as any).watcher.on( 359 | "all", 360 | debounce( 361 | function (this: ModuleManager) { 362 | LoggingHelper.info( 363 | "FileWatcher", 364 | "FS.Watch Event(s) Detected: Reloading project code." 365 | ); 366 | 367 | // reload project's modules after change events 368 | (this as any).modules = {}; 369 | (this as any).dirty = true; 370 | }.bind(moduleManager), 371 | 500 372 | ) 373 | ); 374 | 375 | if (this.enableSecurity) { 376 | this.serverless.cli.log("Bespoken proxy started in secure mode"); 377 | this.serverless.cli.log(process.cwd()); 378 | this.serverless.cli.log( 379 | "The public URL for accessing your local service" 380 | ); 381 | this.serverless.cli.log(""); 382 | 383 | this.serverless.cli.log( 384 | URLMangler.manglePipeToPath( 385 | Global.config().sourceID(), 386 | Global.config().secretKey() 387 | ) 388 | ); 389 | } else { 390 | this.serverless.cli.log( 391 | "Bespoken proxy started in publically accessible mode" 392 | ); 393 | this.serverless.cli.log(process.cwd()); 394 | this.serverless.cli.log( 395 | "The public URL for accessing your local service" 396 | ); 397 | this.serverless.cli.log(""); 398 | 399 | this.serverless.cli.log( 400 | URLMangler.manglePipeToPath(Global.config().sourceID()) 401 | ); 402 | } 403 | this.serverless.cli.log(""); 404 | this.serverless.cli.log( 405 | "The URL for viewing transaction history of requests/responses sent through the proxy service" 406 | ); 407 | this.serverless.cli.log(""); 408 | this.serverless.cli.log( 409 | URLMangler.mangleNoPath( 410 | Global.config().sourceID(), 411 | Global.config().secretKey() 412 | ) 413 | ); 414 | }); 415 | }; 416 | 417 | deployPassThru = async () => { 418 | await this.loadBespokenPluginConfig(); 419 | 420 | this.serverless.cli.log("cli options", this.options); 421 | 422 | // do nothing if inject-passthru not passed on command line 423 | if (!this.injectPassThruOption) { 424 | return; 425 | } 426 | 427 | this.serverless.cli.log( 428 | "Replacing lambda handlers with bespoken passthru functions" 429 | ); 430 | 431 | const bespokenProxyUrl = URLMangler.manglePipeToPath( 432 | Global.config().sourceID() 433 | ); 434 | 435 | const bespokenProxySecret = Global.config().secretKey(); 436 | 437 | // inject environment variables with necessary bespoken connection parameters into lambda environment 438 | this.mutateLambdaEnvironmentVariables({ 439 | bespoken_proxy_url: bespokenProxyUrl, 440 | bespoken_proxy_secret: bespokenProxySecret 441 | }); 442 | 443 | this.serverless.cli.log( 444 | `Pass through handlers will proxy requests to: ${bespokenProxyUrl}` 445 | ); 446 | 447 | const handlers = this.handlers; 448 | 449 | // save directory where serverless expects to look for source files 450 | this.originalServicePath = this.originalServicePath 451 | ? this.originalServicePath 452 | : this.serverless.config.servicePath; 453 | 454 | // tell serverless to instead look in this directory for files to package 455 | this.passThruServicePath = join(this.originalServicePath, ".passthru"); 456 | this.serverless.config.servicePath = this.passThruServicePath; 457 | 458 | // if some other packager has told serverless what functions to package ... -- undo their decision... 459 | const allFunctions = this.serverless.service.getAllFunctions(); 460 | 461 | for (const functionName of allFunctions) { 462 | const functionObject = this.serverless.service.getFunction(functionName); 463 | 464 | if (functionObject.package) { 465 | this.serverless.cli.log( 466 | `serverless - plugin - bespoken-- resetting packaging for function ${functionName}` 467 | ); 468 | functionObject.package = {}; 469 | } 470 | } 471 | 472 | this.serverless.cli.log( 473 | `Replace modules with pass thru handlers: ${handlers} ` 474 | ); 475 | 476 | buildPassThruModules(handlers, this.passThruServicePath); 477 | 478 | // tell the packager to include only our package contents 479 | this.serverless.service.package.include = ["*"]; 480 | }; 481 | 482 | injectPassThruModules = () => { 483 | // do nothing if inject-passthru not passed on command line 484 | if (!this.injectPassThruOption) { 485 | return; 486 | } 487 | 488 | // copy contents of 'faked' zip artificat service path 489 | copySync( 490 | join(this.passThruServicePath, ".serverless"), 491 | join(this.originalServicePath, ".serverless") 492 | ); 493 | 494 | removeSync(this.passThruServicePath); 495 | 496 | this.serverless.config.servicePath = this.originalServicePath; 497 | }; 498 | 499 | mutateLambdaEnvironmentVariables = (vars: any) => { 500 | for (const key in vars) { 501 | this.serverless.service.provider.environment[key] = vars[key]; 502 | } 503 | }; 504 | } 505 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | require("source-map-support").install(); 2 | var plugins = require("./ServerlessPluginBespoken"); 3 | module.exports = plugins.ServerlessPluginBespoken; 4 | -------------------------------------------------------------------------------- /src/injected_node_modules/bespoken-lambda-passthru/index.ts: -------------------------------------------------------------------------------- 1 | import * as https from "https"; 2 | import * as URLParser from "url"; 3 | 4 | const getProxyParametersFromEnvironmentVariables = () => { 5 | const url = process.env["bespoken_proxy_url"]; 6 | const proxy_secret = process.env["bespoken_proxy_secret"]; 7 | 8 | if (url == null) { 9 | throw Error("Missing expected environment variable: 'bespoken_proxy_url"); 10 | } 11 | 12 | if (proxy_secret == null) { 13 | throw Error( 14 | "Missing expected environment variable: 'bespoken_proxy_secret" 15 | ); 16 | } 17 | 18 | // get lambda handler path from environment variables -- _HANDLER appears to be injected into environment by something in AWS lambda? 19 | // TODO: confirm this isn't API gateway specific ... 20 | const lambdaHandler = process.env["_HANDLER"]; 21 | 22 | if (lambdaHandler == null) { 23 | throw Error("Missing expected environment variable: _HANDLER"); 24 | } 25 | 26 | return { 27 | url, 28 | handler: lambdaHandler, 29 | proxy_secret 30 | }; 31 | }; 32 | 33 | export const passThruHandler = (event: any, _: any, callback: any) => { 34 | try { 35 | console.log("Lambda invoked in passthru mode", event); 36 | 37 | const { 38 | url, 39 | handler, 40 | proxy_secret 41 | } = getProxyParametersFromEnvironmentVariables(); 42 | 43 | const parts = URLParser.parse(url); 44 | const post_data = JSON.stringify(event); 45 | 46 | // An object of options to indicate where to post to 47 | const post_options = { 48 | host: parts.hostname, 49 | port: parts.port || 443, 50 | path: `/${handler}`, 51 | method: "POST", 52 | headers: { 53 | "Content-Type": "application/json", 54 | "Content-Length": post_data.length, 55 | "bespoken-key": proxy_secret 56 | } 57 | }; 58 | 59 | console.log("proxying request:", post_options); 60 | 61 | // Initiate the request to the bespoken proxy endpoint 62 | const req = https.request(post_options, function(res) { 63 | var body = ""; 64 | // Data may be chunked 65 | res.on("data", function(chunk) { 66 | body += chunk; 67 | }); 68 | res.on("end", function() { 69 | // When data is done, finish the request 70 | callback(null, JSON.parse(body)); 71 | }); 72 | }); 73 | 74 | req.on("error", function(e) { 75 | callback("problem with request: " + e.message); 76 | }); 77 | 78 | // Send the JSON data 79 | req.write(post_data); 80 | req.end(); 81 | } catch (e) { 82 | callback("Exception: " + e); 83 | } 84 | }; 85 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compileOnSave": true, 3 | "compilerOptions": { 4 | "rootDir": "./src", 5 | "outDir": "./lib", 6 | "lib": ["es2017", "esnext.asynciterable"], 7 | "strict": true, 8 | "strictNullChecks": true, 9 | "noImplicitAny": true, 10 | "noImplicitThis": true, 11 | "alwaysStrict": true, 12 | "noUnusedLocals": true, 13 | "noUnusedParameters": true, 14 | "noImplicitReturns": true, 15 | "noFallthroughCasesInSwitch": true, 16 | "module": "commonjs", 17 | "target": "es2015", 18 | "allowJs": true, 19 | "experimentalDecorators": true, 20 | "sourceMap": true, 21 | "forceConsistentCasingInFileNames": true 22 | }, 23 | "include": ["./src/**/*"] 24 | } 25 | --------------------------------------------------------------------------------