├── .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 | [![npm version](http://img.shields.io/npm/v/@gcoreplus/nestjs-aws-serverless.svg?style=flat)](https://npmjs.org/package/@gCorePlus/nestjs-aws-serverless "View this project on npm") 2 | [![Codecov Coverage](https://codecov.io/gh/gCorePlus/nestjs-aws-serverless/branch/master/graph/badge.svg)](https://codecov.io/gh/gCorePlus/nestjs-aws-serverless) 3 | [![ISC license](http://img.shields.io/badge/license-ISC-brightgreen.svg)](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 | Rennan Stefan Boni 100 | 101 | 102 | 103 | Paulo Márcio 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 | Nest Logo 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 | NPM Version 13 | Package License 14 | NPM Downloads 15 | Travis 16 | Linux 17 | Coverage 18 | Gitter 19 | Backers on Open Collective 20 | Sponsors on Open Collective 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 | Nest Logo 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 | NPM Version 13 | Package License 14 | NPM Downloads 15 | Travis 16 | Linux 17 | Coverage 18 | Gitter 19 | Backers on Open Collective 20 | Sponsors on Open Collective 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 | --------------------------------------------------------------------------------