├── .gitignore
├── 1.구구단
├── Gugudan.html
├── WordRelay.html
└── like-button.html
├── 2.끝말잇기
└── WordRelay.html
├── 3.숫자야구
├── NumberBaseball.html
├── NumberBaseball.vue
├── main.js
├── package-lock.json
├── package.json
└── webpack.config.js
├── 4.반응속도체크
├── ResponseCheck.html
├── ResponseCheck.vue
├── main.js
├── package-lock.json
├── package.json
└── webpack.config.js
├── 5.가위바위보
├── RockScissorsPaper.html
├── RockScissorsPaper.vue
├── main.js
├── package-lock.json
├── package.json
└── webpack.config.js
├── 5000event.html
├── 5000event.js
├── 6.로또
├── LottoBall.vue
├── LottoGenerator.html
├── LottoGenerator.vue
├── main.js
├── package-lock.json
├── package.json
└── webpack.config.js
├── 7.틱택토
├── TableComponent.vue
├── TdComponent.vue
├── TicTacToe.html
├── TicTacToe.vue
├── TrComponent.vue
├── main.js
├── package-lock.json
├── package.json
└── webpack.config.js
├── 7.틱택토EventBus
├── EventBus.js
├── TableComponent.vue
├── TdComponent.vue
├── TicTacToe.html
├── TicTacToe.vue
├── TrComponent.vue
├── main.js
├── package-lock.json
├── package.json
└── webpack.config.js
├── 7.틱택토Vuex
├── TableComponent.vue
├── TdComponent.vue
├── TicTacToe.html
├── TicTacToe.vue
├── TrComponent.vue
├── main.js
├── package-lock.json
├── package.json
├── store.js
└── webpack.config.js
├── 8.지뢰찾기
├── MineForm.vue
├── MineSweeper.html
├── MineSweeper.vue
├── TableComponent.vue
├── main.js
├── package-lock.json
├── package.json
├── store.js
└── webpack.config.js
├── prepare
├── Gugudan.html
├── NumberBaseball.html
├── NumberBaseball.vue
├── WordRelay.html
├── like-button.html
├── main.js
├── package-lock.json
├── package.json
├── webpack.config.js
├── 가위바위보
│ ├── RSP.html
│ ├── RSP.vue
│ ├── main.js
│ ├── package-lock.json
│ ├── package.json
│ └── webpack.config.js
├── 로또
│ ├── Ball.vue
│ ├── Lotto.html
│ ├── Lotto.vue
│ ├── main.js
│ ├── package-lock.json
│ ├── package.json
│ └── webpack.config.js
├── 반응속도체크
│ ├── ResponseCheck.html
│ ├── ResponseCheck.vue
│ ├── main.js
│ ├── package-lock.json
│ ├── package.json
│ └── webpack.config.js
├── 지뢰찾기
│ ├── MineForm.vue
│ ├── MineSearch.html
│ ├── MineSearch.vue
│ ├── TableComponent.vue
│ ├── TdComponent.vue
│ ├── TrComponent.vue
│ ├── main.js
│ ├── package-lock.json
│ ├── package.json
│ ├── store.js
│ └── webpack.config.js
├── 틱택토
│ ├── TableComponent.vue
│ ├── TdComponent.vue
│ ├── TicTacToe.html
│ ├── TicTacToe.vue
│ ├── TrComponent.vue
│ ├── main.js
│ ├── package-lock.json
│ ├── package.json
│ └── webpack.config.js
└── 틱택토Vuex
│ ├── TableComponent.vue
│ ├── TdComponent.vue
│ ├── TicTacToe.html
│ ├── TicTacToe.vue
│ ├── TrComponent.vue
│ ├── main.js
│ ├── package-lock.json
│ ├── package.json
│ ├── store.js
│ └── webpack.config.js
└── vue-router
├── GameMatcher.vue
├── Router.html
├── Router.vue
├── main.js
├── package-lock.json
├── package.json
├── routes.js
└── webpack.config.js
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | dist
3 |
--------------------------------------------------------------------------------
/1.구구단/Gugudan.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 구구단
8 |
9 |
10 |
11 |
12 |
{{first}}곱하기 {{second}}는?
13 |
17 |
{{result}}
18 |
19 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/1.구구단/WordRelay.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 끝말잇기
8 |
9 |
10 |
11 |
12 |
{{word}}
13 |
17 |
{{result}}
18 |
19 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/1.구구단/like-button.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 좋아요
8 |
9 |
10 |
11 |
12 |
좋아요 눌렀음
13 |
14 |
15 |
16 |
29 |
30 |
--------------------------------------------------------------------------------
/2.끝말잇기/WordRelay.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 끝말잇기
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
53 |
58 |
59 |
60 |
--------------------------------------------------------------------------------
/3.숫자야구/NumberBaseball.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 숫자야구
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/3.숫자야구/NumberBaseball.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{result}}
4 |
8 |
시도: {{tries.length}}
9 |
10 | -
11 |
{{t.try}}
12 | {{t.result}}
13 |
14 |
15 |
16 |
17 |
18 |
81 |
82 |
85 |
--------------------------------------------------------------------------------
/3.숫자야구/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import NumberBaseball from './NumberBaseball';
3 |
4 | new Vue(NumberBaseball).$mount('#root');
5 |
--------------------------------------------------------------------------------
/3.숫자야구/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "number-baseball",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/eslint": {
8 | "version": "7.2.4",
9 | "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.4.tgz",
10 | "integrity": "sha512-YCY4kzHMsHoyKspQH+nwSe+70Kep7Vjt2X+dZe5Vs2vkRudqtoFoUIv1RlJmZB8Hbp7McneupoZij4PadxsK5Q==",
11 | "dev": true,
12 | "requires": {
13 | "@types/estree": "*",
14 | "@types/json-schema": "*"
15 | }
16 | },
17 | "@types/eslint-scope": {
18 | "version": "3.7.0",
19 | "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz",
20 | "integrity": "sha512-O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==",
21 | "dev": true,
22 | "requires": {
23 | "@types/eslint": "*",
24 | "@types/estree": "*"
25 | }
26 | },
27 | "@types/estree": {
28 | "version": "0.0.45",
29 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz",
30 | "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==",
31 | "dev": true
32 | },
33 | "@types/json-schema": {
34 | "version": "7.0.6",
35 | "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz",
36 | "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==",
37 | "dev": true
38 | },
39 | "@types/node": {
40 | "version": "14.14.6",
41 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.6.tgz",
42 | "integrity": "sha512-6QlRuqsQ/Ox/aJEQWBEJG7A9+u7oSYl3mem/K8IzxXG/kAGbV1YPD9Bg9Zw3vyxC/YP+zONKwy8hGkSt1jxFMw==",
43 | "dev": true
44 | },
45 | "@vue/component-compiler-utils": {
46 | "version": "3.2.0",
47 | "resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.0.tgz",
48 | "integrity": "sha512-lejBLa7xAMsfiZfNp7Kv51zOzifnb29FwdnMLa96z26kXErPFioSf9BMcePVIQ6/Gc6/mC0UrPpxAWIHyae0vw==",
49 | "dev": true,
50 | "requires": {
51 | "consolidate": "^0.15.1",
52 | "hash-sum": "^1.0.2",
53 | "lru-cache": "^4.1.2",
54 | "merge-source-map": "^1.1.0",
55 | "postcss": "^7.0.14",
56 | "postcss-selector-parser": "^6.0.2",
57 | "prettier": "^1.18.2",
58 | "source-map": "~0.6.1",
59 | "vue-template-es2015-compiler": "^1.9.0"
60 | },
61 | "dependencies": {
62 | "lru-cache": {
63 | "version": "4.1.5",
64 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
65 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
66 | "dev": true,
67 | "requires": {
68 | "pseudomap": "^1.0.2",
69 | "yallist": "^2.1.2"
70 | }
71 | },
72 | "source-map": {
73 | "version": "0.6.1",
74 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
75 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
76 | "dev": true
77 | },
78 | "yallist": {
79 | "version": "2.1.2",
80 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
81 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
82 | "dev": true
83 | }
84 | }
85 | },
86 | "@webassemblyjs/ast": {
87 | "version": "1.9.0",
88 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz",
89 | "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==",
90 | "dev": true,
91 | "requires": {
92 | "@webassemblyjs/helper-module-context": "1.9.0",
93 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
94 | "@webassemblyjs/wast-parser": "1.9.0"
95 | }
96 | },
97 | "@webassemblyjs/floating-point-hex-parser": {
98 | "version": "1.9.0",
99 | "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz",
100 | "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==",
101 | "dev": true
102 | },
103 | "@webassemblyjs/helper-api-error": {
104 | "version": "1.9.0",
105 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz",
106 | "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==",
107 | "dev": true
108 | },
109 | "@webassemblyjs/helper-buffer": {
110 | "version": "1.9.0",
111 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz",
112 | "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==",
113 | "dev": true
114 | },
115 | "@webassemblyjs/helper-code-frame": {
116 | "version": "1.9.0",
117 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz",
118 | "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==",
119 | "dev": true,
120 | "requires": {
121 | "@webassemblyjs/wast-printer": "1.9.0"
122 | }
123 | },
124 | "@webassemblyjs/helper-fsm": {
125 | "version": "1.9.0",
126 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz",
127 | "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==",
128 | "dev": true
129 | },
130 | "@webassemblyjs/helper-module-context": {
131 | "version": "1.9.0",
132 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz",
133 | "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==",
134 | "dev": true,
135 | "requires": {
136 | "@webassemblyjs/ast": "1.9.0"
137 | }
138 | },
139 | "@webassemblyjs/helper-wasm-bytecode": {
140 | "version": "1.9.0",
141 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
142 | "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==",
143 | "dev": true
144 | },
145 | "@webassemblyjs/helper-wasm-section": {
146 | "version": "1.9.0",
147 | "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz",
148 | "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==",
149 | "dev": true,
150 | "requires": {
151 | "@webassemblyjs/ast": "1.9.0",
152 | "@webassemblyjs/helper-buffer": "1.9.0",
153 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
154 | "@webassemblyjs/wasm-gen": "1.9.0"
155 | }
156 | },
157 | "@webassemblyjs/ieee754": {
158 | "version": "1.9.0",
159 | "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz",
160 | "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==",
161 | "dev": true,
162 | "requires": {
163 | "@xtuc/ieee754": "^1.2.0"
164 | }
165 | },
166 | "@webassemblyjs/leb128": {
167 | "version": "1.9.0",
168 | "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz",
169 | "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==",
170 | "dev": true,
171 | "requires": {
172 | "@xtuc/long": "4.2.2"
173 | }
174 | },
175 | "@webassemblyjs/utf8": {
176 | "version": "1.9.0",
177 | "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz",
178 | "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==",
179 | "dev": true
180 | },
181 | "@webassemblyjs/wasm-edit": {
182 | "version": "1.9.0",
183 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz",
184 | "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==",
185 | "dev": true,
186 | "requires": {
187 | "@webassemblyjs/ast": "1.9.0",
188 | "@webassemblyjs/helper-buffer": "1.9.0",
189 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
190 | "@webassemblyjs/helper-wasm-section": "1.9.0",
191 | "@webassemblyjs/wasm-gen": "1.9.0",
192 | "@webassemblyjs/wasm-opt": "1.9.0",
193 | "@webassemblyjs/wasm-parser": "1.9.0",
194 | "@webassemblyjs/wast-printer": "1.9.0"
195 | }
196 | },
197 | "@webassemblyjs/wasm-gen": {
198 | "version": "1.9.0",
199 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz",
200 | "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==",
201 | "dev": true,
202 | "requires": {
203 | "@webassemblyjs/ast": "1.9.0",
204 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
205 | "@webassemblyjs/ieee754": "1.9.0",
206 | "@webassemblyjs/leb128": "1.9.0",
207 | "@webassemblyjs/utf8": "1.9.0"
208 | }
209 | },
210 | "@webassemblyjs/wasm-opt": {
211 | "version": "1.9.0",
212 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz",
213 | "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==",
214 | "dev": true,
215 | "requires": {
216 | "@webassemblyjs/ast": "1.9.0",
217 | "@webassemblyjs/helper-buffer": "1.9.0",
218 | "@webassemblyjs/wasm-gen": "1.9.0",
219 | "@webassemblyjs/wasm-parser": "1.9.0"
220 | }
221 | },
222 | "@webassemblyjs/wasm-parser": {
223 | "version": "1.9.0",
224 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz",
225 | "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==",
226 | "dev": true,
227 | "requires": {
228 | "@webassemblyjs/ast": "1.9.0",
229 | "@webassemblyjs/helper-api-error": "1.9.0",
230 | "@webassemblyjs/helper-wasm-bytecode": "1.9.0",
231 | "@webassemblyjs/ieee754": "1.9.0",
232 | "@webassemblyjs/leb128": "1.9.0",
233 | "@webassemblyjs/utf8": "1.9.0"
234 | }
235 | },
236 | "@webassemblyjs/wast-parser": {
237 | "version": "1.9.0",
238 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz",
239 | "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==",
240 | "dev": true,
241 | "requires": {
242 | "@webassemblyjs/ast": "1.9.0",
243 | "@webassemblyjs/floating-point-hex-parser": "1.9.0",
244 | "@webassemblyjs/helper-api-error": "1.9.0",
245 | "@webassemblyjs/helper-code-frame": "1.9.0",
246 | "@webassemblyjs/helper-fsm": "1.9.0",
247 | "@xtuc/long": "4.2.2"
248 | }
249 | },
250 | "@webassemblyjs/wast-printer": {
251 | "version": "1.9.0",
252 | "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz",
253 | "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==",
254 | "dev": true,
255 | "requires": {
256 | "@webassemblyjs/ast": "1.9.0",
257 | "@webassemblyjs/wast-parser": "1.9.0",
258 | "@xtuc/long": "4.2.2"
259 | }
260 | },
261 | "@webpack-cli/info": {
262 | "version": "1.1.0",
263 | "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.1.0.tgz",
264 | "integrity": "sha512-uNWSdaYHc+f3LdIZNwhdhkjjLDDl3jP2+XBqAq9H8DjrJUvlOKdP8TNruy1yEaDfgpAIgbSAN7pye4FEHg9tYQ==",
265 | "dev": true,
266 | "requires": {
267 | "envinfo": "^7.7.3"
268 | }
269 | },
270 | "@webpack-cli/serve": {
271 | "version": "1.1.0",
272 | "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.1.0.tgz",
273 | "integrity": "sha512-7RfnMXCpJ/NThrhq4gYQYILB18xWyoQcBey81oIyVbmgbc6m5ZHHyFK+DyH7pLHJf0p14MxL4mTsoPAgBSTpIg==",
274 | "dev": true
275 | },
276 | "@xtuc/ieee754": {
277 | "version": "1.2.0",
278 | "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
279 | "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
280 | "dev": true
281 | },
282 | "@xtuc/long": {
283 | "version": "4.2.2",
284 | "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
285 | "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
286 | "dev": true
287 | },
288 | "acorn": {
289 | "version": "8.0.4",
290 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz",
291 | "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==",
292 | "dev": true
293 | },
294 | "ajv": {
295 | "version": "6.12.6",
296 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
297 | "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
298 | "dev": true,
299 | "requires": {
300 | "fast-deep-equal": "^3.1.1",
301 | "fast-json-stable-stringify": "^2.0.0",
302 | "json-schema-traverse": "^0.4.1",
303 | "uri-js": "^4.2.2"
304 | }
305 | },
306 | "ajv-keywords": {
307 | "version": "3.5.2",
308 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
309 | "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
310 | "dev": true
311 | },
312 | "ansi-colors": {
313 | "version": "4.1.1",
314 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
315 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
316 | "dev": true
317 | },
318 | "ansi-styles": {
319 | "version": "3.2.1",
320 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
321 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
322 | "dev": true,
323 | "requires": {
324 | "color-convert": "^1.9.0"
325 | }
326 | },
327 | "array-back": {
328 | "version": "4.0.1",
329 | "resolved": "https://registry.npmjs.org/array-back/-/array-back-4.0.1.tgz",
330 | "integrity": "sha512-Z/JnaVEXv+A9xabHzN43FiiiWEE7gPCRXMrVmRm00tWbjZRul1iHm7ECzlyNq1p4a4ATXz+G9FJ3GqGOkOV3fg==",
331 | "dev": true
332 | },
333 | "big.js": {
334 | "version": "5.2.2",
335 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
336 | "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
337 | "dev": true
338 | },
339 | "bluebird": {
340 | "version": "3.7.2",
341 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz",
342 | "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==",
343 | "dev": true
344 | },
345 | "browserslist": {
346 | "version": "4.14.6",
347 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.14.6.tgz",
348 | "integrity": "sha512-zeFYcUo85ENhc/zxHbiIp0LGzzTrE2Pv2JhxvS7kpUb9Q9D38kUX6Bie7pGutJ/5iF5rOxE7CepAuWD56xJ33A==",
349 | "dev": true,
350 | "requires": {
351 | "caniuse-lite": "^1.0.30001154",
352 | "electron-to-chromium": "^1.3.585",
353 | "escalade": "^3.1.1",
354 | "node-releases": "^1.1.65"
355 | }
356 | },
357 | "buffer-from": {
358 | "version": "1.1.1",
359 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
360 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
361 | "dev": true
362 | },
363 | "caniuse-lite": {
364 | "version": "1.0.30001156",
365 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001156.tgz",
366 | "integrity": "sha512-z7qztybA2eFZTB6Z3yvaQBIoJpQtsewRD74adw2UbRWwsRq3jIPvgrQGawBMbfafekQaD21FWuXNcywtTDGGCw==",
367 | "dev": true
368 | },
369 | "chalk": {
370 | "version": "2.4.2",
371 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
372 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
373 | "dev": true,
374 | "requires": {
375 | "ansi-styles": "^3.2.1",
376 | "escape-string-regexp": "^1.0.5",
377 | "supports-color": "^5.3.0"
378 | },
379 | "dependencies": {
380 | "supports-color": {
381 | "version": "5.5.0",
382 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
383 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
384 | "dev": true,
385 | "requires": {
386 | "has-flag": "^3.0.0"
387 | }
388 | }
389 | }
390 | },
391 | "chrome-trace-event": {
392 | "version": "1.0.2",
393 | "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz",
394 | "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==",
395 | "dev": true,
396 | "requires": {
397 | "tslib": "^1.9.0"
398 | }
399 | },
400 | "color-convert": {
401 | "version": "1.9.3",
402 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
403 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
404 | "dev": true,
405 | "requires": {
406 | "color-name": "1.1.3"
407 | }
408 | },
409 | "color-name": {
410 | "version": "1.1.3",
411 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
412 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
413 | "dev": true
414 | },
415 | "colorette": {
416 | "version": "1.2.1",
417 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
418 | "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
419 | "dev": true
420 | },
421 | "command-line-usage": {
422 | "version": "6.1.0",
423 | "resolved": "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.0.tgz",
424 | "integrity": "sha512-Ew1clU4pkUeo6AFVDFxCbnN7GIZfXl48HIOQeFQnkO3oOqvpI7wdqtLRwv9iOCZ/7A+z4csVZeiDdEcj8g6Wiw==",
425 | "dev": true,
426 | "requires": {
427 | "array-back": "^4.0.0",
428 | "chalk": "^2.4.2",
429 | "table-layout": "^1.0.0",
430 | "typical": "^5.2.0"
431 | }
432 | },
433 | "commander": {
434 | "version": "2.20.3",
435 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
436 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
437 | "dev": true
438 | },
439 | "consolidate": {
440 | "version": "0.15.1",
441 | "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.15.1.tgz",
442 | "integrity": "sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==",
443 | "dev": true,
444 | "requires": {
445 | "bluebird": "^3.1.1"
446 | }
447 | },
448 | "cross-spawn": {
449 | "version": "7.0.3",
450 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
451 | "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
452 | "dev": true,
453 | "requires": {
454 | "path-key": "^3.1.0",
455 | "shebang-command": "^2.0.0",
456 | "which": "^2.0.1"
457 | }
458 | },
459 | "cssesc": {
460 | "version": "3.0.0",
461 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
462 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
463 | "dev": true
464 | },
465 | "de-indent": {
466 | "version": "1.0.2",
467 | "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz",
468 | "integrity": "sha1-sgOOhG3DO6pXlhKNCAS0VbjB4h0=",
469 | "dev": true
470 | },
471 | "deep-extend": {
472 | "version": "0.6.0",
473 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
474 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
475 | "dev": true
476 | },
477 | "electron-to-chromium": {
478 | "version": "1.3.591",
479 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.591.tgz",
480 | "integrity": "sha512-ol/0WzjL4NS4Kqy9VD6xXQON91xIihDT36sYCew/G/bnd1v0/4D+kahp26JauQhgFUjrdva3kRSo7URcUmQ+qw==",
481 | "dev": true
482 | },
483 | "emojis-list": {
484 | "version": "3.0.0",
485 | "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
486 | "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
487 | "dev": true
488 | },
489 | "end-of-stream": {
490 | "version": "1.4.4",
491 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
492 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
493 | "dev": true,
494 | "requires": {
495 | "once": "^1.4.0"
496 | }
497 | },
498 | "enhanced-resolve": {
499 | "version": "5.3.1",
500 | "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.3.1.tgz",
501 | "integrity": "sha512-G1XD3MRGrGfNcf6Hg0LVZG7GIKcYkbfHa5QMxt1HDUTdYoXH0JR1xXyg+MaKLF73E9A27uWNVxvFivNRYeUB6w==",
502 | "dev": true,
503 | "requires": {
504 | "graceful-fs": "^4.2.4",
505 | "tapable": "^2.0.0"
506 | }
507 | },
508 | "enquirer": {
509 | "version": "2.3.6",
510 | "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
511 | "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
512 | "dev": true,
513 | "requires": {
514 | "ansi-colors": "^4.1.1"
515 | }
516 | },
517 | "envinfo": {
518 | "version": "7.7.3",
519 | "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.3.tgz",
520 | "integrity": "sha512-46+j5QxbPWza0PB1i15nZx0xQ4I/EfQxg9J8Had3b408SV63nEtor2e+oiY63amTo9KTuh2a3XLObNwduxYwwA==",
521 | "dev": true
522 | },
523 | "escalade": {
524 | "version": "3.1.1",
525 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
526 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
527 | "dev": true
528 | },
529 | "escape-string-regexp": {
530 | "version": "1.0.5",
531 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
532 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
533 | "dev": true
534 | },
535 | "eslint-scope": {
536 | "version": "5.1.1",
537 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
538 | "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
539 | "dev": true,
540 | "requires": {
541 | "esrecurse": "^4.3.0",
542 | "estraverse": "^4.1.1"
543 | }
544 | },
545 | "esrecurse": {
546 | "version": "4.3.0",
547 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
548 | "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
549 | "dev": true,
550 | "requires": {
551 | "estraverse": "^5.2.0"
552 | },
553 | "dependencies": {
554 | "estraverse": {
555 | "version": "5.2.0",
556 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
557 | "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
558 | "dev": true
559 | }
560 | }
561 | },
562 | "estraverse": {
563 | "version": "4.3.0",
564 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
565 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
566 | "dev": true
567 | },
568 | "events": {
569 | "version": "3.2.0",
570 | "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz",
571 | "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==",
572 | "dev": true
573 | },
574 | "execa": {
575 | "version": "4.1.0",
576 | "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
577 | "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==",
578 | "dev": true,
579 | "requires": {
580 | "cross-spawn": "^7.0.0",
581 | "get-stream": "^5.0.0",
582 | "human-signals": "^1.1.1",
583 | "is-stream": "^2.0.0",
584 | "merge-stream": "^2.0.0",
585 | "npm-run-path": "^4.0.0",
586 | "onetime": "^5.1.0",
587 | "signal-exit": "^3.0.2",
588 | "strip-final-newline": "^2.0.0"
589 | }
590 | },
591 | "fast-deep-equal": {
592 | "version": "3.1.3",
593 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
594 | "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
595 | "dev": true
596 | },
597 | "fast-json-stable-stringify": {
598 | "version": "2.1.0",
599 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
600 | "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
601 | "dev": true
602 | },
603 | "find-up": {
604 | "version": "4.1.0",
605 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
606 | "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
607 | "dev": true,
608 | "requires": {
609 | "locate-path": "^5.0.0",
610 | "path-exists": "^4.0.0"
611 | }
612 | },
613 | "function-bind": {
614 | "version": "1.1.1",
615 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
616 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
617 | "dev": true
618 | },
619 | "get-stream": {
620 | "version": "5.2.0",
621 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
622 | "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
623 | "dev": true,
624 | "requires": {
625 | "pump": "^3.0.0"
626 | }
627 | },
628 | "glob-to-regexp": {
629 | "version": "0.4.1",
630 | "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
631 | "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
632 | "dev": true
633 | },
634 | "graceful-fs": {
635 | "version": "4.2.4",
636 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
637 | "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
638 | "dev": true
639 | },
640 | "has": {
641 | "version": "1.0.3",
642 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
643 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
644 | "dev": true,
645 | "requires": {
646 | "function-bind": "^1.1.1"
647 | }
648 | },
649 | "has-flag": {
650 | "version": "3.0.0",
651 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
652 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
653 | "dev": true
654 | },
655 | "hash-sum": {
656 | "version": "1.0.2",
657 | "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
658 | "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
659 | "dev": true
660 | },
661 | "he": {
662 | "version": "1.2.0",
663 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
664 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
665 | "dev": true
666 | },
667 | "human-signals": {
668 | "version": "1.1.1",
669 | "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
670 | "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
671 | "dev": true
672 | },
673 | "import-local": {
674 | "version": "3.0.2",
675 | "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
676 | "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
677 | "dev": true,
678 | "requires": {
679 | "pkg-dir": "^4.2.0",
680 | "resolve-cwd": "^3.0.0"
681 | }
682 | },
683 | "indexes-of": {
684 | "version": "1.0.1",
685 | "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
686 | "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
687 | "dev": true
688 | },
689 | "interpret": {
690 | "version": "2.2.0",
691 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
692 | "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
693 | "dev": true
694 | },
695 | "is-core-module": {
696 | "version": "2.1.0",
697 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.1.0.tgz",
698 | "integrity": "sha512-YcV7BgVMRFRua2FqQzKtTDMz8iCuLEyGKjr70q8Zm1yy2qKcurbFEd79PAdHV77oL3NrAaOVQIbMmiHQCHB7ZA==",
699 | "dev": true,
700 | "requires": {
701 | "has": "^1.0.3"
702 | }
703 | },
704 | "is-stream": {
705 | "version": "2.0.0",
706 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
707 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
708 | "dev": true
709 | },
710 | "isexe": {
711 | "version": "2.0.0",
712 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
713 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
714 | "dev": true
715 | },
716 | "jest-worker": {
717 | "version": "26.6.2",
718 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
719 | "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
720 | "dev": true,
721 | "requires": {
722 | "@types/node": "*",
723 | "merge-stream": "^2.0.0",
724 | "supports-color": "^7.0.0"
725 | },
726 | "dependencies": {
727 | "has-flag": {
728 | "version": "4.0.0",
729 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
730 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
731 | "dev": true
732 | },
733 | "supports-color": {
734 | "version": "7.2.0",
735 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
736 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
737 | "dev": true,
738 | "requires": {
739 | "has-flag": "^4.0.0"
740 | }
741 | }
742 | }
743 | },
744 | "json-parse-better-errors": {
745 | "version": "1.0.2",
746 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
747 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
748 | "dev": true
749 | },
750 | "json-schema-traverse": {
751 | "version": "0.4.1",
752 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
753 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
754 | "dev": true
755 | },
756 | "json5": {
757 | "version": "1.0.1",
758 | "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
759 | "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
760 | "dev": true,
761 | "requires": {
762 | "minimist": "^1.2.0"
763 | }
764 | },
765 | "leven": {
766 | "version": "3.1.0",
767 | "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
768 | "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
769 | "dev": true
770 | },
771 | "loader-runner": {
772 | "version": "4.1.0",
773 | "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.1.0.tgz",
774 | "integrity": "sha512-oR4lB4WvwFoC70ocraKhn5nkKSs23t57h9udUgw8o0iH8hMXeEoRuUgfcvgUwAJ1ZpRqBvcou4N2SMvM1DwMrA==",
775 | "dev": true
776 | },
777 | "loader-utils": {
778 | "version": "1.4.0",
779 | "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz",
780 | "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==",
781 | "dev": true,
782 | "requires": {
783 | "big.js": "^5.2.2",
784 | "emojis-list": "^3.0.0",
785 | "json5": "^1.0.1"
786 | }
787 | },
788 | "locate-path": {
789 | "version": "5.0.0",
790 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
791 | "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
792 | "dev": true,
793 | "requires": {
794 | "p-locate": "^4.1.0"
795 | }
796 | },
797 | "lodash": {
798 | "version": "4.17.20",
799 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz",
800 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==",
801 | "dev": true
802 | },
803 | "merge-source-map": {
804 | "version": "1.1.0",
805 | "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
806 | "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
807 | "dev": true,
808 | "requires": {
809 | "source-map": "^0.6.1"
810 | },
811 | "dependencies": {
812 | "source-map": {
813 | "version": "0.6.1",
814 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
815 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
816 | "dev": true
817 | }
818 | }
819 | },
820 | "merge-stream": {
821 | "version": "2.0.0",
822 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
823 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
824 | "dev": true
825 | },
826 | "mime-db": {
827 | "version": "1.44.0",
828 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
829 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
830 | "dev": true
831 | },
832 | "mime-types": {
833 | "version": "2.1.27",
834 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
835 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
836 | "dev": true,
837 | "requires": {
838 | "mime-db": "1.44.0"
839 | }
840 | },
841 | "mimic-fn": {
842 | "version": "2.1.0",
843 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
844 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
845 | "dev": true
846 | },
847 | "minimist": {
848 | "version": "1.2.5",
849 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
850 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
851 | "dev": true
852 | },
853 | "neo-async": {
854 | "version": "2.6.2",
855 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
856 | "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
857 | "dev": true
858 | },
859 | "node-releases": {
860 | "version": "1.1.66",
861 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.66.tgz",
862 | "integrity": "sha512-JHEQ1iWPGK+38VLB2H9ef2otU4l8s3yAMt9Xf934r6+ojCYDMHPMqvCc9TnzfeFSP1QEOeU6YZEd3+De0LTCgg==",
863 | "dev": true
864 | },
865 | "npm-run-path": {
866 | "version": "4.0.1",
867 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
868 | "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
869 | "dev": true,
870 | "requires": {
871 | "path-key": "^3.0.0"
872 | }
873 | },
874 | "once": {
875 | "version": "1.4.0",
876 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
877 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
878 | "dev": true,
879 | "requires": {
880 | "wrappy": "1"
881 | }
882 | },
883 | "onetime": {
884 | "version": "5.1.2",
885 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
886 | "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
887 | "dev": true,
888 | "requires": {
889 | "mimic-fn": "^2.1.0"
890 | }
891 | },
892 | "p-limit": {
893 | "version": "2.3.0",
894 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
895 | "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
896 | "dev": true,
897 | "requires": {
898 | "p-try": "^2.0.0"
899 | }
900 | },
901 | "p-locate": {
902 | "version": "4.1.0",
903 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
904 | "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
905 | "dev": true,
906 | "requires": {
907 | "p-limit": "^2.2.0"
908 | }
909 | },
910 | "p-try": {
911 | "version": "2.2.0",
912 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
913 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
914 | "dev": true
915 | },
916 | "path-exists": {
917 | "version": "4.0.0",
918 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
919 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
920 | "dev": true
921 | },
922 | "path-key": {
923 | "version": "3.1.1",
924 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
925 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
926 | "dev": true
927 | },
928 | "path-parse": {
929 | "version": "1.0.6",
930 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
931 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
932 | "dev": true
933 | },
934 | "pkg-dir": {
935 | "version": "4.2.0",
936 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
937 | "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
938 | "dev": true,
939 | "requires": {
940 | "find-up": "^4.0.0"
941 | }
942 | },
943 | "postcss": {
944 | "version": "7.0.35",
945 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
946 | "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
947 | "dev": true,
948 | "requires": {
949 | "chalk": "^2.4.2",
950 | "source-map": "^0.6.1",
951 | "supports-color": "^6.1.0"
952 | },
953 | "dependencies": {
954 | "source-map": {
955 | "version": "0.6.1",
956 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
957 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
958 | "dev": true
959 | }
960 | }
961 | },
962 | "postcss-selector-parser": {
963 | "version": "6.0.4",
964 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.4.tgz",
965 | "integrity": "sha512-gjMeXBempyInaBqpp8gODmwZ52WaYsVOsfr4L4lDQ7n3ncD6mEyySiDtgzCT+NYC0mmeOLvtsF8iaEf0YT6dBw==",
966 | "dev": true,
967 | "requires": {
968 | "cssesc": "^3.0.0",
969 | "indexes-of": "^1.0.1",
970 | "uniq": "^1.0.1",
971 | "util-deprecate": "^1.0.2"
972 | }
973 | },
974 | "prettier": {
975 | "version": "1.19.1",
976 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
977 | "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
978 | "dev": true,
979 | "optional": true
980 | },
981 | "pseudomap": {
982 | "version": "1.0.2",
983 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
984 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
985 | "dev": true
986 | },
987 | "pump": {
988 | "version": "3.0.0",
989 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
990 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
991 | "dev": true,
992 | "requires": {
993 | "end-of-stream": "^1.1.0",
994 | "once": "^1.3.1"
995 | }
996 | },
997 | "punycode": {
998 | "version": "2.1.1",
999 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
1000 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
1001 | "dev": true
1002 | },
1003 | "randombytes": {
1004 | "version": "2.1.0",
1005 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
1006 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
1007 | "dev": true,
1008 | "requires": {
1009 | "safe-buffer": "^5.1.0"
1010 | }
1011 | },
1012 | "rechoir": {
1013 | "version": "0.7.0",
1014 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz",
1015 | "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==",
1016 | "dev": true,
1017 | "requires": {
1018 | "resolve": "^1.9.0"
1019 | }
1020 | },
1021 | "reduce-flatten": {
1022 | "version": "2.0.0",
1023 | "resolved": "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz",
1024 | "integrity": "sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==",
1025 | "dev": true
1026 | },
1027 | "resolve": {
1028 | "version": "1.18.1",
1029 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.18.1.tgz",
1030 | "integrity": "sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA==",
1031 | "dev": true,
1032 | "requires": {
1033 | "is-core-module": "^2.0.0",
1034 | "path-parse": "^1.0.6"
1035 | }
1036 | },
1037 | "resolve-cwd": {
1038 | "version": "3.0.0",
1039 | "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
1040 | "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
1041 | "dev": true,
1042 | "requires": {
1043 | "resolve-from": "^5.0.0"
1044 | }
1045 | },
1046 | "resolve-from": {
1047 | "version": "5.0.0",
1048 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
1049 | "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
1050 | "dev": true
1051 | },
1052 | "safe-buffer": {
1053 | "version": "5.2.1",
1054 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
1055 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
1056 | "dev": true
1057 | },
1058 | "schema-utils": {
1059 | "version": "3.0.0",
1060 | "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
1061 | "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
1062 | "dev": true,
1063 | "requires": {
1064 | "@types/json-schema": "^7.0.6",
1065 | "ajv": "^6.12.5",
1066 | "ajv-keywords": "^3.5.2"
1067 | }
1068 | },
1069 | "serialize-javascript": {
1070 | "version": "5.0.1",
1071 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
1072 | "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
1073 | "dev": true,
1074 | "requires": {
1075 | "randombytes": "^2.1.0"
1076 | }
1077 | },
1078 | "shebang-command": {
1079 | "version": "2.0.0",
1080 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
1081 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
1082 | "dev": true,
1083 | "requires": {
1084 | "shebang-regex": "^3.0.0"
1085 | }
1086 | },
1087 | "shebang-regex": {
1088 | "version": "3.0.0",
1089 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
1090 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
1091 | "dev": true
1092 | },
1093 | "signal-exit": {
1094 | "version": "3.0.3",
1095 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
1096 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
1097 | "dev": true
1098 | },
1099 | "source-list-map": {
1100 | "version": "2.0.1",
1101 | "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
1102 | "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
1103 | "dev": true
1104 | },
1105 | "source-map": {
1106 | "version": "0.6.1",
1107 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1108 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1109 | "dev": true
1110 | },
1111 | "source-map-support": {
1112 | "version": "0.5.19",
1113 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
1114 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
1115 | "dev": true,
1116 | "requires": {
1117 | "buffer-from": "^1.0.0",
1118 | "source-map": "^0.6.0"
1119 | }
1120 | },
1121 | "strip-final-newline": {
1122 | "version": "2.0.0",
1123 | "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
1124 | "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
1125 | "dev": true
1126 | },
1127 | "supports-color": {
1128 | "version": "6.1.0",
1129 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
1130 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
1131 | "dev": true,
1132 | "requires": {
1133 | "has-flag": "^3.0.0"
1134 | }
1135 | },
1136 | "table-layout": {
1137 | "version": "1.0.1",
1138 | "resolved": "https://registry.npmjs.org/table-layout/-/table-layout-1.0.1.tgz",
1139 | "integrity": "sha512-dEquqYNJiGwY7iPfZ3wbXDI944iqanTSchrACLL2nOB+1r+h1Nzu2eH+DuPPvWvm5Ry7iAPeFlgEtP5bIp5U7Q==",
1140 | "dev": true,
1141 | "requires": {
1142 | "array-back": "^4.0.1",
1143 | "deep-extend": "~0.6.0",
1144 | "typical": "^5.2.0",
1145 | "wordwrapjs": "^4.0.0"
1146 | }
1147 | },
1148 | "tapable": {
1149 | "version": "2.0.0",
1150 | "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.0.0.tgz",
1151 | "integrity": "sha512-bjzn0C0RWoffnNdTzNi7rNDhs1Zlwk2tRXgk8EiHKAOX1Mag3d6T0Y5zNa7l9CJ+EoUne/0UHdwS8tMbkh9zDg==",
1152 | "dev": true
1153 | },
1154 | "terser": {
1155 | "version": "5.3.8",
1156 | "resolved": "https://registry.npmjs.org/terser/-/terser-5.3.8.tgz",
1157 | "integrity": "sha512-zVotuHoIfnYjtlurOouTazciEfL7V38QMAOhGqpXDEg6yT13cF4+fEP9b0rrCEQTn+tT46uxgFsTZzhygk+CzQ==",
1158 | "dev": true,
1159 | "requires": {
1160 | "commander": "^2.20.0",
1161 | "source-map": "~0.7.2",
1162 | "source-map-support": "~0.5.19"
1163 | },
1164 | "dependencies": {
1165 | "source-map": {
1166 | "version": "0.7.3",
1167 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
1168 | "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
1169 | "dev": true
1170 | }
1171 | }
1172 | },
1173 | "terser-webpack-plugin": {
1174 | "version": "5.0.3",
1175 | "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.0.3.tgz",
1176 | "integrity": "sha512-zFdGk8Lh9ZJGPxxPE6jwysOlATWB8GMW8HcfGULWA/nPal+3VdATflQvSBSLQJRCmYZnfFJl6vkRTiwJGNgPiQ==",
1177 | "dev": true,
1178 | "requires": {
1179 | "jest-worker": "^26.6.1",
1180 | "p-limit": "^3.0.2",
1181 | "schema-utils": "^3.0.0",
1182 | "serialize-javascript": "^5.0.1",
1183 | "source-map": "^0.6.1",
1184 | "terser": "^5.3.8"
1185 | },
1186 | "dependencies": {
1187 | "p-limit": {
1188 | "version": "3.0.2",
1189 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz",
1190 | "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==",
1191 | "dev": true,
1192 | "requires": {
1193 | "p-try": "^2.0.0"
1194 | }
1195 | }
1196 | }
1197 | },
1198 | "tslib": {
1199 | "version": "1.14.1",
1200 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
1201 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
1202 | "dev": true
1203 | },
1204 | "typical": {
1205 | "version": "5.2.0",
1206 | "resolved": "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz",
1207 | "integrity": "sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==",
1208 | "dev": true
1209 | },
1210 | "uniq": {
1211 | "version": "1.0.1",
1212 | "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
1213 | "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
1214 | "dev": true
1215 | },
1216 | "uri-js": {
1217 | "version": "4.4.0",
1218 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.0.tgz",
1219 | "integrity": "sha512-B0yRTzYdUCCn9n+F4+Gh4yIDtMQcaJsmYBDsTSG8g/OejKBodLQ2IHfN3bM7jUsRXndopT7OIXWdYqc1fjmV6g==",
1220 | "dev": true,
1221 | "requires": {
1222 | "punycode": "^2.1.0"
1223 | }
1224 | },
1225 | "util-deprecate": {
1226 | "version": "1.0.2",
1227 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
1228 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
1229 | "dev": true
1230 | },
1231 | "v8-compile-cache": {
1232 | "version": "2.2.0",
1233 | "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz",
1234 | "integrity": "sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q==",
1235 | "dev": true
1236 | },
1237 | "vue": {
1238 | "version": "2.6.12",
1239 | "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.12.tgz",
1240 | "integrity": "sha512-uhmLFETqPPNyuLLbsKz6ioJ4q7AZHzD8ZVFNATNyICSZouqP2Sz0rotWQC8UNBF6VGSCs5abnKJoStA6JbCbfg=="
1241 | },
1242 | "vue-hot-reload-api": {
1243 | "version": "2.3.4",
1244 | "resolved": "https://registry.npmjs.org/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz",
1245 | "integrity": "sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==",
1246 | "dev": true
1247 | },
1248 | "vue-loader": {
1249 | "version": "15.9.5",
1250 | "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.5.tgz",
1251 | "integrity": "sha512-oeMOs2b5o5gRqkxfds10bCx6JeXYTwivRgbb8hzOrcThD2z1+GqEKE3EX9A2SGbsYDf4rXwRg6D5n1w0jO5SwA==",
1252 | "dev": true,
1253 | "requires": {
1254 | "@vue/component-compiler-utils": "^3.1.0",
1255 | "hash-sum": "^1.0.2",
1256 | "loader-utils": "^1.1.0",
1257 | "vue-hot-reload-api": "^2.3.0",
1258 | "vue-style-loader": "^4.1.0"
1259 | }
1260 | },
1261 | "vue-style-loader": {
1262 | "version": "4.1.2",
1263 | "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.2.tgz",
1264 | "integrity": "sha512-0ip8ge6Gzz/Bk0iHovU9XAUQaFt/G2B61bnWa2tCcqqdgfHs1lF9xXorFbE55Gmy92okFT+8bfmySuUOu13vxQ==",
1265 | "dev": true,
1266 | "requires": {
1267 | "hash-sum": "^1.0.2",
1268 | "loader-utils": "^1.0.2"
1269 | }
1270 | },
1271 | "vue-template-compiler": {
1272 | "version": "2.6.12",
1273 | "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.12.tgz",
1274 | "integrity": "sha512-OzzZ52zS41YUbkCBfdXShQTe69j1gQDZ9HIX8miuC9C3rBCk9wIRjLiZZLrmX9V+Ftq/YEyv1JaVr5Y/hNtByg==",
1275 | "dev": true,
1276 | "requires": {
1277 | "de-indent": "^1.0.2",
1278 | "he": "^1.1.0"
1279 | }
1280 | },
1281 | "vue-template-es2015-compiler": {
1282 | "version": "1.9.1",
1283 | "resolved": "https://registry.npmjs.org/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz",
1284 | "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
1285 | "dev": true
1286 | },
1287 | "watchpack": {
1288 | "version": "2.0.1",
1289 | "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.0.1.tgz",
1290 | "integrity": "sha512-vO8AKGX22ZRo6PiOFM9dC0re8IcKh8Kd/aH2zeqUc6w4/jBGlTy2P7fTC6ekT0NjVeGjgU2dGC5rNstKkeLEQg==",
1291 | "dev": true,
1292 | "requires": {
1293 | "glob-to-regexp": "^0.4.1",
1294 | "graceful-fs": "^4.1.2"
1295 | }
1296 | },
1297 | "webpack": {
1298 | "version": "5.4.0",
1299 | "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.4.0.tgz",
1300 | "integrity": "sha512-udpYTyqz8toTTdaOsL2QKPLeZLt2IEm9qY7yTXuFEQhKu5bk0yQD9BtAdVQksmz4jFbbWOiWmm3NHarO0zr/ng==",
1301 | "dev": true,
1302 | "requires": {
1303 | "@types/eslint-scope": "^3.7.0",
1304 | "@types/estree": "^0.0.45",
1305 | "@webassemblyjs/ast": "1.9.0",
1306 | "@webassemblyjs/helper-module-context": "1.9.0",
1307 | "@webassemblyjs/wasm-edit": "1.9.0",
1308 | "@webassemblyjs/wasm-parser": "1.9.0",
1309 | "acorn": "^8.0.4",
1310 | "browserslist": "^4.14.5",
1311 | "chrome-trace-event": "^1.0.2",
1312 | "enhanced-resolve": "^5.3.1",
1313 | "eslint-scope": "^5.1.1",
1314 | "events": "^3.2.0",
1315 | "glob-to-regexp": "^0.4.1",
1316 | "graceful-fs": "^4.2.4",
1317 | "json-parse-better-errors": "^1.0.2",
1318 | "loader-runner": "^4.1.0",
1319 | "mime-types": "^2.1.27",
1320 | "neo-async": "^2.6.2",
1321 | "pkg-dir": "^4.2.0",
1322 | "schema-utils": "^3.0.0",
1323 | "tapable": "^2.0.0",
1324 | "terser-webpack-plugin": "^5.0.3",
1325 | "watchpack": "^2.0.0",
1326 | "webpack-sources": "^2.1.1"
1327 | }
1328 | },
1329 | "webpack-cli": {
1330 | "version": "4.2.0",
1331 | "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.2.0.tgz",
1332 | "integrity": "sha512-EIl3k88vaF4fSxWSgtAQR+VwicfLMTZ9amQtqS4o+TDPW9HGaEpbFBbAZ4A3ZOT5SOnMxNOzROsSTPiE8tBJPA==",
1333 | "dev": true,
1334 | "requires": {
1335 | "@webpack-cli/info": "^1.1.0",
1336 | "@webpack-cli/serve": "^1.1.0",
1337 | "colorette": "^1.2.1",
1338 | "command-line-usage": "^6.1.0",
1339 | "commander": "^6.2.0",
1340 | "enquirer": "^2.3.6",
1341 | "execa": "^4.1.0",
1342 | "import-local": "^3.0.2",
1343 | "interpret": "^2.2.0",
1344 | "leven": "^3.1.0",
1345 | "rechoir": "^0.7.0",
1346 | "v8-compile-cache": "^2.2.0",
1347 | "webpack-merge": "^4.2.2"
1348 | },
1349 | "dependencies": {
1350 | "commander": {
1351 | "version": "6.2.0",
1352 | "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
1353 | "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==",
1354 | "dev": true
1355 | }
1356 | }
1357 | },
1358 | "webpack-merge": {
1359 | "version": "4.2.2",
1360 | "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.2.tgz",
1361 | "integrity": "sha512-TUE1UGoTX2Cd42j3krGYqObZbOD+xF7u28WB7tfUordytSjbWTIjK/8V0amkBfTYN4/pB/GIDlJZZ657BGG19g==",
1362 | "dev": true,
1363 | "requires": {
1364 | "lodash": "^4.17.15"
1365 | }
1366 | },
1367 | "webpack-sources": {
1368 | "version": "2.2.0",
1369 | "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz",
1370 | "integrity": "sha512-bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==",
1371 | "dev": true,
1372 | "requires": {
1373 | "source-list-map": "^2.0.1",
1374 | "source-map": "^0.6.1"
1375 | }
1376 | },
1377 | "which": {
1378 | "version": "2.0.2",
1379 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1380 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1381 | "dev": true,
1382 | "requires": {
1383 | "isexe": "^2.0.0"
1384 | }
1385 | },
1386 | "wordwrapjs": {
1387 | "version": "4.0.0",
1388 | "resolved": "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.0.tgz",
1389 | "integrity": "sha512-Svqw723a3R34KvsMgpjFBYCgNOSdcW3mQFK4wIfhGQhtaFVOJmdYoXgi63ne3dTlWgatVcUc7t4HtQ/+bUVIzQ==",
1390 | "dev": true,
1391 | "requires": {
1392 | "reduce-flatten": "^2.0.0",
1393 | "typical": "^5.0.0"
1394 | }
1395 | },
1396 | "wrappy": {
1397 | "version": "1.0.2",
1398 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1399 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1400 | "dev": true
1401 | }
1402 | }
1403 | }
1404 |
--------------------------------------------------------------------------------
/3.숫자야구/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "number-baseball",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "vue": "^2.6.12"
13 | },
14 | "devDependencies": {
15 | "vue-loader": "^15.9.5",
16 | "vue-template-compiler": "^2.6.12",
17 | "webpack": "^5.4.0",
18 | "webpack-cli": "^4.2.0"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/3.숫자야구/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main.js'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }],
18 | },
19 | plugins: [
20 | new VueLoaderPlugin(),
21 | ],
22 | output: {
23 | filename: '[name].js',
24 | path: path.join(__dirname, 'dist'),
25 | },
26 | };
27 |
--------------------------------------------------------------------------------
/4.반응속도체크/ResponseCheck.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 반응속도체크
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/4.반응속도체크/ResponseCheck.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{message}}
4 |
5 | 평균 시간: {{average}}ms
6 |
7 |
8 |
9 |
10 |
11 |
55 |
56 |
74 |
--------------------------------------------------------------------------------
/4.반응속도체크/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import ResponseCheck from './ResponseCheck';
3 |
4 | new Vue({
5 | render: createElement => createElement(ResponseCheck)
6 | }).$mount('#root');
7 |
--------------------------------------------------------------------------------
/4.반응속도체크/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack serve --hot --env development"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.12"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^6.6.0",
17 | "vue-loader": "^15.9.5",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.12",
20 | "webpack": "^5.4.0",
21 | "webpack-cli": "^4.2.0",
22 | "webpack-dev-server": "^4.7.4"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/4.반응속도체크/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main.js'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: {
24 | esModule: false,
25 | }
26 | },
27 | ]
28 | }],
29 | },
30 | plugins: [
31 | new VueLoaderPlugin(),
32 | ],
33 | output: {
34 | filename: '[name].js',
35 | path: path.join(__dirname, 'dist'),
36 | publicPath: '/dist/',
37 | },
38 | devServer: {
39 | devMiddleware: {publicPath: '/dist'},
40 | static: {directory: path.resolve(__dirname)},
41 | hot: true
42 | }
43 | };
44 |
--------------------------------------------------------------------------------
/5.가위바위보/RockScissorsPaper.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 가위바위보
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/5.가위바위보/RockScissorsPaper.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
{{result}}
10 |
현재 {{score}}점
11 |
12 |
13 |
14 |
108 |
109 |
116 |
--------------------------------------------------------------------------------
/5.가위바위보/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import RockScissorsPaper from './RockScissorsPaper';
3 |
4 | new Vue({
5 | render: createElement => createElement(RockScissorsPaper)
6 | }).$mount('#root');
7 |
--------------------------------------------------------------------------------
/5.가위바위보/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.12"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^4.2.2",
17 | "vue-loader": "^15.9.3",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.12",
20 | "webpack": "^4.44.1",
21 | "webpack-cli": "^3.3.12",
22 | "webpack-dev-server": "^3.11.0"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/5.가위바위보/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main.js'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: {
24 | esModule: false,
25 | }
26 | },
27 | ]
28 | }],
29 | },
30 | plugins: [
31 | new VueLoaderPlugin(),
32 | ],
33 | output: {
34 | filename: '[name].js',
35 | path: path.join(__dirname, 'dist'),
36 | publicPath: '/dist',
37 | },
38 | };
39 |
--------------------------------------------------------------------------------
/5000event.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | Document
8 |
9 |
10 |
11 |
12 |
13 |
--------------------------------------------------------------------------------
/5000event.js:
--------------------------------------------------------------------------------
1 | const list = [
2 | '고은산', '조민수', '나상민', '이원진', '원종운', '김정준', '이교은', '상원', '이예슬', '조성욱',
3 | ];
4 | const length = list.length;
5 | console.log(length);
6 | const fiveTimes = list.slice(0, Math.floor(length / 5));
7 | const twoTimes = list.slice(Math.floor(length / 5), Math.floor(length * 4 / 5));
8 | const oneTimes = list.slice(Math.floor(length * 4 / 5));
9 |
10 | const finalList = [...fiveTimes.slice(), ...fiveTimes.slice(), ...fiveTimes.slice(), ...fiveTimes.slice(), ...fiveTimes.slice(), ...twoTimes.slice(), ...twoTimes.slice(), ...oneTimes.slice()];
11 | console.log(finalList.length);
12 |
13 | const shuffle = [];
14 | while (finalList.length > 0) {
15 | shuffle.push(finalList.splice(Math.floor(Math.random() * finalList.length), 1)[0]);
16 | }
17 | let i = 0;
18 | setInterval(() => {
19 | console.log(i + 1, shuffle[i]);
20 | i++;
21 | }, 2000);
22 |
--------------------------------------------------------------------------------
/6.로또/LottoBall.vue:
--------------------------------------------------------------------------------
1 |
2 | {{number}}
3 |
4 |
5 |
32 |
33 |
46 |
--------------------------------------------------------------------------------
/6.로또/LottoGenerator.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 로또
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/6.로또/LottoGenerator.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
당첨 숫자
4 |
5 |
6 |
7 |
보너스
8 |
9 |
10 |
11 |
12 |
13 |
70 |
71 |
74 |
--------------------------------------------------------------------------------
/6.로또/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import LottoGenerator from './LottoGenerator';
3 |
4 | new Vue({
5 | render: createElement => createElement(LottoGenerator)
6 | }).$mount('#root');
7 |
--------------------------------------------------------------------------------
/6.로또/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^4.2.2",
17 | "vue-loader": "^15.7.0",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.10",
20 | "webpack": "^4.35.2",
21 | "webpack-cli": "^3.3.5",
22 | "webpack-dev-server": "^3.7.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/6.로또/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: {
24 | esModule: false,
25 | }
26 | },
27 | ]
28 | }],
29 | },
30 | plugins: [
31 | new VueLoaderPlugin(),
32 | ],
33 | output: {
34 | filename: '[name].js',
35 | path: path.join(__dirname, 'dist'),
36 | publicPath: '/dist',
37 | },
38 | };
39 |
--------------------------------------------------------------------------------
/7.틱택토/TableComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
19 |
--------------------------------------------------------------------------------
/7.틱택토/TdComponent.vue:
--------------------------------------------------------------------------------
1 |
2 | {{cellData}} |
3 |
4 |
5 |
59 |
--------------------------------------------------------------------------------
/7.틱택토/TicTacToe.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 틱택토
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/7.틱택토/TicTacToe.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{turn}}님의 턴입니다.
4 |
5 |
{{winner}}님의 승리!
6 |
7 |
8 |
9 |
35 |
36 |
47 |
--------------------------------------------------------------------------------
/7.틱택토/TrComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
7 |
8 |
26 |
--------------------------------------------------------------------------------
/7.틱택토/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import TicTacToe from './TicTacToe';
3 |
4 | new Vue(TicTacToe).$mount('#root');
5 |
--------------------------------------------------------------------------------
/7.틱택토/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.12"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^4.2.2",
17 | "vue-loader": "^15.9.6",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.12",
20 | "webpack": "^4.46.0",
21 | "webpack-cli": "^3.3.12",
22 | "webpack-dev-server": "^3.11.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/7.틱택토/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: {
24 | esModule: false,
25 | }
26 | },
27 | ]
28 | }],
29 | },
30 | plugins: [
31 | new VueLoaderPlugin(),
32 | ],
33 | output: {
34 | filename: '[name].js',
35 | path: path.join(__dirname, 'dist'),
36 | publicPath: '/dist',
37 | },
38 | };
39 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/EventBus.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | export default new Vue();
4 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/TableComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
19 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/TdComponent.vue:
--------------------------------------------------------------------------------
1 |
2 | {{cellData}} |
3 |
4 |
5 |
23 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/TicTacToe.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 틱택토
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/TicTacToe.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{turn}}님의 턴입니다.
4 |
5 |
{{winner}}님의 승리!
6 |
7 |
8 |
9 |
79 |
80 |
91 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/TrComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
5 |
6 |
7 |
8 |
26 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import TicTacToe from './TicTacToe';
3 |
4 | new Vue({
5 | render: createElement => createElement(TicTacToe)
6 | }).$mount('#root');
7 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^4.2.2",
17 | "vue-loader": "^15.7.0",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.10",
20 | "webpack": "^4.35.2",
21 | "webpack-cli": "^3.3.5",
22 | "webpack-dev-server": "^3.7.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/7.틱택토EventBus/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: {
24 | esModule: false,
25 | }
26 | },
27 | ]
28 | }],
29 | },
30 | plugins: [
31 | new VueLoaderPlugin(),
32 | ],
33 | output: {
34 | filename: '[name].js',
35 | path: path.join(__dirname, 'dist'),
36 | publicPath: '/dist',
37 | },
38 | };
39 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/TableComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
11 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/TdComponent.vue:
--------------------------------------------------------------------------------
1 |
2 | {{cellData}} |
3 |
4 |
5 |
37 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/TicTacToe.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 틱택토
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/TicTacToe.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{turn}}님의 턴입니다.
4 |
5 |
6 | {{cellData}} |
7 |
8 |
9 |
{{winner}}님의 승리!
10 |
11 |
12 |
13 |
84 |
85 |
96 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/TrComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
29 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import TicTacToe from './TicTacToe';
3 |
4 | new Vue({
5 | render: createElement => createElement(TicTacToe)
6 | }).$mount('#root');
7 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10",
14 | "vuex": "^3.1.1"
15 | },
16 | "devDependencies": {
17 | "css-loader": "^4.2.2",
18 | "vue-loader": "^15.7.0",
19 | "vue-style-loader": "^4.1.2",
20 | "vue-template-compiler": "^2.6.10",
21 | "webpack": "^4.35.2",
22 | "webpack-cli": "^3.3.5",
23 | "webpack-dev-server": "^3.7.2"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/store.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuex from 'vuex';
3 |
4 | Vue.use(Vuex); // this.$store
5 | // Vue.use(axios); // this.$axios
6 |
7 | export const SET_WINNER = 'SET_WINNER'; // import { SET_WINNER, CLICK_CELL, CHANGE_TURN } from './store';
8 | export const CLICK_CELL = 'CLICK_CELL';
9 | export const CHANGE_TURN = 'CHANGE_TURN';
10 | export const RESET_GAME = 'RESET_GAME';
11 | export const NO_WINNER = 'NO_WINNER';
12 |
13 | export default new Vuex.Store({ // import store from './store';
14 | state: {
15 | tableData: [
16 | ['', '', ''],
17 | ['', '', ''],
18 | ['', '', ''],
19 | ],
20 | turn: 'O',
21 | winner: '',
22 | }, // vue의 data와 비슷
23 | getters: {
24 | turnMessage(state) {
25 | return state.turn + '님이 승리하셨습니다.';
26 | },
27 | }, // vue의 computed와 비슷
28 | mutations: {
29 | [SET_WINNER](state, winner) {
30 | state.winner = winner;
31 | },
32 | [CLICK_CELL](state, { row, cell }) {
33 | Vue.set(state.tableData[row], cell, state.turn);
34 | },
35 | [CHANGE_TURN](state) {
36 | state.turn = state.turn === 'O' ? 'X' : 'O';
37 | },
38 | [RESET_GAME](state) {
39 | state.turn = 'O';
40 | state.tableData = [
41 | ['', '', ''],
42 | ['', '', ''],
43 | ['', '', ''],
44 | ];
45 | },
46 | [NO_WINNER](state) {
47 | state.winner = '';
48 | }
49 | }, // state를 수정할 때 사용해요. 동기적으로
50 | actions: {}, // 비동기를 사용할때, 또는 여러 뮤테이션을 연달아 실행할 때
51 | });
52 |
--------------------------------------------------------------------------------
/7.틱택토Vuex/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: {
24 | esModule: false,
25 | }
26 | },
27 | ]
28 | }],
29 | },
30 | plugins: [
31 | new VueLoaderPlugin(),
32 | ],
33 | output: {
34 | filename: '[name].js',
35 | path: path.join(__dirname, 'dist'),
36 | publicPath: '/dist',
37 | },
38 | };
39 |
--------------------------------------------------------------------------------
/8.지뢰찾기/MineForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
37 |
--------------------------------------------------------------------------------
/8.지뢰찾기/MineSweeper.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 지뢰찾기
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/8.지뢰찾기/MineSweeper.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
{{timer}}
5 |
6 |
{{result}}
7 |
8 |
9 |
10 |
43 |
44 |
55 |
--------------------------------------------------------------------------------
/8.지뢰찾기/TableComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
11 | {{cellDataText(rowIndex, cellIndex)}}
12 | |
13 |
14 |
15 |
16 |
17 |
112 |
--------------------------------------------------------------------------------
/8.지뢰찾기/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import MineSweeper from './MineSweeper';
3 |
4 | new Vue({
5 | render: createElement => createElement(MineSweeper)
6 | }).$mount('#root');
7 |
--------------------------------------------------------------------------------
/8.지뢰찾기/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10",
14 | "vuex": "^3.1.1"
15 | },
16 | "devDependencies": {
17 | "css-loader": "^4.2.2",
18 | "vue-loader": "^15.7.0",
19 | "vue-style-loader": "^4.1.2",
20 | "vue-template-compiler": "^2.6.10",
21 | "webpack": "^4.35.2",
22 | "webpack-cli": "^3.3.5",
23 | "webpack-dev-server": "^3.7.2"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/8.지뢰찾기/store.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuex from 'vuex';
3 |
4 | Vue.use(Vuex);
5 |
6 | export const START_GAME = 'START_GAME';
7 | export const OPEN_CELL = 'OPEN_CELL';
8 | export const CLICK_MINE = 'CLICK_MINE';
9 | export const FLAG_CELL = 'FLAG_CELL';
10 | export const QUESTION_CELL = 'QUESTION_CELL';
11 | export const NORMALIZE_CELL = 'NORMALIZE_CELL';
12 | export const INCREMENT_TIMER = 'INCREMENT_TIMER';
13 |
14 | export const CODE = {
15 | MINE: -7,
16 | NORMAL: -1,
17 | QUESTION: -2,
18 | FLAG: -3,
19 | QUESTION_MINE: -4,
20 | FLAG_MINE: -5,
21 | CLICKED_MINE: -6,
22 | OPENED: 0, // 0 이상이면 다 opened
23 | };
24 |
25 | const plantMine = (row, cell, mine) => {
26 | console.log(row, cell, mine);
27 | const candidate = Array(row * cell).fill().map((arr, i) => {
28 | return i;
29 | });
30 | const shuffle = [];
31 | while (candidate.length > row * cell - mine) {
32 | const chosen = candidate.splice(Math.floor(Math.random() * candidate.length), 1)[0];
33 | shuffle.push(chosen);
34 | }
35 | const data = [];
36 | for (let i = 0; i < row; i++) {
37 | const rowData = [];
38 | data.push(rowData);
39 | for (let j = 0; j < cell; j++) {
40 | rowData.push(CODE.NORMAL);
41 | }
42 | }
43 |
44 | for (let k = 0; k < shuffle.length; k++) {
45 | const ver = Math.floor(shuffle[k] / cell);
46 | const hor = shuffle[k] % cell;
47 | data[ver][hor] = CODE.MINE;
48 | }
49 |
50 | console.log(data);
51 | return data;
52 | };
53 |
54 | export default new Vuex.Store({ // import store from './store';
55 | state: {
56 | tableData: [],
57 | data: {
58 | row: 0,
59 | cell: 0,
60 | mine: 0,
61 | },
62 | timer: 0,
63 | halted: true, // 중단된
64 | result: '',
65 | openedCount: 0,
66 | }, // vue의 data와 비슷
67 | getters: {
68 |
69 | }, // vue의 computed와 비슷
70 | mutations: {
71 | [START_GAME](state, { row, cell, mine }) {
72 | state.data = {
73 | row,
74 | cell,
75 | mine,
76 | };
77 | state.tableData = plantMine(row, cell, mine);
78 | state.timer = 0;
79 | state.halted = false;
80 | state.openedCount = 0;
81 | state.result = '';
82 | },
83 | [OPEN_CELL](state, { row, cell }) {
84 | let openedCount = 0;
85 | const checked = [];
86 | function checkAround(row, cell) { // 주변 8칸 지뢰인지 검색
87 | const checkRowOrCellIsUndefined = row < 0 || row >= state.tableData.length || cell < 0 || cell >= state.tableData[0].length;
88 | if (checkRowOrCellIsUndefined) {
89 | return;
90 | }
91 | if ([CODE.OPENED, CODE.FLAG, CODE.FLAG_MINE, CODE.QUESTION_MINE, CODE.QUESTION].includes(state.tableData[row][cell])) {
92 | return;
93 | }
94 | if (checked.includes(row + '/' + cell)) {
95 | return;
96 | } else {
97 | checked.push(row + '/' + cell);
98 | }
99 | let around = [];
100 | if (state.tableData[row - 1]) {
101 | around = around.concat([
102 | state.tableData[row - 1][cell - 1], state.tableData[row - 1][cell], state.tableData[row - 1][cell + 1]
103 | ]);
104 | }
105 | around = around.concat([
106 | state.tableData[row][cell - 1], state.tableData[row][cell + 1]
107 | ]);
108 | if (state.tableData[row + 1]) {
109 | around = around.concat([
110 | state.tableData[row + 1][cell - 1], state.tableData[row + 1][cell], state.tableData[row + 1][cell + 1]
111 | ]);
112 | }
113 | const counted = around.filter(function(v) {
114 | return [CODE.MINE, CODE.FLAG_MINE, CODE.QUESTION_MINE].includes(v);
115 | });
116 | if (counted.length === 0 && row > -1) { // 주변칸에 지뢰가 하나도 없으면
117 | const near = [];
118 | if (row - 1 > -1) {
119 | near.push([row - 1, cell - 1]);
120 | near.push([row - 1, cell]);
121 | near.push([row - 1, cell + 1]);
122 | }
123 | near.push([row, cell - 1]);
124 | near.push([row, cell + 1]);
125 | if (row + 1 < state.tableData.length) {
126 | near.push([row + 1, cell - 1]);
127 | near.push([row + 1, cell]);
128 | near.push([row + 1, cell + 1]);
129 | }
130 | near.forEach((n) => {
131 | if (state.tableData[n[0]][n[1]] !== CODE.OPENED) {
132 | checkAround(n[0], n[1]);
133 | }
134 | });
135 | }
136 | if (state.tableData[row][cell] === CODE.NORMAL) {
137 | openedCount += 1;
138 | }
139 | Vue.set(state.tableData[row], cell, counted.length);
140 | }
141 | checkAround(row, cell);
142 | let halted = false;
143 | let result = '';
144 | if (state.data.row * state.data.cell - state.data.mine === state.openedCount + openedCount) {
145 | halted = true;
146 | result = `${state.timer}초만에 승리하셨습니다.`;
147 | }
148 | state.openedCount += openedCount;
149 | state.halted = halted;
150 | state.result = result;
151 | },
152 | [CLICK_MINE](state, { row, cell }) {
153 | state.halted = true;
154 | Vue.set(state.tableData[row], cell, CODE.CLICKED_MINE);
155 | },
156 | [FLAG_CELL](state, { row, cell }) {
157 | if (state.tableData[row][cell] === CODE.MINE) {
158 | Vue.set(state.tableData[row], cell, CODE.FLAG_MINE);
159 | } else {
160 | Vue.set(state.tableData[row], cell, CODE.FLAG);
161 | }
162 | },
163 | [QUESTION_CELL](state, { row, cell }) {
164 | if (state.tableData[row][cell] === CODE.FLAG_MINE) {
165 | Vue.set(state.tableData[row], cell, CODE.QUESTION_MINE);
166 | } else {
167 | Vue.set(state.tableData[row], cell, CODE.QUESTION);
168 | }
169 | },
170 | [NORMALIZE_CELL](state, { row, cell }) {
171 | if (state.tableData[row][cell] === CODE.QUESTION_MINE) {
172 | Vue.set(state.tableData[row], cell, CODE.MINE);
173 | } else {
174 | Vue.set(state.tableData[row], cell, CODE.NORMAL);
175 | }
176 | },
177 | [INCREMENT_TIMER](state) {
178 | state.timer += 1;
179 | },
180 | }, // state를 수정할 때 사용해요. 동기적으로
181 | });
182 |
--------------------------------------------------------------------------------
/8.지뢰찾기/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: {
24 | esModule: false,
25 | }
26 | },
27 | ]
28 | }],
29 | },
30 | plugins: [
31 | new VueLoaderPlugin(),
32 | ],
33 | output: {
34 | filename: '[name].js',
35 | path: path.join(__dirname, 'dist'),
36 | publicPath: '/dist',
37 | },
38 | };
39 |
--------------------------------------------------------------------------------
/prepare/Gugudan.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 구구단
8 |
9 |
10 |
11 |
12 |
{{first}} 곱하기 {{second}}는?
13 |
17 |
{{result}}
18 |
19 |
46 |
47 |
48 |
--------------------------------------------------------------------------------
/prepare/NumberBaseball.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 숫자야구
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/prepare/NumberBaseball.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{result}}
4 |
8 |
시도: {{tries.length}}
9 |
10 | -
11 |
{{t.try}}
12 | {{t.result}}
13 |
14 |
15 |
16 |
17 |
82 |
85 |
--------------------------------------------------------------------------------
/prepare/WordRelay.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 끝말잇기
8 |
9 |
10 |
11 |
12 |
13 |
14 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/prepare/like-button.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 좋아요
8 |
9 |
10 |
11 |
12 |
You liked this
13 |
14 |
15 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/prepare/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | import NumberBaseball from './NumberBaseball';
4 |
5 | new Vue({
6 | render: createElement => createElement(NumberBaseball)
7 | }).$mount('#root');
8 |
--------------------------------------------------------------------------------
/prepare/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "prepare",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "dev": "webpack"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10"
14 | },
15 | "devDependencies": {
16 | "vue-loader": "^15.7.0",
17 | "vue-template-compiler": "^2.6.10",
18 | "webpack": "^4.35.0",
19 | "webpack-cli": "^3.3.5",
20 | "webpack-dev-server": "^3.7.2"
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/prepare/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | devtool: 'eval',
6 | mode: 'development',
7 | resolve: {
8 | extensions: ['.vue', '.js'],
9 | alias: {
10 | vue: 'vue/dist/vue.js'
11 | }
12 | },
13 | entry: {
14 | app: [path.join(__dirname, 'App.vue')],
15 | },
16 | module: {
17 | rules: [{
18 | test: /\.vue$/,
19 | loader: 'vue-loader',
20 | }],
21 | },
22 | plugins: [
23 | new VueLoaderPlugin(),
24 | ],
25 | output: {
26 | filename: 'app.js',
27 | path: path.join(__dirname, 'dist'),
28 | },
29 | };
30 |
--------------------------------------------------------------------------------
/prepare/가위바위보/RSP.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 가위바위보
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/prepare/가위바위보/RSP.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
{{result}}
10 |
현재 {{score}}점
11 |
12 |
13 |
83 |
90 |
--------------------------------------------------------------------------------
/prepare/가위바위보/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | import RSP from './RSP';
4 |
5 | new Vue(RSP).$mount('#root');
6 |
--------------------------------------------------------------------------------
/prepare/가위바위보/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "prepare",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^3.0.0",
17 | "vue-loader": "^15.7.0",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.10",
20 | "webpack": "^4.35.0",
21 | "webpack-cli": "^3.3.5",
22 | "webpack-dev-server": "^3.7.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/prepare/가위바위보/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | devtool: 'eval',
6 | mode: 'development',
7 | resolve: {
8 | extensions: ['.vue', '.js'],
9 | alias: {
10 | vue: 'vue/dist/vue.js'
11 | }
12 | },
13 | entry: {
14 | app: [path.join(__dirname, 'main')],
15 | },
16 | module: {
17 | rules: [{
18 | test: /\.vue$/,
19 | loader: 'vue-loader',
20 | }, {
21 | test: /\.css$/,
22 | use: [
23 | 'vue-style-loader',
24 | {
25 | loader: 'css-loader',
26 | options: { importLoaders: 1 }
27 | },
28 | ],
29 | },],
30 | },
31 | plugins: [
32 | new VueLoaderPlugin(),
33 | ],
34 | output: {
35 | filename: 'app.js',
36 | path: path.join(__dirname, 'dist'),
37 | publicPath: '/dist'
38 | },
39 | };
40 |
--------------------------------------------------------------------------------
/prepare/로또/Ball.vue:
--------------------------------------------------------------------------------
1 |
2 | {{number}}
3 |
4 |
5 |
30 |
31 |
44 |
--------------------------------------------------------------------------------
/prepare/로또/Lotto.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 로또
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/prepare/로또/Lotto.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
당첨 숫자
4 |
5 |
6 |
7 |
보너스!
8 |
9 |
10 |
11 |
12 |
86 |
87 |
88 |
--------------------------------------------------------------------------------
/prepare/로또/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | import Lotto from './Lotto';
4 |
5 | new Vue(Lotto).$mount('#root');
6 |
--------------------------------------------------------------------------------
/prepare/로또/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "prepare",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^3.0.0",
17 | "vue-loader": "^15.7.0",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.10",
20 | "webpack": "^4.35.0",
21 | "webpack-cli": "^3.3.5",
22 | "webpack-dev-server": "^3.7.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/prepare/로또/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | devtool: 'eval',
6 | mode: 'development',
7 | resolve: {
8 | extensions: ['.vue', '.js'],
9 | },
10 | entry: {
11 | app: [path.join(__dirname, 'main')],
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | loader: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: { importLoaders: 1 }
24 | },
25 | ],
26 | },],
27 | },
28 | plugins: [
29 | new VueLoaderPlugin(),
30 | ],
31 | output: {
32 | filename: 'app.js',
33 | path: path.join(__dirname, 'dist'),
34 | publicPath: '/dist'
35 | },
36 | };
37 |
--------------------------------------------------------------------------------
/prepare/반응속도체크/ResponseCheck.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 반응속도 체크
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/prepare/반응속도체크/ResponseCheck.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{message}}
4 |
5 |
평균 시간: {{result.reduce((a, c) => a + c / result.length, 0)}}ms
6 |
7 |
8 |
9 |
10 |
47 |
65 |
--------------------------------------------------------------------------------
/prepare/반응속도체크/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | import ResponseCheck from './ResponseCheck';
4 |
5 | new Vue(ResponseCheck).$mount('#root');
6 |
--------------------------------------------------------------------------------
/prepare/반응속도체크/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "prepare",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^3.0.0",
17 | "vue-loader": "^15.7.0",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.10",
20 | "webpack": "^4.35.0",
21 | "webpack-cli": "^3.3.5",
22 | "webpack-dev-server": "^3.7.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/prepare/반응속도체크/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | devtool: 'eval',
6 | mode: 'development',
7 | resolve: {
8 | extensions: ['.vue', '.js'],
9 | alias: {
10 | vue: 'vue/dist/vue.js'
11 | }
12 | },
13 | entry: {
14 | app: [path.join(__dirname, 'main')],
15 | },
16 | module: {
17 | rules: [{
18 | test: /\.vue$/,
19 | loader: 'vue-loader',
20 | }, {
21 | test: /\.css$/,
22 | use: [
23 | 'vue-style-loader',
24 | {
25 | loader: 'css-loader',
26 | options: { importLoaders: 1 }
27 | },
28 | ],
29 | },],
30 | },
31 | plugins: [
32 | new VueLoaderPlugin(),
33 | ],
34 | output: {
35 | filename: 'app.js',
36 | path: path.join(__dirname, 'dist'),
37 | publicPath: '/dist'
38 | },
39 | };
40 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/MineForm.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
37 |
38 |
41 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/MineSearch.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 지뢰찾기
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/MineSearch.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
{{timer}}
5 |
6 |
{{result}}
7 |
8 |
9 |
41 |
42 |
54 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/TableComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
21 |
22 |
25 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/TdComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
7 | {{cellDataText}}
8 | |
9 |
10 |
11 |
122 |
123 |
126 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/TrComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
22 |
23 |
26 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import MineSearch from './MineSearch';
3 | import store from './store';
4 |
5 | new Vue({
6 | el: '#root',
7 | store,
8 | template: '',
9 | components: {
10 | MineSearch,
11 | },
12 | });
13 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "mine-search",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10",
14 | "vuex": "^3.1.1"
15 | },
16 | "devDependencies": {
17 | "css-loader": "^3.0.0",
18 | "vue-loader": "^15.7.0",
19 | "vue-style-loader": "^4.1.2",
20 | "vue-template-compiler": "^2.6.10",
21 | "webpack": "^4.35.0",
22 | "webpack-cli": "^3.3.5",
23 | "webpack-dev-server": "^3.7.2"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/store.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuex from 'vuex';
3 |
4 | Vue.use(Vuex);
5 |
6 | export const CODE = {
7 | MINE: -7,
8 | NORMAL: -1,
9 | QUESTION: -2,
10 | FLAG: -3,
11 | QUESTION_MINE: -4,
12 | FLAG_MINE: -5,
13 | CLICKED_MINE: -6,
14 | OPENED: 0, // 0 이상이면 다 opened
15 | };
16 |
17 | const plantMine = (row, cell, mine) => {
18 | console.log(row, cell, mine);
19 | const candidate = Array(row * cell).fill().map((arr, i) => {
20 | return i;
21 | });
22 | const shuffle = [];
23 | while (candidate.length > row * cell - mine) {
24 | const chosen = candidate.splice(Math.floor(Math.random() * candidate.length), 1)[0];
25 | shuffle.push(chosen);
26 | }
27 | const data = [];
28 | for (let i = 0; i < row; i++) {
29 | const rowData = [];
30 | data.push(rowData);
31 | for (let j = 0; j < cell; j++) {
32 | rowData.push(CODE.NORMAL);
33 | }
34 | }
35 |
36 | for (let k = 0; k < shuffle.length; k++) {
37 | const ver = Math.floor(shuffle[k] / cell);
38 | const hor = shuffle[k] % cell;
39 | data[ver][hor] = CODE.MINE;
40 | }
41 |
42 | console.log(data);
43 | return data;
44 | };
45 |
46 | export const START_GAME = 'START_GAME';
47 | export const OPEN_CELL = 'OPEN_CELL';
48 | export const CLICK_MINE = 'CLICK_MINE';
49 | export const FLAG_CELL = 'FLAG_CELL';
50 | export const QUESTION_CELL = 'QUESTION_CELL';
51 | export const NORMALIZE_CELL = 'NORMALIZE_CELL';
52 | export const INCREMENT_TIMER = 'INCREMENT_TIMER';
53 |
54 | export default new Vuex.Store({
55 | state: {
56 | tableData: [],
57 | data: {
58 | row: 0,
59 | cell: 0,
60 | mine: 0,
61 | },
62 | timer: 0,
63 | result: '',
64 | halted: true,
65 | openedCount: 0,
66 | },
67 | mutations: {
68 | [START_GAME](state, { row, cell, mine }) {
69 | state.data = {
70 | row,
71 | cell,
72 | mine,
73 | };
74 | state.openedCount = 0;
75 | state.tableData = plantMine(row, cell, mine);
76 | state.halted = false;
77 | state.timer = 0;
78 | },
79 | [OPEN_CELL](state, { row, cell }) {
80 | const checked = [];
81 | let openedCount = 0;
82 | const checkAround = (row, cell) => {
83 | console.log(row, cell);
84 | if (row < 0 || row >= state.tableData.length || cell < 0 || cell >= state.tableData[0].length) {
85 | return;
86 | } // 상하좌우 없는칸은 안 열기
87 | if ([CODE.OPENED, CODE.FLAG, CODE.FLAG_MINE, CODE.QUESTION_MINE, CODE.QUESTION].includes(state.tableData[row][cell])) {
88 | return;
89 | } // 닫힌 칸만 열기
90 | if (checked.includes(row + '/' + cell)) {
91 | return;
92 | } else {
93 | checked.push(row + '/' + cell);
94 | } // 한 번 연칸은 무시하기
95 | let around = [
96 | state.tableData[row][cell - 1], state.tableData[row][cell + 1],
97 | ];
98 | if (state.tableData[row - 1]) {
99 | around = around.concat([state.tableData[row - 1][cell - 1], state.tableData[row - 1][cell], state.tableData[row - 1][cell + 1]]);
100 | }
101 | if (state.tableData[row + 1]) {
102 | around = around.concat([state.tableData[row + 1][cell - 1], state.tableData[row + 1][cell], state.tableData[row + 1][cell + 1]]);
103 | }
104 | const count = around.filter(function (v) {
105 | return [CODE.MINE, CODE.FLAG_MINE, CODE.QUESTION_MINE].includes(v);
106 | }).length;
107 | if (count === 0) { // 주변칸 오픈
108 | if (row > -1) {
109 | const near = [];
110 | if (row - 1 > -1) {
111 | near.push([row -1, cell - 1]);
112 | near.push([row -1, cell]);
113 | near.push([row -1, cell + 1]);
114 | }
115 | near.push([row, cell - 1]);
116 | near.push([row, cell + 1]);
117 | if (row + 1 < state.tableData.length) {
118 | near.push([row + 1, cell - 1]);
119 | near.push([row + 1, cell]);
120 | near.push([row + 1, cell + 1]);
121 | }
122 | near.forEach((n) => {
123 | if (state.tableData[n[0]][n[1]] !== CODE.OPENED) {
124 | checkAround(n[0], n[1]);
125 | }
126 | })
127 | }
128 | }
129 | if (state.tableData[row][cell] === CODE.NORMAL) { // 내 칸이 닫힌 칸이면 카운트 증가
130 | openedCount += 1;
131 | }
132 | Vue.set(state.tableData[row], cell, count);
133 | };
134 | checkAround(row, cell);
135 | let halted = false;
136 | let result = '';
137 | console.log(state.data.row * state.data.cell - state.data.mine, state.openedCount, openedCount);
138 | if (state.data.row * state.data.cell - state.data.mine === state.openedCount + openedCount) { // 승리
139 | halted = true;
140 | result = `${state.timer}초만에 승리하셨습니다`;
141 | }
142 | state.openedCount = state.openedCount + openedCount;
143 | state.halted = halted;
144 | state.result = result;
145 | },
146 | [CLICK_MINE](state, { row, cell }) {
147 | Vue.set(state.tableData[row], cell, CODE.CLICKED_MINE);
148 | state.halted = true;
149 | },
150 | [FLAG_CELL](state, { row, cell }) {
151 | if (state.tableData[row][cell] === CODE.MINE) {
152 | Vue.set(state.tableData[row], cell, CODE.FLAG_MINE);
153 | } else {
154 | Vue.set(state.tableData[row], cell, CODE.FLAG);
155 | }
156 | },
157 | [QUESTION_CELL](state, { row, cell }) {
158 | if (state.tableData[row][cell] === CODE.FLAG_MINE) {
159 | Vue.set(state.tableData[row], cell, CODE.QUESTION_MINE);
160 | } else {
161 | Vue.set(state.tableData[row], cell, CODE.QUESTION);
162 | }
163 | },
164 | [NORMALIZE_CELL](state, { row, cell }) {
165 | if (state.tableData[row][cell] === CODE.QUESTION_MINE) {
166 | Vue.set(state.tableData[row],cell, CODE.MINE);
167 | } else {
168 | Vue.set(state.tableData[row], cell, CODE.NORMAL);
169 | }
170 | },
171 | [INCREMENT_TIMER](state) {
172 | state.timer += 1;
173 | },
174 | },
175 | });
176 |
--------------------------------------------------------------------------------
/prepare/지뢰찾기/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | devtool: 'eval',
6 | mode: 'development',
7 | resolve: {
8 | extensions: ['.vue', '.js'],
9 | alias: {
10 | 'vue$': 'vue/dist/vue.esm.js',
11 | },
12 | },
13 | entry: {
14 | app: [path.join(__dirname, 'main')],
15 | },
16 | module: {
17 | rules: [{
18 | test: /\.vue$/,
19 | loader: 'vue-loader',
20 | }, {
21 | test: /\.css$/,
22 | use: [
23 | 'vue-style-loader',
24 | {
25 | loader: 'css-loader',
26 | options: { importLoaders: 1 },
27 | },
28 | ],
29 | }],
30 | },
31 | plugins: [
32 | new VueLoaderPlugin(),
33 | ],
34 | output: {
35 | filename: 'app.js',
36 | path: path.join(__dirname, 'dist'),
37 | publicPath: '/dist',
38 | },
39 | };
40 |
--------------------------------------------------------------------------------
/prepare/틱택토/TableComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
17 |
18 |
21 |
--------------------------------------------------------------------------------
/prepare/틱택토/TdComponent.vue:
--------------------------------------------------------------------------------
1 |
2 | {{cellData}} |
3 |
4 |
5 |
55 |
56 |
59 |
--------------------------------------------------------------------------------
/prepare/틱택토/TicTacToe.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 틱택토
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/prepare/틱택토/TicTacToe.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
{{winner}}님의 승리
5 |
6 |
7 |
27 |
28 |
39 |
--------------------------------------------------------------------------------
/prepare/틱택토/TrComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
17 |
18 |
21 |
--------------------------------------------------------------------------------
/prepare/틱택토/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 |
3 | import TicTacToe from './TicTacToe';
4 |
5 | new Vue(TicTacToe).$mount('#root');
6 |
--------------------------------------------------------------------------------
/prepare/틱택토/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "prepare",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10"
14 | },
15 | "devDependencies": {
16 | "css-loader": "^3.0.0",
17 | "vue-loader": "^15.7.0",
18 | "vue-style-loader": "^4.1.2",
19 | "vue-template-compiler": "^2.6.10",
20 | "webpack": "^4.35.0",
21 | "webpack-cli": "^3.3.5",
22 | "webpack-dev-server": "^3.7.2"
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/prepare/틱택토/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | devtool: 'eval',
6 | mode: 'development',
7 | resolve: {
8 | extensions: ['.vue', '.js'],
9 | },
10 | entry: {
11 | app: [path.join(__dirname, 'App.vue')],
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | loader: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | {
22 | loader: 'css-loader',
23 | options: { importLoaders: 1 }
24 | },
25 | ],
26 | },],
27 | },
28 | plugins: [
29 | new VueLoaderPlugin(),
30 | ],
31 | output: {
32 | filename: 'app.js',
33 | path: path.join(__dirname, 'dist'),
34 | publicPath: '/dist'
35 | },
36 | };
37 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/TableComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
7 |
21 |
22 |
25 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/TdComponent.vue:
--------------------------------------------------------------------------------
1 |
2 | {{cellData}} |
3 |
4 |
5 |
57 |
58 |
61 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/TicTacToe.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 틱택토
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/TicTacToe.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
{{winner}}님의 승리
5 |
6 |
7 |
21 |
22 |
34 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/TrComponent.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
22 |
23 |
26 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import TicTacToe from './TicTacToe';
3 | import store from './store';
4 |
5 | new Vue({
6 | el: '#root',
7 | store,
8 | template: '',
9 | components: {
10 | TicTacToe,
11 | },
12 | });
13 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "prepare",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "dev": "webpack-dev-server --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10",
14 | "vuex": "^3.1.1"
15 | },
16 | "devDependencies": {
17 | "css-loader": "^3.0.0",
18 | "vue-loader": "^15.7.0",
19 | "vue-style-loader": "^4.1.2",
20 | "vue-template-compiler": "^2.6.10",
21 | "webpack": "^4.35.0",
22 | "webpack-cli": "^3.3.5",
23 | "webpack-dev-server": "^3.7.2"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/store.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Vuex from 'vuex';
3 |
4 | Vue.use(Vuex);
5 |
6 | export default new Vuex.Store({
7 | state: {
8 | winner: '',
9 | turn: 'O',
10 | tableData: [['', '', ''], ['', '', ''], ['', '', '']],
11 | },
12 | mutations: {
13 | SET_WINNER(state, winner) {
14 | state.winner = winner;
15 | },
16 | CLICK_CELL(state, { row, cell }) {
17 | const tableData = [...state.tableData];
18 | tableData[row][cell] = state.turn;
19 | state.tableData = tableData;
20 | },
21 | CHANGE_TURN(state) {
22 | state.turn = state.turn === 'O' ? 'X' : 'O';
23 | },
24 | RESET_GAME(state) {
25 | state.turn = 'O';
26 | state.tableData = [
27 | ['', '', ''],
28 | ['', '', ''],
29 | ['', '', ''],
30 | ];
31 | },
32 | NO_WINNER(state) {
33 | state.winner = '';
34 | },
35 | },
36 | getters: {
37 | tableData: (state) => state.tableData,
38 | },
39 | });
40 |
--------------------------------------------------------------------------------
/prepare/틱택토Vuex/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | devtool: 'eval',
6 | mode: 'development',
7 | resolve: {
8 | extensions: ['.vue', '.js'],
9 | alias: {
10 | 'vue$': 'vue/dist/vue.esm.js',
11 | },
12 | },
13 | entry: {
14 | app: [path.join(__dirname, 'main')],
15 | },
16 | module: {
17 | rules: [{
18 | test: /\.vue$/,
19 | loader: 'vue-loader',
20 | }, {
21 | test: /\.css$/,
22 | use: [
23 | 'vue-style-loader',
24 | {
25 | loader: 'css-loader',
26 | options: { importLoaders: 1 },
27 | },
28 | ],
29 | }],
30 | },
31 | plugins: [
32 | new VueLoaderPlugin(),
33 | ],
34 | output: {
35 | filename: 'app.js',
36 | path: path.join(__dirname, 'dist'),
37 | publicPath: '/dist',
38 | },
39 | };
40 |
--------------------------------------------------------------------------------
/vue-router/GameMatcher.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | 일치하는 게임이 없습니다
12 |
13 |
14 |
36 |
--------------------------------------------------------------------------------
/vue-router/Router.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
6 |
7 | 라우터
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/vue-router/Router.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 게임 매쳐
5 | 숫자야구
6 | 반응속도
7 | 가위바위보
8 | 로또생성기
9 |
10 |
11 |
12 |
13 |
14 |
21 |
22 |
33 |
--------------------------------------------------------------------------------
/vue-router/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import Router from './Router';
3 |
4 | new Vue({
5 | render: createElement => createElement(Router)
6 | }).$mount('#root');
7 |
--------------------------------------------------------------------------------
/vue-router/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "response-check",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "build": "webpack --watch",
8 | "dev": "webpack serve --mode development --env development --hot"
9 | },
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "vue": "^2.6.10",
14 | "vue-router": "^3.5.1",
15 | "vuex": "^3.6.2"
16 | },
17 | "devDependencies": {
18 | "css-loader": "^5.2.4",
19 | "vue-loader": "^15.9.7",
20 | "vue-style-loader": "^4.1.2",
21 | "vue-template-compiler": "^2.6.10",
22 | "webpack": "^5.37.0",
23 | "webpack-cli": "^4.7.0",
24 | "webpack-dev-server": "^3.11.2"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/vue-router/routes.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue';
2 | import VueRouter from 'vue-router';
3 | import NumberBaseball from '../3.숫자야구/NumberBaseball';
4 | import ResponseCheck from '../4.반응속도체크/ResponseCheck';
5 | import RockScissorsPaper from '../5.가위바위보/RockScissorsPaper';
6 | import LottoGenerator from '../6.로또/LottoGenerator';
7 | import GameMatcher from './GameMatcher';
8 |
9 | Vue.use(VueRouter);
10 |
11 | export default new VueRouter({
12 | mode: 'history',
13 | routes: [
14 | { path: '/number-baseball', component: NumberBaseball },
15 | { path: '/response-check', component: ResponseCheck },
16 | { path: '/rock-scissors-paper', component: RockScissorsPaper },
17 | { path: '/lotto-generator', component: LottoGenerator },
18 | { path: '/game/:name', component: GameMatcher } // /game
19 | ],
20 | });
21 |
--------------------------------------------------------------------------------
/vue-router/webpack.config.js:
--------------------------------------------------------------------------------
1 | const VueLoaderPlugin = require('vue-loader/lib/plugin');
2 | const path = require('path');
3 |
4 | module.exports = {
5 | mode: 'development',
6 | devtool: 'eval',
7 | resolve: {
8 | extensions: ['.js', '.vue'],
9 | },
10 | entry: {
11 | app: path.join(__dirname, 'main'),
12 | },
13 | module: {
14 | rules: [{
15 | test: /\.vue$/,
16 | use: 'vue-loader',
17 | }, {
18 | test: /\.css$/,
19 | use: [
20 | 'vue-style-loader',
21 | 'css-loader',
22 | ]
23 | }],
24 | },
25 | plugins: [
26 | new VueLoaderPlugin(),
27 | ],
28 | output: {
29 | filename: '[name].js',
30 | path: path.join(__dirname, 'dist'),
31 | publicPath: '/dist',
32 | },
33 | };
34 |
--------------------------------------------------------------------------------