├── .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 |
14 | 15 | 16 |
17 |
{{result}}
18 |
19 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /1.구구단/WordRelay.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 끝말잇기 8 | 9 | 10 | 11 |
12 |
{{word}}
13 |
14 | 15 | 16 |
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 | 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 | 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 | 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 | 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 | 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 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /7.틱택토/TdComponent.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 59 | -------------------------------------------------------------------------------- /7.틱택토/TicTacToe.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 틱택토 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /7.틱택토/TicTacToe.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 35 | 36 | 47 | -------------------------------------------------------------------------------- /7.틱택토/TrComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /7.틱택토EventBus/TdComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 8 | 9 | 79 | 80 | 91 | -------------------------------------------------------------------------------- /7.틱택토EventBus/TrComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /7.틱택토Vuex/TdComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 12 | 13 | 84 | 85 | 96 | -------------------------------------------------------------------------------- /7.틱택토Vuex/TrComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 9 | 10 | 37 | -------------------------------------------------------------------------------- /8.지뢰찾기/MineSweeper.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 6 | 7 | 지뢰찾기 8 | 9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /8.지뢰찾기/MineSweeper.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 43 | 44 | 55 | -------------------------------------------------------------------------------- /8.지뢰찾기/TableComponent.vue: -------------------------------------------------------------------------------- 1 | 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 |
14 | 15 | 16 |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 9 | 41 | 42 | 54 | -------------------------------------------------------------------------------- /prepare/지뢰찾기/TableComponent.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /prepare/지뢰찾기/TdComponent.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 122 | 123 | 126 | -------------------------------------------------------------------------------- /prepare/지뢰찾기/TrComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 6 | 7 | 17 | 18 | 21 | -------------------------------------------------------------------------------- /prepare/틱택토/TdComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 7 | 27 | 28 | 39 | -------------------------------------------------------------------------------- /prepare/틱택토/TrComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 6 | 7 | 21 | 22 | 25 | -------------------------------------------------------------------------------- /prepare/틱택토Vuex/TdComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 7 | 21 | 22 | 34 | -------------------------------------------------------------------------------- /prepare/틱택토Vuex/TrComponent.vue: -------------------------------------------------------------------------------- 1 | 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 | 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 | 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 | --------------------------------------------------------------------------------