Jeongmin Seo

Final commit

1 +# Logs
2 +logs
3 +*.log
4 +npm-debug.log*
5 +yarn-debug.log*
6 +yarn-error.log*
7 +lerna-debug.log*
8 +.pnpm-debug.log*
9 +app/log/*
10 +# Diagnostic reports (https://nodejs.org/api/report.html)
11 +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
12 +
13 +# Runtime data
14 +pids
15 +*.pid
16 +*.seed
17 +*.pid.lock
18 +
19 +# Directory for instrumented libs generated by jscoverage/JSCover
20 +lib-cov
21 +
22 +# Coverage directory used by tools like istanbul
23 +coverage
24 +*.lcov
25 +
26 +# nyc test coverage
27 +.nyc_output
28 +
29 +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
30 +.grunt
31 +
32 +# Bower dependency directory (https://bower.io/)
33 +bower_components
34 +
35 +# node-waf configuration
36 +.lock-wscript
37 +
38 +# Compiled binary addons (https://nodejs.org/api/addons.html)
39 +build/Release
40 +
41 +# Dependency directories
42 +**node_modules/
43 +jspm_packages/
44 +
45 +# Snowpack dependency directory (https://snowpack.dev/)
46 +web_modules/
47 +
48 +# TypeScript cache
49 +*.tsbuildinfo
50 +
51 +# Optional npm cache directory
52 +.npm
53 +
54 +# Optional eslint cache
55 +.eslintcache
56 +
57 +# Microbundle cache
58 +.rpt2_cache/
59 +.rts2_cache_cjs/
60 +.rts2_cache_es/
61 +.rts2_cache_umd/
62 +
63 +# Optional REPL history
64 +.node_repl_history
65 +
66 +# Output of 'npm pack'
67 +*.tgz
68 +
69 +# Yarn Integrity file
70 +.yarn-integrity
71 +
72 +# dotenv environment variables file
73 +.env
74 +.env.test
75 +.env.production
76 +
77 +# parcel-bundler cache (https://parceljs.org/)
78 +.cache
79 +.parcel-cache
80 +
81 +# Next.js build output
82 +.next
83 +out
84 +
85 +# Nuxt.js build / generate output
86 +.nuxt
87 +dist
88 +
89 +# Gatsby files
90 +.cache/
91 +# Comment in the public line in if your project uses Gatsby and not Next.js
92 +# https://nextjs.org/blog/next-9-1#public-directory-support
93 +# public
94 +
95 +# vuepress build output
96 +.vuepress/dist
97 +
98 +# Serverless directories
99 +.serverless/
100 +
101 +# FuseBox cache
102 +.fusebox/
103 +
104 +# DynamoDB Local files
105 +.dynamodb/
106 +
107 +# TernJS port file
108 +.tern-port
109 +
110 +# Stores VSCode versions used for testing VSCode extensions
111 +.vscode-test
112 +
113 +# yarn v2
114 +.yarn/cache
115 +.yarn/unplugged
116 +.yarn/build-state.yml
117 +.yarn/install-state.gz
118 +.pnp.*
119 +
120 +.package-lock.json
...\ No newline at end of file ...\ No newline at end of file
1 +"use strict";
2 +//모듈
3 +const express = require("express");
4 +const bodyParser = require("body-parser");
5 +//환경변수 (운영체제간 gap 없애고자)
6 +const dotenv = require("dotenv");
7 +dotenv.config();
8 +const compression = require("compression");
9 +const methodOverride = require("method-override");
10 +const path = require("path")
11 +const socketIO = require("socket.io")
12 +const moment = require("moment")
13 +const http = require("http");
14 +const app = express();
15 +const server = http.createServer(app);
16 +
17 +var cors = require("cors");
18 +const { logger } = require("./src/config/winston");
19 +//app이라는 express 객체 생성
20 +//라우팅
21 +const home = require("./src/routes/home");
22 +const port = 3000;
23 +const jwtMiddleware = require("./src/config/jwtMiddleware");
24 +const io = socketIO(server);
25 +
26 +// 앱 세팅
27 +app.set("views", "./src/views");
28 +app.set("view engine", "ejs");
29 +app.use(express.static(`${__dirname}/src/public`));
30 +app.use(express.static(path.join(__dirname, "src")))
31 +
32 +app.use(bodyParser.json());
33 +//url통해 전달되는 데이터에 한글, 공백 등의 문자 오류 해결
34 +app.use(bodyParser.urlencoded({extended: true}));
35 +
36 +app.use(compression()); // HTTP 요청을 압축 및 해제
37 +app.use(express.json());
38 +app.use(express.urlencoded({ extended: true }));
39 +app.use(methodOverride());
40 +app.use(cors());
41 +// app.use("/restaurants", require("../app/src/routes/home/restaurant.route"));
42 +// require("../app/src/routes/home/restaurant.route")(app);
43 +
44 +app.use("/", home); //미들웨어 등록해주는 method
45 +
46 +io.on("connection", (socket) => {
47 + socket.on("chatting", (data) => {
48 + const { name, msg } = data;
49 + io.emit("chatting", {
50 + name,
51 + msg,
52 + time: moment(new Date()).format("h:ss A"),
53 + });
54 + });
55 + });
56 +
57 +logger.info(`${process.env.NODE_ENV} - API Server Start At Port ${port}`);
58 +
59 +module.exports = server;
...\ No newline at end of file ...\ No newline at end of file
1 +"use strict";
2 +
3 +const server = require("../app");
4 +const PORT = process.env.PORT || 3000;
5 +
6 +server.listen(PORT, () => {
7 + console.log("서버 가동");
8 +});
...\ No newline at end of file ...\ No newline at end of file
1 +{
2 + "name": "login",
3 + "version": "1.0.0",
4 + "lockfileVersion": 1,
5 + "requires": true,
6 + "dependencies": {
7 + "@colors/colors": {
8 + "version": "1.5.0",
9 + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz",
10 + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ=="
11 + },
12 + "@dabh/diagnostics": {
13 + "version": "2.0.3",
14 + "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
15 + "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
16 + "requires": {
17 + "colorspace": "1.1.x",
18 + "enabled": "2.0.x",
19 + "kuler": "^2.0.0"
20 + }
21 + },
22 + "@types/component-emitter": {
23 + "version": "1.2.11",
24 + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
25 + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
26 + },
27 + "@types/cookie": {
28 + "version": "0.4.1",
29 + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
30 + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
31 + },
32 + "@types/cors": {
33 + "version": "2.8.12",
34 + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
35 + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
36 + },
37 + "@types/mysql": {
38 + "version": "2.15.21",
39 + "resolved": "https://registry.npmjs.org/@types/mysql/-/mysql-2.15.21.tgz",
40 + "integrity": "sha512-NPotx5CVful7yB+qZbWtXL2fA4e7aEHkihHLjklc6ID8aq7bhguHgeIoC1EmSNTAuCgI6ZXrjt2ZSaXnYX0EUg==",
41 + "requires": {
42 + "@types/node": "*"
43 + }
44 + },
45 + "@types/node": {
46 + "version": "17.0.41",
47 + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.41.tgz",
48 + "integrity": "sha512-xA6drNNeqb5YyV5fO3OAEsnXLfO7uF0whiOfPTz5AeDo8KeZFmODKnvwPymMNO8qE/an8pVY/O50tig2SQCrGw=="
49 + },
50 + "accepts": {
51 + "version": "1.3.8",
52 + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
53 + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
54 + "requires": {
55 + "mime-types": "~2.1.34",
56 + "negotiator": "0.6.3"
57 + }
58 + },
59 + "ajv": {
60 + "version": "6.12.6",
61 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
62 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
63 + "requires": {
64 + "fast-deep-equal": "^3.1.1",
65 + "fast-json-stable-stringify": "^2.0.0",
66 + "json-schema-traverse": "^0.4.1",
67 + "uri-js": "^4.2.2"
68 + }
69 + },
70 + "ansi-styles": {
71 + "version": "4.3.0",
72 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
73 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
74 + "requires": {
75 + "color-convert": "^2.0.1"
76 + }
77 + },
78 + "array-flatten": {
79 + "version": "1.1.1",
80 + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
81 + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
82 + },
83 + "asn1": {
84 + "version": "0.2.6",
85 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
86 + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
87 + "requires": {
88 + "safer-buffer": "~2.1.0"
89 + }
90 + },
91 + "assert-plus": {
92 + "version": "1.0.0",
93 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
94 + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw=="
95 + },
96 + "async": {
97 + "version": "3.2.3",
98 + "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz",
99 + "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g=="
100 + },
101 + "asynckit": {
102 + "version": "0.4.0",
103 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
104 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
105 + },
106 + "aws-sign2": {
107 + "version": "0.7.0",
108 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
109 + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA=="
110 + },
111 + "aws4": {
112 + "version": "1.11.0",
113 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
114 + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
115 + },
116 + "balanced-match": {
117 + "version": "1.0.2",
118 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
119 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
120 + },
121 + "base64id": {
122 + "version": "2.0.0",
123 + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
124 + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
125 + },
126 + "bcrypt-pbkdf": {
127 + "version": "1.0.2",
128 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
129 + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==",
130 + "requires": {
131 + "tweetnacl": "^0.14.3"
132 + }
133 + },
134 + "bignumber.js": {
135 + "version": "9.0.0",
136 + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz",
137 + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A=="
138 + },
139 + "body-parser": {
140 + "version": "1.20.0",
141 + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
142 + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
143 + "requires": {
144 + "bytes": "3.1.2",
145 + "content-type": "~1.0.4",
146 + "debug": "2.6.9",
147 + "depd": "2.0.0",
148 + "destroy": "1.2.0",
149 + "http-errors": "2.0.0",
150 + "iconv-lite": "0.4.24",
151 + "on-finished": "2.4.1",
152 + "qs": "6.10.3",
153 + "raw-body": "2.5.1",
154 + "type-is": "~1.6.18",
155 + "unpipe": "1.0.0"
156 + }
157 + },
158 + "brace-expansion": {
159 + "version": "2.0.1",
160 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
161 + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
162 + "requires": {
163 + "balanced-match": "^1.0.0"
164 + }
165 + },
166 + "buffer-equal-constant-time": {
167 + "version": "1.0.1",
168 + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
169 + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="
170 + },
171 + "bytes": {
172 + "version": "3.1.2",
173 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
174 + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
175 + },
176 + "call-bind": {
177 + "version": "1.0.2",
178 + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
179 + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
180 + "requires": {
181 + "function-bind": "^1.1.1",
182 + "get-intrinsic": "^1.0.2"
183 + }
184 + },
185 + "caseless": {
186 + "version": "0.12.0",
187 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
188 + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw=="
189 + },
190 + "chalk": {
191 + "version": "4.1.2",
192 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
193 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
194 + "requires": {
195 + "ansi-styles": "^4.1.0",
196 + "supports-color": "^7.1.0"
197 + }
198 + },
199 + "color": {
200 + "version": "3.2.1",
201 + "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
202 + "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
203 + "requires": {
204 + "color-convert": "^1.9.3",
205 + "color-string": "^1.6.0"
206 + },
207 + "dependencies": {
208 + "color-convert": {
209 + "version": "1.9.3",
210 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
211 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
212 + "requires": {
213 + "color-name": "1.1.3"
214 + }
215 + },
216 + "color-name": {
217 + "version": "1.1.3",
218 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
219 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
220 + }
221 + }
222 + },
223 + "color-convert": {
224 + "version": "2.0.1",
225 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
226 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
227 + "requires": {
228 + "color-name": "~1.1.4"
229 + }
230 + },
231 + "color-name": {
232 + "version": "1.1.4",
233 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
234 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
235 + },
236 + "color-string": {
237 + "version": "1.9.1",
238 + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
239 + "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
240 + "requires": {
241 + "color-name": "^1.0.0",
242 + "simple-swizzle": "^0.2.2"
243 + }
244 + },
245 + "colorspace": {
246 + "version": "1.1.4",
247 + "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
248 + "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
249 + "requires": {
250 + "color": "^3.1.3",
251 + "text-hex": "1.0.x"
252 + }
253 + },
254 + "combined-stream": {
255 + "version": "1.0.8",
256 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
257 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
258 + "requires": {
259 + "delayed-stream": "~1.0.0"
260 + }
261 + },
262 + "component-emitter": {
263 + "version": "1.3.0",
264 + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
265 + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
266 + },
267 + "compressible": {
268 + "version": "2.0.18",
269 + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
270 + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
271 + "requires": {
272 + "mime-db": ">= 1.43.0 < 2"
273 + }
274 + },
275 + "compression": {
276 + "version": "1.7.4",
277 + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz",
278 + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==",
279 + "requires": {
280 + "accepts": "~1.3.5",
281 + "bytes": "3.0.0",
282 + "compressible": "~2.0.16",
283 + "debug": "2.6.9",
284 + "on-headers": "~1.0.2",
285 + "safe-buffer": "5.1.2",
286 + "vary": "~1.1.2"
287 + },
288 + "dependencies": {
289 + "bytes": {
290 + "version": "3.0.0",
291 + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
292 + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw=="
293 + },
294 + "safe-buffer": {
295 + "version": "5.1.2",
296 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
297 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
298 + }
299 + }
300 + },
301 + "concat-map": {
302 + "version": "0.0.1",
303 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
304 + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
305 + },
306 + "content-disposition": {
307 + "version": "0.5.4",
308 + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
309 + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
310 + "requires": {
311 + "safe-buffer": "5.2.1"
312 + }
313 + },
314 + "content-type": {
315 + "version": "1.0.4",
316 + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
317 + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
318 + },
319 + "cookie": {
320 + "version": "0.5.0",
321 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
322 + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
323 + },
324 + "cookie-signature": {
325 + "version": "1.0.6",
326 + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
327 + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
328 + },
329 + "core-util-is": {
330 + "version": "1.0.3",
331 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
332 + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
333 + },
334 + "cors": {
335 + "version": "2.8.5",
336 + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
337 + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
338 + "requires": {
339 + "object-assign": "^4",
340 + "vary": "^1"
341 + }
342 + },
343 + "crypto": {
344 + "version": "1.0.1",
345 + "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz",
346 + "integrity": "sha512-VxBKmeNcqQdiUQUW2Tzq0t377b54N2bMtXO/qiLa+6eRRmmC4qT3D4OnTGoT/U6O9aklQ/jTwbOtRMTTY8G0Ig=="
347 + },
348 + "dashdash": {
349 + "version": "1.14.1",
350 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
351 + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==",
352 + "requires": {
353 + "assert-plus": "^1.0.0"
354 + }
355 + },
356 + "dateformat": {
357 + "version": "4.6.3",
358 + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz",
359 + "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA=="
360 + },
361 + "debug": {
362 + "version": "2.6.9",
363 + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
364 + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
365 + "requires": {
366 + "ms": "2.0.0"
367 + }
368 + },
369 + "delayed-stream": {
370 + "version": "1.0.0",
371 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
372 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
373 + },
374 + "denque": {
375 + "version": "1.5.1",
376 + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
377 + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw=="
378 + },
379 + "depd": {
380 + "version": "2.0.0",
381 + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
382 + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
383 + },
384 + "destroy": {
385 + "version": "1.2.0",
386 + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
387 + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
388 + },
389 + "dotenv": {
390 + "version": "16.0.1",
391 + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
392 + "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ=="
393 + },
394 + "ecc-jsbn": {
395 + "version": "0.1.2",
396 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
397 + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==",
398 + "requires": {
399 + "jsbn": "~0.1.0",
400 + "safer-buffer": "^2.1.0"
401 + }
402 + },
403 + "ecdsa-sig-formatter": {
404 + "version": "1.0.11",
405 + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
406 + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
407 + "requires": {
408 + "safe-buffer": "^5.0.1"
409 + }
410 + },
411 + "ee-first": {
412 + "version": "1.1.1",
413 + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
414 + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
415 + },
416 + "ejs": {
417 + "version": "3.1.8",
418 + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.8.tgz",
419 + "integrity": "sha512-/sXZeMlhS0ArkfX2Aw780gJzXSMPnKjtspYZv+f3NiKLlubezAHDU5+9xz6gd3/NhG3txQCo6xlglmTS+oTGEQ==",
420 + "requires": {
421 + "jake": "^10.8.5"
422 + }
423 + },
424 + "enabled": {
425 + "version": "2.0.0",
426 + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
427 + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ=="
428 + },
429 + "encodeurl": {
430 + "version": "1.0.2",
431 + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
432 + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
433 + },
434 + "engine.io": {
435 + "version": "6.2.0",
436 + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz",
437 + "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==",
438 + "requires": {
439 + "@types/cookie": "^0.4.1",
440 + "@types/cors": "^2.8.12",
441 + "@types/node": ">=10.0.0",
442 + "accepts": "~1.3.4",
443 + "base64id": "2.0.0",
444 + "cookie": "~0.4.1",
445 + "cors": "~2.8.5",
446 + "debug": "~4.3.1",
447 + "engine.io-parser": "~5.0.3",
448 + "ws": "~8.2.3"
449 + },
450 + "dependencies": {
451 + "cookie": {
452 + "version": "0.4.2",
453 + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
454 + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
455 + },
456 + "debug": {
457 + "version": "4.3.4",
458 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
459 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
460 + "requires": {
461 + "ms": "2.1.2"
462 + }
463 + },
464 + "ms": {
465 + "version": "2.1.2",
466 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
467 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
468 + }
469 + }
470 + },
471 + "engine.io-parser": {
472 + "version": "5.0.4",
473 + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
474 + "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
475 + },
476 + "escape-html": {
477 + "version": "1.0.3",
478 + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
479 + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
480 + },
481 + "etag": {
482 + "version": "1.8.1",
483 + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
484 + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
485 + },
486 + "express": {
487 + "version": "4.18.1",
488 + "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
489 + "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
490 + "requires": {
491 + "accepts": "~1.3.8",
492 + "array-flatten": "1.1.1",
493 + "body-parser": "1.20.0",
494 + "content-disposition": "0.5.4",
495 + "content-type": "~1.0.4",
496 + "cookie": "0.5.0",
497 + "cookie-signature": "1.0.6",
498 + "debug": "2.6.9",
499 + "depd": "2.0.0",
500 + "encodeurl": "~1.0.2",
501 + "escape-html": "~1.0.3",
502 + "etag": "~1.8.1",
503 + "finalhandler": "1.2.0",
504 + "fresh": "0.5.2",
505 + "http-errors": "2.0.0",
506 + "merge-descriptors": "1.0.1",
507 + "methods": "~1.1.2",
508 + "on-finished": "2.4.1",
509 + "parseurl": "~1.3.3",
510 + "path-to-regexp": "0.1.7",
511 + "proxy-addr": "~2.0.7",
512 + "qs": "6.10.3",
513 + "range-parser": "~1.2.1",
514 + "safe-buffer": "5.2.1",
515 + "send": "0.18.0",
516 + "serve-static": "1.15.0",
517 + "setprototypeof": "1.2.0",
518 + "statuses": "2.0.1",
519 + "type-is": "~1.6.18",
520 + "utils-merge": "1.0.1",
521 + "vary": "~1.1.2"
522 + }
523 + },
524 + "extend": {
525 + "version": "3.0.2",
526 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
527 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
528 + },
529 + "extsprintf": {
530 + "version": "1.3.0",
531 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
532 + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g=="
533 + },
534 + "fast-deep-equal": {
535 + "version": "3.1.3",
536 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
537 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
538 + },
539 + "fast-json-stable-stringify": {
540 + "version": "2.1.0",
541 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
542 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
543 + },
544 + "fecha": {
545 + "version": "4.2.3",
546 + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
547 + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw=="
548 + },
549 + "file-stream-rotator": {
550 + "version": "0.6.1",
551 + "resolved": "https://registry.npmjs.org/file-stream-rotator/-/file-stream-rotator-0.6.1.tgz",
552 + "integrity": "sha512-u+dBid4PvZw17PmDeRcNOtCP9CCK/9lRN2w+r1xIS7yOL9JFrIBKTvrYsxT4P0pGtThYTn++QS5ChHaUov3+zQ==",
553 + "requires": {
554 + "moment": "^2.29.1"
555 + }
556 + },
557 + "filelist": {
558 + "version": "1.0.4",
559 + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
560 + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==",
561 + "requires": {
562 + "minimatch": "^5.0.1"
563 + },
564 + "dependencies": {
565 + "minimatch": {
566 + "version": "5.1.0",
567 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz",
568 + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==",
569 + "requires": {
570 + "brace-expansion": "^2.0.1"
571 + }
572 + }
573 + }
574 + },
575 + "finalhandler": {
576 + "version": "1.2.0",
577 + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
578 + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
579 + "requires": {
580 + "debug": "2.6.9",
581 + "encodeurl": "~1.0.2",
582 + "escape-html": "~1.0.3",
583 + "on-finished": "2.4.1",
584 + "parseurl": "~1.3.3",
585 + "statuses": "2.0.1",
586 + "unpipe": "~1.0.0"
587 + }
588 + },
589 + "fn.name": {
590 + "version": "1.1.0",
591 + "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
592 + "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw=="
593 + },
594 + "forever-agent": {
595 + "version": "0.6.1",
596 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
597 + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="
598 + },
599 + "form-data": {
600 + "version": "2.3.3",
601 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
602 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
603 + "requires": {
604 + "asynckit": "^0.4.0",
605 + "combined-stream": "^1.0.6",
606 + "mime-types": "^2.1.12"
607 + }
608 + },
609 + "forwarded": {
610 + "version": "0.2.0",
611 + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
612 + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
613 + },
614 + "fresh": {
615 + "version": "0.5.2",
616 + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
617 + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
618 + },
619 + "function-bind": {
620 + "version": "1.1.1",
621 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
622 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
623 + },
624 + "generate-function": {
625 + "version": "2.3.1",
626 + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
627 + "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
628 + "requires": {
629 + "is-property": "^1.0.2"
630 + }
631 + },
632 + "get-intrinsic": {
633 + "version": "1.1.1",
634 + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
635 + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
636 + "requires": {
637 + "function-bind": "^1.1.1",
638 + "has": "^1.0.3",
639 + "has-symbols": "^1.0.1"
640 + }
641 + },
642 + "getpass": {
643 + "version": "0.1.7",
644 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
645 + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==",
646 + "requires": {
647 + "assert-plus": "^1.0.0"
648 + }
649 + },
650 + "har-schema": {
651 + "version": "2.0.0",
652 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
653 + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q=="
654 + },
655 + "har-validator": {
656 + "version": "5.1.5",
657 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
658 + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
659 + "requires": {
660 + "ajv": "^6.12.3",
661 + "har-schema": "^2.0.0"
662 + }
663 + },
664 + "has": {
665 + "version": "1.0.3",
666 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
667 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
668 + "requires": {
669 + "function-bind": "^1.1.1"
670 + }
671 + },
672 + "has-flag": {
673 + "version": "4.0.0",
674 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
675 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
676 + },
677 + "has-symbols": {
678 + "version": "1.0.3",
679 + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
680 + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
681 + },
682 + "http-errors": {
683 + "version": "2.0.0",
684 + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
685 + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
686 + "requires": {
687 + "depd": "2.0.0",
688 + "inherits": "2.0.4",
689 + "setprototypeof": "1.2.0",
690 + "statuses": "2.0.1",
691 + "toidentifier": "1.0.1"
692 + }
693 + },
694 + "http-signature": {
695 + "version": "1.2.0",
696 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
697 + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==",
698 + "requires": {
699 + "assert-plus": "^1.0.0",
700 + "jsprim": "^1.2.2",
701 + "sshpk": "^1.7.0"
702 + }
703 + },
704 + "iconv-lite": {
705 + "version": "0.4.24",
706 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
707 + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
708 + "requires": {
709 + "safer-buffer": ">= 2.1.2 < 3"
710 + }
711 + },
712 + "inherits": {
713 + "version": "2.0.4",
714 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
715 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
716 + },
717 + "ipaddr.js": {
718 + "version": "1.9.1",
719 + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
720 + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
721 + },
722 + "is-arrayish": {
723 + "version": "0.3.2",
724 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
725 + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ=="
726 + },
727 + "is-property": {
728 + "version": "1.0.2",
729 + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
730 + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
731 + },
732 + "is-stream": {
733 + "version": "2.0.1",
734 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
735 + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg=="
736 + },
737 + "is-typedarray": {
738 + "version": "1.0.0",
739 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
740 + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA=="
741 + },
742 + "isarray": {
743 + "version": "1.0.0",
744 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
745 + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
746 + },
747 + "isstream": {
748 + "version": "0.1.2",
749 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
750 + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g=="
751 + },
752 + "jake": {
753 + "version": "10.8.5",
754 + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz",
755 + "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==",
756 + "requires": {
757 + "async": "^3.2.3",
758 + "chalk": "^4.0.2",
759 + "filelist": "^1.0.1",
760 + "minimatch": "^3.0.4"
761 + }
762 + },
763 + "jsbn": {
764 + "version": "0.1.1",
765 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
766 + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg=="
767 + },
768 + "json-schema": {
769 + "version": "0.4.0",
770 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
771 + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
772 + },
773 + "json-schema-traverse": {
774 + "version": "0.4.1",
775 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
776 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
777 + },
778 + "json-stringify-safe": {
779 + "version": "5.0.1",
780 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
781 + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="
782 + },
783 + "jsonwebtoken": {
784 + "version": "8.5.1",
785 + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
786 + "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
787 + "requires": {
788 + "jws": "^3.2.2",
789 + "lodash.includes": "^4.3.0",
790 + "lodash.isboolean": "^3.0.3",
791 + "lodash.isinteger": "^4.0.4",
792 + "lodash.isnumber": "^3.0.3",
793 + "lodash.isplainobject": "^4.0.6",
794 + "lodash.isstring": "^4.0.1",
795 + "lodash.once": "^4.0.0",
796 + "ms": "^2.1.1",
797 + "semver": "^5.6.0"
798 + },
799 + "dependencies": {
800 + "ms": {
801 + "version": "2.1.3",
802 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
803 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
804 + }
805 + }
806 + },
807 + "jsprim": {
808 + "version": "1.4.2",
809 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
810 + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
811 + "requires": {
812 + "assert-plus": "1.0.0",
813 + "extsprintf": "1.3.0",
814 + "json-schema": "0.4.0",
815 + "verror": "1.10.0"
816 + }
817 + },
818 + "jwa": {
819 + "version": "1.4.1",
820 + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
821 + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
822 + "requires": {
823 + "buffer-equal-constant-time": "1.0.1",
824 + "ecdsa-sig-formatter": "1.0.11",
825 + "safe-buffer": "^5.0.1"
826 + }
827 + },
828 + "jws": {
829 + "version": "3.2.2",
830 + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
831 + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
832 + "requires": {
833 + "jwa": "^1.4.1",
834 + "safe-buffer": "^5.0.1"
835 + }
836 + },
837 + "kuler": {
838 + "version": "2.0.0",
839 + "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
840 + "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A=="
841 + },
842 + "lodash.includes": {
843 + "version": "4.3.0",
844 + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
845 + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w=="
846 + },
847 + "lodash.isboolean": {
848 + "version": "3.0.3",
849 + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
850 + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg=="
851 + },
852 + "lodash.isinteger": {
853 + "version": "4.0.4",
854 + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
855 + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA=="
856 + },
857 + "lodash.isnumber": {
858 + "version": "3.0.3",
859 + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
860 + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw=="
861 + },
862 + "lodash.isplainobject": {
863 + "version": "4.0.6",
864 + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
865 + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA=="
866 + },
867 + "lodash.isstring": {
868 + "version": "4.0.1",
869 + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
870 + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw=="
871 + },
872 + "lodash.once": {
873 + "version": "4.1.1",
874 + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
875 + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg=="
876 + },
877 + "logform": {
878 + "version": "2.4.0",
879 + "resolved": "https://registry.npmjs.org/logform/-/logform-2.4.0.tgz",
880 + "integrity": "sha512-CPSJw4ftjf517EhXZGGvTHHkYobo7ZCc0kvwUoOYcjfR2UVrI66RHj8MCrfAdEitdmFqbu2BYdYs8FHHZSb6iw==",
881 + "requires": {
882 + "@colors/colors": "1.5.0",
883 + "fecha": "^4.2.0",
884 + "ms": "^2.1.1",
885 + "safe-stable-stringify": "^2.3.1",
886 + "triple-beam": "^1.3.0"
887 + },
888 + "dependencies": {
889 + "ms": {
890 + "version": "2.1.3",
891 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
892 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
893 + }
894 + }
895 + },
896 + "long": {
897 + "version": "4.0.0",
898 + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
899 + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
900 + },
901 + "lru-cache": {
902 + "version": "6.0.0",
903 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
904 + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
905 + "requires": {
906 + "yallist": "^4.0.0"
907 + }
908 + },
909 + "media-typer": {
910 + "version": "0.3.0",
911 + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
912 + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
913 + },
914 + "merge-descriptors": {
915 + "version": "1.0.1",
916 + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
917 + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
918 + },
919 + "method-override": {
920 + "version": "3.0.0",
921 + "resolved": "https://registry.npmjs.org/method-override/-/method-override-3.0.0.tgz",
922 + "integrity": "sha512-IJ2NNN/mSl9w3kzWB92rcdHpz+HjkxhDJWNDBqSlas+zQdP8wBiJzITPg08M/k2uVvMow7Sk41atndNtt/PHSA==",
923 + "requires": {
924 + "debug": "3.1.0",
925 + "methods": "~1.1.2",
926 + "parseurl": "~1.3.2",
927 + "vary": "~1.1.2"
928 + },
929 + "dependencies": {
930 + "debug": {
931 + "version": "3.1.0",
932 + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
933 + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
934 + "requires": {
935 + "ms": "2.0.0"
936 + }
937 + }
938 + }
939 + },
940 + "methods": {
941 + "version": "1.1.2",
942 + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
943 + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
944 + },
945 + "mime": {
946 + "version": "1.6.0",
947 + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
948 + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
949 + },
950 + "mime-db": {
951 + "version": "1.52.0",
952 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
953 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
954 + },
955 + "mime-types": {
956 + "version": "2.1.35",
957 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
958 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
959 + "requires": {
960 + "mime-db": "1.52.0"
961 + }
962 + },
963 + "minimatch": {
964 + "version": "3.1.2",
965 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
966 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
967 + "requires": {
968 + "brace-expansion": "^1.1.7"
969 + },
970 + "dependencies": {
971 + "brace-expansion": {
972 + "version": "1.1.11",
973 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
974 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
975 + "requires": {
976 + "balanced-match": "^1.0.0",
977 + "concat-map": "0.0.1"
978 + }
979 + }
980 + }
981 + },
982 + "moment": {
983 + "version": "2.29.3",
984 + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.3.tgz",
985 + "integrity": "sha512-c6YRvhEo//6T2Jz/vVtYzqBzwvPT95JBQ+smCytzf7c50oMZRsR/a4w88aD34I+/QVSfnoAnSBFPJHItlOMJVw=="
986 + },
987 + "ms": {
988 + "version": "2.0.0",
989 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
990 + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
991 + },
992 + "mysql": {
993 + "version": "2.18.1",
994 + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz",
995 + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==",
996 + "requires": {
997 + "bignumber.js": "9.0.0",
998 + "readable-stream": "2.3.7",
999 + "safe-buffer": "5.1.2",
1000 + "sqlstring": "2.3.1"
1001 + },
1002 + "dependencies": {
1003 + "safe-buffer": {
1004 + "version": "5.1.2",
1005 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1006 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1007 + }
1008 + }
1009 + },
1010 + "mysql2": {
1011 + "version": "2.2.0",
1012 + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.0.tgz",
1013 + "integrity": "sha512-3DvnvXihGiFrq6oaMjGN+gR/oreZA5cA1bI7/yBAvReo2W2I6cHd8vfX/9mk9FQEebubxqB/4VAlIJTlnYUEEg==",
1014 + "requires": {
1015 + "@types/mysql": "^2.15.7",
1016 + "denque": "^1.4.1",
1017 + "generate-function": "^2.3.1",
1018 + "iconv-lite": "^0.6.2",
1019 + "long": "^4.0.0",
1020 + "lru-cache": "^6.0.0",
1021 + "named-placeholders": "^1.1.2",
1022 + "seq-queue": "^0.0.5",
1023 + "sqlstring": "^2.3.2"
1024 + },
1025 + "dependencies": {
1026 + "iconv-lite": {
1027 + "version": "0.6.3",
1028 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
1029 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
1030 + "requires": {
1031 + "safer-buffer": ">= 2.1.2 < 3.0.0"
1032 + }
1033 + },
1034 + "sqlstring": {
1035 + "version": "2.3.3",
1036 + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
1037 + "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
1038 + }
1039 + }
1040 + },
1041 + "named-placeholders": {
1042 + "version": "1.1.2",
1043 + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
1044 + "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
1045 + "requires": {
1046 + "lru-cache": "^4.1.3"
1047 + },
1048 + "dependencies": {
1049 + "lru-cache": {
1050 + "version": "4.1.5",
1051 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
1052 + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
1053 + "requires": {
1054 + "pseudomap": "^1.0.2",
1055 + "yallist": "^2.1.2"
1056 + }
1057 + },
1058 + "yallist": {
1059 + "version": "2.1.2",
1060 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1061 + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
1062 + }
1063 + }
1064 + },
1065 + "negotiator": {
1066 + "version": "0.6.3",
1067 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1068 + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1069 + },
1070 + "oauth-sign": {
1071 + "version": "0.9.0",
1072 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1073 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1074 + },
1075 + "object-assign": {
1076 + "version": "4.1.1",
1077 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1078 + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="
1079 + },
1080 + "object-hash": {
1081 + "version": "2.2.0",
1082 + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz",
1083 + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw=="
1084 + },
1085 + "object-inspect": {
1086 + "version": "1.12.2",
1087 + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
1088 + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
1089 + },
1090 + "on-finished": {
1091 + "version": "2.4.1",
1092 + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
1093 + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
1094 + "requires": {
1095 + "ee-first": "1.1.1"
1096 + }
1097 + },
1098 + "on-headers": {
1099 + "version": "1.0.2",
1100 + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
1101 + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA=="
1102 + },
1103 + "one-time": {
1104 + "version": "1.0.0",
1105 + "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
1106 + "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
1107 + "requires": {
1108 + "fn.name": "1.x.x"
1109 + }
1110 + },
1111 + "parseurl": {
1112 + "version": "1.3.3",
1113 + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
1114 + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
1115 + },
1116 + "path-to-regexp": {
1117 + "version": "0.1.7",
1118 + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
1119 + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
1120 + },
1121 + "performance-now": {
1122 + "version": "2.1.0",
1123 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1124 + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="
1125 + },
1126 + "process-nextick-args": {
1127 + "version": "2.0.1",
1128 + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1129 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1130 + },
1131 + "proxy-addr": {
1132 + "version": "2.0.7",
1133 + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
1134 + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
1135 + "requires": {
1136 + "forwarded": "0.2.0",
1137 + "ipaddr.js": "1.9.1"
1138 + }
1139 + },
1140 + "pseudomap": {
1141 + "version": "1.0.2",
1142 + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1143 + "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ=="
1144 + },
1145 + "psl": {
1146 + "version": "1.8.0",
1147 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1148 + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
1149 + },
1150 + "punycode": {
1151 + "version": "2.1.1",
1152 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1153 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1154 + },
1155 + "qs": {
1156 + "version": "6.10.3",
1157 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
1158 + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
1159 + "requires": {
1160 + "side-channel": "^1.0.4"
1161 + }
1162 + },
1163 + "range-parser": {
1164 + "version": "1.2.1",
1165 + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
1166 + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
1167 + },
1168 + "raw-body": {
1169 + "version": "2.5.1",
1170 + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
1171 + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
1172 + "requires": {
1173 + "bytes": "3.1.2",
1174 + "http-errors": "2.0.0",
1175 + "iconv-lite": "0.4.24",
1176 + "unpipe": "1.0.0"
1177 + }
1178 + },
1179 + "readable-stream": {
1180 + "version": "2.3.7",
1181 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1182 + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1183 + "requires": {
1184 + "core-util-is": "~1.0.0",
1185 + "inherits": "~2.0.3",
1186 + "isarray": "~1.0.0",
1187 + "process-nextick-args": "~2.0.0",
1188 + "safe-buffer": "~5.1.1",
1189 + "string_decoder": "~1.1.1",
1190 + "util-deprecate": "~1.0.1"
1191 + },
1192 + "dependencies": {
1193 + "safe-buffer": {
1194 + "version": "5.1.2",
1195 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1196 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1197 + }
1198 + }
1199 + },
1200 + "regex-email": {
1201 + "version": "1.0.2",
1202 + "resolved": "https://registry.npmjs.org/regex-email/-/regex-email-1.0.2.tgz",
1203 + "integrity": "sha1-1nKFy9FvML5e+vaEF1wVPwy8gSE="
1204 + },
1205 + "request": {
1206 + "version": "2.88.2",
1207 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1208 + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1209 + "requires": {
1210 + "aws-sign2": "~0.7.0",
1211 + "aws4": "^1.8.0",
1212 + "caseless": "~0.12.0",
1213 + "combined-stream": "~1.0.6",
1214 + "extend": "~3.0.2",
1215 + "forever-agent": "~0.6.1",
1216 + "form-data": "~2.3.2",
1217 + "har-validator": "~5.1.3",
1218 + "http-signature": "~1.2.0",
1219 + "is-typedarray": "~1.0.0",
1220 + "isstream": "~0.1.2",
1221 + "json-stringify-safe": "~5.0.1",
1222 + "mime-types": "~2.1.19",
1223 + "oauth-sign": "~0.9.0",
1224 + "performance-now": "^2.1.0",
1225 + "qs": "~6.5.2",
1226 + "safe-buffer": "^5.1.2",
1227 + "tough-cookie": "~2.5.0",
1228 + "tunnel-agent": "^0.6.0",
1229 + "uuid": "^3.3.2"
1230 + },
1231 + "dependencies": {
1232 + "qs": {
1233 + "version": "6.5.3",
1234 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
1235 + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
1236 + }
1237 + }
1238 + },
1239 + "safe-buffer": {
1240 + "version": "5.2.1",
1241 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1242 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1243 + },
1244 + "safe-stable-stringify": {
1245 + "version": "2.3.1",
1246 + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.3.1.tgz",
1247 + "integrity": "sha512-kYBSfT+troD9cDA85VDnHZ1rpHC50O0g1e6WlGHVCz/g+JS+9WKLj+XwFYyR8UbrZN8ll9HUpDAAddY58MGisg=="
1248 + },
1249 + "safer-buffer": {
1250 + "version": "2.1.2",
1251 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1252 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1253 + },
1254 + "semver": {
1255 + "version": "5.7.1",
1256 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1257 + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1258 + },
1259 + "send": {
1260 + "version": "0.18.0",
1261 + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
1262 + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
1263 + "requires": {
1264 + "debug": "2.6.9",
1265 + "depd": "2.0.0",
1266 + "destroy": "1.2.0",
1267 + "encodeurl": "~1.0.2",
1268 + "escape-html": "~1.0.3",
1269 + "etag": "~1.8.1",
1270 + "fresh": "0.5.2",
1271 + "http-errors": "2.0.0",
1272 + "mime": "1.6.0",
1273 + "ms": "2.1.3",
1274 + "on-finished": "2.4.1",
1275 + "range-parser": "~1.2.1",
1276 + "statuses": "2.0.1"
1277 + },
1278 + "dependencies": {
1279 + "ms": {
1280 + "version": "2.1.3",
1281 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
1282 + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
1283 + }
1284 + }
1285 + },
1286 + "seq-queue": {
1287 + "version": "0.0.5",
1288 + "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
1289 + "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4="
1290 + },
1291 + "serve-static": {
1292 + "version": "1.15.0",
1293 + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
1294 + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
1295 + "requires": {
1296 + "encodeurl": "~1.0.2",
1297 + "escape-html": "~1.0.3",
1298 + "parseurl": "~1.3.3",
1299 + "send": "0.18.0"
1300 + }
1301 + },
1302 + "setprototypeof": {
1303 + "version": "1.2.0",
1304 + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
1305 + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
1306 + },
1307 + "side-channel": {
1308 + "version": "1.0.4",
1309 + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
1310 + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
1311 + "requires": {
1312 + "call-bind": "^1.0.0",
1313 + "get-intrinsic": "^1.0.2",
1314 + "object-inspect": "^1.9.0"
1315 + }
1316 + },
1317 + "simple-swizzle": {
1318 + "version": "0.2.2",
1319 + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
1320 + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
1321 + "requires": {
1322 + "is-arrayish": "^0.3.1"
1323 + }
1324 + },
1325 + "socket.io": {
1326 + "version": "4.5.1",
1327 + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.1.tgz",
1328 + "integrity": "sha512-0y9pnIso5a9i+lJmsCdtmTTgJFFSvNQKDnPQRz28mGNnxbmqYg2QPtJTLFxhymFZhAIn50eHAKzJeiNaKr+yUQ==",
1329 + "requires": {
1330 + "accepts": "~1.3.4",
1331 + "base64id": "~2.0.0",
1332 + "debug": "~4.3.2",
1333 + "engine.io": "~6.2.0",
1334 + "socket.io-adapter": "~2.4.0",
1335 + "socket.io-parser": "~4.0.4"
1336 + },
1337 + "dependencies": {
1338 + "debug": {
1339 + "version": "4.3.4",
1340 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1341 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1342 + "requires": {
1343 + "ms": "2.1.2"
1344 + }
1345 + },
1346 + "ms": {
1347 + "version": "2.1.2",
1348 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1349 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1350 + }
1351 + }
1352 + },
1353 + "socket.io-adapter": {
1354 + "version": "2.4.0",
1355 + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
1356 + "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
1357 + },
1358 + "socket.io-parser": {
1359 + "version": "4.0.4",
1360 + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
1361 + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
1362 + "requires": {
1363 + "@types/component-emitter": "^1.2.10",
1364 + "component-emitter": "~1.3.0",
1365 + "debug": "~4.3.1"
1366 + },
1367 + "dependencies": {
1368 + "debug": {
1369 + "version": "4.3.4",
1370 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1371 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1372 + "requires": {
1373 + "ms": "2.1.2"
1374 + }
1375 + },
1376 + "ms": {
1377 + "version": "2.1.2",
1378 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1379 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1380 + }
1381 + }
1382 + },
1383 + "sqlstring": {
1384 + "version": "2.3.1",
1385 + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz",
1386 + "integrity": "sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A="
1387 + },
1388 + "sshpk": {
1389 + "version": "1.17.0",
1390 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
1391 + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
1392 + "requires": {
1393 + "asn1": "~0.2.3",
1394 + "assert-plus": "^1.0.0",
1395 + "bcrypt-pbkdf": "^1.0.0",
1396 + "dashdash": "^1.12.0",
1397 + "ecc-jsbn": "~0.1.1",
1398 + "getpass": "^0.1.1",
1399 + "jsbn": "~0.1.0",
1400 + "safer-buffer": "^2.0.2",
1401 + "tweetnacl": "~0.14.0"
1402 + }
1403 + },
1404 + "stack-trace": {
1405 + "version": "0.0.10",
1406 + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
1407 + "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA="
1408 + },
1409 + "statuses": {
1410 + "version": "2.0.1",
1411 + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
1412 + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
1413 + },
1414 + "string_decoder": {
1415 + "version": "1.1.1",
1416 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1417 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1418 + "requires": {
1419 + "safe-buffer": "~5.1.0"
1420 + },
1421 + "dependencies": {
1422 + "safe-buffer": {
1423 + "version": "5.1.2",
1424 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1425 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1426 + }
1427 + }
1428 + },
1429 + "supports-color": {
1430 + "version": "7.2.0",
1431 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1432 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1433 + "requires": {
1434 + "has-flag": "^4.0.0"
1435 + }
1436 + },
1437 + "text-hex": {
1438 + "version": "1.0.0",
1439 + "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
1440 + "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg=="
1441 + },
1442 + "toidentifier": {
1443 + "version": "1.0.1",
1444 + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1445 + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
1446 + },
1447 + "tough-cookie": {
1448 + "version": "2.5.0",
1449 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1450 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1451 + "requires": {
1452 + "psl": "^1.1.28",
1453 + "punycode": "^2.1.1"
1454 + }
1455 + },
1456 + "triple-beam": {
1457 + "version": "1.3.0",
1458 + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz",
1459 + "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw=="
1460 + },
1461 + "tunnel-agent": {
1462 + "version": "0.6.0",
1463 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1464 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1465 + "requires": {
1466 + "safe-buffer": "^5.0.1"
1467 + }
1468 + },
1469 + "tweetnacl": {
1470 + "version": "0.14.5",
1471 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1472 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1473 + },
1474 + "type-is": {
1475 + "version": "1.6.18",
1476 + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
1477 + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
1478 + "requires": {
1479 + "media-typer": "0.3.0",
1480 + "mime-types": "~2.1.24"
1481 + }
1482 + },
1483 + "unpipe": {
1484 + "version": "1.0.0",
1485 + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1486 + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1487 + },
1488 + "uri-js": {
1489 + "version": "4.4.1",
1490 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1491 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1492 + "requires": {
1493 + "punycode": "^2.1.0"
1494 + }
1495 + },
1496 + "util-deprecate": {
1497 + "version": "1.0.2",
1498 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1499 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1500 + },
1501 + "utils-merge": {
1502 + "version": "1.0.1",
1503 + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1504 + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1505 + },
1506 + "uuid": {
1507 + "version": "3.4.0",
1508 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1509 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
1510 + },
1511 + "vary": {
1512 + "version": "1.1.2",
1513 + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1514 + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1515 + },
1516 + "verror": {
1517 + "version": "1.10.0",
1518 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1519 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1520 + "requires": {
1521 + "assert-plus": "^1.0.0",
1522 + "core-util-is": "1.0.2",
1523 + "extsprintf": "^1.2.0"
1524 + },
1525 + "dependencies": {
1526 + "core-util-is": {
1527 + "version": "1.0.2",
1528 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
1529 + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="
1530 + }
1531 + }
1532 + },
1533 + "winston": {
1534 + "version": "3.7.2",
1535 + "resolved": "https://registry.npmjs.org/winston/-/winston-3.7.2.tgz",
1536 + "integrity": "sha512-QziIqtojHBoyzUOdQvQiar1DH0Xp9nF1A1y7NVy2DGEsz82SBDtOalS0ulTRGVT14xPX3WRWkCsdcJKqNflKng==",
1537 + "requires": {
1538 + "@dabh/diagnostics": "^2.0.2",
1539 + "async": "^3.2.3",
1540 + "is-stream": "^2.0.0",
1541 + "logform": "^2.4.0",
1542 + "one-time": "^1.0.0",
1543 + "readable-stream": "^3.4.0",
1544 + "safe-stable-stringify": "^2.3.1",
1545 + "stack-trace": "0.0.x",
1546 + "triple-beam": "^1.3.0",
1547 + "winston-transport": "^4.5.0"
1548 + },
1549 + "dependencies": {
1550 + "readable-stream": {
1551 + "version": "3.6.0",
1552 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
1553 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
1554 + "requires": {
1555 + "inherits": "^2.0.3",
1556 + "string_decoder": "^1.1.1",
1557 + "util-deprecate": "^1.0.1"
1558 + }
1559 + }
1560 + }
1561 + },
1562 + "winston-daily-rotate-file": {
1563 + "version": "4.7.1",
1564 + "resolved": "https://registry.npmjs.org/winston-daily-rotate-file/-/winston-daily-rotate-file-4.7.1.tgz",
1565 + "integrity": "sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==",
1566 + "requires": {
1567 + "file-stream-rotator": "^0.6.1",
1568 + "object-hash": "^2.0.1",
1569 + "triple-beam": "^1.3.0",
1570 + "winston-transport": "^4.4.0"
1571 + }
1572 + },
1573 + "winston-transport": {
1574 + "version": "4.5.0",
1575 + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz",
1576 + "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==",
1577 + "requires": {
1578 + "logform": "^2.3.2",
1579 + "readable-stream": "^3.6.0",
1580 + "triple-beam": "^1.3.0"
1581 + },
1582 + "dependencies": {
1583 + "readable-stream": {
1584 + "version": "3.6.0",
1585 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
1586 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
1587 + "requires": {
1588 + "inherits": "^2.0.3",
1589 + "string_decoder": "^1.1.1",
1590 + "util-deprecate": "^1.0.1"
1591 + }
1592 + }
1593 + }
1594 + },
1595 + "ws": {
1596 + "version": "8.2.3",
1597 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
1598 + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
1599 + },
1600 + "yallist": {
1601 + "version": "4.0.0",
1602 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1603 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1604 + }
1605 + }
1606 +}
1 +{
2 + "name": "login",
3 + "version": "1.0.0",
4 + "main": "app.js",
5 + "bin": {
6 + "login": "www.js"
7 + },
8 + "dependencies": {
9 + "body-parser": "^1.20.0",
10 + "compression": "^1.7.4",
11 + "cors": "^2.8.5",
12 + "crypto": "^1.0.1",
13 + "dateformat": "^4.3.1",
14 + "dotenv": "^16.0.1",
15 + "ejs": "^3.1.8",
16 + "express": "^4.18.1",
17 + "jsonwebtoken": "^8.5.1",
18 + "method-override": "^3.0.0",
19 + "moment": "^2.29.3",
20 + "mysql": "^2.18.1",
21 + "mysql2": "^2.2.0",
22 + "regex-email": "^1.0.2",
23 + "request": "^2.88.2",
24 + "socket.io": "^4.5.1",
25 + "winston": "^3.2.1",
26 + "winston-daily-rotate-file": "^4.2.1"
27 + },
28 + "devDependencies": {},
29 + "scripts": {
30 + "start": "nodemon ./bin/www.js",
31 + "test": "echo \"Error: no test specified\" && exit 1",
32 + "dev": "NODE_ENV=development node index.js",
33 + "prod": "NODE_ENV=production node index.js"
34 + },
35 + "author": "Jeongmin Seo, Jumi Yang",
36 + "license": "MIT",
37 + "keywords": [],
38 + "description": "Node.js API Server"
39 +}
1 +// const mysql = require("mysql");
2 +const { logger } = require("./winston");
3 +const mysql2 = require("mysql2/promise");
4 +
5 +// const db = mysql.createConnection({
6 +// host: process.env.DB_HOST,
7 +// user: process.env.DB_USER,
8 +// password: process.env.DB_PASSWORD,
9 +// database: process.env.DB_DATABASE, //schema
10 +// });
11 +
12 +const pool = mysql2.createPool({
13 + host: process.env.DB_HOST,
14 + user: process.env.DB_USER,
15 + password: process.env.DB_PASSWORD,
16 + database: process.env.DB_DATABASE, //schema
17 + connectionLimit: 10000,
18 + multipleStatements: true,
19 +});
20 +
21 +// db.connect();
22 +
23 +module.exports = {
24 + pool: pool,
25 +};
26 +
27 +
...\ No newline at end of file ...\ No newline at end of file
1 +const jwt = require("jsonwebtoken");
2 +const secret_config = require("./db");
3 +const jwtMiddleware = function (req, res, next) {
4 + // read the token from header or url
5 + const token = req.headers["x-access-token"] || req.query.token;
6 + // token does not exist
7 + if (!token) {
8 + return res.status(403).json({
9 + isSuccess: false,
10 + code: 403,
11 + message: "로그인이 되어 있지 않습니다.",
12 + });
13 + }
14 +
15 + try {
16 + const verifiedToken = jwt.verify(token, secret_config.jwtsecret);
17 + req.verifiedToken = verifiedToken;
18 + next();
19 + } catch {
20 + res.status(403).json({
21 + isSuccess: false,
22 + code: 403,
23 + message: "검증 실패",
24 + });
25 + }
26 +};
27 +
28 +module.exports = jwtMiddleware;
1 +const { createLogger, format, transports } = require('winston');
2 +require('winston-daily-rotate-file');
3 +const fs = require('fs');
4 +
5 +const env = process.env.NODE_ENV || 'development';
6 +const logDir = 'log';
7 +
8 +// https://lovemewithoutall.github.io/it/winston-example/
9 +// Create the log directory if it does not exist
10 +if (!fs.existsSync(logDir)) {
11 + fs.mkdirSync(logDir)
12 +}
13 +
14 +const dailyRotateFileTransport = new transports.DailyRotateFile({
15 + level: 'debug',
16 + filename: `${logDir}/%DATE%-smart-push.log`,
17 + datePattern: 'YYYY-MM-DD',
18 + zippedArchive: true,
19 + maxSize: '20m',
20 + maxFiles: '14d'
21 +});
22 +
23 +const logger = createLogger({
24 + level: env === 'development' ? 'debug' : 'info',
25 + format: format.combine(
26 + format.timestamp({
27 + format: 'YYYY-MM-DD HH:mm:ss'
28 + }),
29 + format.json()
30 + ),
31 + transports: [
32 + new transports.Console({
33 + level: 'info',
34 + format: format.combine(
35 + format.colorize(),
36 + format.printf(
37 + info => `${info.timestamp} ${info.level}: ${info.message}`
38 + )
39 + )
40 + }),
41 + dailyRotateFileTransport
42 + ]
43 +});
44 +
45 +module.exports = {
46 + logger: logger
47 +};
...\ No newline at end of file ...\ No newline at end of file
1 +'use strict';
2 +//for DB manipulate
3 +const RestaurantStorage = require("./RestaurantStorage");
4 +
5 +const {pool} = require("../config/db");
6 +const { logger } = require("../config/winston");
7 +const jwt = require("jsonwebtoken");
8 +
9 +exports.readRestaurants = async function (req,res) {
10 + const {category} = req.query;
11 +
12 + if (category) {
13 + const validCategory = ["한식", "중식", "일식", "양식", "분식", "구이", "회/초밥", "기타",];
14 +
15 + if (!validCategory.includes(category)) {
16 + return res.send({
17 + isSuccess: false,
18 + code: 400,
19 + message: "유효한 카테고리가 아닙니다.",
20 + });
21 + }
22 + }
23 +
24 + try {
25 + const connection = await pool.getConnection(async (conn) => conn);
26 + try {
27 + //mysql접속 관련 부분 정의하는 함수
28 + //es6 비구조할당
29 + const [rows] = await RestaurantStorage.selectRestaurants(connection, category);
30 +
31 + return res.send({
32 + result: rows,
33 + isSuccess: true,
34 + code: 200, // 요청 성공시 200번대 코드를 뿌려주고, 실패시 400번대 코드
35 + message: "식당 목록 요청 성공",
36 + });
37 + } catch (err) {
38 + logger.error(`readRestaurants Query error\n: ${JSON.stringify(err)}`);
39 + return false;
40 + } finally {
41 + connection.release();
42 + }
43 + } catch (err) {
44 + logger.error(`readRestaurants DB Connection error\n: ${JSON.stringify(err)}`);
45 + return false;
46 + }
47 +}
...\ No newline at end of file ...\ No newline at end of file
1 +'use strict';
2 +//for DB CRUD
3 +// const db = require("../config/db");
4 +const { pool } = require("../config/db");
5 +
6 +exports.selectRestaurants = async function (connection, category) {
7 +
8 + const selectAllRestaurantsQuery = `select title, address, category from restaurants where status='A';`;
9 + const selectCategorizedRestaurantsQuery = `select title, address, category from restaurants where status='A' and category=?;`;
10 +
11 + const Params = [category];
12 +
13 + const Query = category ? selectCategorizedRestaurantsQuery : selectAllRestaurantsQuery;
14 +
15 + const rows = await connection.query(Query, Params);
16 +
17 + return rows;
18 +
19 +}
...\ No newline at end of file ...\ No newline at end of file
1 +'use strict';
2 +//for DB manipulate
3 +const UserStorage = require("./UserStorage");
4 +const {pool} = require("../config/db");
5 +const { logger } = require("../config/winston");
6 +const jwt = require("jsonwebtoken");
7 +
8 +class User {
9 + constructor(body) {
10 + this.body = body;
11 + }
12 +
13 + async login() {
14 + const client = this.body;
15 +
16 + try {
17 + const connection = await pool.getConnection(async (conn) => conn);
18 + try {
19 + const { id, password } = await UserStorage.getUserInfo(
20 + connection,
21 + client.id
22 + );
23 + if (id) {
24 + if (id === client.id && password === client.password) {
25 + return { success: true };
26 + }
27 + return { success: false, msg: "비밀번호가 틀렸습니다." };
28 + }
29 + return { success: false, msg: "존재하지 않는 아이디입니다." };
30 + } catch (err) {
31 + return { success: false, msg: err };
32 + } finally {
33 + connection.release();
34 + }
35 + } catch (err) {
36 + logger.error(`login DB Connection error\n: ${JSON.stringify(err)}`);
37 + return false;
38 + }
39 + }
40 +
41 + async register() {
42 + const client = this.body;
43 + try {
44 + const connection = await pool.getConnection(async (conn) => conn);
45 + // console.log(client);
46 + try {
47 + const response = await UserStorage.save(connection, client);
48 + // console.log("테스트2 : ", response);
49 + return response;
50 + } catch (err) {
51 + console.log(err);
52 + return {success: false, msg : err};
53 + } finally {
54 + connection.release();
55 + }
56 + } catch (err) {
57 + logger.error(`usersaving DB Connection error\n: ${JSON.stringify(err)}`);
58 + return false;
59 + }
60 + }
61 +}
62 +module.exports = User;
1 +'use strict';
2 +
3 +const { pool } = require("../config/db");
4 +
5 + //for DB CRUD
6 +
7 +
8 +class UserStorage {
9 + constructor(body) {
10 + this.body = body;
11 + // this.connection = await pool.getConnection(async (conn) => conn);
12 + }
13 +
14 + // static getUsers(isAll, ...fields) {}
15 + static async getUserInfo(connection, id) {
16 + const query = `SELECT * FROM users WHERE id = '${id}';`;
17 + console.log(query);
18 + let [row] = await connection.query(query);
19 + console.log(row[0]);
20 + return row[0];
21 + // , [id], (err, data) => {
22 + // console.log("44444444");
23 + // if (err) reject(`${err}`);
24 + // resolve(data[0]);
25 + // pool.releaseConnection(conn);
26 + // });
27 + }
28 +
29 + static async save (connection, userInfo) {
30 + const query = "INSERT INTO users(id, name, password) VALUES(?, ?, ?);";
31 + try {
32 + const [rows] = await connection.query({
33 + sql: query,
34 + timeout: 30000,
35 + values: [userInfo.id, userInfo.name, userInfo.password]
36 + });
37 + // console.log(fields);
38 + if (rows.affectedRows) {
39 + return {success: true};
40 + } else {
41 + return {success: false};
42 + }
43 + } catch (error) {
44 + console.log(error);
45 + }
46 + }
47 +
48 +}
49 +// static getUserInfo(id) {
50 +// return new Promise((resolve, reject) => {
51 +// const query = "SELECT * FROM users WHERE id = ?;";
52 +// pool.query(query, [id], (err, data) => {
53 +// if (err) reject(`${err}`);
54 +// // console.log(data[0]);
55 +// resolve(data[0]);
56 +// });
57 +// });
58 +// }
59 +
60 +module.exports = UserStorage;
...\ No newline at end of file ...\ No newline at end of file
1 +* {
2 + margin: 0;
3 + padding: 0;
4 +}
5 +
6 +html, body {
7 + height : 100%;
8 +}
9 +
10 +.wrapper {
11 + height : 100%;
12 + width: 100%;
13 + display: flex;
14 + flex-direction: column;
15 + overflow: hidden;
16 +}
17 +
18 +.user-container {
19 + background: rebeccapurple;
20 + flex: 1;
21 + display: flex;
22 + justify-content: flex-start;
23 + align-items: center;
24 + padding: 0.5rem;
25 +}
26 +
27 +.user-container .nickname {
28 + font-size : 14px;
29 + margin-right : 1.5rem;
30 + margin-left : 1rem;
31 + color:#fff;
32 +}
33 +
34 +.user-container input {
35 + border-radius: 3px;
36 + border: none;
37 + height: 80%;
38 +}
39 +
40 +.display-container {
41 + background: #D2D2FF;
42 + flex : 12;
43 + overflow-y:scroll;
44 +}
45 +
46 +.input-container {
47 + flex:1;
48 + display:flex;
49 + justify-content: stretch;
50 + align-items: stretch;
51 +}
52 +
53 +.input-container span {
54 + display: flex;
55 + justify-content: flex-start;
56 + align-items:center;
57 + padding: 0.3rem;
58 + width: 100%;
59 +}
60 +
61 +.chatting-input {
62 + font-size:12px;
63 + height:100%;
64 + flex:8;
65 + border:none;
66 +}
67 +
68 +.send-button {
69 + flex:1;
70 + background: rebeccapurple;
71 + color:#fff;
72 + border:none;
73 + height:100%;
74 + border-radius:3px;
75 +}
76 +
77 +.chatting-list li {
78 + width:50%;
79 + padding:0.3rem;
80 + display:flex;
81 + justify-content: flex-start;
82 + align-items:flex-end;
83 + margin-top:0.5rem;
84 +}
85 +
86 +.profile {
87 + display: flex;
88 + flex-direction: column;
89 + align-items: center;
90 + justify-content: center;
91 + flex: 1;
92 +}
93 +
94 +.profile .user {
95 + font-size: 10px;
96 + margin-bottom: 0.3rem;
97 +}
98 +
99 +.profile .image {
100 + border-radius: 50%;
101 + object-fit: cover;
102 + width: 50px;
103 + height: 50px;
104 +}
105 +
106 +.message {
107 + border-radius: 5px;
108 + padding: 0.5rem;
109 + font-size: 12px;
110 + margin: 0 5px;
111 + flex: 10;
112 +}
113 +
114 +.time {
115 + font-size: 10px;
116 + margin: 0 5px;
117 +}
118 +
119 +.sent {
120 + flex-direction: row-reverse;
121 + float: right;
122 +}
123 +
124 +.sent .message {
125 + background: #9986EE;
126 + color: #fff;
127 +}
128 +
129 +.received .message {
130 + background: #fff;
131 +}
...\ No newline at end of file ...\ No newline at end of file
1 +@font-face {
2 + font-family: 'Noto Sans KR', sans-serif;
3 + src: url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@700&display=swap');
4 + font-weight: normal;
5 + font-style: normal;
6 + }
7 +
8 + * {
9 + padding: 0;
10 + margin: 0;
11 + box-sizing: border-box;
12 + }
13 +
14 + html {
15 + font-size: 10px;
16 + font-family: 'Noto Sans KR', sans-serif;
17 + }
18 +
19 + nav {
20 + /* background-color: #e69a06; */
21 + }
22 +
23 + .nav-container {
24 + padding: 1rem 0;
25 + display: flex;
26 + flex-direction: row;
27 + justify-content: space-between;
28 + align-items: center;
29 + }
30 +
31 + .nav-title {
32 + font-size: 2.5rem;
33 + color :rebeccapurple;
34 + }
35 +
36 + .nav-contact {
37 + font-size: 1.5rem;
38 + border: 0;
39 + background: none;
40 + cursor: pointer;
41 + font-family: inherit;
42 + color :lightslategray;
43 + margin-right: 0px;
44 + }
45 +
46 + .category-title {
47 + font-size: 2rem;
48 + padding : 0 30%;
49 + }
50 +
51 + .category-list {
52 + padding: 15px 1rem;
53 + }
54 +
55 + .category-item {
56 + width: 24%;
57 + height: 5rem;
58 + background: none;
59 + border: none;
60 + font-family: inherit;
61 + font-size: 1.6rem;
62 + }
63 +
64 + .category-item:hover {
65 + color: #e69a06;
66 + cursor: pointer;
67 + }
68 +
69 + .inner {
70 + padding: 0 1.5rem;
71 + }
72 +
73 + @media all and (min-width: 1024px) {
74 + .inner {
75 + max-width: 1024px;
76 + margin: 0 auto;
77 + }
78 + }
79 +
80 + /* 카카오맵 CSS */
81 +
82 + body {
83 + height: 100vh;
84 + }
85 +
86 + nav {
87 + height: 59px;
88 + }
89 +
90 + main {
91 + padding-top: 1.5rem;
92 + height: calc(100% - 59px);
93 + display: flex;
94 + flex-direction: column;
95 + }
96 +
97 + #map {
98 + flex-grow: 1;
99 + width: 100%;
100 + height: 100%;
101 + }
...\ No newline at end of file ...\ No newline at end of file
1 +@import url(https://fonts.googleapis.com/css?family=Roboto:300);
2 +
3 +.login-page {
4 + width: 360px;
5 + padding: 12% 0 0;
6 + margin: auto;
7 +}
8 +.form {
9 + position: relative;
10 + z-index: 1;
11 + background: #FFFFFF;
12 + max-width: 360px;
13 + margin: 0 auto 100px;
14 + padding: 45px;
15 + text-align: center;
16 + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
17 +}
18 +.form input {
19 + font-family: "Roboto", sans-serif;
20 + outline: 0;
21 + background: #f2f2f2;
22 + width: 100%;
23 + border: 0;
24 + margin: 0 0 15px;
25 + padding: 15px;
26 + box-sizing: border-box;
27 + font-size: 14px;
28 +}
29 +.form #button {
30 + font-family: "Roboto", sans-serif;
31 + text-transform: uppercase;
32 + outline: 0;
33 + background: rebeccapurple;
34 + width: 89%;
35 + border: 0;
36 + margin: 0 auto;
37 + padding: 15px;
38 + color: #FFFFFF;
39 + font-size: 14px;
40 + -webkit-transition: all 0.3 ease;
41 + transition: all 0.3 ease;
42 + cursor: pointer;
43 +}
44 +.form #button:hover,.form #button:active,.form #button:focus {
45 + background: rebeccapurple;
46 +}
47 +.form .message {
48 + margin: 15px 0 0;
49 + color: #b3b3b3;
50 + font-size: 12px;
51 +}
52 +.form .message a {
53 + color: rebeccapurple;
54 + text-decoration: none;
55 +}
56 +.form .register-form {
57 + display: none;
58 +}
59 +.container {
60 + position: relative;
61 + z-index: 1;
62 + max-width: 300px;
63 + margin: 0 auto;
64 +}
65 +.container:before, .container:after {
66 + content: "";
67 + display: block;
68 + clear: both;
69 +}
70 +.container .info {
71 + margin: 50px auto;
72 + text-align: center;
73 +}
74 +.container .info h1 {
75 + margin: 0 0 15px;
76 + padding: 0;
77 + font-size: 36px;
78 + font-weight: 300;
79 + color: #1a1a1a;
80 +}
81 +.container .info span {
82 + color: #4d4d4d;
83 + font-size: 12px;
84 +}
85 +.container .info span a {
86 + color: #000000;
87 + text-decoration: none;
88 +}
89 +.container .info span .fa {
90 + color: #EF3B3A;
91 +}
92 +
93 +/* #id::placeholder #password::placeholder {
94 + color: black;
95 + font-style: italic;
96 + font-weight: bold;
97 +} */
98 +
99 +body {
100 + background: rebeccapurple; /* fallback for old browsers */
101 + /* background: rebeccapurple; */
102 + background: linear-gradient(90deg, rebeccapurple 0%, rebeccapurple 0%);
103 + font-family: "Roboto", sans-serif;
104 + -webkit-font-smoothing: antialiased;
105 + -moz-osx-font-smoothing: grayscale;
106 +}
107 +
108 +/* Copyright (c) 2022 by Aigars Silkalns (https://codepen.io/colorlib/pen/rxddKy) */
...\ No newline at end of file ...\ No newline at end of file
1 +/*인포윈도우 설정*/
2 +.infowindow {
3 + width : 25rem;
4 + border : 1px solid black;
5 + border-radius: 5px;
6 + background-color : white;
7 +}
8 +
9 +.infowindow-title {
10 + font-size: 15px;
11 + color: rebeccapurple;
12 + font-weight: 600;
13 +}
14 +
15 +.infowindow-address {
16 + font-size: 8px;
17 +}
18 +
19 +.infowindow-btn {
20 + font-size: 8px;
21 +}
...\ No newline at end of file ...\ No newline at end of file
1 +@import url(https://fonts.googleapis.com/css?family=Roboto:300);
2 +
3 +.login-page {
4 + width: 360px;
5 + padding: 8% 0 0;
6 + margin: auto;
7 +}
8 +.form {
9 + position: relative;
10 + z-index: 1;
11 + background: #FFFFFF;
12 + max-width: 360px;
13 + margin: 0 auto 100px;
14 + padding: 45px;
15 + text-align: center;
16 + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.2), 0 5px 5px 0 rgba(0, 0, 0, 0.24);
17 +}
18 +.form input {
19 + font-family: "Roboto", sans-serif;
20 + outline: 0;
21 + background: #f2f2f2;
22 + width: 100%;
23 + border: 0;
24 + margin: 0 0 15px;
25 + padding: 15px;
26 + box-sizing: border-box;
27 + font-size: 14px;
28 +}
29 +.form #button {
30 + font-family: "Roboto", sans-serif;
31 + text-transform: uppercase;
32 + outline: 0;
33 + background: rebeccapurple;
34 + width: 89%;
35 + border: 0;
36 + margin: 0 auto;
37 + padding: 15px;
38 + color: #FFFFFF;
39 + font-size: 14px;
40 + -webkit-transition: all 0.3 ease;
41 + transition: all 0.3 ease;
42 + cursor: pointer;
43 +}
44 +.form #button:hover,.form #button:active,.form #button:focus {
45 + background: rebeccapurple;
46 +}
47 +.form .message {
48 + margin: 15px 0 0;
49 + color: #b3b3b3;
50 + font-size: 12px;
51 +}
52 +.form .message a {
53 + color: rebeccapurple;
54 + text-decoration: none;
55 +}
56 +.form .register-form {
57 + display: none;
58 +}
59 +.container {
60 + position: relative;
61 + z-index: 1;
62 + max-width: 300px;
63 + margin: 0 auto;
64 +}
65 +.container:before, .container:after {
66 + content: "";
67 + display: block;
68 + clear: both;
69 +}
70 +.container .info {
71 + margin: 50px auto;
72 + text-align: center;
73 +}
74 +.container .info h1 {
75 + margin: 0 0 15px;
76 + padding: 0;
77 + font-size: 36px;
78 + font-weight: 300;
79 + color: #1a1a1a;
80 +}
81 +.container .info span {
82 + color: #4d4d4d;
83 + font-size: 12px;
84 +}
85 +.container .info span a {
86 + color: #000000;
87 + text-decoration: none;
88 +}
89 +.container .info span .fa {
90 + color: #EF3B3A;
91 +}
92 +
93 +/* #id::placeholder #password::placeholder {
94 + color: black;
95 + font-style: italic;
96 + font-weight: bold;
97 +} */
98 +
99 +body {
100 + background: rebeccapurple; /* fallback for old browsers */
101 + /* background: rebeccapurple; */
102 + background: linear-gradient(90deg, rebeccapurple 0%, rebeccapurple 0%);
103 + font-family: "Roboto", sans-serif;
104 + -webkit-font-smoothing: antialiased;
105 + -moz-osx-font-smoothing: grayscale;
106 +}
107 +
108 +/* Copyright (c) 2022 by Aigars Silkalns (https://codepen.io/colorlib/pen/rxddKy) */
...\ No newline at end of file ...\ No newline at end of file
1 +/*********************************************************************************
2 + * 1. 지도 생성 및 확대 축소 컨트롤러
3 + */
4 +
5 + var container = document.getElementById('map'); //지도를 담을 영역의 DOM 레퍼런스
6 + var options = { //지도를 생성할 때 필요한 기본 옵션
7 + center: new kakao.maps.LatLng(37.248, 127.08), //지도의 중심좌표.
8 + level: 4 //지도의 레벨(확대, 축소 정도)
9 + };
10 +
11 + var map = new kakao.maps.Map(container, options); //지도 생성 및 객체 리턴
12 +
13 + // 확대 축소 컨트롤러
14 + var zoomControl = new kakao.maps.ZoomControl();
15 + map.addControl(zoomControl, kakao.maps.ControlPosition.RIGHT);
16 +
17 + /******************************************************************************
18 + * 2. 데이터 준비하기(제목, 주소, 카테고리)
19 + */
20 +
21 +// const dataSet = [
22 +// {
23 +// title: "희락돈까스",
24 +// address: "서울 영등포구 양산로 210",
25 +// category: "양식",
26 +// },
27 +// {
28 +// title: "즉석우동짜장",
29 +// address: "서울 영등포구 대방천로 260",
30 +// category: "한식",
31 +// },
32 +// {
33 +// title: "아카사카",
34 +// address: "서울 서초구 서초대로74길 23",
35 +// category: "일식",
36 +// }
37 +// ];
38 +
39 + async function getDataSet(category) {
40 + let qs = category;
41 + if(!qs) {
42 + qs = "";
43 + }
44 +
45 + const dataSet = await axios({
46 + method: "get", // http method
47 + url: `http://localhost:3000/restaurants?category=${qs}`,
48 + headers: {},
49 + data: {},
50 + });
51 + // console.log(dataSet);
52 +
53 + return dataSet.data.result;
54 +}
55 +
56 +// }
57 +
58 + getDataSet();
59 +
60 + /******************************************************************************
61 + * 3. 여러개 마커찍기
62 + */
63 +
64 + // 주소-좌표 변환 객체를 생성합니다
65 + var geocoder = new kakao.maps.services.Geocoder();
66 +
67 + function getCoordsByAddress(address) {
68 + return new Promise((resolve, reject) => {
69 + // 주소로 좌표를 검색합니다
70 + geocoder.addressSearch(address, function (result, status) {
71 + // 정상적으로 검색이 완료됐으면
72 + if (status === kakao.maps.services.Status.OK) {
73 + var coords = new kakao.maps.LatLng(result[0].y, result[0].x);
74 + return resolve(coords);
75 + }
76 + reject(new Error("getCoordsByAddress Error: not valid Address"));
77 + });
78 + });
79 + }
80 +
81 +// setMap(dataSet);
82 +
83 + /*
84 + *************************************************************
85 + 4. 마커에 인포윈도우 붙이기
86 + */
87 +
88 + function getContent(data) {
89 + // 인포윈도우 가공하기
90 + return `
91 + <div class="infowindow">
92 + <div class="infowindow-body">
93 + <h5 class="infowindow-title">${data.title}</h5>
94 + <p class="infowindow-address">${data.address}</p>
95 + <a href='/chat' class="infowindow-btn" target="_blank">채팅방이동</a>
96 + </div>
97 + </div>
98 + `;
99 + }
100 +
101 + async function setMap(dataSet) {
102 + for (var i = 0; i < dataSet.length; i++) {
103 + // 마커를 생성합니다
104 + let coords = await getCoordsByAddress(dataSet[i].address);
105 + var marker = new kakao.maps.Marker({
106 + map: map, // 마커를 표시할 지도
107 + position: coords,
108 + });
109 +
110 + markerArray.push(marker);
111 +
112 + // 마커에 표시할 인포윈도우를 생성합니다
113 + var infowindow = new kakao.maps.InfoWindow({
114 + content: getContent(dataSet[i]),// 인포윈도우에 표시할 내용
115 + });
116 +
117 + infowindowArray.push(infowindow);
118 +
119 + // 마커에 mouseover 이벤트와 mouseout 이벤트를 등록합니다
120 + // 이벤트 리스너로는 클로저를 만들어 등록합니다
121 + // for문에서 클로저를 만들어 주지 않으면 마지막 마커에만 이벤트가 등록됩니다
122 + kakao.maps.event.addListener(marker, 'click', makeOverListener(map, marker, infowindow, coords));
123 + kakao.maps.event.addListener(map, 'click', makeOutListener(infowindow));
124 + }
125 + }
126 +
127 + // 인포윈도우를 표시하는 클로저를 만드는 함수입니다
128 + function makeOverListener(map, marker, infowindow, coords) {
129 + return function() {
130 + // 1. 클릭시 다른 인포윈도우 닫기
131 + closeInfoWindow();
132 + infowindow.open(map, marker);
133 + // 2. 클릭한 곳으로 지도 중심 옮기기
134 + map.panTo(coords);
135 + };
136 + }
137 +
138 + let infowindowArray = [];
139 + function closeInfoWindow() {
140 + for (let infowindow of infowindowArray) {
141 + infowindow.close();
142 + }
143 + }
144 +
145 + // 인포윈도우를 닫는 클로저를 만드는 함수입니다
146 + function makeOutListener(infowindow) {
147 + return function() {
148 + infowindow.close();
149 + };
150 + }
151 +
152 + /*
153 + **********************************************
154 + 5. 카테고리 분류
155 + */
156 +
157 + // 카테고리
158 + const categoryMap = {
159 + korea: "한식",
160 + china: "중식",
161 + japan: "일식",
162 + america: "양식",
163 + wheat: "분식",
164 + meat: "구이",
165 + sushi: "회/초밥",
166 + etc: "기타",
167 + };
168 +
169 + const categoryList = document.querySelector(".category-list");
170 + categoryList.addEventListener("click", categoryHandler);
171 +
172 + async function categoryHandler(event) {
173 + const categoryId = event.target.id;
174 + const category = categoryMap[categoryId];
175 +
176 +
177 + try {
178 + // 데이터 분류
179 + let categorizedDataSet = await getDataSet(category);
180 +
181 + // 기존 마커 삭제
182 + closeMarker();
183 +
184 + // 기존 인포윈도우 닫기
185 + closeInfoWindow();
186 +
187 + setMap(categorizedDataSet);
188 +
189 + } catch (error) {
190 + console.error(error);
191 + }
192 + }
193 +
194 + let markerArray = [];
195 + function closeMarker() {
196 + for (marker of markerArray) {
197 + marker.setMap(null);
198 + }
199 + }
200 +
201 + async function setting() {
202 + try {
203 + const dataSet = await getDataSet();
204 + setMap(dataSet);
205 + } catch (error) {
206 + console.error(error);
207 + }
208 + }
209 +
210 + setting();
...\ No newline at end of file ...\ No newline at end of file
1 +"use strict";
2 +
3 +const socket = io.connect("http://localhost:3000/", {
4 + transports: ["websocket"],
5 +});
6 +const nickname = document.querySelector("#nickname")
7 +const chatlist = document.querySelector(".chatting-list")
8 +const chatInput = document.querySelector(".chatting-input")
9 +const sendButton = document.querySelector(".send-button")
10 +const displayContainer = document.querySelector(".display-container")
11 +
12 +chatInput.addEventListener("keypress", (event)=> {
13 + if(event.keyCode === 13) {
14 + send()
15 + }
16 +})
17 +
18 +function send() {
19 + const param = {
20 + name: nickname.value,
21 + msg: chatInput.value
22 + }
23 + socket.emit("chatting", param)
24 +}
25 +
26 +sendButton.addEventListener("click", send)
27 +
28 +socket.on("chatting", (data)=>{
29 + console.log(data)
30 + const {name, msg, time} = data;
31 + const item = new LiModel(name, msg, time);
32 + item.makeLi()
33 + displayContainer.scrollTo(0, displayContainer.scrollHeight)
34 +})
35 +
36 +//console.log(socket);
37 +
38 +function LiModel(name, msg, time) {
39 + this.name = name;
40 + this.msg = msg;
41 + this.time = time;
42 +
43 + this.makeLi = ()=>{
44 + const li = document.createElement("li");
45 + li.classList.add(nickname.value === this.name ? "sent":"received")
46 + const dom = `<span class="profile">
47 + <span class="user">${this.name}</span>
48 + <img class="image" src="https://placeimg.com/50/50/any" alt="any">
49 + </span>
50 + <span class="message">${this.msg}</span>
51 + <span class="time">${this.time}</span>`;
52 +
53 + li.innerHTML = dom;
54 + chatlist.appendChild(li)
55 + }
56 +}
...\ No newline at end of file ...\ No newline at end of file
1 +'use strict';
2 +
3 +const id = document.querySelector("#id"),
4 + password = document.querySelector("#password"),
5 + loginBtn = document.querySelector("#button");
6 +
7 +loginBtn.addEventListener("click", login);
8 +
9 +function login() {
10 + const req = {
11 + id : id.value,
12 + password : password.value,
13 + };
14 +
15 + // console.log("login value : ", id.value);
16 + fetch("/login", {
17 + method: "POST",
18 + headers: {
19 + "Content-Type": "application/json"
20 + },
21 + body: JSON.stringify(req),
22 + })
23 + .then((res) => res.json())
24 + .then((res) => {
25 + if (res.success) {
26 + //성공하면 이동
27 + location.href = "/";
28 + } else {
29 + alert(res.msg);
30 + }
31 + })
32 + .catch((err) => {
33 + console.error("로그인 중 에러 발생");
34 + });
35 +}
...\ No newline at end of file ...\ No newline at end of file
1 +'use strict';
2 +
3 +const id = document.querySelector("#id"),
4 + name = document.querySelector("#name"),
5 + password = document.querySelector("#password"),
6 + confirmPassword = document.querySelector("#confirm-password"),
7 + registerBtn = document.querySelector("#button");
8 +
9 +registerBtn.addEventListener("click", register);
10 +
11 +async function register() {
12 + if(!id.value) {
13 + return alert("아이디를 입력해주세요.")
14 + }
15 + if(!name.value) {
16 + return alert("이름을 입력해주세요.")
17 + }
18 + if(!password.value) {
19 + return alert("비밀번호를 입력해주세요.")
20 + }
21 + if(!confirmPassword.value) {
22 + return alert("비밀번호를 확인해주세요.")
23 + }
24 + if (password.value !== confirmPassword.value) {
25 + return alert("비밀번호가 일치하지 않습니다.")
26 + }
27 +
28 + const req = {
29 + id: id.value,
30 + name: name.value,
31 + password: password.value,
32 + };
33 +
34 + fetch("/register", {
35 + method: "POST",
36 + headers: {
37 + "Content-Type": "application/json",
38 + },
39 + body: JSON.stringify(req),
40 + })
41 + .then((res) => res.json())
42 + .then((res) => {
43 + if (res.success) {
44 + location.href = "/login";
45 + } else {
46 + if (res.err) return alert(res.err);
47 + alert(res.msg);
48 + }
49 + })
50 + .catch((err) => {
51 + console.error("회원가입 중 에러 발생");
52 + });
53 +
54 + // try {
55 + // const response = await fetch("/register", {
56 + // method: "POST",
57 + // headers: {
58 + // "Content-Type": "application/json"
59 + // },
60 + // body: JSON.stringify(req),
61 + // });
62 + // console.log("테스트 : ", response);
63 + // } catch(e) {
64 + // console.log(e);
65 + // }
66 +
67 +}
...\ No newline at end of file ...\ No newline at end of file
1 +"use strict";
2 +
3 +const User = require("../../models/User");
4 +// const Restaurant = require("../../models/Restaurant");
5 +
6 +const output = {
7 + hello: (req, res) => {
8 + res.render("home/index");
9 + },
10 +
11 + login: (req, res) => {
12 + res.render("home/login");
13 + },
14 +
15 + register: (req, res) => {
16 + res.render("home/register");
17 + },
18 +
19 + chat: (req, res) => {
20 + res.render("home/chat");
21 + },
22 +
23 + // restaurants: (req, res) => {
24 + // res.render("home/restaurants");
25 + // }
26 +};
27 +
28 +const process = {
29 + login: async (req, res) => {
30 + const user = new User(req.body);
31 + const response = await user.login();
32 + return res.json(response);
33 + },
34 +
35 + register: async (req, res) => {
36 + const user = new User(req.body);
37 + const response = await user.register();
38 + // console.log("req.body", req.body);
39 + // console.log(res.json(response));
40 + // console.log(res.json(response).statusCode); => 이거도 잘 찍혔음.
41 + return res.json(response);
42 + },
43 +
44 + // restaurants: async (req, res) => {
45 + // const restaurant = new Restaurant(req.body);
46 + // const response = await restaurant.restaurants();
47 + // return res.json(response);
48 + // },
49 +};
50 +
51 +module.exports = {
52 + output,
53 + process,
54 +};
...\ No newline at end of file ...\ No newline at end of file
1 +"use strict";
2 +
3 +const express = require("express");
4 +const router = express.Router();
5 +const jwtMiddleware = require("../../config/jwtMiddleware");
6 +// const Restaurant = require("../../models/Restaurant");
7 +
8 +const ctrl = require("./home.ctrl");
9 +const index = require("../../models/Restaurant");
10 +
11 +router.get("/", ctrl.output.hello);
12 +router.get("/login", ctrl.output.login);
13 +router.get("/register", ctrl.output.register);
14 +router.get("/restaurants", index.readRestaurants);
15 +router.get("/chat", ctrl.output.chat);
16 +// router.get("/restaurants", Restaurant.restaurants);
17 +// router.get("/restaurants", ctrl.output.restaurants);
18 +
19 +router.post("/login", ctrl.process.login);
20 +router.post("/register", ctrl.process.register);
21 +
22 +module.exports = router;
...\ No newline at end of file ...\ No newline at end of file
1 +<!DOCTYPE html>
2 +<html lang="en">
3 + <head>
4 + <meta charset="UTF-8" />
5 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 + <title>채팅방</title>
8 + <link rel="stylesheet" href="/css/home/chat.css" />
9 + </head>
10 + <body>
11 + <div class="wrapper">
12 + <div class="user-container">
13 + <lable class="nickname" for="nickname">닉네임설정</lable>
14 + <input type="text" id="nickname" />
15 + </div>
16 + <div class="display-container">
17 + <ul class="chatting-list"></ul>
18 + </div>
19 + <div class="input-container">
20 + <span>
21 + <input type="text" class="chatting-input" />
22 + <button class="send-button">전송</button>
23 + </span>
24 + </div>
25 + </div>
26 + <script
27 + src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.5.1/socket.io.js"
28 + integrity="sha512-9mpsATI0KClwt+xVZfbcf2lJ8IFBAwsubJ6mI3rtULwyM3fBmQFzj0It4tGqxLOGQwGfJdk/G+fANnxfq9/cew=="
29 + crossorigin="anonymous"
30 + referrerpolicy="no-referrer"
31 + ></script>
32 + <script src="/js/home/chat.js"></script>
33 + </body>
34 +</html>
1 +<!DOCTYPE html>
2 +<html lang="en">
3 + <head>
4 + <meta charset="UTF-8" />
5 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 + <title>맛집지도</title>
8 + <meta name="author" content="양주미" />
9 + <meta name="description" content="맛집지도 서비스" />
10 + <meta name="keywords" content="맛집지도, 맛집추천, 실시간채팅" />
11 + <link rel="stylesheet" href="/css/home/index.css" />
12 + <link rel="stylesheet" href="/css/home/map.css" />
13 + </head>
14 + <body>
15 + <nav>
16 + <div class="inner">
17 + <div class="nav-container">
18 + <h1 class="nav-title">맛집지도</h1>
19 + <button class="nav-contact">Contact : balljm@naver.com</button>
20 + </div>
21 + </div>
22 + </nav>
23 +
24 + <main>
25 + <section id="category">
26 + <div class="inner">
27 + <div class="category-container">
28 + <h2 class="category-title">💜맛집지도 카테고리를 선택해보세요💜</h2>
29 + <div class="category-list">
30 + <button class="category-item" id="korea">한식🍚</button>
31 + <button class="category-item" id="china">중식🍜</button>
32 + <button class="category-item" id="japan">일식🍙</button>
33 + <button class="category-item" id="america">양식🍝</button>
34 + <button class="category-item" id="wheat">분식🍭</button>
35 + <button class="category-item" id="meat">구이🍖</button>
36 + <button class="category-item" id="sushi">회/초밥🍣</button>
37 + <button class="category-item" id="etc">기타🍴</button>
38 + </div>
39 + </div>
40 + </div>
41 + </section>
42 + <!-- 카테고리 -->
43 + <div id="map" class="inner"></div>
44 +
45 + <!-- 카카오지도 -->
46 + </main>
47 +
48 + <script
49 + type="text/javascript"
50 + src="//dapi.kakao.com/v2/maps/sdk.js?appkey=e55f753363b95e27b799aa6286a6c398&libraries=services"
51 + ></script>
52 + <script
53 + src="https://cdnjs.cloudflare.com/ajax/libs/axios/1.0.0-alpha.1/axios.min.js"
54 + integrity="sha512-xIPqqrfvUAc/Cspuj7Bq0UtHNo/5qkdyngx6Vwt+tmbvTLDszzXM0G6c91LXmGrRx8KEPulT+AfOOez+TeVylg=="
55 + crossorigin="anonymous"
56 + referrerpolicy="no-referrer"
57 + ></script>
58 + <script src="/js/home/axios-index.js"></script>
59 + </body>
60 +</html>
1 +<!DOCTYPE html>
2 +<html lang="ko">
3 + <head>
4 + <meta charset="UTF-8" />
5 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 + <link rel="stylesheet" href="/css/home/login.css" />
8 + <script src="/js/home/login.js" defer></script>
9 + <title>로그인</title>
10 + </head>
11 + <body>
12 + <div class="login-page">
13 + <div class="form">
14 + <!-- <form class="register-form">
15 + <input type="text" placeholder="name" />
16 + <input type="password" placeholder="password" />
17 + <input type="text" placeholder="email address" />
18 + <button>create</button>
19 + <p class="message">Already registered? <a href="#">Sign In</a></p>
20 + </form> -->
21 + <form class="login-form">
22 + <input id="id" type="text" placeholder="아이디" />
23 + <input id="password" type="password" placeholder="비밀번호" />
24 + <p id="button">LOGIN</p>
25 + <p class="message">
26 + 계정이 없으신가요? <a href="/register">회원가입</a>
27 + </p>
28 + </form>
29 + </div>
30 + </div>
31 + </body>
32 +</html>
33 +
34 +<!-- Copyright (c) 2022 by Aigars Silkalns (https://codepen.io/colorlib/pen/rxddKy) -->
1 +<!DOCTYPE html>
2 +<html lang="ko">
3 + <head>
4 + <meta charset="UTF-8" />
5 + <meta http-equiv="X-UA-Compatible" content="IE=edge" />
6 + <meta name="viewport" content="width=device-width, initial-scale=1.0" />
7 + <link rel="stylesheet" href="/css/home/register.css" />
8 + <script src="/js/home/register.js" defer></script>
9 + <title>회원가입</title>
10 + </head>
11 + <body>
12 + <div class="login-page">
13 + <div class="form">
14 + <!-- <form class="register-form">
15 + <input type="text" placeholder="name" />
16 + <input type="password" placeholder="password" />
17 + <input type="text" placeholder="email address" />
18 + <button>create</button>
19 + <p class="message">Already registered? <a href="#">Sign In</a></p>
20 + </form> -->
21 + <form class="login-form">
22 + <input id="id" type="text" placeholder="아이디" />
23 + <input id="name" type="text" placeholder="이름" />
24 + <input id="password" type="password" placeholder="비밀번호" />
25 + <input
26 + id="confirm-password"
27 + type="password"
28 + placeholder="비밀번호 확인"
29 + />
30 + <p id="button">SIGN UP</p>
31 + <p class="message">계정이 있으신가요? <a href="/login">로그인</a></p>
32 + </form>
33 + </div>
34 + </div>
35 + </body>
36 +</html>
37 +
38 +<!-- Copyright (c) 2022 by Aigars Silkalns (https://codepen.io/colorlib/pen/rxddKy) -->
1 +{
2 + "lockfileVersion": 1
3 +}