├── .gitignore
├── README.md
├── docs
└── express-course.jpg
├── error-handling
└── index.js
├── examples
├── http_restapi_crud
│ └── index.js
└── time-authentication.js
├── express-router
├── app.js
└── routes
│ └── api_router.js
├── express-routing
├── index.js
└── package.json
├── first-middleware
├── index.js
└── package.json
├── hello-world
└── index.js
├── http-objects
├── index.js
└── mydocument.txt
├── http_get
├── index.js
├── javascript.jpg
└── websites.txt
├── http_methods
├── index.js
├── package.json
└── test.http
├── http_post
├── index.js
└── test.http
├── http_vs_express
├── express.js
├── http.js
├── package.json
└── static
│ └── index.html
├── https
└── index.js
├── package-lock.json
├── package.json
├── queries
└── index.js
├── request_params
├── fazt-logo.jpg
└── index.js
├── settings
└── case_sensitive_routing.js
├── static-files-named
└── index.js
├── static_file
├── express-static.js
└── static-file-server
│ ├── static
│ └── users.txt
│ ├── version1.js
│ └── version2.js
├── template_engine
├── complex-view-rendering
│ └── index.js
├── readme.md
└── simple-rendering
│ ├── index.js
│ └── views
│ └── index.ejs
└── third-party-middlewares
└── morgan.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 |
3 | package-lock.json
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Express.js Course
2 |
3 | This is a repo of the express course.
4 |
5 | 
6 |
7 | ## Examples
8 |
9 | - [Express-FirstServer](https://github.com/FaztTech/express-first-server)
10 | - Express-GuestBook-App
11 | - API DarkSky
--------------------------------------------------------------------------------
/docs/express-course.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fazt/express-course/091ec81e5215f5d2c15705965ce76f074be49d18/docs/express-course.jpg
--------------------------------------------------------------------------------
/error-handling/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const path = require("path");
3 |
4 | const app = express();
5 |
6 | const filePath = path.join(__dirname, "jpg"); // file does not exist
7 |
8 | app.use((req, res) => {
9 | res.sendFile(filePath, (err) => {
10 | if (err) {
11 | next(new Error("Error sending File!"));
12 | } else {
13 | console.log("file sent!");
14 | }
15 | });
16 | });
17 |
18 | // middleware that logs the error
19 | // four parameter functions are called just in error mode
20 | // express use the number of argument
21 | // to determinate the type of middleware
22 | app.use((err, req, res, next) => {
23 | console.log(err);
24 | next(err);
25 | });
26 |
27 | app.use((err, req, res, next) => {
28 | res.status(500);
29 | res.send("Internal Server Error");
30 | });
31 |
32 | app.listen(3000);
33 | console.log("server on port", 3000);
34 |
--------------------------------------------------------------------------------
/examples/http_restapi_crud/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | require("colors");
3 |
4 | const app = express();
5 |
6 | let products = [
7 | {
8 | id: 1,
9 | name: "laptop",
10 | price: 1000,
11 | },
12 | ];
13 |
14 | app.use(express.json());
15 | app.use((req, res, next) => {
16 | console.log(`${req.method.bgGreen} ${req.url.bgYellow}`);
17 | next();
18 | });
19 |
20 | app.get("/products", (req, res) => {
21 | res.json(products);
22 | });
23 |
24 | app.post("/products", (req, res) => {
25 | const { name, price } = req.body;
26 |
27 | if (!name || !price) {
28 | return res.status(400).send("Product name and price are required");
29 | }
30 |
31 | const newProduct = {
32 | id: products.length + 1,
33 | name,
34 | price,
35 | };
36 | products.push(newProduct);
37 | res.status(201).json(newProduct);
38 | });
39 |
40 | app.get("/products/:id", (req, res) => {
41 | const { id } = req.params;
42 | const product = products.find((product) => product.id === parseInt(id));
43 | if (!product) {
44 | res.status(404).json({ error: "Product not found" });
45 | }
46 | res.json(product);
47 | });
48 |
49 | app.delete("/products/:id", (req, res) => {
50 | const { id } = req.params;
51 | products = products.filter((product) => product.id !== parseInt(id));
52 | res.sendStatus(204);
53 | });
54 |
55 | app.all("/products/count", (req, res) => {
56 | res.json({ count: products.length });
57 | });
58 |
59 | app.put("/products/:id", (req, res) => {
60 | const { id } = req.params;
61 | const { name, price } = req.body;
62 |
63 | const product = products.find((product) => product.id === parseInt(id));
64 |
65 | if (!product) return res.status(404).json({ error: "Product not found" });
66 |
67 | product.name = name;
68 | product.price = price;
69 |
70 | res.json(product);
71 | });
72 |
73 | app.listen(3000);
74 | console.log("Server on port 3000");
75 |
--------------------------------------------------------------------------------
/examples/time-authentication.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const app = express();
4 |
5 | app.use((req, res, next) => {
6 | console.log("In comes a request" + req.method + " to ", req.url);
7 | next();
8 | });
9 |
10 | app.use((req, res, next) => {
11 | let minute = new Date().getMinutes();
12 | if (minute % 2 === 0) {
13 | next();
14 | } else {
15 | // res.statusCode = 403;// not authrized
16 | // res.end('Not authorized');
17 | res.status(403).end("Not authorized");
18 | }
19 | });
20 |
21 | app.use((req, res) => {
22 | res.writeHead(200, { "Content-Type": "text/plain" });
23 | res.end('Secret info: the password is "express"');
24 | });
25 |
26 | // you can use app.listen for shorthand
27 | app.listen(3000);
28 | console.log("Server on port 3000");
29 |
--------------------------------------------------------------------------------
/express-router/app.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const path = require("path");
3 | const apiRouter = require("./routes/api_router");
4 |
5 | const app = express();
6 |
7 | const staticPath = path.resolve(__dirname, "static");
8 | app.use(express.static(staticPath));
9 |
10 | app.use("/api", apiRouter);
11 |
12 | app.listen(3000);
13 | console.log("server on port 3000");
14 |
--------------------------------------------------------------------------------
/express-router/routes/api_router.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const api = express.Router();
3 |
4 | const ALLOWED_IPS = [
5 | "127.0.0.1"
6 | ];
7 |
8 | api.use((req, res, next) => {
9 | var userIsAllowed = ALLOWED_IPS.indexOf(req.ip) !== -1;
10 | if (!userIsAllowed) {
11 | res.status(401).send('Not authorized');
12 | } else {
13 | next();
14 | }
15 | });
16 |
17 | app.get('/users', (req, res) => res.send('users'));
18 | app.post('/user', (req, res) => res.send('user POST'));
19 |
20 | app.get('/messages', (req, res) => res.send('messages'));
21 | app.post('/message', (req, res) => res.send('message POST'));
22 |
23 | module.exports = api;
24 |
--------------------------------------------------------------------------------
/express-routing/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 |
3 | const app = express();
4 |
5 | app.get('/', (req, res) => {
6 | res.end('Welcome to the Home Page');
7 | });
8 |
9 | app.get('/about', (req, res) => {
10 | res.send('Welcome to the about page');
11 | });
12 |
13 | app.get('/weather', (req, res) => {
14 | res.end('The Current weather is Nice');
15 | });
16 |
17 | // route get to the /fazt route
18 | app.get('/fazt', (req, res) => {
19 | res.send('Welcome to the Fazt Page');
20 | });
21 |
22 | app.use((req, res) => {
23 | res.status(404).end('404!');
24 | });
25 |
26 | app.listen(3000);
27 | console.log('Server on port 3000');
28 |
--------------------------------------------------------------------------------
/express-routing/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "simple-routing",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "express": "^4.18.1"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/first-middleware/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 |
4 | // can finish with a respones or continue with next
5 | app.use((req, res) => {
6 | console.log("In comes a request to ", req.url);
7 | res.end("Request Received");
8 | });
9 |
10 | app.get("/", (req, res) => res.send("home page"));
11 |
12 | app.get("/about", (req, res) => res.send("about page"));
13 |
14 | // you can use app.listen for shorthand
15 | app.listen(3000);
16 | console.log("server on port", 3000);
17 |
--------------------------------------------------------------------------------
/first-middleware/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "first-middleware",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "express": "^4.18.1"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/hello-world/index.js:
--------------------------------------------------------------------------------
1 | // installed on node_modules folder
2 | const express = require("express");
3 |
4 | // initializing the app
5 | const app = express();
6 |
7 | // the main route of our app
8 | app.get("/", (request, response) => {
9 | console.log(request.url);
10 | response.send("Hello World!");
11 | });
12 |
13 | // bootstraping the app
14 | app.listen(3000);
15 | console.log("Express app started on port 3000");
16 |
--------------------------------------------------------------------------------
/http-objects/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const app = express();
3 |
4 | const EVIL_IP = '192.168.1.1';
5 |
6 | // express add new methods to request object
7 | app.use((req, res, next) => {
8 | console.log(req.ip);
9 | if (req.ip === EVIL_IP) {
10 | res.status(401).send('Not Allowed');
11 | } else{
12 | next();
13 | }
14 | });
15 |
16 | // express adds new mehtods to resposne object
17 | app.get('/', (req, res) => {
18 | res.sendFile(`${__dirname}/mydocument.txt`);
19 | });
20 |
21 | app.get('/google', (req, res) => {
22 | res.redirect('http://google.com');
23 | });
24 |
25 | app.get('/redirectme', (req, res) => {
26 | res.redirect('/');
27 | });
28 |
29 | app.listen(3000, () => {
30 | console.log('server running on port 3000')
31 | });
32 |
--------------------------------------------------------------------------------
/http-objects/mydocument.txt:
--------------------------------------------------------------------------------
1 | My list of clients
2 |
3 | Isaac Asimov
4 | Isaac Delahaye
5 | Joe Macmillan
6 | Ada Lovelace
7 |
--------------------------------------------------------------------------------
/http_get/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const app = express();
4 |
5 | // send a string to the browser
6 | app.get("/", (req, res) => {
7 | res.send("Welcome to the Home Page");
8 | });
9 |
10 | app.get("/miarchivo", (req, res) => {
11 | res.setHeader("Content-Type", "text/plain");
12 | // you can try with websites.txt as well
13 | res.sendFile("./javascript.jpg", {
14 | root: __dirname,
15 | });
16 | });
17 |
18 | app.get('/user', (req, res) => {
19 | res.json({
20 | username: 'Ryan',
21 | lastname: 'Ray'
22 | });
23 | });
24 |
25 | app.get('/users', (req, res) => {
26 | res.json([
27 | {
28 | username: 'Ryan',
29 | lastname: 'Ray'
30 | },
31 | {
32 | username: 'John',
33 | lastname: 'Doe'
34 | },
35 | {
36 | username: 'Jane',
37 | lastname: 'Doe'
38 | }
39 | ]);
40 | })
41 |
42 | app.get('/isAlive', (req, res) => {
43 | res.status(200).end();
44 | })
45 |
46 | app.get('/isalive2', (req ,res) => {
47 | res.sendStatus(200);
48 | })
49 |
50 | app.listen(3000);
51 | console.log("Server on port 3000");
52 |
--------------------------------------------------------------------------------
/http_get/javascript.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fazt/express-course/091ec81e5215f5d2c15705965ce76f074be49d18/http_get/javascript.jpg
--------------------------------------------------------------------------------
/http_get/websites.txt:
--------------------------------------------------------------------------------
1 | Estos son mis sitios web
2 |
3 | faztweb.com
4 | fazt.dev
5 | www.faztweb.com
6 |
--------------------------------------------------------------------------------
/http_methods/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 |
3 | const app = express();
4 |
5 | app.get('/', (req, res) => {
6 | res.send('get request to the homepage');
7 | })
8 |
9 | app.post('/', (req, res) => {
10 | res.send('post request to the homepage');
11 | })
12 |
13 | app.put('/', (req, res) => {
14 | res.send('put request to the homepage');
15 | })
16 |
17 | app.delete('/', (req, res) => {
18 | res.send('delete request to the homepage');
19 | })
20 |
21 | app.patch('/', (req, res) => {
22 | res.send('patch request to the homepage');
23 | })
24 |
25 | app.listen(3000);
26 | console.log('Server on port 3000');
--------------------------------------------------------------------------------
/http_methods/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "http_methods",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "express": "^4.18.1"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/http_methods/test.http:
--------------------------------------------------------------------------------
1 |
2 | ### GET
3 | GET http://localhost:3000
4 |
5 | ### POST
6 | POST http://localhost:3000
7 |
8 | ### PUT
9 | PUT http://localhost:3000
10 |
11 | ### DELETE
12 | DELETE http://localhost:3000
13 |
14 | ### PATCH
15 | PATCH http://localhost:3000
--------------------------------------------------------------------------------
/http_post/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const app = express();
4 |
5 | app.use(express.text());
6 | app.use(express.urlencoded({ extended: true }));
7 | app.use(express.json());
8 |
9 | app.post("/login", (req, res) => {
10 | console.log(req.headers);
11 | console.log(req.body);
12 | res.send("Successful Login");
13 | });
14 |
15 | app.listen(3000);
16 | console.log("Server on port 3000");
17 |
--------------------------------------------------------------------------------
/http_post/test.http:
--------------------------------------------------------------------------------
1 | POST http://localhost:3000/login
2 | Content-Type: text/plain
3 |
4 | Hello world!
--------------------------------------------------------------------------------
/http_vs_express/express.js:
--------------------------------------------------------------------------------
1 | import express from 'express'
2 | import {dirname} from 'path'
3 | import {fileURLToPath} from 'url'
4 |
5 | const app = express()
6 | const __dirname = dirname(fileURLToPath(import.meta.url))
7 |
8 | app.get('/', (req, res) => {
9 | res.sendFile('./static/index.html', { root: __dirname })
10 | })
11 |
12 | app.listen(3000)
13 | console.log(`server on port ${3000}`);
--------------------------------------------------------------------------------
/http_vs_express/http.js:
--------------------------------------------------------------------------------
1 | import http from 'http'
2 | import fs from 'fs'
3 |
4 | const server = http.createServer((req, res) => {
5 | // res.statusCode = 200
6 | // res.setHeader('Content-Type', 'text/html')
7 | res.writeHead(200, {
8 | 'Content-Type': 'text/html'
9 | });
10 | const read = fs.createReadStream('./static/index.html');
11 | read.pipe(res);
12 | })
13 |
14 | server.listen(3000)
15 | console.log(`server on port ${3000}`);
16 |
--------------------------------------------------------------------------------
/http_vs_express/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "http_vs_express",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "type": "module",
7 | "scripts": {
8 | "test": "echo \"Error: no test specified\" && exit 1"
9 | },
10 | "keywords": [],
11 | "author": "",
12 | "license": "ISC",
13 | "dependencies": {
14 | "express": "^4.18.1"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/http_vs_express/static/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Server with Nodejs
6 |
16 |
17 |
18 | Server with Nodejs
19 |
20 |
21 |
--------------------------------------------------------------------------------
/https/index.js:
--------------------------------------------------------------------------------
1 | const http = require('http');
2 | const https = require('https');
3 | const fs = require('fs');
4 |
5 | const express = require('express');
6 | const app = express();
7 |
8 | //define app
9 |
10 | const httpsOptions = {
11 | key: fs.readFileSync("path/to/private/key.pem"),
12 | cert: fs.readFileSync('path/to/certificate.pem')
13 | };
14 |
15 | http.createServer(app).listen(80);
16 | https.createServer(httpsOptions, app).listen(443);
17 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "express-course",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "express-course",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "colors": "^1.4.0",
13 | "ejs": "^2.5.7",
14 | "express": "^4.18.1",
15 | "morgan": "^1.8.2",
16 | "pug": "^2.0.0-rc.4"
17 | }
18 | },
19 | "node_modules/accepts": {
20 | "version": "1.3.8",
21 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
22 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
23 | "dependencies": {
24 | "mime-types": "~2.1.34",
25 | "negotiator": "0.6.3"
26 | },
27 | "engines": {
28 | "node": ">= 0.6"
29 | }
30 | },
31 | "node_modules/acorn": {
32 | "version": "3.3.0",
33 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
34 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=",
35 | "bin": {
36 | "acorn": "bin/acorn"
37 | },
38 | "engines": {
39 | "node": ">=0.4.0"
40 | }
41 | },
42 | "node_modules/acorn-globals": {
43 | "version": "3.1.0",
44 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
45 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
46 | "dependencies": {
47 | "acorn": "^4.0.4"
48 | }
49 | },
50 | "node_modules/acorn-globals/node_modules/acorn": {
51 | "version": "4.0.13",
52 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
53 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
54 | "bin": {
55 | "acorn": "bin/acorn"
56 | },
57 | "engines": {
58 | "node": ">=0.4.0"
59 | }
60 | },
61 | "node_modules/align-text": {
62 | "version": "0.1.4",
63 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
64 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
65 | "dependencies": {
66 | "kind-of": "^3.0.2",
67 | "longest": "^1.0.1",
68 | "repeat-string": "^1.5.2"
69 | },
70 | "engines": {
71 | "node": ">=0.10.0"
72 | }
73 | },
74 | "node_modules/amdefine": {
75 | "version": "1.0.1",
76 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
77 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
78 | "engines": {
79 | "node": ">=0.4.2"
80 | }
81 | },
82 | "node_modules/array-flatten": {
83 | "version": "1.1.1",
84 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
85 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
86 | },
87 | "node_modules/asap": {
88 | "version": "2.0.6",
89 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
90 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
91 | },
92 | "node_modules/basic-auth": {
93 | "version": "1.1.0",
94 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz",
95 | "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ=",
96 | "engines": {
97 | "node": ">= 0.6"
98 | }
99 | },
100 | "node_modules/body-parser": {
101 | "version": "1.20.0",
102 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
103 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
104 | "dependencies": {
105 | "bytes": "3.1.2",
106 | "content-type": "~1.0.4",
107 | "debug": "2.6.9",
108 | "depd": "2.0.0",
109 | "destroy": "1.2.0",
110 | "http-errors": "2.0.0",
111 | "iconv-lite": "0.4.24",
112 | "on-finished": "2.4.1",
113 | "qs": "6.10.3",
114 | "raw-body": "2.5.1",
115 | "type-is": "~1.6.18",
116 | "unpipe": "1.0.0"
117 | },
118 | "engines": {
119 | "node": ">= 0.8",
120 | "npm": "1.2.8000 || >= 1.4.16"
121 | }
122 | },
123 | "node_modules/body-parser/node_modules/debug": {
124 | "version": "2.6.9",
125 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
126 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
127 | "dependencies": {
128 | "ms": "2.0.0"
129 | }
130 | },
131 | "node_modules/body-parser/node_modules/depd": {
132 | "version": "2.0.0",
133 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
134 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
135 | "engines": {
136 | "node": ">= 0.8"
137 | }
138 | },
139 | "node_modules/body-parser/node_modules/on-finished": {
140 | "version": "2.4.1",
141 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
142 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
143 | "dependencies": {
144 | "ee-first": "1.1.1"
145 | },
146 | "engines": {
147 | "node": ">= 0.8"
148 | }
149 | },
150 | "node_modules/bytes": {
151 | "version": "3.1.2",
152 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
153 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
154 | "engines": {
155 | "node": ">= 0.8"
156 | }
157 | },
158 | "node_modules/call-bind": {
159 | "version": "1.0.2",
160 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
161 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
162 | "dependencies": {
163 | "function-bind": "^1.1.1",
164 | "get-intrinsic": "^1.0.2"
165 | },
166 | "funding": {
167 | "url": "https://github.com/sponsors/ljharb"
168 | }
169 | },
170 | "node_modules/camelcase": {
171 | "version": "1.2.1",
172 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
173 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
174 | "engines": {
175 | "node": ">=0.10.0"
176 | }
177 | },
178 | "node_modules/center-align": {
179 | "version": "0.1.3",
180 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
181 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
182 | "dependencies": {
183 | "align-text": "^0.1.3",
184 | "lazy-cache": "^1.0.3"
185 | },
186 | "engines": {
187 | "node": ">=0.10.0"
188 | }
189 | },
190 | "node_modules/character-parser": {
191 | "version": "2.2.0",
192 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
193 | "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
194 | "dependencies": {
195 | "is-regex": "^1.0.3"
196 | }
197 | },
198 | "node_modules/clean-css": {
199 | "version": "3.4.28",
200 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
201 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
202 | "dependencies": {
203 | "commander": "2.8.x",
204 | "source-map": "0.4.x"
205 | },
206 | "bin": {
207 | "cleancss": "bin/cleancss"
208 | },
209 | "engines": {
210 | "node": ">=0.10.0"
211 | }
212 | },
213 | "node_modules/cliui": {
214 | "version": "2.1.0",
215 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
216 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
217 | "dependencies": {
218 | "center-align": "^0.1.1",
219 | "right-align": "^0.1.1",
220 | "wordwrap": "0.0.2"
221 | }
222 | },
223 | "node_modules/colors": {
224 | "version": "1.4.0",
225 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
226 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==",
227 | "engines": {
228 | "node": ">=0.1.90"
229 | }
230 | },
231 | "node_modules/commander": {
232 | "version": "2.8.1",
233 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
234 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
235 | "dependencies": {
236 | "graceful-readlink": ">= 1.0.0"
237 | },
238 | "engines": {
239 | "node": ">= 0.6.x"
240 | }
241 | },
242 | "node_modules/constantinople": {
243 | "version": "3.1.0",
244 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz",
245 | "integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=",
246 | "deprecated": "Please update to at least constantinople 3.1.1",
247 | "dependencies": {
248 | "acorn": "^3.1.0",
249 | "is-expression": "^2.0.1"
250 | }
251 | },
252 | "node_modules/content-disposition": {
253 | "version": "0.5.4",
254 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
255 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
256 | "dependencies": {
257 | "safe-buffer": "5.2.1"
258 | },
259 | "engines": {
260 | "node": ">= 0.6"
261 | }
262 | },
263 | "node_modules/content-type": {
264 | "version": "1.0.4",
265 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
266 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
267 | "engines": {
268 | "node": ">= 0.6"
269 | }
270 | },
271 | "node_modules/cookie": {
272 | "version": "0.5.0",
273 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
274 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
275 | "engines": {
276 | "node": ">= 0.6"
277 | }
278 | },
279 | "node_modules/cookie-signature": {
280 | "version": "1.0.6",
281 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
282 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
283 | },
284 | "node_modules/debug": {
285 | "version": "2.6.8",
286 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
287 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
288 | "dependencies": {
289 | "ms": "2.0.0"
290 | }
291 | },
292 | "node_modules/decamelize": {
293 | "version": "1.2.0",
294 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
295 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
296 | "engines": {
297 | "node": ">=0.10.0"
298 | }
299 | },
300 | "node_modules/depd": {
301 | "version": "1.1.1",
302 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
303 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=",
304 | "engines": {
305 | "node": ">= 0.6"
306 | }
307 | },
308 | "node_modules/destroy": {
309 | "version": "1.2.0",
310 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
311 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
312 | "engines": {
313 | "node": ">= 0.8",
314 | "npm": "1.2.8000 || >= 1.4.16"
315 | }
316 | },
317 | "node_modules/doctypes": {
318 | "version": "1.1.0",
319 | "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
320 | "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
321 | },
322 | "node_modules/ee-first": {
323 | "version": "1.1.1",
324 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
325 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
326 | },
327 | "node_modules/ejs": {
328 | "version": "2.5.7",
329 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz",
330 | "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo=",
331 | "engines": {
332 | "node": ">=0.10.0"
333 | }
334 | },
335 | "node_modules/encodeurl": {
336 | "version": "1.0.2",
337 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
338 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
339 | "engines": {
340 | "node": ">= 0.8"
341 | }
342 | },
343 | "node_modules/escape-html": {
344 | "version": "1.0.3",
345 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
346 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
347 | },
348 | "node_modules/etag": {
349 | "version": "1.8.1",
350 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
351 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
352 | "engines": {
353 | "node": ">= 0.6"
354 | }
355 | },
356 | "node_modules/express": {
357 | "version": "4.18.1",
358 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
359 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
360 | "dependencies": {
361 | "accepts": "~1.3.8",
362 | "array-flatten": "1.1.1",
363 | "body-parser": "1.20.0",
364 | "content-disposition": "0.5.4",
365 | "content-type": "~1.0.4",
366 | "cookie": "0.5.0",
367 | "cookie-signature": "1.0.6",
368 | "debug": "2.6.9",
369 | "depd": "2.0.0",
370 | "encodeurl": "~1.0.2",
371 | "escape-html": "~1.0.3",
372 | "etag": "~1.8.1",
373 | "finalhandler": "1.2.0",
374 | "fresh": "0.5.2",
375 | "http-errors": "2.0.0",
376 | "merge-descriptors": "1.0.1",
377 | "methods": "~1.1.2",
378 | "on-finished": "2.4.1",
379 | "parseurl": "~1.3.3",
380 | "path-to-regexp": "0.1.7",
381 | "proxy-addr": "~2.0.7",
382 | "qs": "6.10.3",
383 | "range-parser": "~1.2.1",
384 | "safe-buffer": "5.2.1",
385 | "send": "0.18.0",
386 | "serve-static": "1.15.0",
387 | "setprototypeof": "1.2.0",
388 | "statuses": "2.0.1",
389 | "type-is": "~1.6.18",
390 | "utils-merge": "1.0.1",
391 | "vary": "~1.1.2"
392 | },
393 | "engines": {
394 | "node": ">= 0.10.0"
395 | }
396 | },
397 | "node_modules/express/node_modules/debug": {
398 | "version": "2.6.9",
399 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
400 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
401 | "dependencies": {
402 | "ms": "2.0.0"
403 | }
404 | },
405 | "node_modules/express/node_modules/depd": {
406 | "version": "2.0.0",
407 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
408 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
409 | "engines": {
410 | "node": ">= 0.8"
411 | }
412 | },
413 | "node_modules/express/node_modules/on-finished": {
414 | "version": "2.4.1",
415 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
416 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
417 | "dependencies": {
418 | "ee-first": "1.1.1"
419 | },
420 | "engines": {
421 | "node": ">= 0.8"
422 | }
423 | },
424 | "node_modules/finalhandler": {
425 | "version": "1.2.0",
426 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
427 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
428 | "dependencies": {
429 | "debug": "2.6.9",
430 | "encodeurl": "~1.0.2",
431 | "escape-html": "~1.0.3",
432 | "on-finished": "2.4.1",
433 | "parseurl": "~1.3.3",
434 | "statuses": "2.0.1",
435 | "unpipe": "~1.0.0"
436 | },
437 | "engines": {
438 | "node": ">= 0.8"
439 | }
440 | },
441 | "node_modules/finalhandler/node_modules/debug": {
442 | "version": "2.6.9",
443 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
444 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
445 | "dependencies": {
446 | "ms": "2.0.0"
447 | }
448 | },
449 | "node_modules/finalhandler/node_modules/on-finished": {
450 | "version": "2.4.1",
451 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
452 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
453 | "dependencies": {
454 | "ee-first": "1.1.1"
455 | },
456 | "engines": {
457 | "node": ">= 0.8"
458 | }
459 | },
460 | "node_modules/forwarded": {
461 | "version": "0.2.0",
462 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
463 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
464 | "engines": {
465 | "node": ">= 0.6"
466 | }
467 | },
468 | "node_modules/fresh": {
469 | "version": "0.5.2",
470 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
471 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
472 | "engines": {
473 | "node": ">= 0.6"
474 | }
475 | },
476 | "node_modules/function-bind": {
477 | "version": "1.1.1",
478 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
479 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
480 | },
481 | "node_modules/get-intrinsic": {
482 | "version": "1.1.2",
483 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
484 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
485 | "dependencies": {
486 | "function-bind": "^1.1.1",
487 | "has": "^1.0.3",
488 | "has-symbols": "^1.0.3"
489 | },
490 | "funding": {
491 | "url": "https://github.com/sponsors/ljharb"
492 | }
493 | },
494 | "node_modules/graceful-readlink": {
495 | "version": "1.0.1",
496 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
497 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
498 | },
499 | "node_modules/has": {
500 | "version": "1.0.3",
501 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
502 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
503 | "dependencies": {
504 | "function-bind": "^1.1.1"
505 | },
506 | "engines": {
507 | "node": ">= 0.4.0"
508 | }
509 | },
510 | "node_modules/has-symbols": {
511 | "version": "1.0.3",
512 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
513 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
514 | "engines": {
515 | "node": ">= 0.4"
516 | },
517 | "funding": {
518 | "url": "https://github.com/sponsors/ljharb"
519 | }
520 | },
521 | "node_modules/http-errors": {
522 | "version": "2.0.0",
523 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
524 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
525 | "dependencies": {
526 | "depd": "2.0.0",
527 | "inherits": "2.0.4",
528 | "setprototypeof": "1.2.0",
529 | "statuses": "2.0.1",
530 | "toidentifier": "1.0.1"
531 | },
532 | "engines": {
533 | "node": ">= 0.8"
534 | }
535 | },
536 | "node_modules/http-errors/node_modules/depd": {
537 | "version": "2.0.0",
538 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
539 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
540 | "engines": {
541 | "node": ">= 0.8"
542 | }
543 | },
544 | "node_modules/iconv-lite": {
545 | "version": "0.4.24",
546 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
547 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
548 | "dependencies": {
549 | "safer-buffer": ">= 2.1.2 < 3"
550 | },
551 | "engines": {
552 | "node": ">=0.10.0"
553 | }
554 | },
555 | "node_modules/inherits": {
556 | "version": "2.0.4",
557 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
558 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
559 | },
560 | "node_modules/ipaddr.js": {
561 | "version": "1.9.1",
562 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
563 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
564 | "engines": {
565 | "node": ">= 0.10"
566 | }
567 | },
568 | "node_modules/is-buffer": {
569 | "version": "1.1.5",
570 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
571 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
572 | "deprecated": "This version of 'is-buffer' is out-of-date. You must update to v1.1.6 or newer"
573 | },
574 | "node_modules/is-expression": {
575 | "version": "2.1.0",
576 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz",
577 | "integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=",
578 | "dependencies": {
579 | "acorn": "~3.3.0",
580 | "object-assign": "^4.0.1"
581 | }
582 | },
583 | "node_modules/is-promise": {
584 | "version": "2.1.0",
585 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
586 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
587 | },
588 | "node_modules/is-regex": {
589 | "version": "1.0.4",
590 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
591 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
592 | "dependencies": {
593 | "has": "^1.0.1"
594 | },
595 | "engines": {
596 | "node": ">= 0.4"
597 | }
598 | },
599 | "node_modules/js-stringify": {
600 | "version": "1.0.2",
601 | "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
602 | "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
603 | },
604 | "node_modules/jstransformer": {
605 | "version": "1.0.0",
606 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
607 | "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
608 | "dependencies": {
609 | "is-promise": "^2.0.0",
610 | "promise": "^7.0.1"
611 | }
612 | },
613 | "node_modules/kind-of": {
614 | "version": "3.2.2",
615 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
616 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
617 | "dependencies": {
618 | "is-buffer": "^1.1.5"
619 | },
620 | "engines": {
621 | "node": ">=0.10.0"
622 | }
623 | },
624 | "node_modules/lazy-cache": {
625 | "version": "1.0.4",
626 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
627 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
628 | "engines": {
629 | "node": ">=0.10.0"
630 | }
631 | },
632 | "node_modules/longest": {
633 | "version": "1.0.1",
634 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
635 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
636 | "engines": {
637 | "node": ">=0.10.0"
638 | }
639 | },
640 | "node_modules/media-typer": {
641 | "version": "0.3.0",
642 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
643 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
644 | "engines": {
645 | "node": ">= 0.6"
646 | }
647 | },
648 | "node_modules/merge-descriptors": {
649 | "version": "1.0.1",
650 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
651 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
652 | },
653 | "node_modules/methods": {
654 | "version": "1.1.2",
655 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
656 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
657 | "engines": {
658 | "node": ">= 0.6"
659 | }
660 | },
661 | "node_modules/mime": {
662 | "version": "1.6.0",
663 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
664 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
665 | "bin": {
666 | "mime": "cli.js"
667 | },
668 | "engines": {
669 | "node": ">=4"
670 | }
671 | },
672 | "node_modules/mime-db": {
673 | "version": "1.52.0",
674 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
675 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
676 | "engines": {
677 | "node": ">= 0.6"
678 | }
679 | },
680 | "node_modules/mime-types": {
681 | "version": "2.1.35",
682 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
683 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
684 | "dependencies": {
685 | "mime-db": "1.52.0"
686 | },
687 | "engines": {
688 | "node": ">= 0.6"
689 | }
690 | },
691 | "node_modules/morgan": {
692 | "version": "1.8.2",
693 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz",
694 | "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=",
695 | "dependencies": {
696 | "basic-auth": "~1.1.0",
697 | "debug": "2.6.8",
698 | "depd": "~1.1.0",
699 | "on-finished": "~2.3.0",
700 | "on-headers": "~1.0.1"
701 | },
702 | "engines": {
703 | "node": ">= 0.8.0"
704 | }
705 | },
706 | "node_modules/ms": {
707 | "version": "2.0.0",
708 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
709 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
710 | },
711 | "node_modules/negotiator": {
712 | "version": "0.6.3",
713 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
714 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
715 | "engines": {
716 | "node": ">= 0.6"
717 | }
718 | },
719 | "node_modules/object-assign": {
720 | "version": "4.1.1",
721 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
722 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
723 | "engines": {
724 | "node": ">=0.10.0"
725 | }
726 | },
727 | "node_modules/object-inspect": {
728 | "version": "1.12.2",
729 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
730 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
731 | "funding": {
732 | "url": "https://github.com/sponsors/ljharb"
733 | }
734 | },
735 | "node_modules/on-finished": {
736 | "version": "2.3.0",
737 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
738 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
739 | "dependencies": {
740 | "ee-first": "1.1.1"
741 | },
742 | "engines": {
743 | "node": ">= 0.8"
744 | }
745 | },
746 | "node_modules/on-headers": {
747 | "version": "1.0.1",
748 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
749 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=",
750 | "engines": {
751 | "node": ">= 0.8"
752 | }
753 | },
754 | "node_modules/parseurl": {
755 | "version": "1.3.3",
756 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
757 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
758 | "engines": {
759 | "node": ">= 0.8"
760 | }
761 | },
762 | "node_modules/path-parse": {
763 | "version": "1.0.5",
764 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
765 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
766 | },
767 | "node_modules/path-to-regexp": {
768 | "version": "0.1.7",
769 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
770 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
771 | },
772 | "node_modules/promise": {
773 | "version": "7.3.1",
774 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
775 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
776 | "dependencies": {
777 | "asap": "~2.0.3"
778 | }
779 | },
780 | "node_modules/proxy-addr": {
781 | "version": "2.0.7",
782 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
783 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
784 | "dependencies": {
785 | "forwarded": "0.2.0",
786 | "ipaddr.js": "1.9.1"
787 | },
788 | "engines": {
789 | "node": ">= 0.10"
790 | }
791 | },
792 | "node_modules/pug": {
793 | "version": "2.0.0-rc.4",
794 | "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz",
795 | "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==",
796 | "dependencies": {
797 | "pug-code-gen": "^2.0.0",
798 | "pug-filters": "^2.1.5",
799 | "pug-lexer": "^3.1.0",
800 | "pug-linker": "^3.0.3",
801 | "pug-load": "^2.0.9",
802 | "pug-parser": "^4.0.0",
803 | "pug-runtime": "^2.0.3",
804 | "pug-strip-comments": "^1.0.2"
805 | }
806 | },
807 | "node_modules/pug-attrs": {
808 | "version": "2.0.2",
809 | "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz",
810 | "integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=",
811 | "dependencies": {
812 | "constantinople": "^3.0.1",
813 | "js-stringify": "^1.0.1",
814 | "pug-runtime": "^2.0.3"
815 | }
816 | },
817 | "node_modules/pug-code-gen": {
818 | "version": "2.0.0",
819 | "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz",
820 | "integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==",
821 | "dependencies": {
822 | "constantinople": "^3.0.1",
823 | "doctypes": "^1.1.0",
824 | "js-stringify": "^1.0.1",
825 | "pug-attrs": "^2.0.2",
826 | "pug-error": "^1.3.2",
827 | "pug-runtime": "^2.0.3",
828 | "void-elements": "^2.0.1",
829 | "with": "^5.0.0"
830 | }
831 | },
832 | "node_modules/pug-error": {
833 | "version": "1.3.2",
834 | "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz",
835 | "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY="
836 | },
837 | "node_modules/pug-filters": {
838 | "version": "2.1.5",
839 | "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz",
840 | "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==",
841 | "dependencies": {
842 | "clean-css": "^3.3.0",
843 | "constantinople": "^3.0.1",
844 | "jstransformer": "1.0.0",
845 | "pug-error": "^1.3.2",
846 | "pug-walk": "^1.1.5",
847 | "resolve": "^1.1.6",
848 | "uglify-js": "^2.6.1"
849 | }
850 | },
851 | "node_modules/pug-lexer": {
852 | "version": "3.1.0",
853 | "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz",
854 | "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=",
855 | "dependencies": {
856 | "character-parser": "^2.1.1",
857 | "is-expression": "^3.0.0",
858 | "pug-error": "^1.3.2"
859 | }
860 | },
861 | "node_modules/pug-lexer/node_modules/acorn": {
862 | "version": "4.0.13",
863 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
864 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=",
865 | "bin": {
866 | "acorn": "bin/acorn"
867 | },
868 | "engines": {
869 | "node": ">=0.4.0"
870 | }
871 | },
872 | "node_modules/pug-lexer/node_modules/is-expression": {
873 | "version": "3.0.0",
874 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
875 | "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
876 | "dependencies": {
877 | "acorn": "~4.0.2",
878 | "object-assign": "^4.0.1"
879 | }
880 | },
881 | "node_modules/pug-linker": {
882 | "version": "3.0.3",
883 | "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz",
884 | "integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==",
885 | "dependencies": {
886 | "pug-error": "^1.3.2",
887 | "pug-walk": "^1.1.5"
888 | }
889 | },
890 | "node_modules/pug-load": {
891 | "version": "2.0.9",
892 | "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz",
893 | "integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==",
894 | "dependencies": {
895 | "object-assign": "^4.1.0",
896 | "pug-walk": "^1.1.5"
897 | }
898 | },
899 | "node_modules/pug-parser": {
900 | "version": "4.0.0",
901 | "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz",
902 | "integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==",
903 | "dependencies": {
904 | "pug-error": "^1.3.2",
905 | "token-stream": "0.0.1"
906 | }
907 | },
908 | "node_modules/pug-runtime": {
909 | "version": "2.0.3",
910 | "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz",
911 | "integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o="
912 | },
913 | "node_modules/pug-strip-comments": {
914 | "version": "1.0.2",
915 | "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz",
916 | "integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=",
917 | "dependencies": {
918 | "pug-error": "^1.3.2"
919 | }
920 | },
921 | "node_modules/pug-walk": {
922 | "version": "1.1.5",
923 | "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz",
924 | "integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA=="
925 | },
926 | "node_modules/qs": {
927 | "version": "6.10.3",
928 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
929 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
930 | "dependencies": {
931 | "side-channel": "^1.0.4"
932 | },
933 | "engines": {
934 | "node": ">=0.6"
935 | },
936 | "funding": {
937 | "url": "https://github.com/sponsors/ljharb"
938 | }
939 | },
940 | "node_modules/range-parser": {
941 | "version": "1.2.1",
942 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
943 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
944 | "engines": {
945 | "node": ">= 0.6"
946 | }
947 | },
948 | "node_modules/raw-body": {
949 | "version": "2.5.1",
950 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
951 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
952 | "dependencies": {
953 | "bytes": "3.1.2",
954 | "http-errors": "2.0.0",
955 | "iconv-lite": "0.4.24",
956 | "unpipe": "1.0.0"
957 | },
958 | "engines": {
959 | "node": ">= 0.8"
960 | }
961 | },
962 | "node_modules/repeat-string": {
963 | "version": "1.6.1",
964 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
965 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
966 | "engines": {
967 | "node": ">=0.10"
968 | }
969 | },
970 | "node_modules/resolve": {
971 | "version": "1.4.0",
972 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
973 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
974 | "dependencies": {
975 | "path-parse": "^1.0.5"
976 | }
977 | },
978 | "node_modules/right-align": {
979 | "version": "0.1.3",
980 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
981 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
982 | "dependencies": {
983 | "align-text": "^0.1.1"
984 | },
985 | "engines": {
986 | "node": ">=0.10.0"
987 | }
988 | },
989 | "node_modules/safe-buffer": {
990 | "version": "5.2.1",
991 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
992 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
993 | "funding": [
994 | {
995 | "type": "github",
996 | "url": "https://github.com/sponsors/feross"
997 | },
998 | {
999 | "type": "patreon",
1000 | "url": "https://www.patreon.com/feross"
1001 | },
1002 | {
1003 | "type": "consulting",
1004 | "url": "https://feross.org/support"
1005 | }
1006 | ]
1007 | },
1008 | "node_modules/safer-buffer": {
1009 | "version": "2.1.2",
1010 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1011 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1012 | },
1013 | "node_modules/send": {
1014 | "version": "0.18.0",
1015 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1016 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1017 | "dependencies": {
1018 | "debug": "2.6.9",
1019 | "depd": "2.0.0",
1020 | "destroy": "1.2.0",
1021 | "encodeurl": "~1.0.2",
1022 | "escape-html": "~1.0.3",
1023 | "etag": "~1.8.1",
1024 | "fresh": "0.5.2",
1025 | "http-errors": "2.0.0",
1026 | "mime": "1.6.0",
1027 | "ms": "2.1.3",
1028 | "on-finished": "2.4.1",
1029 | "range-parser": "~1.2.1",
1030 | "statuses": "2.0.1"
1031 | },
1032 | "engines": {
1033 | "node": ">= 0.8.0"
1034 | }
1035 | },
1036 | "node_modules/send/node_modules/debug": {
1037 | "version": "2.6.9",
1038 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1039 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1040 | "dependencies": {
1041 | "ms": "2.0.0"
1042 | }
1043 | },
1044 | "node_modules/send/node_modules/debug/node_modules/ms": {
1045 | "version": "2.0.0",
1046 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1047 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
1048 | },
1049 | "node_modules/send/node_modules/depd": {
1050 | "version": "2.0.0",
1051 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1052 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
1053 | "engines": {
1054 | "node": ">= 0.8"
1055 | }
1056 | },
1057 | "node_modules/send/node_modules/ms": {
1058 | "version": "2.1.3",
1059 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1060 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1061 | },
1062 | "node_modules/send/node_modules/on-finished": {
1063 | "version": "2.4.1",
1064 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1065 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1066 | "dependencies": {
1067 | "ee-first": "1.1.1"
1068 | },
1069 | "engines": {
1070 | "node": ">= 0.8"
1071 | }
1072 | },
1073 | "node_modules/serve-static": {
1074 | "version": "1.15.0",
1075 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1076 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1077 | "dependencies": {
1078 | "encodeurl": "~1.0.2",
1079 | "escape-html": "~1.0.3",
1080 | "parseurl": "~1.3.3",
1081 | "send": "0.18.0"
1082 | },
1083 | "engines": {
1084 | "node": ">= 0.8.0"
1085 | }
1086 | },
1087 | "node_modules/setprototypeof": {
1088 | "version": "1.2.0",
1089 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1090 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1091 | },
1092 | "node_modules/side-channel": {
1093 | "version": "1.0.4",
1094 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1095 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1096 | "dependencies": {
1097 | "call-bind": "^1.0.0",
1098 | "get-intrinsic": "^1.0.2",
1099 | "object-inspect": "^1.9.0"
1100 | },
1101 | "funding": {
1102 | "url": "https://github.com/sponsors/ljharb"
1103 | }
1104 | },
1105 | "node_modules/source-map": {
1106 | "version": "0.4.4",
1107 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
1108 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
1109 | "dependencies": {
1110 | "amdefine": ">=0.0.4"
1111 | },
1112 | "engines": {
1113 | "node": ">=0.8.0"
1114 | }
1115 | },
1116 | "node_modules/statuses": {
1117 | "version": "2.0.1",
1118 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1119 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
1120 | "engines": {
1121 | "node": ">= 0.8"
1122 | }
1123 | },
1124 | "node_modules/toidentifier": {
1125 | "version": "1.0.1",
1126 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1127 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1128 | "engines": {
1129 | "node": ">=0.6"
1130 | }
1131 | },
1132 | "node_modules/token-stream": {
1133 | "version": "0.0.1",
1134 | "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
1135 | "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
1136 | },
1137 | "node_modules/type-is": {
1138 | "version": "1.6.18",
1139 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1140 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1141 | "dependencies": {
1142 | "media-typer": "0.3.0",
1143 | "mime-types": "~2.1.24"
1144 | },
1145 | "engines": {
1146 | "node": ">= 0.6"
1147 | }
1148 | },
1149 | "node_modules/uglify-js": {
1150 | "version": "2.8.29",
1151 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
1152 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
1153 | "dependencies": {
1154 | "source-map": "~0.5.1",
1155 | "yargs": "~3.10.0"
1156 | },
1157 | "bin": {
1158 | "uglifyjs": "bin/uglifyjs"
1159 | },
1160 | "engines": {
1161 | "node": ">=0.8.0"
1162 | },
1163 | "optionalDependencies": {
1164 | "uglify-to-browserify": "~1.0.0"
1165 | }
1166 | },
1167 | "node_modules/uglify-js/node_modules/source-map": {
1168 | "version": "0.5.7",
1169 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
1170 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
1171 | "engines": {
1172 | "node": ">=0.10.0"
1173 | }
1174 | },
1175 | "node_modules/uglify-to-browserify": {
1176 | "version": "1.0.2",
1177 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
1178 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
1179 | "optional": true
1180 | },
1181 | "node_modules/unpipe": {
1182 | "version": "1.0.0",
1183 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1184 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1185 | "engines": {
1186 | "node": ">= 0.8"
1187 | }
1188 | },
1189 | "node_modules/utils-merge": {
1190 | "version": "1.0.1",
1191 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1192 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
1193 | "engines": {
1194 | "node": ">= 0.4.0"
1195 | }
1196 | },
1197 | "node_modules/vary": {
1198 | "version": "1.1.2",
1199 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1200 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1201 | "engines": {
1202 | "node": ">= 0.8"
1203 | }
1204 | },
1205 | "node_modules/void-elements": {
1206 | "version": "2.0.1",
1207 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
1208 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=",
1209 | "engines": {
1210 | "node": ">=0.10.0"
1211 | }
1212 | },
1213 | "node_modules/window-size": {
1214 | "version": "0.1.0",
1215 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
1216 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
1217 | "engines": {
1218 | "node": ">= 0.8.0"
1219 | }
1220 | },
1221 | "node_modules/with": {
1222 | "version": "5.1.1",
1223 | "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
1224 | "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
1225 | "dependencies": {
1226 | "acorn": "^3.1.0",
1227 | "acorn-globals": "^3.0.0"
1228 | }
1229 | },
1230 | "node_modules/wordwrap": {
1231 | "version": "0.0.2",
1232 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
1233 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
1234 | "engines": {
1235 | "node": ">=0.4.0"
1236 | }
1237 | },
1238 | "node_modules/yargs": {
1239 | "version": "3.10.0",
1240 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
1241 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
1242 | "dependencies": {
1243 | "camelcase": "^1.0.2",
1244 | "cliui": "^2.1.0",
1245 | "decamelize": "^1.0.0",
1246 | "window-size": "0.1.0"
1247 | }
1248 | }
1249 | },
1250 | "dependencies": {
1251 | "accepts": {
1252 | "version": "1.3.8",
1253 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
1254 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
1255 | "requires": {
1256 | "mime-types": "~2.1.34",
1257 | "negotiator": "0.6.3"
1258 | }
1259 | },
1260 | "acorn": {
1261 | "version": "3.3.0",
1262 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
1263 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
1264 | },
1265 | "acorn-globals": {
1266 | "version": "3.1.0",
1267 | "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
1268 | "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
1269 | "requires": {
1270 | "acorn": "^4.0.4"
1271 | },
1272 | "dependencies": {
1273 | "acorn": {
1274 | "version": "4.0.13",
1275 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
1276 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
1277 | }
1278 | }
1279 | },
1280 | "align-text": {
1281 | "version": "0.1.4",
1282 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
1283 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
1284 | "requires": {
1285 | "kind-of": "^3.0.2",
1286 | "longest": "^1.0.1",
1287 | "repeat-string": "^1.5.2"
1288 | }
1289 | },
1290 | "amdefine": {
1291 | "version": "1.0.1",
1292 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
1293 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
1294 | },
1295 | "array-flatten": {
1296 | "version": "1.1.1",
1297 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
1298 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
1299 | },
1300 | "asap": {
1301 | "version": "2.0.6",
1302 | "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
1303 | "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
1304 | },
1305 | "basic-auth": {
1306 | "version": "1.1.0",
1307 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.1.0.tgz",
1308 | "integrity": "sha1-RSIe5Cn37h5QNb4/UVM/HN/SmIQ="
1309 | },
1310 | "body-parser": {
1311 | "version": "1.20.0",
1312 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
1313 | "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
1314 | "requires": {
1315 | "bytes": "3.1.2",
1316 | "content-type": "~1.0.4",
1317 | "debug": "2.6.9",
1318 | "depd": "2.0.0",
1319 | "destroy": "1.2.0",
1320 | "http-errors": "2.0.0",
1321 | "iconv-lite": "0.4.24",
1322 | "on-finished": "2.4.1",
1323 | "qs": "6.10.3",
1324 | "raw-body": "2.5.1",
1325 | "type-is": "~1.6.18",
1326 | "unpipe": "1.0.0"
1327 | },
1328 | "dependencies": {
1329 | "debug": {
1330 | "version": "2.6.9",
1331 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1332 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1333 | "requires": {
1334 | "ms": "2.0.0"
1335 | }
1336 | },
1337 | "depd": {
1338 | "version": "2.0.0",
1339 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1340 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1341 | },
1342 | "on-finished": {
1343 | "version": "2.4.1",
1344 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1345 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1346 | "requires": {
1347 | "ee-first": "1.1.1"
1348 | }
1349 | }
1350 | }
1351 | },
1352 | "bytes": {
1353 | "version": "3.1.2",
1354 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
1355 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
1356 | },
1357 | "call-bind": {
1358 | "version": "1.0.2",
1359 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
1360 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
1361 | "requires": {
1362 | "function-bind": "^1.1.1",
1363 | "get-intrinsic": "^1.0.2"
1364 | }
1365 | },
1366 | "camelcase": {
1367 | "version": "1.2.1",
1368 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
1369 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
1370 | },
1371 | "center-align": {
1372 | "version": "0.1.3",
1373 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
1374 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
1375 | "requires": {
1376 | "align-text": "^0.1.3",
1377 | "lazy-cache": "^1.0.3"
1378 | }
1379 | },
1380 | "character-parser": {
1381 | "version": "2.2.0",
1382 | "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
1383 | "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
1384 | "requires": {
1385 | "is-regex": "^1.0.3"
1386 | }
1387 | },
1388 | "clean-css": {
1389 | "version": "3.4.28",
1390 | "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.28.tgz",
1391 | "integrity": "sha1-vxlF6C/ICPVWlebd6uwBQA79A/8=",
1392 | "requires": {
1393 | "commander": "2.8.x",
1394 | "source-map": "0.4.x"
1395 | }
1396 | },
1397 | "cliui": {
1398 | "version": "2.1.0",
1399 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
1400 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
1401 | "requires": {
1402 | "center-align": "^0.1.1",
1403 | "right-align": "^0.1.1",
1404 | "wordwrap": "0.0.2"
1405 | }
1406 | },
1407 | "colors": {
1408 | "version": "1.4.0",
1409 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
1410 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA=="
1411 | },
1412 | "commander": {
1413 | "version": "2.8.1",
1414 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz",
1415 | "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=",
1416 | "requires": {
1417 | "graceful-readlink": ">= 1.0.0"
1418 | }
1419 | },
1420 | "constantinople": {
1421 | "version": "3.1.0",
1422 | "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.0.tgz",
1423 | "integrity": "sha1-dWnKqKo/jVk11i4fqW+fcCzYHHk=",
1424 | "requires": {
1425 | "acorn": "^3.1.0",
1426 | "is-expression": "^2.0.1"
1427 | }
1428 | },
1429 | "content-disposition": {
1430 | "version": "0.5.4",
1431 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
1432 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
1433 | "requires": {
1434 | "safe-buffer": "5.2.1"
1435 | }
1436 | },
1437 | "content-type": {
1438 | "version": "1.0.4",
1439 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
1440 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
1441 | },
1442 | "cookie": {
1443 | "version": "0.5.0",
1444 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
1445 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
1446 | },
1447 | "cookie-signature": {
1448 | "version": "1.0.6",
1449 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
1450 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
1451 | },
1452 | "debug": {
1453 | "version": "2.6.8",
1454 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz",
1455 | "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=",
1456 | "requires": {
1457 | "ms": "2.0.0"
1458 | }
1459 | },
1460 | "decamelize": {
1461 | "version": "1.2.0",
1462 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
1463 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
1464 | },
1465 | "depd": {
1466 | "version": "1.1.1",
1467 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
1468 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
1469 | },
1470 | "destroy": {
1471 | "version": "1.2.0",
1472 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
1473 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
1474 | },
1475 | "doctypes": {
1476 | "version": "1.1.0",
1477 | "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
1478 | "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
1479 | },
1480 | "ee-first": {
1481 | "version": "1.1.1",
1482 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
1483 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
1484 | },
1485 | "ejs": {
1486 | "version": "2.5.7",
1487 | "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.5.7.tgz",
1488 | "integrity": "sha1-zIcsFoiArjxxiXYv1f/ACJbJUYo="
1489 | },
1490 | "encodeurl": {
1491 | "version": "1.0.2",
1492 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
1493 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
1494 | },
1495 | "escape-html": {
1496 | "version": "1.0.3",
1497 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
1498 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
1499 | },
1500 | "etag": {
1501 | "version": "1.8.1",
1502 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
1503 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
1504 | },
1505 | "express": {
1506 | "version": "4.18.1",
1507 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
1508 | "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
1509 | "requires": {
1510 | "accepts": "~1.3.8",
1511 | "array-flatten": "1.1.1",
1512 | "body-parser": "1.20.0",
1513 | "content-disposition": "0.5.4",
1514 | "content-type": "~1.0.4",
1515 | "cookie": "0.5.0",
1516 | "cookie-signature": "1.0.6",
1517 | "debug": "2.6.9",
1518 | "depd": "2.0.0",
1519 | "encodeurl": "~1.0.2",
1520 | "escape-html": "~1.0.3",
1521 | "etag": "~1.8.1",
1522 | "finalhandler": "1.2.0",
1523 | "fresh": "0.5.2",
1524 | "http-errors": "2.0.0",
1525 | "merge-descriptors": "1.0.1",
1526 | "methods": "~1.1.2",
1527 | "on-finished": "2.4.1",
1528 | "parseurl": "~1.3.3",
1529 | "path-to-regexp": "0.1.7",
1530 | "proxy-addr": "~2.0.7",
1531 | "qs": "6.10.3",
1532 | "range-parser": "~1.2.1",
1533 | "safe-buffer": "5.2.1",
1534 | "send": "0.18.0",
1535 | "serve-static": "1.15.0",
1536 | "setprototypeof": "1.2.0",
1537 | "statuses": "2.0.1",
1538 | "type-is": "~1.6.18",
1539 | "utils-merge": "1.0.1",
1540 | "vary": "~1.1.2"
1541 | },
1542 | "dependencies": {
1543 | "debug": {
1544 | "version": "2.6.9",
1545 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1546 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1547 | "requires": {
1548 | "ms": "2.0.0"
1549 | }
1550 | },
1551 | "depd": {
1552 | "version": "2.0.0",
1553 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1554 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1555 | },
1556 | "on-finished": {
1557 | "version": "2.4.1",
1558 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1559 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1560 | "requires": {
1561 | "ee-first": "1.1.1"
1562 | }
1563 | }
1564 | }
1565 | },
1566 | "finalhandler": {
1567 | "version": "1.2.0",
1568 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
1569 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
1570 | "requires": {
1571 | "debug": "2.6.9",
1572 | "encodeurl": "~1.0.2",
1573 | "escape-html": "~1.0.3",
1574 | "on-finished": "2.4.1",
1575 | "parseurl": "~1.3.3",
1576 | "statuses": "2.0.1",
1577 | "unpipe": "~1.0.0"
1578 | },
1579 | "dependencies": {
1580 | "debug": {
1581 | "version": "2.6.9",
1582 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
1583 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
1584 | "requires": {
1585 | "ms": "2.0.0"
1586 | }
1587 | },
1588 | "on-finished": {
1589 | "version": "2.4.1",
1590 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1591 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1592 | "requires": {
1593 | "ee-first": "1.1.1"
1594 | }
1595 | }
1596 | }
1597 | },
1598 | "forwarded": {
1599 | "version": "0.2.0",
1600 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
1601 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
1602 | },
1603 | "fresh": {
1604 | "version": "0.5.2",
1605 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
1606 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
1607 | },
1608 | "function-bind": {
1609 | "version": "1.1.1",
1610 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
1611 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
1612 | },
1613 | "get-intrinsic": {
1614 | "version": "1.1.2",
1615 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
1616 | "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
1617 | "requires": {
1618 | "function-bind": "^1.1.1",
1619 | "has": "^1.0.3",
1620 | "has-symbols": "^1.0.3"
1621 | }
1622 | },
1623 | "graceful-readlink": {
1624 | "version": "1.0.1",
1625 | "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
1626 | "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU="
1627 | },
1628 | "has": {
1629 | "version": "1.0.3",
1630 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
1631 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
1632 | "requires": {
1633 | "function-bind": "^1.1.1"
1634 | }
1635 | },
1636 | "has-symbols": {
1637 | "version": "1.0.3",
1638 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
1639 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
1640 | },
1641 | "http-errors": {
1642 | "version": "2.0.0",
1643 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
1644 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
1645 | "requires": {
1646 | "depd": "2.0.0",
1647 | "inherits": "2.0.4",
1648 | "setprototypeof": "1.2.0",
1649 | "statuses": "2.0.1",
1650 | "toidentifier": "1.0.1"
1651 | },
1652 | "dependencies": {
1653 | "depd": {
1654 | "version": "2.0.0",
1655 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
1656 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
1657 | }
1658 | }
1659 | },
1660 | "iconv-lite": {
1661 | "version": "0.4.24",
1662 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1663 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1664 | "requires": {
1665 | "safer-buffer": ">= 2.1.2 < 3"
1666 | }
1667 | },
1668 | "inherits": {
1669 | "version": "2.0.4",
1670 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
1671 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
1672 | },
1673 | "ipaddr.js": {
1674 | "version": "1.9.1",
1675 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
1676 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
1677 | },
1678 | "is-buffer": {
1679 | "version": "1.1.5",
1680 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
1681 | "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw="
1682 | },
1683 | "is-expression": {
1684 | "version": "2.1.0",
1685 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-2.1.0.tgz",
1686 | "integrity": "sha1-kb6dR968/vB3l36XIr5tz7RGXvA=",
1687 | "requires": {
1688 | "acorn": "~3.3.0",
1689 | "object-assign": "^4.0.1"
1690 | }
1691 | },
1692 | "is-promise": {
1693 | "version": "2.1.0",
1694 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
1695 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
1696 | },
1697 | "is-regex": {
1698 | "version": "1.0.4",
1699 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
1700 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
1701 | "requires": {
1702 | "has": "^1.0.1"
1703 | }
1704 | },
1705 | "js-stringify": {
1706 | "version": "1.0.2",
1707 | "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
1708 | "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
1709 | },
1710 | "jstransformer": {
1711 | "version": "1.0.0",
1712 | "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
1713 | "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
1714 | "requires": {
1715 | "is-promise": "^2.0.0",
1716 | "promise": "^7.0.1"
1717 | }
1718 | },
1719 | "kind-of": {
1720 | "version": "3.2.2",
1721 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1722 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1723 | "requires": {
1724 | "is-buffer": "^1.1.5"
1725 | }
1726 | },
1727 | "lazy-cache": {
1728 | "version": "1.0.4",
1729 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
1730 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
1731 | },
1732 | "longest": {
1733 | "version": "1.0.1",
1734 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
1735 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
1736 | },
1737 | "media-typer": {
1738 | "version": "0.3.0",
1739 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
1740 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
1741 | },
1742 | "merge-descriptors": {
1743 | "version": "1.0.1",
1744 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
1745 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
1746 | },
1747 | "methods": {
1748 | "version": "1.1.2",
1749 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
1750 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
1751 | },
1752 | "mime": {
1753 | "version": "1.6.0",
1754 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1755 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
1756 | },
1757 | "mime-db": {
1758 | "version": "1.52.0",
1759 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
1760 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
1761 | },
1762 | "mime-types": {
1763 | "version": "2.1.35",
1764 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
1765 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
1766 | "requires": {
1767 | "mime-db": "1.52.0"
1768 | }
1769 | },
1770 | "morgan": {
1771 | "version": "1.8.2",
1772 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.8.2.tgz",
1773 | "integrity": "sha1-eErHc05KRTqcbm6GgKkyknXItoc=",
1774 | "requires": {
1775 | "basic-auth": "~1.1.0",
1776 | "debug": "2.6.8",
1777 | "depd": "~1.1.0",
1778 | "on-finished": "~2.3.0",
1779 | "on-headers": "~1.0.1"
1780 | }
1781 | },
1782 | "ms": {
1783 | "version": "2.0.0",
1784 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1785 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
1786 | },
1787 | "negotiator": {
1788 | "version": "0.6.3",
1789 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1790 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1791 | },
1792 | "object-assign": {
1793 | "version": "4.1.1",
1794 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1795 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1796 | },
1797 | "object-inspect": {
1798 | "version": "1.12.2",
1799 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
1800 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
1801 | },
1802 | "on-finished": {
1803 | "version": "2.3.0",
1804 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
1805 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
1806 | "requires": {
1807 | "ee-first": "1.1.1"
1808 | }
1809 | },
1810 | "on-headers": {
1811 | "version": "1.0.1",
1812 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz",
1813 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c="
1814 | },
1815 | "parseurl": {
1816 | "version": "1.3.3",
1817 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1818 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1819 | },
1820 | "path-parse": {
1821 | "version": "1.0.5",
1822 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
1823 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME="
1824 | },
1825 | "path-to-regexp": {
1826 | "version": "0.1.7",
1827 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1828 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
1829 | },
1830 | "promise": {
1831 | "version": "7.3.1",
1832 | "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
1833 | "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
1834 | "requires": {
1835 | "asap": "~2.0.3"
1836 | }
1837 | },
1838 | "proxy-addr": {
1839 | "version": "2.0.7",
1840 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1841 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1842 | "requires": {
1843 | "forwarded": "0.2.0",
1844 | "ipaddr.js": "1.9.1"
1845 | }
1846 | },
1847 | "pug": {
1848 | "version": "2.0.0-rc.4",
1849 | "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.0-rc.4.tgz",
1850 | "integrity": "sha512-SL7xovj6E2Loq9N0UgV6ynjMLW4urTFY/L/Fprhvz13Xc5vjzkjZjI1QHKq31200+6PSD8PyU6MqrtCTJj6/XA==",
1851 | "requires": {
1852 | "pug-code-gen": "^2.0.0",
1853 | "pug-filters": "^2.1.5",
1854 | "pug-lexer": "^3.1.0",
1855 | "pug-linker": "^3.0.3",
1856 | "pug-load": "^2.0.9",
1857 | "pug-parser": "^4.0.0",
1858 | "pug-runtime": "^2.0.3",
1859 | "pug-strip-comments": "^1.0.2"
1860 | }
1861 | },
1862 | "pug-attrs": {
1863 | "version": "2.0.2",
1864 | "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.2.tgz",
1865 | "integrity": "sha1-i+KyIlVo/6ddG4Zpgr/59BEa/8s=",
1866 | "requires": {
1867 | "constantinople": "^3.0.1",
1868 | "js-stringify": "^1.0.1",
1869 | "pug-runtime": "^2.0.3"
1870 | }
1871 | },
1872 | "pug-code-gen": {
1873 | "version": "2.0.0",
1874 | "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.0.tgz",
1875 | "integrity": "sha512-E4oiJT+Jn5tyEIloj8dIJQognbiNNp0i0cAJmYtQTFS0soJ917nlIuFtqVss3IXMEyQKUew3F4gIkBpn18KbVg==",
1876 | "requires": {
1877 | "constantinople": "^3.0.1",
1878 | "doctypes": "^1.1.0",
1879 | "js-stringify": "^1.0.1",
1880 | "pug-attrs": "^2.0.2",
1881 | "pug-error": "^1.3.2",
1882 | "pug-runtime": "^2.0.3",
1883 | "void-elements": "^2.0.1",
1884 | "with": "^5.0.0"
1885 | }
1886 | },
1887 | "pug-error": {
1888 | "version": "1.3.2",
1889 | "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz",
1890 | "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY="
1891 | },
1892 | "pug-filters": {
1893 | "version": "2.1.5",
1894 | "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-2.1.5.tgz",
1895 | "integrity": "sha512-xkw71KtrC4sxleKiq+cUlQzsiLn8pM5+vCgkChW2E6oNOzaqTSIBKIQ5cl4oheuDzvJYCTSYzRaVinMUrV4YLQ==",
1896 | "requires": {
1897 | "clean-css": "^3.3.0",
1898 | "constantinople": "^3.0.1",
1899 | "jstransformer": "1.0.0",
1900 | "pug-error": "^1.3.2",
1901 | "pug-walk": "^1.1.5",
1902 | "resolve": "^1.1.6",
1903 | "uglify-js": "^2.6.1"
1904 | }
1905 | },
1906 | "pug-lexer": {
1907 | "version": "3.1.0",
1908 | "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-3.1.0.tgz",
1909 | "integrity": "sha1-/QhzdtSmdbT1n4/vQiiDQ06VgaI=",
1910 | "requires": {
1911 | "character-parser": "^2.1.1",
1912 | "is-expression": "^3.0.0",
1913 | "pug-error": "^1.3.2"
1914 | },
1915 | "dependencies": {
1916 | "acorn": {
1917 | "version": "4.0.13",
1918 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
1919 | "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
1920 | },
1921 | "is-expression": {
1922 | "version": "3.0.0",
1923 | "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
1924 | "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
1925 | "requires": {
1926 | "acorn": "~4.0.2",
1927 | "object-assign": "^4.0.1"
1928 | }
1929 | }
1930 | }
1931 | },
1932 | "pug-linker": {
1933 | "version": "3.0.3",
1934 | "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.3.tgz",
1935 | "integrity": "sha512-DCKczglCXOzJ1lr4xUj/lVHYvS+lGmR2+KTCjZjtIpdwaN7lNOoX2SW6KFX5X4ElvW+6ThwB+acSUg08UJFN5A==",
1936 | "requires": {
1937 | "pug-error": "^1.3.2",
1938 | "pug-walk": "^1.1.5"
1939 | }
1940 | },
1941 | "pug-load": {
1942 | "version": "2.0.9",
1943 | "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.9.tgz",
1944 | "integrity": "sha512-BDdZOCru4mg+1MiZwRQZh25+NTRo/R6/qArrdWIf308rHtWA5N9kpoUskRe4H6FslaQujC+DigH9LqlBA4gf6Q==",
1945 | "requires": {
1946 | "object-assign": "^4.1.0",
1947 | "pug-walk": "^1.1.5"
1948 | }
1949 | },
1950 | "pug-parser": {
1951 | "version": "4.0.0",
1952 | "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-4.0.0.tgz",
1953 | "integrity": "sha512-ocEUFPdLG9awwFj0sqi1uiZLNvfoodCMULZzkRqILryIWc/UUlDlxqrKhKjAIIGPX/1SNsvxy63+ayEGocGhQg==",
1954 | "requires": {
1955 | "pug-error": "^1.3.2",
1956 | "token-stream": "0.0.1"
1957 | }
1958 | },
1959 | "pug-runtime": {
1960 | "version": "2.0.3",
1961 | "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.3.tgz",
1962 | "integrity": "sha1-mBYmB7D86eJU1CfzOYelrucWi9o="
1963 | },
1964 | "pug-strip-comments": {
1965 | "version": "1.0.2",
1966 | "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.2.tgz",
1967 | "integrity": "sha1-0xOvoBvMN0mA4TmeI+vy65vchRM=",
1968 | "requires": {
1969 | "pug-error": "^1.3.2"
1970 | }
1971 | },
1972 | "pug-walk": {
1973 | "version": "1.1.5",
1974 | "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.5.tgz",
1975 | "integrity": "sha512-rJlH1lXerCIAtImXBze3dtKq/ykZMA4rpO9FnPcIgsWcxZLOvd8zltaoeOVFyBSSqCkhhJWbEbTMga8UxWUUSA=="
1976 | },
1977 | "qs": {
1978 | "version": "6.10.3",
1979 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
1980 | "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
1981 | "requires": {
1982 | "side-channel": "^1.0.4"
1983 | }
1984 | },
1985 | "range-parser": {
1986 | "version": "1.2.1",
1987 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1988 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1989 | },
1990 | "raw-body": {
1991 | "version": "2.5.1",
1992 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1993 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1994 | "requires": {
1995 | "bytes": "3.1.2",
1996 | "http-errors": "2.0.0",
1997 | "iconv-lite": "0.4.24",
1998 | "unpipe": "1.0.0"
1999 | }
2000 | },
2001 | "repeat-string": {
2002 | "version": "1.6.1",
2003 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
2004 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
2005 | },
2006 | "resolve": {
2007 | "version": "1.4.0",
2008 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz",
2009 | "integrity": "sha512-aW7sVKPufyHqOmyyLzg/J+8606v5nevBgaliIlV7nUpVMsDnoBGV/cbSLNjZAg9q0Cfd/+easKVKQ8vOu8fn1Q==",
2010 | "requires": {
2011 | "path-parse": "^1.0.5"
2012 | }
2013 | },
2014 | "right-align": {
2015 | "version": "0.1.3",
2016 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
2017 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
2018 | "requires": {
2019 | "align-text": "^0.1.1"
2020 | }
2021 | },
2022 | "safe-buffer": {
2023 | "version": "5.2.1",
2024 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
2025 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
2026 | },
2027 | "safer-buffer": {
2028 | "version": "2.1.2",
2029 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2030 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
2031 | },
2032 | "send": {
2033 | "version": "0.18.0",
2034 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
2035 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
2036 | "requires": {
2037 | "debug": "2.6.9",
2038 | "depd": "2.0.0",
2039 | "destroy": "1.2.0",
2040 | "encodeurl": "~1.0.2",
2041 | "escape-html": "~1.0.3",
2042 | "etag": "~1.8.1",
2043 | "fresh": "0.5.2",
2044 | "http-errors": "2.0.0",
2045 | "mime": "1.6.0",
2046 | "ms": "2.1.3",
2047 | "on-finished": "2.4.1",
2048 | "range-parser": "~1.2.1",
2049 | "statuses": "2.0.1"
2050 | },
2051 | "dependencies": {
2052 | "debug": {
2053 | "version": "2.6.9",
2054 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
2055 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
2056 | "requires": {
2057 | "ms": "2.0.0"
2058 | },
2059 | "dependencies": {
2060 | "ms": {
2061 | "version": "2.0.0",
2062 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
2063 | "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
2064 | }
2065 | }
2066 | },
2067 | "depd": {
2068 | "version": "2.0.0",
2069 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
2070 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
2071 | },
2072 | "ms": {
2073 | "version": "2.1.3",
2074 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
2075 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
2076 | },
2077 | "on-finished": {
2078 | "version": "2.4.1",
2079 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
2080 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
2081 | "requires": {
2082 | "ee-first": "1.1.1"
2083 | }
2084 | }
2085 | }
2086 | },
2087 | "serve-static": {
2088 | "version": "1.15.0",
2089 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
2090 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
2091 | "requires": {
2092 | "encodeurl": "~1.0.2",
2093 | "escape-html": "~1.0.3",
2094 | "parseurl": "~1.3.3",
2095 | "send": "0.18.0"
2096 | }
2097 | },
2098 | "setprototypeof": {
2099 | "version": "1.2.0",
2100 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
2101 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
2102 | },
2103 | "side-channel": {
2104 | "version": "1.0.4",
2105 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
2106 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
2107 | "requires": {
2108 | "call-bind": "^1.0.0",
2109 | "get-intrinsic": "^1.0.2",
2110 | "object-inspect": "^1.9.0"
2111 | }
2112 | },
2113 | "source-map": {
2114 | "version": "0.4.4",
2115 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
2116 | "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
2117 | "requires": {
2118 | "amdefine": ">=0.0.4"
2119 | }
2120 | },
2121 | "statuses": {
2122 | "version": "2.0.1",
2123 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
2124 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
2125 | },
2126 | "toidentifier": {
2127 | "version": "1.0.1",
2128 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
2129 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
2130 | },
2131 | "token-stream": {
2132 | "version": "0.0.1",
2133 | "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
2134 | "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
2135 | },
2136 | "type-is": {
2137 | "version": "1.6.18",
2138 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
2139 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
2140 | "requires": {
2141 | "media-typer": "0.3.0",
2142 | "mime-types": "~2.1.24"
2143 | }
2144 | },
2145 | "uglify-js": {
2146 | "version": "2.8.29",
2147 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
2148 | "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
2149 | "requires": {
2150 | "source-map": "~0.5.1",
2151 | "uglify-to-browserify": "~1.0.0",
2152 | "yargs": "~3.10.0"
2153 | },
2154 | "dependencies": {
2155 | "source-map": {
2156 | "version": "0.5.7",
2157 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
2158 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
2159 | }
2160 | }
2161 | },
2162 | "uglify-to-browserify": {
2163 | "version": "1.0.2",
2164 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
2165 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
2166 | "optional": true
2167 | },
2168 | "unpipe": {
2169 | "version": "1.0.0",
2170 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
2171 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
2172 | },
2173 | "utils-merge": {
2174 | "version": "1.0.1",
2175 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
2176 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
2177 | },
2178 | "vary": {
2179 | "version": "1.1.2",
2180 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
2181 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
2182 | },
2183 | "void-elements": {
2184 | "version": "2.0.1",
2185 | "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
2186 | "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
2187 | },
2188 | "window-size": {
2189 | "version": "0.1.0",
2190 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
2191 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
2192 | },
2193 | "with": {
2194 | "version": "5.1.1",
2195 | "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
2196 | "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
2197 | "requires": {
2198 | "acorn": "^3.1.0",
2199 | "acorn-globals": "^3.0.0"
2200 | }
2201 | },
2202 | "wordwrap": {
2203 | "version": "0.0.2",
2204 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
2205 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
2206 | },
2207 | "yargs": {
2208 | "version": "3.10.0",
2209 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
2210 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
2211 | "requires": {
2212 | "camelcase": "^1.0.2",
2213 | "cliui": "^2.1.0",
2214 | "decamelize": "^1.0.0",
2215 | "window-size": "0.1.0"
2216 | }
2217 | }
2218 | }
2219 | }
2220 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "express-course",
3 | "version": "1.0.0",
4 | "description": "This is a course for the mvc framework for Node.js, Express.js",
5 | "main": "hello-world.js",
6 | "directories": {
7 | "example": "examples"
8 | },
9 | "scripts": {
10 | "test": "echo \"Error: no test specified\" && exit 1"
11 | },
12 | "repository": {
13 | "type": "git",
14 | "url": "git+https://github.com/FaztTech/express-course.git"
15 | },
16 | "keywords": [],
17 | "author": "",
18 | "license": "ISC",
19 | "bugs": {
20 | "url": "https://github.com/FaztTech/express-course/issues"
21 | },
22 | "homepage": "https://github.com/FaztTech/express-course#readme",
23 | "dependencies": {
24 | "colors": "^1.4.0",
25 | "ejs": "^2.5.7",
26 | "express": "^4.18.1",
27 | "morgan": "^1.8.2",
28 | "pug": "^2.0.0-rc.4"
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/queries/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 |
4 | // google.com/search/?q=javascript books
5 | // retuns an string
6 | app.get("/search", (req, res) => {
7 | console.log(req.query.q);
8 | if (req.query.q === "javascript books") {
9 | res.send("List of javascript books");
10 | } else {
11 | res.send("Not found");
12 | }
13 | });
14 |
15 | // google.com/search?arg=javascript&arg=html
16 | // retuns an array
17 | app.get("/search-v2/", (req, res) => {
18 | console.log(req.query.arg);
19 | res.send("received");
20 | });
21 |
22 | app.listen(3000);
23 | console.log("server on port ", 3000);
24 |
--------------------------------------------------------------------------------
/request_params/fazt-logo.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fazt/express-course/091ec81e5215f5d2c15705965ce76f074be49d18/request_params/fazt-logo.jpg
--------------------------------------------------------------------------------
/request_params/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 |
4 | app.get("/hello/:user", (req, res) => {
5 | res.end("Hello " + req.params.user + ".");
6 | });
7 |
8 | // sometimes we need to parse the params
9 | app.get("/add/:userId", (req, res) => {
10 | let userId = parseInt(req.params.userId, 10);
11 | userId++;
12 | console.log(userId);
13 | res.send("Your user Id + 1 is: " + userId);
14 | });
15 |
16 | // params could be on any subroute
17 | app.get("/users/:username/photo", (req, res) => {
18 | if (req.params.username === "fazt") {
19 | res.setHeader("nickname", req.params.username);
20 | return res.sendFile("./fazt-logo.jpg", { root: __dirname });
21 | }
22 | res.end("User not found");
23 | });
24 |
25 | // Regex to match /users/123, but no /users/fazt
26 | app.get(/^\/id\/(\d+)$/, (req, res) => {
27 | let userId = parseInt(req.params[0], 10);
28 | res.json({
29 | "User ID": userId,
30 | });
31 | });
32 |
33 | // to match similar to /users/100-500
34 | app.get(/^\/ids\/(\d+)-(\d+)$/, (req, res) => {
35 | let startId = parseInt(req.params[0], 10);
36 | let endId = parseInt(req.params[1], 10);
37 |
38 | res.json({
39 | startId,
40 | endId,
41 | });
42 | });
43 |
44 | // to match UUIDs
45 | // xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
46 | const horribleRegexp =
47 | /^\/uuid\/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})$/i;
48 |
49 | app.get(horribleRegexp, (req, res) => {
50 | console.log(req.params);
51 | const uuid = req.params[0];
52 | res.send("UUID: " + uuid);
53 | });
54 |
55 | app.listen(3000);
56 | console.log("Server on port ", 3000);
57 |
--------------------------------------------------------------------------------
/settings/case_sensitive_routing.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 |
3 | const app = express();
4 |
5 | app.set('case sensitive routing', true);
6 |
7 | app.get("/Users", (req, res) => {
8 | res.send("Important users");
9 | });
10 |
11 | app.get("/users", (req, res) => {
12 | res.send("tipical users");
13 | });
14 |
15 | app.listen(3000);
16 | console.log("Server on port 3000");
--------------------------------------------------------------------------------
/static-files-named/index.js:
--------------------------------------------------------------------------------
1 | const express = require("express");
2 | const app = express();
3 |
4 | // serving static files withou conflict
5 | // diferen to:
6 | // app.use(express.static(publicPath))
7 | // app.use(express.static(userUploadPath))
8 |
9 | // public/logo.png
10 | const publicPath = path.resolve(__dirname, "public");
11 | app.use("/public", express.static(publicPath));
12 |
13 | // userUpload/logo.png
14 | const uploadPath = path.resolve(__dirname, "userUpload");
15 | app.use("/uploads", express.static(uploadPath));
16 |
17 | app.listen(3000);
18 | console.log("server on port 3000");
19 |
--------------------------------------------------------------------------------
/static_file/express-static.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const path = require('path');
3 | const http = require('http');
4 |
5 | const app = express();
6 |
7 | // using path resolve for crossplatoform path / \
8 | var publicPath = path.resolve(__dirname, 'public');
9 | app.use(express.static(publicPath));
10 |
11 | // // every request goes trough this middleware
12 | // // and continues on if no files are foudn
13 | // const publicPath = path.resolve(__dirname, 'public');
14 | // app.use(express.static(publicPath));
15 |
16 | app.use((req, res) => {
17 | res.writeHead(200, {'Content-Type': 'text/plain'});
18 | res.end("Looks like you didn't find a static file")
19 | });
20 |
21 | app.listen(3000, () => {
22 | console.log('server on port 3000');
23 | });
24 |
--------------------------------------------------------------------------------
/static_file/static-file-server/static/users.txt:
--------------------------------------------------------------------------------
1 | Ada Lovelace
2 | Isaac Asimov
3 | Isaac Delahaye
4 |
--------------------------------------------------------------------------------
/static_file/static-file-server/version1.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const path = require('path');
3 | const fs = require('fs');
4 |
5 | // middlewares step
6 | // 1. logging Request
7 | // 2. process the request file
8 | // 3. responde with 404 error
9 |
10 | const app = express();
11 |
12 | app.use((req, res, next) => {
13 | console.log('Request IP: ', req.url);
14 | console.log('Request date: ', new Date());
15 | next();
16 | });
17 |
18 | app.use((req, res, next) => {
19 | var filePath = path.join(__dirname, 'static', req.url);
20 | fs.stat(filePath, (err, fileInfo) => {
21 | if (err) {
22 | next();
23 | return;
24 | }
25 | if (fileInfo.isFile()) {// if the file exits
26 | res.sendFile(filePath);
27 | } else {
28 | next();
29 | }
30 | });
31 | });
32 |
33 | app.use((req, res) => {
34 | res.status(404);
35 | res.send('File not found');
36 | });
37 |
38 | app.listen(3000, () => console.log('server on port 3000'));
39 |
--------------------------------------------------------------------------------
/static_file/static-file-server/version2.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const path = require('path');
3 | const fs = require('fs');
4 |
5 | const morgan = require('morgan');
6 |
7 |
8 | const app = express();
9 |
10 | // middlewares step
11 | // 1. logging Request
12 | app.use(morgan('short'));
13 |
14 | // 2. process the request file
15 | const staticPath = path.join(__dirname, 'static');
16 | app.use(express.static(staticPath));
17 |
18 | // 3. responde with 404 error
19 |
20 |
21 | app.listen(3000, () => console.log('server on port 3000'));
22 |
--------------------------------------------------------------------------------
/template_engine/complex-view-rendering/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const path = require('path');
3 | const ejs = require('ejs');
4 |
5 | const app = express();
6 |
7 | app.locals.appName = 'Song Lyrics';
8 |
9 | // settings
10 | app.set('view engine', 'jade')
11 | app.set('views', path.resolve(__dirname, 'views'));
12 | app.engine('html', ejs.renderFile);
13 |
14 | // middlewares
15 | app.use('/about', (req, res) => {
16 | res.render('about', {
17 | currentUser: 'fazt'
18 | });
19 | });
20 |
21 | app.get('/contact', (req, res) => {
22 | res.render('contact.ejs');
23 | });
24 |
25 | app.use((req, res) => {
26 | res.status = 404;
27 | res.render('404.html', {
28 | urlAttemtd: req.url
29 | })
30 | });
31 |
32 | app.listen(3000, () => {
33 | console.log('server on port 3000');
34 | });
35 |
--------------------------------------------------------------------------------
/template_engine/readme.md:
--------------------------------------------------------------------------------
1 | # Views
2 | - module that does the actual rendering of Views
3 | - express is unnopionated about with view engine you use
4 |
5 | - simple-rendering/
6 | - complex-view-rendering/
7 |
8 | # render process
9 | - express builts up the context every time you call render
10 | - you decide wheter view is cached enabled
11 |
--------------------------------------------------------------------------------
/template_engine/simple-rendering/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const path = require('path');
3 |
4 | const app = express();
5 |
6 | // using the ejs template
7 | app.set('views', path.resolve(__dirname, 'views'));
8 | app.set('view engine', 'ejs');
9 |
10 | app.get('/', (req, res) => {
11 | res.render('index', {
12 | title: 'Hey everyone, this is my webpage'
13 | });
14 | });
15 |
16 | app.listen(3000, () => console.log('server on port 3000'));
17 |
--------------------------------------------------------------------------------
/template_engine/simple-rendering/views/index.ejs:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | <%= title %>
6 |
7 |
8 | <%= title %>
9 |
10 |
11 |
--------------------------------------------------------------------------------
/third-party-middlewares/morgan.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const http = require('http');
3 | const morgan = require('morgan');
4 |
5 | const app = express();
6 |
7 | app.use(morgan('short'));
8 |
9 | app.use((req, res) => {
10 | res.writeHead(200, {'Content-Type': 'text/plain'});
11 | res.end('Hello, world');
12 | });
13 |
14 | // you can use app.listen for shorthand
15 | http.createServer(app).listen(3000);
16 |
--------------------------------------------------------------------------------