├── .gitignore
├── .prettierrc
├── LICENSE.MD
├── README.MD
├── examples
├── nestjs-aws-serverless-express
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .prettierrc
│ ├── README.md
│ ├── layers
│ │ └── general
│ │ │ └── nodejs
│ │ │ ├── package-lock.json
│ │ │ └── package.json
│ ├── nest-cli.json
│ ├── package-lock.json
│ ├── package.json
│ ├── serverless.yml
│ ├── src
│ │ ├── app.controller.spec.ts
│ │ ├── app.controller.ts
│ │ ├── app.module.ts
│ │ ├── app.service.ts
│ │ ├── main-aws.ts
│ │ └── main.ts
│ ├── test
│ │ ├── app.e2e-spec.ts
│ │ └── jest-e2e.json
│ ├── tsconfig.build.json
│ └── tsconfig.json
└── nestjs-aws-serverless-fastify
│ ├── .eslintrc.js
│ ├── .gitignore
│ ├── .prettierrc
│ ├── README.md
│ ├── layers
│ └── general
│ │ └── nodejs
│ │ ├── package-lock.json
│ │ └── package.json
│ ├── nest-cli.json
│ ├── package-lock.json
│ ├── package.json
│ ├── serverless.yml
│ ├── src
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ ├── main-aws.ts
│ └── main.ts
│ ├── test
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
│ ├── tsconfig.build.json
│ └── tsconfig.json
├── lib
├── index.spec.ts
└── index.ts
├── package-lock.json
├── package.json
├── tsconfig.build.json
└── tsconfig.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # compiled output
2 | /dist
3 | /coverage
4 | /node_modules
5 |
6 | # Logs
7 | logs
8 | *.log
9 | npm-debug.log*
10 | yarn-debug.log*
11 | yarn-error.log*
12 | lerna-debug.log*
13 |
14 | # OS
15 | .DS_Store
16 |
17 | # Tests
18 | /.nyc_output
19 |
20 | # IDEs and editors
21 | /.idea
22 | .project
23 | .classpath
24 | .c9/
25 | *.launch
26 | .settings/
27 | *.sublime-workspace
28 |
29 | # IDE - VSCode
30 | .vscode/*
31 | !.vscode/settings.json
32 | !.vscode/tasks.json
33 | !.vscode/launch.json
34 | !.vscode/extensions.json
35 |
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "all"
4 | }
--------------------------------------------------------------------------------
/LICENSE.MD:
--------------------------------------------------------------------------------
1 | Copyright (c) 2020, gCorePlus Inc. c/o Rennan Stefan Boni
2 |
3 | Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.
4 |
5 | THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
6 |
--------------------------------------------------------------------------------
/README.MD:
--------------------------------------------------------------------------------
1 | [](https://npmjs.org/package/@gCorePlus/nestjs-aws-serverless "View this project on npm")
2 | [](https://codecov.io/gh/gCorePlus/nestjs-aws-serverless)
3 | [](http://opensource.org/licenses/ISC)
4 |
5 | # Nestjs AWS Serverless
6 |
7 | ## About
8 |
9 | `@gCorePlus/nestjs-aws-serverless` provide easy way to run Nest.js on AWS Lambda using express or fastify engines
10 |
11 | Inspired by the [aws-serverless-express](https://github.com/awslabs/aws-serverless-express) and [aws-lambda-fastify](https://github.com/fastify/aws-lambda-fastify) library
12 |
13 | ## 👨🏻💻Installation
14 |
15 | Install the main lib
16 |
17 | ```shell script
18 | npm install --save @gcoreplus/nestjs-aws-serverless
19 | ```
20 |
21 | Install the libs for your favorite engine
22 |
23 | ##### Express
24 |
25 | ```shell script
26 | npm install --save @nestjs/platform-express
27 | npm install --save aws-serverless-express
28 | ```
29 |
30 | ##### Fastify
31 |
32 | ```shell script
33 | npm install --save @nestjs/platform-fastify
34 | npm install --save aws-serverless-fastify
35 | ```
36 |
37 | ### Create the aws handler
38 |
39 | Create a file (e.g. `main-aws.ts`) to boot your app on lambda
40 |
41 | ##### Express
42 |
43 | ```typescript
44 | import { lambda } from '@gcoreplus/nestjs-aws-serverless';
45 | import { AppModule } from './app.module';
46 |
47 | export const handler = lambda(AppModule);
48 | ```
49 |
50 | ##### Fastify
51 |
52 | ```typescript
53 | import { lambda } from '@gcoreplus/nestjs-aws-serverless';
54 | import { AppModule } from './app.module';
55 |
56 | export const handler = lambda(AppModule, {engine: 'fastify'});
57 | ```
58 |
59 | ### Deploy
60 |
61 | Deploy your app on AWS Lambda with [serverless](https://github.com/serverless/serverless) or setup manually pointing to `main-aws.ts` as `main-aws.handler`
62 |
63 | see example from [express](https://github.com/gCorePlus/nestjs-aws-serverless/blob/master/examples/nestjs-aws-serverless-express/serverless.yml) or [fastify](https://github.com/gCorePlus/nestjs-aws-serverless/blob/master/examples/nestjs-aws-serverless-fastify/serverless.yml)
64 | ```yaml
65 | ...
66 | functions:
67 | hello-world:
68 | name: ${self:custom.prefix-name}
69 | handler: dist/test/nestjs-aws-serverless-express/src/main-aws.handler
70 | ...
71 | ```
72 |
73 | ### Options
74 |
75 |
76 | | Name | Description |
77 | | :------------------- | ----------- |
78 | | engine | Engine name to be use `express` or `fastify`. Default value `express` |
79 | | warmup.source | Check for aws event source (`context.source === warmup.source`), if equal it will return string `Lambda is warm!`. See [serverless-plugin-warmup](https://github.com/FidelLimited/serverless-plugin-warmup) |
80 | | fastify.options | Fastify options. See [options](https://github.com/fastify/fastify/blob/master/docs/Server.md) |
81 | | fastify.binaryTypes | List of binaries for Fastify. See [aws-lambda-fastify](https://github.com/fastify/aws-lambda-fastify) |
82 | | nestjs.options | NestJs application options. See [NestApplicationOptions](https://github.com/nestjs/nest/blob/master/packages/common/interfaces/nest-application-options.interface.ts) |
83 | | nestjs.onBeforeInit | Function called before the `app.init()` is invoked |
84 | | nestjs.onAfterInit | Function called after the `app.init()` is invoked |
85 |
86 | ## Examples
87 |
88 | Check the examples for express and fastify and deploy using the follow commands
89 |
90 | ```shell script
91 | npm install
92 | npm run build
93 | npm run deploy:test:us-east-1
94 | ```
95 |
96 | ## Backers
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 | ## License
107 |
108 | Distributed under the ISC License. See `LICENSE` for more information.
109 |
110 | ## Acknowledgements
111 |
112 | - [nestjs](https://nestjs.com)
113 | - [aws-serverless-express](https://github.com/awslabs/aws-serverless-express)
114 | - [aws-lambda-fastify](https://github.com/fastify/aws-lambda-fastify)
115 |
116 | Copyright © 2020 gCorePlus Inc.
117 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | parser: '@typescript-eslint/parser',
3 | parserOptions: {
4 | project: 'tsconfig.json',
5 | sourceType: 'module',
6 | },
7 | plugins: ['@typescript-eslint/eslint-plugin'],
8 | extends: [
9 | 'plugin:@typescript-eslint/eslint-recommended',
10 | 'plugin:@typescript-eslint/recommended',
11 | 'prettier',
12 | 'prettier/@typescript-eslint',
13 | ],
14 | root: true,
15 | env: {
16 | node: true,
17 | jest: true,
18 | },
19 | rules: {
20 | '@typescript-eslint/interface-name-prefix': 'off',
21 | '@typescript-eslint/explicit-function-return-type': 'off',
22 | '@typescript-eslint/no-explicit-any': 'off',
23 | },
24 | };
25 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/.gitignore:
--------------------------------------------------------------------------------
1 | # compiled output
2 | /dist
3 | /node_modules
4 |
5 | # Logs
6 | logs
7 | *.log
8 | npm-debug.log*
9 | yarn-debug.log*
10 | yarn-error.log*
11 | lerna-debug.log*
12 |
13 | # OS
14 | .DS_Store
15 |
16 | # Tests
17 | /coverage
18 | /.nyc_output
19 |
20 | # IDEs and editors
21 | /.idea
22 | .project
23 | .classpath
24 | .c9/
25 | *.launch
26 | .settings/
27 | *.sublime-workspace
28 |
29 | # IDE - VSCode
30 | .vscode/*
31 | !.vscode/settings.json
32 | !.vscode/tasks.json
33 | !.vscode/launch.json
34 | !.vscode/extensions.json
35 | /layers/general/nodejs/node_modules/
36 | .serverless/
37 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "all"
4 | }
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | [travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=master
6 | [travis-url]: https://travis-ci.org/nestjs/nest
7 | [linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux
8 | [linux-url]: https://travis-ci.org/nestjs/nest
9 |
10 | A progressive Node.js framework for building efficient and scalable server-side applications, heavily inspired by Angular.
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
26 |
27 | ## Description
28 |
29 | [Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
30 |
31 | ## Installation
32 |
33 | ```bash
34 | $ npm install
35 | ```
36 |
37 | ## Running the app
38 |
39 | ```bash
40 | # development
41 | $ npm run start
42 |
43 | # watch mode
44 | $ npm run start:dev
45 |
46 | # production mode
47 | $ npm run start:prod
48 | ```
49 |
50 | ## Test
51 |
52 | ```bash
53 | # unit tests
54 | $ npm run test
55 |
56 | # e2e tests
57 | $ npm run test:e2e
58 |
59 | # test coverage
60 | $ npm run test:cov
61 | ```
62 |
63 | ## Support
64 |
65 | Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
66 |
67 | ## Stay in touch
68 |
69 | - Author - [Kamil Myśliwiec](https://kamilmysliwiec.com)
70 | - Website - [https://nestjs.com](https://nestjs.com/)
71 | - Twitter - [@nestframework](https://twitter.com/nestframework)
72 |
73 | ## License
74 |
75 | Nest is [MIT licensed](LICENSE).
76 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/layers/general/nodejs/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "general-layer",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@nestjs/common": {
8 | "version": "7.3.2",
9 | "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.3.2.tgz",
10 | "integrity": "sha512-qK8szqv0PuHDVDPbQjVV+Z91QasDIe7cbzULqtNDARIRkgU4LGk/Q+32E3kBWfp8gh5axRkgVuKtpCiq2s55Cg==",
11 | "requires": {
12 | "axios": "0.19.2",
13 | "cli-color": "2.0.0",
14 | "iterare": "1.2.1",
15 | "tslib": "2.0.0",
16 | "uuid": "8.2.0"
17 | }
18 | },
19 | "@nestjs/core": {
20 | "version": "7.3.2",
21 | "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.3.2.tgz",
22 | "integrity": "sha512-oL1iDfkJyM/0L+LKS+/Yo7GUJkiEcYsZY/ndONdiv1XqiBC5t76DDXry9CuJmcRH36FJ+QbI5jwpKXjRa9D5dQ==",
23 | "requires": {
24 | "@nuxtjs/opencollective": "0.2.2",
25 | "fast-safe-stringify": "2.0.7",
26 | "iterare": "1.2.1",
27 | "object-hash": "2.0.3",
28 | "path-to-regexp": "3.2.0",
29 | "tslib": "2.0.0",
30 | "uuid": "8.2.0"
31 | }
32 | },
33 | "@nestjs/platform-express": {
34 | "version": "7.3.2",
35 | "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-7.3.2.tgz",
36 | "integrity": "sha512-HxfVxAuqIe4vMt+dVyhq7iMIe3RN8PLIo2n1CWW2Xla5MRCUjXJww8clJtVk2AUwnjzxs77h9DR1D803gzd+zQ==",
37 | "requires": {
38 | "body-parser": "1.19.0",
39 | "cors": "2.8.5",
40 | "express": "4.17.1",
41 | "multer": "1.4.2",
42 | "tslib": "2.0.0"
43 | }
44 | },
45 | "@nuxtjs/opencollective": {
46 | "version": "0.2.2",
47 | "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
48 | "integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
49 | "requires": {
50 | "chalk": "^2.4.1",
51 | "consola": "^2.3.0",
52 | "node-fetch": "^2.3.0"
53 | }
54 | },
55 | "accepts": {
56 | "version": "1.3.7",
57 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
58 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
59 | "requires": {
60 | "mime-types": "~2.1.24",
61 | "negotiator": "0.6.2"
62 | }
63 | },
64 | "ansi-regex": {
65 | "version": "2.1.1",
66 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
67 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
68 | },
69 | "ansi-styles": {
70 | "version": "3.2.1",
71 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
72 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
73 | "requires": {
74 | "color-convert": "^1.9.0"
75 | }
76 | },
77 | "append-field": {
78 | "version": "1.0.0",
79 | "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
80 | "integrity": "sha1-HjRA6RXwsSA9I3SOeO3XubW0PlY="
81 | },
82 | "array-flatten": {
83 | "version": "1.1.1",
84 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
85 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
86 | },
87 | "aws-serverless-express": {
88 | "version": "3.3.8",
89 | "resolved": "https://registry.npmjs.org/aws-serverless-express/-/aws-serverless-express-3.3.8.tgz",
90 | "integrity": "sha512-2TQdF5EhxnAtGeEi+wSi2M3xCfpiemuImnpU7HKih3onH0izJ/G2tkM+gwcGHZEsW/gLWFl/JjQAYGa3fILfvw==",
91 | "requires": {
92 | "binary-case": "^1.0.0",
93 | "type-is": "^1.6.16"
94 | }
95 | },
96 | "axios": {
97 | "version": "0.19.2",
98 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
99 | "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
100 | "requires": {
101 | "follow-redirects": "1.5.10"
102 | }
103 | },
104 | "balanced-match": {
105 | "version": "1.0.0",
106 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
107 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
108 | },
109 | "binary-case": {
110 | "version": "1.1.4",
111 | "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz",
112 | "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg=="
113 | },
114 | "body-parser": {
115 | "version": "1.19.0",
116 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
117 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
118 | "requires": {
119 | "bytes": "3.1.0",
120 | "content-type": "~1.0.4",
121 | "debug": "2.6.9",
122 | "depd": "~1.1.2",
123 | "http-errors": "1.7.2",
124 | "iconv-lite": "0.4.24",
125 | "on-finished": "~2.3.0",
126 | "qs": "6.7.0",
127 | "raw-body": "2.4.0",
128 | "type-is": "~1.6.17"
129 | },
130 | "dependencies": {
131 | "debug": {
132 | "version": "2.6.9",
133 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
134 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
135 | "requires": {
136 | "ms": "2.0.0"
137 | }
138 | }
139 | }
140 | },
141 | "brace-expansion": {
142 | "version": "1.1.11",
143 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
144 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
145 | "requires": {
146 | "balanced-match": "^1.0.0",
147 | "concat-map": "0.0.1"
148 | }
149 | },
150 | "buffer-from": {
151 | "version": "1.1.1",
152 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
153 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
154 | },
155 | "busboy": {
156 | "version": "0.2.14",
157 | "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz",
158 | "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=",
159 | "requires": {
160 | "dicer": "0.2.5",
161 | "readable-stream": "1.1.x"
162 | }
163 | },
164 | "bytes": {
165 | "version": "3.1.0",
166 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
167 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
168 | },
169 | "chalk": {
170 | "version": "2.4.2",
171 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
172 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
173 | "requires": {
174 | "ansi-styles": "^3.2.1",
175 | "escape-string-regexp": "^1.0.5",
176 | "supports-color": "^5.3.0"
177 | }
178 | },
179 | "cli-color": {
180 | "version": "2.0.0",
181 | "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz",
182 | "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==",
183 | "requires": {
184 | "ansi-regex": "^2.1.1",
185 | "d": "^1.0.1",
186 | "es5-ext": "^0.10.51",
187 | "es6-iterator": "^2.0.3",
188 | "memoizee": "^0.4.14",
189 | "timers-ext": "^0.1.7"
190 | }
191 | },
192 | "color-convert": {
193 | "version": "1.9.3",
194 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
195 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
196 | "requires": {
197 | "color-name": "1.1.3"
198 | }
199 | },
200 | "color-name": {
201 | "version": "1.1.3",
202 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
203 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
204 | },
205 | "concat-map": {
206 | "version": "0.0.1",
207 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
208 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
209 | },
210 | "concat-stream": {
211 | "version": "1.6.2",
212 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
213 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
214 | "requires": {
215 | "buffer-from": "^1.0.0",
216 | "inherits": "^2.0.3",
217 | "readable-stream": "^2.2.2",
218 | "typedarray": "^0.0.6"
219 | },
220 | "dependencies": {
221 | "isarray": {
222 | "version": "1.0.0",
223 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
224 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
225 | },
226 | "readable-stream": {
227 | "version": "2.3.7",
228 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
229 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
230 | "requires": {
231 | "core-util-is": "~1.0.0",
232 | "inherits": "~2.0.3",
233 | "isarray": "~1.0.0",
234 | "process-nextick-args": "~2.0.0",
235 | "safe-buffer": "~5.1.1",
236 | "string_decoder": "~1.1.1",
237 | "util-deprecate": "~1.0.1"
238 | }
239 | },
240 | "string_decoder": {
241 | "version": "1.1.1",
242 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
243 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
244 | "requires": {
245 | "safe-buffer": "~5.1.0"
246 | }
247 | }
248 | }
249 | },
250 | "consola": {
251 | "version": "2.14.0",
252 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.14.0.tgz",
253 | "integrity": "sha512-A2j1x4u8d6SIVikhZROfpFJxQZie+cZOfQMyI/tu2+hWXe8iAv7R6FW6s6x04/7zBCst94lPddztot/d6GJiuQ=="
254 | },
255 | "content-disposition": {
256 | "version": "0.5.3",
257 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
258 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
259 | "requires": {
260 | "safe-buffer": "5.1.2"
261 | }
262 | },
263 | "content-type": {
264 | "version": "1.0.4",
265 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
266 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
267 | },
268 | "cookie": {
269 | "version": "0.4.0",
270 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
271 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
272 | },
273 | "cookie-signature": {
274 | "version": "1.0.6",
275 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
276 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
277 | },
278 | "core-util-is": {
279 | "version": "1.0.2",
280 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
281 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
282 | },
283 | "cors": {
284 | "version": "2.8.5",
285 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
286 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
287 | "requires": {
288 | "object-assign": "^4",
289 | "vary": "^1"
290 | }
291 | },
292 | "d": {
293 | "version": "1.0.1",
294 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
295 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
296 | "requires": {
297 | "es5-ext": "^0.10.50",
298 | "type": "^1.0.1"
299 | }
300 | },
301 | "debug": {
302 | "version": "3.1.0",
303 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
304 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
305 | "requires": {
306 | "ms": "2.0.0"
307 | }
308 | },
309 | "depd": {
310 | "version": "1.1.2",
311 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
312 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
313 | },
314 | "destroy": {
315 | "version": "1.0.4",
316 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
317 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
318 | },
319 | "dicer": {
320 | "version": "0.2.5",
321 | "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz",
322 | "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=",
323 | "requires": {
324 | "readable-stream": "1.1.x",
325 | "streamsearch": "0.1.2"
326 | }
327 | },
328 | "ee-first": {
329 | "version": "1.1.1",
330 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
331 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
332 | },
333 | "encodeurl": {
334 | "version": "1.0.2",
335 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
336 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
337 | },
338 | "es5-ext": {
339 | "version": "0.10.53",
340 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
341 | "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
342 | "requires": {
343 | "es6-iterator": "~2.0.3",
344 | "es6-symbol": "~3.1.3",
345 | "next-tick": "~1.0.0"
346 | }
347 | },
348 | "es6-iterator": {
349 | "version": "2.0.3",
350 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
351 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
352 | "requires": {
353 | "d": "1",
354 | "es5-ext": "^0.10.35",
355 | "es6-symbol": "^3.1.1"
356 | }
357 | },
358 | "es6-symbol": {
359 | "version": "3.1.3",
360 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
361 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
362 | "requires": {
363 | "d": "^1.0.1",
364 | "ext": "^1.1.2"
365 | }
366 | },
367 | "es6-weak-map": {
368 | "version": "2.0.3",
369 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
370 | "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
371 | "requires": {
372 | "d": "1",
373 | "es5-ext": "^0.10.46",
374 | "es6-iterator": "^2.0.3",
375 | "es6-symbol": "^3.1.1"
376 | }
377 | },
378 | "escape-html": {
379 | "version": "1.0.3",
380 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
381 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
382 | },
383 | "escape-string-regexp": {
384 | "version": "1.0.5",
385 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
386 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
387 | },
388 | "etag": {
389 | "version": "1.8.1",
390 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
391 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
392 | },
393 | "event-emitter": {
394 | "version": "0.3.5",
395 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
396 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
397 | "requires": {
398 | "d": "1",
399 | "es5-ext": "~0.10.14"
400 | }
401 | },
402 | "express": {
403 | "version": "4.17.1",
404 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
405 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
406 | "requires": {
407 | "accepts": "~1.3.7",
408 | "array-flatten": "1.1.1",
409 | "body-parser": "1.19.0",
410 | "content-disposition": "0.5.3",
411 | "content-type": "~1.0.4",
412 | "cookie": "0.4.0",
413 | "cookie-signature": "1.0.6",
414 | "debug": "2.6.9",
415 | "depd": "~1.1.2",
416 | "encodeurl": "~1.0.2",
417 | "escape-html": "~1.0.3",
418 | "etag": "~1.8.1",
419 | "finalhandler": "~1.1.2",
420 | "fresh": "0.5.2",
421 | "merge-descriptors": "1.0.1",
422 | "methods": "~1.1.2",
423 | "on-finished": "~2.3.0",
424 | "parseurl": "~1.3.3",
425 | "path-to-regexp": "0.1.7",
426 | "proxy-addr": "~2.0.5",
427 | "qs": "6.7.0",
428 | "range-parser": "~1.2.1",
429 | "safe-buffer": "5.1.2",
430 | "send": "0.17.1",
431 | "serve-static": "1.14.1",
432 | "setprototypeof": "1.1.1",
433 | "statuses": "~1.5.0",
434 | "type-is": "~1.6.18",
435 | "utils-merge": "1.0.1",
436 | "vary": "~1.1.2"
437 | },
438 | "dependencies": {
439 | "debug": {
440 | "version": "2.6.9",
441 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
442 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
443 | "requires": {
444 | "ms": "2.0.0"
445 | }
446 | },
447 | "path-to-regexp": {
448 | "version": "0.1.7",
449 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
450 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
451 | }
452 | }
453 | },
454 | "ext": {
455 | "version": "1.4.0",
456 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
457 | "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
458 | "requires": {
459 | "type": "^2.0.0"
460 | },
461 | "dependencies": {
462 | "type": {
463 | "version": "2.0.0",
464 | "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
465 | "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
466 | }
467 | }
468 | },
469 | "fast-safe-stringify": {
470 | "version": "2.0.7",
471 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
472 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
473 | },
474 | "finalhandler": {
475 | "version": "1.1.2",
476 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
477 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
478 | "requires": {
479 | "debug": "2.6.9",
480 | "encodeurl": "~1.0.2",
481 | "escape-html": "~1.0.3",
482 | "on-finished": "~2.3.0",
483 | "parseurl": "~1.3.3",
484 | "statuses": "~1.5.0",
485 | "unpipe": "~1.0.0"
486 | },
487 | "dependencies": {
488 | "debug": {
489 | "version": "2.6.9",
490 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
491 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
492 | "requires": {
493 | "ms": "2.0.0"
494 | }
495 | }
496 | }
497 | },
498 | "follow-redirects": {
499 | "version": "1.5.10",
500 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
501 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
502 | "requires": {
503 | "debug": "=3.1.0"
504 | }
505 | },
506 | "forwarded": {
507 | "version": "0.1.2",
508 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
509 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
510 | },
511 | "fresh": {
512 | "version": "0.5.2",
513 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
514 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
515 | },
516 | "fs.realpath": {
517 | "version": "1.0.0",
518 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
519 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
520 | },
521 | "glob": {
522 | "version": "7.1.6",
523 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
524 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
525 | "requires": {
526 | "fs.realpath": "^1.0.0",
527 | "inflight": "^1.0.4",
528 | "inherits": "2",
529 | "minimatch": "^3.0.4",
530 | "once": "^1.3.0",
531 | "path-is-absolute": "^1.0.0"
532 | }
533 | },
534 | "has-flag": {
535 | "version": "3.0.0",
536 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
537 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
538 | },
539 | "http-errors": {
540 | "version": "1.7.2",
541 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
542 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
543 | "requires": {
544 | "depd": "~1.1.2",
545 | "inherits": "2.0.3",
546 | "setprototypeof": "1.1.1",
547 | "statuses": ">= 1.5.0 < 2",
548 | "toidentifier": "1.0.0"
549 | }
550 | },
551 | "iconv-lite": {
552 | "version": "0.4.24",
553 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
554 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
555 | "requires": {
556 | "safer-buffer": ">= 2.1.2 < 3"
557 | }
558 | },
559 | "inflight": {
560 | "version": "1.0.6",
561 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
562 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
563 | "requires": {
564 | "once": "^1.3.0",
565 | "wrappy": "1"
566 | }
567 | },
568 | "inherits": {
569 | "version": "2.0.3",
570 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
571 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
572 | },
573 | "ipaddr.js": {
574 | "version": "1.9.1",
575 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
576 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
577 | },
578 | "is-promise": {
579 | "version": "2.2.2",
580 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
581 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
582 | },
583 | "isarray": {
584 | "version": "0.0.1",
585 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
586 | "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
587 | },
588 | "iterare": {
589 | "version": "1.2.1",
590 | "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz",
591 | "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q=="
592 | },
593 | "lru-queue": {
594 | "version": "0.1.0",
595 | "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
596 | "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
597 | "requires": {
598 | "es5-ext": "~0.10.2"
599 | }
600 | },
601 | "media-typer": {
602 | "version": "0.3.0",
603 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
604 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
605 | },
606 | "memoizee": {
607 | "version": "0.4.14",
608 | "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
609 | "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
610 | "requires": {
611 | "d": "1",
612 | "es5-ext": "^0.10.45",
613 | "es6-weak-map": "^2.0.2",
614 | "event-emitter": "^0.3.5",
615 | "is-promise": "^2.1",
616 | "lru-queue": "0.1",
617 | "next-tick": "1",
618 | "timers-ext": "^0.1.5"
619 | }
620 | },
621 | "merge-descriptors": {
622 | "version": "1.0.1",
623 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
624 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
625 | },
626 | "methods": {
627 | "version": "1.1.2",
628 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
629 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
630 | },
631 | "mime": {
632 | "version": "1.6.0",
633 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
634 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
635 | },
636 | "mime-db": {
637 | "version": "1.44.0",
638 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
639 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
640 | },
641 | "mime-types": {
642 | "version": "2.1.27",
643 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
644 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
645 | "requires": {
646 | "mime-db": "1.44.0"
647 | }
648 | },
649 | "minimatch": {
650 | "version": "3.0.4",
651 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
652 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
653 | "requires": {
654 | "brace-expansion": "^1.1.7"
655 | }
656 | },
657 | "minimist": {
658 | "version": "1.2.5",
659 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
660 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
661 | },
662 | "mkdirp": {
663 | "version": "0.5.5",
664 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
665 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
666 | "requires": {
667 | "minimist": "^1.2.5"
668 | }
669 | },
670 | "ms": {
671 | "version": "2.0.0",
672 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
673 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
674 | },
675 | "multer": {
676 | "version": "1.4.2",
677 | "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.2.tgz",
678 | "integrity": "sha512-xY8pX7V+ybyUpbYMxtjM9KAiD9ixtg5/JkeKUTD6xilfDv0vzzOFcCp4Ljb1UU3tSOM3VTZtKo63OmzOrGi3Cg==",
679 | "requires": {
680 | "append-field": "^1.0.0",
681 | "busboy": "^0.2.11",
682 | "concat-stream": "^1.5.2",
683 | "mkdirp": "^0.5.1",
684 | "object-assign": "^4.1.1",
685 | "on-finished": "^2.3.0",
686 | "type-is": "^1.6.4",
687 | "xtend": "^4.0.0"
688 | }
689 | },
690 | "negotiator": {
691 | "version": "0.6.2",
692 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
693 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
694 | },
695 | "next-tick": {
696 | "version": "1.0.0",
697 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
698 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
699 | },
700 | "node-fetch": {
701 | "version": "2.6.0",
702 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
703 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
704 | },
705 | "object-assign": {
706 | "version": "4.1.1",
707 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
708 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
709 | },
710 | "object-hash": {
711 | "version": "2.0.3",
712 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
713 | "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg=="
714 | },
715 | "on-finished": {
716 | "version": "2.3.0",
717 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
718 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
719 | "requires": {
720 | "ee-first": "1.1.1"
721 | }
722 | },
723 | "once": {
724 | "version": "1.4.0",
725 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
726 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
727 | "requires": {
728 | "wrappy": "1"
729 | }
730 | },
731 | "parseurl": {
732 | "version": "1.3.3",
733 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
734 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
735 | },
736 | "path-is-absolute": {
737 | "version": "1.0.1",
738 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
739 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
740 | },
741 | "path-to-regexp": {
742 | "version": "3.2.0",
743 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz",
744 | "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA=="
745 | },
746 | "process-nextick-args": {
747 | "version": "2.0.1",
748 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
749 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
750 | },
751 | "proxy-addr": {
752 | "version": "2.0.6",
753 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
754 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
755 | "requires": {
756 | "forwarded": "~0.1.2",
757 | "ipaddr.js": "1.9.1"
758 | }
759 | },
760 | "qs": {
761 | "version": "6.7.0",
762 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
763 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
764 | },
765 | "range-parser": {
766 | "version": "1.2.1",
767 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
768 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
769 | },
770 | "raw-body": {
771 | "version": "2.4.0",
772 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
773 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
774 | "requires": {
775 | "bytes": "3.1.0",
776 | "http-errors": "1.7.2",
777 | "iconv-lite": "0.4.24",
778 | "unpipe": "1.0.0"
779 | }
780 | },
781 | "readable-stream": {
782 | "version": "1.1.14",
783 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
784 | "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
785 | "requires": {
786 | "core-util-is": "~1.0.0",
787 | "inherits": "~2.0.1",
788 | "isarray": "0.0.1",
789 | "string_decoder": "~0.10.x"
790 | }
791 | },
792 | "reflect-metadata": {
793 | "version": "0.1.13",
794 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
795 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
796 | },
797 | "rimraf": {
798 | "version": "3.0.2",
799 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
800 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
801 | "requires": {
802 | "glob": "^7.1.3"
803 | }
804 | },
805 | "rxjs": {
806 | "version": "6.6.0",
807 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz",
808 | "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==",
809 | "requires": {
810 | "tslib": "^1.9.0"
811 | },
812 | "dependencies": {
813 | "tslib": {
814 | "version": "1.13.0",
815 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
816 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
817 | }
818 | }
819 | },
820 | "safe-buffer": {
821 | "version": "5.1.2",
822 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
823 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
824 | },
825 | "safer-buffer": {
826 | "version": "2.1.2",
827 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
828 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
829 | },
830 | "send": {
831 | "version": "0.17.1",
832 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
833 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
834 | "requires": {
835 | "debug": "2.6.9",
836 | "depd": "~1.1.2",
837 | "destroy": "~1.0.4",
838 | "encodeurl": "~1.0.2",
839 | "escape-html": "~1.0.3",
840 | "etag": "~1.8.1",
841 | "fresh": "0.5.2",
842 | "http-errors": "~1.7.2",
843 | "mime": "1.6.0",
844 | "ms": "2.1.1",
845 | "on-finished": "~2.3.0",
846 | "range-parser": "~1.2.1",
847 | "statuses": "~1.5.0"
848 | },
849 | "dependencies": {
850 | "debug": {
851 | "version": "2.6.9",
852 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
853 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
854 | "requires": {
855 | "ms": "2.0.0"
856 | },
857 | "dependencies": {
858 | "ms": {
859 | "version": "2.0.0",
860 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
861 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
862 | }
863 | }
864 | },
865 | "ms": {
866 | "version": "2.1.1",
867 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
868 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
869 | }
870 | }
871 | },
872 | "serve-static": {
873 | "version": "1.14.1",
874 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
875 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
876 | "requires": {
877 | "encodeurl": "~1.0.2",
878 | "escape-html": "~1.0.3",
879 | "parseurl": "~1.3.3",
880 | "send": "0.17.1"
881 | }
882 | },
883 | "setprototypeof": {
884 | "version": "1.1.1",
885 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
886 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
887 | },
888 | "statuses": {
889 | "version": "1.5.0",
890 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
891 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
892 | },
893 | "streamsearch": {
894 | "version": "0.1.2",
895 | "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz",
896 | "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo="
897 | },
898 | "string_decoder": {
899 | "version": "0.10.31",
900 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
901 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
902 | },
903 | "supports-color": {
904 | "version": "5.5.0",
905 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
906 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
907 | "requires": {
908 | "has-flag": "^3.0.0"
909 | }
910 | },
911 | "timers-ext": {
912 | "version": "0.1.7",
913 | "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
914 | "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
915 | "requires": {
916 | "es5-ext": "~0.10.46",
917 | "next-tick": "1"
918 | }
919 | },
920 | "toidentifier": {
921 | "version": "1.0.0",
922 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
923 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
924 | },
925 | "tslib": {
926 | "version": "2.0.0",
927 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz",
928 | "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g=="
929 | },
930 | "type": {
931 | "version": "1.2.0",
932 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
933 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
934 | },
935 | "type-is": {
936 | "version": "1.6.18",
937 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
938 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
939 | "requires": {
940 | "media-typer": "0.3.0",
941 | "mime-types": "~2.1.24"
942 | }
943 | },
944 | "typedarray": {
945 | "version": "0.0.6",
946 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
947 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
948 | },
949 | "unpipe": {
950 | "version": "1.0.0",
951 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
952 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
953 | },
954 | "util-deprecate": {
955 | "version": "1.0.2",
956 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
957 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
958 | },
959 | "utils-merge": {
960 | "version": "1.0.1",
961 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
962 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
963 | },
964 | "uuid": {
965 | "version": "8.2.0",
966 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.2.0.tgz",
967 | "integrity": "sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q=="
968 | },
969 | "vary": {
970 | "version": "1.1.2",
971 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
972 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
973 | },
974 | "wrappy": {
975 | "version": "1.0.2",
976 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
977 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
978 | },
979 | "xtend": {
980 | "version": "4.0.2",
981 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
982 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
983 | }
984 | }
985 | }
986 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/layers/general/nodejs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "general-layer",
3 | "version": "1.0.0",
4 | "dependencies": {
5 | "@nestjs/common": "^7.3.2",
6 | "@nestjs/core": "^7.3.2",
7 | "@nestjs/platform-express": "^7.3.2",
8 | "aws-serverless-express": "^3.3.8",
9 | "reflect-metadata": "^0.1.13",
10 | "rimraf": "^3.0.2",
11 | "rxjs": "^6.6.0"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/nest-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "collection": "@nestjs/schematics",
3 | "sourceRoot": "src"
4 | }
5 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nestjs-aws-serverless-express",
3 | "version": "0.0.1",
4 | "description": "",
5 | "author": "",
6 | "private": true,
7 | "license": "UNLICENSED",
8 | "scripts": {
9 | "prebuild": "rimraf dist",
10 | "build": "nest build",
11 | "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
12 | "start": "nest start",
13 | "start:dev": "nest start --watch",
14 | "start:debug": "nest start --debug --watch",
15 | "start:prod": "node dist/main",
16 | "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17 | "test": "jest",
18 | "test:watch": "jest --watch",
19 | "test:cov": "jest --coverage",
20 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
21 | "test:e2e": "jest --config ./test/jest-e2e.json",
22 | "deploy:test:us-east-1": "sls deploy --stage test --region us-east-1",
23 | "undeploy:test:us-east-1": "sls remove --stage test --region us-east-1"
24 | },
25 | "dependencies": {
26 | "@nestjs/common": "^7.3.2",
27 | "@nestjs/core": "^7.3.2",
28 | "@nestjs/platform-express": "^7.3.2",
29 | "reflect-metadata": "^0.1.13",
30 | "rimraf": "^3.0.2",
31 | "rxjs": "^6.6.0"
32 | },
33 | "devDependencies": {
34 | "@nestjs/cli": "^7.4.1",
35 | "@nestjs/schematics": "^7.0.1",
36 | "@nestjs/testing": "^7.3.2",
37 | "@types/express": "^4.17.7",
38 | "@types/jest": "26.0.5",
39 | "@types/node": "^14.0.24",
40 | "@types/supertest": "^2.0.10",
41 | "@typescript-eslint/eslint-plugin": "3.7.0",
42 | "@typescript-eslint/parser": "3.7.0",
43 | "eslint": "7.5.0",
44 | "eslint-config-prettier": "^6.11.0",
45 | "eslint-plugin-import": "^2.22.0",
46 | "jest": "26.1.0",
47 | "prettier": "^2.0.5",
48 | "serverless-plugin-layer-manager": "^1.0.5",
49 | "supertest": "^4.0.2",
50 | "ts-jest": "26.1.3",
51 | "ts-loader": "^8.0.1",
52 | "ts-node": "^8.10.2",
53 | "tsconfig-paths": "^3.9.0",
54 | "typescript": "^3.9.7"
55 | },
56 | "jest": {
57 | "moduleFileExtensions": [
58 | "js",
59 | "json",
60 | "ts"
61 | ],
62 | "rootDir": "src",
63 | "testRegex": ".spec.ts$",
64 | "transform": {
65 | "^.+\\.(t|j)s$": "ts-jest"
66 | },
67 | "coverageDirectory": "../coverage",
68 | "testEnvironment": "node"
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/serverless.yml:
--------------------------------------------------------------------------------
1 | service: nestjs-aws-serverless-express
2 |
3 | provider:
4 | name: aws
5 | runtime: nodejs12.x
6 | project: nestjs-aws-serverless-express
7 | stage: ${opt:stage, 'dev'}
8 | region: ${opt:region, 'us-east-1'}
9 | apiName: ${self:provider.project}-${self:provider.stage}
10 | memorySize: 128
11 | environment:
12 | NODE_ENV: ${self:provider.stage}
13 |
14 | plugins:
15 | - serverless-plugin-layer-manager
16 |
17 | package:
18 | individually: true
19 | excludeDevDependencies: false
20 | exclude:
21 | - '.*/**'
22 | - '*'
23 | - apps/**
24 | - coverage/**
25 | - layers/**
26 | - libs/**
27 | - node_modules/**
28 | - src/**
29 | - test/**
30 |
31 | layers:
32 | GeneralNodeModules:
33 | path: ./layers/general
34 | name: ${self:custom.prefix-name}-node-modules-general
35 | description: 'General shared node modules'
36 | compatibleRuntimes:
37 | - nodejs10.x
38 | - nodejs12.x
39 |
40 | custom:
41 | prefix-name: ${self:service}-${self:provider.stage}
42 | layerConfig:
43 | installLayers: true
44 | exportLayers: true
45 | upgradeLayerReferences: true
46 |
47 | functions:
48 | hello-world:
49 | name: ${self:custom.prefix-name}
50 | handler: dist/examples/nestjs-aws-serverless-express/src/main-aws.handler
51 | timeout: 30
52 | layers:
53 | - {Ref: GeneralNodeModulesLambdaLayer}
54 | events:
55 | - http:
56 | path: /
57 | method: get
58 | package:
59 | include:
60 | - dist/**
61 | tags:
62 | project: ${self:provider.project}
63 | environment: ${self:provider.stage}
64 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/src/app.controller.spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { AppController } from './app.controller';
3 | import { AppService } from './app.service';
4 |
5 | describe('AppController', () => {
6 | let appController: AppController;
7 |
8 | beforeEach(async () => {
9 | const app: TestingModule = await Test.createTestingModule({
10 | controllers: [AppController],
11 | providers: [AppService],
12 | }).compile();
13 |
14 | appController = app.get(AppController);
15 | });
16 |
17 | describe('root', () => {
18 | it('should return "Hello World!"', () => {
19 | expect(appController.getHello()).toHaveProperty('msg', 'Hello World!');
20 | });
21 | });
22 | });
23 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/src/app.controller.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Get } from '@nestjs/common';
2 | import { AppService } from './app.service';
3 |
4 | @Controller()
5 | export class AppController {
6 |
7 | constructor(private readonly appService: AppService) {
8 | }
9 |
10 | @Get()
11 | getHello(): { msg: string } {
12 | return this.appService.getHello();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/src/app.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { AppController } from './app.controller';
3 | import { AppService } from './app.service';
4 |
5 | @Module({
6 | imports: [],
7 | controllers: [AppController],
8 | providers: [AppService],
9 | })
10 | export class AppModule {}
11 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/src/app.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 |
3 | @Injectable()
4 | export class AppService {
5 | getHello(): { msg: string } {
6 | return {
7 | msg: 'Hello World! from Nest.js with "Express.js" engine'
8 | };
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/src/main-aws.ts:
--------------------------------------------------------------------------------
1 | import { lambda } from '../../../lib';
2 | import { AppModule } from './app.module';
3 |
4 | export const handler = lambda(AppModule);
5 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/src/main.ts:
--------------------------------------------------------------------------------
1 | import { NestFactory } from '@nestjs/core';
2 | import { AppModule } from './app.module';
3 |
4 | async function bootstrap() {
5 | const app = await NestFactory.create(AppModule);
6 | await app.listen(3000);
7 | }
8 | bootstrap();
9 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/test/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { INestApplication } from '@nestjs/common';
3 | import * as request from 'supertest';
4 | import { AppModule } from '../src/app.module';
5 |
6 | describe('AppController (e2e)', () => {
7 | let app: INestApplication;
8 |
9 | beforeEach(async () => {
10 | const moduleFixture: TestingModule = await Test.createTestingModule({
11 | imports: [AppModule],
12 | }).compile();
13 |
14 | app = moduleFixture.createNestApplication();
15 | await app.init();
16 | });
17 |
18 | it('/ (GET)', () => {
19 | return request(app.getHttpServer())
20 | .get('/')
21 | .expect(200)
22 | .expect('Hello World!');
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/test/jest-e2e.json:
--------------------------------------------------------------------------------
1 | {
2 | "moduleFileExtensions": ["js", "json", "ts"],
3 | "rootDir": ".",
4 | "testEnvironment": "node",
5 | "testRegex": ".e2e-spec.ts$",
6 | "transform": {
7 | "^.+\\.(t|j)s$": "ts-jest"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-express/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "declaration": true,
5 | "removeComments": true,
6 | "emitDecoratorMetadata": true,
7 | "experimentalDecorators": true,
8 | "allowSyntheticDefaultImports": true,
9 | "target": "es2017",
10 | "sourceMap": true,
11 | "outDir": "./dist",
12 | "baseUrl": "./",
13 | "incremental": true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | parser: '@typescript-eslint/parser',
3 | parserOptions: {
4 | project: 'tsconfig.json',
5 | sourceType: 'module',
6 | },
7 | plugins: ['@typescript-eslint/eslint-plugin'],
8 | extends: [
9 | 'plugin:@typescript-eslint/eslint-recommended',
10 | 'plugin:@typescript-eslint/recommended',
11 | 'prettier',
12 | 'prettier/@typescript-eslint',
13 | ],
14 | root: true,
15 | env: {
16 | node: true,
17 | jest: true,
18 | },
19 | rules: {
20 | '@typescript-eslint/interface-name-prefix': 'off',
21 | '@typescript-eslint/explicit-function-return-type': 'off',
22 | '@typescript-eslint/no-explicit-any': 'off',
23 | },
24 | };
25 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/.gitignore:
--------------------------------------------------------------------------------
1 | # compiled output
2 | /dist
3 | /node_modules
4 |
5 | # Logs
6 | logs
7 | *.log
8 | npm-debug.log*
9 | yarn-debug.log*
10 | yarn-error.log*
11 | lerna-debug.log*
12 |
13 | # OS
14 | .DS_Store
15 |
16 | # Tests
17 | /coverage
18 | /.nyc_output
19 |
20 | # IDEs and editors
21 | /.idea
22 | .project
23 | .classpath
24 | .c9/
25 | *.launch
26 | .settings/
27 | *.sublime-workspace
28 |
29 | # IDE - VSCode
30 | .vscode/*
31 | !.vscode/settings.json
32 | !.vscode/tasks.json
33 | !.vscode/launch.json
34 | !.vscode/extensions.json
35 | /layers/general/nodejs/node_modules/
36 | .serverless/
37 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "singleQuote": true,
3 | "trailingComma": "all"
4 | }
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | [travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=master
6 | [travis-url]: https://travis-ci.org/nestjs/nest
7 | [linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux
8 | [linux-url]: https://travis-ci.org/nestjs/nest
9 |
10 | A progressive Node.js framework for building efficient and scalable server-side applications, heavily inspired by Angular.
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
26 |
27 | ## Description
28 |
29 | [Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.
30 |
31 | ## Installation
32 |
33 | ```bash
34 | $ npm install
35 | ```
36 |
37 | ## Running the app
38 |
39 | ```bash
40 | # development
41 | $ npm run start
42 |
43 | # watch mode
44 | $ npm run start:dev
45 |
46 | # production mode
47 | $ npm run start:prod
48 | ```
49 |
50 | ## Test
51 |
52 | ```bash
53 | # unit tests
54 | $ npm run test
55 |
56 | # e2e tests
57 | $ npm run test:e2e
58 |
59 | # test coverage
60 | $ npm run test:cov
61 | ```
62 |
63 | ## Support
64 |
65 | Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).
66 |
67 | ## Stay in touch
68 |
69 | - Author - [Kamil Myśliwiec](https://kamilmysliwiec.com)
70 | - Website - [https://nestjs.com](https://nestjs.com/)
71 | - Twitter - [@nestframework](https://twitter.com/nestframework)
72 |
73 | ## License
74 |
75 | Nest is [MIT licensed](LICENSE).
76 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/layers/general/nodejs/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "general-layer",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@nestjs/common": {
8 | "version": "7.3.2",
9 | "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-7.3.2.tgz",
10 | "integrity": "sha512-qK8szqv0PuHDVDPbQjVV+Z91QasDIe7cbzULqtNDARIRkgU4LGk/Q+32E3kBWfp8gh5axRkgVuKtpCiq2s55Cg==",
11 | "requires": {
12 | "axios": "0.19.2",
13 | "cli-color": "2.0.0",
14 | "iterare": "1.2.1",
15 | "tslib": "2.0.0",
16 | "uuid": "8.2.0"
17 | }
18 | },
19 | "@nestjs/core": {
20 | "version": "7.3.2",
21 | "resolved": "https://registry.npmjs.org/@nestjs/core/-/core-7.3.2.tgz",
22 | "integrity": "sha512-oL1iDfkJyM/0L+LKS+/Yo7GUJkiEcYsZY/ndONdiv1XqiBC5t76DDXry9CuJmcRH36FJ+QbI5jwpKXjRa9D5dQ==",
23 | "requires": {
24 | "@nuxtjs/opencollective": "0.2.2",
25 | "fast-safe-stringify": "2.0.7",
26 | "iterare": "1.2.1",
27 | "object-hash": "2.0.3",
28 | "path-to-regexp": "3.2.0",
29 | "tslib": "2.0.0",
30 | "uuid": "8.2.0"
31 | }
32 | },
33 | "@nestjs/platform-fastify": {
34 | "version": "7.3.2",
35 | "resolved": "https://registry.npmjs.org/@nestjs/platform-fastify/-/platform-fastify-7.3.2.tgz",
36 | "integrity": "sha512-KQT8JU2zVx/gOKSffJVuuPJ1ifRrMnfAQ3/sj8O2STybpl1UbglqTFmYb/lS7ynJzGg67GLOjunuorBXGTR3Gg==",
37 | "requires": {
38 | "fastify": "2.15.1",
39 | "fastify-cors": "3.0.3",
40 | "fastify-formbody": "3.2.0",
41 | "path-to-regexp": "3.2.0",
42 | "tslib": "2.0.0"
43 | }
44 | },
45 | "@nuxtjs/opencollective": {
46 | "version": "0.2.2",
47 | "resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
48 | "integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
49 | "requires": {
50 | "chalk": "^2.4.1",
51 | "consola": "^2.3.0",
52 | "node-fetch": "^2.3.0"
53 | }
54 | },
55 | "abstract-logging": {
56 | "version": "2.0.0",
57 | "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.0.tgz",
58 | "integrity": "sha512-/oA9z7JszpIioo6J6dB79LVUgJ3eD3cxkAmdCkvWWS+Y9tPtALs1rLqOekLUXUbYqM2fB9TTK0ibAyZJJOP/CA=="
59 | },
60 | "ajv": {
61 | "version": "6.12.3",
62 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz",
63 | "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==",
64 | "requires": {
65 | "fast-deep-equal": "^3.1.1",
66 | "fast-json-stable-stringify": "^2.0.0",
67 | "json-schema-traverse": "^0.4.1",
68 | "uri-js": "^4.2.2"
69 | }
70 | },
71 | "ansi-regex": {
72 | "version": "2.1.1",
73 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
74 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
75 | },
76 | "ansi-styles": {
77 | "version": "3.2.1",
78 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
79 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
80 | "requires": {
81 | "color-convert": "^1.9.0"
82 | }
83 | },
84 | "archy": {
85 | "version": "1.0.0",
86 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
87 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA="
88 | },
89 | "atomic-sleep": {
90 | "version": "1.0.0",
91 | "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
92 | "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ=="
93 | },
94 | "avvio": {
95 | "version": "6.5.0",
96 | "resolved": "https://registry.npmjs.org/avvio/-/avvio-6.5.0.tgz",
97 | "integrity": "sha512-BmzcZ7gFpyFJsW8G+tfQw8vJNUboA9SDkkHLZ9RAALhvw/rplfWwni8Ee1rA11zj/J7/E5EvZmweusVvTHjWCA==",
98 | "requires": {
99 | "archy": "^1.0.0",
100 | "debug": "^4.0.0",
101 | "fastq": "^1.6.0"
102 | },
103 | "dependencies": {
104 | "debug": {
105 | "version": "4.1.1",
106 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
107 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
108 | "requires": {
109 | "ms": "^2.1.1"
110 | }
111 | },
112 | "ms": {
113 | "version": "2.1.2",
114 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
115 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
116 | }
117 | }
118 | },
119 | "aws-serverless-fastify": {
120 | "version": "1.0.18",
121 | "resolved": "https://registry.npmjs.org/aws-serverless-fastify/-/aws-serverless-fastify-1.0.18.tgz",
122 | "integrity": "sha512-EIoOotlCOmX2ffwcpdVXtCKrReOOR2y24lFl5CxrzJNWfHCGbZw1mUst7/UvHwuhwdGGFnWy4/qlM/13yPad8A==",
123 | "requires": {
124 | "binary-case": "^1.1.4",
125 | "type-is": "^1.6.18"
126 | }
127 | },
128 | "axios": {
129 | "version": "0.19.2",
130 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz",
131 | "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==",
132 | "requires": {
133 | "follow-redirects": "1.5.10"
134 | }
135 | },
136 | "balanced-match": {
137 | "version": "1.0.0",
138 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
139 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
140 | },
141 | "binary-case": {
142 | "version": "1.1.4",
143 | "resolved": "https://registry.npmjs.org/binary-case/-/binary-case-1.1.4.tgz",
144 | "integrity": "sha512-9Kq8m6NZTAgy05Ryuh7U3Qc4/ujLQU1AZ5vMw4cr3igTdi5itZC6kCNrRr2X8NzPiDn2oUIFTfa71DKMnue/Zg=="
145 | },
146 | "brace-expansion": {
147 | "version": "1.1.11",
148 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
149 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
150 | "requires": {
151 | "balanced-match": "^1.0.0",
152 | "concat-map": "0.0.1"
153 | }
154 | },
155 | "chalk": {
156 | "version": "2.4.2",
157 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
158 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
159 | "requires": {
160 | "ansi-styles": "^3.2.1",
161 | "escape-string-regexp": "^1.0.5",
162 | "supports-color": "^5.3.0"
163 | }
164 | },
165 | "cli-color": {
166 | "version": "2.0.0",
167 | "resolved": "https://registry.npmjs.org/cli-color/-/cli-color-2.0.0.tgz",
168 | "integrity": "sha512-a0VZ8LeraW0jTuCkuAGMNufareGHhyZU9z8OGsW0gXd1hZGi1SRuNRXdbGkraBBKnhyUhyebFWnRbp+dIn0f0A==",
169 | "requires": {
170 | "ansi-regex": "^2.1.1",
171 | "d": "^1.0.1",
172 | "es5-ext": "^0.10.51",
173 | "es6-iterator": "^2.0.3",
174 | "memoizee": "^0.4.14",
175 | "timers-ext": "^0.1.7"
176 | }
177 | },
178 | "color-convert": {
179 | "version": "1.9.3",
180 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
181 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
182 | "requires": {
183 | "color-name": "1.1.3"
184 | }
185 | },
186 | "color-name": {
187 | "version": "1.1.3",
188 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
189 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
190 | },
191 | "concat-map": {
192 | "version": "0.0.1",
193 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
194 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
195 | },
196 | "consola": {
197 | "version": "2.14.0",
198 | "resolved": "https://registry.npmjs.org/consola/-/consola-2.14.0.tgz",
199 | "integrity": "sha512-A2j1x4u8d6SIVikhZROfpFJxQZie+cZOfQMyI/tu2+hWXe8iAv7R6FW6s6x04/7zBCst94lPddztot/d6GJiuQ=="
200 | },
201 | "cookie": {
202 | "version": "0.4.0",
203 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
204 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
205 | },
206 | "d": {
207 | "version": "1.0.1",
208 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz",
209 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
210 | "requires": {
211 | "es5-ext": "^0.10.50",
212 | "type": "^1.0.1"
213 | }
214 | },
215 | "debug": {
216 | "version": "3.1.0",
217 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
218 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
219 | "requires": {
220 | "ms": "2.0.0"
221 | }
222 | },
223 | "deepmerge": {
224 | "version": "4.2.2",
225 | "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
226 | "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
227 | },
228 | "es5-ext": {
229 | "version": "0.10.53",
230 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz",
231 | "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==",
232 | "requires": {
233 | "es6-iterator": "~2.0.3",
234 | "es6-symbol": "~3.1.3",
235 | "next-tick": "~1.0.0"
236 | }
237 | },
238 | "es6-iterator": {
239 | "version": "2.0.3",
240 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz",
241 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=",
242 | "requires": {
243 | "d": "1",
244 | "es5-ext": "^0.10.35",
245 | "es6-symbol": "^3.1.1"
246 | }
247 | },
248 | "es6-symbol": {
249 | "version": "3.1.3",
250 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz",
251 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
252 | "requires": {
253 | "d": "^1.0.1",
254 | "ext": "^1.1.2"
255 | }
256 | },
257 | "es6-weak-map": {
258 | "version": "2.0.3",
259 | "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz",
260 | "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==",
261 | "requires": {
262 | "d": "1",
263 | "es5-ext": "^0.10.46",
264 | "es6-iterator": "^2.0.3",
265 | "es6-symbol": "^3.1.1"
266 | }
267 | },
268 | "escape-string-regexp": {
269 | "version": "1.0.5",
270 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
271 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
272 | },
273 | "event-emitter": {
274 | "version": "0.3.5",
275 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz",
276 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=",
277 | "requires": {
278 | "d": "1",
279 | "es5-ext": "~0.10.14"
280 | }
281 | },
282 | "ext": {
283 | "version": "1.4.0",
284 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz",
285 | "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==",
286 | "requires": {
287 | "type": "^2.0.0"
288 | },
289 | "dependencies": {
290 | "type": {
291 | "version": "2.0.0",
292 | "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz",
293 | "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow=="
294 | }
295 | }
296 | },
297 | "fast-decode-uri-component": {
298 | "version": "1.0.1",
299 | "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz",
300 | "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="
301 | },
302 | "fast-deep-equal": {
303 | "version": "3.1.3",
304 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
305 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
306 | },
307 | "fast-json-stable-stringify": {
308 | "version": "2.1.0",
309 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
310 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
311 | },
312 | "fast-json-stringify": {
313 | "version": "1.21.0",
314 | "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-1.21.0.tgz",
315 | "integrity": "sha512-xY6gyjmHN3AK1Y15BCbMpeO9+dea5ePVsp3BouHCdukcx0hOHbXwFhRodhcI0NpZIgDChSeAKkHW9YjKvhwKBA==",
316 | "requires": {
317 | "ajv": "^6.11.0",
318 | "deepmerge": "^4.2.2",
319 | "string-similarity": "^4.0.1"
320 | }
321 | },
322 | "fast-redact": {
323 | "version": "2.0.0",
324 | "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.0.0.tgz",
325 | "integrity": "sha512-zxpkULI9W9MNTK2sJ3BpPQrTEXFNESd2X6O1tXMFpK/XM0G5c5Rll2EVYZH2TqI3xRGK/VaJ+eEOt7pnENJpeA=="
326 | },
327 | "fast-safe-stringify": {
328 | "version": "2.0.7",
329 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
330 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA=="
331 | },
332 | "fastify": {
333 | "version": "2.15.1",
334 | "resolved": "https://registry.npmjs.org/fastify/-/fastify-2.15.1.tgz",
335 | "integrity": "sha512-pEE1pa5j/vtZeZTbPpFgsJgzLbThcYgiLDw2yZIG8qNZ5LkF1Ew2vbv9k3nTXNxGEPYFBbyNTCKRSj3JbX+FhA==",
336 | "requires": {
337 | "abstract-logging": "^2.0.0",
338 | "ajv": "^6.12.0",
339 | "avvio": "^6.4.1",
340 | "fast-json-stringify": "^1.18.0",
341 | "find-my-way": "^2.2.2",
342 | "flatstr": "^1.0.12",
343 | "light-my-request": "^3.7.3",
344 | "middie": "^4.1.0",
345 | "pino": "^5.17.0",
346 | "proxy-addr": "^2.0.6",
347 | "readable-stream": "^3.6.0",
348 | "rfdc": "^1.1.2",
349 | "secure-json-parse": "^2.1.0",
350 | "tiny-lru": "^7.0.2"
351 | },
352 | "dependencies": {
353 | "readable-stream": {
354 | "version": "3.6.0",
355 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
356 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
357 | "requires": {
358 | "inherits": "^2.0.3",
359 | "string_decoder": "^1.1.1",
360 | "util-deprecate": "^1.0.1"
361 | }
362 | },
363 | "safe-buffer": {
364 | "version": "5.2.1",
365 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
366 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
367 | },
368 | "string_decoder": {
369 | "version": "1.3.0",
370 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
371 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
372 | "requires": {
373 | "safe-buffer": "~5.2.0"
374 | }
375 | }
376 | }
377 | },
378 | "fastify-cors": {
379 | "version": "3.0.3",
380 | "resolved": "https://registry.npmjs.org/fastify-cors/-/fastify-cors-3.0.3.tgz",
381 | "integrity": "sha512-SDMa+GtyTTAU7pWZwY4fukb/VwCZ4c30p0oEaE7/d/+VCvceB1+NzW2udp2dSZZfWR7J1kUookCpw2dLmtAsSw==",
382 | "requires": {
383 | "fastify-plugin": "^1.6.0",
384 | "vary": "^1.1.2"
385 | }
386 | },
387 | "fastify-formbody": {
388 | "version": "3.2.0",
389 | "resolved": "https://registry.npmjs.org/fastify-formbody/-/fastify-formbody-3.2.0.tgz",
390 | "integrity": "sha512-/QGuH5RGbDwsEaMzS2cyxWh+cqC42w39ZcvOmdQsNW0s4F4ubfp0De4jY3hLVRk4HeeDsF/YCDgH6pKb/PuKjA==",
391 | "requires": {
392 | "fastify-plugin": "^1.6.1",
393 | "qs": "^6.9.4"
394 | },
395 | "dependencies": {
396 | "qs": {
397 | "version": "6.9.4",
398 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.4.tgz",
399 | "integrity": "sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ=="
400 | }
401 | }
402 | },
403 | "fastify-plugin": {
404 | "version": "1.6.1",
405 | "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-1.6.1.tgz",
406 | "integrity": "sha512-APBcb27s+MjaBIerFirYmBLatoPCgmHZM6XP0K+nDL9k0yX8NJPWDY1RAC3bh6z+AB5ULS2j31BUfLMT3uaZ4A==",
407 | "requires": {
408 | "semver": "^6.3.0"
409 | }
410 | },
411 | "fastq": {
412 | "version": "1.8.0",
413 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.8.0.tgz",
414 | "integrity": "sha512-SMIZoZdLh/fgofivvIkmknUXyPnvxRE3DhtZ5Me3Mrsk5gyPL42F0xr51TdRXskBxHfMp+07bcYzfsYEsSQA9Q==",
415 | "requires": {
416 | "reusify": "^1.0.4"
417 | }
418 | },
419 | "find-my-way": {
420 | "version": "2.2.3",
421 | "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-2.2.3.tgz",
422 | "integrity": "sha512-C7dxfbX8pV1maLd31ygkBEOaD51Ls4dROuHjeSQZf1FeQinUzq3UA/kSPecLSDy9iAQufd8w1zgp7j64kyLdhw==",
423 | "requires": {
424 | "fast-decode-uri-component": "^1.0.0",
425 | "safe-regex2": "^2.0.0",
426 | "semver-store": "^0.3.0"
427 | }
428 | },
429 | "flatstr": {
430 | "version": "1.0.12",
431 | "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
432 | "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw=="
433 | },
434 | "follow-redirects": {
435 | "version": "1.5.10",
436 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
437 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
438 | "requires": {
439 | "debug": "=3.1.0"
440 | }
441 | },
442 | "forwarded": {
443 | "version": "0.1.2",
444 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
445 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
446 | },
447 | "fs.realpath": {
448 | "version": "1.0.0",
449 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
450 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
451 | },
452 | "glob": {
453 | "version": "7.1.6",
454 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
455 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
456 | "requires": {
457 | "fs.realpath": "^1.0.0",
458 | "inflight": "^1.0.4",
459 | "inherits": "2",
460 | "minimatch": "^3.0.4",
461 | "once": "^1.3.0",
462 | "path-is-absolute": "^1.0.0"
463 | }
464 | },
465 | "has-flag": {
466 | "version": "3.0.0",
467 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
468 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
469 | },
470 | "inflight": {
471 | "version": "1.0.6",
472 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
473 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
474 | "requires": {
475 | "once": "^1.3.0",
476 | "wrappy": "1"
477 | }
478 | },
479 | "inherits": {
480 | "version": "2.0.3",
481 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
482 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
483 | },
484 | "ipaddr.js": {
485 | "version": "1.9.1",
486 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
487 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
488 | },
489 | "is-promise": {
490 | "version": "2.2.2",
491 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz",
492 | "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ=="
493 | },
494 | "iterare": {
495 | "version": "1.2.1",
496 | "resolved": "https://registry.npmjs.org/iterare/-/iterare-1.2.1.tgz",
497 | "integrity": "sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q=="
498 | },
499 | "json-schema-traverse": {
500 | "version": "0.4.1",
501 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
502 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
503 | },
504 | "light-my-request": {
505 | "version": "3.8.0",
506 | "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-3.8.0.tgz",
507 | "integrity": "sha512-cIOWmNsgoStysmkzcv2EwvLwMb2hEm6oqKMerG/b5ey9F0we2Qony8cAZgBktmGPYUvPyKsDCzMcYU6fXbpWew==",
508 | "requires": {
509 | "ajv": "^6.10.2",
510 | "cookie": "^0.4.0",
511 | "readable-stream": "^3.4.0",
512 | "set-cookie-parser": "^2.4.1"
513 | },
514 | "dependencies": {
515 | "readable-stream": {
516 | "version": "3.6.0",
517 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
518 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
519 | "requires": {
520 | "inherits": "^2.0.3",
521 | "string_decoder": "^1.1.1",
522 | "util-deprecate": "^1.0.1"
523 | }
524 | },
525 | "safe-buffer": {
526 | "version": "5.2.1",
527 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
528 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
529 | },
530 | "string_decoder": {
531 | "version": "1.3.0",
532 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
533 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
534 | "requires": {
535 | "safe-buffer": "~5.2.0"
536 | }
537 | }
538 | }
539 | },
540 | "lru-queue": {
541 | "version": "0.1.0",
542 | "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz",
543 | "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=",
544 | "requires": {
545 | "es5-ext": "~0.10.2"
546 | }
547 | },
548 | "media-typer": {
549 | "version": "0.3.0",
550 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
551 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
552 | },
553 | "memoizee": {
554 | "version": "0.4.14",
555 | "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.14.tgz",
556 | "integrity": "sha512-/SWFvWegAIYAO4NQMpcX+gcra0yEZu4OntmUdrBaWrJncxOqAziGFlHxc7yjKVK2uu3lpPW27P27wkR82wA8mg==",
557 | "requires": {
558 | "d": "1",
559 | "es5-ext": "^0.10.45",
560 | "es6-weak-map": "^2.0.2",
561 | "event-emitter": "^0.3.5",
562 | "is-promise": "^2.1",
563 | "lru-queue": "0.1",
564 | "next-tick": "1",
565 | "timers-ext": "^0.1.5"
566 | }
567 | },
568 | "middie": {
569 | "version": "4.1.0",
570 | "resolved": "https://registry.npmjs.org/middie/-/middie-4.1.0.tgz",
571 | "integrity": "sha512-eylPpZA+K3xO9kpDjagoPkEUkNcWV3EAo5OEz0MqsekUpT7KbnQkk8HNZkh4phx2vvOAmNNZuLRWF9lDDHPpVQ==",
572 | "requires": {
573 | "path-to-regexp": "^4.0.0",
574 | "reusify": "^1.0.2"
575 | },
576 | "dependencies": {
577 | "path-to-regexp": {
578 | "version": "4.0.5",
579 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-4.0.5.tgz",
580 | "integrity": "sha512-l+fTaGG2N9ZRpCEUj5fG1VKdDLaiqwCIvPngpnxzREhcdobhZC4ou4w984HBu72DqAJ5CfcdV6tjqNOunfpdsQ=="
581 | }
582 | }
583 | },
584 | "mime-db": {
585 | "version": "1.44.0",
586 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
587 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
588 | },
589 | "mime-types": {
590 | "version": "2.1.27",
591 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
592 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
593 | "requires": {
594 | "mime-db": "1.44.0"
595 | }
596 | },
597 | "minimatch": {
598 | "version": "3.0.4",
599 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
600 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
601 | "requires": {
602 | "brace-expansion": "^1.1.7"
603 | }
604 | },
605 | "ms": {
606 | "version": "2.0.0",
607 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
608 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
609 | },
610 | "next-tick": {
611 | "version": "1.0.0",
612 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz",
613 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
614 | },
615 | "node-fetch": {
616 | "version": "2.6.0",
617 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
618 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
619 | },
620 | "object-hash": {
621 | "version": "2.0.3",
622 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.0.3.tgz",
623 | "integrity": "sha512-JPKn0GMu+Fa3zt3Bmr66JhokJU5BaNBIh4ZeTlaCBzrBsOeXzwcKKAK1tbLiPKgvwmPXsDvvLHoWh5Bm7ofIYg=="
624 | },
625 | "once": {
626 | "version": "1.4.0",
627 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
628 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
629 | "requires": {
630 | "wrappy": "1"
631 | }
632 | },
633 | "path-is-absolute": {
634 | "version": "1.0.1",
635 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
636 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
637 | },
638 | "path-to-regexp": {
639 | "version": "3.2.0",
640 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz",
641 | "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA=="
642 | },
643 | "pino": {
644 | "version": "5.17.0",
645 | "resolved": "https://registry.npmjs.org/pino/-/pino-5.17.0.tgz",
646 | "integrity": "sha512-LqrqmRcJz8etUjyV0ddqB6OTUutCgQULPFg2b4dtijRHUsucaAdBgSUW58vY6RFSX+NT8963F+q0tM6lNwGShA==",
647 | "requires": {
648 | "fast-redact": "^2.0.0",
649 | "fast-safe-stringify": "^2.0.7",
650 | "flatstr": "^1.0.12",
651 | "pino-std-serializers": "^2.4.2",
652 | "quick-format-unescaped": "^3.0.3",
653 | "sonic-boom": "^0.7.5"
654 | }
655 | },
656 | "pino-std-serializers": {
657 | "version": "2.4.2",
658 | "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz",
659 | "integrity": "sha512-WaL504dO8eGs+vrK+j4BuQQq6GLKeCCcHaMB2ItygzVURcL1CycwNEUHTD/lHFHs/NL5qAz2UKrjYWXKSf4aMQ=="
660 | },
661 | "proxy-addr": {
662 | "version": "2.0.6",
663 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz",
664 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==",
665 | "requires": {
666 | "forwarded": "~0.1.2",
667 | "ipaddr.js": "1.9.1"
668 | }
669 | },
670 | "punycode": {
671 | "version": "2.1.1",
672 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
673 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
674 | },
675 | "quick-format-unescaped": {
676 | "version": "3.0.3",
677 | "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz",
678 | "integrity": "sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ=="
679 | },
680 | "reflect-metadata": {
681 | "version": "0.1.13",
682 | "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz",
683 | "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
684 | },
685 | "ret": {
686 | "version": "0.2.2",
687 | "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz",
688 | "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ=="
689 | },
690 | "reusify": {
691 | "version": "1.0.4",
692 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
693 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
694 | },
695 | "rfdc": {
696 | "version": "1.1.4",
697 | "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz",
698 | "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug=="
699 | },
700 | "rimraf": {
701 | "version": "3.0.2",
702 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
703 | "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
704 | "requires": {
705 | "glob": "^7.1.3"
706 | }
707 | },
708 | "rxjs": {
709 | "version": "6.6.0",
710 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.0.tgz",
711 | "integrity": "sha512-3HMA8z/Oz61DUHe+SdOiQyzIf4tOx5oQHmMir7IZEu6TMqCLHT4LRcmNaUS0NwOz8VLvmmBduMsoaUvMaIiqzg==",
712 | "requires": {
713 | "tslib": "^1.9.0"
714 | },
715 | "dependencies": {
716 | "tslib": {
717 | "version": "1.13.0",
718 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
719 | "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q=="
720 | }
721 | }
722 | },
723 | "safe-regex2": {
724 | "version": "2.0.0",
725 | "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz",
726 | "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==",
727 | "requires": {
728 | "ret": "~0.2.0"
729 | }
730 | },
731 | "secure-json-parse": {
732 | "version": "2.1.0",
733 | "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.1.0.tgz",
734 | "integrity": "sha512-GckO+MS/wT4UogDyoI/H/S1L0MCcKS1XX/vp48wfmU7Nw4woBmb8mIpu4zPBQjKlRT88/bt9xdoV4111jPpNJA=="
735 | },
736 | "semver": {
737 | "version": "6.3.0",
738 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
739 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
740 | },
741 | "semver-store": {
742 | "version": "0.3.0",
743 | "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz",
744 | "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg=="
745 | },
746 | "set-cookie-parser": {
747 | "version": "2.4.6",
748 | "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.4.6.tgz",
749 | "integrity": "sha512-mNCnTUF0OYPwYzSHbdRdCfNNHqrne+HS5tS5xNb6yJbdP9wInV0q5xPLE0EyfV/Q3tImo3y/OXpD8Jn0Jtnjrg=="
750 | },
751 | "sonic-boom": {
752 | "version": "0.7.7",
753 | "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.7.tgz",
754 | "integrity": "sha512-Ei5YOo5J64GKClHIL/5evJPgASXFVpfVYbJV9PILZQytTK6/LCwHvsZJW2Ig4p9FMC2OrBrMnXKgRN/OEoAWfg==",
755 | "requires": {
756 | "atomic-sleep": "^1.0.0",
757 | "flatstr": "^1.0.12"
758 | }
759 | },
760 | "string-similarity": {
761 | "version": "4.0.1",
762 | "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.1.tgz",
763 | "integrity": "sha512-v36MJzloekKVvKAsYi6O/qpn2mIuvwEFIT9Gx3yg4spkNjXYsk7yxc37g4ZTyMVIBvt/9PZGxnqEtme8XHK+Mw=="
764 | },
765 | "supports-color": {
766 | "version": "5.5.0",
767 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
768 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
769 | "requires": {
770 | "has-flag": "^3.0.0"
771 | }
772 | },
773 | "timers-ext": {
774 | "version": "0.1.7",
775 | "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz",
776 | "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==",
777 | "requires": {
778 | "es5-ext": "~0.10.46",
779 | "next-tick": "1"
780 | }
781 | },
782 | "tiny-lru": {
783 | "version": "7.0.6",
784 | "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-7.0.6.tgz",
785 | "integrity": "sha512-zNYO0Kvgn5rXzWpL0y3RS09sMK67eGaQj9805jlK9G6pSadfriTczzLHFXa/xcW4mIRfmlB9HyQ/+SgL0V1uow=="
786 | },
787 | "tslib": {
788 | "version": "2.0.0",
789 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.0.0.tgz",
790 | "integrity": "sha512-lTqkx847PI7xEDYJntxZH89L2/aXInsyF2luSafe/+0fHOMjlBNXdH6th7f70qxLDhul7KZK0zC8V5ZIyHl0/g=="
791 | },
792 | "type": {
793 | "version": "1.2.0",
794 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz",
795 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg=="
796 | },
797 | "type-is": {
798 | "version": "1.6.18",
799 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
800 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
801 | "requires": {
802 | "media-typer": "0.3.0",
803 | "mime-types": "~2.1.24"
804 | }
805 | },
806 | "uri-js": {
807 | "version": "4.2.2",
808 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
809 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
810 | "requires": {
811 | "punycode": "^2.1.0"
812 | }
813 | },
814 | "util-deprecate": {
815 | "version": "1.0.2",
816 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
817 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
818 | },
819 | "uuid": {
820 | "version": "8.2.0",
821 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.2.0.tgz",
822 | "integrity": "sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q=="
823 | },
824 | "vary": {
825 | "version": "1.1.2",
826 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
827 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
828 | },
829 | "wrappy": {
830 | "version": "1.0.2",
831 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
832 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
833 | }
834 | }
835 | }
836 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/layers/general/nodejs/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "general-layer",
3 | "version": "1.0.0",
4 | "dependencies": {
5 | "@nestjs/common": "^7.3.2",
6 | "@nestjs/core": "^7.3.2",
7 | "@nestjs/platform-fastify": "^7.3.2",
8 | "aws-serverless-fastify": "^1.0.18",
9 | "reflect-metadata": "^0.1.13",
10 | "rimraf": "^3.0.2",
11 | "rxjs": "^6.6.0"
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/nest-cli.json:
--------------------------------------------------------------------------------
1 | {
2 | "collection": "@nestjs/schematics",
3 | "sourceRoot": "src"
4 | }
5 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "nestjs-aws-serverless-express",
3 | "version": "0.0.1",
4 | "description": "",
5 | "author": "",
6 | "private": true,
7 | "license": "UNLICENSED",
8 | "scripts": {
9 | "prebuild": "rimraf dist",
10 | "build": "nest build",
11 | "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
12 | "start": "nest start",
13 | "start:dev": "nest start --watch",
14 | "start:debug": "nest start --debug --watch",
15 | "start:prod": "node dist/main",
16 | "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
17 | "test": "jest",
18 | "test:watch": "jest --watch",
19 | "test:cov": "jest --coverage",
20 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
21 | "test:e2e": "jest --config ./test/jest-e2e.json",
22 | "deploy:test:us-east-1": "sls deploy --stage test --region us-east-1",
23 | "undeploy:test:us-east-1": "sls remove --stage test --region us-east-1"
24 | },
25 | "dependencies": {
26 | "@nestjs/common": "^7.3.2",
27 | "@nestjs/core": "^7.3.2",
28 | "@nestjs/platform-express": "^7.3.2",
29 | "reflect-metadata": "^0.1.13",
30 | "rimraf": "^3.0.2",
31 | "rxjs": "^6.6.0"
32 | },
33 | "devDependencies": {
34 | "@nestjs/cli": "^7.4.1",
35 | "@nestjs/schematics": "^7.0.1",
36 | "@nestjs/testing": "^7.3.2",
37 | "@types/express": "^4.17.7",
38 | "@types/jest": "26.0.5",
39 | "@types/node": "^14.0.24",
40 | "@types/supertest": "^2.0.10",
41 | "@typescript-eslint/eslint-plugin": "3.7.0",
42 | "@typescript-eslint/parser": "3.7.0",
43 | "eslint": "7.5.0",
44 | "eslint-config-prettier": "^6.11.0",
45 | "eslint-plugin-import": "^2.22.0",
46 | "jest": "26.1.0",
47 | "prettier": "^2.0.5",
48 | "serverless-plugin-layer-manager": "^1.0.5",
49 | "supertest": "^4.0.2",
50 | "ts-jest": "26.1.3",
51 | "ts-loader": "^8.0.1",
52 | "ts-node": "^8.10.2",
53 | "tsconfig-paths": "^3.9.0",
54 | "typescript": "^3.9.7"
55 | },
56 | "jest": {
57 | "moduleFileExtensions": [
58 | "js",
59 | "json",
60 | "ts"
61 | ],
62 | "rootDir": "src",
63 | "testRegex": ".spec.ts$",
64 | "transform": {
65 | "^.+\\.(t|j)s$": "ts-jest"
66 | },
67 | "coverageDirectory": "../coverage",
68 | "testEnvironment": "node"
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/serverless.yml:
--------------------------------------------------------------------------------
1 | service: nestjs-aws-serverless-fastify
2 |
3 | provider:
4 | name: aws
5 | runtime: nodejs12.x
6 | project: nestjs-aws-serverless-fastify
7 | stage: ${opt:stage, 'dev'}
8 | region: ${opt:region, 'us-east-1'}
9 | apiName: ${self:provider.project}-${self:provider.stage}
10 | memorySize: 128
11 | environment:
12 | NODE_ENV: ${self:provider.stage}
13 |
14 | plugins:
15 | - serverless-plugin-layer-manager
16 |
17 | package:
18 | individually: true
19 | excludeDevDependencies: false
20 | exclude:
21 | - '.*/**'
22 | - '*'
23 | - apps/**
24 | - coverage/**
25 | - layers/**
26 | - libs/**
27 | - node_modules/**
28 | - src/**
29 | - test/**
30 |
31 | layers:
32 | GeneralNodeModules:
33 | path: ./layers/general
34 | name: ${self:custom.prefix-name}-node-modules-general
35 | description: 'General shared node modules'
36 | compatibleRuntimes:
37 | - nodejs10.x
38 | - nodejs12.x
39 |
40 | custom:
41 | prefix-name: ${self:service}-${self:provider.stage}
42 | layerConfig:
43 | installLayers: true
44 | exportLayers: true
45 | upgradeLayerReferences: true
46 |
47 | functions:
48 | hello-world:
49 | name: ${self:custom.prefix-name}
50 | handler: dist/examples/nestjs-aws-serverless-fastify/src/main-aws.handler
51 | timeout: 30
52 | layers:
53 | - {Ref: GeneralNodeModulesLambdaLayer}
54 | events:
55 | - http:
56 | path: /
57 | method: get
58 | package:
59 | include:
60 | - dist/**
61 | tags:
62 | project: ${self:provider.project}
63 | environment: ${self:provider.stage}
64 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/src/app.controller.spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { AppController } from './app.controller';
3 | import { AppService } from './app.service';
4 |
5 | describe('AppController', () => {
6 | let appController: AppController;
7 |
8 | beforeEach(async () => {
9 | const app: TestingModule = await Test.createTestingModule({
10 | controllers: [AppController],
11 | providers: [AppService],
12 | }).compile();
13 |
14 | appController = app.get(AppController);
15 | });
16 |
17 | describe('root', () => {
18 | it('should return "Hello World!"', () => {
19 | expect(appController.getHello()).toHaveProperty('msg', 'Hello World!');
20 | });
21 | });
22 | });
23 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/src/app.controller.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Get } from '@nestjs/common';
2 | import { AppService } from './app.service';
3 |
4 | @Controller()
5 | export class AppController {
6 |
7 | constructor(private readonly appService: AppService) {
8 | }
9 |
10 | @Get()
11 | getHello(): { msg: string } {
12 | return this.appService.getHello();
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/src/app.module.ts:
--------------------------------------------------------------------------------
1 | import { Module } from '@nestjs/common';
2 | import { AppController } from './app.controller';
3 | import { AppService } from './app.service';
4 |
5 | @Module({
6 | imports: [],
7 | controllers: [AppController],
8 | providers: [AppService],
9 | })
10 | export class AppModule {}
11 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/src/app.service.ts:
--------------------------------------------------------------------------------
1 | import { Injectable } from '@nestjs/common';
2 |
3 | @Injectable()
4 | export class AppService {
5 | getHello(): { msg: string } {
6 | return {
7 | msg: 'Hello World! from Nest.js with "Fastify" engine'
8 | };
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/src/main-aws.ts:
--------------------------------------------------------------------------------
1 | import { lambda } from '../../../lib';
2 | import { AppModule } from './app.module';
3 |
4 | export const handler = lambda(AppModule, {engine: 'fastify'});
5 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/src/main.ts:
--------------------------------------------------------------------------------
1 | import { NestFactory } from '@nestjs/core';
2 | import { AppModule } from './app.module';
3 |
4 | async function bootstrap() {
5 | const app = await NestFactory.create(AppModule);
6 | await app.listen(3000);
7 | }
8 | bootstrap();
9 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/test/app.e2e-spec.ts:
--------------------------------------------------------------------------------
1 | import { Test, TestingModule } from '@nestjs/testing';
2 | import { INestApplication } from '@nestjs/common';
3 | import * as request from 'supertest';
4 | import { AppModule } from '../src/app.module';
5 |
6 | describe('AppController (e2e)', () => {
7 | let app: INestApplication;
8 |
9 | beforeEach(async () => {
10 | const moduleFixture: TestingModule = await Test.createTestingModule({
11 | imports: [AppModule],
12 | }).compile();
13 |
14 | app = moduleFixture.createNestApplication();
15 | await app.init();
16 | });
17 |
18 | it('/ (GET)', () => {
19 | return request(app.getHttpServer())
20 | .get('/')
21 | .expect(200)
22 | .expect('Hello World!');
23 | });
24 | });
25 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/test/jest-e2e.json:
--------------------------------------------------------------------------------
1 | {
2 | "moduleFileExtensions": ["js", "json", "ts"],
3 | "rootDir": ".",
4 | "testEnvironment": "node",
5 | "testRegex": ".e2e-spec.ts$",
6 | "transform": {
7 | "^.+\\.(t|j)s$": "ts-jest"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "./tsconfig.json",
3 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
4 | }
5 |
--------------------------------------------------------------------------------
/examples/nestjs-aws-serverless-fastify/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "module": "commonjs",
4 | "declaration": true,
5 | "removeComments": true,
6 | "emitDecoratorMetadata": true,
7 | "experimentalDecorators": true,
8 | "allowSyntheticDefaultImports": true,
9 | "target": "es2017",
10 | "sourceMap": true,
11 | "outDir": "./dist",
12 | "baseUrl": "./",
13 | "incremental": true
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/lib/index.spec.ts:
--------------------------------------------------------------------------------
1 | import { Controller, Get, INestApplication, Module } from '@nestjs/common';
2 | import { executionAsyncId } from 'async_hooks';
3 | import { lambda } from './index';
4 |
5 | @Controller()
6 | export class HelloWorldController {
7 |
8 | @Get()
9 | getHello(): { msg: string } {
10 | return { msg: 'Hello World!' };
11 | }
12 | }
13 |
14 | @Module({
15 | controllers: [HelloWorldController],
16 | })
17 | export class HelloWorldModule {
18 | }
19 |
20 | const AWS_BATCH_WARMUP_EVENT = {
21 | "source": "serverless-plugin-warmup"
22 | };
23 |
24 | const AWS_HTTP_EVENT = {
25 | 'resource': '/',
26 | 'path': '/',
27 | 'httpMethod': 'GET',
28 | 'headers': {
29 | 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
30 | 'accept-encoding': 'gzip, deflate, br',
31 | 'accept-language': 'en-US,en;q=0.9',
32 | 'cookie': 's_fid=7AAB6XMPLAFD9BBF-0643XMPL09956DE2; regStatus=pre-register',
33 | 'Host': '70ixmpl4fl.execute-api.us-east-2.amazonaws.com',
34 | 'sec-fetch-dest': 'document',
35 | 'sec-fetch-mode': 'navigate',
36 | 'sec-fetch-site': 'none',
37 | 'upgrade-insecure-requests': '1',
38 | 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
39 | 'X-Amzn-Trace-Id': 'Root=1-5e66d96f-7491f09xmpl79d18acf3d050',
40 | 'X-Forwarded-For': '52.255.255.12',
41 | 'X-Forwarded-Port': '443',
42 | 'X-Forwarded-Proto': 'https',
43 | },
44 | 'multiValueHeaders': {
45 | 'accept': [
46 | 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
47 | ],
48 | 'accept-encoding': [
49 | 'gzip, deflate, br',
50 | ],
51 | 'accept-language': [
52 | 'en-US,en;q=0.9',
53 | ],
54 | 'cookie': [
55 | 's_fid=7AABXMPL1AFD9BBF-0643XMPL09956DE2; regStatus=pre-register;',
56 | ],
57 | 'Host': [
58 | '70ixmpl4fl.execute-api.ca-central-1.amazonaws.com',
59 | ],
60 | 'sec-fetch-dest': [
61 | 'document',
62 | ],
63 | 'sec-fetch-mode': [
64 | 'navigate',
65 | ],
66 | 'sec-fetch-site': [
67 | 'none',
68 | ],
69 | 'upgrade-insecure-requests': [
70 | '1',
71 | ],
72 | 'User-Agent': [
73 | 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
74 | ],
75 | 'X-Amzn-Trace-Id': [
76 | 'Root=1-5e66d96f-7491f09xmpl79d18acf3d050',
77 | ],
78 | 'X-Forwarded-For': [
79 | '52.255.255.12',
80 | ],
81 | 'X-Forwarded-Port': [
82 | '443',
83 | ],
84 | 'X-Forwarded-Proto': [
85 | 'https',
86 | ],
87 | },
88 | 'queryStringParameters': null,
89 | 'multiValueQueryStringParameters': null,
90 | 'pathParameters': null,
91 | 'stageVariables': null,
92 | 'requestContext': {
93 | 'resourceId': '2gxmpl',
94 | 'resourcePath': '/',
95 | 'httpMethod': 'GET',
96 | 'extendedRequestId': 'JJbxmplHYosFVYQ=',
97 | 'requestTime': '10/Mar/2020:00:03:59 +0000',
98 | 'path': '/Prod/',
99 | 'accountId': '123456789012',
100 | 'protocol': 'HTTP/1.1',
101 | 'stage': 'Prod',
102 | 'domainPrefix': '70ixmpl4fl',
103 | 'requestTimeEpoch': 1583798639428,
104 | 'requestId': '77375676-xmpl-4b79-853a-f982474efe18',
105 | 'identity': {
106 | 'cognitoIdentityPoolId': null,
107 | 'accountId': null,
108 | 'cognitoIdentityId': null,
109 | 'caller': null,
110 | 'sourceIp': '52.255.255.12',
111 | 'principalOrgId': null,
112 | 'accessKey': null,
113 | 'cognitoAuthenticationType': null,
114 | 'cognitoAuthenticationProvider': null,
115 | 'userArn': null,
116 | 'userAgent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
117 | 'user': null,
118 | },
119 | 'domainName': '70ixmpl4fl.execute-api.us-east-2.amazonaws.com',
120 | 'apiId': '70ixmpl4fl',
121 | },
122 | 'body': null,
123 | 'isBase64Encoded': false,
124 | };
125 |
126 | describe('HelloWorldModule', () => {
127 |
128 | describe('Express', () => {
129 | it('should return "Hello World!"', async (done) => {
130 | const handler = lambda(HelloWorldModule);
131 | const context = {};
132 | const callback = () => {};
133 |
134 | const res = await handler(AWS_HTTP_EVENT, context as any, callback);
135 |
136 | expect(res).toBeDefined();
137 | expect(res).toHaveProperty('body', '{"msg":"Hello World!"}');
138 | expect(res).toHaveProperty('headers.x-powered-by', 'Express');
139 | done();
140 | });
141 | });
142 |
143 | describe('Fastify', () => {
144 | it('should return "Hello World!" with binaryMimeTypes', async (done) => {
145 | const handler = lambda(HelloWorldModule, {
146 | engine: 'fastify',
147 | fastify: { binaryTypes: ['application/octet-stream'] },
148 | });
149 | const context = {};
150 | const callback = () => {};
151 |
152 | const res = await handler(AWS_HTTP_EVENT, context as any, callback);
153 |
154 | expect(res).toBeDefined();
155 | expect(res).toHaveProperty('body', '{"msg":"Hello World!"}');
156 | done();
157 | });
158 |
159 | it('should return "Hello World!"', async (done) => {
160 | const handler = lambda(HelloWorldModule, { engine: 'fastify' });
161 | const context = {};
162 | const callback = () => {};
163 |
164 | const res = await handler(AWS_HTTP_EVENT, context as any, callback);
165 |
166 | expect(res).toBeDefined();
167 | expect(res).toHaveProperty('body', '{"msg":"Hello World!"}');
168 | done();
169 | });
170 | });
171 |
172 | describe('Warmup Event', () => {
173 | it('should return "Lambda is warm!"', async (done) => {
174 | const handler = lambda(HelloWorldModule);
175 | const context = {};
176 | const callback = () => {};
177 |
178 | const res = await handler(AWS_BATCH_WARMUP_EVENT, context as any, callback);
179 |
180 | expect(res).toBeDefined();
181 | expect(res).toBe('Lambda is warm!');
182 | done();
183 | });
184 | });
185 |
186 | describe('onBeforeInit & onAfterInit', () => {
187 | it('should set before and after variables!"', async (done) => {
188 |
189 | let opt = 1;
190 |
191 | const nestjs = {
192 | onBeforeInit: (app: INestApplication) => {
193 | opt++;
194 | app.enableCors({
195 | origin: "localhost"
196 | });
197 | },
198 | onAfterInit: (app: INestApplication) => {
199 | if(opt != 2) {
200 | throw new Error("onBeforeInit not called");
201 | }
202 | }
203 | }
204 |
205 | const handler = lambda(HelloWorldModule, { engine: 'express', nestjs });
206 | const context = {};
207 | const callback = () => {};
208 |
209 | const res = await handler(AWS_HTTP_EVENT, context as any, callback);
210 |
211 | expect(res).toBeDefined();
212 | expect(res).toHaveProperty('body', '{"msg":"Hello World!"}');
213 | expect(res).toHaveProperty('headers.access-control-allow-origin', 'localhost');
214 |
215 | done();
216 | });
217 | });
218 | });
219 |
--------------------------------------------------------------------------------
/lib/index.ts:
--------------------------------------------------------------------------------
1 | import { APIGatewayProxyEvent, APIGatewayProxyResult, Context, EventBridgeEvent, SQSEvent } from 'aws-lambda';
2 | import { ProxyResult } from 'aws-serverless-express';
3 | import { INestApplication, NestApplicationOptions } from '@nestjs/common';
4 | import * as http from 'http';
5 |
6 | export interface Options {
7 | engine: 'express' | 'fastify',
8 | warmup?: {
9 | source: string;
10 | }
11 | fastify?: {
12 | options?: any;
13 | binaryTypes?: string[];
14 | },
15 | nestjs?: {
16 | options?: NestApplicationOptions,
17 | onBeforeInit?: (app: INestApplication) => void,
18 | onAfterInit?: (app: INestApplication) => void
19 | }
20 | }
21 |
22 | const create = async (module: any, opts: Options) => {
23 | const { NestFactory } = await import('@nestjs/core');
24 |
25 | if(opts.engine == 'fastify') {
26 | const { FastifyAdapter } = await import('@nestjs/platform-fastify');
27 | return NestFactory.create(module, new FastifyAdapter(opts.fastify?.options), opts.nestjs?.options);
28 | }
29 |
30 | return await NestFactory.create(module, opts.nestjs?.options);
31 | }
32 |
33 | const init = async (app: INestApplication, opts: Options) => {
34 | if(opts.nestjs?.onBeforeInit) {
35 | opts.nestjs.onBeforeInit(app);
36 | }
37 |
38 | await app.init();
39 |
40 | if(opts.engine == 'fastify') {
41 | const instance = app.getHttpAdapter().getInstance();
42 | await instance.ready();
43 | }
44 |
45 | if(opts.nestjs?.onAfterInit) {
46 | opts.nestjs.onAfterInit(app);
47 | }
48 |
49 | }
50 |
51 | const bootstrap = async (module: any, opts: Options): Promise => {
52 |
53 | const app = await create(module, opts);
54 | await init(app, opts);
55 |
56 | return app;
57 |
58 | };
59 |
60 | const handleAPIGatewayProxyEvent = async (app: INestApplication, event: APIGatewayProxyEvent, context: Context, opts: Options): Promise => {
61 | if (opts.engine === 'fastify') {
62 | const { proxy } = await import('aws-serverless-fastify');
63 | return await proxy(app.getHttpAdapter().getInstance(), event, context, opts.fastify?.binaryTypes || []);
64 | } else { // Default Express
65 | const { proxy, createServer } = await import('aws-serverless-express');
66 | return proxy(createServer(app.getHttpAdapter().getInstance()), event, context, 'PROMISE').promise;
67 | }
68 | };
69 |
70 | // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
71 | export const lambda = (module: any, options?: Options): any => {
72 | const opts: Options = options ? options : { engine: 'express', warmup: { source: 'serverless-plugin-warmup'}, nestjs: {} };
73 | if (opts.fastify) {
74 | opts.fastify.binaryTypes = opts.fastify.binaryTypes || [];
75 | }
76 | if(!opts.nestjs) {
77 | opts.nestjs = {};
78 | }
79 |
80 | let cachedApp: INestApplication;
81 | return async (event: APIGatewayProxyEvent & SQSEvent & EventBridgeEvent, context: Context): Promise => {
82 | // Immediate response for WarmUp plugin
83 | if (event?.source && event?.source === opts?.warmup?.source) return 'Lambda is warm!';
84 |
85 | if (event?.httpMethod) {
86 | // App bootstrap
87 | if (!cachedApp) {
88 | cachedApp = await bootstrap(module, opts);
89 | }
90 |
91 | return handleAPIGatewayProxyEvent(cachedApp, event, context, opts);
92 | }
93 | };
94 | };
95 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "@gcoreplus/nestjs-aws-serverless",
3 | "version": "1.1.0",
4 | "description": "Provides default handler for nestjs on lambda",
5 | "author": "Rennan Stefan Boni",
6 | "main": "./dist/index.js",
7 | "typings": "./dist/index.d.ts",
8 | "files": [
9 | "dist/",
10 | "README.MD",
11 | "LICENCE.MD"
12 | ],
13 | "homepage": "https://rennanboni.com",
14 | "repository": {
15 | "type": "git",
16 | "url": "git+https://github.com/gCorePlus/nestjs-aws-serverless.git"
17 | },
18 | "contributors": [
19 | {
20 | "name": "Rennan Stefan Boni",
21 | "email": "rennanboni@gmail.com"
22 | }
23 | ],
24 | "scripts": {
25 | "clean": "rm -rf dist",
26 | "prebuild": "npm run clean",
27 | "build": "tsc -p tsconfig.build.json",
28 | "format": "prettier --write \"lib/**/*.ts\"",
29 | "publish:npm": "npm publish --access public",
30 | "test": "jest",
31 | "test:watch": "jest --watch",
32 | "test:cov": "jest --coverage",
33 | "test:codecov": "codecov",
34 | "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand"
35 | },
36 | "keywords": [
37 | "aws",
38 | "express",
39 | "fastify",
40 | "lambda",
41 | "nestjs",
42 | "node",
43 | "node.js",
44 | "nodejs",
45 | "serverless"
46 | ],
47 | "license": "ISC",
48 | "dependencies": {},
49 | "peerDependencies": {
50 | "@nestjs/common": "^7.4.2",
51 | "@nestjs/core": "^7.4.2",
52 | "reflect-metadata": "^0.1.13",
53 | "rxjs": "^6.6.2"
54 | },
55 | "devDependencies": {
56 | "@nestjs/common": "^7.4.2",
57 | "@nestjs/core": "^7.4.2",
58 | "@nestjs/platform-express": "^7.4.2",
59 | "@nestjs/platform-fastify": "^7.4.2",
60 | "@nestjs/testing": "^7.4.2",
61 | "@types/aws-serverless-express": "^3.3.3",
62 | "@types/jest": "^26.0.10",
63 | "@types/node": "^14.6.0",
64 | "aws-lambda": "^1.0.6",
65 | "aws-serverless-express": "^3.3.8",
66 | "aws-serverless-fastify": "^1.0.21",
67 | "codecov": "^3.7.2",
68 | "jest": "^26.4.0",
69 | "prettier": "^2.0.5",
70 | "reflect-metadata": "^0.1.13",
71 | "rxjs": "^6.6.2",
72 | "ts-jest": "^26.2.0",
73 | "tsconfig-paths": "^3.9.0",
74 | "typescript": "^3.9.7"
75 | },
76 | "jest": {
77 | "moduleFileExtensions": [
78 | "js",
79 | "json",
80 | "ts"
81 | ],
82 | "rootDir": "lib",
83 | "testRegex": ".spec.ts$",
84 | "transform": {
85 | "^.+\\.(t|j)s$": "ts-jest"
86 | },
87 | "coverageDirectory": "../coverage",
88 | "testEnvironment": "node"
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/tsconfig.build.json:
--------------------------------------------------------------------------------
1 | {
2 | "exclude": ["node_modules", "test", "dist", "**/*spec.ts"],
3 | "extends": "./tsconfig.json",
4 | "compilerOptions": {
5 | "sourceMap": true,
6 | "inlineSources": true,
7 | "sourceRoot": "/"
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "declaration": true,
4 | "module": "commonjs",
5 | "strict": true,
6 | "removeComments": true,
7 | "noLib": false,
8 | "emitDecoratorMetadata": true,
9 | "experimentalDecorators": true,
10 | "target": "es6",
11 | "sourceMap": false,
12 | "outDir": "./dist",
13 | "rootDir": "./lib",
14 | "skipLibCheck": true,
15 | "moduleResolution": "node"
16 | },
17 | "include": [
18 | "lib/**/*"
19 | ],
20 | "exclude": [
21 | "node_modules"
22 | ]
23 | }
24 |
--------------------------------------------------------------------------------