├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── package-lock.json
├── package.json
├── resources
└── release.sh.ts
├── src
├── index.ts
└── types.d.ts
├── test
├── automated-test-prod.ts
├── automated-test.ts
├── manual-test.ts
├── server.ts
├── static
│ └── index.html
├── tsconfig.json
└── views
│ └── error-page.ejs
├── tsconfig.json
└── tslint.json
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | dist
3 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - lts/*
4 | - node
5 | script:
6 | - npm run build
7 | - npm test
8 | deploy:
9 | provider: npm
10 | email: hadrien.milano@gmail.com
11 | api_key:
12 | secure: Db21Po4A6X/ZzuPZyou9XDsGHrV+O5XEYa9d9RATYxpvc71LBPIM6yUSbjjHkjDgJloV5z93jM06s33vEL06nhlujlxQmhjDKBJL0UeAU/VsbD7qGmHclxyIGP+H4oJxYiPsUbnL9xw2pi5uDTD3xvtl/aG2U7DnlbI5QPAgqtJyoJXWNMN01l3qRQ4OixdnBRh8pzkS4b+7rv2+KFRJCvRrQKmIb/iMZM77uMHzLi2ER/buVLBXmqGCwlcz7SuQx+A/Sk2xvoq1QC9h605WL09OdpfUX4NM6U86985DoBKiT7WErXNLDDW8FL5bayA0gP9/ZDUR8d8wLA5foGEIFS1lmQBnbkT0bUBdX1h2hkUT103pOax+5N6j3exoyzCCTeONrEOIW584OvyJ0S6ef9NRupKVmda66NtlPS07dsDFmHoUuyRQnm8G5FuiqGU5et93w4maJGXYI6h9fcfdwaS8ePgvYg0Iw445assv2g8Rak/Q4UffurGf0xK9Eh2E4VVDZcbtTbGytK9VHfr+vd79dr46Fm/Xx3PZvIenYPzGvejVGJ/+aB8IomeL5RzJtEHffAy2yO1x+ZR10ij7MfFBxkjDv2SgnN5d+lRVuVIvSnzcRdZq2OJVGA+EBIvEBhGejPAZGHMr5NNi0ANPVleGhtypdMJzYCmYHctiaoE=
13 | on:
14 | tags: true
15 | repo: hmil/express-youch
16 | skip_cleanup: true
17 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Hadrien Milano
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Beautiful error reporting for express
2 |
3 | [](https://travis-ci.org/hmil/express-youch)
4 |
5 | Beautiful, spec-compliant error reporting for express.
6 |
7 | ## What does this do?
8 |
9 | This express middleware simplifies debugging errors in express applications by presenting errors in a developer-friendly way.
10 |
11 | Features:
12 | - Beautiful HTML error reports thanks to [youch](https://github.com/poppinss/youch)
13 | - Respects the `Accept` HTTP header
14 | - Hides sensitive information when running in production
15 | - Compatible with other error middleware (custom error pages, custom error logging, ...)
16 |
17 | ## Usage
18 |
19 | ```
20 | npm install express-youch
21 | ```
22 |
23 | ```js
24 | const { errorReporter } = require('express-youch');
25 |
26 | app.use(errorReporter());
27 | ```
28 |
29 | ## Configuration options
30 |
31 | ### links
32 |
33 | Add custom links to the error report.
34 |
35 | ```ts
36 | app.use(errorReporter({
37 | links: [
38 | ({message}) =>{
39 | const url = `https://stackoverflow.com/search?q=${encodeURIComponent(`[adonis.js] ${message}`)}`;
40 | return `Search stackoverflow`;
41 | }
42 | ]
43 | }));
44 | ```
45 |
46 | ## Recepies
47 |
48 | ### How do I customize the error pages?
49 |
50 | When running in production (_ie. when the `NODE_ENV` environment variable is set to `production`._), `express-youch` will delegate HTML errors to the next error reporting middleware. Here is a basic example:
51 |
52 | ```js
53 | const { errorReporter } = require('express-youch');
54 |
55 | // First, pass the errors to the error reporter
56 | app.use(errorReporter());
57 |
58 | // Then add some custom handling logic
59 | app.use(function (error, req, res, next) {
60 | if (!res.headersSent) {
61 | // If we get to this point, that means express-youch decided to delegate response rendering to the
62 | // next handler in the chain. You can safely assume the client wants an HTML response here.
63 | res .status(error.statusCode)
64 | .render('error-page', { error });
65 | } else {
66 | next(error);
67 | }
68 | });
69 | ```
70 |
71 | The error object contains the properties `statusCode` and `message`, which you may use to create different error pages for different error types.
72 |
73 | ### How to better manage my errors
74 |
75 | You should us a combination of an asynchronous express router such as [this one](https://www.npmjs.com/package/express-async-router) and the **async/await** syntax to make sure no errors leak outside of your control. Read [this blog post](https://www.npmjs.com/package/express-async-router) to learn more about error handling in express.
76 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "express-youch",
3 | "version": "0.2.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.8.3",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
10 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.8.3"
14 | }
15 | },
16 | "@babel/highlight": {
17 | "version": "7.8.3",
18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz",
19 | "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==",
20 | "dev": true,
21 | "requires": {
22 | "chalk": "^2.0.0",
23 | "esutils": "^2.0.2",
24 | "js-tokens": "^4.0.0"
25 | }
26 | },
27 | "@senhung/http-exceptions": {
28 | "version": "1.1.1",
29 | "resolved": "https://registry.npmjs.org/@senhung/http-exceptions/-/http-exceptions-1.1.1.tgz",
30 | "integrity": "sha512-q9RyskszpPznOZIZCjVS6RpvJ8s+ZmTFuk7iSxCeHRguIljP/PZtsmr7o+nOTK3D3/f/nATT5VgVSrw60+Ykog==",
31 | "dev": true
32 | },
33 | "@types/body-parser": {
34 | "version": "1.17.0",
35 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.17.0.tgz",
36 | "integrity": "sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w==",
37 | "dev": true,
38 | "requires": {
39 | "@types/connect": "*",
40 | "@types/node": "*"
41 | }
42 | },
43 | "@types/chai": {
44 | "version": "4.2.8",
45 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.2.8.tgz",
46 | "integrity": "sha512-U1bQiWbln41Yo6EeHMr+34aUhvrMVyrhn9lYfPSpLTCrZlGxU4Rtn1bocX+0p2Fc/Jkd2FanCEXdw0WNfHHM0w==",
47 | "dev": true
48 | },
49 | "@types/connect": {
50 | "version": "3.4.32",
51 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
52 | "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
53 | "dev": true,
54 | "requires": {
55 | "@types/node": "*"
56 | }
57 | },
58 | "@types/cookiejar": {
59 | "version": "2.1.1",
60 | "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.1.tgz",
61 | "integrity": "sha512-aRnpPa7ysx3aNW60hTiCtLHlQaIFsXFCgQlpakNgDNVFzbtusSY8PwjAQgRWfSk0ekNoBjO51eQRB6upA9uuyw==",
62 | "dev": true
63 | },
64 | "@types/events": {
65 | "version": "1.2.0",
66 | "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
67 | "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
68 | "dev": true
69 | },
70 | "@types/express": {
71 | "version": "4.16.0",
72 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.16.0.tgz",
73 | "integrity": "sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w==",
74 | "dev": true,
75 | "requires": {
76 | "@types/body-parser": "*",
77 | "@types/express-serve-static-core": "*",
78 | "@types/serve-static": "*"
79 | }
80 | },
81 | "@types/express-serve-static-core": {
82 | "version": "4.16.0",
83 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz",
84 | "integrity": "sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w==",
85 | "dev": true,
86 | "requires": {
87 | "@types/events": "*",
88 | "@types/node": "*",
89 | "@types/range-parser": "*"
90 | }
91 | },
92 | "@types/glob": {
93 | "version": "7.1.1",
94 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz",
95 | "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==",
96 | "dev": true,
97 | "requires": {
98 | "@types/events": "*",
99 | "@types/minimatch": "*",
100 | "@types/node": "*"
101 | }
102 | },
103 | "@types/inquirer": {
104 | "version": "6.5.0",
105 | "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-6.5.0.tgz",
106 | "integrity": "sha512-rjaYQ9b9y/VFGOpqBEXRavc3jh0a+e6evAbI31tMda8VlPaSy0AZJfXsvmIe3wklc7W6C3zCSfleuMXR7NOyXw==",
107 | "dev": true,
108 | "requires": {
109 | "@types/through": "*",
110 | "rxjs": "^6.4.0"
111 | }
112 | },
113 | "@types/mime": {
114 | "version": "2.0.0",
115 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz",
116 | "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==",
117 | "dev": true
118 | },
119 | "@types/minimatch": {
120 | "version": "3.0.3",
121 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
122 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
123 | "dev": true
124 | },
125 | "@types/mocha": {
126 | "version": "7.0.1",
127 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-7.0.1.tgz",
128 | "integrity": "sha512-L/Nw/2e5KUaprNJoRA33oly+M8X8n0K+FwLTbYqwTcR14wdPWeRkigBLfSFpN/Asf9ENZTMZwLxjtjeYucAA4Q==",
129 | "dev": true
130 | },
131 | "@types/node": {
132 | "version": "10.5.4",
133 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.5.4.tgz",
134 | "integrity": "sha512-8TqvB0ReZWwtcd3LXq3YSrBoLyXFgBX/sBZfGye9+YS8zH7/g+i6QRIuiDmwBoTzcQ/pk89nZYTYU4c5akKkzw==",
135 | "dev": true
136 | },
137 | "@types/range-parser": {
138 | "version": "1.2.2",
139 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.2.tgz",
140 | "integrity": "sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw==",
141 | "dev": true
142 | },
143 | "@types/serve-static": {
144 | "version": "1.13.2",
145 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.2.tgz",
146 | "integrity": "sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q==",
147 | "dev": true,
148 | "requires": {
149 | "@types/express-serve-static-core": "*",
150 | "@types/mime": "*"
151 | }
152 | },
153 | "@types/shelljs": {
154 | "version": "0.8.6",
155 | "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.6.tgz",
156 | "integrity": "sha512-svx2eQS268awlppL/P8wgDLBrsDXdKznABHJcuqXyWpSKJgE1s2clXlBvAwbO/lehTmG06NtEWJRkAk4tAgenA==",
157 | "dev": true,
158 | "requires": {
159 | "@types/glob": "*",
160 | "@types/node": "*"
161 | }
162 | },
163 | "@types/superagent": {
164 | "version": "4.1.6",
165 | "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-4.1.6.tgz",
166 | "integrity": "sha512-/T1RB7/2HaAu62fhda87PRVRPakpZpXXLdsbRmAWqZ7mxMqSDXklN2P1RKVyafJTwJm199+gVvjqhpz4f7mT1A==",
167 | "dev": true,
168 | "requires": {
169 | "@types/cookiejar": "*",
170 | "@types/node": "*"
171 | }
172 | },
173 | "@types/supertest": {
174 | "version": "2.0.8",
175 | "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.8.tgz",
176 | "integrity": "sha512-wcax7/ip4XSSJRLbNzEIUVy2xjcBIZZAuSd2vtltQfRK7kxhx5WMHbLHkYdxN3wuQCrwpYrg86/9byDjPXoGMA==",
177 | "dev": true,
178 | "requires": {
179 | "@types/superagent": "*"
180 | }
181 | },
182 | "@types/through": {
183 | "version": "0.0.30",
184 | "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.30.tgz",
185 | "integrity": "sha512-FvnCJljyxhPM3gkRgWmxmDZyAQSiBQQWLI0A0VFL0K7W1oRUrPJSqNO0NvTnLkBcotdlp3lKvaT0JrnyRDkzOg==",
186 | "dev": true,
187 | "requires": {
188 | "@types/node": "*"
189 | }
190 | },
191 | "accepts": {
192 | "version": "1.3.7",
193 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
194 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
195 | "dev": true,
196 | "requires": {
197 | "mime-types": "~2.1.24",
198 | "negotiator": "0.6.2"
199 | },
200 | "dependencies": {
201 | "mime-db": {
202 | "version": "1.43.0",
203 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
204 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
205 | "dev": true
206 | },
207 | "mime-types": {
208 | "version": "2.1.26",
209 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
210 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
211 | "dev": true,
212 | "requires": {
213 | "mime-db": "1.43.0"
214 | }
215 | }
216 | }
217 | },
218 | "ansi-colors": {
219 | "version": "3.2.3",
220 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
221 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
222 | "dev": true
223 | },
224 | "ansi-escapes": {
225 | "version": "4.3.0",
226 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz",
227 | "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==",
228 | "dev": true,
229 | "requires": {
230 | "type-fest": "^0.8.1"
231 | }
232 | },
233 | "ansi-regex": {
234 | "version": "5.0.0",
235 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
236 | "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
237 | "dev": true
238 | },
239 | "ansi-styles": {
240 | "version": "3.2.1",
241 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
242 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
243 | "dev": true,
244 | "requires": {
245 | "color-convert": "^1.9.0"
246 | }
247 | },
248 | "anymatch": {
249 | "version": "3.1.1",
250 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
251 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
252 | "dev": true,
253 | "requires": {
254 | "normalize-path": "^3.0.0",
255 | "picomatch": "^2.0.4"
256 | }
257 | },
258 | "arg": {
259 | "version": "4.1.3",
260 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
261 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
262 | "dev": true
263 | },
264 | "argparse": {
265 | "version": "1.0.10",
266 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
267 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
268 | "dev": true,
269 | "requires": {
270 | "sprintf-js": "~1.0.2"
271 | }
272 | },
273 | "array-flatten": {
274 | "version": "1.1.1",
275 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
276 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
277 | "dev": true
278 | },
279 | "assertion-error": {
280 | "version": "1.1.0",
281 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz",
282 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==",
283 | "dev": true
284 | },
285 | "asynckit": {
286 | "version": "0.4.0",
287 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
288 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
289 | "dev": true
290 | },
291 | "balanced-match": {
292 | "version": "1.0.0",
293 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
294 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
295 | "dev": true
296 | },
297 | "binary-extensions": {
298 | "version": "2.0.0",
299 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz",
300 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==",
301 | "dev": true
302 | },
303 | "body-parser": {
304 | "version": "1.19.0",
305 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
306 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
307 | "dev": true,
308 | "requires": {
309 | "bytes": "3.1.0",
310 | "content-type": "~1.0.4",
311 | "debug": "2.6.9",
312 | "depd": "~1.1.2",
313 | "http-errors": "1.7.2",
314 | "iconv-lite": "0.4.24",
315 | "on-finished": "~2.3.0",
316 | "qs": "6.7.0",
317 | "raw-body": "2.4.0",
318 | "type-is": "~1.6.17"
319 | },
320 | "dependencies": {
321 | "qs": {
322 | "version": "6.7.0",
323 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
324 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
325 | "dev": true
326 | }
327 | }
328 | },
329 | "brace-expansion": {
330 | "version": "1.1.11",
331 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
332 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
333 | "dev": true,
334 | "requires": {
335 | "balanced-match": "^1.0.0",
336 | "concat-map": "0.0.1"
337 | }
338 | },
339 | "braces": {
340 | "version": "3.0.2",
341 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
342 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
343 | "dev": true,
344 | "requires": {
345 | "fill-range": "^7.0.1"
346 | }
347 | },
348 | "browser-stdout": {
349 | "version": "1.3.1",
350 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
351 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
352 | "dev": true
353 | },
354 | "buffer-from": {
355 | "version": "1.1.1",
356 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
357 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
358 | "dev": true
359 | },
360 | "builtin-modules": {
361 | "version": "1.1.1",
362 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
363 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
364 | "dev": true
365 | },
366 | "bytes": {
367 | "version": "3.1.0",
368 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
369 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==",
370 | "dev": true
371 | },
372 | "caller-id": {
373 | "version": "0.1.0",
374 | "resolved": "https://registry.npmjs.org/caller-id/-/caller-id-0.1.0.tgz",
375 | "integrity": "sha1-Wb2sCJPRLDhxQIJ5Ix+XRYNk8Hs=",
376 | "dev": true,
377 | "requires": {
378 | "stack-trace": "~0.0.7"
379 | }
380 | },
381 | "camelcase": {
382 | "version": "5.3.1",
383 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
384 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
385 | "dev": true
386 | },
387 | "chai": {
388 | "version": "4.2.0",
389 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz",
390 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==",
391 | "dev": true,
392 | "requires": {
393 | "assertion-error": "^1.1.0",
394 | "check-error": "^1.0.2",
395 | "deep-eql": "^3.0.1",
396 | "get-func-name": "^2.0.0",
397 | "pathval": "^1.1.0",
398 | "type-detect": "^4.0.5"
399 | }
400 | },
401 | "chalk": {
402 | "version": "2.4.2",
403 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
404 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
405 | "dev": true,
406 | "requires": {
407 | "ansi-styles": "^3.2.1",
408 | "escape-string-regexp": "^1.0.5",
409 | "supports-color": "^5.3.0"
410 | }
411 | },
412 | "chardet": {
413 | "version": "0.7.0",
414 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
415 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
416 | "dev": true
417 | },
418 | "check-error": {
419 | "version": "1.0.2",
420 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
421 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
422 | "dev": true
423 | },
424 | "chokidar": {
425 | "version": "3.3.0",
426 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz",
427 | "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==",
428 | "dev": true,
429 | "requires": {
430 | "anymatch": "~3.1.1",
431 | "braces": "~3.0.2",
432 | "fsevents": "~2.1.1",
433 | "glob-parent": "~5.1.0",
434 | "is-binary-path": "~2.1.0",
435 | "is-glob": "~4.0.1",
436 | "normalize-path": "~3.0.0",
437 | "readdirp": "~3.2.0"
438 | }
439 | },
440 | "cli-cursor": {
441 | "version": "3.1.0",
442 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
443 | "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
444 | "dev": true,
445 | "requires": {
446 | "restore-cursor": "^3.1.0"
447 | }
448 | },
449 | "cli-width": {
450 | "version": "2.2.0",
451 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz",
452 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=",
453 | "dev": true
454 | },
455 | "cliui": {
456 | "version": "5.0.0",
457 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
458 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
459 | "dev": true,
460 | "requires": {
461 | "string-width": "^3.1.0",
462 | "strip-ansi": "^5.2.0",
463 | "wrap-ansi": "^5.1.0"
464 | },
465 | "dependencies": {
466 | "emoji-regex": {
467 | "version": "7.0.3",
468 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
469 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
470 | "dev": true
471 | },
472 | "is-fullwidth-code-point": {
473 | "version": "2.0.0",
474 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
475 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
476 | "dev": true
477 | },
478 | "string-width": {
479 | "version": "3.1.0",
480 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
481 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
482 | "dev": true,
483 | "requires": {
484 | "emoji-regex": "^7.0.1",
485 | "is-fullwidth-code-point": "^2.0.0",
486 | "strip-ansi": "^5.1.0"
487 | }
488 | }
489 | }
490 | },
491 | "color-convert": {
492 | "version": "1.9.3",
493 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
494 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
495 | "dev": true,
496 | "requires": {
497 | "color-name": "1.1.3"
498 | }
499 | },
500 | "color-name": {
501 | "version": "1.1.3",
502 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
503 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
504 | "dev": true
505 | },
506 | "combined-stream": {
507 | "version": "1.0.8",
508 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
509 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
510 | "dev": true,
511 | "requires": {
512 | "delayed-stream": "~1.0.0"
513 | }
514 | },
515 | "commander": {
516 | "version": "2.20.3",
517 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
518 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
519 | "dev": true
520 | },
521 | "component-emitter": {
522 | "version": "1.3.0",
523 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
524 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
525 | "dev": true
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 | "dev": true
532 | },
533 | "content-disposition": {
534 | "version": "0.5.3",
535 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
536 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
537 | "dev": true,
538 | "requires": {
539 | "safe-buffer": "5.1.2"
540 | },
541 | "dependencies": {
542 | "safe-buffer": {
543 | "version": "5.1.2",
544 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
545 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
546 | "dev": true
547 | }
548 | }
549 | },
550 | "content-type": {
551 | "version": "1.0.4",
552 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
553 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
554 | "dev": true
555 | },
556 | "cookie": {
557 | "version": "0.3.1",
558 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
559 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
560 | },
561 | "cookie-signature": {
562 | "version": "1.0.6",
563 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
564 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=",
565 | "dev": true
566 | },
567 | "cookiejar": {
568 | "version": "2.1.2",
569 | "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
570 | "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==",
571 | "dev": true
572 | },
573 | "core-util-is": {
574 | "version": "1.0.2",
575 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
576 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
577 | "dev": true
578 | },
579 | "cross-env": {
580 | "version": "7.0.0",
581 | "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.0.tgz",
582 | "integrity": "sha512-rV6M9ldNgmwP7bx5u6rZsTbYidzwvrwIYZnT08hSGLcQCcggofgFW+sNe7IhA1SRauPS0QuLbbX+wdNtpqE5CQ==",
583 | "dev": true,
584 | "requires": {
585 | "cross-spawn": "^7.0.1"
586 | }
587 | },
588 | "cross-spawn": {
589 | "version": "7.0.1",
590 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz",
591 | "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==",
592 | "dev": true,
593 | "requires": {
594 | "path-key": "^3.1.0",
595 | "shebang-command": "^2.0.0",
596 | "which": "^2.0.1"
597 | }
598 | },
599 | "debug": {
600 | "version": "2.6.9",
601 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
602 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
603 | "dev": true,
604 | "requires": {
605 | "ms": "2.0.0"
606 | }
607 | },
608 | "decamelize": {
609 | "version": "1.2.0",
610 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
611 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
612 | "dev": true
613 | },
614 | "deep-eql": {
615 | "version": "3.0.1",
616 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz",
617 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==",
618 | "dev": true,
619 | "requires": {
620 | "type-detect": "^4.0.0"
621 | }
622 | },
623 | "define-properties": {
624 | "version": "1.1.3",
625 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
626 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
627 | "dev": true,
628 | "requires": {
629 | "object-keys": "^1.0.12"
630 | }
631 | },
632 | "delayed-stream": {
633 | "version": "1.0.0",
634 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
635 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
636 | "dev": true
637 | },
638 | "depd": {
639 | "version": "1.1.2",
640 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
641 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
642 | "dev": true
643 | },
644 | "destroy": {
645 | "version": "1.0.4",
646 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
647 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
648 | "dev": true
649 | },
650 | "diff": {
651 | "version": "3.5.0",
652 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
653 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
654 | "dev": true
655 | },
656 | "ee-first": {
657 | "version": "1.1.1",
658 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
659 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
660 | "dev": true
661 | },
662 | "ejs": {
663 | "version": "3.0.1",
664 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.0.1.tgz",
665 | "integrity": "sha512-cuIMtJwxvzumSAkqaaoGY/L6Fc/t6YvoP9/VIaK0V/CyqKLEQ8sqODmYfy/cjXEdZ9+OOL8TecbJu+1RsofGDw==",
666 | "dev": true
667 | },
668 | "emoji-regex": {
669 | "version": "8.0.0",
670 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
671 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
672 | "dev": true
673 | },
674 | "encodeurl": {
675 | "version": "1.0.2",
676 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
677 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
678 | "dev": true
679 | },
680 | "es-abstract": {
681 | "version": "1.17.4",
682 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz",
683 | "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==",
684 | "dev": true,
685 | "requires": {
686 | "es-to-primitive": "^1.2.1",
687 | "function-bind": "^1.1.1",
688 | "has": "^1.0.3",
689 | "has-symbols": "^1.0.1",
690 | "is-callable": "^1.1.5",
691 | "is-regex": "^1.0.5",
692 | "object-inspect": "^1.7.0",
693 | "object-keys": "^1.1.1",
694 | "object.assign": "^4.1.0",
695 | "string.prototype.trimleft": "^2.1.1",
696 | "string.prototype.trimright": "^2.1.1"
697 | }
698 | },
699 | "es-to-primitive": {
700 | "version": "1.2.1",
701 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
702 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
703 | "dev": true,
704 | "requires": {
705 | "is-callable": "^1.1.4",
706 | "is-date-object": "^1.0.1",
707 | "is-symbol": "^1.0.2"
708 | }
709 | },
710 | "escape-html": {
711 | "version": "1.0.3",
712 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
713 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
714 | "dev": true
715 | },
716 | "escape-string-regexp": {
717 | "version": "1.0.5",
718 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
719 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
720 | "dev": true
721 | },
722 | "esprima": {
723 | "version": "4.0.1",
724 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
725 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
726 | "dev": true
727 | },
728 | "esutils": {
729 | "version": "2.0.3",
730 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
731 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
732 | "dev": true
733 | },
734 | "etag": {
735 | "version": "1.8.1",
736 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
737 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
738 | "dev": true
739 | },
740 | "express": {
741 | "version": "4.17.1",
742 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
743 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
744 | "dev": true,
745 | "requires": {
746 | "accepts": "~1.3.7",
747 | "array-flatten": "1.1.1",
748 | "body-parser": "1.19.0",
749 | "content-disposition": "0.5.3",
750 | "content-type": "~1.0.4",
751 | "cookie": "0.4.0",
752 | "cookie-signature": "1.0.6",
753 | "debug": "2.6.9",
754 | "depd": "~1.1.2",
755 | "encodeurl": "~1.0.2",
756 | "escape-html": "~1.0.3",
757 | "etag": "~1.8.1",
758 | "finalhandler": "~1.1.2",
759 | "fresh": "0.5.2",
760 | "merge-descriptors": "1.0.1",
761 | "methods": "~1.1.2",
762 | "on-finished": "~2.3.0",
763 | "parseurl": "~1.3.3",
764 | "path-to-regexp": "0.1.7",
765 | "proxy-addr": "~2.0.5",
766 | "qs": "6.7.0",
767 | "range-parser": "~1.2.1",
768 | "safe-buffer": "5.1.2",
769 | "send": "0.17.1",
770 | "serve-static": "1.14.1",
771 | "setprototypeof": "1.1.1",
772 | "statuses": "~1.5.0",
773 | "type-is": "~1.6.18",
774 | "utils-merge": "1.0.1",
775 | "vary": "~1.1.2"
776 | },
777 | "dependencies": {
778 | "cookie": {
779 | "version": "0.4.0",
780 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
781 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==",
782 | "dev": true
783 | },
784 | "qs": {
785 | "version": "6.7.0",
786 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
787 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==",
788 | "dev": true
789 | },
790 | "safe-buffer": {
791 | "version": "5.1.2",
792 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
793 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
794 | "dev": true
795 | }
796 | }
797 | },
798 | "extend": {
799 | "version": "3.0.2",
800 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
801 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
802 | "dev": true
803 | },
804 | "external-editor": {
805 | "version": "3.1.0",
806 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
807 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
808 | "dev": true,
809 | "requires": {
810 | "chardet": "^0.7.0",
811 | "iconv-lite": "^0.4.24",
812 | "tmp": "^0.0.33"
813 | }
814 | },
815 | "figures": {
816 | "version": "3.1.0",
817 | "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz",
818 | "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==",
819 | "dev": true,
820 | "requires": {
821 | "escape-string-regexp": "^1.0.5"
822 | }
823 | },
824 | "fill-range": {
825 | "version": "7.0.1",
826 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
827 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
828 | "dev": true,
829 | "requires": {
830 | "to-regex-range": "^5.0.1"
831 | }
832 | },
833 | "finalhandler": {
834 | "version": "1.1.2",
835 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
836 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
837 | "dev": true,
838 | "requires": {
839 | "debug": "2.6.9",
840 | "encodeurl": "~1.0.2",
841 | "escape-html": "~1.0.3",
842 | "on-finished": "~2.3.0",
843 | "parseurl": "~1.3.3",
844 | "statuses": "~1.5.0",
845 | "unpipe": "~1.0.0"
846 | }
847 | },
848 | "find-up": {
849 | "version": "3.0.0",
850 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
851 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
852 | "dev": true,
853 | "requires": {
854 | "locate-path": "^3.0.0"
855 | }
856 | },
857 | "flat": {
858 | "version": "4.1.0",
859 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
860 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
861 | "dev": true,
862 | "requires": {
863 | "is-buffer": "~2.0.3"
864 | }
865 | },
866 | "form-data": {
867 | "version": "2.5.1",
868 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz",
869 | "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==",
870 | "dev": true,
871 | "requires": {
872 | "asynckit": "^0.4.0",
873 | "combined-stream": "^1.0.6",
874 | "mime-types": "^2.1.12"
875 | }
876 | },
877 | "formidable": {
878 | "version": "1.2.1",
879 | "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
880 | "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==",
881 | "dev": true
882 | },
883 | "forwarded": {
884 | "version": "0.1.2",
885 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
886 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=",
887 | "dev": true
888 | },
889 | "fresh": {
890 | "version": "0.5.2",
891 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
892 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
893 | "dev": true
894 | },
895 | "fs.realpath": {
896 | "version": "1.0.0",
897 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
898 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
899 | "dev": true
900 | },
901 | "fsevents": {
902 | "version": "2.1.2",
903 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.2.tgz",
904 | "integrity": "sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA==",
905 | "dev": true,
906 | "optional": true
907 | },
908 | "function-bind": {
909 | "version": "1.1.1",
910 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
911 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
912 | "dev": true
913 | },
914 | "get-caller-file": {
915 | "version": "2.0.5",
916 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
917 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
918 | "dev": true
919 | },
920 | "get-func-name": {
921 | "version": "2.0.0",
922 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz",
923 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=",
924 | "dev": true
925 | },
926 | "glob": {
927 | "version": "7.1.3",
928 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
929 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
930 | "dev": true,
931 | "requires": {
932 | "fs.realpath": "^1.0.0",
933 | "inflight": "^1.0.4",
934 | "inherits": "2",
935 | "minimatch": "^3.0.4",
936 | "once": "^1.3.0",
937 | "path-is-absolute": "^1.0.0"
938 | }
939 | },
940 | "glob-parent": {
941 | "version": "5.1.0",
942 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.0.tgz",
943 | "integrity": "sha512-qjtRgnIVmOfnKUE3NJAQEdk+lKrxfw8t5ke7SXtfMTHcjsBfOfWXCQfdb30zfDoZQ2IRSIiidmjtbHZPZ++Ihw==",
944 | "dev": true,
945 | "requires": {
946 | "is-glob": "^4.0.1"
947 | }
948 | },
949 | "growl": {
950 | "version": "1.10.5",
951 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
952 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
953 | "dev": true
954 | },
955 | "has": {
956 | "version": "1.0.3",
957 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
958 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
959 | "dev": true,
960 | "requires": {
961 | "function-bind": "^1.1.1"
962 | }
963 | },
964 | "has-flag": {
965 | "version": "3.0.0",
966 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
967 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
968 | "dev": true
969 | },
970 | "has-symbols": {
971 | "version": "1.0.1",
972 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
973 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
974 | "dev": true
975 | },
976 | "he": {
977 | "version": "1.2.0",
978 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
979 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
980 | "dev": true
981 | },
982 | "http-errors": {
983 | "version": "1.7.2",
984 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
985 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
986 | "dev": true,
987 | "requires": {
988 | "depd": "~1.1.2",
989 | "inherits": "2.0.3",
990 | "setprototypeof": "1.1.1",
991 | "statuses": ">= 1.5.0 < 2",
992 | "toidentifier": "1.0.0"
993 | }
994 | },
995 | "iconv-lite": {
996 | "version": "0.4.24",
997 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
998 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
999 | "dev": true,
1000 | "requires": {
1001 | "safer-buffer": ">= 2.1.2 < 3"
1002 | }
1003 | },
1004 | "inflight": {
1005 | "version": "1.0.6",
1006 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1007 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1008 | "dev": true,
1009 | "requires": {
1010 | "once": "^1.3.0",
1011 | "wrappy": "1"
1012 | }
1013 | },
1014 | "inherits": {
1015 | "version": "2.0.3",
1016 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1017 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1018 | "dev": true
1019 | },
1020 | "inquirer": {
1021 | "version": "7.0.4",
1022 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz",
1023 | "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==",
1024 | "dev": true,
1025 | "requires": {
1026 | "ansi-escapes": "^4.2.1",
1027 | "chalk": "^2.4.2",
1028 | "cli-cursor": "^3.1.0",
1029 | "cli-width": "^2.0.0",
1030 | "external-editor": "^3.0.3",
1031 | "figures": "^3.0.0",
1032 | "lodash": "^4.17.15",
1033 | "mute-stream": "0.0.8",
1034 | "run-async": "^2.2.0",
1035 | "rxjs": "^6.5.3",
1036 | "string-width": "^4.1.0",
1037 | "strip-ansi": "^5.1.0",
1038 | "through": "^2.3.6"
1039 | }
1040 | },
1041 | "interpret": {
1042 | "version": "1.2.0",
1043 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
1044 | "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==",
1045 | "dev": true
1046 | },
1047 | "ipaddr.js": {
1048 | "version": "1.9.0",
1049 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
1050 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==",
1051 | "dev": true
1052 | },
1053 | "is-binary-path": {
1054 | "version": "2.1.0",
1055 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
1056 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
1057 | "dev": true,
1058 | "requires": {
1059 | "binary-extensions": "^2.0.0"
1060 | }
1061 | },
1062 | "is-buffer": {
1063 | "version": "2.0.4",
1064 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
1065 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==",
1066 | "dev": true
1067 | },
1068 | "is-callable": {
1069 | "version": "1.1.5",
1070 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
1071 | "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
1072 | "dev": true
1073 | },
1074 | "is-date-object": {
1075 | "version": "1.0.2",
1076 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
1077 | "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
1078 | "dev": true
1079 | },
1080 | "is-extglob": {
1081 | "version": "2.1.1",
1082 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1083 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1084 | "dev": true
1085 | },
1086 | "is-fullwidth-code-point": {
1087 | "version": "3.0.0",
1088 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
1089 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
1090 | "dev": true
1091 | },
1092 | "is-glob": {
1093 | "version": "4.0.1",
1094 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
1095 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
1096 | "dev": true,
1097 | "requires": {
1098 | "is-extglob": "^2.1.1"
1099 | }
1100 | },
1101 | "is-number": {
1102 | "version": "7.0.0",
1103 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
1104 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
1105 | "dev": true
1106 | },
1107 | "is-promise": {
1108 | "version": "2.1.0",
1109 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1110 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=",
1111 | "dev": true
1112 | },
1113 | "is-regex": {
1114 | "version": "1.0.5",
1115 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
1116 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
1117 | "dev": true,
1118 | "requires": {
1119 | "has": "^1.0.3"
1120 | }
1121 | },
1122 | "is-symbol": {
1123 | "version": "1.0.3",
1124 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
1125 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
1126 | "dev": true,
1127 | "requires": {
1128 | "has-symbols": "^1.0.1"
1129 | }
1130 | },
1131 | "isarray": {
1132 | "version": "1.0.0",
1133 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1134 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1135 | "dev": true
1136 | },
1137 | "isexe": {
1138 | "version": "2.0.0",
1139 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1140 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1141 | "dev": true
1142 | },
1143 | "js-tokens": {
1144 | "version": "4.0.0",
1145 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
1146 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
1147 | "dev": true
1148 | },
1149 | "js-yaml": {
1150 | "version": "3.13.1",
1151 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
1152 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
1153 | "dev": true,
1154 | "requires": {
1155 | "argparse": "^1.0.7",
1156 | "esprima": "^4.0.0"
1157 | }
1158 | },
1159 | "locate-path": {
1160 | "version": "3.0.0",
1161 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
1162 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
1163 | "dev": true,
1164 | "requires": {
1165 | "p-locate": "^3.0.0",
1166 | "path-exists": "^3.0.0"
1167 | }
1168 | },
1169 | "lodash": {
1170 | "version": "4.17.15",
1171 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
1172 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
1173 | "dev": true
1174 | },
1175 | "log-symbols": {
1176 | "version": "2.2.0",
1177 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
1178 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
1179 | "dev": true,
1180 | "requires": {
1181 | "chalk": "^2.0.1"
1182 | }
1183 | },
1184 | "make-error": {
1185 | "version": "1.3.5",
1186 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz",
1187 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==",
1188 | "dev": true
1189 | },
1190 | "media-typer": {
1191 | "version": "0.3.0",
1192 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1193 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
1194 | "dev": true
1195 | },
1196 | "merge-descriptors": {
1197 | "version": "1.0.1",
1198 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1199 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=",
1200 | "dev": true
1201 | },
1202 | "methods": {
1203 | "version": "1.1.2",
1204 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1205 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
1206 | "dev": true
1207 | },
1208 | "mime": {
1209 | "version": "1.4.1",
1210 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
1211 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==",
1212 | "dev": true
1213 | },
1214 | "mime-db": {
1215 | "version": "1.35.0",
1216 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
1217 | "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==",
1218 | "dev": true
1219 | },
1220 | "mime-types": {
1221 | "version": "2.1.19",
1222 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
1223 | "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
1224 | "dev": true,
1225 | "requires": {
1226 | "mime-db": "~1.35.0"
1227 | }
1228 | },
1229 | "mimic-fn": {
1230 | "version": "2.1.0",
1231 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1232 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1233 | "dev": true
1234 | },
1235 | "minimatch": {
1236 | "version": "3.0.4",
1237 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1238 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1239 | "dev": true,
1240 | "requires": {
1241 | "brace-expansion": "^1.1.7"
1242 | }
1243 | },
1244 | "minimist": {
1245 | "version": "0.0.8",
1246 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1247 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1248 | "dev": true
1249 | },
1250 | "mkdirp": {
1251 | "version": "0.5.1",
1252 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1253 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1254 | "dev": true,
1255 | "requires": {
1256 | "minimist": "0.0.8"
1257 | }
1258 | },
1259 | "mocha": {
1260 | "version": "7.0.1",
1261 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.0.1.tgz",
1262 | "integrity": "sha512-9eWmWTdHLXh72rGrdZjNbG3aa1/3NRPpul1z0D979QpEnFdCG0Q5tv834N+94QEN2cysfV72YocQ3fn87s70fg==",
1263 | "dev": true,
1264 | "requires": {
1265 | "ansi-colors": "3.2.3",
1266 | "browser-stdout": "1.3.1",
1267 | "chokidar": "3.3.0",
1268 | "debug": "3.2.6",
1269 | "diff": "3.5.0",
1270 | "escape-string-regexp": "1.0.5",
1271 | "find-up": "3.0.0",
1272 | "glob": "7.1.3",
1273 | "growl": "1.10.5",
1274 | "he": "1.2.0",
1275 | "js-yaml": "3.13.1",
1276 | "log-symbols": "2.2.0",
1277 | "minimatch": "3.0.4",
1278 | "mkdirp": "0.5.1",
1279 | "ms": "2.1.1",
1280 | "node-environment-flags": "1.0.6",
1281 | "object.assign": "4.1.0",
1282 | "strip-json-comments": "2.0.1",
1283 | "supports-color": "6.0.0",
1284 | "which": "1.3.1",
1285 | "wide-align": "1.1.3",
1286 | "yargs": "13.3.0",
1287 | "yargs-parser": "13.1.1",
1288 | "yargs-unparser": "1.6.0"
1289 | },
1290 | "dependencies": {
1291 | "debug": {
1292 | "version": "3.2.6",
1293 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1294 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1295 | "dev": true,
1296 | "requires": {
1297 | "ms": "^2.1.1"
1298 | }
1299 | },
1300 | "ms": {
1301 | "version": "2.1.1",
1302 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1303 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1304 | "dev": true
1305 | },
1306 | "supports-color": {
1307 | "version": "6.0.0",
1308 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
1309 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
1310 | "dev": true,
1311 | "requires": {
1312 | "has-flag": "^3.0.0"
1313 | }
1314 | },
1315 | "which": {
1316 | "version": "1.3.1",
1317 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1318 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1319 | "dev": true,
1320 | "requires": {
1321 | "isexe": "^2.0.0"
1322 | }
1323 | }
1324 | }
1325 | },
1326 | "mock-require": {
1327 | "version": "2.0.2",
1328 | "resolved": "https://registry.npmjs.org/mock-require/-/mock-require-2.0.2.tgz",
1329 | "integrity": "sha1-HqpxqtIwE3c9En3H6Ro/u0g31g0=",
1330 | "dev": true,
1331 | "requires": {
1332 | "caller-id": "^0.1.0"
1333 | }
1334 | },
1335 | "ms": {
1336 | "version": "2.0.0",
1337 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1338 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1339 | "dev": true
1340 | },
1341 | "mustache": {
1342 | "version": "3.0.0",
1343 | "resolved": "https://registry.npmjs.org/mustache/-/mustache-3.0.0.tgz",
1344 | "integrity": "sha512-bhBDkK/PioIbtQzRIbGUGypvc3MC4c389QnJt8KDIEJ666OidRPoXAQAHPivikfS3JkMEaWoPvcDL7YrQxtSwg=="
1345 | },
1346 | "mute-stream": {
1347 | "version": "0.0.8",
1348 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
1349 | "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
1350 | "dev": true
1351 | },
1352 | "negotiator": {
1353 | "version": "0.6.2",
1354 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
1355 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==",
1356 | "dev": true
1357 | },
1358 | "node-environment-flags": {
1359 | "version": "1.0.6",
1360 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
1361 | "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
1362 | "dev": true,
1363 | "requires": {
1364 | "object.getownpropertydescriptors": "^2.0.3",
1365 | "semver": "^5.7.0"
1366 | }
1367 | },
1368 | "normalize-path": {
1369 | "version": "3.0.0",
1370 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1371 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1372 | "dev": true
1373 | },
1374 | "object-inspect": {
1375 | "version": "1.7.0",
1376 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
1377 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
1378 | "dev": true
1379 | },
1380 | "object-keys": {
1381 | "version": "1.1.1",
1382 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1383 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1384 | "dev": true
1385 | },
1386 | "object.assign": {
1387 | "version": "4.1.0",
1388 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1389 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1390 | "dev": true,
1391 | "requires": {
1392 | "define-properties": "^1.1.2",
1393 | "function-bind": "^1.1.1",
1394 | "has-symbols": "^1.0.0",
1395 | "object-keys": "^1.0.11"
1396 | }
1397 | },
1398 | "object.getownpropertydescriptors": {
1399 | "version": "2.1.0",
1400 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
1401 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
1402 | "dev": true,
1403 | "requires": {
1404 | "define-properties": "^1.1.3",
1405 | "es-abstract": "^1.17.0-next.1"
1406 | }
1407 | },
1408 | "on-finished": {
1409 | "version": "2.3.0",
1410 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1411 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1412 | "dev": true,
1413 | "requires": {
1414 | "ee-first": "1.1.1"
1415 | }
1416 | },
1417 | "once": {
1418 | "version": "1.4.0",
1419 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1420 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1421 | "dev": true,
1422 | "requires": {
1423 | "wrappy": "1"
1424 | }
1425 | },
1426 | "onetime": {
1427 | "version": "5.1.0",
1428 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
1429 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
1430 | "dev": true,
1431 | "requires": {
1432 | "mimic-fn": "^2.1.0"
1433 | }
1434 | },
1435 | "os-tmpdir": {
1436 | "version": "1.0.2",
1437 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1438 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1439 | "dev": true
1440 | },
1441 | "p-limit": {
1442 | "version": "2.2.2",
1443 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.2.tgz",
1444 | "integrity": "sha512-WGR+xHecKTr7EbUEhyLSh5Dube9JtdiG78ufaeLxTgpudf/20KqyMioIUZJAezlTIi6evxuoUs9YXc11cU+yzQ==",
1445 | "dev": true,
1446 | "requires": {
1447 | "p-try": "^2.0.0"
1448 | }
1449 | },
1450 | "p-locate": {
1451 | "version": "3.0.0",
1452 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
1453 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
1454 | "dev": true,
1455 | "requires": {
1456 | "p-limit": "^2.0.0"
1457 | }
1458 | },
1459 | "p-try": {
1460 | "version": "2.2.0",
1461 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1462 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1463 | "dev": true
1464 | },
1465 | "parseurl": {
1466 | "version": "1.3.3",
1467 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1468 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1469 | "dev": true
1470 | },
1471 | "path-exists": {
1472 | "version": "3.0.0",
1473 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
1474 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
1475 | "dev": true
1476 | },
1477 | "path-is-absolute": {
1478 | "version": "1.0.1",
1479 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1480 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1481 | "dev": true
1482 | },
1483 | "path-key": {
1484 | "version": "3.1.1",
1485 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1486 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
1487 | "dev": true
1488 | },
1489 | "path-parse": {
1490 | "version": "1.0.6",
1491 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1492 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1493 | "dev": true
1494 | },
1495 | "path-to-regexp": {
1496 | "version": "0.1.7",
1497 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1498 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=",
1499 | "dev": true
1500 | },
1501 | "pathval": {
1502 | "version": "1.1.0",
1503 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz",
1504 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=",
1505 | "dev": true
1506 | },
1507 | "picomatch": {
1508 | "version": "2.2.1",
1509 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz",
1510 | "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==",
1511 | "dev": true
1512 | },
1513 | "process-nextick-args": {
1514 | "version": "2.0.1",
1515 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1516 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
1517 | "dev": true
1518 | },
1519 | "proxy-addr": {
1520 | "version": "2.0.5",
1521 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
1522 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
1523 | "dev": true,
1524 | "requires": {
1525 | "forwarded": "~0.1.2",
1526 | "ipaddr.js": "1.9.0"
1527 | }
1528 | },
1529 | "qs": {
1530 | "version": "6.5.1",
1531 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
1532 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
1533 | "dev": true
1534 | },
1535 | "range-parser": {
1536 | "version": "1.2.1",
1537 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1538 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1539 | "dev": true
1540 | },
1541 | "raw-body": {
1542 | "version": "2.4.0",
1543 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
1544 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
1545 | "dev": true,
1546 | "requires": {
1547 | "bytes": "3.1.0",
1548 | "http-errors": "1.7.2",
1549 | "iconv-lite": "0.4.24",
1550 | "unpipe": "1.0.0"
1551 | }
1552 | },
1553 | "readable-stream": {
1554 | "version": "2.3.7",
1555 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1556 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1557 | "dev": true,
1558 | "requires": {
1559 | "core-util-is": "~1.0.0",
1560 | "inherits": "~2.0.3",
1561 | "isarray": "~1.0.0",
1562 | "process-nextick-args": "~2.0.0",
1563 | "safe-buffer": "~5.1.1",
1564 | "string_decoder": "~1.1.1",
1565 | "util-deprecate": "~1.0.1"
1566 | }
1567 | },
1568 | "readdirp": {
1569 | "version": "3.2.0",
1570 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz",
1571 | "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==",
1572 | "dev": true,
1573 | "requires": {
1574 | "picomatch": "^2.0.4"
1575 | }
1576 | },
1577 | "rechoir": {
1578 | "version": "0.6.2",
1579 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz",
1580 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=",
1581 | "dev": true,
1582 | "requires": {
1583 | "resolve": "^1.1.6"
1584 | }
1585 | },
1586 | "require-directory": {
1587 | "version": "2.1.1",
1588 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1589 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1590 | "dev": true
1591 | },
1592 | "require-main-filename": {
1593 | "version": "2.0.0",
1594 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
1595 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
1596 | "dev": true
1597 | },
1598 | "resolve": {
1599 | "version": "1.15.1",
1600 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz",
1601 | "integrity": "sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==",
1602 | "dev": true,
1603 | "requires": {
1604 | "path-parse": "^1.0.6"
1605 | }
1606 | },
1607 | "restore-cursor": {
1608 | "version": "3.1.0",
1609 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
1610 | "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
1611 | "dev": true,
1612 | "requires": {
1613 | "onetime": "^5.1.0",
1614 | "signal-exit": "^3.0.2"
1615 | }
1616 | },
1617 | "run-async": {
1618 | "version": "2.3.0",
1619 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
1620 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
1621 | "dev": true,
1622 | "requires": {
1623 | "is-promise": "^2.1.0"
1624 | }
1625 | },
1626 | "rxjs": {
1627 | "version": "6.5.4",
1628 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.4.tgz",
1629 | "integrity": "sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==",
1630 | "dev": true,
1631 | "requires": {
1632 | "tslib": "^1.9.0"
1633 | }
1634 | },
1635 | "safe-buffer": {
1636 | "version": "5.1.1",
1637 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
1638 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==",
1639 | "dev": true
1640 | },
1641 | "safer-buffer": {
1642 | "version": "2.1.2",
1643 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1644 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1645 | "dev": true
1646 | },
1647 | "semver": {
1648 | "version": "5.7.1",
1649 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1650 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1651 | "dev": true
1652 | },
1653 | "send": {
1654 | "version": "0.17.1",
1655 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
1656 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
1657 | "dev": true,
1658 | "requires": {
1659 | "debug": "2.6.9",
1660 | "depd": "~1.1.2",
1661 | "destroy": "~1.0.4",
1662 | "encodeurl": "~1.0.2",
1663 | "escape-html": "~1.0.3",
1664 | "etag": "~1.8.1",
1665 | "fresh": "0.5.2",
1666 | "http-errors": "~1.7.2",
1667 | "mime": "1.6.0",
1668 | "ms": "2.1.1",
1669 | "on-finished": "~2.3.0",
1670 | "range-parser": "~1.2.1",
1671 | "statuses": "~1.5.0"
1672 | },
1673 | "dependencies": {
1674 | "mime": {
1675 | "version": "1.6.0",
1676 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1677 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1678 | "dev": true
1679 | },
1680 | "ms": {
1681 | "version": "2.1.1",
1682 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1683 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1684 | "dev": true
1685 | }
1686 | }
1687 | },
1688 | "serve-static": {
1689 | "version": "1.14.1",
1690 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
1691 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
1692 | "dev": true,
1693 | "requires": {
1694 | "encodeurl": "~1.0.2",
1695 | "escape-html": "~1.0.3",
1696 | "parseurl": "~1.3.3",
1697 | "send": "0.17.1"
1698 | }
1699 | },
1700 | "set-blocking": {
1701 | "version": "2.0.0",
1702 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1703 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
1704 | "dev": true
1705 | },
1706 | "setprototypeof": {
1707 | "version": "1.1.1",
1708 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
1709 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
1710 | "dev": true
1711 | },
1712 | "shebang-command": {
1713 | "version": "2.0.0",
1714 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1715 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1716 | "dev": true,
1717 | "requires": {
1718 | "shebang-regex": "^3.0.0"
1719 | }
1720 | },
1721 | "shebang-regex": {
1722 | "version": "3.0.0",
1723 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1724 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1725 | "dev": true
1726 | },
1727 | "shelljs": {
1728 | "version": "0.8.3",
1729 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz",
1730 | "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==",
1731 | "dev": true,
1732 | "requires": {
1733 | "glob": "^7.0.0",
1734 | "interpret": "^1.0.0",
1735 | "rechoir": "^0.6.2"
1736 | }
1737 | },
1738 | "signal-exit": {
1739 | "version": "3.0.2",
1740 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1741 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1742 | "dev": true
1743 | },
1744 | "source-map": {
1745 | "version": "0.6.1",
1746 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1747 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1748 | "dev": true
1749 | },
1750 | "source-map-support": {
1751 | "version": "0.5.16",
1752 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz",
1753 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==",
1754 | "dev": true,
1755 | "requires": {
1756 | "buffer-from": "^1.0.0",
1757 | "source-map": "^0.6.0"
1758 | }
1759 | },
1760 | "sprintf-js": {
1761 | "version": "1.0.3",
1762 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1763 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1764 | "dev": true
1765 | },
1766 | "stack-trace": {
1767 | "version": "0.0.10",
1768 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
1769 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
1770 | },
1771 | "statuses": {
1772 | "version": "1.5.0",
1773 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
1774 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
1775 | "dev": true
1776 | },
1777 | "string-width": {
1778 | "version": "4.2.0",
1779 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
1780 | "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
1781 | "dev": true,
1782 | "requires": {
1783 | "emoji-regex": "^8.0.0",
1784 | "is-fullwidth-code-point": "^3.0.0",
1785 | "strip-ansi": "^6.0.0"
1786 | },
1787 | "dependencies": {
1788 | "strip-ansi": {
1789 | "version": "6.0.0",
1790 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
1791 | "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
1792 | "dev": true,
1793 | "requires": {
1794 | "ansi-regex": "^5.0.0"
1795 | }
1796 | }
1797 | }
1798 | },
1799 | "string.prototype.trimleft": {
1800 | "version": "2.1.1",
1801 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz",
1802 | "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==",
1803 | "dev": true,
1804 | "requires": {
1805 | "define-properties": "^1.1.3",
1806 | "function-bind": "^1.1.1"
1807 | }
1808 | },
1809 | "string.prototype.trimright": {
1810 | "version": "2.1.1",
1811 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz",
1812 | "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==",
1813 | "dev": true,
1814 | "requires": {
1815 | "define-properties": "^1.1.3",
1816 | "function-bind": "^1.1.1"
1817 | }
1818 | },
1819 | "string_decoder": {
1820 | "version": "1.1.1",
1821 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1822 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1823 | "dev": true,
1824 | "requires": {
1825 | "safe-buffer": "~5.1.0"
1826 | }
1827 | },
1828 | "strip-ansi": {
1829 | "version": "5.2.0",
1830 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1831 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1832 | "dev": true,
1833 | "requires": {
1834 | "ansi-regex": "^4.1.0"
1835 | },
1836 | "dependencies": {
1837 | "ansi-regex": {
1838 | "version": "4.1.0",
1839 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1840 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1841 | "dev": true
1842 | }
1843 | }
1844 | },
1845 | "strip-json-comments": {
1846 | "version": "2.0.1",
1847 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1848 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1849 | "dev": true
1850 | },
1851 | "superagent": {
1852 | "version": "3.8.3",
1853 | "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz",
1854 | "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==",
1855 | "dev": true,
1856 | "requires": {
1857 | "component-emitter": "^1.2.0",
1858 | "cookiejar": "^2.1.0",
1859 | "debug": "^3.1.0",
1860 | "extend": "^3.0.0",
1861 | "form-data": "^2.3.1",
1862 | "formidable": "^1.2.0",
1863 | "methods": "^1.1.1",
1864 | "mime": "^1.4.1",
1865 | "qs": "^6.5.1",
1866 | "readable-stream": "^2.3.5"
1867 | },
1868 | "dependencies": {
1869 | "debug": {
1870 | "version": "3.2.6",
1871 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
1872 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
1873 | "dev": true,
1874 | "requires": {
1875 | "ms": "^2.1.1"
1876 | }
1877 | },
1878 | "ms": {
1879 | "version": "2.1.2",
1880 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1881 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
1882 | "dev": true
1883 | }
1884 | }
1885 | },
1886 | "supertest": {
1887 | "version": "4.0.2",
1888 | "resolved": "https://registry.npmjs.org/supertest/-/supertest-4.0.2.tgz",
1889 | "integrity": "sha512-1BAbvrOZsGA3YTCWqbmh14L0YEq0EGICX/nBnfkfVJn7SrxQV1I3pMYjSzG9y/7ZU2V9dWqyqk2POwxlb09duQ==",
1890 | "dev": true,
1891 | "requires": {
1892 | "methods": "^1.1.2",
1893 | "superagent": "^3.8.3"
1894 | }
1895 | },
1896 | "supports-color": {
1897 | "version": "5.5.0",
1898 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
1899 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
1900 | "dev": true,
1901 | "requires": {
1902 | "has-flag": "^3.0.0"
1903 | }
1904 | },
1905 | "through": {
1906 | "version": "2.3.8",
1907 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
1908 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
1909 | "dev": true
1910 | },
1911 | "tmp": {
1912 | "version": "0.0.33",
1913 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
1914 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
1915 | "dev": true,
1916 | "requires": {
1917 | "os-tmpdir": "~1.0.2"
1918 | }
1919 | },
1920 | "to-regex-range": {
1921 | "version": "5.0.1",
1922 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1923 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1924 | "dev": true,
1925 | "requires": {
1926 | "is-number": "^7.0.0"
1927 | }
1928 | },
1929 | "toidentifier": {
1930 | "version": "1.0.0",
1931 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
1932 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
1933 | "dev": true
1934 | },
1935 | "ts-node": {
1936 | "version": "8.6.2",
1937 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.6.2.tgz",
1938 | "integrity": "sha512-4mZEbofxGqLL2RImpe3zMJukvEvcO1XP8bj8ozBPySdCUXEcU5cIRwR0aM3R+VoZq7iXc8N86NC0FspGRqP4gg==",
1939 | "dev": true,
1940 | "requires": {
1941 | "arg": "^4.1.0",
1942 | "diff": "^4.0.1",
1943 | "make-error": "^1.1.1",
1944 | "source-map-support": "^0.5.6",
1945 | "yn": "3.1.1"
1946 | },
1947 | "dependencies": {
1948 | "diff": {
1949 | "version": "4.0.2",
1950 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
1951 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
1952 | "dev": true
1953 | }
1954 | }
1955 | },
1956 | "tslib": {
1957 | "version": "1.10.0",
1958 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz",
1959 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==",
1960 | "dev": true
1961 | },
1962 | "tslint": {
1963 | "version": "6.0.0",
1964 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-6.0.0.tgz",
1965 | "integrity": "sha512-9nLya8GBtlFmmFMW7oXXwoXS1NkrccqTqAtwXzdPV9e2mqSEvCki6iHL/Fbzi5oqbugshzgGPk7KBb2qNP1DSA==",
1966 | "dev": true,
1967 | "requires": {
1968 | "@babel/code-frame": "^7.0.0",
1969 | "builtin-modules": "^1.1.1",
1970 | "chalk": "^2.3.0",
1971 | "commander": "^2.12.1",
1972 | "diff": "^4.0.1",
1973 | "glob": "^7.1.1",
1974 | "js-yaml": "^3.13.1",
1975 | "minimatch": "^3.0.4",
1976 | "mkdirp": "^0.5.1",
1977 | "resolve": "^1.3.2",
1978 | "semver": "^5.3.0",
1979 | "tslib": "^1.10.0",
1980 | "tsutils": "^2.29.0"
1981 | },
1982 | "dependencies": {
1983 | "diff": {
1984 | "version": "4.0.2",
1985 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
1986 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
1987 | "dev": true
1988 | }
1989 | }
1990 | },
1991 | "tslint-language-service": {
1992 | "version": "0.9.9",
1993 | "resolved": "https://registry.npmjs.org/tslint-language-service/-/tslint-language-service-0.9.9.tgz",
1994 | "integrity": "sha1-9UbcOEg5eeb7PPpZWErYUls61No=",
1995 | "dev": true,
1996 | "requires": {
1997 | "mock-require": "^2.0.2"
1998 | }
1999 | },
2000 | "tsutils": {
2001 | "version": "2.29.0",
2002 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz",
2003 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==",
2004 | "dev": true,
2005 | "requires": {
2006 | "tslib": "^1.8.1"
2007 | }
2008 | },
2009 | "type-detect": {
2010 | "version": "4.0.8",
2011 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
2012 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
2013 | "dev": true
2014 | },
2015 | "type-fest": {
2016 | "version": "0.8.1",
2017 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
2018 | "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
2019 | "dev": true
2020 | },
2021 | "type-is": {
2022 | "version": "1.6.18",
2023 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
2024 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
2025 | "dev": true,
2026 | "requires": {
2027 | "media-typer": "0.3.0",
2028 | "mime-types": "~2.1.24"
2029 | },
2030 | "dependencies": {
2031 | "mime-db": {
2032 | "version": "1.43.0",
2033 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz",
2034 | "integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==",
2035 | "dev": true
2036 | },
2037 | "mime-types": {
2038 | "version": "2.1.26",
2039 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz",
2040 | "integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==",
2041 | "dev": true,
2042 | "requires": {
2043 | "mime-db": "1.43.0"
2044 | }
2045 | }
2046 | }
2047 | },
2048 | "typescript": {
2049 | "version": "3.7.5",
2050 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.5.tgz",
2051 | "integrity": "sha512-/P5lkRXkWHNAbcJIiHPfRoKqyd7bsyCma1hZNUGfn20qm64T6ZBlrzprymeu918H+mB/0rIg2gGK/BXkhhYgBw==",
2052 | "dev": true
2053 | },
2054 | "unpipe": {
2055 | "version": "1.0.0",
2056 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2057 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
2058 | "dev": true
2059 | },
2060 | "util-deprecate": {
2061 | "version": "1.0.2",
2062 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2063 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2064 | "dev": true
2065 | },
2066 | "utils-merge": {
2067 | "version": "1.0.1",
2068 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2069 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
2070 | "dev": true
2071 | },
2072 | "vary": {
2073 | "version": "1.1.2",
2074 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2075 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
2076 | "dev": true
2077 | },
2078 | "which": {
2079 | "version": "2.0.2",
2080 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
2081 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
2082 | "dev": true,
2083 | "requires": {
2084 | "isexe": "^2.0.0"
2085 | }
2086 | },
2087 | "which-module": {
2088 | "version": "2.0.0",
2089 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
2090 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
2091 | "dev": true
2092 | },
2093 | "wide-align": {
2094 | "version": "1.1.3",
2095 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
2096 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
2097 | "dev": true,
2098 | "requires": {
2099 | "string-width": "^1.0.2 || 2"
2100 | },
2101 | "dependencies": {
2102 | "ansi-regex": {
2103 | "version": "3.0.0",
2104 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
2105 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
2106 | "dev": true
2107 | },
2108 | "is-fullwidth-code-point": {
2109 | "version": "2.0.0",
2110 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2111 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2112 | "dev": true
2113 | },
2114 | "string-width": {
2115 | "version": "2.1.1",
2116 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
2117 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
2118 | "dev": true,
2119 | "requires": {
2120 | "is-fullwidth-code-point": "^2.0.0",
2121 | "strip-ansi": "^4.0.0"
2122 | }
2123 | },
2124 | "strip-ansi": {
2125 | "version": "4.0.0",
2126 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
2127 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
2128 | "dev": true,
2129 | "requires": {
2130 | "ansi-regex": "^3.0.0"
2131 | }
2132 | }
2133 | }
2134 | },
2135 | "wrap-ansi": {
2136 | "version": "5.1.0",
2137 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
2138 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
2139 | "dev": true,
2140 | "requires": {
2141 | "ansi-styles": "^3.2.0",
2142 | "string-width": "^3.0.0",
2143 | "strip-ansi": "^5.0.0"
2144 | },
2145 | "dependencies": {
2146 | "emoji-regex": {
2147 | "version": "7.0.3",
2148 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2149 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2150 | "dev": true
2151 | },
2152 | "is-fullwidth-code-point": {
2153 | "version": "2.0.0",
2154 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2155 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2156 | "dev": true
2157 | },
2158 | "string-width": {
2159 | "version": "3.1.0",
2160 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2161 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2162 | "dev": true,
2163 | "requires": {
2164 | "emoji-regex": "^7.0.1",
2165 | "is-fullwidth-code-point": "^2.0.0",
2166 | "strip-ansi": "^5.1.0"
2167 | }
2168 | }
2169 | }
2170 | },
2171 | "wrappy": {
2172 | "version": "1.0.2",
2173 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2174 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2175 | "dev": true
2176 | },
2177 | "y18n": {
2178 | "version": "4.0.0",
2179 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
2180 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
2181 | "dev": true
2182 | },
2183 | "yargs": {
2184 | "version": "13.3.0",
2185 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz",
2186 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==",
2187 | "dev": true,
2188 | "requires": {
2189 | "cliui": "^5.0.0",
2190 | "find-up": "^3.0.0",
2191 | "get-caller-file": "^2.0.1",
2192 | "require-directory": "^2.1.1",
2193 | "require-main-filename": "^2.0.0",
2194 | "set-blocking": "^2.0.0",
2195 | "string-width": "^3.0.0",
2196 | "which-module": "^2.0.0",
2197 | "y18n": "^4.0.0",
2198 | "yargs-parser": "^13.1.1"
2199 | },
2200 | "dependencies": {
2201 | "emoji-regex": {
2202 | "version": "7.0.3",
2203 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2204 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2205 | "dev": true
2206 | },
2207 | "is-fullwidth-code-point": {
2208 | "version": "2.0.0",
2209 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2210 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2211 | "dev": true
2212 | },
2213 | "string-width": {
2214 | "version": "3.1.0",
2215 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2216 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2217 | "dev": true,
2218 | "requires": {
2219 | "emoji-regex": "^7.0.1",
2220 | "is-fullwidth-code-point": "^2.0.0",
2221 | "strip-ansi": "^5.1.0"
2222 | }
2223 | }
2224 | }
2225 | },
2226 | "yargs-parser": {
2227 | "version": "13.1.1",
2228 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz",
2229 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==",
2230 | "dev": true,
2231 | "requires": {
2232 | "camelcase": "^5.0.0",
2233 | "decamelize": "^1.2.0"
2234 | }
2235 | },
2236 | "yargs-unparser": {
2237 | "version": "1.6.0",
2238 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz",
2239 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==",
2240 | "dev": true,
2241 | "requires": {
2242 | "flat": "^4.1.0",
2243 | "lodash": "^4.17.15",
2244 | "yargs": "^13.3.0"
2245 | }
2246 | },
2247 | "yn": {
2248 | "version": "3.1.1",
2249 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
2250 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
2251 | "dev": true
2252 | },
2253 | "youch": {
2254 | "version": "2.0.10",
2255 | "resolved": "https://registry.npmjs.org/youch/-/youch-2.0.10.tgz",
2256 | "integrity": "sha512-qPLQW2TuwlcK9sm5i1Gbb9ezRZRZyzr6NsY5cqxsbh+2iEyKPxLlz0OSAc+pQ7mv1pYZLri1MXynggP6R2FcNQ==",
2257 | "requires": {
2258 | "cookie": "^0.3.1",
2259 | "mustache": "^3.0.0",
2260 | "stack-trace": "0.0.10"
2261 | }
2262 | }
2263 | }
2264 | }
2265 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "express-youch",
3 | "version": "1.0.1",
4 | "description": "Express middleware for youch",
5 | "main": "dist/index.js",
6 | "types": "dist/index.d.ts",
7 | "files": [
8 | "dist"
9 | ],
10 | "scripts": {
11 | "build": "tsc",
12 | "test": "npm run lint && npm run test:dev && npm run test:prod",
13 | "test:dev": "mocha --require ts-node/register test/automated-test.ts",
14 | "test:prod": "cross-env NODE_ENV=production mocha --require ts-node/register test/automated-test-prod.ts",
15 | "lint": "tslint -p .",
16 | "demo": "ts-node test/manual-test.ts",
17 | "release": "ts-node resources/release.sh.ts"
18 | },
19 | "author": "Hadrien Milano ",
20 | "license": "MIT",
21 | "repository": {
22 | "type": "git",
23 | "url": "git+ssh://git@github.com/hmil/express-youch.git"
24 | },
25 | "homepage": "https://github.com/hmil/express-youch#readme",
26 | "bugs": {
27 | "url": "https://github.com/hmil/express-youch/issues"
28 | },
29 | "dependencies": {
30 | "youch": "^2.0.10"
31 | },
32 | "devDependencies": {
33 | "@senhung/http-exceptions": "1.1.1",
34 | "@types/chai": "4.2.8",
35 | "@types/express": "4.16.0",
36 | "@types/inquirer": "6.5.0",
37 | "@types/mocha": "7.0.1",
38 | "@types/shelljs": "0.8.6",
39 | "@types/supertest": "2.0.8",
40 | "chai": "4.2.0",
41 | "cross-env": "7.0.0",
42 | "ejs": "3.0.1",
43 | "express": "4.17.1",
44 | "inquirer": "7.0.4",
45 | "mocha": "7.0.1",
46 | "shelljs": "^0.8.3",
47 | "supertest": "4.0.2",
48 | "ts-node": "8.6.2",
49 | "tslint": "6.0.0",
50 | "tslint-language-service": "0.9.9",
51 | "typescript": "3.7.5"
52 | }
53 | }
--------------------------------------------------------------------------------
/resources/release.sh.ts:
--------------------------------------------------------------------------------
1 | import * as fs from 'fs';
2 | import * as inquirer from 'inquirer';
3 | import * as path from 'path';
4 | import { cd, echo, exec } from 'shelljs';
5 |
6 | const prompt = inquirer.createPromptModule();
7 |
8 | (async () => {
9 |
10 | cd(path.join(__dirname, '..'));
11 | if (exec('git status --porcelain').stdout.trim() !== '') {
12 | echo('Your repository is dirty. Aborting');
13 | process.exit(1);
14 | return;
15 | }
16 |
17 | const { version, message } = await prompt<{version: string, message: string}>([{
18 | type: 'input',
19 | name: 'version',
20 | message: 'Version?',
21 | filter: (val: string) => {
22 | return val.toLowerCase();
23 | }
24 | }, {
25 | type: 'input',
26 | name: 'message',
27 | message: 'Short release message'
28 | }]);
29 |
30 | echo(`About to release ${version}: ${message}.`);
31 |
32 | const { proceed } = await prompt<{proceed: boolean}>([{
33 | type: 'confirm',
34 | name: 'proceed',
35 | message: 'Proceed?',
36 | default: false
37 | }]);
38 |
39 | if (proceed !== true) {
40 | echo('Aborting');
41 | process.exit(1);
42 | return;
43 | }
44 |
45 | const pkgJSON = require('../package.json');
46 | pkgJSON.version = version;
47 | fs.writeFileSync('./package.json', JSON.stringify(pkgJSON, null, 4), { encoding: 'utf-8' });
48 |
49 | exec(`git add -u && git commit -m "release v${version}"`);
50 | exec(`git tag -s -m "${message}" "v${version}"`);
51 | exec('git push --tags origin master');
52 |
53 | })();
54 |
--------------------------------------------------------------------------------
/src/index.ts:
--------------------------------------------------------------------------------
1 | // We are only importing type definitions from express, therefore this import statement
2 | // disappears after compilation.
3 | import { NextFunction, Request, Response } from 'express';
4 | import * as Http from 'http';
5 | import * as Youch from 'youch';
6 |
7 | /**
8 | * WARNING: public API. If this interface changes, then it is a BREAKING change (bump module major version).
9 | */
10 | export class NormalizedException {
11 | constructor(
12 | public readonly statusCode: number,
13 | public readonly name: string,
14 | public readonly message: string,
15 | public readonly stack?: any) {
16 | }
17 |
18 | public get status() {
19 | return this.statusCode;
20 | }
21 |
22 | public toString() {
23 | return formatTextResponse(this);
24 | }
25 | }
26 |
27 | /**
28 | * Loose type to define interesting properties we may find in errors we get
29 | */
30 | type IReceivedError = Partial & string & {
31 | statusCode?: number | string;
32 | code?: number | string;
33 | status?: number | string;
34 | };
35 |
36 | type ResponseFormat = 'json' | 'text' | 'html';
37 |
38 | interface ErrorArg {
39 | message: string;
40 | name?: string;
41 | status?: number;
42 | }
43 |
44 | interface ErrorReporterOptions {
45 | links: Array<((error: ErrorArg) => string)>;
46 | }
47 |
48 | const defaultErrorReporterOptions: ErrorReporterOptions = {
49 | links: []
50 | };
51 |
52 | /**
53 | * An express-compatible middleware to catch all errors.
54 | *
55 | * Use like this:
56 | *
57 | ```ts
58 | import { errorReporter } from 'express-youch';
59 |
60 | app.use(errorReporter());
61 | ```
62 | */
63 | export function errorReporter(options?: Partial) {
64 | const realOptions: ErrorReporterOptions = {
65 | ...defaultErrorReporterOptions,
66 | ...options
67 | };
68 | return (err: IReceivedError, req: Request, res: Response, next: NextFunction) => {
69 | if (res.headersSent) {
70 | return next(err);
71 | }
72 | const normalized = createErrorDescriptor(err);
73 | sendException(
74 | req,
75 | res,
76 | stripProductionAttributes(normalized),
77 | realOptions
78 | ).then(() => next(normalized));
79 | };
80 | }
81 |
82 | function stripProductionAttributes(exception: NormalizedException) {
83 | return new NormalizedException(
84 | exception.status,
85 | exception.name,
86 | exception.message,
87 | isRunningInProd() ? '' : exception.stack
88 | );
89 | }
90 |
91 | /**
92 | * Converts an unknown error type into a precise description of the error that
93 | * we can easily report.
94 | */
95 | function createErrorDescriptor(err: IReceivedError): NormalizedException {
96 | const maybeMessage = 'message' in err ? err.message : safeToString(err);
97 | const status = extractStatusCode(err);
98 | return new NormalizedException(
99 | status,
100 | 'constructor' in err ? err.constructor.name : 'name' in err && err.name != null ? err.name : 'Unknown error',
101 | maybeMessage ? maybeMessage : Http.STATUS_CODES[status] || '',
102 | 'stack' in err ? err.stack : undefined,
103 | );
104 | }
105 |
106 | /**
107 | * Reports the description of an error back to the user while respecting the 'Accept' header if possible.
108 | */
109 | async function sendException(
110 | req: Request,
111 | res: Response,
112 | err: NormalizedException,
113 | options: ErrorReporterOptions
114 | ): Promise {
115 | switch (getPreferredResponseFormat(req)) {
116 | case 'json':
117 | res.status(err.status).json(err);
118 | break;
119 | case 'text':
120 | res.status(err.status).contentType('text/plain').send(formatTextResponse(err));
121 | break;
122 | case 'html':
123 | if (!isRunningInProd()) {
124 | return sendYouchError(req, res, err, options);
125 | }
126 | // If the app is running in prod, we let the next middleware down the stack decide how
127 | // to print the error.
128 | // This will usually allow a user to provide their own nice customized error pages.
129 | break;
130 | }
131 | }
132 |
133 | /**
134 | * Figures out what response format is the most appropriate given some request.
135 | */
136 | function getPreferredResponseFormat(req: Request): ResponseFormat {
137 | const acceptHeader = req.header('Accept');
138 | if (acceptHeader != null) {
139 | if (acceptHeader.indexOf('application/json') !== -1) {
140 | return 'json';
141 | } else if (acceptHeader.indexOf('text/html') !== -1) {
142 | return 'html';
143 | }
144 | }
145 | return 'text';
146 | }
147 |
148 | function sendYouchError(
149 | req: Request,
150 | res: Response,
151 | err: NormalizedException,
152 | options: ErrorReporterOptions
153 | ): Promise {
154 | const youch = options
155 | .links
156 | .reduce(
157 | (youchBuilder, link) => youchBuilder.addLink(link),
158 | new Youch(err, req)
159 | );
160 |
161 | return youch.toHTML().then((html: string) => {
162 | res.writeHead(err.status, { 'content-type': 'text/html' });
163 | res.write(html);
164 | res.end();
165 | });
166 | }
167 |
168 | function formatTextResponse(err: NormalizedException): string {
169 | return err.name + ': ' + (err.message ? err.message : 'Unknown error') + '\n' + (err.stack ? err.stack : '');
170 | }
171 |
172 | function extractStatusCode(err: IReceivedError): number {
173 | let status: number | undefined;
174 | if ('statusCode' in err && (status = validateStatusCode(err.statusCode))) {
175 | return status;
176 | }
177 | if ('status' in err && (status = validateStatusCode(err.status))) {
178 | return status;
179 | }
180 | if ('code' in err && (status = validateStatusCode(err.code))) {
181 | return status;
182 | }
183 | return 500;
184 | }
185 |
186 | function validateStatusCode(code: string | number | undefined): number | undefined {
187 | if (code == null) {
188 | return;
189 | }
190 | const status = safeToNumber(code);
191 |
192 | // Loose sanity check to avoid capturing stuff that's not an HTTP status code
193 | if (status != null && status >= 400 && status < 600) {
194 | return status;
195 | }
196 | }
197 |
198 | function safeToNumber(status: string | number): number | undefined {
199 | if (typeof status === 'number') {
200 | return status;
201 | }
202 | try {
203 | return parseInt(status, 10);
204 | } catch (e) {
205 | return undefined;
206 | }
207 | }
208 |
209 | function safeToString(err: any): string {
210 | try {
211 | return err.toString();
212 | } catch (e) {
213 | return '';
214 | }
215 | }
216 |
217 | function isRunningInProd() {
218 | return process.env.NODE_ENV === 'production';
219 | }
220 |
--------------------------------------------------------------------------------
/src/types.d.ts:
--------------------------------------------------------------------------------
1 | // This is needed because package "youch" does not provide any type definition
2 | declare module 'youch';
3 |
--------------------------------------------------------------------------------
/test/automated-test-prod.ts:
--------------------------------------------------------------------------------
1 | import { expect } from 'chai';
2 | import { Request, Response } from 'express';
3 | import * as request from 'supertest';
4 |
5 | import { app } from './server';
6 |
7 | app.use((err: any, req: Request, res: Response, next: any) => {
8 | // silences errors in the console
9 | });
10 |
11 | describe('404 error', () => {
12 | it('Is shown as plain text by default', async () => {
13 | const response = await request(app)
14 | .get('/doesnotexist')
15 | .expect(404)
16 | .expect('Content-Type', 'text/plain; charset=utf-8');
17 | expect(response.text).to.match(
18 | /^NotFoundHttpException: Not Found\n$/);
19 | });
20 |
21 | it('Is shown as json when asked for json', async () => {
22 | const response = await request(app)
23 | .get('/doesnotexist')
24 | .set('Accept', 'application/json')
25 | .expect(404)
26 | .expect('Content-Type', 'application/json; charset=utf-8');
27 | expect(response.body.name).to.equal('NotFoundHttpException');
28 | expect(response.body.message).to.equal('Not Found');
29 | expect(response.body.statusCode).to.equal(404);
30 | expect(response.body.stack).to.equal('');
31 | });
32 |
33 | it('Is shown as html when asked for html', async () => {
34 | const response = await request(app)
35 | .get('/doesnotexist')
36 | .set('Accept', 'text/html')
37 | .expect(404)
38 | .expect('Content-Type', 'text/html; charset=utf-8');
39 |
40 | const custom = findInText(response.text, /(.+)<\/h1>/).trim();
41 | expect(custom).to.equal('404 Not Found');
42 | });
43 | });
44 |
45 | describe('Manual error', () => {
46 | it('Is shown as plain text by default', async () => {
47 | const response = await request(app)
48 | .get('/error')
49 | .expect(501)
50 | .expect('Content-Type', 'text/plain; charset=utf-8');
51 | expect(response.text).to.match(
52 | /^NotImplementedHttpException: Not Implemented\n$/);
53 | });
54 |
55 | it('Is shown as json when asked for json', async () => {
56 | const response = await request(app)
57 | .get('/error')
58 | .set('Accept', 'application/json')
59 | .expect(501)
60 | .expect('Content-Type', 'application/json; charset=utf-8');
61 | expect(response.body.name).to.equal('NotImplementedHttpException');
62 | expect(response.body.message).to.equal('Not Implemented');
63 | expect(response.body.statusCode).to.equal(501);
64 | expect(response.body.stack).to.be.equal('');
65 | });
66 |
67 | it('Is shown as html when asked for html', async () => {
68 | const response = await request(app)
69 | .get('/error')
70 | .set('Accept', 'text/html')
71 | .expect(501)
72 | .expect('Content-Type', 'text/html; charset=utf-8');
73 |
74 | const custom = findInText(response.text, /(.+)<\/h1>/).trim();
75 | expect(custom).to.equal('501 Not Implemented');
76 | });
77 | });
78 |
79 | function findInText(text: string, rx: RegExp): string {
80 | const match = text.match(rx);
81 | if (match == null) {
82 | throw new Error(`Pattern found: ${rx}`);
83 | }
84 | return match[1];
85 | }
86 |
--------------------------------------------------------------------------------
/test/automated-test.ts:
--------------------------------------------------------------------------------
1 | // tslint:disable:max-line-length
2 |
3 | import { expect } from 'chai';
4 | import { Request, Response } from 'express';
5 | import * as request from 'supertest';
6 |
7 | import { app } from './server';
8 |
9 | app.use((err: any, req: Request, res: Response, next: any) => {
10 | // silences errors in the console
11 | });
12 |
13 | describe('404 error', () => {
14 | it('Is shown as plain text by default', async () => {
15 | const response = await request(app)
16 | .get('/doesnotexist')
17 | .expect(404)
18 | .expect('Content-Type', 'text/plain; charset=utf-8');
19 | expect(response.text).to.match(
20 | /^NotFoundHttpException: Not Found\nError:/);
21 | });
22 |
23 | it('Is shown as json when asked for json', async () => {
24 | const response = await request(app)
25 | .get('/doesnotexist')
26 | .set('Accept', 'application/json')
27 | .expect(404)
28 | .expect('Content-Type', 'application/json; charset=utf-8');
29 | expect(response.body.name).to.equal('NotFoundHttpException');
30 | expect(response.body.message).to.equal('Not Found');
31 | expect(response.body.statusCode).to.equal(404);
32 | expect(response.body.stack).to.match(
33 | /Error: Not Found\n/);
34 | });
35 |
36 | it('Is shown as html when asked for html', async () => {
37 | const response = await request(app)
38 | .get('/doesnotexist')
39 | .set('Accept', 'text/html')
40 | .expect(404)
41 | .expect('Content-Type', 'text/html');
42 |
43 | const eName = findInText(response.text, /
Please go back home
13 |
14 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "strict": true,
4 | "importHelpers": false,
5 | "outDir": "dist",
6 | "declaration": true,
7 | "target": "es6",
8 | "module": "commonjs",
9 | "skipLibCheck": true,
10 | "plugins": [
11 | { "name": "tslint-language-service" }
12 | ],
13 | "lib": ["ES2015"]
14 | },
15 | "include": [
16 | "src/**/*.ts"
17 | ]
18 | }
--------------------------------------------------------------------------------
/tslint.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": [
3 | "tslint:recommended"
4 | ],
5 | "rules": {
6 | "max-classes-per-file": false,
7 | "object-literal-sort-keys": false,
8 | "trailing-comma": false,
9 | "max-line-length": [ true, 140 ],
10 | "quotemark": [ true, "single" ],
11 | "variable-name": [ true, "allow-leading-underscore" ],
12 | "no-bitwise": false,
13 | "interface-name": false,
14 | "no-conditional-assignment": false,
15 | "jsdoc-format": false,
16 | "array-type": false
17 | }
18 | }
--------------------------------------------------------------------------------