├── .idea
└── workspace.xml
├── README.md
└── user-service
├── .gitignore
├── .idea
├── misc.xml
├── modules.xml
├── user-service.iml
├── vcs.xml
└── workspace.xml
├── handler.js
├── package-lock.json
├── package.json
├── serverless.yml
├── src
├── functions
│ ├── createUser.js
│ ├── login.js
│ └── validate.js
├── schema
│ ├── create_user_request.json
│ └── login_request.json
└── tests
│ ├── createUser.js
│ ├── loginUser.js
│ └── validate.js
└── templates
├── function-template.ejs
└── test-template.ejs
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 | 1580294662575
52 |
53 |
54 | 1580294662575
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | **📦 Archived - This repository is archived and preserved for reference only. No updates, issues, or pull requests will be accepted. If you have questions, please reach out to our support team.**
2 |
3 | ---
4 |
--------------------------------------------------------------------------------
/user-service/.gitignore:
--------------------------------------------------------------------------------
1 | # package directories
2 | node_modules
3 | jspm_packages
4 |
5 | # Serverless directories
6 | .serverless
--------------------------------------------------------------------------------
/user-service/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/user-service/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/user-service/.idea/user-service.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/user-service/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/user-service/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 | 1583590292489
43 |
44 |
45 | 1583590292489
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
--------------------------------------------------------------------------------
/user-service/handler.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports.hello = async event => {
4 | return {
5 | statusCode: 200,
6 | body: JSON.stringify(
7 | {
8 | message: 'Go Serverless v1.0! Your function executed successfully!',
9 | input: event,
10 | },
11 | null,
12 | 2
13 | ),
14 | };
15 |
16 | // Use this code if you don't use the http event with the LAMBDA-PROXY integration
17 | // return { message: 'Go Serverless v1.0! Your function executed successfully!', event };
18 | };
19 |
--------------------------------------------------------------------------------
/user-service/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "service-template",
3 | "version": "0.1.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@sinonjs/commons": {
8 | "version": "1.7.1",
9 | "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz",
10 | "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==",
11 | "dev": true,
12 | "requires": {
13 | "type-detect": "4.0.8"
14 | }
15 | },
16 | "@sinonjs/formatio": {
17 | "version": "4.0.1",
18 | "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-4.0.1.tgz",
19 | "integrity": "sha512-asIdlLFrla/WZybhm0C8eEzaDNNrzymiTqHMeJl6zPW2881l3uuVRpm0QlRQEjqYWv6CcKMGYME3LbrLJsORBw==",
20 | "dev": true,
21 | "requires": {
22 | "@sinonjs/commons": "^1",
23 | "@sinonjs/samsam": "^4.2.0"
24 | }
25 | },
26 | "@sinonjs/samsam": {
27 | "version": "4.2.2",
28 | "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-4.2.2.tgz",
29 | "integrity": "sha512-z9o4LZUzSD9Hl22zV38aXNykgFeVj8acqfFabCY6FY83n/6s/XwNJyYYldz6/9lBJanpno9h+oL6HTISkviweA==",
30 | "dev": true,
31 | "requires": {
32 | "@sinonjs/commons": "^1.6.0",
33 | "lodash.get": "^4.4.2",
34 | "type-detect": "^4.0.8"
35 | }
36 | },
37 | "@sinonjs/text-encoding": {
38 | "version": "0.7.1",
39 | "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz",
40 | "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==",
41 | "dev": true
42 | },
43 | "ansi-colors": {
44 | "version": "3.2.3",
45 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
46 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
47 | "dev": true
48 | },
49 | "ansi-regex": {
50 | "version": "3.0.0",
51 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
52 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
53 | "dev": true
54 | },
55 | "ansi-styles": {
56 | "version": "3.2.1",
57 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
58 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
59 | "dev": true,
60 | "requires": {
61 | "color-convert": "^1.9.0"
62 | }
63 | },
64 | "argparse": {
65 | "version": "1.0.10",
66 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
67 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
68 | "dev": true,
69 | "requires": {
70 | "sprintf-js": "~1.0.2"
71 | }
72 | },
73 | "assertion-error": {
74 | "version": "1.1.0",
75 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
76 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
77 | "dev": true
78 | },
79 | "aws-sdk": {
80 | "version": "2.635.0",
81 | "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.635.0.tgz",
82 | "integrity": "sha512-NlKqMB4HqMqSutY6YmPzQVa+mMhqo0655hYYl8G2zkUvrYy+YxDitvwDEUkSsNKVFkEvmHtZggFCgVYIUu/sXg==",
83 | "dev": true,
84 | "requires": {
85 | "buffer": "4.9.1",
86 | "events": "1.1.1",
87 | "ieee754": "1.1.13",
88 | "jmespath": "0.15.0",
89 | "querystring": "0.2.0",
90 | "sax": "1.2.1",
91 | "url": "0.10.3",
92 | "uuid": "3.3.2",
93 | "xml2js": "0.4.19"
94 | }
95 | },
96 | "aws-sdk-mock": {
97 | "version": "5.0.0",
98 | "resolved": "https://registry.npmjs.org/aws-sdk-mock/-/aws-sdk-mock-5.0.0.tgz",
99 | "integrity": "sha512-8vSdiRj4dEu3z4kkmIqHhP5Wrfiucgu0PaZxuT3KDSpuQIHMtw/SsuRsREkDQRBdkMtBg4BuddLZA8pWOs6QmQ==",
100 | "dev": true,
101 | "requires": {
102 | "aws-sdk": "^2.596.0",
103 | "sinon": "^8.0.1",
104 | "traverse": "^0.6.6"
105 | }
106 | },
107 | "balanced-match": {
108 | "version": "1.0.0",
109 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
110 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
111 | "dev": true
112 | },
113 | "base64-js": {
114 | "version": "1.3.1",
115 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
116 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
117 | "dev": true
118 | },
119 | "bcryptjs": {
120 | "version": "2.4.3",
121 | "resolved": "https://registry.npmjs.org/bcryptjs/-/bcryptjs-2.4.3.tgz",
122 | "integrity": "sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms="
123 | },
124 | "bluebird": {
125 | "version": "3.7.2",
126 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
127 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
128 | "dev": true
129 | },
130 | "brace-expansion": {
131 | "version": "1.1.11",
132 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
133 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
134 | "dev": true,
135 | "requires": {
136 | "balanced-match": "^1.0.0",
137 | "concat-map": "0.0.1"
138 | }
139 | },
140 | "browser-stdout": {
141 | "version": "1.3.1",
142 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
143 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
144 | "dev": true
145 | },
146 | "buffer": {
147 | "version": "4.9.1",
148 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz",
149 | "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=",
150 | "dev": true,
151 | "requires": {
152 | "base64-js": "^1.0.2",
153 | "ieee754": "^1.1.4",
154 | "isarray": "^1.0.0"
155 | }
156 | },
157 | "buffer-equal-constant-time": {
158 | "version": "1.0.1",
159 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
160 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
161 | },
162 | "camelcase": {
163 | "version": "5.3.1",
164 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
165 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
166 | "dev": true
167 | },
168 | "chai": {
169 | "version": "4.2.0",
170 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
171 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
172 | "dev": true,
173 | "requires": {
174 | "assertion-error": "^1.1.0",
175 | "check-error": "^1.0.2",
176 | "deep-eql": "^3.0.1",
177 | "get-func-name": "^2.0.0",
178 | "pathval": "^1.1.0",
179 | "type-detect": "^4.0.5"
180 | }
181 | },
182 | "chalk": {
183 | "version": "2.4.2",
184 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
185 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
186 | "dev": true,
187 | "requires": {
188 | "ansi-styles": "^3.2.1",
189 | "escape-string-regexp": "^1.0.5",
190 | "supports-color": "^5.3.0"
191 | },
192 | "dependencies": {
193 | "supports-color": {
194 | "version": "5.5.0",
195 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
196 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
197 | "dev": true,
198 | "requires": {
199 | "has-flag": "^3.0.0"
200 | }
201 | }
202 | }
203 | },
204 | "check-error": {
205 | "version": "1.0.2",
206 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
207 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
208 | "dev": true
209 | },
210 | "cliui": {
211 | "version": "5.0.0",
212 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
213 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
214 | "dev": true,
215 | "requires": {
216 | "string-width": "^3.1.0",
217 | "strip-ansi": "^5.2.0",
218 | "wrap-ansi": "^5.1.0"
219 | },
220 | "dependencies": {
221 | "ansi-regex": {
222 | "version": "4.1.0",
223 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
224 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
225 | "dev": true
226 | },
227 | "string-width": {
228 | "version": "3.1.0",
229 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
230 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
231 | "dev": true,
232 | "requires": {
233 | "emoji-regex": "^7.0.1",
234 | "is-fullwidth-code-point": "^2.0.0",
235 | "strip-ansi": "^5.1.0"
236 | }
237 | },
238 | "strip-ansi": {
239 | "version": "5.2.0",
240 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
241 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
242 | "dev": true,
243 | "requires": {
244 | "ansi-regex": "^4.1.0"
245 | }
246 | }
247 | }
248 | },
249 | "color-convert": {
250 | "version": "1.9.3",
251 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
252 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
253 | "dev": true,
254 | "requires": {
255 | "color-name": "1.1.3"
256 | }
257 | },
258 | "color-name": {
259 | "version": "1.1.3",
260 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
261 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
262 | "dev": true
263 | },
264 | "concat-map": {
265 | "version": "0.0.1",
266 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
267 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
268 | "dev": true
269 | },
270 | "debug": {
271 | "version": "3.2.6",
272 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
273 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
274 | "dev": true,
275 | "requires": {
276 | "ms": "^2.1.1"
277 | }
278 | },
279 | "decamelize": {
280 | "version": "1.2.0",
281 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
282 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
283 | "dev": true
284 | },
285 | "deep-eql": {
286 | "version": "3.0.1",
287 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
288 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
289 | "dev": true,
290 | "requires": {
291 | "type-detect": "^4.0.0"
292 | }
293 | },
294 | "define-properties": {
295 | "version": "1.1.3",
296 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
297 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
298 | "dev": true,
299 | "requires": {
300 | "object-keys": "^1.0.12"
301 | }
302 | },
303 | "delayed-stream": {
304 | "version": "1.0.0",
305 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
306 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
307 | "dev": true
308 | },
309 | "diff": {
310 | "version": "3.5.0",
311 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
312 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
313 | "dev": true
314 | },
315 | "ecdsa-sig-formatter": {
316 | "version": "1.0.11",
317 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
318 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
319 | "requires": {
320 | "safe-buffer": "^5.0.1"
321 | }
322 | },
323 | "ejs": {
324 | "version": "2.7.4",
325 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz",
326 | "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==",
327 | "dev": true
328 | },
329 | "emoji-regex": {
330 | "version": "7.0.3",
331 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
332 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
333 | "dev": true
334 | },
335 | "es-abstract": {
336 | "version": "1.17.4",
337 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
338 | "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
339 | "dev": true,
340 | "requires": {
341 | "es-to-primitive": "^1.2.1",
342 | "function-bind": "^1.1.1",
343 | "has": "^1.0.3",
344 | "has-symbols": "^1.0.1",
345 | "is-callable": "^1.1.5",
346 | "is-regex": "^1.0.5",
347 | "object-inspect": "^1.7.0",
348 | "object-keys": "^1.1.1",
349 | "object.assign": "^4.1.0",
350 | "string.prototype.trimleft": "^2.1.1",
351 | "string.prototype.trimright": "^2.1.1"
352 | }
353 | },
354 | "es-to-primitive": {
355 | "version": "1.2.1",
356 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
357 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
358 | "dev": true,
359 | "requires": {
360 | "is-callable": "^1.1.4",
361 | "is-date-object": "^1.0.1",
362 | "is-symbol": "^1.0.2"
363 | }
364 | },
365 | "escape-string-regexp": {
366 | "version": "1.0.5",
367 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
368 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
369 | "dev": true
370 | },
371 | "esprima": {
372 | "version": "4.0.1",
373 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
374 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
375 | "dev": true
376 | },
377 | "events": {
378 | "version": "1.1.1",
379 | "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz",
380 | "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=",
381 | "dev": true
382 | },
383 | "find-up": {
384 | "version": "3.0.0",
385 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
386 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
387 | "dev": true,
388 | "requires": {
389 | "locate-path": "^3.0.0"
390 | }
391 | },
392 | "flat": {
393 | "version": "4.1.0",
394 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
395 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
396 | "dev": true,
397 | "requires": {
398 | "is-buffer": "~2.0.3"
399 | }
400 | },
401 | "fs-extra": {
402 | "version": "8.1.0",
403 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz",
404 | "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==",
405 | "dev": true,
406 | "requires": {
407 | "graceful-fs": "^4.2.0",
408 | "jsonfile": "^4.0.0",
409 | "universalify": "^0.1.0"
410 | }
411 | },
412 | "fs.realpath": {
413 | "version": "1.0.0",
414 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
415 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
416 | "dev": true
417 | },
418 | "function-bind": {
419 | "version": "1.1.1",
420 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
421 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
422 | "dev": true
423 | },
424 | "get-caller-file": {
425 | "version": "2.0.5",
426 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
427 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
428 | "dev": true
429 | },
430 | "get-func-name": {
431 | "version": "2.0.0",
432 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
433 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
434 | "dev": true
435 | },
436 | "glob": {
437 | "version": "7.1.3",
438 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
439 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
440 | "dev": true,
441 | "requires": {
442 | "fs.realpath": "^1.0.0",
443 | "inflight": "^1.0.4",
444 | "inherits": "2",
445 | "minimatch": "^3.0.4",
446 | "once": "^1.3.0",
447 | "path-is-absolute": "^1.0.0"
448 | }
449 | },
450 | "graceful-fs": {
451 | "version": "4.2.3",
452 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
453 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
454 | "dev": true
455 | },
456 | "growl": {
457 | "version": "1.10.5",
458 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
459 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
460 | "dev": true
461 | },
462 | "has": {
463 | "version": "1.0.3",
464 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
465 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
466 | "dev": true,
467 | "requires": {
468 | "function-bind": "^1.1.1"
469 | }
470 | },
471 | "has-flag": {
472 | "version": "3.0.0",
473 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
474 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
475 | "dev": true
476 | },
477 | "has-symbols": {
478 | "version": "1.0.1",
479 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
480 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
481 | "dev": true
482 | },
483 | "he": {
484 | "version": "1.2.0",
485 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
486 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
487 | "dev": true
488 | },
489 | "ieee754": {
490 | "version": "1.1.13",
491 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
492 | "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
493 | "dev": true
494 | },
495 | "inflight": {
496 | "version": "1.0.6",
497 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
498 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
499 | "dev": true,
500 | "requires": {
501 | "once": "^1.3.0",
502 | "wrappy": "1"
503 | }
504 | },
505 | "inherits": {
506 | "version": "2.0.4",
507 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
508 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
509 | "dev": true
510 | },
511 | "is-buffer": {
512 | "version": "2.0.4",
513 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
514 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
515 | "dev": true
516 | },
517 | "is-callable": {
518 | "version": "1.1.5",
519 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
520 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
521 | "dev": true
522 | },
523 | "is-date-object": {
524 | "version": "1.0.2",
525 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
526 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
527 | "dev": true
528 | },
529 | "is-fullwidth-code-point": {
530 | "version": "2.0.0",
531 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
532 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
533 | "dev": true
534 | },
535 | "is-regex": {
536 | "version": "1.0.5",
537 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
538 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
539 | "dev": true,
540 | "requires": {
541 | "has": "^1.0.3"
542 | }
543 | },
544 | "is-symbol": {
545 | "version": "1.0.3",
546 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
547 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
548 | "dev": true,
549 | "requires": {
550 | "has-symbols": "^1.0.1"
551 | }
552 | },
553 | "isarray": {
554 | "version": "1.0.0",
555 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
556 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
557 | "dev": true
558 | },
559 | "isexe": {
560 | "version": "2.0.0",
561 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
562 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
563 | "dev": true
564 | },
565 | "jmespath": {
566 | "version": "0.15.0",
567 | "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz",
568 | "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=",
569 | "dev": true
570 | },
571 | "js-yaml": {
572 | "version": "3.13.1",
573 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
574 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
575 | "dev": true,
576 | "requires": {
577 | "argparse": "^1.0.7",
578 | "esprima": "^4.0.0"
579 | }
580 | },
581 | "jsonfile": {
582 | "version": "4.0.0",
583 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
584 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
585 | "dev": true,
586 | "requires": {
587 | "graceful-fs": "^4.1.6"
588 | }
589 | },
590 | "jsonwebtoken": {
591 | "version": "8.5.1",
592 | "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
593 | "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
594 | "requires": {
595 | "jws": "^3.2.2",
596 | "lodash.includes": "^4.3.0",
597 | "lodash.isboolean": "^3.0.3",
598 | "lodash.isinteger": "^4.0.4",
599 | "lodash.isnumber": "^3.0.3",
600 | "lodash.isplainobject": "^4.0.6",
601 | "lodash.isstring": "^4.0.1",
602 | "lodash.once": "^4.0.0",
603 | "ms": "^2.1.1",
604 | "semver": "^5.6.0"
605 | }
606 | },
607 | "just-extend": {
608 | "version": "4.1.0",
609 | "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz",
610 | "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==",
611 | "dev": true
612 | },
613 | "jwa": {
614 | "version": "1.4.1",
615 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
616 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
617 | "requires": {
618 | "buffer-equal-constant-time": "1.0.1",
619 | "ecdsa-sig-formatter": "1.0.11",
620 | "safe-buffer": "^5.0.1"
621 | }
622 | },
623 | "jws": {
624 | "version": "3.2.2",
625 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
626 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
627 | "requires": {
628 | "jwa": "^1.4.1",
629 | "safe-buffer": "^5.0.1"
630 | }
631 | },
632 | "lambda-wrapper": {
633 | "version": "0.3.0",
634 | "resolved": "https://registry.npmjs.org/lambda-wrapper/-/lambda-wrapper-0.3.0.tgz",
635 | "integrity": "sha512-BgXMXlbREkUg4d8HaKA35KE16WLxgHeZ1zfOFineCJU7QncmTLVsRvrk67Jyz90Ds5yIMuO6JZn8X5KRSkSneA==",
636 | "dev": true,
637 | "requires": {
638 | "aws-sdk": "^2.4.0"
639 | }
640 | },
641 | "locate-path": {
642 | "version": "3.0.0",
643 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
644 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
645 | "dev": true,
646 | "requires": {
647 | "p-locate": "^3.0.0",
648 | "path-exists": "^3.0.0"
649 | }
650 | },
651 | "lodash": {
652 | "version": "4.17.15",
653 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
654 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
655 | "dev": true
656 | },
657 | "lodash.get": {
658 | "version": "4.4.2",
659 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
660 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=",
661 | "dev": true
662 | },
663 | "lodash.includes": {
664 | "version": "4.3.0",
665 | "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
666 | "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
667 | },
668 | "lodash.isboolean": {
669 | "version": "3.0.3",
670 | "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
671 | "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
672 | },
673 | "lodash.isinteger": {
674 | "version": "4.0.4",
675 | "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
676 | "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
677 | },
678 | "lodash.isnumber": {
679 | "version": "3.0.3",
680 | "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
681 | "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
682 | },
683 | "lodash.isplainobject": {
684 | "version": "4.0.6",
685 | "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
686 | "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
687 | },
688 | "lodash.isstring": {
689 | "version": "4.0.1",
690 | "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
691 | "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
692 | },
693 | "lodash.once": {
694 | "version": "4.1.1",
695 | "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
696 | "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
697 | },
698 | "log-symbols": {
699 | "version": "2.2.0",
700 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
701 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
702 | "dev": true,
703 | "requires": {
704 | "chalk": "^2.0.1"
705 | }
706 | },
707 | "lolex": {
708 | "version": "5.1.2",
709 | "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz",
710 | "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==",
711 | "dev": true,
712 | "requires": {
713 | "@sinonjs/commons": "^1.7.0"
714 | }
715 | },
716 | "minimatch": {
717 | "version": "3.0.4",
718 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
719 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
720 | "dev": true,
721 | "requires": {
722 | "brace-expansion": "^1.1.7"
723 | }
724 | },
725 | "minimist": {
726 | "version": "0.0.8",
727 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
728 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
729 | "dev": true
730 | },
731 | "mkdirp": {
732 | "version": "0.5.1",
733 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
734 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
735 | "dev": true,
736 | "requires": {
737 | "minimist": "0.0.8"
738 | }
739 | },
740 | "mocha": {
741 | "version": "6.2.2",
742 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz",
743 | "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==",
744 | "dev": true,
745 | "requires": {
746 | "ansi-colors": "3.2.3",
747 | "browser-stdout": "1.3.1",
748 | "debug": "3.2.6",
749 | "diff": "3.5.0",
750 | "escape-string-regexp": "1.0.5",
751 | "find-up": "3.0.0",
752 | "glob": "7.1.3",
753 | "growl": "1.10.5",
754 | "he": "1.2.0",
755 | "js-yaml": "3.13.1",
756 | "log-symbols": "2.2.0",
757 | "minimatch": "3.0.4",
758 | "mkdirp": "0.5.1",
759 | "ms": "2.1.1",
760 | "node-environment-flags": "1.0.5",
761 | "object.assign": "4.1.0",
762 | "strip-json-comments": "2.0.1",
763 | "supports-color": "6.0.0",
764 | "which": "1.3.1",
765 | "wide-align": "1.1.3",
766 | "yargs": "13.3.0",
767 | "yargs-parser": "13.1.1",
768 | "yargs-unparser": "1.6.0"
769 | }
770 | },
771 | "ms": {
772 | "version": "2.1.1",
773 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
774 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
775 | },
776 | "nise": {
777 | "version": "3.0.1",
778 | "resolved": "https://registry.npmjs.org/nise/-/nise-3.0.1.tgz",
779 | "integrity": "sha512-fYcH9y0drBGSoi88kvhpbZEsenX58Yr+wOJ4/Mi1K4cy+iGP/a73gNoyNhu5E9QxPdgTlVChfIaAlnyOy/gHUA==",
780 | "dev": true,
781 | "requires": {
782 | "@sinonjs/commons": "^1.7.0",
783 | "@sinonjs/formatio": "^4.0.1",
784 | "@sinonjs/text-encoding": "^0.7.1",
785 | "just-extend": "^4.0.2",
786 | "lolex": "^5.0.1",
787 | "path-to-regexp": "^1.7.0"
788 | }
789 | },
790 | "node-environment-flags": {
791 | "version": "1.0.5",
792 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
793 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
794 | "dev": true,
795 | "requires": {
796 | "object.getownpropertydescriptors": "^2.0.3",
797 | "semver": "^5.7.0"
798 | }
799 | },
800 | "object-inspect": {
801 | "version": "1.7.0",
802 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
803 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
804 | "dev": true
805 | },
806 | "object-keys": {
807 | "version": "1.1.1",
808 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
809 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
810 | "dev": true
811 | },
812 | "object.assign": {
813 | "version": "4.1.0",
814 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
815 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
816 | "dev": true,
817 | "requires": {
818 | "define-properties": "^1.1.2",
819 | "function-bind": "^1.1.1",
820 | "has-symbols": "^1.0.0",
821 | "object-keys": "^1.0.11"
822 | }
823 | },
824 | "object.getownpropertydescriptors": {
825 | "version": "2.1.0",
826 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
827 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
828 | "dev": true,
829 | "requires": {
830 | "define-properties": "^1.1.3",
831 | "es-abstract": "^1.17.0-next.1"
832 | }
833 | },
834 | "once": {
835 | "version": "1.4.0",
836 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
837 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
838 | "dev": true,
839 | "requires": {
840 | "wrappy": "1"
841 | }
842 | },
843 | "p-limit": {
844 | "version": "2.2.2",
845 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
846 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
847 | "dev": true,
848 | "requires": {
849 | "p-try": "^2.0.0"
850 | }
851 | },
852 | "p-locate": {
853 | "version": "3.0.0",
854 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
855 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
856 | "dev": true,
857 | "requires": {
858 | "p-limit": "^2.0.0"
859 | }
860 | },
861 | "p-try": {
862 | "version": "2.2.0",
863 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
864 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
865 | "dev": true
866 | },
867 | "path-exists": {
868 | "version": "3.0.0",
869 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
870 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
871 | "dev": true
872 | },
873 | "path-is-absolute": {
874 | "version": "1.0.1",
875 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
876 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
877 | "dev": true
878 | },
879 | "path-to-regexp": {
880 | "version": "1.8.0",
881 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
882 | "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
883 | "dev": true,
884 | "requires": {
885 | "isarray": "0.0.1"
886 | },
887 | "dependencies": {
888 | "isarray": {
889 | "version": "0.0.1",
890 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
891 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
892 | "dev": true
893 | }
894 | }
895 | },
896 | "pathval": {
897 | "version": "1.1.0",
898 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
899 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
900 | "dev": true
901 | },
902 | "punycode": {
903 | "version": "1.3.2",
904 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
905 | "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
906 | "dev": true
907 | },
908 | "querystring": {
909 | "version": "0.2.0",
910 | "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
911 | "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
912 | "dev": true
913 | },
914 | "require-directory": {
915 | "version": "2.1.1",
916 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
917 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
918 | "dev": true
919 | },
920 | "require-main-filename": {
921 | "version": "2.0.0",
922 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
923 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
924 | "dev": true
925 | },
926 | "safe-buffer": {
927 | "version": "5.2.0",
928 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
929 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
930 | },
931 | "sax": {
932 | "version": "1.2.1",
933 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz",
934 | "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=",
935 | "dev": true
936 | },
937 | "semver": {
938 | "version": "5.7.1",
939 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
940 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
941 | },
942 | "serverless-mocha": {
943 | "version": "1.12.0",
944 | "resolved": "https://registry.npmjs.org/serverless-mocha/-/serverless-mocha-1.12.0.tgz",
945 | "integrity": "sha512-TSbQ4SawC7ctLRs/QKv3phYvQVeraK+zQQmM9oBX97d+bOKOkAmdiEpRn+/OlaBbbJq85Ocxxd/U/5vzFIm9dA==",
946 | "dev": true,
947 | "requires": {
948 | "aws-sdk": "^2.491.0",
949 | "bluebird": "^3.5.5",
950 | "chai": "^4.2.0",
951 | "delayed-stream": "^1.0.0",
952 | "ejs": "^2.6.2",
953 | "fs-extra": "^8.1.0",
954 | "lambda-wrapper": "^0.3.0",
955 | "mocha": "^6.1.4",
956 | "yaml-edit": "^0.1.3"
957 | }
958 | },
959 | "serverless-pseudo-parameters": {
960 | "version": "2.5.0",
961 | "resolved": "https://registry.npmjs.org/serverless-pseudo-parameters/-/serverless-pseudo-parameters-2.5.0.tgz",
962 | "integrity": "sha512-A/O49AR8LL6jlnPSmnOTYgL1KqVgskeRla4sVDeS/r5dHFJlwOU5MgFilc7aaQP8NWAwRJANaIS9oiSE3I+VUA==",
963 | "dev": true
964 | },
965 | "set-blocking": {
966 | "version": "2.0.0",
967 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
968 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
969 | "dev": true
970 | },
971 | "sinon": {
972 | "version": "8.1.1",
973 | "resolved": "https://registry.npmjs.org/sinon/-/sinon-8.1.1.tgz",
974 | "integrity": "sha512-E+tWr3acRdoe1nXbHMu86SSqA1WGM7Yw3jZRLvlCMnXwTHP8lgFFVn5BnKnF26uc5SfZ3D7pA9sN7S3Y2jG4Ew==",
975 | "dev": true,
976 | "requires": {
977 | "@sinonjs/commons": "^1.7.0",
978 | "@sinonjs/formatio": "^4.0.1",
979 | "@sinonjs/samsam": "^4.2.2",
980 | "diff": "^4.0.2",
981 | "lolex": "^5.1.2",
982 | "nise": "^3.0.1",
983 | "supports-color": "^7.1.0"
984 | },
985 | "dependencies": {
986 | "diff": {
987 | "version": "4.0.2",
988 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
989 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
990 | "dev": true
991 | },
992 | "has-flag": {
993 | "version": "4.0.0",
994 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
995 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
996 | "dev": true
997 | },
998 | "supports-color": {
999 | "version": "7.1.0",
1000 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
1001 | "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
1002 | "dev": true,
1003 | "requires": {
1004 | "has-flag": "^4.0.0"
1005 | }
1006 | }
1007 | }
1008 | },
1009 | "sprintf-js": {
1010 | "version": "1.0.3",
1011 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1012 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1013 | "dev": true
1014 | },
1015 | "string-width": {
1016 | "version": "2.1.1",
1017 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1018 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1019 | "dev": true,
1020 | "requires": {
1021 | "is-fullwidth-code-point": "^2.0.0",
1022 | "strip-ansi": "^4.0.0"
1023 | }
1024 | },
1025 | "string.prototype.trimleft": {
1026 | "version": "2.1.1",
1027 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
1028 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
1029 | "dev": true,
1030 | "requires": {
1031 | "define-properties": "^1.1.3",
1032 | "function-bind": "^1.1.1"
1033 | }
1034 | },
1035 | "string.prototype.trimright": {
1036 | "version": "2.1.1",
1037 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
1038 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
1039 | "dev": true,
1040 | "requires": {
1041 | "define-properties": "^1.1.3",
1042 | "function-bind": "^1.1.1"
1043 | }
1044 | },
1045 | "strip-ansi": {
1046 | "version": "4.0.0",
1047 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1048 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1049 | "dev": true,
1050 | "requires": {
1051 | "ansi-regex": "^3.0.0"
1052 | }
1053 | },
1054 | "strip-json-comments": {
1055 | "version": "2.0.1",
1056 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1057 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1058 | "dev": true
1059 | },
1060 | "supports-color": {
1061 | "version": "6.0.0",
1062 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
1063 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
1064 | "dev": true,
1065 | "requires": {
1066 | "has-flag": "^3.0.0"
1067 | }
1068 | },
1069 | "traverse": {
1070 | "version": "0.6.6",
1071 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.6.tgz",
1072 | "integrity": "sha1-y99WD9e5r2MlAv7UD5GMFX6pcTc=",
1073 | "dev": true
1074 | },
1075 | "type-detect": {
1076 | "version": "4.0.8",
1077 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
1078 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
1079 | "dev": true
1080 | },
1081 | "universalify": {
1082 | "version": "0.1.2",
1083 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1084 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1085 | "dev": true
1086 | },
1087 | "url": {
1088 | "version": "0.10.3",
1089 | "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz",
1090 | "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=",
1091 | "dev": true,
1092 | "requires": {
1093 | "punycode": "1.3.2",
1094 | "querystring": "0.2.0"
1095 | }
1096 | },
1097 | "uuid": {
1098 | "version": "3.3.2",
1099 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1100 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
1101 | "dev": true
1102 | },
1103 | "which": {
1104 | "version": "1.3.1",
1105 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1106 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1107 | "dev": true,
1108 | "requires": {
1109 | "isexe": "^2.0.0"
1110 | }
1111 | },
1112 | "which-module": {
1113 | "version": "2.0.0",
1114 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
1115 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
1116 | "dev": true
1117 | },
1118 | "wide-align": {
1119 | "version": "1.1.3",
1120 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
1121 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
1122 | "dev": true,
1123 | "requires": {
1124 | "string-width": "^1.0.2 || 2"
1125 | }
1126 | },
1127 | "wrap-ansi": {
1128 | "version": "5.1.0",
1129 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
1130 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
1131 | "dev": true,
1132 | "requires": {
1133 | "ansi-styles": "^3.2.0",
1134 | "string-width": "^3.0.0",
1135 | "strip-ansi": "^5.0.0"
1136 | },
1137 | "dependencies": {
1138 | "ansi-regex": {
1139 | "version": "4.1.0",
1140 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1141 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1142 | "dev": true
1143 | },
1144 | "string-width": {
1145 | "version": "3.1.0",
1146 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1147 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1148 | "dev": true,
1149 | "requires": {
1150 | "emoji-regex": "^7.0.1",
1151 | "is-fullwidth-code-point": "^2.0.0",
1152 | "strip-ansi": "^5.1.0"
1153 | }
1154 | },
1155 | "strip-ansi": {
1156 | "version": "5.2.0",
1157 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1158 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1159 | "dev": true,
1160 | "requires": {
1161 | "ansi-regex": "^4.1.0"
1162 | }
1163 | }
1164 | }
1165 | },
1166 | "wrappy": {
1167 | "version": "1.0.2",
1168 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1169 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1170 | "dev": true
1171 | },
1172 | "xml2js": {
1173 | "version": "0.4.19",
1174 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz",
1175 | "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==",
1176 | "dev": true,
1177 | "requires": {
1178 | "sax": ">=0.6.0",
1179 | "xmlbuilder": "~9.0.1"
1180 | }
1181 | },
1182 | "xmlbuilder": {
1183 | "version": "9.0.7",
1184 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz",
1185 | "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=",
1186 | "dev": true
1187 | },
1188 | "y18n": {
1189 | "version": "4.0.0",
1190 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
1191 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
1192 | "dev": true
1193 | },
1194 | "yaml-edit": {
1195 | "version": "0.1.3",
1196 | "resolved": "https://registry.npmjs.org/yaml-edit/-/yaml-edit-0.1.3.tgz",
1197 | "integrity": "sha1-103V8F78QquRhSbAlPAJhiHOLXM=",
1198 | "dev": true
1199 | },
1200 | "yargs": {
1201 | "version": "13.3.0",
1202 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
1203 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
1204 | "dev": true,
1205 | "requires": {
1206 | "cliui": "^5.0.0",
1207 | "find-up": "^3.0.0",
1208 | "get-caller-file": "^2.0.1",
1209 | "require-directory": "^2.1.1",
1210 | "require-main-filename": "^2.0.0",
1211 | "set-blocking": "^2.0.0",
1212 | "string-width": "^3.0.0",
1213 | "which-module": "^2.0.0",
1214 | "y18n": "^4.0.0",
1215 | "yargs-parser": "^13.1.1"
1216 | },
1217 | "dependencies": {
1218 | "ansi-regex": {
1219 | "version": "4.1.0",
1220 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1221 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1222 | "dev": true
1223 | },
1224 | "string-width": {
1225 | "version": "3.1.0",
1226 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1227 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1228 | "dev": true,
1229 | "requires": {
1230 | "emoji-regex": "^7.0.1",
1231 | "is-fullwidth-code-point": "^2.0.0",
1232 | "strip-ansi": "^5.1.0"
1233 | }
1234 | },
1235 | "strip-ansi": {
1236 | "version": "5.2.0",
1237 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1238 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1239 | "dev": true,
1240 | "requires": {
1241 | "ansi-regex": "^4.1.0"
1242 | }
1243 | }
1244 | }
1245 | },
1246 | "yargs-parser": {
1247 | "version": "13.1.1",
1248 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
1249 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
1250 | "dev": true,
1251 | "requires": {
1252 | "camelcase": "^5.0.0",
1253 | "decamelize": "^1.2.0"
1254 | }
1255 | },
1256 | "yargs-unparser": {
1257 | "version": "1.6.0",
1258 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
1259 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
1260 | "dev": true,
1261 | "requires": {
1262 | "flat": "^4.1.0",
1263 | "lodash": "^4.17.15",
1264 | "yargs": "^13.3.0"
1265 | }
1266 | }
1267 | }
1268 | }
1269 |
--------------------------------------------------------------------------------
/user-service/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "service-template",
3 | "description": "",
4 | "version": "0.1.0",
5 | "dependencies": {
6 | "bcryptjs": "^2.4.3",
7 | "jsonwebtoken": "^8.5.1"
8 | },
9 | "devDependencies": {
10 | "aws-sdk": "^2.635.0",
11 | "aws-sdk-mock": "^5.0.0",
12 | "serverless-mocha": "^1.12.0",
13 | "serverless-pseudo-parameters": "^2.5.0"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/user-service/serverless.yml:
--------------------------------------------------------------------------------
1 | org: garethmccumskey
2 | app: course
3 | # Welcome to Serverless!
4 | #
5 | # This file is the main config file for your service.
6 | # It's very minimal at this point and uses default values.
7 | # You can always add more config options for more control.
8 | # We've included some commented out config examples here.
9 | # Just uncomment any of them to get that config option.
10 | #
11 | # For full config options, check the docs:
12 | # docs.serverless.com
13 | #
14 | # Happy Coding!
15 |
16 | service: user-service
17 | # app and org for use with dashboard.serverless.com
18 |
19 | # You can pin your service to only deploy with a specific Serverless version
20 | # Check out our docs for more details
21 | # frameworkVersion: "=X.X.X"
22 |
23 | provider:
24 | name: aws
25 | runtime: nodejs12.x
26 | stage: ${opt:stage, 'dev'}
27 | region: us-east-1
28 | # you can overwrite defaults here
29 | # stage: dev
30 | # region: us-east-1
31 |
32 | # you can add statements to the Lambda function's IAM Role here
33 | iamRoleStatements:
34 | - Effect: Allow
35 | Action:
36 | - "dynamodb:Query"
37 | - "dynamodb:PutItem"
38 | Resource:
39 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.dynamodb.userTable}
40 | - arn:aws:dynamodb:#{AWS::Region}:#{AWS::AccountId}:table/${self:custom.dynamodb.userTable}/index/pk
41 | # - Effect: "Allow"
42 | # Action:
43 | # - "s3:ListBucket"
44 | # Resource: { "Fn::Join" : ["", ["arn:aws:s3:::", { "Ref" : "ServerlessDeploymentBucket" } ] ] }
45 | # - Effect: "Allow"
46 | # Action:
47 | # - "s3:PutObject"
48 | # Resource:
49 | # Fn::Join:
50 | # - ""
51 | # - - "arn:aws:s3:::"
52 | # - "Ref" : "ServerlessDeploymentBucket"
53 | # - "/*"
54 |
55 | # you can define service wide environment variables here
56 | environment:
57 | DYNAMODB_USER_TABLE: ${self:custom.dynamodb.userTable}
58 | JWT_SECRET: ${param:JWT_SECRET}
59 | # variable1: value1
60 |
61 | # you can add packaging information here
62 | #package:
63 | # include:
64 | # - include-me.js
65 | # - include-me-dir/**
66 | # exclude:
67 | # - exclude-me.js
68 | # - exclude-me-dir/**
69 |
70 | functions:
71 | validate:
72 | handler: src/functions/validate.validate
73 | loginUser:
74 | handler: src/functions/login.login
75 | events:
76 | - http:
77 | method: post
78 | cors: true
79 | path: /v1/user/login
80 | request:
81 | schema:
82 | application/json: ${file(src/schema/login_request.json)}
83 | createUser:
84 | handler: src/functions/createUser.createUser
85 | events:
86 | - http:
87 | method: post
88 | cors: true
89 | path: /v1/user
90 | request:
91 | schema:
92 | application/json: ${file(src/schema/create_user_request.json)}
93 | # The following are a few example events you can configure
94 | # NOTE: Please make sure to change your handler code to work with those events
95 | # Check the event documentation for details
96 | # events:
97 | # - http:
98 | # path: users/create
99 | # method: get
100 | # - websocket: $connect
101 | # - s3: ${env:BUCKET}
102 | # - schedule: rate(10 minutes)
103 | # - sns: greeter-topic
104 | # - stream: arn:aws:dynamodb:region:XXXXXX:table/foo/stream/1970-01-01T00:00:00.000
105 | # - alexaSkill: amzn1.ask.skill.xx-xx-xx-xx
106 | # - alexaSmartHome: amzn1.ask.skill.xx-xx-xx-xx
107 | # - iot:
108 | # sql: "SELECT * FROM 'some_topic'"
109 | # - cloudwatchEvent:
110 | # event:
111 | # source:
112 | # - "aws.ec2"
113 | # detail-type:
114 | # - "EC2 Instance State-change Notification"
115 | # detail:
116 | # state:
117 | # - pending
118 | # - cloudwatchLog: '/aws/lambda/hello'
119 | # - cognitoUserPool:
120 | # pool: MyUserPool
121 | # trigger: PreSignUp
122 | # - alb:
123 | # listenerArn: arn:aws:elasticloadbalancing:us-east-1:XXXXXX:listener/app/my-load-balancer/50dc6c495c0c9188/
124 | # priority: 1
125 | # conditions:
126 | # host: example.com
127 | # path: /hello
128 |
129 | # Define function environment variables here
130 | # environment:
131 | # variable2: value2
132 |
133 | # you can add CloudFormation resource templates here
134 | #resources:
135 | # Resources:
136 | # NewResource:
137 | # Type: AWS::S3::Bucket
138 | # Properties:
139 | # BucketName: my-new-bucket
140 | # Outputs:
141 | # NewOutput:
142 | # Description: "Description for the output"
143 | # Value: "Some output value"
144 |
145 | plugins:
146 | - serverless-pseudo-parameters
147 | - serverless-mocha
148 | custom:
149 | dynamodb:
150 | userTable: ${self:service}-userTable-${self:provider.stage}
151 | serverless-mocha-plugin:
152 | testTemplate: templates/test-template.ejs
153 | functionTemplate: templates/function-template.ejs
154 | resources:
155 | Resources:
156 | userTable:
157 | Type: AWS::DynamoDB::Table
158 | DeletionPolicy: Retain
159 | Properties:
160 | TableName: ${self:custom.dynamodb.userTable}
161 | AttributeDefinitions:
162 | - AttributeName: pk
163 | AttributeType: S
164 | KeySchema:
165 | - AttributeName: pk
166 | KeyType: HASH
167 | BillingMode: PAY_PER_REQUEST
168 |
--------------------------------------------------------------------------------
/user-service/src/functions/createUser.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | const AWS = require('aws-sdk')
3 | const bcrypt = require('bcryptjs')
4 |
5 | module.exports.createUser = async (event, context) => {
6 | const body = JSON.parse(event.body)
7 | const username = body.username
8 | const password = body.password
9 | const newUserParams = {
10 | TableName: process.env.DYNAMODB_USER_TABLE,
11 | Item: {
12 | pk: username,
13 | password: bcrypt.hashSync(password, 10)
14 | }
15 | }
16 | try {
17 | const dynamodb = new AWS.DynamoDB.DocumentClient()
18 | const putResult = await dynamodb.put(newUserParams).promise()
19 | return {
20 | statusCode: 201,
21 | headers: {
22 | 'Access-Control-Allow-Origin': '*',
23 | 'Access-Control-Allow-Credentials': true,
24 | 'Access-Control-Allow-Headers': 'Authorization'
25 | }
26 | }
27 | } catch(putError) {
28 | console.log('There was an error putting the new item')
29 | console.log('putError', putError)
30 | console.log('newUserParams', newUserParams)
31 | return new Error('There was an error putting the new item')
32 | }
33 |
34 |
35 | };
36 |
--------------------------------------------------------------------------------
/user-service/src/functions/login.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | const bcrypt = require('bcryptjs')
3 | const AWS = require('aws-sdk')
4 | const jwt = require('jsonwebtoken')
5 |
6 | module.exports.login = async (event, context) => {
7 | const body = JSON.parse(event.body)
8 |
9 | const queryUserParams = {
10 | TableName: process.env.DYNAMODB_USER_TABLE,
11 | KeyConditionExpression: '#username = :username',
12 | ExpressionAttributeNames: {
13 | '#username': 'pk'
14 | },
15 | ExpressionAttributeValues: {
16 | ':username': body.username
17 | }
18 | }
19 |
20 | let userResult = {}
21 | try {
22 | const dynamodb = new AWS.DynamoDB.DocumentClient()
23 | userResult = await dynamodb.query(queryUserParams).promise()
24 | } catch (queryError) {
25 | console.log('There was an error attempting to retrieve the user')
26 | console.log('queryError', queryError)
27 | console.log('queryUserParams', queryUserParams)
28 | return new Error('There was an error retrieving the user')
29 | }
30 |
31 | if (typeof userResult.Items !== 'undefined' &&
32 | userResult.Items.length === 1) {
33 | const compareResult = bcrypt.compareSync(body.password, userResult.Items[0].password)
34 | if (compareResult) {
35 | let token = jwt.sign({
36 | username: userResult.Items[0].pk
37 | }, process.env.JWT_SECRET)
38 | return {
39 | statusCode: 200,
40 | body: JSON.stringify({
41 | token: token
42 | })
43 | }
44 | }
45 | }
46 | return {
47 | statusCode: 404
48 | };
49 | };
50 |
--------------------------------------------------------------------------------
/user-service/src/functions/validate.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 | const jwt = require('jsonwebtoken')
3 |
4 | module.exports.validate = async (event, context) => {
5 | const authorizerToken = event.authorizationToken
6 | const authorizerArr = authorizerToken.split(' ')
7 | const token = authorizerArr[1]
8 |
9 | if (authorizerArr.length !== 2 ||
10 | authorizerArr[0] !== 'Bearer' ||
11 | authorizerArr[1].length === 0) {
12 | return generatePolicy('undefined', 'Deny', event.methodArn)
13 | }
14 | let decodedJwt = jwt.verify(token, process.env.JWT_SECRET)
15 | if (typeof decodedJwt.username !== 'undefined' &&
16 | decodedJwt.username.length > 0) {
17 | return generatePolicy(decodedJwt.username, 'Allow', event.methodArn)
18 | }
19 | generatePolicy('undefined', 'Deny', event.methodArn)
20 |
21 | }
22 |
23 | // Help function to generate an IAM policy
24 | const generatePolicy = function(principalId, effect, resource) {
25 | let authResponse = {}
26 |
27 | authResponse.principalId = principalId
28 | if (effect && resource) {
29 | let policyDocument = {}
30 | policyDocument.Version = '2012-10-17'
31 | policyDocument.Statement = []
32 | let statementOne = {}
33 | statementOne.Action = 'execute-api:Invoke'
34 | statementOne.Effect = effect
35 | statementOne.Resource = resource
36 | policyDocument.Statement[0] = statementOne
37 | authResponse.policyDocument = policyDocument
38 | }
39 |
40 | return authResponse
41 | }
42 |
--------------------------------------------------------------------------------
/user-service/src/schema/create_user_request.json:
--------------------------------------------------------------------------------
1 | {
2 | "definitions": {},
3 | "$schema": "http://json-schema.org/draft-04/schema#",
4 | "type": "object",
5 | "title": "Create User Schema",
6 | "required": [
7 | "username",
8 | "password"
9 | ],
10 | "properties": {
11 | "username": {
12 | "type": "string",
13 | "title": "Username",
14 | "minLength": 3,
15 | "maxLength": 50
16 | },
17 | "password": {
18 | "title": "Password",
19 | "type": "string",
20 | "minLength": 1,
21 | "maxLength": 50
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/user-service/src/schema/login_request.json:
--------------------------------------------------------------------------------
1 | {
2 | "definitions": {},
3 | "$schema": "http://json-schema.org/draft-04/schema#",
4 | "type": "object",
5 | "title": "Login Schema",
6 | "required": [
7 | "username",
8 | "password"
9 | ],
10 | "properties": {
11 | "username": {
12 | "type": "string",
13 | "title": "Username",
14 | "minLength": 3,
15 | "maxLength": 50
16 | },
17 | "password": {
18 | "title": "Password",
19 | "type": "string",
20 | "minLength": 1,
21 | "maxLength": 50
22 | }
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/user-service/src/tests/createUser.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // tests for createUser
4 | // Generated by serverless-mocha-plugin
5 |
6 | const mochaPlugin = require('serverless-mocha');
7 | const expect = mochaPlugin.chai.expect;
8 | let wrapped = mochaPlugin.getWrapper('createUser', '../../../src/functions/createUser.js', 'createUser');
9 | const AWS = require('aws-sdk-mock')
10 | const AWS_SDK = require('aws-sdk')
11 | AWS.setSDKInstance(AWS_SDK)
12 |
13 | describe('createUser', () => {
14 | before((done) => {
15 | done();
16 | });
17 |
18 | it('implement tests here', async () => {
19 | const response = await wrapped.run({});
20 | expect(response).to.not.be.empty;
21 | });
22 | });
23 |
--------------------------------------------------------------------------------
/user-service/src/tests/loginUser.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // tests for loginUser
4 | // Generated by serverless-mocha-plugin
5 |
6 | const mochaPlugin = require('serverless-mocha');
7 | const expect = mochaPlugin.chai.expect;
8 | let wrapped = mochaPlugin.getWrapper('loginUser', '../../../src/functions/login.js', 'login');
9 | const AWS = require('aws-sdk-mock')
10 | const AWS_SDK = require('aws-sdk')
11 | AWS.setSDKInstance(AWS_SDK)
12 |
13 | describe('loginUser', () => {
14 | before((done) => {
15 | done();
16 | });
17 |
18 | it('implement tests here', async () => {
19 | const response = await wrapped.run({});
20 | expect(response).to.not.be.empty;
21 | });
22 | });
23 |
--------------------------------------------------------------------------------
/user-service/src/tests/validate.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // tests for validate
4 | // Generated by serverless-mocha-plugin
5 |
6 | const mochaPlugin = require('serverless-mocha');
7 | const expect = mochaPlugin.chai.expect;
8 | let wrapped = mochaPlugin.getWrapper('validate', '../../../src/functions/validate.js', 'validate');
9 | const AWS = require('aws-sdk-mock')
10 | const AWS_SDK = require('aws-sdk')
11 | AWS.setSDKInstance(AWS_SDK)
12 |
13 | describe('validate', () => {
14 | before((done) => {
15 | done();
16 | });
17 |
18 | it('implement tests here', async () => {
19 | const response = await wrapped.run({});
20 | expect(response).to.not.be.empty;
21 | });
22 | });
23 |
--------------------------------------------------------------------------------
/user-service/templates/function-template.ejs:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | module.exports.<%= handlerFunction %> = async (event, context) => {
4 | return {
5 | statusCode: 200,
6 | body: JSON.stringify({
7 | message: 'Go Serverless v1.0! Your function executed successfully!',
8 | input: event,
9 | }),
10 | };
11 | };
12 |
--------------------------------------------------------------------------------
/user-service/templates/test-template.ejs:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | // tests for <%= functionName %>
4 | // Generated by serverless-mocha-plugin
5 |
6 | const mochaPlugin = require('serverless-mocha');
7 | const expect = mochaPlugin.chai.expect;
8 | let wrapped = mochaPlugin.getWrapper('<%= functionName %>', '../../../<%= functionPath %>', '<%= handlerName %>');
9 | const AWS = require('aws-sdk-mock')
10 | const AWS_SDK = require('aws-sdk')
11 | AWS.setSDKInstance(AWS_SDK)
12 |
13 | describe('<%= functionName %>', () => {
14 | before((done) => {
15 | done();
16 | });
17 |
18 | it('implement tests here', async () => {
19 | const response = await wrapped.run({});
20 | expect(response).to.not.be.empty;
21 | });
22 | });
23 |
--------------------------------------------------------------------------------