├── .github
└── FUNDING.yml
├── .gitignore
├── .gitlab-ci.yml
├── Dockerfile
├── LICENSE
├── app.json
├── cosmo1.png
├── dist
├── app.js
├── app.js.map
├── models
│ ├── Bird.js
│ ├── Bird.js.map
│ ├── Cat.js
│ ├── Cat.js.map
│ ├── Dog.js
│ └── Dog.js.map
├── router.js
├── router.js.map
├── server.js
├── server.js.map
└── swagger.json
├── docker-compose.yml
├── docs
├── delete-example.png
├── dp-in-typescript.jpg
├── dp-in-typescript_w100.png
├── dp_typescript_116.jpg
├── dp_typescript_250.jpg
├── flag_au.gif
├── flag_br.gif
├── flag_ca.gif
├── flag_de.gif
├── flag_es.gif
├── flag_fr.gif
├── flag_in.gif
├── flag_it.gif
├── flag_jp.gif
├── flag_mx.gif
├── flag_nl.gif
├── flag_uk.gif
├── flag_us.gif
├── get-example.png
├── get-id-example.png
├── post-example.png
├── put-example.png
├── swagger.png
├── threejs-course-image-43x24.gif
├── threejs-course-image-w100.png
├── threejs-course-image.png
├── threejs-typescript-250.jpg
├── threejs_typescript_116.jpg
├── tssock-course-w100.png
├── tssock-course.png
└── tssock-course_43x24.gif
├── nginx
├── Dockerfile
├── nginx.conf
└── static
│ └── index.html
├── package-lock.json
├── package.json
├── readme.md
├── src
├── app.ts
├── models
│ ├── Bird.ts
│ ├── Cat.ts
│ └── Dog.ts
├── router.ts
├── server.ts
└── swagger.json
└── tsconfig.json
/.github/FUNDING.yml:
--------------------------------------------------------------------------------
1 | # These are supported funding model platforms
2 |
3 | github: [Sean-Bradley]# Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
4 | patreon: seanwasere
5 | open_collective: # Replace with a single Open Collective username
6 | ko_fi: sean_bradley
7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
9 | liberapay: # Replace with a single Liberapay username
10 | issuehunt: # Replace with a single IssueHunt username
11 | otechie: # Replace with a single Otechie username
12 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
13 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | npm-debug.log
3 | dist/
--------------------------------------------------------------------------------
/.gitlab-ci.yml:
--------------------------------------------------------------------------------
1 | image: docker:latest
2 | services:
3 | - docker:dind
4 |
5 | stages:
6 | - test
7 | - deploy
8 |
9 | step-develop:
10 | stage: test
11 | before_script:
12 | - export DYNAMIC_ENV_VAR=DEVELOP
13 | only:
14 | - develop
15 | tags:
16 | - develop
17 | script:
18 | - echo running tests in $DYNAMIC_ENV_VAR
19 |
20 | step-uat:
21 | stage: deploy
22 | before_script:
23 | - export DYNAMIC_ENV_VAR=UAT
24 | only:
25 | - uat
26 | tags:
27 | - uat
28 | script:
29 | - echo setting up env $DYNAMIC_ENV_VAR
30 | - sudo apt-get install -y python-pip
31 | - sudo pip install docker-compose
32 | - sudo docker image prune -f
33 | - sudo docker-compose -f docker-compose.yml build --no-cache
34 | - sudo docker-compose -f docker-compose.yml up -d
35 |
36 | step-deploy-staging:
37 | stage: deploy
38 | before_script:
39 | - export DYNAMIC_ENV_VAR=STAGING
40 | only:
41 | - staging
42 | tags:
43 | - staging
44 | script:
45 | - echo setting up env $DYNAMIC_ENV_VAR
46 | - sudo apt-get install -y python-pip
47 | - sudo pip install docker-compose
48 | - sudo docker image prune -f
49 | - sudo docker-compose -f docker-compose.yml build --no-cache
50 | - sudo docker-compose -f docker-compose.yml up -d
51 |
52 | step-deploy-production:
53 | stage: deploy
54 | before_script:
55 | - export DYNAMIC_ENV_VAR=PRODUCTION
56 | only:
57 | - production
58 | tags:
59 | - production
60 | script:
61 | - echo setting up env $DYNAMIC_ENV_VAR
62 | - sudo apt-get install -y python-pip
63 | - sudo pip install docker-compose
64 | - sudo docker image prune -f
65 | - sudo docker-compose -f docker-compose.yml build --no-cache
66 | - sudo docker-compose -f docker-compose.yml up -d
67 | when: manual
68 |
69 |
70 |
71 |
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM node:alpine
2 |
3 | LABEL github=https://github.com/Sean-Bradley
4 |
5 | COPY src /nodejs/src
6 | COPY package.json /nodejs/package.json
7 | COPY tsconfig.json /nodejs/tsconfig.json
8 |
9 | WORKDIR /nodejs
10 |
11 | RUN npm install
12 |
13 | EXPOSE 3000:3000
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 seanwasere youtube
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/app.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "seans-typescript-nodejs-crud-rest-api-boilerplate",
3 | "description": "A barebones TypeScript Node.js CRUD REST API",
4 | "repository": "https://github.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate",
5 | "logo": "https://github.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/blob/master/cosmo1.png",
6 | "keywords": ["node", "typescript", "crud", "seanwasere"]
7 | }
--------------------------------------------------------------------------------
/cosmo1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/cosmo1.png
--------------------------------------------------------------------------------
/dist/app.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 | if (k2 === undefined) k2 = k;
4 | var desc = Object.getOwnPropertyDescriptor(m, k);
5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6 | desc = { enumerable: true, get: function() { return m[k]; } };
7 | }
8 | Object.defineProperty(o, k2, desc);
9 | }) : (function(o, m, k, k2) {
10 | if (k2 === undefined) k2 = k;
11 | o[k2] = m[k];
12 | }));
13 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14 | Object.defineProperty(o, "default", { enumerable: true, value: v });
15 | }) : function(o, v) {
16 | o["default"] = v;
17 | });
18 | var __importStar = (this && this.__importStar) || function (mod) {
19 | if (mod && mod.__esModule) return mod;
20 | var result = {};
21 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22 | __setModuleDefault(result, mod);
23 | return result;
24 | };
25 | var __importDefault = (this && this.__importDefault) || function (mod) {
26 | return (mod && mod.__esModule) ? mod : { "default": mod };
27 | };
28 | Object.defineProperty(exports, "__esModule", { value: true });
29 | const express_1 = __importDefault(require("express"));
30 | const router_1 = __importDefault(require("./router"));
31 | const swagger_ui_express_1 = __importDefault(require("swagger-ui-express"));
32 | const swaggerDocument = __importStar(require("./swagger.json"));
33 | const bodyParser = __importStar(require("body-parser"));
34 | class App {
35 | constructor() {
36 | this.Start = (port) => {
37 | return new Promise((resolve, reject) => {
38 | this.httpServer.listen(port, () => {
39 | resolve(port);
40 | })
41 | .on('error', (err) => reject(err));
42 | });
43 | };
44 | this.httpServer = (0, express_1.default)();
45 | this.httpServer.use(bodyParser.urlencoded({ extended: true }));
46 | this.httpServer.use(bodyParser.json());
47 | new router_1.default(this.httpServer);
48 | this.httpServer.use('/swagger', swagger_ui_express_1.default.serve, swagger_ui_express_1.default.setup(swaggerDocument));
49 | }
50 | }
51 | exports.default = App;
52 |
--------------------------------------------------------------------------------
/dist/app.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sDAA6B;AAC7B,sDAA6B;AAC7B,4EAA0C;AAC1C,gEAAiD;AACjD,wDAAyC;AAEzC,MAAM,GAAG;IAGP;QAWO,UAAK,GAAG,CAAC,IAAY,EAAE,EAAE;YAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAErC,IAAI,CAAC,UAAU,CAAC,MAAM,CACpB,IAAI,EACJ,GAAG,EAAE;oBACH,OAAO,CAAC,IAAI,CAAC,CAAA;gBACf,CAAC,CAAC;qBACD,EAAE,CAAC,OAAO,EAAE,CAAC,GAAW,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QApBC,IAAI,CAAC,UAAU,GAAG,iBAAO,EAAE,CAAA;QAE3B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAEvC,IAAI,gBAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,EAAE,4BAAS,CAAC,KAAK,EAAE,4BAAS,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACrF,CAAC;CAaF;AAED,kBAAe,GAAG,CAAC"}
--------------------------------------------------------------------------------
/dist/models/Bird.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 |
--------------------------------------------------------------------------------
/dist/models/Bird.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"Bird.js","sourceRoot":"","sources":["../../src/models/Bird.ts"],"names":[],"mappings":""}
--------------------------------------------------------------------------------
/dist/models/Cat.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 |
--------------------------------------------------------------------------------
/dist/models/Cat.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"Cat.js","sourceRoot":"","sources":["../../src/models/Cat.ts"],"names":[],"mappings":""}
--------------------------------------------------------------------------------
/dist/models/Dog.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | Object.defineProperty(exports, "__esModule", { value: true });
3 |
--------------------------------------------------------------------------------
/dist/models/Dog.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"Dog.js","sourceRoot":"","sources":["../../src/models/Dog.ts"],"names":[],"mappings":""}
--------------------------------------------------------------------------------
/dist/router.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 | if (k2 === undefined) k2 = k;
4 | var desc = Object.getOwnPropertyDescriptor(m, k);
5 | if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6 | desc = { enumerable: true, get: function() { return m[k]; } };
7 | }
8 | Object.defineProperty(o, k2, desc);
9 | }) : (function(o, m, k, k2) {
10 | if (k2 === undefined) k2 = k;
11 | o[k2] = m[k];
12 | }));
13 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14 | Object.defineProperty(o, "default", { enumerable: true, value: v });
15 | }) : function(o, v) {
16 | o["default"] = v;
17 | });
18 | var __importStar = (this && this.__importStar) || function (mod) {
19 | if (mod && mod.__esModule) return mod;
20 | var result = {};
21 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22 | __setModuleDefault(result, mod);
23 | return result;
24 | };
25 | var __importDefault = (this && this.__importDefault) || function (mod) {
26 | return (mod && mod.__esModule) ? mod : { "default": mod };
27 | };
28 | Object.defineProperty(exports, "__esModule", { value: true });
29 | const express = __importStar(require("express"));
30 | const uuid_1 = require("uuid");
31 | const cors_1 = __importDefault(require("cors"));
32 | class Router {
33 | constructor(server) {
34 | const router = express.Router();
35 | const cats = new Map();
36 | cats[(0, uuid_1.v4)()] = { genus: "feline", name: "Cosmo", isHungry: true, lastFedDate: new Date() };
37 | cats[(0, uuid_1.v4)()] = { genus: "feline", name: "Emmy", isHungry: true, lastFedDate: new Date() };
38 | router.get('/', (req, res) => {
39 | res.json({
40 | message: `Nothing to see here, [url]/cats instead.`
41 | });
42 | });
43 | //get all cats
44 | router.get('/cats', (0, cors_1.default)(), (req, res) => {
45 | res.json({
46 | cats
47 | });
48 | });
49 | //create new cat
50 | router.post('/cats', (0, cors_1.default)(), (req, res) => {
51 | try {
52 | let cat = {};
53 | Object.assign(cat, req.body);
54 | const newUUID = (0, uuid_1.v4)();
55 | cats[newUUID] = cat;
56 | res.json({
57 | uuid: newUUID
58 | });
59 | }
60 | catch (e) {
61 | res.status(400).send(JSON.stringify({ "error": "problem with posted data" }));
62 | }
63 | });
64 | //get cat by id
65 | router.get('/cats/:id', (0, cors_1.default)(), (req, res) => {
66 | if (!!cats[req.params.id]) {
67 | res.json({
68 | cat: cats[req.params.id]
69 | });
70 | }
71 | else {
72 | res.status(404).send(JSON.stringify({ "error": "no such cat" }));
73 | }
74 | });
75 | //update cat
76 | router.put('/cats/:id', (0, cors_1.default)(), (req, res) => {
77 | try {
78 | if (!!cats[req.params.id]) {
79 | let cat = {};
80 | Object.assign(cat, req.body);
81 | cats[req.params.id] = cat;
82 | res.json({
83 | cat: cats[req.params.id]
84 | });
85 | }
86 | else {
87 | res.status(404).send(JSON.stringify({ "error": "no such cat" }));
88 | }
89 | }
90 | catch (e) {
91 | res.status(400).send(JSON.stringify({ "error": "problem with posted data" }));
92 | }
93 | });
94 | //delete cat
95 | router.delete('/cats/:id', (0, cors_1.default)(), (req, res) => {
96 | if (!!cats[req.params.id]) {
97 | delete cats[req.params.id];
98 | res.json({
99 | uuid: req.params.id
100 | });
101 | }
102 | else {
103 | res.status(404).send(JSON.stringify({ "error": "no such cat" }));
104 | }
105 | });
106 | router.options('*', (0, cors_1.default)());
107 | server.use('/', router);
108 | }
109 | }
110 | exports.default = Router;
111 |
--------------------------------------------------------------------------------
/dist/router.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAAkC;AAElC,+BAAkC;AAClC,gDAAuB;AAEvB,MAAM,MAAM;IAER,YAAY,MAAuB;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAA;QAE/B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAe,CAAC;QACpC,IAAI,CAAC,SAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAA;QAC1F,IAAI,CAAC,SAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,IAAI,EAAE,EAAE,CAAA;QAEzF,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YAC5D,GAAG,CAAC,IAAI,CAAC;gBACL,OAAO,EAAE,0CAA0C;aACtD,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,cAAc;QACd,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,cAAI,EAAE,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YACxE,GAAG,CAAC,IAAI,CAAC;gBACL,IAAI;aACP,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,gBAAgB;QAChB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAI,EAAE,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YACzE,IAAI;gBACA,IAAI,GAAG,GAAQ,EAAS,CAAC;gBACzB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;gBAC5B,MAAM,OAAO,GAAG,SAAI,EAAE,CAAC;gBACvB,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC;gBACpB,GAAG,CAAC,IAAI,CAAC;oBACL,IAAI,EAAE,OAAO;iBAChB,CAAC,CAAA;aACL;YAAC,OAAO,CAAC,EAAE;gBACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;aACjF;QACL,CAAC,CAAC,CAAA;QAEF,eAAe;QACf,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,cAAI,EAAE,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YAC5E,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBACvB,GAAG,CAAC,IAAI,CAAC;oBACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;iBAC3B,CAAC,CAAA;aACL;iBAAM;gBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;aACpE;QACL,CAAC,CAAC,CAAA;QAEF,YAAY;QACZ,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,cAAI,EAAE,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YAC5E,IAAI;gBACA,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;oBACvB,IAAI,GAAG,GAAQ,EAAS,CAAC;oBACzB,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAA;oBAC5B,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC;oBAC1B,GAAG,CAAC,IAAI,CAAC;wBACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;qBAC3B,CAAC,CAAA;iBACL;qBAAM;oBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;iBACpE;aACJ;YAAC,OAAO,CAAC,EAAE;gBACR,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;aACjF;QACL,CAAC,CAAC,CAAA;QAEF,YAAY;QACZ,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,cAAI,EAAE,EAAE,CAAC,GAAoB,EAAE,GAAqB,EAAE,EAAE;YAC/E,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;gBACvB,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;gBAC1B,GAAG,CAAC,IAAI,CAAC;oBACL,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE;iBACtB,CAAC,CAAA;aACL;iBAAM;gBACH,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC;aACpE;QACL,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,cAAI,EAAE,CAAC,CAAC;QAE5B,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;IAC3B,CAAC;CACJ;AAED,kBAAe,MAAM,CAAC"}
--------------------------------------------------------------------------------
/dist/server.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 | var __importDefault = (this && this.__importDefault) || function (mod) {
3 | return (mod && mod.__esModule) ? mod : { "default": mod };
4 | };
5 | Object.defineProperty(exports, "__esModule", { value: true });
6 | const app_1 = __importDefault(require("./app"));
7 | const port = parseInt(process.env.PORT || '3000');
8 | const server = new app_1.default().Start(port)
9 | .then(port => console.log(`Server running on port ${port}`))
10 | .catch(error => {
11 | console.log(error);
12 | process.exit(1);
13 | });
14 | exports.default = server;
15 |
--------------------------------------------------------------------------------
/dist/server.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;;;;AAAA,gDAAuB;AAEvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,IAAI,CAAA;AAErC,MAAM,MAAM,GAAG,IAAI,aAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;KACjC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC;KAC3D,KAAK,CAAC,KAAK,CAAC,EAAE;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC;AAEL,kBAAe,MAAM,CAAC"}
--------------------------------------------------------------------------------
/dist/swagger.json:
--------------------------------------------------------------------------------
1 | {
2 | "openapi": "3.0.0",
3 | "info": {
4 | "version": "1.0.0",
5 | "title": "Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate",
6 | "description": "A minimal and easy to follow example of what you need to create a CRUD style API in NodeJs using TypeScript",
7 | "license": {
8 | "name": "MIT",
9 | "url": "https://opensource.org/licenses/MIT"
10 | }
11 | },
12 | "servers": [
13 | {
14 | "url": "/",
15 | "description": "Local Dev, or from Heroku"
16 | },
17 | {
18 | "url": "/api/",
19 | "description": "With docker-compose and nginx proxy"
20 | }
21 | ],
22 | "tags": [
23 | {
24 | "name": "Cats",
25 | "description": "API for cats in the system"
26 | }
27 | ],
28 | "consumes": [
29 | "application/json"
30 | ],
31 | "produces": [
32 | "application/json"
33 | ],
34 | "paths": {
35 | "/cats": {
36 | "get": {
37 | "tags": [
38 | "Cats"
39 | ],
40 | "summary": "Get all cats in system",
41 | "responses": {
42 | "200": {
43 | "description": "OK",
44 | "schema": {
45 | "$ref": "#/definitions/Cats"
46 | }
47 | }
48 | }
49 | },
50 | "post": {
51 | "tags": [
52 | "Cats"
53 | ],
54 | "summary": "Create a new cat in system",
55 | "requestBody": {
56 | "description": "Cat Object",
57 | "required": true,
58 | "content": {
59 | "application/json": {
60 | "schema": {
61 | "$ref": "#/definitions/Cat"
62 | }
63 | }
64 | }
65 | },
66 | "produces": [
67 | "application/json"
68 | ],
69 | "responses": {
70 | "200": {
71 | "description": "OK",
72 | "schema": {
73 | "$ref": "#/definitions/id"
74 | }
75 | },
76 | "400": {
77 | "description": "Failed. Bad post data."
78 | }
79 | }
80 | }
81 | },
82 | "/cats/{id}": {
83 | "parameters": [
84 | {
85 | "name": "id",
86 | "in": "path",
87 | "required": true,
88 | "description": "ID of the cat that we want to match",
89 | "type": "string"
90 | }
91 | ],
92 | "get": {
93 | "tags": [
94 | "Cats"
95 | ],
96 | "summary": "Get cat with given ID",
97 | "parameters": [
98 | {
99 | "in": "path",
100 | "name": "id",
101 | "required": true,
102 | "description": "Cat with id",
103 | "schema": {
104 | "$ref": "#/definitions/id"
105 | }
106 | }
107 | ],
108 | "responses": {
109 | "200": {
110 | "description": "OK",
111 | "schema": {
112 | "$ref": "#/definitions/Cat"
113 | }
114 | },
115 | "404": {
116 | "description": "Failed. Cat not found."
117 | }
118 | }
119 | },
120 | "put": {
121 | "summary": "Update cat with given ID",
122 | "tags": [
123 | "Cats"
124 | ],
125 | "requestBody": {
126 | "description": "Cat Object",
127 | "required": true,
128 | "content": {
129 | "application/json": {
130 | "schema": {
131 | "$ref": "#/definitions/Cat"
132 | }
133 | }
134 | }
135 | },
136 | "parameters": [
137 | {
138 | "in": "path",
139 | "name": "id",
140 | "required": true,
141 | "description": "Cat with new values of properties",
142 | "schema": {
143 | "$ref": "#/definitions/id"
144 | }
145 | }
146 | ],
147 | "responses": {
148 | "200": {
149 | "description": "OK",
150 | "schema": {
151 | "$ref": "#/definitions/Cat"
152 | }
153 | },
154 | "400": {
155 | "description": "Failed. Bad post data."
156 | },
157 | "404": {
158 | "description": "Failed. Cat not found."
159 | }
160 | }
161 | },
162 | "delete": {
163 | "summary": "Delete cat with given ID",
164 | "tags": [
165 | "Cats"
166 | ],
167 | "parameters": [
168 | {
169 | "in": "path",
170 | "name": "id",
171 | "required": true,
172 | "description": "Delete Cat with id",
173 | "schema": {
174 | "$ref": "#/definitions/id"
175 | }
176 | }
177 | ],
178 | "responses": {
179 | "200": {
180 | "description": "OK",
181 | "schema": {
182 | "$ref": "#/definitions/id"
183 | }
184 | },
185 | "404": {
186 | "description": "Failed. Cat not found."
187 | }
188 | }
189 | }
190 | }
191 | },
192 | "definitions": {
193 | "id": {
194 | "properties": {
195 | "uuid": {
196 | "type": "string"
197 | }
198 | }
199 | },
200 | "Cat": {
201 | "type": "object",
202 | "properties": {
203 | "genus": {
204 | "type": "string"
205 | },
206 | "name": {
207 | "type": "string"
208 | },
209 | "isHungry": {
210 | "type": "boolean"
211 | },
212 | "lastFedDate": {
213 | "type": "string"
214 | }
215 | }
216 | },
217 | "Cats": {
218 | "type": "object",
219 | "properties": {
220 | "cats": {
221 | "type": "object",
222 | "additionalProperties": {
223 | "$ref": "#/definitions/Cat"
224 | }
225 | }
226 | }
227 | }
228 | }
229 | }
230 |
--------------------------------------------------------------------------------
/docker-compose.yml:
--------------------------------------------------------------------------------
1 | version: '2'
2 | services:
3 | nginx:
4 | build:
5 | context: nginx
6 | dockerfile: Dockerfile
7 | ports:
8 | - "80:80"
9 | command: nginx -g "daemon off";
10 | depends_on:
11 | - nodejs
12 |
13 | nodejs:
14 | build:
15 | context: .
16 | dockerfile: Dockerfile
17 | image: service-cats:1.01
18 | expose:
19 | - "3000"
20 | command: npm start
21 |
22 |
--------------------------------------------------------------------------------
/docs/delete-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/delete-example.png
--------------------------------------------------------------------------------
/docs/dp-in-typescript.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/dp-in-typescript.jpg
--------------------------------------------------------------------------------
/docs/dp-in-typescript_w100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/dp-in-typescript_w100.png
--------------------------------------------------------------------------------
/docs/dp_typescript_116.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/dp_typescript_116.jpg
--------------------------------------------------------------------------------
/docs/dp_typescript_250.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/dp_typescript_250.jpg
--------------------------------------------------------------------------------
/docs/flag_au.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_au.gif
--------------------------------------------------------------------------------
/docs/flag_br.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_br.gif
--------------------------------------------------------------------------------
/docs/flag_ca.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_ca.gif
--------------------------------------------------------------------------------
/docs/flag_de.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_de.gif
--------------------------------------------------------------------------------
/docs/flag_es.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_es.gif
--------------------------------------------------------------------------------
/docs/flag_fr.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_fr.gif
--------------------------------------------------------------------------------
/docs/flag_in.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_in.gif
--------------------------------------------------------------------------------
/docs/flag_it.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_it.gif
--------------------------------------------------------------------------------
/docs/flag_jp.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_jp.gif
--------------------------------------------------------------------------------
/docs/flag_mx.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_mx.gif
--------------------------------------------------------------------------------
/docs/flag_nl.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_nl.gif
--------------------------------------------------------------------------------
/docs/flag_uk.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_uk.gif
--------------------------------------------------------------------------------
/docs/flag_us.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/flag_us.gif
--------------------------------------------------------------------------------
/docs/get-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/get-example.png
--------------------------------------------------------------------------------
/docs/get-id-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/get-id-example.png
--------------------------------------------------------------------------------
/docs/post-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/post-example.png
--------------------------------------------------------------------------------
/docs/put-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/put-example.png
--------------------------------------------------------------------------------
/docs/swagger.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/swagger.png
--------------------------------------------------------------------------------
/docs/threejs-course-image-43x24.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/threejs-course-image-43x24.gif
--------------------------------------------------------------------------------
/docs/threejs-course-image-w100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/threejs-course-image-w100.png
--------------------------------------------------------------------------------
/docs/threejs-course-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/threejs-course-image.png
--------------------------------------------------------------------------------
/docs/threejs-typescript-250.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/threejs-typescript-250.jpg
--------------------------------------------------------------------------------
/docs/threejs_typescript_116.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/threejs_typescript_116.jpg
--------------------------------------------------------------------------------
/docs/tssock-course-w100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/tssock-course-w100.png
--------------------------------------------------------------------------------
/docs/tssock-course.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/tssock-course.png
--------------------------------------------------------------------------------
/docs/tssock-course_43x24.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Sean-Bradley/Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate/0542164d3c949cabbde6ac351a37796079082738/docs/tssock-course_43x24.gif
--------------------------------------------------------------------------------
/nginx/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM nginx
2 | LABEL github=https://github.com/Sean-Bradley
3 | COPY /nginx.conf /etc/nginx/nginx.conf
4 | #COPY /server.crt /etc/nginx/server.crt
5 | #COPY /server.key /etc/nginx/server.key
6 | COPY /static /static
7 |
--------------------------------------------------------------------------------
/nginx/nginx.conf:
--------------------------------------------------------------------------------
1 | user www-data;
2 | worker_processes 1;
3 | pid /run/nginx.pid;
4 | events {
5 | worker_connections 768;
6 | }
7 | http {
8 | sendfile off;
9 | tcp_nopush on;
10 | tcp_nodelay on;
11 | keepalive_timeout 65;
12 | types_hash_max_size 2048;
13 | include /etc/nginx/mime.types;
14 | default_type application/octet-stream;
15 | #access_log /var/log/nginx/access.log;
16 | error_log /var/log/nginx/error.log;
17 | gzip on;
18 | gzip_disable "msie6";
19 | server {
20 | listen 80;
21 | server_name localhost;
22 | #ssl_certificate server.crt;
23 | #ssl_certificate_key server.key;
24 | location / {
25 | root /static;
26 | index index.html;
27 | }
28 | location /api/ {
29 | proxy_pass_header Server;
30 | proxy_set_header Host $http_host;
31 | proxy_set_header X-Real-IP $remote_addr;
32 | proxy_set_header X-Scheme $scheme;
33 | proxy_set_header X-Real-IP $remote_addr;
34 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
35 | proxy_redirect off;
36 | proxy_connect_timeout 20;
37 | proxy_read_timeout 20;
38 | proxy_pass http://nodejs:3000/;
39 | }
40 | }
41 | }
42 |
--------------------------------------------------------------------------------
/nginx/static/index.html:
--------------------------------------------------------------------------------
1 | put the static html generated from you favourite front end framework here.
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "seans-typescript-nodejs-crud-rest-api-boilerplate",
3 | "version": "1.0.1",
4 | "lockfileVersion": 3,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "seans-typescript-nodejs-crud-rest-api-boilerplate",
9 | "version": "1.0.1",
10 | "license": "ISC",
11 | "dependencies": {
12 | "@types/express": "^4.17.11",
13 | "@types/node": "^13.13.40",
14 | "body-parser": "^1.20.2",
15 | "cors": "^2.8.5",
16 | "express": "^4.18.2",
17 | "swagger-ui-express": "^5.0.0",
18 | "typescript": "^5.2.2",
19 | "uuid": "^9.0.1"
20 | },
21 | "devDependencies": {
22 | "concurrently": "^8.2.2",
23 | "nodemon": "^3.0.1"
24 | }
25 | },
26 | "node_modules/@babel/runtime": {
27 | "version": "7.23.2",
28 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
29 | "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
30 | "dev": true,
31 | "dependencies": {
32 | "regenerator-runtime": "^0.14.0"
33 | },
34 | "engines": {
35 | "node": ">=6.9.0"
36 | }
37 | },
38 | "node_modules/@types/body-parser": {
39 | "version": "1.19.0",
40 | "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.0.tgz",
41 | "integrity": "sha512-W98JrE0j2K78swW4ukqMleo8R7h/pFETjM2DQ90MF6XK2i4LO4W3gQ71Lt4w3bfm2EvVSyWHplECvB5sK22yFQ==",
42 | "dependencies": {
43 | "@types/connect": "*",
44 | "@types/node": "*"
45 | }
46 | },
47 | "node_modules/@types/connect": {
48 | "version": "3.4.34",
49 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.34.tgz",
50 | "integrity": "sha512-ePPA/JuI+X0vb+gSWlPKOY0NdNAie/rPUqX2GUPpbZwiKTkSPhjXWuee47E4MtE54QVzGCQMQkAL6JhV2E1+cQ==",
51 | "dependencies": {
52 | "@types/node": "*"
53 | }
54 | },
55 | "node_modules/@types/express": {
56 | "version": "4.17.11",
57 | "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.11.tgz",
58 | "integrity": "sha512-no+R6rW60JEc59977wIxreQVsIEOAYwgCqldrA/vkpCnbD7MqTefO97lmoBe4WE0F156bC4uLSP1XHDOySnChg==",
59 | "dependencies": {
60 | "@types/body-parser": "*",
61 | "@types/express-serve-static-core": "^4.17.18",
62 | "@types/qs": "*",
63 | "@types/serve-static": "*"
64 | }
65 | },
66 | "node_modules/@types/express-serve-static-core": {
67 | "version": "4.17.18",
68 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.18.tgz",
69 | "integrity": "sha512-m4JTwx5RUBNZvky/JJ8swEJPKFd8si08pPF2PfizYjGZOKr/svUWPcoUmLow6MmPzhasphB7gSTINY67xn3JNA==",
70 | "dependencies": {
71 | "@types/node": "*",
72 | "@types/qs": "*",
73 | "@types/range-parser": "*"
74 | }
75 | },
76 | "node_modules/@types/mime": {
77 | "version": "2.0.3",
78 | "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz",
79 | "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q=="
80 | },
81 | "node_modules/@types/node": {
82 | "version": "13.13.40",
83 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.40.tgz",
84 | "integrity": "sha512-eKaRo87lu1yAXrzEJl0zcJxfUMDT5/mZalFyOkT44rnQps41eS2pfWzbaulSPpQLFNy29bFqn+Y5lOTL8ATlEQ=="
85 | },
86 | "node_modules/@types/qs": {
87 | "version": "6.9.5",
88 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.5.tgz",
89 | "integrity": "sha512-/JHkVHtx/REVG0VVToGRGH2+23hsYLHdyG+GrvoUGlGAd0ErauXDyvHtRI/7H7mzLm+tBCKA7pfcpkQ1lf58iQ=="
90 | },
91 | "node_modules/@types/range-parser": {
92 | "version": "1.2.3",
93 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.3.tgz",
94 | "integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
95 | },
96 | "node_modules/@types/serve-static": {
97 | "version": "1.13.8",
98 | "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.8.tgz",
99 | "integrity": "sha512-MoJhSQreaVoL+/hurAZzIm8wafFR6ajiTM1m4A0kv6AGeVBl4r4pOV8bGFrjjq1sGxDTnCoF8i22o0/aE5XCyA==",
100 | "dependencies": {
101 | "@types/mime": "*",
102 | "@types/node": "*"
103 | }
104 | },
105 | "node_modules/abbrev": {
106 | "version": "1.1.1",
107 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
108 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
109 | "dev": true
110 | },
111 | "node_modules/accepts": {
112 | "version": "1.3.8",
113 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
114 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
115 | "dependencies": {
116 | "mime-types": "~2.1.34",
117 | "negotiator": "0.6.3"
118 | },
119 | "engines": {
120 | "node": ">= 0.6"
121 | }
122 | },
123 | "node_modules/ansi-regex": {
124 | "version": "5.0.1",
125 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
126 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
127 | "dev": true,
128 | "engines": {
129 | "node": ">=8"
130 | }
131 | },
132 | "node_modules/ansi-styles": {
133 | "version": "4.3.0",
134 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
135 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
136 | "dev": true,
137 | "dependencies": {
138 | "color-convert": "^2.0.1"
139 | },
140 | "engines": {
141 | "node": ">=8"
142 | },
143 | "funding": {
144 | "url": "https://github.com/chalk/ansi-styles?sponsor=1"
145 | }
146 | },
147 | "node_modules/anymatch": {
148 | "version": "3.1.3",
149 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
150 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
151 | "dev": true,
152 | "dependencies": {
153 | "normalize-path": "^3.0.0",
154 | "picomatch": "^2.0.4"
155 | },
156 | "engines": {
157 | "node": ">= 8"
158 | }
159 | },
160 | "node_modules/array-flatten": {
161 | "version": "1.1.1",
162 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
163 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
164 | },
165 | "node_modules/balanced-match": {
166 | "version": "1.0.2",
167 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
168 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
169 | "dev": true
170 | },
171 | "node_modules/binary-extensions": {
172 | "version": "2.2.0",
173 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
174 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
175 | "dev": true,
176 | "engines": {
177 | "node": ">=8"
178 | }
179 | },
180 | "node_modules/body-parser": {
181 | "version": "1.20.2",
182 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz",
183 | "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==",
184 | "dependencies": {
185 | "bytes": "3.1.2",
186 | "content-type": "~1.0.5",
187 | "debug": "2.6.9",
188 | "depd": "2.0.0",
189 | "destroy": "1.2.0",
190 | "http-errors": "2.0.0",
191 | "iconv-lite": "0.4.24",
192 | "on-finished": "2.4.1",
193 | "qs": "6.11.0",
194 | "raw-body": "2.5.2",
195 | "type-is": "~1.6.18",
196 | "unpipe": "1.0.0"
197 | },
198 | "engines": {
199 | "node": ">= 0.8",
200 | "npm": "1.2.8000 || >= 1.4.16"
201 | }
202 | },
203 | "node_modules/brace-expansion": {
204 | "version": "1.1.11",
205 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
206 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
207 | "dev": true,
208 | "dependencies": {
209 | "balanced-match": "^1.0.0",
210 | "concat-map": "0.0.1"
211 | }
212 | },
213 | "node_modules/braces": {
214 | "version": "3.0.2",
215 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
216 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
217 | "dev": true,
218 | "dependencies": {
219 | "fill-range": "^7.0.1"
220 | },
221 | "engines": {
222 | "node": ">=8"
223 | }
224 | },
225 | "node_modules/bytes": {
226 | "version": "3.1.2",
227 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
228 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
229 | "engines": {
230 | "node": ">= 0.8"
231 | }
232 | },
233 | "node_modules/call-bind": {
234 | "version": "1.0.5",
235 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz",
236 | "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==",
237 | "dependencies": {
238 | "function-bind": "^1.1.2",
239 | "get-intrinsic": "^1.2.1",
240 | "set-function-length": "^1.1.1"
241 | },
242 | "funding": {
243 | "url": "https://github.com/sponsors/ljharb"
244 | }
245 | },
246 | "node_modules/chalk": {
247 | "version": "4.1.2",
248 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
249 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
250 | "dev": true,
251 | "dependencies": {
252 | "ansi-styles": "^4.1.0",
253 | "supports-color": "^7.1.0"
254 | },
255 | "engines": {
256 | "node": ">=10"
257 | },
258 | "funding": {
259 | "url": "https://github.com/chalk/chalk?sponsor=1"
260 | }
261 | },
262 | "node_modules/chalk/node_modules/has-flag": {
263 | "version": "4.0.0",
264 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
265 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
266 | "dev": true,
267 | "engines": {
268 | "node": ">=8"
269 | }
270 | },
271 | "node_modules/chalk/node_modules/supports-color": {
272 | "version": "7.2.0",
273 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
274 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
275 | "dev": true,
276 | "dependencies": {
277 | "has-flag": "^4.0.0"
278 | },
279 | "engines": {
280 | "node": ">=8"
281 | }
282 | },
283 | "node_modules/chokidar": {
284 | "version": "3.5.3",
285 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
286 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
287 | "dev": true,
288 | "funding": [
289 | {
290 | "type": "individual",
291 | "url": "https://paulmillr.com/funding/"
292 | }
293 | ],
294 | "dependencies": {
295 | "anymatch": "~3.1.2",
296 | "braces": "~3.0.2",
297 | "glob-parent": "~5.1.2",
298 | "is-binary-path": "~2.1.0",
299 | "is-glob": "~4.0.1",
300 | "normalize-path": "~3.0.0",
301 | "readdirp": "~3.6.0"
302 | },
303 | "engines": {
304 | "node": ">= 8.10.0"
305 | },
306 | "optionalDependencies": {
307 | "fsevents": "~2.3.2"
308 | }
309 | },
310 | "node_modules/cliui": {
311 | "version": "8.0.1",
312 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
313 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
314 | "dev": true,
315 | "dependencies": {
316 | "string-width": "^4.2.0",
317 | "strip-ansi": "^6.0.1",
318 | "wrap-ansi": "^7.0.0"
319 | },
320 | "engines": {
321 | "node": ">=12"
322 | }
323 | },
324 | "node_modules/color-convert": {
325 | "version": "2.0.1",
326 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
327 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
328 | "dev": true,
329 | "dependencies": {
330 | "color-name": "~1.1.4"
331 | },
332 | "engines": {
333 | "node": ">=7.0.0"
334 | }
335 | },
336 | "node_modules/color-name": {
337 | "version": "1.1.4",
338 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
339 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
340 | "dev": true
341 | },
342 | "node_modules/concat-map": {
343 | "version": "0.0.1",
344 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
345 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
346 | "dev": true
347 | },
348 | "node_modules/concurrently": {
349 | "version": "8.2.2",
350 | "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz",
351 | "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==",
352 | "dev": true,
353 | "dependencies": {
354 | "chalk": "^4.1.2",
355 | "date-fns": "^2.30.0",
356 | "lodash": "^4.17.21",
357 | "rxjs": "^7.8.1",
358 | "shell-quote": "^1.8.1",
359 | "spawn-command": "0.0.2",
360 | "supports-color": "^8.1.1",
361 | "tree-kill": "^1.2.2",
362 | "yargs": "^17.7.2"
363 | },
364 | "bin": {
365 | "conc": "dist/bin/concurrently.js",
366 | "concurrently": "dist/bin/concurrently.js"
367 | },
368 | "engines": {
369 | "node": "^14.13.0 || >=16.0.0"
370 | },
371 | "funding": {
372 | "url": "https://github.com/open-cli-tools/concurrently?sponsor=1"
373 | }
374 | },
375 | "node_modules/content-disposition": {
376 | "version": "0.5.4",
377 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
378 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
379 | "dependencies": {
380 | "safe-buffer": "5.2.1"
381 | },
382 | "engines": {
383 | "node": ">= 0.6"
384 | }
385 | },
386 | "node_modules/content-type": {
387 | "version": "1.0.5",
388 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
389 | "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
390 | "engines": {
391 | "node": ">= 0.6"
392 | }
393 | },
394 | "node_modules/cookie": {
395 | "version": "0.5.0",
396 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
397 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
398 | "engines": {
399 | "node": ">= 0.6"
400 | }
401 | },
402 | "node_modules/cookie-signature": {
403 | "version": "1.0.6",
404 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
405 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
406 | },
407 | "node_modules/cors": {
408 | "version": "2.8.5",
409 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
410 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
411 | "dependencies": {
412 | "object-assign": "^4",
413 | "vary": "^1"
414 | },
415 | "engines": {
416 | "node": ">= 0.10"
417 | }
418 | },
419 | "node_modules/date-fns": {
420 | "version": "2.30.0",
421 | "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
422 | "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
423 | "dev": true,
424 | "dependencies": {
425 | "@babel/runtime": "^7.21.0"
426 | },
427 | "engines": {
428 | "node": ">=0.11"
429 | },
430 | "funding": {
431 | "type": "opencollective",
432 | "url": "https://opencollective.com/date-fns"
433 | }
434 | },
435 | "node_modules/debug": {
436 | "version": "2.6.9",
437 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
438 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
439 | "dependencies": {
440 | "ms": "2.0.0"
441 | }
442 | },
443 | "node_modules/define-data-property": {
444 | "version": "1.1.1",
445 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz",
446 | "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==",
447 | "dependencies": {
448 | "get-intrinsic": "^1.2.1",
449 | "gopd": "^1.0.1",
450 | "has-property-descriptors": "^1.0.0"
451 | },
452 | "engines": {
453 | "node": ">= 0.4"
454 | }
455 | },
456 | "node_modules/depd": {
457 | "version": "2.0.0",
458 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
459 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
460 | "engines": {
461 | "node": ">= 0.8"
462 | }
463 | },
464 | "node_modules/destroy": {
465 | "version": "1.2.0",
466 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
467 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
468 | "engines": {
469 | "node": ">= 0.8",
470 | "npm": "1.2.8000 || >= 1.4.16"
471 | }
472 | },
473 | "node_modules/ee-first": {
474 | "version": "1.1.1",
475 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
476 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
477 | },
478 | "node_modules/emoji-regex": {
479 | "version": "8.0.0",
480 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
481 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
482 | "dev": true
483 | },
484 | "node_modules/encodeurl": {
485 | "version": "1.0.2",
486 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
487 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
488 | "engines": {
489 | "node": ">= 0.8"
490 | }
491 | },
492 | "node_modules/escalade": {
493 | "version": "3.1.1",
494 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
495 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
496 | "dev": true,
497 | "engines": {
498 | "node": ">=6"
499 | }
500 | },
501 | "node_modules/escape-html": {
502 | "version": "1.0.3",
503 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
504 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
505 | },
506 | "node_modules/etag": {
507 | "version": "1.8.1",
508 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
509 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
510 | "engines": {
511 | "node": ">= 0.6"
512 | }
513 | },
514 | "node_modules/express": {
515 | "version": "4.18.2",
516 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
517 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
518 | "dependencies": {
519 | "accepts": "~1.3.8",
520 | "array-flatten": "1.1.1",
521 | "body-parser": "1.20.1",
522 | "content-disposition": "0.5.4",
523 | "content-type": "~1.0.4",
524 | "cookie": "0.5.0",
525 | "cookie-signature": "1.0.6",
526 | "debug": "2.6.9",
527 | "depd": "2.0.0",
528 | "encodeurl": "~1.0.2",
529 | "escape-html": "~1.0.3",
530 | "etag": "~1.8.1",
531 | "finalhandler": "1.2.0",
532 | "fresh": "0.5.2",
533 | "http-errors": "2.0.0",
534 | "merge-descriptors": "1.0.1",
535 | "methods": "~1.1.2",
536 | "on-finished": "2.4.1",
537 | "parseurl": "~1.3.3",
538 | "path-to-regexp": "0.1.7",
539 | "proxy-addr": "~2.0.7",
540 | "qs": "6.11.0",
541 | "range-parser": "~1.2.1",
542 | "safe-buffer": "5.2.1",
543 | "send": "0.18.0",
544 | "serve-static": "1.15.0",
545 | "setprototypeof": "1.2.0",
546 | "statuses": "2.0.1",
547 | "type-is": "~1.6.18",
548 | "utils-merge": "1.0.1",
549 | "vary": "~1.1.2"
550 | },
551 | "engines": {
552 | "node": ">= 0.10.0"
553 | }
554 | },
555 | "node_modules/express/node_modules/body-parser": {
556 | "version": "1.20.1",
557 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
558 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
559 | "dependencies": {
560 | "bytes": "3.1.2",
561 | "content-type": "~1.0.4",
562 | "debug": "2.6.9",
563 | "depd": "2.0.0",
564 | "destroy": "1.2.0",
565 | "http-errors": "2.0.0",
566 | "iconv-lite": "0.4.24",
567 | "on-finished": "2.4.1",
568 | "qs": "6.11.0",
569 | "raw-body": "2.5.1",
570 | "type-is": "~1.6.18",
571 | "unpipe": "1.0.0"
572 | },
573 | "engines": {
574 | "node": ">= 0.8",
575 | "npm": "1.2.8000 || >= 1.4.16"
576 | }
577 | },
578 | "node_modules/express/node_modules/raw-body": {
579 | "version": "2.5.1",
580 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
581 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
582 | "dependencies": {
583 | "bytes": "3.1.2",
584 | "http-errors": "2.0.0",
585 | "iconv-lite": "0.4.24",
586 | "unpipe": "1.0.0"
587 | },
588 | "engines": {
589 | "node": ">= 0.8"
590 | }
591 | },
592 | "node_modules/fill-range": {
593 | "version": "7.0.1",
594 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
595 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
596 | "dev": true,
597 | "dependencies": {
598 | "to-regex-range": "^5.0.1"
599 | },
600 | "engines": {
601 | "node": ">=8"
602 | }
603 | },
604 | "node_modules/finalhandler": {
605 | "version": "1.2.0",
606 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
607 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
608 | "dependencies": {
609 | "debug": "2.6.9",
610 | "encodeurl": "~1.0.2",
611 | "escape-html": "~1.0.3",
612 | "on-finished": "2.4.1",
613 | "parseurl": "~1.3.3",
614 | "statuses": "2.0.1",
615 | "unpipe": "~1.0.0"
616 | },
617 | "engines": {
618 | "node": ">= 0.8"
619 | }
620 | },
621 | "node_modules/forwarded": {
622 | "version": "0.2.0",
623 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
624 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
625 | "engines": {
626 | "node": ">= 0.6"
627 | }
628 | },
629 | "node_modules/fresh": {
630 | "version": "0.5.2",
631 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
632 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
633 | "engines": {
634 | "node": ">= 0.6"
635 | }
636 | },
637 | "node_modules/fsevents": {
638 | "version": "2.3.3",
639 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
640 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
641 | "dev": true,
642 | "hasInstallScript": true,
643 | "optional": true,
644 | "os": [
645 | "darwin"
646 | ],
647 | "engines": {
648 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
649 | }
650 | },
651 | "node_modules/function-bind": {
652 | "version": "1.1.2",
653 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
654 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
655 | "funding": {
656 | "url": "https://github.com/sponsors/ljharb"
657 | }
658 | },
659 | "node_modules/get-caller-file": {
660 | "version": "2.0.5",
661 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
662 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
663 | "dev": true,
664 | "engines": {
665 | "node": "6.* || 8.* || >= 10.*"
666 | }
667 | },
668 | "node_modules/get-intrinsic": {
669 | "version": "1.2.2",
670 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz",
671 | "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==",
672 | "dependencies": {
673 | "function-bind": "^1.1.2",
674 | "has-proto": "^1.0.1",
675 | "has-symbols": "^1.0.3",
676 | "hasown": "^2.0.0"
677 | },
678 | "funding": {
679 | "url": "https://github.com/sponsors/ljharb"
680 | }
681 | },
682 | "node_modules/glob-parent": {
683 | "version": "5.1.2",
684 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
685 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
686 | "dev": true,
687 | "dependencies": {
688 | "is-glob": "^4.0.1"
689 | },
690 | "engines": {
691 | "node": ">= 6"
692 | }
693 | },
694 | "node_modules/gopd": {
695 | "version": "1.0.1",
696 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
697 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
698 | "dependencies": {
699 | "get-intrinsic": "^1.1.3"
700 | },
701 | "funding": {
702 | "url": "https://github.com/sponsors/ljharb"
703 | }
704 | },
705 | "node_modules/has-flag": {
706 | "version": "3.0.0",
707 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
708 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
709 | "dev": true,
710 | "engines": {
711 | "node": ">=4"
712 | }
713 | },
714 | "node_modules/has-property-descriptors": {
715 | "version": "1.0.1",
716 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz",
717 | "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==",
718 | "dependencies": {
719 | "get-intrinsic": "^1.2.2"
720 | },
721 | "funding": {
722 | "url": "https://github.com/sponsors/ljharb"
723 | }
724 | },
725 | "node_modules/has-proto": {
726 | "version": "1.0.1",
727 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
728 | "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
729 | "engines": {
730 | "node": ">= 0.4"
731 | },
732 | "funding": {
733 | "url": "https://github.com/sponsors/ljharb"
734 | }
735 | },
736 | "node_modules/has-symbols": {
737 | "version": "1.0.3",
738 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
739 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
740 | "engines": {
741 | "node": ">= 0.4"
742 | },
743 | "funding": {
744 | "url": "https://github.com/sponsors/ljharb"
745 | }
746 | },
747 | "node_modules/hasown": {
748 | "version": "2.0.0",
749 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
750 | "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
751 | "dependencies": {
752 | "function-bind": "^1.1.2"
753 | },
754 | "engines": {
755 | "node": ">= 0.4"
756 | }
757 | },
758 | "node_modules/http-errors": {
759 | "version": "2.0.0",
760 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
761 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
762 | "dependencies": {
763 | "depd": "2.0.0",
764 | "inherits": "2.0.4",
765 | "setprototypeof": "1.2.0",
766 | "statuses": "2.0.1",
767 | "toidentifier": "1.0.1"
768 | },
769 | "engines": {
770 | "node": ">= 0.8"
771 | }
772 | },
773 | "node_modules/iconv-lite": {
774 | "version": "0.4.24",
775 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
776 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
777 | "dependencies": {
778 | "safer-buffer": ">= 2.1.2 < 3"
779 | },
780 | "engines": {
781 | "node": ">=0.10.0"
782 | }
783 | },
784 | "node_modules/ignore-by-default": {
785 | "version": "1.0.1",
786 | "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz",
787 | "integrity": "sha1-SMptcvbGo68Aqa1K5odr44ieKwk=",
788 | "dev": true
789 | },
790 | "node_modules/inherits": {
791 | "version": "2.0.4",
792 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
793 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
794 | },
795 | "node_modules/ipaddr.js": {
796 | "version": "1.9.1",
797 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
798 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
799 | "engines": {
800 | "node": ">= 0.10"
801 | }
802 | },
803 | "node_modules/is-binary-path": {
804 | "version": "2.1.0",
805 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
806 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
807 | "dev": true,
808 | "dependencies": {
809 | "binary-extensions": "^2.0.0"
810 | },
811 | "engines": {
812 | "node": ">=8"
813 | }
814 | },
815 | "node_modules/is-extglob": {
816 | "version": "2.1.1",
817 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
818 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
819 | "dev": true,
820 | "engines": {
821 | "node": ">=0.10.0"
822 | }
823 | },
824 | "node_modules/is-fullwidth-code-point": {
825 | "version": "3.0.0",
826 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
827 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
828 | "dev": true,
829 | "engines": {
830 | "node": ">=8"
831 | }
832 | },
833 | "node_modules/is-glob": {
834 | "version": "4.0.3",
835 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
836 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
837 | "dev": true,
838 | "dependencies": {
839 | "is-extglob": "^2.1.1"
840 | },
841 | "engines": {
842 | "node": ">=0.10.0"
843 | }
844 | },
845 | "node_modules/is-number": {
846 | "version": "7.0.0",
847 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
848 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
849 | "dev": true,
850 | "engines": {
851 | "node": ">=0.12.0"
852 | }
853 | },
854 | "node_modules/lodash": {
855 | "version": "4.17.21",
856 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
857 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
858 | "dev": true
859 | },
860 | "node_modules/lru-cache": {
861 | "version": "6.0.0",
862 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
863 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
864 | "dev": true,
865 | "dependencies": {
866 | "yallist": "^4.0.0"
867 | },
868 | "engines": {
869 | "node": ">=10"
870 | }
871 | },
872 | "node_modules/media-typer": {
873 | "version": "0.3.0",
874 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
875 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
876 | "engines": {
877 | "node": ">= 0.6"
878 | }
879 | },
880 | "node_modules/merge-descriptors": {
881 | "version": "1.0.1",
882 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
883 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
884 | },
885 | "node_modules/methods": {
886 | "version": "1.1.2",
887 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
888 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
889 | "engines": {
890 | "node": ">= 0.6"
891 | }
892 | },
893 | "node_modules/mime": {
894 | "version": "1.6.0",
895 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
896 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
897 | "bin": {
898 | "mime": "cli.js"
899 | },
900 | "engines": {
901 | "node": ">=4"
902 | }
903 | },
904 | "node_modules/mime-db": {
905 | "version": "1.52.0",
906 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
907 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
908 | "engines": {
909 | "node": ">= 0.6"
910 | }
911 | },
912 | "node_modules/mime-types": {
913 | "version": "2.1.35",
914 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
915 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
916 | "dependencies": {
917 | "mime-db": "1.52.0"
918 | },
919 | "engines": {
920 | "node": ">= 0.6"
921 | }
922 | },
923 | "node_modules/minimatch": {
924 | "version": "3.1.2",
925 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
926 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
927 | "dev": true,
928 | "dependencies": {
929 | "brace-expansion": "^1.1.7"
930 | },
931 | "engines": {
932 | "node": "*"
933 | }
934 | },
935 | "node_modules/ms": {
936 | "version": "2.0.0",
937 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
938 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
939 | },
940 | "node_modules/negotiator": {
941 | "version": "0.6.3",
942 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
943 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
944 | "engines": {
945 | "node": ">= 0.6"
946 | }
947 | },
948 | "node_modules/nodemon": {
949 | "version": "3.0.1",
950 | "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.0.1.tgz",
951 | "integrity": "sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==",
952 | "dev": true,
953 | "dependencies": {
954 | "chokidar": "^3.5.2",
955 | "debug": "^3.2.7",
956 | "ignore-by-default": "^1.0.1",
957 | "minimatch": "^3.1.2",
958 | "pstree.remy": "^1.1.8",
959 | "semver": "^7.5.3",
960 | "simple-update-notifier": "^2.0.0",
961 | "supports-color": "^5.5.0",
962 | "touch": "^3.1.0",
963 | "undefsafe": "^2.0.5"
964 | },
965 | "bin": {
966 | "nodemon": "bin/nodemon.js"
967 | },
968 | "engines": {
969 | "node": ">=10"
970 | },
971 | "funding": {
972 | "type": "opencollective",
973 | "url": "https://opencollective.com/nodemon"
974 | }
975 | },
976 | "node_modules/nodemon/node_modules/debug": {
977 | "version": "3.2.7",
978 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
979 | "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
980 | "dev": true,
981 | "dependencies": {
982 | "ms": "^2.1.1"
983 | }
984 | },
985 | "node_modules/nodemon/node_modules/ms": {
986 | "version": "2.1.3",
987 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
988 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
989 | "dev": true
990 | },
991 | "node_modules/nodemon/node_modules/supports-color": {
992 | "version": "5.5.0",
993 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
994 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
995 | "dev": true,
996 | "dependencies": {
997 | "has-flag": "^3.0.0"
998 | },
999 | "engines": {
1000 | "node": ">=4"
1001 | }
1002 | },
1003 | "node_modules/nopt": {
1004 | "version": "1.0.10",
1005 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz",
1006 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=",
1007 | "dev": true,
1008 | "dependencies": {
1009 | "abbrev": "1"
1010 | },
1011 | "bin": {
1012 | "nopt": "bin/nopt.js"
1013 | },
1014 | "engines": {
1015 | "node": "*"
1016 | }
1017 | },
1018 | "node_modules/normalize-path": {
1019 | "version": "3.0.0",
1020 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
1021 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
1022 | "dev": true,
1023 | "engines": {
1024 | "node": ">=0.10.0"
1025 | }
1026 | },
1027 | "node_modules/object-assign": {
1028 | "version": "4.1.1",
1029 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1030 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1031 | "engines": {
1032 | "node": ">=0.10.0"
1033 | }
1034 | },
1035 | "node_modules/object-inspect": {
1036 | "version": "1.13.1",
1037 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz",
1038 | "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==",
1039 | "funding": {
1040 | "url": "https://github.com/sponsors/ljharb"
1041 | }
1042 | },
1043 | "node_modules/on-finished": {
1044 | "version": "2.4.1",
1045 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1046 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1047 | "dependencies": {
1048 | "ee-first": "1.1.1"
1049 | },
1050 | "engines": {
1051 | "node": ">= 0.8"
1052 | }
1053 | },
1054 | "node_modules/parseurl": {
1055 | "version": "1.3.3",
1056 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1057 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
1058 | "engines": {
1059 | "node": ">= 0.8"
1060 | }
1061 | },
1062 | "node_modules/path-to-regexp": {
1063 | "version": "0.1.7",
1064 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1065 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1066 | },
1067 | "node_modules/picomatch": {
1068 | "version": "2.3.1",
1069 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
1070 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
1071 | "dev": true,
1072 | "engines": {
1073 | "node": ">=8.6"
1074 | },
1075 | "funding": {
1076 | "url": "https://github.com/sponsors/jonschlinkert"
1077 | }
1078 | },
1079 | "node_modules/proxy-addr": {
1080 | "version": "2.0.7",
1081 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1082 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1083 | "dependencies": {
1084 | "forwarded": "0.2.0",
1085 | "ipaddr.js": "1.9.1"
1086 | },
1087 | "engines": {
1088 | "node": ">= 0.10"
1089 | }
1090 | },
1091 | "node_modules/pstree.remy": {
1092 | "version": "1.1.8",
1093 | "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz",
1094 | "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==",
1095 | "dev": true
1096 | },
1097 | "node_modules/qs": {
1098 | "version": "6.11.0",
1099 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
1100 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
1101 | "dependencies": {
1102 | "side-channel": "^1.0.4"
1103 | },
1104 | "engines": {
1105 | "node": ">=0.6"
1106 | },
1107 | "funding": {
1108 | "url": "https://github.com/sponsors/ljharb"
1109 | }
1110 | },
1111 | "node_modules/range-parser": {
1112 | "version": "1.2.1",
1113 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1114 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
1115 | "engines": {
1116 | "node": ">= 0.6"
1117 | }
1118 | },
1119 | "node_modules/raw-body": {
1120 | "version": "2.5.2",
1121 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
1122 | "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
1123 | "dependencies": {
1124 | "bytes": "3.1.2",
1125 | "http-errors": "2.0.0",
1126 | "iconv-lite": "0.4.24",
1127 | "unpipe": "1.0.0"
1128 | },
1129 | "engines": {
1130 | "node": ">= 0.8"
1131 | }
1132 | },
1133 | "node_modules/readdirp": {
1134 | "version": "3.6.0",
1135 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
1136 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
1137 | "dev": true,
1138 | "dependencies": {
1139 | "picomatch": "^2.2.1"
1140 | },
1141 | "engines": {
1142 | "node": ">=8.10.0"
1143 | }
1144 | },
1145 | "node_modules/regenerator-runtime": {
1146 | "version": "0.14.0",
1147 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
1148 | "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
1149 | "dev": true
1150 | },
1151 | "node_modules/require-directory": {
1152 | "version": "2.1.1",
1153 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1154 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
1155 | "dev": true,
1156 | "engines": {
1157 | "node": ">=0.10.0"
1158 | }
1159 | },
1160 | "node_modules/rxjs": {
1161 | "version": "7.8.1",
1162 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
1163 | "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
1164 | "dev": true,
1165 | "dependencies": {
1166 | "tslib": "^2.1.0"
1167 | }
1168 | },
1169 | "node_modules/safe-buffer": {
1170 | "version": "5.2.1",
1171 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1172 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1173 | "funding": [
1174 | {
1175 | "type": "github",
1176 | "url": "https://github.com/sponsors/feross"
1177 | },
1178 | {
1179 | "type": "patreon",
1180 | "url": "https://www.patreon.com/feross"
1181 | },
1182 | {
1183 | "type": "consulting",
1184 | "url": "https://feross.org/support"
1185 | }
1186 | ]
1187 | },
1188 | "node_modules/safer-buffer": {
1189 | "version": "2.1.2",
1190 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1191 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1192 | },
1193 | "node_modules/semver": {
1194 | "version": "7.5.4",
1195 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
1196 | "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
1197 | "dev": true,
1198 | "dependencies": {
1199 | "lru-cache": "^6.0.0"
1200 | },
1201 | "bin": {
1202 | "semver": "bin/semver.js"
1203 | },
1204 | "engines": {
1205 | "node": ">=10"
1206 | }
1207 | },
1208 | "node_modules/send": {
1209 | "version": "0.18.0",
1210 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1211 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1212 | "dependencies": {
1213 | "debug": "2.6.9",
1214 | "depd": "2.0.0",
1215 | "destroy": "1.2.0",
1216 | "encodeurl": "~1.0.2",
1217 | "escape-html": "~1.0.3",
1218 | "etag": "~1.8.1",
1219 | "fresh": "0.5.2",
1220 | "http-errors": "2.0.0",
1221 | "mime": "1.6.0",
1222 | "ms": "2.1.3",
1223 | "on-finished": "2.4.1",
1224 | "range-parser": "~1.2.1",
1225 | "statuses": "2.0.1"
1226 | },
1227 | "engines": {
1228 | "node": ">= 0.8.0"
1229 | }
1230 | },
1231 | "node_modules/send/node_modules/ms": {
1232 | "version": "2.1.3",
1233 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1234 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1235 | },
1236 | "node_modules/serve-static": {
1237 | "version": "1.15.0",
1238 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1239 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1240 | "dependencies": {
1241 | "encodeurl": "~1.0.2",
1242 | "escape-html": "~1.0.3",
1243 | "parseurl": "~1.3.3",
1244 | "send": "0.18.0"
1245 | },
1246 | "engines": {
1247 | "node": ">= 0.8.0"
1248 | }
1249 | },
1250 | "node_modules/set-function-length": {
1251 | "version": "1.1.1",
1252 | "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz",
1253 | "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==",
1254 | "dependencies": {
1255 | "define-data-property": "^1.1.1",
1256 | "get-intrinsic": "^1.2.1",
1257 | "gopd": "^1.0.1",
1258 | "has-property-descriptors": "^1.0.0"
1259 | },
1260 | "engines": {
1261 | "node": ">= 0.4"
1262 | }
1263 | },
1264 | "node_modules/setprototypeof": {
1265 | "version": "1.2.0",
1266 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1267 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1268 | },
1269 | "node_modules/shell-quote": {
1270 | "version": "1.8.1",
1271 | "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
1272 | "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
1273 | "dev": true,
1274 | "funding": {
1275 | "url": "https://github.com/sponsors/ljharb"
1276 | }
1277 | },
1278 | "node_modules/side-channel": {
1279 | "version": "1.0.4",
1280 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1281 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1282 | "dependencies": {
1283 | "call-bind": "^1.0.0",
1284 | "get-intrinsic": "^1.0.2",
1285 | "object-inspect": "^1.9.0"
1286 | },
1287 | "funding": {
1288 | "url": "https://github.com/sponsors/ljharb"
1289 | }
1290 | },
1291 | "node_modules/simple-update-notifier": {
1292 | "version": "2.0.0",
1293 | "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz",
1294 | "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==",
1295 | "dev": true,
1296 | "dependencies": {
1297 | "semver": "^7.5.3"
1298 | },
1299 | "engines": {
1300 | "node": ">=10"
1301 | }
1302 | },
1303 | "node_modules/spawn-command": {
1304 | "version": "0.0.2",
1305 | "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz",
1306 | "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==",
1307 | "dev": true
1308 | },
1309 | "node_modules/statuses": {
1310 | "version": "2.0.1",
1311 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1312 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1313 | "engines": {
1314 | "node": ">= 0.8"
1315 | }
1316 | },
1317 | "node_modules/string-width": {
1318 | "version": "4.2.3",
1319 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1320 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1321 | "dev": true,
1322 | "dependencies": {
1323 | "emoji-regex": "^8.0.0",
1324 | "is-fullwidth-code-point": "^3.0.0",
1325 | "strip-ansi": "^6.0.1"
1326 | },
1327 | "engines": {
1328 | "node": ">=8"
1329 | }
1330 | },
1331 | "node_modules/strip-ansi": {
1332 | "version": "6.0.1",
1333 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1334 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1335 | "dev": true,
1336 | "dependencies": {
1337 | "ansi-regex": "^5.0.1"
1338 | },
1339 | "engines": {
1340 | "node": ">=8"
1341 | }
1342 | },
1343 | "node_modules/supports-color": {
1344 | "version": "8.1.1",
1345 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
1346 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
1347 | "dev": true,
1348 | "dependencies": {
1349 | "has-flag": "^4.0.0"
1350 | },
1351 | "engines": {
1352 | "node": ">=10"
1353 | },
1354 | "funding": {
1355 | "url": "https://github.com/chalk/supports-color?sponsor=1"
1356 | }
1357 | },
1358 | "node_modules/supports-color/node_modules/has-flag": {
1359 | "version": "4.0.0",
1360 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1361 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1362 | "dev": true,
1363 | "engines": {
1364 | "node": ">=8"
1365 | }
1366 | },
1367 | "node_modules/swagger-ui-dist": {
1368 | "version": "5.10.0",
1369 | "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.10.0.tgz",
1370 | "integrity": "sha512-PBTn5qDOQVtU29hrx74km86SnK3/mFtF3grI98y575y1aRpxiuStRTIvsfXFudPFkLofHU7H9a+fKrP+Oayc3g=="
1371 | },
1372 | "node_modules/swagger-ui-express": {
1373 | "version": "5.0.0",
1374 | "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.0.tgz",
1375 | "integrity": "sha512-tsU9tODVvhyfkNSvf03E6FAk+z+5cU3lXAzMy6Pv4av2Gt2xA0++fogwC4qo19XuFf6hdxevPuVCSKFuMHJhFA==",
1376 | "dependencies": {
1377 | "swagger-ui-dist": ">=5.0.0"
1378 | },
1379 | "engines": {
1380 | "node": ">= v0.10.32"
1381 | },
1382 | "peerDependencies": {
1383 | "express": ">=4.0.0 || >=5.0.0-beta"
1384 | }
1385 | },
1386 | "node_modules/to-regex-range": {
1387 | "version": "5.0.1",
1388 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
1389 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
1390 | "dev": true,
1391 | "dependencies": {
1392 | "is-number": "^7.0.0"
1393 | },
1394 | "engines": {
1395 | "node": ">=8.0"
1396 | }
1397 | },
1398 | "node_modules/toidentifier": {
1399 | "version": "1.0.1",
1400 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1401 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1402 | "engines": {
1403 | "node": ">=0.6"
1404 | }
1405 | },
1406 | "node_modules/touch": {
1407 | "version": "3.1.0",
1408 | "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz",
1409 | "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==",
1410 | "dev": true,
1411 | "dependencies": {
1412 | "nopt": "~1.0.10"
1413 | },
1414 | "bin": {
1415 | "nodetouch": "bin/nodetouch.js"
1416 | }
1417 | },
1418 | "node_modules/tree-kill": {
1419 | "version": "1.2.2",
1420 | "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
1421 | "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
1422 | "dev": true,
1423 | "bin": {
1424 | "tree-kill": "cli.js"
1425 | }
1426 | },
1427 | "node_modules/tslib": {
1428 | "version": "2.6.2",
1429 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
1430 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
1431 | "dev": true
1432 | },
1433 | "node_modules/type-is": {
1434 | "version": "1.6.18",
1435 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1436 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1437 | "dependencies": {
1438 | "media-typer": "0.3.0",
1439 | "mime-types": "~2.1.24"
1440 | },
1441 | "engines": {
1442 | "node": ">= 0.6"
1443 | }
1444 | },
1445 | "node_modules/typescript": {
1446 | "version": "5.2.2",
1447 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz",
1448 | "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==",
1449 | "bin": {
1450 | "tsc": "bin/tsc",
1451 | "tsserver": "bin/tsserver"
1452 | },
1453 | "engines": {
1454 | "node": ">=14.17"
1455 | }
1456 | },
1457 | "node_modules/undefsafe": {
1458 | "version": "2.0.5",
1459 | "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz",
1460 | "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==",
1461 | "dev": true
1462 | },
1463 | "node_modules/unpipe": {
1464 | "version": "1.0.0",
1465 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1466 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1467 | "engines": {
1468 | "node": ">= 0.8"
1469 | }
1470 | },
1471 | "node_modules/utils-merge": {
1472 | "version": "1.0.1",
1473 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1474 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=",
1475 | "engines": {
1476 | "node": ">= 0.4.0"
1477 | }
1478 | },
1479 | "node_modules/uuid": {
1480 | "version": "9.0.1",
1481 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
1482 | "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
1483 | "funding": [
1484 | "https://github.com/sponsors/broofa",
1485 | "https://github.com/sponsors/ctavan"
1486 | ],
1487 | "bin": {
1488 | "uuid": "dist/bin/uuid"
1489 | }
1490 | },
1491 | "node_modules/vary": {
1492 | "version": "1.1.2",
1493 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1494 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=",
1495 | "engines": {
1496 | "node": ">= 0.8"
1497 | }
1498 | },
1499 | "node_modules/wrap-ansi": {
1500 | "version": "7.0.0",
1501 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1502 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1503 | "dev": true,
1504 | "dependencies": {
1505 | "ansi-styles": "^4.0.0",
1506 | "string-width": "^4.1.0",
1507 | "strip-ansi": "^6.0.0"
1508 | },
1509 | "engines": {
1510 | "node": ">=10"
1511 | },
1512 | "funding": {
1513 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
1514 | }
1515 | },
1516 | "node_modules/y18n": {
1517 | "version": "5.0.8",
1518 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1519 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
1520 | "dev": true,
1521 | "engines": {
1522 | "node": ">=10"
1523 | }
1524 | },
1525 | "node_modules/yallist": {
1526 | "version": "4.0.0",
1527 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1528 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
1529 | "dev": true
1530 | },
1531 | "node_modules/yargs": {
1532 | "version": "17.7.2",
1533 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
1534 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
1535 | "dev": true,
1536 | "dependencies": {
1537 | "cliui": "^8.0.1",
1538 | "escalade": "^3.1.1",
1539 | "get-caller-file": "^2.0.5",
1540 | "require-directory": "^2.1.1",
1541 | "string-width": "^4.2.3",
1542 | "y18n": "^5.0.5",
1543 | "yargs-parser": "^21.1.1"
1544 | },
1545 | "engines": {
1546 | "node": ">=12"
1547 | }
1548 | },
1549 | "node_modules/yargs-parser": {
1550 | "version": "21.1.1",
1551 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
1552 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
1553 | "dev": true,
1554 | "engines": {
1555 | "node": ">=12"
1556 | }
1557 | }
1558 | }
1559 | }
1560 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "seans-typescript-nodejs-crud-rest-api-boilerplate",
3 | "version": "1.0.1",
4 | "description": "",
5 | "main": "server.js",
6 | "scripts": {
7 | "start": "tsc && node dist/server.js",
8 | "build": "tsc",
9 | "dev": "concurrently --kill-others \"tsc -w\" \"nodemon dist/server.js\""
10 | },
11 | "keywords": [
12 | "typescript",
13 | "nodejs",
14 | "crud",
15 | "rest",
16 | "swagger"
17 | ],
18 | "author": "Sean Bradley",
19 | "license": "ISC",
20 | "dependencies": {
21 | "@types/express": "^4.17.11",
22 | "@types/node": "^13.13.40",
23 | "body-parser": "^1.20.2",
24 | "cors": "^2.8.5",
25 | "express": "^4.18.2",
26 | "swagger-ui-express": "^5.0.0",
27 | "typescript": "^5.2.2",
28 | "uuid": "^9.0.1"
29 | },
30 | "devDependencies": {
31 | "concurrently": "^8.2.2",
32 | "nodemon": "^3.0.1"
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/readme.md:
--------------------------------------------------------------------------------
1 | ## Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate
2 |
3 | > To help support this TypeScript boilerplate, please take a moment to look at my official **Design Patterns in TypeScript** book and **TypeScript Courses**.
4 | >
[Three.js and TypeScript](https://www.udemy.com/course/threejs-tutorials/?referralCode=4C7E1DE91C3E42F69D0F)
5 | >
6 | >
[Socket.IO and TypeScript](https://www.udemy.com/course/typescript-socketio/?referralCode=2F6E227AC7EB9D147327)
7 | >
8 | >
Three.js and TypeScript : [ASIN B094716FD6](https://www.amazon.com/dp/B09GYTKRCH)
9 | >
10 | >
Design Patterns in TypeScript : Paperback [ASIN B0948BCH24](https://www.amazon.com/dp/B0948BCH24), eBook : [ASIN B094716FD6](https://www.amazon.com/dp/B094716FD6)
11 |
12 | ### MIT License
13 |
14 | Remember, No guarantees, or even fit for a particular purpose.
15 |
16 | If you have a suggestion, or you want to contribute some code, you can make a pull request.
17 |
18 | Your contributions will be visible since this project is public.
19 |
20 | ### Setup
21 |
22 | ```bash
23 | npm install
24 | ```
25 |
26 | ### Development with nodemon and tsc --watch
27 |
28 | ```bash
29 | npm run dev
30 | ```
31 |
32 | Then visit `http://localhost:3000/cats`
33 |
34 | ### Run without nodemon and tsc --watch
35 |
36 | ```bash
37 | npm start
38 | ```
39 |
40 | Then visit `http://localhost:3000/cats`
41 |
42 | ## Swagger
43 |
44 | Visit `http://localhost:3000/swagger` to view the OPENAPI document in Swagger-UI
45 | 
46 |
47 | ### Video tutorial on setting up Swagger in an existing NodeJS TypeScript API
48 |
49 | [](https://youtu.be/qemG0CWOx1I)
50 |
51 | ## Continuous Integration and Deployment
52 |
53 | I've also added gitlab-ci.yml and dockerised with Docker-Compose. See video tutorial on how all this works.
54 | [](https://youtu.be/Qlj6NiOy5jM)
55 |
56 | ## Usage
57 |
58 | ### List all records
59 |
60 | 
61 |
62 | ### Post (Create) Record
63 |
64 | 
65 |
66 | ### Get by Id
67 |
68 | 
69 |
70 | ### Put (Update) Record
71 |
72 | 
73 |
74 | ### Delete Record
75 |
76 | 
77 |
78 | # TypeScript Courses
79 |
80 | If you got this far, you probably like TypeScript just like I do,
81 | I have created two TypeScript courses specializing in the [Three.js](https://www.udemy.com/course/threejs-tutorials/?referralCode=4C7E1DE91C3E42F69D0F) and [Socket.IO](https://www.udemy.com/course/typescript-socketio/?referralCode=2F6E227AC7EB9D147327)
82 | libraries that you may find useful.
83 |
84 | ## Threejs and TypeScript Course
85 |
86 | [](https://youtu.be/BcF3yuVqfwo)
87 |
88 | ## Socket.io and TypeScript Course
89 |
90 | [](https://youtu.be/3uLSNctzkkw)
91 |
92 | # Programming Books
93 |
94 | To help support my projects, please check out my books.
95 |
96 | ## Three.js and TypeScript
97 |
98 |
99 |
100 |
https://www.amazon.com/dp/B09GYTKRCH
101 |
https://www.amazon.co.uk/dp/B09GYTKRCH
102 |
https://www.amazon.in/dp/B09GYTKRCH
103 |
https://www.amazon.de/dp/B09GYTKRCH
104 |
https://www.amazon.fr/dp/B09GYTKRCH
105 |
https://www.amazon.es/dp/B09GYTKRCH
106 |
https://www.amazon.it/dp/B09GYTKRCH
107 |
https://www.amazon.nl/dp/B09GYTKRCH
108 |
https://www.amazon.co.jp/dp/B09GYTKRCH
109 |
https://www.amazon.ca/dp/B09GYTKRCH
110 |
https://www.amazon.com.br/dp/B09GYTKRCH
111 |
https://www.amazon.com.mx/dp/B09GYTKRCH
112 |
https://www.amazon.com.au/dp/B09GYTKRCH
113 |
114 | (ASIN : B09GZM9KGJ / B09GYTKRCH)
115 |
116 | **Design Patterns in TypeScript**.
117 |
118 |
119 |
120 |
https://www.amazon.com/dp/B0948BCH24
121 |
https://www.amazon.co.uk/dp/B0948BCH24
122 |
https://www.amazon.in/dp/B094716FD6
123 |
https://www.amazon.de/dp/B0948BCH24
124 |
https://www.amazon.fr/dp/B0948BCH24
125 |
https://www.amazon.es/dp/B0948BCH24
126 |
https://www.amazon.it/dp/B0948BCH24
127 |
https://www.amazon.co.jp/dp/B0948BCH24
128 |
https://www.amazon.ca/dp/B0948BCH24
129 |
https://www.amazon.com.au/dp/B094716FD6
130 |
131 | (ASIN : B0948BCH24 / B094716FD6)
132 |
133 | ---
134 |
135 | Thanks
136 |
137 | Sean
138 |
--------------------------------------------------------------------------------
/src/app.ts:
--------------------------------------------------------------------------------
1 | import express from 'express'
2 | import Router from './router'
3 | import swaggerUi from 'swagger-ui-express'
4 | import * as swaggerDocument from './swagger.json'
5 | import * as bodyParser from 'body-parser'
6 |
7 | class App {
8 | private httpServer: any
9 |
10 | constructor() {
11 | this.httpServer = express()
12 |
13 | this.httpServer.use(bodyParser.urlencoded({ extended: true }));
14 | this.httpServer.use(bodyParser.json());
15 |
16 | new Router(this.httpServer);
17 |
18 | this.httpServer.use('/swagger', swaggerUi.serve, swaggerUi.setup(swaggerDocument));
19 | }
20 |
21 | public Start = (port: number) => {
22 | return new Promise((resolve, reject) => {
23 |
24 | this.httpServer.listen(
25 | port,
26 | () => {
27 | resolve(port)
28 | })
29 | .on('error', (err: object) => reject(err));
30 | })
31 | }
32 | }
33 |
34 | export default App;
35 |
--------------------------------------------------------------------------------
/src/models/Bird.ts:
--------------------------------------------------------------------------------
1 | type Bird = {
2 | genus: String;
3 | name: String;
4 | isHungry: Boolean;
5 | lastFedDate: Date;
6 | }
7 | export default Bird
8 |
9 |
--------------------------------------------------------------------------------
/src/models/Cat.ts:
--------------------------------------------------------------------------------
1 | type Cat = {
2 | genus: String;
3 | name: String;
4 | isHungry: Boolean;
5 | lastFedDate: Date;
6 | }
7 | export default Cat
8 |
9 |
--------------------------------------------------------------------------------
/src/models/Dog.ts:
--------------------------------------------------------------------------------
1 | type Dog = {
2 | genus: String;
3 | name: String;
4 | isHungry: Boolean;
5 | lastFedDate: Date;
6 | }
7 | export default Dog
8 |
9 |
--------------------------------------------------------------------------------
/src/router.ts:
--------------------------------------------------------------------------------
1 | import * as express from 'express'
2 | import Cat from './models/Cat'
3 | import { v4 as uuid } from 'uuid';
4 | import cors from 'cors'
5 |
6 | class Router {
7 |
8 | constructor(server: express.Express) {
9 | const router = express.Router()
10 |
11 | const cats = new Map();
12 | cats[uuid()] = { genus: "feline", name: "Cosmo", isHungry: true, lastFedDate: new Date() }
13 | cats[uuid()] = { genus: "feline", name: "Emmy", isHungry: true, lastFedDate: new Date() }
14 |
15 | router.get('/', (req: express.Request, res: express.Response) => {
16 | res.json({
17 | message: `Nothing to see here, [url]/cats instead.`
18 | })
19 | })
20 |
21 | //get all cats
22 | router.get('/cats', cors(), (req: express.Request, res: express.Response) => {
23 | res.json({
24 | cats
25 | })
26 | })
27 |
28 | //create new cat
29 | router.post('/cats', cors(), (req: express.Request, res: express.Response) => {
30 | try {
31 | let cat: Cat = {} as Cat;
32 | Object.assign(cat, req.body)
33 | const newUUID = uuid();
34 | cats[newUUID] = cat;
35 | res.json({
36 | uuid: newUUID
37 | })
38 | } catch (e) {
39 | res.status(400).send(JSON.stringify({ "error": "problem with posted data" }));
40 | }
41 | })
42 |
43 | //get cat by id
44 | router.get('/cats/:id', cors(), (req: express.Request, res: express.Response) => {
45 | if (!!cats[req.params.id]) {
46 | res.json({
47 | cat: cats[req.params.id]
48 | })
49 | } else {
50 | res.status(404).send(JSON.stringify({ "error": "no such cat" }));
51 | }
52 | })
53 |
54 | //update cat
55 | router.put('/cats/:id', cors(), (req: express.Request, res: express.Response) => {
56 | try {
57 | if (!!cats[req.params.id]) {
58 | let cat: Cat = {} as Cat;
59 | Object.assign(cat, req.body)
60 | cats[req.params.id] = cat;
61 | res.json({
62 | cat: cats[req.params.id]
63 | })
64 | } else {
65 | res.status(404).send(JSON.stringify({ "error": "no such cat" }));
66 | }
67 | } catch (e) {
68 | res.status(400).send(JSON.stringify({ "error": "problem with posted data" }));
69 | }
70 | })
71 |
72 | //delete cat
73 | router.delete('/cats/:id', cors(), (req: express.Request, res: express.Response) => {
74 | if (!!cats[req.params.id]) {
75 | delete cats[req.params.id]
76 | res.json({
77 | uuid: req.params.id
78 | })
79 | } else {
80 | res.status(404).send(JSON.stringify({ "error": "no such cat" }));
81 | }
82 | });
83 |
84 | router.options('*', cors());
85 |
86 | server.use('/', router)
87 | }
88 | }
89 |
90 | export default Router;
--------------------------------------------------------------------------------
/src/server.ts:
--------------------------------------------------------------------------------
1 | import app from './app'
2 |
3 | const port = parseInt(process.env.PORT || '3000')
4 |
5 | const server = new app().Start(port)
6 | .then(port => console.log(`Server running on port ${port}`))
7 | .catch(error => {
8 | console.log(error)
9 | process.exit(1);
10 | });
11 |
12 | export default server;
--------------------------------------------------------------------------------
/src/swagger.json:
--------------------------------------------------------------------------------
1 | {
2 | "openapi": "3.0.0",
3 | "info": {
4 | "version": "1.0.0",
5 | "title": "Seans-TypeScript-NodeJS-CRUD-REST-API-Boilerplate",
6 | "description": "A minimal and easy to follow example of what you need to create a CRUD style API in NodeJs using TypeScript",
7 | "license": {
8 | "name": "MIT",
9 | "url": "https://opensource.org/licenses/MIT"
10 | }
11 | },
12 | "servers": [
13 | {
14 | "url": "/",
15 | "description": "Local Dev, or from Heroku"
16 | },
17 | {
18 | "url": "/api/",
19 | "description": "With docker-compose and nginx proxy"
20 | }
21 | ],
22 | "tags": [
23 | {
24 | "name": "Cats",
25 | "description": "API for cats in the system"
26 | }
27 | ],
28 | "consumes": [
29 | "application/json"
30 | ],
31 | "produces": [
32 | "application/json"
33 | ],
34 | "paths": {
35 | "/cats": {
36 | "get": {
37 | "tags": [
38 | "Cats"
39 | ],
40 | "summary": "Get all cats in system",
41 | "responses": {
42 | "200": {
43 | "description": "OK",
44 | "schema": {
45 | "$ref": "#/definitions/Cats"
46 | }
47 | }
48 | }
49 | },
50 | "post": {
51 | "tags": [
52 | "Cats"
53 | ],
54 | "summary": "Create a new cat in system",
55 | "requestBody": {
56 | "description": "Cat Object",
57 | "required": true,
58 | "content": {
59 | "application/json": {
60 | "schema": {
61 | "$ref": "#/definitions/Cat"
62 | }
63 | }
64 | }
65 | },
66 | "produces": [
67 | "application/json"
68 | ],
69 | "responses": {
70 | "200": {
71 | "description": "OK",
72 | "schema": {
73 | "$ref": "#/definitions/id"
74 | }
75 | },
76 | "400": {
77 | "description": "Failed. Bad post data."
78 | }
79 | }
80 | }
81 | },
82 | "/cats/{id}": {
83 | "parameters": [
84 | {
85 | "name": "id",
86 | "in": "path",
87 | "required": true,
88 | "description": "ID of the cat that we want to match",
89 | "type": "string"
90 | }
91 | ],
92 | "get": {
93 | "tags": [
94 | "Cats"
95 | ],
96 | "summary": "Get cat with given ID",
97 | "parameters": [
98 | {
99 | "in": "path",
100 | "name": "id",
101 | "required": true,
102 | "description": "Cat with id",
103 | "schema": {
104 | "$ref": "#/definitions/id"
105 | }
106 | }
107 | ],
108 | "responses": {
109 | "200": {
110 | "description": "OK",
111 | "schema": {
112 | "$ref": "#/definitions/Cat"
113 | }
114 | },
115 | "404": {
116 | "description": "Failed. Cat not found."
117 | }
118 | }
119 | },
120 | "put": {
121 | "summary": "Update cat with given ID",
122 | "tags": [
123 | "Cats"
124 | ],
125 | "requestBody": {
126 | "description": "Cat Object",
127 | "required": true,
128 | "content": {
129 | "application/json": {
130 | "schema": {
131 | "$ref": "#/definitions/Cat"
132 | }
133 | }
134 | }
135 | },
136 | "parameters": [
137 | {
138 | "in": "path",
139 | "name": "id",
140 | "required": true,
141 | "description": "Cat with new values of properties",
142 | "schema": {
143 | "$ref": "#/definitions/id"
144 | }
145 | }
146 | ],
147 | "responses": {
148 | "200": {
149 | "description": "OK",
150 | "schema": {
151 | "$ref": "#/definitions/Cat"
152 | }
153 | },
154 | "400": {
155 | "description": "Failed. Bad post data."
156 | },
157 | "404": {
158 | "description": "Failed. Cat not found."
159 | }
160 | }
161 | },
162 | "delete": {
163 | "summary": "Delete cat with given ID",
164 | "tags": [
165 | "Cats"
166 | ],
167 | "parameters": [
168 | {
169 | "in": "path",
170 | "name": "id",
171 | "required": true,
172 | "description": "Delete Cat with id",
173 | "schema": {
174 | "$ref": "#/definitions/id"
175 | }
176 | }
177 | ],
178 | "responses": {
179 | "200": {
180 | "description": "OK",
181 | "schema": {
182 | "$ref": "#/definitions/id"
183 | }
184 | },
185 | "404": {
186 | "description": "Failed. Cat not found."
187 | }
188 | }
189 | }
190 | }
191 | },
192 | "definitions": {
193 | "id": {
194 | "properties": {
195 | "uuid": {
196 | "type": "string"
197 | }
198 | }
199 | },
200 | "Cat": {
201 | "type": "object",
202 | "properties": {
203 | "genus": {
204 | "type": "string"
205 | },
206 | "name": {
207 | "type": "string"
208 | },
209 | "isHungry": {
210 | "type": "boolean"
211 | },
212 | "lastFedDate": {
213 | "type": "string"
214 | }
215 | }
216 | },
217 | "Cats": {
218 | "type": "object",
219 | "properties": {
220 | "cats": {
221 | "type": "object",
222 | "additionalProperties": {
223 | "$ref": "#/definitions/Cat"
224 | }
225 | }
226 | }
227 | }
228 | }
229 | }
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es2017",
4 | "module": "commonjs",
5 | "resolveJsonModule": true,
6 | "esModuleInterop": true,
7 | "outDir": "dist",
8 | //"sourceMap": true
9 | },
10 | "files": [
11 | "./node_modules/@types/node/index.d.ts"
12 | ],
13 | "include": [
14 | "src/**/*.ts"
15 | ],
16 | "exclude": [
17 | "node_modules"
18 | ]
19 | }
--------------------------------------------------------------------------------