김건희

[Merge] 'frontend' into 'master'

Showing 45 changed files with 3518 additions and 19 deletions
1 +{
2 + "requires": true,
3 + "lockfileVersion": 1,
4 + "dependencies": {
5 + "@babel/code-frame": {
6 + "version": "7.16.7",
7 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz",
8 + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==",
9 + "requires": {
10 + "@babel/highlight": "^7.16.7"
11 + }
12 + },
13 + "@babel/helper-validator-identifier": {
14 + "version": "7.16.7",
15 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
16 + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw=="
17 + },
18 + "@babel/highlight": {
19 + "version": "7.17.9",
20 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz",
21 + "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==",
22 + "requires": {
23 + "@babel/helper-validator-identifier": "^7.16.7",
24 + "chalk": "^2.0.0",
25 + "js-tokens": "^4.0.0"
26 + },
27 + "dependencies": {
28 + "ansi-styles": {
29 + "version": "3.2.1",
30 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
31 + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
32 + "requires": {
33 + "color-convert": "^1.9.0"
34 + }
35 + },
36 + "chalk": {
37 + "version": "2.4.2",
38 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
39 + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
40 + "requires": {
41 + "ansi-styles": "^3.2.1",
42 + "escape-string-regexp": "^1.0.5",
43 + "supports-color": "^5.3.0"
44 + }
45 + },
46 + "color-convert": {
47 + "version": "1.9.3",
48 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
49 + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
50 + "requires": {
51 + "color-name": "1.1.3"
52 + }
53 + },
54 + "color-name": {
55 + "version": "1.1.3",
56 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
57 + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
58 + },
59 + "has-flag": {
60 + "version": "3.0.0",
61 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
62 + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0="
63 + },
64 + "supports-color": {
65 + "version": "5.5.0",
66 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
67 + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
68 + "requires": {
69 + "has-flag": "^3.0.0"
70 + }
71 + }
72 + }
73 + },
74 + "@gar/promisify": {
75 + "version": "1.1.3",
76 + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz",
77 + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw=="
78 + },
79 + "@npmcli/fs": {
80 + "version": "1.1.1",
81 + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.1.tgz",
82 + "integrity": "sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==",
83 + "requires": {
84 + "@gar/promisify": "^1.0.1",
85 + "semver": "^7.3.5"
86 + }
87 + },
88 + "@npmcli/move-file": {
89 + "version": "1.1.2",
90 + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
91 + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
92 + "requires": {
93 + "mkdirp": "^1.0.4",
94 + "rimraf": "^3.0.2"
95 + }
96 + },
97 + "@tootallnate/once": {
98 + "version": "1.1.2",
99 + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz",
100 + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw=="
101 + },
102 + "@types/minimist": {
103 + "version": "1.2.2",
104 + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
105 + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ=="
106 + },
107 + "@types/normalize-package-data": {
108 + "version": "2.4.1",
109 + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
110 + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw=="
111 + },
112 + "abbrev": {
113 + "version": "1.1.1",
114 + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
115 + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="
116 + },
117 + "agent-base": {
118 + "version": "6.0.2",
119 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
120 + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
121 + "requires": {
122 + "debug": "4"
123 + }
124 + },
125 + "agentkeepalive": {
126 + "version": "4.2.1",
127 + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz",
128 + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==",
129 + "requires": {
130 + "debug": "^4.1.0",
131 + "depd": "^1.1.2",
132 + "humanize-ms": "^1.2.1"
133 + }
134 + },
135 + "aggregate-error": {
136 + "version": "3.1.0",
137 + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
138 + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
139 + "requires": {
140 + "clean-stack": "^2.0.0",
141 + "indent-string": "^4.0.0"
142 + }
143 + },
144 + "ajv": {
145 + "version": "6.12.6",
146 + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
147 + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
148 + "requires": {
149 + "fast-deep-equal": "^3.1.1",
150 + "fast-json-stable-stringify": "^2.0.0",
151 + "json-schema-traverse": "^0.4.1",
152 + "uri-js": "^4.2.2"
153 + }
154 + },
155 + "ansi-regex": {
156 + "version": "5.0.1",
157 + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
158 + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="
159 + },
160 + "ansi-styles": {
161 + "version": "4.3.0",
162 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
163 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
164 + "requires": {
165 + "color-convert": "^2.0.1"
166 + }
167 + },
168 + "aproba": {
169 + "version": "2.0.0",
170 + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz",
171 + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="
172 + },
173 + "are-we-there-yet": {
174 + "version": "3.0.0",
175 + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz",
176 + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==",
177 + "requires": {
178 + "delegates": "^1.0.0",
179 + "readable-stream": "^3.6.0"
180 + }
181 + },
182 + "arrify": {
183 + "version": "1.0.1",
184 + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
185 + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
186 + },
187 + "asn1": {
188 + "version": "0.2.6",
189 + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
190 + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
191 + "requires": {
192 + "safer-buffer": "~2.1.0"
193 + }
194 + },
195 + "assert-plus": {
196 + "version": "1.0.0",
197 + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
198 + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
199 + },
200 + "async-foreach": {
201 + "version": "0.1.3",
202 + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz",
203 + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI="
204 + },
205 + "asynckit": {
206 + "version": "0.4.0",
207 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
208 + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
209 + },
210 + "aws-sign2": {
211 + "version": "0.7.0",
212 + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
213 + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
214 + },
215 + "aws4": {
216 + "version": "1.11.0",
217 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz",
218 + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA=="
219 + },
220 + "balanced-match": {
221 + "version": "1.0.2",
222 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
223 + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
224 + },
225 + "bcrypt-pbkdf": {
226 + "version": "1.0.2",
227 + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
228 + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
229 + "requires": {
230 + "tweetnacl": "^0.14.3"
231 + }
232 + },
233 + "brace-expansion": {
234 + "version": "1.1.11",
235 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
236 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
237 + "requires": {
238 + "balanced-match": "^1.0.0",
239 + "concat-map": "0.0.1"
240 + }
241 + },
242 + "cacache": {
243 + "version": "15.3.0",
244 + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
245 + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
246 + "requires": {
247 + "@npmcli/fs": "^1.0.0",
248 + "@npmcli/move-file": "^1.0.1",
249 + "chownr": "^2.0.0",
250 + "fs-minipass": "^2.0.0",
251 + "glob": "^7.1.4",
252 + "infer-owner": "^1.0.4",
253 + "lru-cache": "^6.0.0",
254 + "minipass": "^3.1.1",
255 + "minipass-collect": "^1.0.2",
256 + "minipass-flush": "^1.0.5",
257 + "minipass-pipeline": "^1.2.2",
258 + "mkdirp": "^1.0.3",
259 + "p-map": "^4.0.0",
260 + "promise-inflight": "^1.0.1",
261 + "rimraf": "^3.0.2",
262 + "ssri": "^8.0.1",
263 + "tar": "^6.0.2",
264 + "unique-filename": "^1.1.1"
265 + }
266 + },
267 + "camelcase": {
268 + "version": "5.3.1",
269 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
270 + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg=="
271 + },
272 + "camelcase-keys": {
273 + "version": "6.2.2",
274 + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
275 + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
276 + "requires": {
277 + "camelcase": "^5.3.1",
278 + "map-obj": "^4.0.0",
279 + "quick-lru": "^4.0.1"
280 + }
281 + },
282 + "caseless": {
283 + "version": "0.12.0",
284 + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
285 + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
286 + },
287 + "chalk": {
288 + "version": "4.1.2",
289 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
290 + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
291 + "requires": {
292 + "ansi-styles": "^4.1.0",
293 + "supports-color": "^7.1.0"
294 + }
295 + },
296 + "chownr": {
297 + "version": "2.0.0",
298 + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
299 + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="
300 + },
301 + "clean-stack": {
302 + "version": "2.2.0",
303 + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
304 + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A=="
305 + },
306 + "cliui": {
307 + "version": "7.0.4",
308 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
309 + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
310 + "requires": {
311 + "string-width": "^4.2.0",
312 + "strip-ansi": "^6.0.0",
313 + "wrap-ansi": "^7.0.0"
314 + }
315 + },
316 + "color-convert": {
317 + "version": "2.0.1",
318 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
319 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
320 + "requires": {
321 + "color-name": "~1.1.4"
322 + }
323 + },
324 + "color-name": {
325 + "version": "1.1.4",
326 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
327 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
328 + },
329 + "color-support": {
330 + "version": "1.1.3",
331 + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
332 + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="
333 + },
334 + "combined-stream": {
335 + "version": "1.0.8",
336 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
337 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
338 + "requires": {
339 + "delayed-stream": "~1.0.0"
340 + }
341 + },
342 + "concat-map": {
343 + "version": "0.0.1",
344 + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
345 + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
346 + },
347 + "console-control-strings": {
348 + "version": "1.1.0",
349 + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
350 + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4="
351 + },
352 + "core-util-is": {
353 + "version": "1.0.2",
354 + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
355 + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
356 + },
357 + "cross-spawn": {
358 + "version": "7.0.3",
359 + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
360 + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
361 + "requires": {
362 + "path-key": "^3.1.0",
363 + "shebang-command": "^2.0.0",
364 + "which": "^2.0.1"
365 + }
366 + },
367 + "dashdash": {
368 + "version": "1.14.1",
369 + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
370 + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
371 + "requires": {
372 + "assert-plus": "^1.0.0"
373 + }
374 + },
375 + "debug": {
376 + "version": "4.3.4",
377 + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
378 + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
379 + "requires": {
380 + "ms": "2.1.2"
381 + }
382 + },
383 + "decamelize": {
384 + "version": "1.2.0",
385 + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
386 + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
387 + },
388 + "decamelize-keys": {
389 + "version": "1.1.0",
390 + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
391 + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
392 + "requires": {
393 + "decamelize": "^1.1.0",
394 + "map-obj": "^1.0.0"
395 + },
396 + "dependencies": {
397 + "map-obj": {
398 + "version": "1.0.1",
399 + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
400 + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0="
401 + }
402 + }
403 + },
404 + "delayed-stream": {
405 + "version": "1.0.0",
406 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
407 + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
408 + },
409 + "delegates": {
410 + "version": "1.0.0",
411 + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
412 + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o="
413 + },
414 + "depd": {
415 + "version": "1.1.2",
416 + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
417 + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
418 + },
419 + "ecc-jsbn": {
420 + "version": "0.1.2",
421 + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
422 + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
423 + "requires": {
424 + "jsbn": "~0.1.0",
425 + "safer-buffer": "^2.1.0"
426 + }
427 + },
428 + "emoji-regex": {
429 + "version": "8.0.0",
430 + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
431 + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="
432 + },
433 + "encoding": {
434 + "version": "0.1.13",
435 + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
436 + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
437 + "optional": true,
438 + "requires": {
439 + "iconv-lite": "^0.6.2"
440 + }
441 + },
442 + "env-paths": {
443 + "version": "2.2.1",
444 + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
445 + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A=="
446 + },
447 + "err-code": {
448 + "version": "2.0.3",
449 + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz",
450 + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="
451 + },
452 + "error-ex": {
453 + "version": "1.3.2",
454 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
455 + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
456 + "requires": {
457 + "is-arrayish": "^0.2.1"
458 + }
459 + },
460 + "escalade": {
461 + "version": "3.1.1",
462 + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
463 + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw=="
464 + },
465 + "escape-string-regexp": {
466 + "version": "1.0.5",
467 + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
468 + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
469 + },
470 + "extend": {
471 + "version": "3.0.2",
472 + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
473 + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
474 + },
475 + "extsprintf": {
476 + "version": "1.3.0",
477 + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
478 + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
479 + },
480 + "fast-deep-equal": {
481 + "version": "3.1.3",
482 + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
483 + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
484 + },
485 + "fast-json-stable-stringify": {
486 + "version": "2.1.0",
487 + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
488 + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
489 + },
490 + "find-up": {
491 + "version": "4.1.0",
492 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
493 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
494 + "requires": {
495 + "locate-path": "^5.0.0",
496 + "path-exists": "^4.0.0"
497 + }
498 + },
499 + "forever-agent": {
500 + "version": "0.6.1",
501 + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
502 + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
503 + },
504 + "form-data": {
505 + "version": "2.3.3",
506 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
507 + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
508 + "requires": {
509 + "asynckit": "^0.4.0",
510 + "combined-stream": "^1.0.6",
511 + "mime-types": "^2.1.12"
512 + }
513 + },
514 + "fs-minipass": {
515 + "version": "2.1.0",
516 + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
517 + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
518 + "requires": {
519 + "minipass": "^3.0.0"
520 + }
521 + },
522 + "fs.realpath": {
523 + "version": "1.0.0",
524 + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
525 + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
526 + },
527 + "function-bind": {
528 + "version": "1.1.1",
529 + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
530 + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
531 + },
532 + "gauge": {
533 + "version": "4.0.4",
534 + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
535 + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==",
536 + "requires": {
537 + "aproba": "^1.0.3 || ^2.0.0",
538 + "color-support": "^1.1.3",
539 + "console-control-strings": "^1.1.0",
540 + "has-unicode": "^2.0.1",
541 + "signal-exit": "^3.0.7",
542 + "string-width": "^4.2.3",
543 + "strip-ansi": "^6.0.1",
544 + "wide-align": "^1.1.5"
545 + }
546 + },
547 + "gaze": {
548 + "version": "1.1.3",
549 + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz",
550 + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==",
551 + "requires": {
552 + "globule": "^1.0.0"
553 + }
554 + },
555 + "get-caller-file": {
556 + "version": "2.0.5",
557 + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
558 + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="
559 + },
560 + "get-stdin": {
561 + "version": "4.0.1",
562 + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz",
563 + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4="
564 + },
565 + "getpass": {
566 + "version": "0.1.7",
567 + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
568 + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
569 + "requires": {
570 + "assert-plus": "^1.0.0"
571 + }
572 + },
573 + "glob": {
574 + "version": "7.2.3",
575 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
576 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
577 + "requires": {
578 + "fs.realpath": "^1.0.0",
579 + "inflight": "^1.0.4",
580 + "inherits": "2",
581 + "minimatch": "^3.1.1",
582 + "once": "^1.3.0",
583 + "path-is-absolute": "^1.0.0"
584 + },
585 + "dependencies": {
586 + "minimatch": {
587 + "version": "3.1.2",
588 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
589 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
590 + "requires": {
591 + "brace-expansion": "^1.1.7"
592 + }
593 + }
594 + }
595 + },
596 + "globule": {
597 + "version": "1.3.3",
598 + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
599 + "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==",
600 + "requires": {
601 + "glob": "~7.1.1",
602 + "lodash": "~4.17.10",
603 + "minimatch": "~3.0.2"
604 + },
605 + "dependencies": {
606 + "glob": {
607 + "version": "7.1.7",
608 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
609 + "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
610 + "requires": {
611 + "fs.realpath": "^1.0.0",
612 + "inflight": "^1.0.4",
613 + "inherits": "2",
614 + "minimatch": "^3.0.4",
615 + "once": "^1.3.0",
616 + "path-is-absolute": "^1.0.0"
617 + }
618 + }
619 + }
620 + },
621 + "graceful-fs": {
622 + "version": "4.2.10",
623 + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz",
624 + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="
625 + },
626 + "har-schema": {
627 + "version": "2.0.0",
628 + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
629 + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
630 + },
631 + "har-validator": {
632 + "version": "5.1.5",
633 + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
634 + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
635 + "requires": {
636 + "ajv": "^6.12.3",
637 + "har-schema": "^2.0.0"
638 + }
639 + },
640 + "hard-rejection": {
641 + "version": "2.1.0",
642 + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
643 + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA=="
644 + },
645 + "has": {
646 + "version": "1.0.3",
647 + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
648 + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
649 + "requires": {
650 + "function-bind": "^1.1.1"
651 + }
652 + },
653 + "has-flag": {
654 + "version": "4.0.0",
655 + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
656 + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
657 + },
658 + "has-unicode": {
659 + "version": "2.0.1",
660 + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
661 + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk="
662 + },
663 + "hosted-git-info": {
664 + "version": "4.1.0",
665 + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
666 + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
667 + "requires": {
668 + "lru-cache": "^6.0.0"
669 + }
670 + },
671 + "http-cache-semantics": {
672 + "version": "4.1.0",
673 + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
674 + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ=="
675 + },
676 + "http-proxy-agent": {
677 + "version": "4.0.1",
678 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz",
679 + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==",
680 + "requires": {
681 + "@tootallnate/once": "1",
682 + "agent-base": "6",
683 + "debug": "4"
684 + }
685 + },
686 + "http-signature": {
687 + "version": "1.2.0",
688 + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
689 + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
690 + "requires": {
691 + "assert-plus": "^1.0.0",
692 + "jsprim": "^1.2.2",
693 + "sshpk": "^1.7.0"
694 + }
695 + },
696 + "https-proxy-agent": {
697 + "version": "5.0.1",
698 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
699 + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
700 + "requires": {
701 + "agent-base": "6",
702 + "debug": "4"
703 + }
704 + },
705 + "humanize-ms": {
706 + "version": "1.2.1",
707 + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz",
708 + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=",
709 + "requires": {
710 + "ms": "^2.0.0"
711 + }
712 + },
713 + "iconv-lite": {
714 + "version": "0.6.3",
715 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
716 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
717 + "optional": true,
718 + "requires": {
719 + "safer-buffer": ">= 2.1.2 < 3.0.0"
720 + }
721 + },
722 + "imurmurhash": {
723 + "version": "0.1.4",
724 + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
725 + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
726 + },
727 + "indent-string": {
728 + "version": "4.0.0",
729 + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
730 + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="
731 + },
732 + "infer-owner": {
733 + "version": "1.0.4",
734 + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
735 + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A=="
736 + },
737 + "inflight": {
738 + "version": "1.0.6",
739 + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
740 + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
741 + "requires": {
742 + "once": "^1.3.0",
743 + "wrappy": "1"
744 + }
745 + },
746 + "inherits": {
747 + "version": "2.0.4",
748 + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
749 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
750 + },
751 + "ip": {
752 + "version": "1.1.8",
753 + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz",
754 + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg=="
755 + },
756 + "is-arrayish": {
757 + "version": "0.2.1",
758 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
759 + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0="
760 + },
761 + "is-core-module": {
762 + "version": "2.9.0",
763 + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
764 + "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
765 + "requires": {
766 + "has": "^1.0.3"
767 + }
768 + },
769 + "is-fullwidth-code-point": {
770 + "version": "3.0.0",
771 + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
772 + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="
773 + },
774 + "is-lambda": {
775 + "version": "1.0.1",
776 + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz",
777 + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU="
778 + },
779 + "is-plain-obj": {
780 + "version": "1.1.0",
781 + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
782 + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4="
783 + },
784 + "is-typedarray": {
785 + "version": "1.0.0",
786 + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
787 + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
788 + },
789 + "isarray": {
790 + "version": "1.0.0",
791 + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
792 + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
793 + },
794 + "isexe": {
795 + "version": "2.0.0",
796 + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
797 + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA="
798 + },
799 + "isstream": {
800 + "version": "0.1.2",
801 + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
802 + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
803 + },
804 + "js-base64": {
805 + "version": "2.6.4",
806 + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz",
807 + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ=="
808 + },
809 + "js-tokens": {
810 + "version": "4.0.0",
811 + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
812 + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
813 + },
814 + "jsbn": {
815 + "version": "0.1.1",
816 + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
817 + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
818 + },
819 + "json-parse-even-better-errors": {
820 + "version": "2.3.1",
821 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
822 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
823 + },
824 + "json-schema": {
825 + "version": "0.4.0",
826 + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz",
827 + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="
828 + },
829 + "json-schema-traverse": {
830 + "version": "0.4.1",
831 + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
832 + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
833 + },
834 + "json-stringify-safe": {
835 + "version": "5.0.1",
836 + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
837 + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
838 + },
839 + "jsprim": {
840 + "version": "1.4.2",
841 + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz",
842 + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==",
843 + "requires": {
844 + "assert-plus": "1.0.0",
845 + "extsprintf": "1.3.0",
846 + "json-schema": "0.4.0",
847 + "verror": "1.10.0"
848 + }
849 + },
850 + "kind-of": {
851 + "version": "6.0.3",
852 + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
853 + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
854 + },
855 + "lines-and-columns": {
856 + "version": "1.2.4",
857 + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
858 + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
859 + },
860 + "locate-path": {
861 + "version": "5.0.0",
862 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
863 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
864 + "requires": {
865 + "p-locate": "^4.1.0"
866 + }
867 + },
868 + "lodash": {
869 + "version": "4.17.21",
870 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
871 + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
872 + },
873 + "lru-cache": {
874 + "version": "6.0.0",
875 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
876 + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
877 + "requires": {
878 + "yallist": "^4.0.0"
879 + }
880 + },
881 + "make-fetch-happen": {
882 + "version": "9.1.0",
883 + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz",
884 + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==",
885 + "requires": {
886 + "agentkeepalive": "^4.1.3",
887 + "cacache": "^15.2.0",
888 + "http-cache-semantics": "^4.1.0",
889 + "http-proxy-agent": "^4.0.1",
890 + "https-proxy-agent": "^5.0.0",
891 + "is-lambda": "^1.0.1",
892 + "lru-cache": "^6.0.0",
893 + "minipass": "^3.1.3",
894 + "minipass-collect": "^1.0.2",
895 + "minipass-fetch": "^1.3.2",
896 + "minipass-flush": "^1.0.5",
897 + "minipass-pipeline": "^1.2.4",
898 + "negotiator": "^0.6.2",
899 + "promise-retry": "^2.0.1",
900 + "socks-proxy-agent": "^6.0.0",
901 + "ssri": "^8.0.0"
902 + }
903 + },
904 + "map-obj": {
905 + "version": "4.3.0",
906 + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
907 + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ=="
908 + },
909 + "meow": {
910 + "version": "9.0.0",
911 + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
912 + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
913 + "requires": {
914 + "@types/minimist": "^1.2.0",
915 + "camelcase-keys": "^6.2.2",
916 + "decamelize": "^1.2.0",
917 + "decamelize-keys": "^1.1.0",
918 + "hard-rejection": "^2.1.0",
919 + "minimist-options": "4.1.0",
920 + "normalize-package-data": "^3.0.0",
921 + "read-pkg-up": "^7.0.1",
922 + "redent": "^3.0.0",
923 + "trim-newlines": "^3.0.0",
924 + "type-fest": "^0.18.0",
925 + "yargs-parser": "^20.2.3"
926 + }
927 + },
928 + "mime-db": {
929 + "version": "1.52.0",
930 + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
931 + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
932 + },
933 + "mime-types": {
934 + "version": "2.1.35",
935 + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
936 + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
937 + "requires": {
938 + "mime-db": "1.52.0"
939 + }
940 + },
941 + "min-indent": {
942 + "version": "1.0.1",
943 + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
944 + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="
945 + },
946 + "minimatch": {
947 + "version": "3.0.8",
948 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
949 + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
950 + "requires": {
951 + "brace-expansion": "^1.1.7"
952 + }
953 + },
954 + "minimist-options": {
955 + "version": "4.1.0",
956 + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
957 + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
958 + "requires": {
959 + "arrify": "^1.0.1",
960 + "is-plain-obj": "^1.1.0",
961 + "kind-of": "^6.0.3"
962 + }
963 + },
964 + "minipass": {
965 + "version": "3.1.6",
966 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz",
967 + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==",
968 + "requires": {
969 + "yallist": "^4.0.0"
970 + }
971 + },
972 + "minipass-collect": {
973 + "version": "1.0.2",
974 + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
975 + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
976 + "requires": {
977 + "minipass": "^3.0.0"
978 + }
979 + },
980 + "minipass-fetch": {
981 + "version": "1.4.1",
982 + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz",
983 + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==",
984 + "requires": {
985 + "encoding": "^0.1.12",
986 + "minipass": "^3.1.0",
987 + "minipass-sized": "^1.0.3",
988 + "minizlib": "^2.0.0"
989 + }
990 + },
991 + "minipass-flush": {
992 + "version": "1.0.5",
993 + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
994 + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
995 + "requires": {
996 + "minipass": "^3.0.0"
997 + }
998 + },
999 + "minipass-pipeline": {
1000 + "version": "1.2.4",
1001 + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
1002 + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
1003 + "requires": {
1004 + "minipass": "^3.0.0"
1005 + }
1006 + },
1007 + "minipass-sized": {
1008 + "version": "1.0.3",
1009 + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz",
1010 + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==",
1011 + "requires": {
1012 + "minipass": "^3.0.0"
1013 + }
1014 + },
1015 + "minizlib": {
1016 + "version": "2.1.2",
1017 + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
1018 + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
1019 + "requires": {
1020 + "minipass": "^3.0.0",
1021 + "yallist": "^4.0.0"
1022 + }
1023 + },
1024 + "mkdirp": {
1025 + "version": "1.0.4",
1026 + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
1027 + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="
1028 + },
1029 + "ms": {
1030 + "version": "2.1.2",
1031 + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1032 + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1033 + },
1034 + "nan": {
1035 + "version": "2.15.0",
1036 + "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
1037 + "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ=="
1038 + },
1039 + "negotiator": {
1040 + "version": "0.6.3",
1041 + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
1042 + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
1043 + },
1044 + "node-gyp": {
1045 + "version": "8.4.1",
1046 + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz",
1047 + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==",
1048 + "requires": {
1049 + "env-paths": "^2.2.0",
1050 + "glob": "^7.1.4",
1051 + "graceful-fs": "^4.2.6",
1052 + "make-fetch-happen": "^9.1.0",
1053 + "nopt": "^5.0.0",
1054 + "npmlog": "^6.0.0",
1055 + "rimraf": "^3.0.2",
1056 + "semver": "^7.3.5",
1057 + "tar": "^6.1.2",
1058 + "which": "^2.0.2"
1059 + },
1060 + "dependencies": {
1061 + "npmlog": {
1062 + "version": "6.0.2",
1063 + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz",
1064 + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==",
1065 + "requires": {
1066 + "are-we-there-yet": "^3.0.0",
1067 + "console-control-strings": "^1.1.0",
1068 + "gauge": "^4.0.3",
1069 + "set-blocking": "^2.0.0"
1070 + }
1071 + }
1072 + }
1073 + },
1074 + "node-sass": {
1075 + "version": "7.0.1",
1076 + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-7.0.1.tgz",
1077 + "integrity": "sha512-uMy+Xt29NlqKCFdFRZyXKOTqGt+QaKHexv9STj2WeLottnlqZEEWx6Bj0MXNthmFRRdM/YwyNo/8Tr46TOM0jQ==",
1078 + "requires": {
1079 + "async-foreach": "^0.1.3",
1080 + "chalk": "^4.1.2",
1081 + "cross-spawn": "^7.0.3",
1082 + "gaze": "^1.0.0",
1083 + "get-stdin": "^4.0.1",
1084 + "glob": "^7.0.3",
1085 + "lodash": "^4.17.15",
1086 + "meow": "^9.0.0",
1087 + "nan": "^2.13.2",
1088 + "node-gyp": "^8.4.1",
1089 + "npmlog": "^5.0.0",
1090 + "request": "^2.88.0",
1091 + "sass-graph": "4.0.0",
1092 + "stdout-stream": "^1.4.0",
1093 + "true-case-path": "^1.0.2"
1094 + }
1095 + },
1096 + "nopt": {
1097 + "version": "5.0.0",
1098 + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
1099 + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==",
1100 + "requires": {
1101 + "abbrev": "1"
1102 + }
1103 + },
1104 + "normalize-package-data": {
1105 + "version": "3.0.3",
1106 + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
1107 + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
1108 + "requires": {
1109 + "hosted-git-info": "^4.0.1",
1110 + "is-core-module": "^2.5.0",
1111 + "semver": "^7.3.4",
1112 + "validate-npm-package-license": "^3.0.1"
1113 + }
1114 + },
1115 + "npmlog": {
1116 + "version": "5.0.1",
1117 + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz",
1118 + "integrity": "sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==",
1119 + "requires": {
1120 + "are-we-there-yet": "^2.0.0",
1121 + "console-control-strings": "^1.1.0",
1122 + "gauge": "^3.0.0",
1123 + "set-blocking": "^2.0.0"
1124 + },
1125 + "dependencies": {
1126 + "are-we-there-yet": {
1127 + "version": "2.0.0",
1128 + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz",
1129 + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==",
1130 + "requires": {
1131 + "delegates": "^1.0.0",
1132 + "readable-stream": "^3.6.0"
1133 + }
1134 + },
1135 + "gauge": {
1136 + "version": "3.0.2",
1137 + "resolved": "https://registry.npmjs.org/gauge/-/gauge-3.0.2.tgz",
1138 + "integrity": "sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==",
1139 + "requires": {
1140 + "aproba": "^1.0.3 || ^2.0.0",
1141 + "color-support": "^1.1.2",
1142 + "console-control-strings": "^1.0.0",
1143 + "has-unicode": "^2.0.1",
1144 + "object-assign": "^4.1.1",
1145 + "signal-exit": "^3.0.0",
1146 + "string-width": "^4.2.3",
1147 + "strip-ansi": "^6.0.1",
1148 + "wide-align": "^1.1.2"
1149 + }
1150 + }
1151 + }
1152 + },
1153 + "oauth-sign": {
1154 + "version": "0.9.0",
1155 + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
1156 + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
1157 + },
1158 + "object-assign": {
1159 + "version": "4.1.1",
1160 + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1161 + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
1162 + },
1163 + "once": {
1164 + "version": "1.4.0",
1165 + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1166 + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1167 + "requires": {
1168 + "wrappy": "1"
1169 + }
1170 + },
1171 + "p-limit": {
1172 + "version": "2.3.0",
1173 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
1174 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
1175 + "requires": {
1176 + "p-try": "^2.0.0"
1177 + }
1178 + },
1179 + "p-locate": {
1180 + "version": "4.1.0",
1181 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
1182 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
1183 + "requires": {
1184 + "p-limit": "^2.2.0"
1185 + }
1186 + },
1187 + "p-map": {
1188 + "version": "4.0.0",
1189 + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
1190 + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
1191 + "requires": {
1192 + "aggregate-error": "^3.0.0"
1193 + }
1194 + },
1195 + "p-try": {
1196 + "version": "2.2.0",
1197 + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1198 + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ=="
1199 + },
1200 + "parse-json": {
1201 + "version": "5.2.0",
1202 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
1203 + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
1204 + "requires": {
1205 + "@babel/code-frame": "^7.0.0",
1206 + "error-ex": "^1.3.1",
1207 + "json-parse-even-better-errors": "^2.3.0",
1208 + "lines-and-columns": "^1.1.6"
1209 + }
1210 + },
1211 + "path-exists": {
1212 + "version": "4.0.0",
1213 + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1214 + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
1215 + },
1216 + "path-is-absolute": {
1217 + "version": "1.0.1",
1218 + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1219 + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
1220 + },
1221 + "path-key": {
1222 + "version": "3.1.1",
1223 + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
1224 + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
1225 + },
1226 + "path-parse": {
1227 + "version": "1.0.7",
1228 + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
1229 + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
1230 + },
1231 + "performance-now": {
1232 + "version": "2.1.0",
1233 + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1234 + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
1235 + },
1236 + "process-nextick-args": {
1237 + "version": "2.0.1",
1238 + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
1239 + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
1240 + },
1241 + "promise-inflight": {
1242 + "version": "1.0.1",
1243 + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
1244 + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM="
1245 + },
1246 + "promise-retry": {
1247 + "version": "2.0.1",
1248 + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz",
1249 + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==",
1250 + "requires": {
1251 + "err-code": "^2.0.2",
1252 + "retry": "^0.12.0"
1253 + }
1254 + },
1255 + "psl": {
1256 + "version": "1.8.0",
1257 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
1258 + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
1259 + },
1260 + "punycode": {
1261 + "version": "2.1.1",
1262 + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1263 + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
1264 + },
1265 + "qs": {
1266 + "version": "6.5.3",
1267 + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz",
1268 + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="
1269 + },
1270 + "quick-lru": {
1271 + "version": "4.0.1",
1272 + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
1273 + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g=="
1274 + },
1275 + "read-pkg": {
1276 + "version": "5.2.0",
1277 + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
1278 + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
1279 + "requires": {
1280 + "@types/normalize-package-data": "^2.4.0",
1281 + "normalize-package-data": "^2.5.0",
1282 + "parse-json": "^5.0.0",
1283 + "type-fest": "^0.6.0"
1284 + },
1285 + "dependencies": {
1286 + "hosted-git-info": {
1287 + "version": "2.8.9",
1288 + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
1289 + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw=="
1290 + },
1291 + "normalize-package-data": {
1292 + "version": "2.5.0",
1293 + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
1294 + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
1295 + "requires": {
1296 + "hosted-git-info": "^2.1.4",
1297 + "resolve": "^1.10.0",
1298 + "semver": "2 || 3 || 4 || 5",
1299 + "validate-npm-package-license": "^3.0.1"
1300 + }
1301 + },
1302 + "semver": {
1303 + "version": "5.7.1",
1304 + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1305 + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
1306 + },
1307 + "type-fest": {
1308 + "version": "0.6.0",
1309 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
1310 + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg=="
1311 + }
1312 + }
1313 + },
1314 + "read-pkg-up": {
1315 + "version": "7.0.1",
1316 + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
1317 + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
1318 + "requires": {
1319 + "find-up": "^4.1.0",
1320 + "read-pkg": "^5.2.0",
1321 + "type-fest": "^0.8.1"
1322 + },
1323 + "dependencies": {
1324 + "type-fest": {
1325 + "version": "0.8.1",
1326 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
1327 + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA=="
1328 + }
1329 + }
1330 + },
1331 + "readable-stream": {
1332 + "version": "3.6.0",
1333 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
1334 + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
1335 + "requires": {
1336 + "inherits": "^2.0.3",
1337 + "string_decoder": "^1.1.1",
1338 + "util-deprecate": "^1.0.1"
1339 + }
1340 + },
1341 + "redent": {
1342 + "version": "3.0.0",
1343 + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
1344 + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
1345 + "requires": {
1346 + "indent-string": "^4.0.0",
1347 + "strip-indent": "^3.0.0"
1348 + }
1349 + },
1350 + "request": {
1351 + "version": "2.88.2",
1352 + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
1353 + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
1354 + "requires": {
1355 + "aws-sign2": "~0.7.0",
1356 + "aws4": "^1.8.0",
1357 + "caseless": "~0.12.0",
1358 + "combined-stream": "~1.0.6",
1359 + "extend": "~3.0.2",
1360 + "forever-agent": "~0.6.1",
1361 + "form-data": "~2.3.2",
1362 + "har-validator": "~5.1.3",
1363 + "http-signature": "~1.2.0",
1364 + "is-typedarray": "~1.0.0",
1365 + "isstream": "~0.1.2",
1366 + "json-stringify-safe": "~5.0.1",
1367 + "mime-types": "~2.1.19",
1368 + "oauth-sign": "~0.9.0",
1369 + "performance-now": "^2.1.0",
1370 + "qs": "~6.5.2",
1371 + "safe-buffer": "^5.1.2",
1372 + "tough-cookie": "~2.5.0",
1373 + "tunnel-agent": "^0.6.0",
1374 + "uuid": "^3.3.2"
1375 + }
1376 + },
1377 + "require-directory": {
1378 + "version": "2.1.1",
1379 + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1380 + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I="
1381 + },
1382 + "resolve": {
1383 + "version": "1.22.0",
1384 + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz",
1385 + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==",
1386 + "requires": {
1387 + "is-core-module": "^2.8.1",
1388 + "path-parse": "^1.0.7",
1389 + "supports-preserve-symlinks-flag": "^1.0.0"
1390 + }
1391 + },
1392 + "retry": {
1393 + "version": "0.12.0",
1394 + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz",
1395 + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs="
1396 + },
1397 + "rimraf": {
1398 + "version": "3.0.2",
1399 + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
1400 + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
1401 + "requires": {
1402 + "glob": "^7.1.3"
1403 + }
1404 + },
1405 + "safe-buffer": {
1406 + "version": "5.2.1",
1407 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1408 + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
1409 + },
1410 + "safer-buffer": {
1411 + "version": "2.1.2",
1412 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1413 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
1414 + },
1415 + "sass-graph": {
1416 + "version": "4.0.0",
1417 + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-4.0.0.tgz",
1418 + "integrity": "sha512-WSO/MfXqKH7/TS8RdkCX3lVkPFQzCgbqdGsmSKq6tlPU+GpGEsa/5aW18JqItnqh+lPtcjifqdZ/VmiILkKckQ==",
1419 + "requires": {
1420 + "glob": "^7.0.0",
1421 + "lodash": "^4.17.11",
1422 + "scss-tokenizer": "^0.3.0",
1423 + "yargs": "^17.2.1"
1424 + }
1425 + },
1426 + "scss-tokenizer": {
1427 + "version": "0.3.0",
1428 + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.3.0.tgz",
1429 + "integrity": "sha512-14Zl9GcbBvOT9057ZKjpz5yPOyUWG2ojd9D5io28wHRYsOrs7U95Q+KNL87+32p8rc+LvDpbu/i9ZYjM9Q+FsQ==",
1430 + "requires": {
1431 + "js-base64": "^2.4.3",
1432 + "source-map": "^0.7.1"
1433 + }
1434 + },
1435 + "semver": {
1436 + "version": "7.3.7",
1437 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz",
1438 + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==",
1439 + "requires": {
1440 + "lru-cache": "^6.0.0"
1441 + }
1442 + },
1443 + "set-blocking": {
1444 + "version": "2.0.0",
1445 + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1446 + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
1447 + },
1448 + "shebang-command": {
1449 + "version": "2.0.0",
1450 + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1451 + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1452 + "requires": {
1453 + "shebang-regex": "^3.0.0"
1454 + }
1455 + },
1456 + "shebang-regex": {
1457 + "version": "3.0.0",
1458 + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1459 + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
1460 + },
1461 + "signal-exit": {
1462 + "version": "3.0.7",
1463 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
1464 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
1465 + },
1466 + "smart-buffer": {
1467 + "version": "4.2.0",
1468 + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
1469 + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="
1470 + },
1471 + "socks": {
1472 + "version": "2.6.2",
1473 + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz",
1474 + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==",
1475 + "requires": {
1476 + "ip": "^1.1.5",
1477 + "smart-buffer": "^4.2.0"
1478 + }
1479 + },
1480 + "socks-proxy-agent": {
1481 + "version": "6.2.0",
1482 + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz",
1483 + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==",
1484 + "requires": {
1485 + "agent-base": "^6.0.2",
1486 + "debug": "^4.3.3",
1487 + "socks": "^2.6.2"
1488 + }
1489 + },
1490 + "source-map": {
1491 + "version": "0.7.3",
1492 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
1493 + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ=="
1494 + },
1495 + "spdx-correct": {
1496 + "version": "3.1.1",
1497 + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
1498 + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
1499 + "requires": {
1500 + "spdx-expression-parse": "^3.0.0",
1501 + "spdx-license-ids": "^3.0.0"
1502 + }
1503 + },
1504 + "spdx-exceptions": {
1505 + "version": "2.3.0",
1506 + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
1507 + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A=="
1508 + },
1509 + "spdx-expression-parse": {
1510 + "version": "3.0.1",
1511 + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
1512 + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
1513 + "requires": {
1514 + "spdx-exceptions": "^2.1.0",
1515 + "spdx-license-ids": "^3.0.0"
1516 + }
1517 + },
1518 + "spdx-license-ids": {
1519 + "version": "3.0.11",
1520 + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz",
1521 + "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g=="
1522 + },
1523 + "sshpk": {
1524 + "version": "1.17.0",
1525 + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz",
1526 + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==",
1527 + "requires": {
1528 + "asn1": "~0.2.3",
1529 + "assert-plus": "^1.0.0",
1530 + "bcrypt-pbkdf": "^1.0.0",
1531 + "dashdash": "^1.12.0",
1532 + "ecc-jsbn": "~0.1.1",
1533 + "getpass": "^0.1.1",
1534 + "jsbn": "~0.1.0",
1535 + "safer-buffer": "^2.0.2",
1536 + "tweetnacl": "~0.14.0"
1537 + }
1538 + },
1539 + "ssri": {
1540 + "version": "8.0.1",
1541 + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
1542 + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
1543 + "requires": {
1544 + "minipass": "^3.1.1"
1545 + }
1546 + },
1547 + "stdout-stream": {
1548 + "version": "1.4.1",
1549 + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz",
1550 + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==",
1551 + "requires": {
1552 + "readable-stream": "^2.0.1"
1553 + },
1554 + "dependencies": {
1555 + "readable-stream": {
1556 + "version": "2.3.7",
1557 + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
1558 + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
1559 + "requires": {
1560 + "core-util-is": "~1.0.0",
1561 + "inherits": "~2.0.3",
1562 + "isarray": "~1.0.0",
1563 + "process-nextick-args": "~2.0.0",
1564 + "safe-buffer": "~5.1.1",
1565 + "string_decoder": "~1.1.1",
1566 + "util-deprecate": "~1.0.1"
1567 + }
1568 + },
1569 + "safe-buffer": {
1570 + "version": "5.1.2",
1571 + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1572 + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
1573 + },
1574 + "string_decoder": {
1575 + "version": "1.1.1",
1576 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1577 + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1578 + "requires": {
1579 + "safe-buffer": "~5.1.0"
1580 + }
1581 + }
1582 + }
1583 + },
1584 + "string-width": {
1585 + "version": "4.2.3",
1586 + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
1587 + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
1588 + "requires": {
1589 + "emoji-regex": "^8.0.0",
1590 + "is-fullwidth-code-point": "^3.0.0",
1591 + "strip-ansi": "^6.0.1"
1592 + }
1593 + },
1594 + "string_decoder": {
1595 + "version": "1.3.0",
1596 + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
1597 + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
1598 + "requires": {
1599 + "safe-buffer": "~5.2.0"
1600 + }
1601 + },
1602 + "strip-ansi": {
1603 + "version": "6.0.1",
1604 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
1605 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
1606 + "requires": {
1607 + "ansi-regex": "^5.0.1"
1608 + }
1609 + },
1610 + "strip-indent": {
1611 + "version": "3.0.0",
1612 + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
1613 + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
1614 + "requires": {
1615 + "min-indent": "^1.0.0"
1616 + }
1617 + },
1618 + "supports-color": {
1619 + "version": "7.2.0",
1620 + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
1621 + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
1622 + "requires": {
1623 + "has-flag": "^4.0.0"
1624 + }
1625 + },
1626 + "supports-preserve-symlinks-flag": {
1627 + "version": "1.0.0",
1628 + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
1629 + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="
1630 + },
1631 + "tar": {
1632 + "version": "6.1.11",
1633 + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
1634 + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
1635 + "requires": {
1636 + "chownr": "^2.0.0",
1637 + "fs-minipass": "^2.0.0",
1638 + "minipass": "^3.0.0",
1639 + "minizlib": "^2.1.1",
1640 + "mkdirp": "^1.0.3",
1641 + "yallist": "^4.0.0"
1642 + }
1643 + },
1644 + "tough-cookie": {
1645 + "version": "2.5.0",
1646 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
1647 + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
1648 + "requires": {
1649 + "psl": "^1.1.28",
1650 + "punycode": "^2.1.1"
1651 + }
1652 + },
1653 + "trim-newlines": {
1654 + "version": "3.0.1",
1655 + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
1656 + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw=="
1657 + },
1658 + "true-case-path": {
1659 + "version": "1.0.3",
1660 + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz",
1661 + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==",
1662 + "requires": {
1663 + "glob": "^7.1.2"
1664 + }
1665 + },
1666 + "tunnel-agent": {
1667 + "version": "0.6.0",
1668 + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1669 + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1670 + "requires": {
1671 + "safe-buffer": "^5.0.1"
1672 + }
1673 + },
1674 + "tweetnacl": {
1675 + "version": "0.14.5",
1676 + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1677 + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
1678 + },
1679 + "type-fest": {
1680 + "version": "0.18.1",
1681 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
1682 + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw=="
1683 + },
1684 + "unique-filename": {
1685 + "version": "1.1.1",
1686 + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
1687 + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
1688 + "requires": {
1689 + "unique-slug": "^2.0.0"
1690 + }
1691 + },
1692 + "unique-slug": {
1693 + "version": "2.0.2",
1694 + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
1695 + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
1696 + "requires": {
1697 + "imurmurhash": "^0.1.4"
1698 + }
1699 + },
1700 + "uri-js": {
1701 + "version": "4.4.1",
1702 + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1703 + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1704 + "requires": {
1705 + "punycode": "^2.1.0"
1706 + }
1707 + },
1708 + "util-deprecate": {
1709 + "version": "1.0.2",
1710 + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1711 + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
1712 + },
1713 + "uuid": {
1714 + "version": "3.4.0",
1715 + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
1716 + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
1717 + },
1718 + "validate-npm-package-license": {
1719 + "version": "3.0.4",
1720 + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
1721 + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
1722 + "requires": {
1723 + "spdx-correct": "^3.0.0",
1724 + "spdx-expression-parse": "^3.0.0"
1725 + }
1726 + },
1727 + "verror": {
1728 + "version": "1.10.0",
1729 + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1730 + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1731 + "requires": {
1732 + "assert-plus": "^1.0.0",
1733 + "core-util-is": "1.0.2",
1734 + "extsprintf": "^1.2.0"
1735 + }
1736 + },
1737 + "which": {
1738 + "version": "2.0.2",
1739 + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1740 + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1741 + "requires": {
1742 + "isexe": "^2.0.0"
1743 + }
1744 + },
1745 + "wide-align": {
1746 + "version": "1.1.5",
1747 + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
1748 + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
1749 + "requires": {
1750 + "string-width": "^1.0.2 || 2 || 3 || 4"
1751 + }
1752 + },
1753 + "wrap-ansi": {
1754 + "version": "7.0.0",
1755 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
1756 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
1757 + "requires": {
1758 + "ansi-styles": "^4.0.0",
1759 + "string-width": "^4.1.0",
1760 + "strip-ansi": "^6.0.0"
1761 + }
1762 + },
1763 + "wrappy": {
1764 + "version": "1.0.2",
1765 + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1766 + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
1767 + },
1768 + "y18n": {
1769 + "version": "5.0.8",
1770 + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
1771 + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="
1772 + },
1773 + "yallist": {
1774 + "version": "4.0.0",
1775 + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
1776 + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
1777 + },
1778 + "yargs": {
1779 + "version": "17.5.0",
1780 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.5.0.tgz",
1781 + "integrity": "sha512-3sLxVhbAB5OC8qvVRebCLWuouhwh/rswsiDYx3WGxajUk/l4G20SKfrKKFeNIHboUFt2JFgv2yfn+5cgOr/t5A==",
1782 + "requires": {
1783 + "cliui": "^7.0.2",
1784 + "escalade": "^3.1.1",
1785 + "get-caller-file": "^2.0.5",
1786 + "require-directory": "^2.1.1",
1787 + "string-width": "^4.2.3",
1788 + "y18n": "^5.0.5",
1789 + "yargs-parser": "^21.0.0"
1790 + },
1791 + "dependencies": {
1792 + "yargs-parser": {
1793 + "version": "21.0.1",
1794 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz",
1795 + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg=="
1796 + }
1797 + }
1798 + },
1799 + "yargs-parser": {
1800 + "version": "20.2.9",
1801 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
1802 + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="
1803 + }
1804 + }
1805 +}
1 +Stack trace:
2 +Frame Function Args
3 +000005FF340 0018006286E (001802901B2, 0018026DE3E, 0000000005E, 000005FAEA0)
4 +000005FF340 0018004846A (00000000000, 00000000000, 7FFE00000000, 00000001000)
5 +000005FF340 001800484A2 (00000000000, 0000000005A, 0000000005E, 00000000000)
6 +000005FF340 001800D3E58 (00000000000, 00100000000, 0018026D9F2, 000005FBFEC)
7 +000005FF340 0018012C857 (00000000000, 00180223E20, 00180223E10, 000005FDDE0)
8 +000005FF340 001800488B4 (0018030F940, 000005FDDE0, 00000000000, 00000000000)
9 +000005FF340 0018004A01F (0007FFE0384, 00000000000, 00000000000, 00000000000)
10 +000005FF340 001800D4E98 (00000000000, 00000000000, 00000000000, 00000000000)
11 +000005FF5E0 7FFE062E9A1D (00180040000, 00000000001, 00000000000, 000005FF528)
12 +000005FF5E0 7FFE0633C1E7 (7FFE0630DB00, 000007F3901, 7FFE00000001, 00000000001)
13 +000005FF5E0 7FFE0633BF7A (000007F3900, 000005FF5E0, 000007F4270, 00000070000)
14 +000005FF5E0 7FFE0633C000 (00000000010, 00000000000, 7FFE06401A90, 000005FF678)
15 +00000000000 7FFE063A3C2A (00000000000, 00000000000, 00000000001, 00000000000)
16 +00000000000 7FFE06344CDB (7FFE062D0000, 00000000000, 00000347000, 00000000000)
17 +00000000000 7FFE06344B63 (00000000000, 00000000000, 00000000000, 00000000000)
18 +00000000000 7FFE06344B0E (00000000000, 00000000000, 00000000000, 00000000000)
19 +End of stack trace
This diff could not be displayed because it is too large.
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
6 "@testing-library/jest-dom": "^5.16.4", 6 "@testing-library/jest-dom": "^5.16.4",
7 "@testing-library/react": "^13.2.0", 7 "@testing-library/react": "^13.2.0",
8 "@testing-library/user-event": "^13.5.0", 8 "@testing-library/user-event": "^13.5.0",
9 + "axios": "^0.27.2",
9 "cors": "^2.8.5", 10 "cors": "^2.8.5",
10 "express": "^4.18.1", 11 "express": "^4.18.1",
11 "http-proxy-middleware": "^2.0.6", 12 "http-proxy-middleware": "^2.0.6",
...@@ -13,7 +14,12 @@ ...@@ -13,7 +14,12 @@
13 "nodemon": "^2.0.16", 14 "nodemon": "^2.0.16",
14 "react": "^18.1.0", 15 "react": "^18.1.0",
15 "react-dom": "^18.1.0", 16 "react-dom": "^18.1.0",
17 + "react-redux": "^8.0.2",
18 + "react-router-dom": "^6.3.0",
16 "react-scripts": "5.0.1", 19 "react-scripts": "5.0.1",
20 + "redux": "^4.1.2",
21 + "redux-promise-middleware": "^6.1.2",
22 + "redux-thunk": "^2.4.1",
17 "web-vitals": "^2.1.4" 23 "web-vitals": "^2.1.4"
18 }, 24 },
19 "scripts": { 25 "scripts": {
...@@ -39,5 +45,8 @@ ...@@ -39,5 +45,8 @@
39 "last 1 firefox version", 45 "last 1 firefox version",
40 "last 1 safari version" 46 "last 1 safari version"
41 ] 47 ]
48 + },
49 + "devDependencies": {
50 + "redux-devtools-extension": "^2.13.9"
42 } 51 }
43 } 52 }
......
1 -import logo from './logo.svg';
2 import './App.css'; 1 import './App.css';
2 +import RegisterPage from './component/views/RegisterPage/RegisterPage';
3 +import LoginPage from './component/views/LoginPage/LoginPage';
4 +import MainPage from './component/views/MainPage/MainPage';
5 +import RecommandPage from './component/views/RecommandPage/RecommandPage';
6 +import { Route, Routes } from 'react-router-dom';
7 +import WeatherPage from './component/views/WeatherPage/WeatherPage';
3 8
4 function App() { 9 function App() {
5 return ( 10 return (
6 - <div className="App"> 11 + <div>
7 - <header className="App-header"> 12 + <Routes>
8 - <img src={logo} className="App-logo" alt="logo" /> 13 + <Route exact path = "/login" element = {<LoginPage/>}/>
9 - <p> 14 + <Route exact path = "/" element = {<RegisterPage/>}/>
10 - Edit <code>src/App.js</code> and save to reload. 15 + <Route exact path = "/main" element = {<MainPage/>}/>
11 - </p> 16 + <Route exact path = "/weather" element = {<WeatherPage/>}/>
12 - <a 17 + <Route exact path = "/recommand" element = {<RecommandPage/>}/>
13 - className="App-link" 18 + </Routes>
14 - href="https://reactjs.org"
15 - target="_blank"
16 - rel="noopener noreferrer"
17 - >
18 - Learn React
19 - </a>
20 - </header>
21 </div> 19 </div>
22 ); 20 );
23 } 21 }
......
1 +import React, { useCallback, useEffect, useState } from "react";
2 +import { useDispatch, useSelector } from "react-redux";
3 +import { useNavigate } from "react-router-dom";
4 +import { login } from "../../../modules/user";
5 +import { address } from "../../../modules/weather";
6 +import "../style/LoginPage.scss"
7 +
8 +function LoginPage(props) {
9 + const dispatch = useDispatch();
10 + const navigate = useNavigate();
11 +
12 + const loginResult = useSelector((state) => state.user.loginData);
13 +
14 + const [Id, setId] = useState("");
15 + const [Password, setPassword] = useState("");
16 +
17 + const [checkLogin, setCheckLogin] = useState(false);
18 + const [checkIdError, setCheckIdError] = useState(false);
19 + const [checkPasswordError, setCheckPasswordError] = useState(false);
20 + const [checkLoginError, setCheckLoginError] = useState(false);
21 +
22 + const idRegex = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,14}$/;
23 + const passwordRegex = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-?])(?=.*[0-9]).{8,25}$/;
24 +
25 + useEffect(() => {
26 + if (checkLogin === true) {
27 + loginResult.then((result) => {
28 + if (result.loginSuccess === true) {
29 + alert('로그인에 성공하였습니다.');
30 + navigate('/main');
31 + }
32 + else {
33 + alert('로그인에 실패하였습니다.');
34 + }
35 + })
36 + }
37 + }, [loginResult])
38 +
39 + const onIdHandler = useCallback((event) => {
40 + setId(event.currentTarget.value);
41 +
42 + // 아이디 유효성 검사
43 + if (!idRegex.test(event.currentTarget.value)) {
44 + setCheckIdError(true);
45 + }
46 + else {
47 + setCheckIdError(false);
48 + }
49 +
50 + }, [checkIdError]);
51 +
52 + const onPasswordHandler = useCallback((event) => {
53 + setPassword(event.currentTarget.value);
54 +
55 + // 비밀번호 유효성 검사
56 + if (!passwordRegex.test(event.currentTarget.value)) {
57 + setCheckPasswordError(true);
58 + }
59 + else {
60 + setCheckPasswordError(false);
61 + }
62 + }, [checkPasswordError]);
63 +
64 + const onSubmitHandler = useCallback((event) => {
65 + event.preventDefault();
66 +
67 + if (checkIdError || Id === "") {
68 + setCheckLoginError(true);
69 + }
70 + else if (checkPasswordError || Password === "") {
71 + setCheckLoginError(true);
72 + }
73 + else {
74 + setCheckLoginError(false);
75 + }
76 +
77 + // login
78 + if (!checkLoginError) {
79 + const UserData = {
80 + id: Id,
81 + password: Password
82 + };
83 +
84 + dispatch(login(UserData));
85 + dispatch(address());
86 + setCheckLogin(true);
87 +
88 + }
89 +
90 + }, [checkIdError, checkPasswordError, Password, dispatch, loginResult]);
91 +
92 + return (
93 + <div id = "body">
94 + <div className="login-box">
95 + <h2>로그인</h2>
96 + <div className="input-area">
97 + <input
98 + placeholder="아이디"
99 + type="text"
100 + value={Id}
101 + onChange={onIdHandler}
102 + />
103 + </div>
104 + <div className="check-variable">
105 + {checkIdError && <div style={{color : 'red'}}>아이디는 6자리 이상 14자리 이하 소문자와 숫자로 입력해주세요.</div>}
106 + </div>
107 + <div className="input-area">
108 + <input
109 + placeholder="비밀번호"
110 + type="text"
111 + value={Password}
112 + onChange={onPasswordHandler}
113 + />
114 + </div>
115 + <div className="check-variable">
116 + {checkPasswordError && <div style={{color : 'red'}}>알파벳과 숫자, 특수문자를 포함하여 8자리 이상 입력해주세요.</div>}
117 + </div>
118 + <div className="btn-area" onClick={onSubmitHandler}>
119 + <button
120 + className="login-btn"
121 + >
122 + 로그인
123 + </button>
124 + </div>
125 + <div className="check-variable">
126 + {checkLoginError && <div style={{color : 'red'}}>정보를 제대로 입력해주세요.</div>}
127 + </div>
128 + </div>
129 + </div>
130 + );
131 +
132 +}
133 +
134 +export default LoginPage;
...\ No newline at end of file ...\ No newline at end of file
1 +import React, { useCallback, useEffect, useState } from "react";
2 +import { useDispatch, useSelector } from "react-redux";
3 +import { useNavigate } from "react-router-dom";
4 +import { logout } from "../../../modules/user";
5 +import { todayInformation, tommorrowInformation } from "../../../modules/weather";
6 +import "../style/MainPage.scss"
7 +
8 +function MainPage(props) {
9 +
10 + const dispatch = useDispatch();
11 + const navigate = useNavigate();
12 +
13 + const addressResult = useSelector((state) => state.weather.address);
14 + const user = useSelector((state) => state.user.loginData);
15 +
16 + //이름, 성별, 시구동주소
17 + const [Name, setName] = useState("");
18 + const [Sex, setSex] = useState("");
19 + const [CityAdd, setCityAdd] = useState("");
20 + const [GuAdd, setGuAdd] = useState("");
21 + const [DongAdd, setDongAdd] = useState("");
22 +
23 + // const [checkNameError, setCheckNameError] = useState(false);
24 + // const [checkSexError, setCheckSexError] = useState(true);
25 + const [checkCityAddError, setCheckCityAddError] = useState(true);
26 + const [checkGuAddError, setCheckGuAddError] = useState(true);
27 + const [checkDongAddError, setCheckDongAddError] = useState(true);
28 + const [checkSubmitError, setCheckSubmitError] = useState(false);
29 +
30 + const CityAddSelectList = ["시/도 선택", "강원도", "경기도", "경상북도", "경상남도", "광주광역시", "대구광역시", "대전광역시", "부산광역시", "서울특별시", "울산광역시", "인천광역시", "전라북도", "전라남도", "제주특별자치도", "충청북도", "충청남도"];
31 +
32 + const [GuAddSelectList, setGuAddselectList] = useState(["시/군/구 선택"]);
33 + const [DongAddSelectList, setDongAddselectList] = useState(["읍/면/동 선택"]);
34 +
35 + const [Time, setTime] = useState("00:00:00");
36 +
37 + const currentTime = () => {
38 + const date = new Date();
39 + const hours = String(date.getHours()).padStart(2, "0");
40 + const minutes = String(date.getMinutes()).padStart(2, "0");
41 + const seconds = String(date.getSeconds()).padStart(2, "0");
42 + setTime(hours+" : "+minutes+" : "+seconds);
43 + }
44 +
45 + const startTimer = () => {
46 + setInterval(currentTime, 1000)
47 + }
48 +
49 + startTimer()
50 +
51 + useEffect(() => {
52 + user.then((result) => {
53 + setName(result.logData.name);
54 + setSex(result.logData.gender);
55 + })
56 + }, [user])
57 +
58 + // 시/군/구 주소
59 + useEffect(() => {
60 + const tempList = [];
61 +
62 + addressResult.then((result) => {
63 +
64 + for (let i = 0; i < result.length; i++) {
65 + if (result[i].address1 === CityAdd) {
66 + if (tempList[tempList.length - 1] !== result[i].address2){
67 + tempList.push(result[i].address2);
68 + }
69 + }
70 + }
71 + tempList[0] = "시/군/구 선택";
72 + setGuAddselectList(tempList);
73 + setDongAddselectList(["읍/면/동 선택"]);
74 + });
75 + }, [CityAdd]);
76 +
77 + // 읍/면/동 주소
78 + useEffect(() => {
79 + const tempList = [];
80 +
81 + addressResult.then((result) => {
82 +
83 + for (let i = 0; i < result.length; i++) {
84 + if (result[i].address2 === GuAdd) {
85 + if ((tempList[tempList.length - 1] !== result[i].address3) && tempList[0] !== result[i].address3){
86 + tempList.push(result[i].address3);
87 + }
88 + }
89 + }
90 + tempList[0] = "읍/면/동 선택";
91 + setDongAddselectList(tempList);
92 + });
93 + }, [GuAdd]);
94 +
95 + const onCityAddhandler = useCallback((event) => {
96 + setCityAdd(event.currentTarget.value);
97 +
98 + if (event.currentTarget.value === "시/도 선택") {
99 + setCheckCityAddError(true);
100 + }
101 + else {
102 + setCheckCityAddError(false);
103 + }
104 + }, [checkCityAddError]);
105 +
106 + const onGuAddhandler = useCallback((event) => {
107 + setGuAdd(event.currentTarget.value);
108 +
109 + if (event.currentTarget.value === "시/군/구 선택") {
110 + setCheckGuAddError(true);
111 + }
112 + else {
113 + setCheckGuAddError(false);
114 + }
115 +
116 + }, [checkGuAddError]);
117 +
118 + const onDongAddhandler = useCallback((event) => {
119 + setDongAdd(event.currentTarget.value);
120 +
121 + if (event.currentTarget.value === "읍/면/동 선택") {
122 + setCheckDongAddError(true);
123 + }
124 + else {
125 + setCheckDongAddError(false);
126 + }
127 + }, [checkDongAddError]);
128 +
129 + const onClickTitle = useCallback((event) => {
130 + navigate('/main')
131 + })
132 +
133 + const onClickLogout = useCallback((event) => {
134 + dispatch(logout());
135 + navigate('/login');
136 + })
137 +
138 + const onClickRegister = useCallback((event) => {
139 + navigate('/');
140 + })
141 +
142 + const onSubmitHandler = useCallback((event) => { //제출 전 오류 확인 함수
143 + event.preventDefault(); //체크박스 미리 클릭 방지
144 +
145 + if (checkCityAddError || CityAdd === "") {
146 + setCheckSubmitError(true);
147 + }
148 + else if (checkGuAddError || GuAdd === "") {
149 + setCheckSubmitError(true);
150 + }
151 + else if (checkDongAddError || DongAdd === "") {
152 + setCheckSubmitError(true);
153 + }
154 + else {
155 + setCheckSubmitError(false);
156 + }
157 +
158 +
159 + if (!checkSubmitError) {
160 +
161 + addressResult.then((result) => {
162 + for (let i = 0; i<result.length; i++) {
163 +
164 + if (result[i].address1 === CityAdd && result[i].address2 === GuAdd && result[i].address3 === DongAdd) {
165 +
166 + const dotData = {
167 + address1 : CityAdd,
168 + address2 : GuAdd,
169 + address3 : DongAdd,
170 + dotX : result[i].dotX,
171 + dotY : result[i].dotY,
172 + }
173 +
174 + dispatch(todayInformation(dotData));
175 + dispatch(tommorrowInformation(dotData));
176 +
177 + navigate('/weather');
178 + break;
179 + }
180 + }
181 + })
182 + }
183 +
184 + }, [checkCityAddError, checkDongAddError, checkGuAddError, checkSubmitError, Name, Sex, CityAdd, GuAdd, DongAdd]);
185 +
186 + return (
187 + <>
188 + <dir id = "header">
189 + <dir className="header_title" onClick = {onClickTitle}>
190 + <h1>Weather_Briefing</h1>
191 + </dir>
192 + <dir className="header_choice_box">
193 + <button type="button" onClick = {onClickLogout}>Logout</button>
194 + <button type="button" onClick = {onClickRegister}>Register</button>
195 + </dir>
196 + </dir>
197 +
198 + <div id = "body">
199 + <div className="info-box">
200 + <p className="info">정보를 입력해주세요.</p>
201 + <div className="main-input-area" readOnly>
202 + <li>이름</li>
203 + <input
204 + placeholder={Name}
205 + type="text"
206 + value={Name}
207 + />
208 + </div>
209 + <hr/>
210 + <div className="main-input-area" readOnly>
211 + <li>성별</li>
212 + <p>남자</p>
213 + <input
214 + type="radio" //라디오 버튼 타입
215 + value = "0"
216 + checked = {Sex === "0"}
217 + />
218 + <p>여자</p>
219 + <input
220 + type="radio"
221 + value = "1"
222 + checked = {Sex === "1"}
223 + />
224 + </div>
225 + <hr/>
226 + <div className="main-input-area">
227 + <li>지역</li>
228 + <div className="CityAddSelect">
229 + <select onChange={onCityAddhandler} value={CityAdd}>
230 + {CityAddSelectList.map((item) => (
231 + <option value={item} key={item}>
232 + {item}
233 + </option>
234 + ))}
235 + </select>
236 + </div>
237 + <div className="GuAddSelect">
238 + <select onChange={onGuAddhandler} value={GuAdd}>
239 + {GuAddSelectList.map((item) => (
240 + <option value={item} key={item}>
241 + {item}
242 + </option>
243 + ))}
244 + </select>
245 + </div>
246 + <div className="DongAddSelect">
247 + <select onChange={onDongAddhandler} value={DongAdd}>
248 + {DongAddSelectList.map((item) => (
249 + <option value={item} key={CityAdd+GuAdd+item}>
250 + {item}
251 + </option>
252 + ))}
253 + </select>
254 + </div>
255 + </div>
256 + <hr/>
257 + <div className="main-btn-area" onClick={onSubmitHandler}>
258 + <button className="submit-btn">
259 + 날씨 정보
260 + </button>
261 + </div>
262 + <div className="main-check-variable">
263 + {checkSubmitError && <div style={{color : 'red'}}>정보를 제대로 입력해주세요.</div>}
264 + </div>
265 + </div>
266 + </div>
267 + </>
268 + );
269 +}
270 +
271 +export default MainPage;
...\ No newline at end of file ...\ No newline at end of file
1 +import React, { useCallback, useEffect, useState } from "react";
2 +import { useDispatch, useSelector } from "react-redux";
3 +import { useNavigate } from "react-router-dom";
4 +import { logout } from "../../../modules/user";
5 +import "../style/RecommandPage.scss"
6 +
7 +function RecommandPage(props) {
8 +
9 + const clothesResult = useSelector((state) => state.clothes.clothesRecommend);
10 +
11 + const [IsRain, setIsRain] = useState("");
12 + const [TopPath, setTopPath] = useState('');
13 + const [BottomPath, setBottomPath] = useState('');
14 +
15 + const dispatch = useDispatch();
16 +
17 + useEffect(() => {
18 + clothesResult.then((result) => {
19 +
20 + if (result.umbrella == 1) {
21 + setIsRain("비 예보가 있습니다. 우산을 꼭 챙겨주세요!");
22 + }
23 + else {
24 + setIsRain("비 예보가 없습니다!");
25 + }
26 +
27 + setTopPath(result.top);
28 + setBottomPath(result.bottom);
29 + })
30 + }, [clothesResult])
31 +
32 + const navigate = useNavigate();
33 +
34 + const onClickLogout = useCallback((event) => {
35 + dispatch(logout());
36 + navigate('/login');
37 + })
38 +
39 + const onClickRegister = useCallback((event) => {
40 + navigate('/');
41 + })
42 +
43 + const onClickTitle = useCallback((event) => {
44 + navigate('/main')
45 + })
46 +
47 + return (
48 + <>
49 + <dir id = "header">
50 + <dir className="header_title" onClick = {onClickTitle}>
51 + <h1>Weather_Briefing</h1>
52 + </dir>
53 + <dir className="header_choice_box">
54 + <button type="button" onClick={onClickLogout}>Logout</button>
55 + <button type="button" onClick={onClickRegister}>Register</button>
56 + </dir>
57 + </dir>
58 +
59 + <div id = "recommand_body">
60 + <dir className="fashion_recommand">
61 + <dir className="rainOrnot">{IsRain}</dir>
62 + <dir className="clothes">
63 + <dir className="Top">
64 + <h1>TOP</h1>
65 + <img src={TopPath} className='Top_Image' />
66 + </dir>
67 + <dir className="Bottom">
68 + <h1>BOTTOM</h1>
69 + <img src={BottomPath} className='Bottom_Image' />
70 + </dir>
71 + </dir>
72 + </dir>
73 + </div>
74 + </>
75 + );
76 +};
77 +
78 +export default RecommandPage;
79 +
1 +import React, { useCallback, useEffect, useState } from "react";
2 +import { register } from "../../../modules/user.js";
3 +import "../style/RegisterPage.scss";
4 +import { useDispatch, useSelector } from "react-redux";
5 +import { useNavigate } from "react-router-dom";
6 +
7 +function RegisterPage(props) {
8 + const dispatch = useDispatch();
9 + const navigate = useNavigate();
10 +
11 + const registerResult = useSelector((state) => state.user.registerSuccess);
12 +
13 + const [Name, setName] = useState("");
14 + const [Sex, setSex] = useState("");
15 + const [Id, setId] = useState("");
16 + const [Password, setPassword] = useState("");
17 + const [PasswordCheck, setPasswordCheck] = useState("");
18 + const [PasswordError, setPasswordError] = useState(false);
19 +
20 + const [checkRegister, setCheckRegister] = useState(false);
21 + const [checkNameError, setCheckNameError] = useState(false);
22 + const [checkSexError, setCheckSexError] = useState(true);
23 + const [checkIdError, setCheckIdError] = useState(false);
24 + const [checkPasswordError, setCheckPasswordError] = useState(false);
25 + const [checkRegisterError, setCheckRegisterError] = useState(false);
26 +
27 + const idRegex = /^(?=.*[a-zA-Z])(?=.*[0-9]).{6,14}$/;
28 + const passwordRegex = /^(?=.*[a-zA-Z])(?=.*[!@#$%^*+=-?])(?=.*[0-9]).{8,25}$/;
29 +
30 + useEffect(() => {
31 + if (checkRegister === true) {
32 + registerResult.then((result) => {
33 + if (result.registerSuccess === '1') {
34 + alert('회원 가입에 성공하였습니다.');
35 + navigate('/login');
36 + }
37 + else if (result.registerSuccess === '0') {
38 + alert('중복된 아이디가 존재합니다.');
39 + }
40 + else {
41 + alert('회원 가입에 실패하였습니다.');
42 + }
43 + })
44 + }
45 + }, [registerResult])
46 +
47 + const onIdHandler = useCallback((event) => {
48 + setId(event.currentTarget.value);
49 +
50 + // 아이디 유효성 검사
51 + if (!idRegex.test(event.currentTarget.value)) {
52 + setCheckIdError(true);
53 + }
54 + else {
55 + setCheckIdError(false);
56 + }
57 +
58 + }, [checkIdError]);
59 +
60 + const onNameHandler = useCallback((event) => {
61 + setName(event.currentTarget.value);
62 +
63 + // 이름 유효성 검사
64 + if (event.currentTarget.value.length < 2) {
65 + setCheckNameError(true);
66 + }
67 + else {
68 + setCheckNameError(false);
69 + }
70 + }, [checkNameError]);
71 +
72 + const onSexHandler = useCallback((event) => {
73 + setSex(event.currentTarget.value);
74 + setCheckSexError(false);
75 + }, [checkSexError]);
76 +
77 + const onPasswordHandler = useCallback((event) => {
78 + setPassword(event.currentTarget.value);
79 +
80 + // 비밀번호 유효성 검사
81 + if (!passwordRegex.test(event.currentTarget.value)) {
82 + setCheckPasswordError(true);
83 + }
84 + else {
85 + setCheckPasswordError(false);
86 + }
87 + }, [checkPasswordError]);
88 +
89 + const onClickLogIn = useCallback((event) => {
90 + navigate('../login');
91 + })
92 +
93 + const onPasswordCheckHandler = useCallback((event) => {
94 + //비밀번호를 입력할때마다 password 를 검증하는 함수
95 + setPasswordError(event.currentTarget.value !== Password);
96 + setPasswordCheck(event.currentTarget.value);
97 + }, [PasswordError]);
98 +
99 + const onSubmitHandler = useCallback((event) => {
100 + event.preventDefault();
101 +
102 + if (checkIdError || Id === "") {
103 + setCheckRegisterError(true);
104 + }
105 + else if (checkNameError || Name === "") {
106 + setCheckRegisterError(true);
107 + }
108 + else if (checkSexError || Sex === "") {
109 + setCheckRegisterError(true);
110 + }
111 + else if (checkPasswordError || Password === "") {
112 + setCheckRegisterError(true);
113 + }
114 + else if (Password !== PasswordCheck) {
115 + setCheckRegisterError(true);
116 + }
117 + else {
118 + setCheckRegisterError(false);
119 + }
120 +
121 + if (!checkRegisterError) {
122 + const UserData = {
123 + name: Name,
124 + id: Id,
125 + password: Password,
126 + gender: Sex,
127 + };
128 +
129 + // 액션생성함수
130 + dispatch(register(UserData));
131 + setCheckRegister(true);
132 +
133 + };
134 +
135 + }, [checkIdError, checkNameError, checkPasswordError, checkRegisterError, checkSexError, Password, PasswordCheck, Sex, dispatch, registerResult, checkRegister]);
136 +
137 + return (
138 + <>
139 + <div id="body">
140 + <div className="register-box">
141 + <h2>회원가입</h2>
142 + <div className="input-area">
143 + <input
144 + placeholder="이름"
145 + type="text"
146 + value={Name}
147 + onChange={onNameHandler}
148 + />
149 + </div>
150 + <div className="check-variable">
151 + {checkNameError && <div style={{ color: 'red' }}>이름을 두글자 이상 입력해 주세요.</div>}
152 + </div>
153 + <div className="input-area">
154 + <input
155 + placeholder="아이디"
156 + type="text"
157 + value={Id}
158 + onChange={onIdHandler}
159 + />
160 + </div>
161 + <div className="check-variable">
162 + {checkIdError && <div style={{ color: 'red' }}>아이디는 6자리 이상 14자리 이하 소문자와 숫자로 입력해주세요.</div>}
163 + </div>
164 + <div className="input-area">
165 + <input
166 + placeholder="비밀번호"
167 + type="text"
168 + value={Password}
169 + onChange={onPasswordHandler}
170 + />
171 + </div>
172 + <div className="check-variable">
173 + {checkPasswordError && <div style={{ color: 'red' }}>알파벳과 숫자, 특수문자를 포함하여 8자리 이상 입력해주세요.</div>}
174 + </div>
175 + <div className="input-area">
176 + <input
177 + placeholder="비밀번호 재입력"
178 + type="text"
179 + value={PasswordCheck}
180 + onChange={onPasswordCheckHandler}
181 + />
182 + </div>
183 + <div className="check-variable">
184 + {PasswordError && <div style={{ color: 'red' }}>비밀번호가 일치하지 않습니다.</div>}
185 + </div>
186 + <div className="input-area">
187 + <input
188 + type="radio"
189 + value="0"
190 + checked={Sex === "0"}
191 + onChange={onSexHandler}
192 + />
193 + <input
194 + type="radio"
195 + value="1"
196 + checked={Sex === "1"}
197 + onChange={onSexHandler}
198 + />
199 + </div>
200 + <div className="btn-area" onClick={onSubmitHandler}>
201 + <button
202 + className="register-btn"
203 + >
204 + 가입하기
205 + </button>
206 + </div>
207 + </div>
208 + {checkRegisterError && <div style={{ color: 'red' }}>정보를 제대로 입력해주세요.</div>}
209 + </div>
210 + </>
211 + );
212 +
213 +}
214 +
215 +export default RegisterPage;
...\ No newline at end of file ...\ No newline at end of file
1 +import React, { useCallback, useEffect, useState } from "react";
2 +import { useDispatch, useSelector } from "react-redux";
3 +import { useNavigate } from "react-router-dom";
4 +import { recommend } from "../../../modules/clothes";
5 +import { logout } from "../../../modules/user";
6 +import "../style/WeatherPage.scss"
7 +
8 +function WeatherPage(props) {
9 + const dispatch = useDispatch();
10 + const navigate = useNavigate();
11 + const user = useSelector((state) => state.user.loginData);
12 + const todayWeatherResult = useSelector((state) => state.weather.todayInformation);
13 + const tommorrowWeatherResult = useSelector((state) => state.weather.tommorrowInformation);
14 + const today = new Date();
15 + const detailWeather = [];
16 + let currentHour;
17 +
18 + const today_year = today.getFullYear();
19 + const today_month = today.getMonth();
20 + const today_date = today.getDate();
21 + const [todayHighTemperature, setTodayHighTemperature] = useState(-100);
22 + const [todayLowTemperature, setTodayLowTemperature] = useState(100);
23 + const [todayWeatherSymbol, setTodayWeatherSymbol] = useState('☀️');
24 + const [nowWeatherSymbol, setNowWeatherSymbol] = useState('');
25 + const [nowTemperature, setNowTemperature] = useState("");
26 + const [tommorrowHighTemperature, setTommorrowHighTemperature] = useState(-100);
27 + const [tommorrowLowTemperature, setTommorrowLowTemperature] = useState(100);
28 + const [tommorrowWeatherSymbol, setTommorrowWeatherSymbol] = useState('');
29 +
30 + const [cityAdd, setCityAdd] = useState('');
31 + const [guAdd, setGuAdd] = useState('');
32 + const [dongAdd, setDongAdd] = useState('');
33 + const [Time, setTime] = useState("00:00:00");
34 +
35 + let todayWeatherLevel = 0;
36 + let userGender;
37 +
38 + const currentTime = () => {
39 + const date = new Date();
40 + const hours = String(date.getHours()).padStart(2, "0");
41 + const minutes = String(date.getMinutes()).padStart(2, "0");
42 + const seconds = String(date.getSeconds()).padStart(2, "0");
43 + setTime(hours+" : "+minutes+" : "+seconds);
44 + }
45 +
46 + const startTimer = () => {
47 + setInterval(currentTime, 1000)
48 + }
49 +
50 + startTimer()
51 +
52 + useEffect(() => {
53 + todayWeatherResult.then((result) => {
54 + let highTemperature = -100;
55 + let lowTemperature = 100;
56 + let symbol = '';
57 +
58 + currentHour = Time[0] + Time[1];
59 +
60 + // 주소 설정
61 + setCityAdd(result[24].address1);
62 + setGuAdd(result[24].address2);
63 + setDongAdd(result[24].address3);
64 +
65 + for (let i = 0; i<24; i++) {
66 + if (i === 13) {
67 + if (result[i].weather === 0) {
68 + todayWeatherLevel = 0;
69 + }
70 + else if (result[i].weather === 1) {
71 + todayWeatherLevel = 1;
72 + }
73 + else if (result[i].weather === 2) {
74 + todayWeatherLevel = 2;
75 + }
76 + else if (result[i].weather === 3) {
77 + todayWeatherLevel = 3;
78 + }
79 + else if (result[i].weather === 4) {
80 + todayWeatherLevel = 4;
81 + }
82 +
83 + }
84 + // 세부 시간 정보
85 + if (i > Number(currentHour)) {
86 + if (result[i].rainPer >= 50) {
87 + symbol = '🌧️';
88 + setTodayWeatherSymbol('🌧️');
89 + }
90 + else if (i > 18 || i < 6) {
91 + symbol = '🌙';
92 + }
93 + else {
94 + symbol = '☀️';
95 + }
96 + const tempData = {
97 + time : result[i].time,
98 + temperature : result[i].temperature,
99 + symbol : symbol,
100 + }
101 + detailWeather.push(tempData);
102 + }
103 + // 현재 시간 정보 다루는 부분
104 + if (i === Number(currentHour)) {
105 + if (result[i].rainPer >= 50) {
106 + setNowWeatherSymbol('🌧️');
107 + }
108 + else if (i >= 18 || i < 6) {
109 + setNowWeatherSymbol('🌙');
110 + }
111 + else {
112 + setNowWeatherSymbol('☀️');
113 + }
114 +
115 + setNowTemperature(result[i].temperature);
116 + }
117 + // 하루 온도 정보 다루는 부분
118 + if (result[i].temperature < lowTemperature) {
119 + lowTemperature = result[i].temperature;
120 + }
121 + if (result[i].temperature > highTemperature) {
122 + highTemperature = result[i].temperature;
123 + }
124 + }
125 +
126 + setTodayHighTemperature(highTemperature);
127 + setTodayLowTemperature(lowTemperature);
128 + })
129 + }, [todayWeatherResult, Time])
130 +
131 + // 내일의 날씨
132 + useEffect(() => {
133 + tommorrowWeatherResult.then((result) => {
134 +
135 + let highTemperature = -100;
136 + let lowTemperature = 100;
137 + let symbol = '☀️';
138 +
139 + for (let i = 0; i < 24; i++) {
140 + // symbol 설정
141 + if (result[i].rainPer >= 50) {
142 + symbol = '🌧️';
143 + }
144 + // 내일 온도 정보 다루는 부분
145 + if (result[i].temperature < lowTemperature) {
146 + lowTemperature = result[i].temperature;
147 + }
148 + if (result[i].temperature > highTemperature) {
149 + highTemperature = result[i].temperature;
150 + }
151 + setTommorrowHighTemperature(highTemperature);
152 + setTommorrowLowTemperature(lowTemperature);
153 + setTommorrowWeatherSymbol(symbol);
154 + }
155 + })
156 + }, [tommorrowWeatherResult])
157 +
158 + // 유저 성별 정보
159 + useEffect(() => {
160 +
161 + user.then((result) => {
162 +
163 + if (result.logData.gender === '0') {
164 + userGender = 0;
165 + }
166 + else {
167 + userGender = 1;
168 + }
169 +
170 + });
171 + }, [user])
172 +
173 + const onClickLogout = useCallback((event) => {
174 + dispatch(logout());
175 + navigate('/login');
176 + })
177 +
178 + const onClickRegister = useCallback((event) => {
179 + navigate('/');
180 + })
181 +
182 + const onClickTitle = useCallback((event) => {
183 + navigate('/main')
184 + })
185 +
186 + const onSubmitHandler = useCallback((event) => {
187 + event.preventDefault(); //체크박스 미리 클릭 방지
188 +
189 + let isRain = 0;
190 +
191 + if (todayWeatherSymbol === '🌧️') {
192 + isRain = 1;
193 + }
194 +
195 + const sendData = {
196 + gender : userGender,
197 + weather : todayWeatherLevel,
198 + rain : isRain
199 + }
200 +
201 + dispatch(recommend(sendData));
202 + navigate('/recommand');
203 +
204 + }, [todayWeatherResult, user]);
205 +
206 + return (
207 + <>
208 + <dir id = "header">
209 + <dir className="header_title" onClick = {onClickTitle}>
210 + <h1>Weather_Briefing</h1>
211 + </dir>
212 + <dir className="header_choice_box">
213 + <button type="button" onClick = {onClickLogout}>Logout</button>
214 + <button type="button" onClick = {onClickRegister}>Register</button>
215 + </dir>
216 + </dir>
217 + <div id = "body">
218 + <div className="address">
219 + <p>{cityAdd} {guAdd} {dongAdd}</p>
220 + </div>
221 + <div className="today_weather">
222 + <div className="days">
223 + <h1>오늘의 날씨</h1>
224 + <h2 id="day">{today_year} {today_month + 1} {today_date}</h2>
225 + </div>
226 + <div className="today_now_weather_info">
227 + <h2>현재 온도</h2>
228 + <h1 id="present_do">{nowWeatherSymbol} {nowTemperature}</h1>
229 + </div>
230 + <div className="today_weather_info">
231 + <h2>전체 날씨</h2>
232 + <div className="today_whole_weather">
233 + <h1>{todayWeatherSymbol}</h1>
234 + <div className="today_whole_weather_temperature">
235 + <p>최고: {todayHighTemperature}</p>
236 + <p>최저: {todayLowTemperature}</p>
237 + </div>
238 + </div>
239 + </div>
240 + </div>
241 + <div className="tommorrow_weather">
242 + <div className="days">
243 + <h1>내일의 날씨</h1>
244 + <h2 id="day">{today_year} {today_month + 1} {today_date+1}</h2>
245 + </div>
246 + <div className="tommorrow_weather_info">
247 + <h2>날씨 정보</h2>
248 + <div className="tommorrow_whole_weather">
249 + <h1>{tommorrowWeatherSymbol}</h1>
250 + <div className="tommorrow_temperator">
251 + <p>최고: {tommorrowHighTemperature}</p>
252 + <p>최저: {tommorrowLowTemperature}</p>
253 + </div>
254 + </div>
255 +
256 + </div>
257 + </div>
258 + <div className="weather-btn-area" onClick={onSubmitHandler}>
259 + <button className="submit-btn">
260 + 추천
261 + </button>
262 + </div>
263 + </div>
264 + </>
265 + );
266 +}
267 +export default WeatherPage;
...\ No newline at end of file ...\ No newline at end of file
1 +* {
2 + margin: 0;
3 + padding: 0;
4 + box-sizing: border-box;
5 + background-color: rgb(245, 235, 223);
6 +}
7 +#body {
8 + display: flex;
9 + justify-content: center;
10 + align-items: center;
11 + border-top: 2px solid;
12 + border-bottom: 2px solid;
13 +
14 + .login-box {
15 + border: 2px solid;
16 + width: 35%;
17 + height: 60%;
18 + margin-top: 30px;
19 + margin-bottom: 30px;
20 + h2 {
21 + text-align: center;
22 + margin-top: 20px;
23 + margin-bottom: 20px;
24 + }
25 + }
26 + .input-area {
27 + display: flex;
28 + justify-content: center;
29 + align-items: center;
30 + margin-bottom: 5px;
31 +
32 + input {
33 + padding: 10px 0.1rem;
34 + background-color: rgb(255, 255, 255);
35 + }
36 + }
37 + .check-variable {
38 + display: flex;
39 + justify-content: center;
40 + align-items: center;
41 + margin-bottom: 5px;
42 + }
43 + .btn-area {
44 + display: flex;
45 + justify-content: center;
46 + margin-top: 30px;
47 + margin-bottom: 35px;
48 +
49 + button {
50 + width: 120px;
51 + height: 40px;
52 + font-size: large;
53 + font-weight: bold;
54 + background-color:rgb(255, 253, 238);
55 + cursor: pointer;
56 + }
57 + }
58 +}
1 +* {
2 + margin: 0;
3 + padding: 0;
4 + box-sizing: border-box;
5 + background-color: rgb(245, 235, 223);
6 + }
7 + #header {
8 + display: flex;
9 + position: fixed;
10 + justify-content: center;
11 + align-items: center;
12 + height: 15%;
13 + width: 100%;
14 + border-top: 2px solid;
15 + border-bottom: 2px solid;
16 +
17 + .header_clock {
18 + justify-content: left;
19 + align-items: left;
20 + width: 10%;
21 + height: 10%;
22 + h1{
23 + color:rgb(0, 0, 0);
24 + font-size: 15px;
25 + }
26 + }
27 +
28 + .header_title {
29 + display: flex;
30 + justify-content: center;
31 + align-items: center;
32 + margin-left: 300px;
33 + margin-right: 300px;
34 + h1 {
35 + font-size: 50px;
36 + font-family: 'Times New Roman', Times, serif;
37 + color: rgb(0, 0, 0);
38 + }
39 + }
40 + .header_choice_box {
41 + display: flex;
42 + justify-content: right;
43 + align-items: right;
44 + margin-right: 10x;
45 + }
46 + button {
47 + width: 70px;
48 + height: 25px;
49 + font-size: 15px;
50 + font-weight: bold;
51 + cursor: pointer;
52 + }
53 + }
54 +
55 + #body {
56 + display: flex;
57 + justify-content: center;
58 + align-items: center;
59 + border-top: 2px solid;
60 + border-bottom: 2px solid;
61 +
62 + .info-box {
63 + border: 2px solid;
64 + width: 55%;
65 + height: 100%;
66 + margin-top: 150px;
67 + margin-bottom: 30px;
68 + }
69 + hr {
70 + display: flex;
71 + justify-content: center;
72 + align-items: center;
73 + margin-top: 20px;
74 + margin-left: 100px;
75 + margin-right: 100px;
76 + }
77 + .info{
78 + display:flex;
79 + font-size: 30px;
80 + border: 2px solid rgb(225, 208, 134);
81 + background-color: rgb(242, 235, 130);
82 + color:rgb(255, 255, 255);
83 + justify-content: center;
84 + align-items: center;
85 + margin-top: 50px;
86 + margin-bottom: 50px;
87 + margin-left: 30%;
88 + margin-right: 30%;
89 + }
90 + .main-input-area {
91 + display: flex;
92 + justify-content: left;
93 + align-items: left;
94 + margin-top: 20px;
95 + margin-bottom: 15px;
96 + li{
97 + display:flex;
98 + font-size: 15px;
99 + color: gray;
100 + margin-left: 15%;
101 + margin-right: 10%;
102 + }
103 + p{
104 + display:flex;
105 + font-size: 15px;
106 + border: 2px dotted gray;
107 + margin-bottom: 5px;
108 + margin-left: 5%;
109 + }
110 + input {
111 + padding: 10px 2rem;
112 + background-color: rgb(255, 255, 255);
113 + margin-left: 50px;
114 + }
115 +
116 + select {
117 + padding: 10px 1.5rem;
118 + margin-right: 5px;
119 + background-color: rgb(255, 255, 255);
120 + }
121 + }
122 + .main-check-variable {
123 + display: flex;
124 + justify-content: center;
125 + align-items: center;
126 + margin-bottom: 5px;
127 + }
128 + .main-btn-area {
129 + display: flex;
130 + justify-content: center;
131 + margin-top: 60px;
132 + margin-bottom: 10px;
133 +
134 + button {
135 + width: 150px;
136 + height: 60px;
137 + font-size: 15px;
138 + font-weight: bold;
139 + background-color:rgb(255, 253, 238);
140 + cursor: pointer;
141 + }
142 + }
143 + }
144 +
...\ No newline at end of file ...\ No newline at end of file
1 +* {
2 + margin: 0;
3 + padding: 0;
4 + box-sizing: border-box;
5 + background-color: rgb(245, 235, 223);
6 + }
7 + img {
8 + width: 300px;
9 + height: 300px;
10 + object-fit: cover;
11 + }
12 +
13 + #header {
14 + display: flex;
15 + position: fixed;
16 + justify-content: center;
17 + align-items: center;
18 + height: 15%;
19 + width: 100%;
20 + border-top: 2px solid;
21 + border-bottom: 2px solid;
22 +
23 + .header_title {
24 + display: flex;
25 + justify-content: center;
26 + align-items: center;
27 + margin-left: 300px;
28 + margin-right: 300px;
29 + h1 {
30 + font-size: 50px;
31 + font-family: 'Times New Roman', Times, serif;
32 + color: rgb(0, 0, 0);
33 + }
34 + }
35 + .header_choice_box {
36 + display: flex;
37 + justify-content: right;
38 + align-items: right;
39 + margin-right: 10x;
40 + }
41 + button {
42 + width: 70px;
43 + height: 25px;
44 + font-size: 15px;
45 + font-weight: bold;
46 + cursor: pointer;
47 + }
48 + }
49 +
50 + #recommand_body {
51 + display: flex;
52 + justify-content: center;
53 + align-items: center;
54 + border-top: 2px solid;
55 + border-bottom: 2px solid;
56 +
57 + .fashion_recommand {
58 + border: 2px solid;
59 + width: 50%;
60 + height: 200%;
61 + margin-top: 150px;
62 + margin-bottom: 30px;
63 +
64 + .rainOrnot {
65 + display: flex;
66 + justify-content: center;
67 + align-items: center;
68 + margin-top: 20px;
69 + margin-left: 100px;
70 + margin-right: 100px;
71 + font-size :30px;
72 + font-weight: bold;
73 + }
74 + .clothes{
75 + display:flex;
76 + justify-content: space-between;
77 + align-items: space-between;
78 +
79 + .Top{
80 + display:flex;
81 + flex-wrap: wrap;
82 + flex-direction: column;
83 + font-size: 30px;
84 + border: 2px solid;
85 + color:rgb(0, 0, 0);
86 + justify-content: center;
87 + align-items: center;
88 + margin-top: 50px;
89 + margin-bottom: 50px;
90 + margin-left: 5%;
91 + margin-right: 1%;
92 + }
93 +
94 + .Bottom{
95 + display:flex;
96 + flex-wrap: wrap;
97 + flex-direction: column;
98 + font-size: 30px;
99 + border: 2px solid;
100 + color:rgb(0, 0, 0);
101 + justify-content: center;
102 + align-items: center;
103 + margin-top: 50px;
104 + margin-bottom: 50px;
105 + margin-left: 1%;
106 + margin-right: 5%;
107 + }
108 +
109 + .Head{
110 + display:flex;
111 + flex-wrap: wrap;
112 + flex-direction: column;
113 + font-size: 30px;
114 + border: 2px solid;
115 + color:rgb(0, 0, 0);
116 + justify-content: center;
117 + align-items: center;
118 + margin-top: 50px;
119 + margin-bottom: 50px;
120 + margin-left: 1%;
121 + margin-right: 1%;
122 + }
123 + .Shoes{
124 + display:flex;
125 + flex-wrap: wrap;
126 + flex-direction: column;
127 + font-size: 30px;
128 + border: 2px solid;
129 + color:rgb(0, 0, 0);
130 + justify-content: center;
131 + align-items: center;
132 + margin-top: 50px;
133 + margin-bottom: 50px;
134 + margin-left: 1%;
135 + margin-right: 1%;
136 + }
137 + }
138 + }
139 +}
140 +
...\ No newline at end of file ...\ No newline at end of file
1 +* {
2 + margin: 0;
3 + padding: 0;
4 + box-sizing: border-box;
5 + background-color: rgb(245, 235, 223);
6 +}
7 +
8 +#body {
9 + display: flex;
10 + justify-content: center;
11 + align-items: center;
12 + border-top: 2px solid;
13 + border-bottom: 2px solid;
14 +
15 + .register-box {
16 + border: 2px solid;
17 + width: 35%;
18 + height: 60%;
19 + margin-top: 30px;
20 + margin-bottom: 30px;
21 + h2 {
22 + text-align: center;
23 + margin-top: 20px;
24 + margin-bottom: 20px;
25 + }
26 + }
27 + .input-area {
28 + display: flex;
29 + justify-content: center;
30 + align-items: center;
31 + margin-bottom: 5px;
32 +
33 + input {
34 + padding: 10px 0.1rem;
35 + background-color: rgb(255, 255, 255);
36 + }
37 + }
38 + .check-variable {
39 + display: flex;
40 + justify-content: center;
41 + align-items: center;
42 + margin-bottom: 5px;
43 + }
44 + .btn-area {
45 + display: flex;
46 + justify-content: center;
47 + margin-top: 30px;
48 + margin-bottom: 35px;
49 +
50 + button {
51 + width: 120px;
52 + height: 40px;
53 + font-size: large;
54 + font-weight: bold;
55 + background-color:rgb(255, 253, 238);
56 + cursor: pointer;
57 + }
58 + }
59 +}
1 +#header {
2 + display: flex;
3 + position: fixed;
4 + justify-content: center;
5 + align-items: center;
6 + height: 15%;
7 + width: 100%;
8 + border-top: 2px solid;
9 + border-bottom: 2px solid;
10 +
11 + .header_title {
12 + display: flex;
13 + justify-content: center;
14 + align-items: center;
15 + margin-left: 300px;
16 + margin-right: 300px;
17 + cursor:pointer;
18 + h1 {
19 + font-size: 50px;
20 + font-family: 'Times New Roman', Times, serif;
21 + color: rgb(0, 0, 0);
22 + }
23 + }
24 + .header_choice_box {
25 + display: flex;
26 + justify-content: right;
27 + align-items: right;
28 + margin-right: 10x;
29 + }
30 + button {
31 + width: 70px;
32 + height: 25px;
33 + font-size: 15px;
34 + font-weight: bold;
35 + cursor: pointer;
36 + }
37 + }
38 +#body {
39 + display: flex;
40 + justify-content: center;
41 + align-items: center;
42 + flex-wrap: wrap;
43 + flex-direction: column;
44 + border-top: 2px solid;
45 + border-bottom: 2px solid;
46 + .address {
47 + display: flex;
48 + justify-content: center;
49 + align-items: center;
50 + margin-top: 150px;
51 + font-size: 30px;
52 + }
53 + .today_weather {
54 + display: flex;
55 + justify-content: center;
56 + align-items: center;
57 + border: 2px solid;
58 + width: 50%;
59 + margin-top: 30px;
60 + margin-bottom: 10px;
61 + .today_now_weather_info {
62 + display: flex;
63 + justify-content: center;
64 + align-items: center;
65 + flex-direction: column;
66 + margin-right: 30px;
67 + }
68 + .days {
69 + display: flex;
70 + justify-content: center;
71 + align-items: center;
72 + flex-wrap: wrap;
73 + flex-direction: column;
74 + margin-top: 25px;
75 + margin-bottom: 25px;
76 + margin-left: 15px;
77 + margin-right: 200px;
78 + }
79 + .today_whole_weather{
80 + display: flex;
81 + flex-direction: row;
82 + }
83 + }
84 +
85 + .tommorrow_weather {
86 + display: flex;
87 + justify-content: center;
88 + align-items: center;
89 + border: 2px solid;
90 + width: 50%;
91 + margin-top: 20px;
92 + margin-bottom: 20px;
93 + .days {
94 + display: flex;
95 + justify-content: center;
96 + align-items: center;
97 + flex-wrap: wrap;
98 + flex-direction: column;
99 + margin-top: 25px;
100 + margin-bottom: 25px;
101 + margin-left: 15px;
102 + margin-right: 200px;
103 + }
104 + .tommorrow_weather_info {
105 + display: flex;
106 + justify-content: center;
107 + align-items: center;
108 + flex-direction: column;
109 + margin-right: 30px;
110 + .tommorrow_whole_weather{
111 + display: flex;
112 + flex-direction: row;
113 + }
114 + }
115 + }
116 + .weather-btn-area {
117 + display: flex;
118 + justify-content: center;
119 + margin-top: 20px;
120 + margin-bottom: 10px;
121 +
122 + button {
123 + width: 150px;
124 + height: 60px;
125 + font-size: 15px;
126 + font-weight: bold;
127 + background-color:rgb(255, 253, 238);
128 + cursor: pointer;
129 + }
130 + }
131 + }
...\ No newline at end of file ...\ No newline at end of file
...@@ -2,13 +2,23 @@ import React from 'react'; ...@@ -2,13 +2,23 @@ import React from 'react';
2 import ReactDOM from 'react-dom/client'; 2 import ReactDOM from 'react-dom/client';
3 import './index.css'; 3 import './index.css';
4 import App from './App'; 4 import App from './App';
5 +import { Provider } from 'react-redux';
6 +import { applyMiddleware, createStore } from 'redux';
5 import reportWebVitals from './reportWebVitals'; 7 import reportWebVitals from './reportWebVitals';
8 +import { BrowserRouter } from 'react-router-dom';
9 +import rootReducer from './modules/Index';
10 +import { composeWithDevTools } from 'redux-devtools-extension';
11 +import ReduxThunk from 'redux-thunk';
12 +
13 +const store = createStore(rootReducer, composeWithDevTools(applyMiddleware(ReduxThunk)));
6 14
7 const root = ReactDOM.createRoot(document.getElementById('root')); 15 const root = ReactDOM.createRoot(document.getElementById('root'));
8 root.render( 16 root.render(
9 - <React.StrictMode> 17 + <Provider store={store}>
10 - <App /> 18 + <BrowserRouter>
11 - </React.StrictMode> 19 + <App />
20 + </BrowserRouter>
21 + </Provider>,
12 ); 22 );
13 23
14 // If you want to start measuring performance in your app, pass a function 24 // If you want to start measuring performance in your app, pass a function
......
1 +import { combineReducers } from "redux";
2 +import user from "./user.js";
3 +import weather from "./weather";
4 +import clothes from "./clothes";
5 +
6 +const rootReducer = combineReducers({
7 + user,
8 + weather,
9 + clothes,
10 +})
11 +
12 +export default rootReducer;
...\ No newline at end of file ...\ No newline at end of file
1 +import axios from "axios";
2 +
3 +const CLOTHES_RECOMMEND = 'weather/RECOMMEND';
4 +
5 +export function recommend(dataToSubmit) {
6 + const req = axios.post('http://localhost:4000/api/clothes', dataToSubmit)
7 + .then(res => res.data);
8 +
9 + return {
10 + type: CLOTHES_RECOMMEND,
11 + payload: req,
12 + }
13 +}
14 +
15 +export default function (state = {}, action) {
16 + switch (action.type) {
17 + case CLOTHES_RECOMMEND:
18 + return { ...state, clothesRecommend: action.payload };
19 + break;
20 + default:
21 + return state;
22 + }
23 +}
...\ No newline at end of file ...\ No newline at end of file
1 +import axios from 'axios';
2 +
3 +const USER_REGISTER = 'user/REGISTER';
4 +const USER_LOGIN = 'user/LOGIN';
5 +const USER_LOGOUT = 'user/LOGOUT';
6 +
7 +export function register (dataToSubmit) {
8 +
9 + const req = axios.post('http://localhost:4000/api/register', dataToSubmit)
10 + .then(res => res.data);
11 +
12 + return {
13 + type: USER_REGISTER,
14 + payload: req,
15 + }
16 +};
17 +
18 +export function login(dataToSubmit) {
19 + const req = axios.post('http://localhost:4000/api/login', dataToSubmit)
20 + .then(res => res.data);
21 +
22 + return {
23 + type: USER_LOGIN,
24 + payload: req,
25 + }
26 +};
27 +
28 +export function logout(dataToSubmit) {
29 + const req = axios.post('http://localhost:4000/api/logout', dataToSubmit)
30 + .then(res => res.data);
31 +
32 + return {
33 + type: USER_LOGOUT,
34 + }
35 + }
36 +
37 +export default function (state = {}, action) {
38 + switch (action.type) {
39 + case USER_REGISTER:
40 + return { ...state, registerSuccess: action.payload };
41 + break;
42 + case USER_LOGIN:
43 + return { ...state, loginData: action.payload };
44 + break;
45 + case USER_LOGOUT:
46 + return { ...state, loginData: action.payload };
47 + break;
48 + default:
49 + return state;
50 + }
51 +}
...\ No newline at end of file ...\ No newline at end of file
1 +import axios from "axios";
2 +
3 +const WEATHER_ADDRESS = 'weather/ADDRESS';
4 +const WEATHER_COORDINATE = 'weather/COORDINATE';
5 +const WEATHER_TODAY_INFORMATION = 'weather/TODAY_INFORMATION';
6 +const WEATHER_TOMMORROW_INFORMATION = 'weather/TOMMORROW_INFORMATION';
7 +
8 +export function address() {
9 + const req = axios.post('http://localhost:4000/api/address')
10 + .then(res => res.data);
11 +
12 + return {
13 + type: WEATHER_ADDRESS,
14 + payload: req,
15 + }
16 +}
17 +
18 +export function coordinate(dataToSubmit) {
19 +
20 + const req = axios.post('http://localhost:4000/api/cordinate', dataToSubmit)
21 + .then(res => res.data);
22 +
23 + return {
24 + type: WEATHER_COORDINATE,
25 + payload: req,
26 + }
27 +};
28 +
29 +export function todayInformation(dataToSubmit) {
30 + const req = axios.post('http://localhost:4000/api/weather', dataToSubmit)
31 + .then(res => res.data);
32 + return {
33 + type: WEATHER_TODAY_INFORMATION,
34 + payload: req,
35 + }
36 +};
37 +
38 +export function tommorrowInformation(dataToSubmit) {
39 + const req = axios.post('http://localhost:4000/api/tommorrow', dataToSubmit)
40 + .then(res => res.data);
41 + return {
42 + type: WEATHER_TOMMORROW_INFORMATION,
43 + payload: req,
44 + }
45 +};
46 +
47 +export default function (state = {}, action) {
48 + switch (action.type) {
49 + case WEATHER_ADDRESS:
50 + return { ...state, address: action.payload };
51 + break;
52 + case WEATHER_COORDINATE:
53 + return { ...state, dot: action.payload };
54 + break;
55 + case WEATHER_TODAY_INFORMATION:
56 + return { ...state, todayInformation: action.payload };
57 + break;
58 + case WEATHER_TOMMORROW_INFORMATION:
59 + return { ...state, tommorrowInformation: action.payload };
60 + break;
61 + default:
62 + return state;
63 + }
64 +}
...\ No newline at end of file ...\ No newline at end of file
1 +const { createProxyMiddleware } = require("http-proxy-middleware");
2 +
3 +module.exports = function(app) {
4 + app.use(
5 + createProxyMiddleware('/api', {
6 + target: 'http://localhost:4000', //접속하려는 서버의 루트 URL
7 + changeOrigin: true
8 + })
9 + );
10 +};
...\ No newline at end of file ...\ No newline at end of file