├── .editorconfig ├── .firebaserc ├── .github └── workflows │ ├── firebase-hosting-merge.yml │ └── firebase-hosting-pull-request.yml ├── .gitignore ├── .prettierrc ├── README.md ├── firebase.json ├── package-lock.json ├── package.json ├── public ├── corner.svg ├── favicon.ico ├── global.css └── index.html ├── rollup.config.js └── src ├── App.svelte ├── components ├── Game.svelte ├── GameConsole.svelte └── Instructions.svelte ├── const.js ├── main.js ├── mainStore.js └── utils └── utils.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # editorconfig.org 2 | 3 | root = true 4 | 5 | [*] 6 | charset = utf-8 7 | end_of_line = lf 8 | indent_style = space 9 | insert_final_newline = true 10 | trim_trailing_whitespace = true 11 | indent_size = 2 12 | 13 | [*.md] 14 | trim_trailing_whitespace = false 15 | -------------------------------------------------------------------------------- /.firebaserc: -------------------------------------------------------------------------------- 1 | { 2 | "projects": { 3 | "default": "svelte-tetris" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /.github/workflows/firebase-hosting-merge.yml: -------------------------------------------------------------------------------- 1 | # This file was auto-generated by the Firebase CLI 2 | # https://github.com/firebase/firebase-tools 3 | 4 | name: Deploy to Firebase Hosting on merge 5 | 'on': 6 | push: 7 | branches: 8 | - master 9 | jobs: 10 | build_and_deploy: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - run: npm ci && npm run build 15 | - uses: FirebaseExtended/action-hosting-deploy@v0 16 | with: 17 | repoToken: '${{ secrets.GITHUB_TOKEN }}' 18 | firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_SVELTE_TETRIS }}' 19 | channelId: live 20 | projectId: svelte-tetris 21 | -------------------------------------------------------------------------------- /.github/workflows/firebase-hosting-pull-request.yml: -------------------------------------------------------------------------------- 1 | # This file was auto-generated by the Firebase CLI 2 | # https://github.com/firebase/firebase-tools 3 | 4 | name: Deploy to Firebase Hosting on PR 5 | 'on': pull_request 6 | jobs: 7 | build_and_preview: 8 | if: '${{ github.event.pull_request.head.repo.full_name == github.repository }}' 9 | runs-on: ubuntu-latest 10 | steps: 11 | - uses: actions/checkout@v2 12 | - run: npm ci && npm run build 13 | - uses: FirebaseExtended/action-hosting-deploy@v0 14 | with: 15 | repoToken: '${{ secrets.GITHUB_TOKEN }}' 16 | firebaseServiceAccount: '${{ secrets.FIREBASE_SERVICE_ACCOUNT_SVELTE_TETRIS }}' 17 | projectId: svelte-tetris 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /public/build/ 3 | .firebase/ 4 | .DS_Store 5 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "arrowParens": "avoid" 3 | } 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Svelte Tetris 2 | 3 | This is a very basic Tetris game made in the Svelte framework. 4 | 5 | You can check it out [here](https://svelte-tetris.roeeyn.dev/). 6 | 7 | ![Demo Gif](https://media.giphy.com/media/PlrphASwpX5oiARVTA/giphy.gif) 8 | 9 | ## Get started 10 | 11 | Install the dependencies... 12 | 13 | ```bash 14 | git clone https://github.com/roeeyn/SvelteTetris.git 15 | cd SvelteTetris 16 | npm install 17 | ``` 18 | 19 | ...then start [Rollup](https://rollupjs.org): 20 | 21 | ```bash 22 | npm run dev 23 | ``` 24 | 25 | Navigate to [localhost:5000](http://localhost:5000). You should see the app running. Press **start** and start playing around. 26 | 27 | ## Building and running in production mode 28 | 29 | To create an optimised version of the app: 30 | 31 | ```bash 32 | npm run build 33 | ``` 34 | 35 | ## Deploying to the Web 36 | 37 | I've automated this repo to build and deploy automatically to [Firebase](https://firebase.google.com/?hl=es) using GitHub Actions. For achieving that you need to create a project inside Firebase Console and getting Firebase Token by executing: 38 | 39 | ```bash 40 | # optional deploy automation 41 | firebase login:ci 42 | ``` 43 | 44 | ## Justification for the project 45 | 46 | I advanced to the second stage in the [MLH Fellowship](https://fellowship.mlh.io/) application, and I was asked to upload a significant project where I showed my skils. As most of my best projects are private I decided to create this game, and learn a new framework ([Svelte](https://svelte.dev/)) in the way. 47 | 48 | I was inspired by [this](https://github.com/kubowania/Tetris) project which gave me a very good foundation of the game basics, but didn't have all the functionality I wanted. Also [ddanielcruzz](https://github.com/ddanielcruzz) helped me designing the [game console](https://twitter.com/danielcruzdev/status/1263219922450161668?s=12) and helped me by giving me a general review of my project. 49 | 50 | I hope this demostrate that I'm ready for a bigger challenge 🔥. 51 | -------------------------------------------------------------------------------- /firebase.json: -------------------------------------------------------------------------------- 1 | { 2 | "hosting": { 3 | "public": "public", 4 | "ignore": [ 5 | "firebase.json", 6 | "**/.*", 7 | "**/node_modules/**" 8 | ], 9 | "rewrites": [ 10 | { 11 | "source": "**", 12 | "destination": "/index.html" 13 | } 14 | ] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-app", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "svelte-app", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "sirv-cli": "^0.4.4" 12 | }, 13 | "devDependencies": { 14 | "@rollup/plugin-commonjs": "11.0.2", 15 | "@rollup/plugin-node-resolve": "^7.0.0", 16 | "rollup": "^1.20.0", 17 | "rollup-plugin-livereload": "^1.0.0", 18 | "rollup-plugin-svelte": "^5.0.3", 19 | "rollup-plugin-terser": "^5.1.2", 20 | "svelte": "^3.49.0" 21 | } 22 | }, 23 | "node_modules/@babel/code-frame": { 24 | "version": "7.8.3", 25 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 26 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 27 | "dev": true, 28 | "dependencies": { 29 | "@babel/highlight": "^7.8.3" 30 | } 31 | }, 32 | "node_modules/@babel/helper-validator-identifier": { 33 | "version": "7.9.5", 34 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 35 | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 36 | "dev": true 37 | }, 38 | "node_modules/@babel/highlight": { 39 | "version": "7.9.0", 40 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 41 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 42 | "dev": true, 43 | "dependencies": { 44 | "@babel/helper-validator-identifier": "^7.9.0", 45 | "chalk": "^2.0.0", 46 | "js-tokens": "^4.0.0" 47 | } 48 | }, 49 | "node_modules/@polka/url": { 50 | "version": "0.5.0", 51 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", 52 | "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==" 53 | }, 54 | "node_modules/@rollup/plugin-commonjs": { 55 | "version": "11.0.2", 56 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", 57 | "integrity": "sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g==", 58 | "dev": true, 59 | "dependencies": { 60 | "@rollup/pluginutils": "^3.0.0", 61 | "estree-walker": "^1.0.1", 62 | "is-reference": "^1.1.2", 63 | "magic-string": "^0.25.2", 64 | "resolve": "^1.11.0" 65 | }, 66 | "engines": { 67 | "node": ">= 8.0.0" 68 | } 69 | }, 70 | "node_modules/@rollup/plugin-node-resolve": { 71 | "version": "7.1.3", 72 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", 73 | "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", 74 | "dev": true, 75 | "dependencies": { 76 | "@rollup/pluginutils": "^3.0.8", 77 | "@types/resolve": "0.0.8", 78 | "builtin-modules": "^3.1.0", 79 | "is-module": "^1.0.0", 80 | "resolve": "^1.14.2" 81 | }, 82 | "engines": { 83 | "node": ">= 8.0.0" 84 | } 85 | }, 86 | "node_modules/@rollup/pluginutils": { 87 | "version": "3.0.10", 88 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz", 89 | "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==", 90 | "dev": true, 91 | "dependencies": { 92 | "@types/estree": "0.0.39", 93 | "estree-walker": "^1.0.1", 94 | "picomatch": "^2.2.2" 95 | }, 96 | "engines": { 97 | "node": ">= 8.0.0" 98 | } 99 | }, 100 | "node_modules/@types/estree": { 101 | "version": "0.0.39", 102 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 103 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 104 | "dev": true 105 | }, 106 | "node_modules/@types/node": { 107 | "version": "14.0.1", 108 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz", 109 | "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==", 110 | "dev": true 111 | }, 112 | "node_modules/@types/resolve": { 113 | "version": "0.0.8", 114 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 115 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 116 | "dev": true, 117 | "dependencies": { 118 | "@types/node": "*" 119 | } 120 | }, 121 | "node_modules/acorn": { 122 | "version": "7.2.0", 123 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", 124 | "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", 125 | "dev": true, 126 | "bin": { 127 | "acorn": "bin/acorn" 128 | }, 129 | "engines": { 130 | "node": ">=0.4.0" 131 | } 132 | }, 133 | "node_modules/ansi-styles": { 134 | "version": "3.2.1", 135 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 136 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 137 | "dev": true, 138 | "dependencies": { 139 | "color-convert": "^1.9.0" 140 | }, 141 | "engines": { 142 | "node": ">=4" 143 | } 144 | }, 145 | "node_modules/anymatch": { 146 | "version": "3.1.1", 147 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 148 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 149 | "dev": true, 150 | "dependencies": { 151 | "normalize-path": "^3.0.0", 152 | "picomatch": "^2.0.4" 153 | }, 154 | "engines": { 155 | "node": ">= 8" 156 | } 157 | }, 158 | "node_modules/async-limiter": { 159 | "version": "1.0.1", 160 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 161 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 162 | "dev": true 163 | }, 164 | "node_modules/binary-extensions": { 165 | "version": "2.0.0", 166 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 167 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 168 | "dev": true, 169 | "engines": { 170 | "node": ">=8" 171 | } 172 | }, 173 | "node_modules/braces": { 174 | "version": "3.0.2", 175 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 176 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 177 | "dev": true, 178 | "dependencies": { 179 | "fill-range": "^7.0.1" 180 | }, 181 | "engines": { 182 | "node": ">=8" 183 | } 184 | }, 185 | "node_modules/buffer-from": { 186 | "version": "1.1.1", 187 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 188 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 189 | "dev": true 190 | }, 191 | "node_modules/builtin-modules": { 192 | "version": "3.1.0", 193 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 194 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 195 | "dev": true, 196 | "engines": { 197 | "node": ">=6" 198 | } 199 | }, 200 | "node_modules/chalk": { 201 | "version": "2.4.2", 202 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 203 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 204 | "dev": true, 205 | "dependencies": { 206 | "ansi-styles": "^3.2.1", 207 | "escape-string-regexp": "^1.0.5", 208 | "supports-color": "^5.3.0" 209 | }, 210 | "engines": { 211 | "node": ">=4" 212 | } 213 | }, 214 | "node_modules/chokidar": { 215 | "version": "3.4.0", 216 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", 217 | "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", 218 | "dev": true, 219 | "dependencies": { 220 | "anymatch": "~3.1.1", 221 | "braces": "~3.0.2", 222 | "glob-parent": "~5.1.0", 223 | "is-binary-path": "~2.1.0", 224 | "is-glob": "~4.0.1", 225 | "normalize-path": "~3.0.0", 226 | "readdirp": "~3.4.0" 227 | }, 228 | "engines": { 229 | "node": ">= 8.10.0" 230 | }, 231 | "optionalDependencies": { 232 | "fsevents": "~2.1.2" 233 | } 234 | }, 235 | "node_modules/color-convert": { 236 | "version": "1.9.3", 237 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 238 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 239 | "dev": true, 240 | "dependencies": { 241 | "color-name": "1.1.3" 242 | } 243 | }, 244 | "node_modules/color-name": { 245 | "version": "1.1.3", 246 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 247 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 248 | "dev": true 249 | }, 250 | "node_modules/commander": { 251 | "version": "2.20.3", 252 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 253 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 254 | "dev": true 255 | }, 256 | "node_modules/console-clear": { 257 | "version": "1.1.1", 258 | "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", 259 | "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==", 260 | "engines": { 261 | "node": ">=4" 262 | } 263 | }, 264 | "node_modules/escape-string-regexp": { 265 | "version": "1.0.5", 266 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 267 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 268 | "dev": true, 269 | "engines": { 270 | "node": ">=0.8.0" 271 | } 272 | }, 273 | "node_modules/estree-walker": { 274 | "version": "1.0.1", 275 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 276 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 277 | "dev": true 278 | }, 279 | "node_modules/fill-range": { 280 | "version": "7.0.1", 281 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 282 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 283 | "dev": true, 284 | "dependencies": { 285 | "to-regex-range": "^5.0.1" 286 | }, 287 | "engines": { 288 | "node": ">=8" 289 | } 290 | }, 291 | "node_modules/fsevents": { 292 | "version": "2.1.3", 293 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 294 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 295 | "dev": true, 296 | "optional": true, 297 | "os": [ 298 | "darwin" 299 | ], 300 | "engines": { 301 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 302 | } 303 | }, 304 | "node_modules/get-port": { 305 | "version": "3.2.0", 306 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", 307 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=", 308 | "engines": { 309 | "node": ">=4" 310 | } 311 | }, 312 | "node_modules/glob-parent": { 313 | "version": "5.1.2", 314 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 315 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 316 | "dev": true, 317 | "dependencies": { 318 | "is-glob": "^4.0.1" 319 | }, 320 | "engines": { 321 | "node": ">= 6" 322 | } 323 | }, 324 | "node_modules/has-flag": { 325 | "version": "3.0.0", 326 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 327 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 328 | "dev": true, 329 | "engines": { 330 | "node": ">=4" 331 | } 332 | }, 333 | "node_modules/is-binary-path": { 334 | "version": "2.1.0", 335 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 336 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 337 | "dev": true, 338 | "dependencies": { 339 | "binary-extensions": "^2.0.0" 340 | }, 341 | "engines": { 342 | "node": ">=8" 343 | } 344 | }, 345 | "node_modules/is-extglob": { 346 | "version": "2.1.1", 347 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 348 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 349 | "dev": true, 350 | "engines": { 351 | "node": ">=0.10.0" 352 | } 353 | }, 354 | "node_modules/is-glob": { 355 | "version": "4.0.1", 356 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 357 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 358 | "dev": true, 359 | "dependencies": { 360 | "is-extglob": "^2.1.1" 361 | }, 362 | "engines": { 363 | "node": ">=0.10.0" 364 | } 365 | }, 366 | "node_modules/is-module": { 367 | "version": "1.0.0", 368 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 369 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 370 | "dev": true 371 | }, 372 | "node_modules/is-number": { 373 | "version": "7.0.0", 374 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 375 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 376 | "dev": true, 377 | "engines": { 378 | "node": ">=0.12.0" 379 | } 380 | }, 381 | "node_modules/is-reference": { 382 | "version": "1.1.4", 383 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", 384 | "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", 385 | "dev": true, 386 | "dependencies": { 387 | "@types/estree": "0.0.39" 388 | } 389 | }, 390 | "node_modules/jest-worker": { 391 | "version": "24.9.0", 392 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", 393 | "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", 394 | "dev": true, 395 | "dependencies": { 396 | "merge-stream": "^2.0.0", 397 | "supports-color": "^6.1.0" 398 | }, 399 | "engines": { 400 | "node": ">= 6" 401 | } 402 | }, 403 | "node_modules/jest-worker/node_modules/supports-color": { 404 | "version": "6.1.0", 405 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 406 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 407 | "dev": true, 408 | "dependencies": { 409 | "has-flag": "^3.0.0" 410 | }, 411 | "engines": { 412 | "node": ">=6" 413 | } 414 | }, 415 | "node_modules/js-tokens": { 416 | "version": "4.0.0", 417 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 418 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 419 | "dev": true 420 | }, 421 | "node_modules/kleur": { 422 | "version": "3.0.3", 423 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 424 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", 425 | "engines": { 426 | "node": ">=6" 427 | } 428 | }, 429 | "node_modules/livereload": { 430 | "version": "0.9.1", 431 | "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", 432 | "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", 433 | "dev": true, 434 | "dependencies": { 435 | "chokidar": "^3.3.0", 436 | "livereload-js": "^3.1.0", 437 | "opts": ">= 1.2.0", 438 | "ws": "^6.2.1" 439 | }, 440 | "bin": { 441 | "livereload": "bin/livereload.js" 442 | }, 443 | "engines": { 444 | "node": ">=8.0.0" 445 | } 446 | }, 447 | "node_modules/livereload-js": { 448 | "version": "3.2.2", 449 | "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz", 450 | "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==", 451 | "dev": true 452 | }, 453 | "node_modules/local-access": { 454 | "version": "1.0.1", 455 | "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz", 456 | "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==", 457 | "engines": { 458 | "node": ">=6" 459 | } 460 | }, 461 | "node_modules/magic-string": { 462 | "version": "0.25.7", 463 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 464 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 465 | "dev": true, 466 | "dependencies": { 467 | "sourcemap-codec": "^1.4.4" 468 | } 469 | }, 470 | "node_modules/merge-stream": { 471 | "version": "2.0.0", 472 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 473 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 474 | "dev": true 475 | }, 476 | "node_modules/mime": { 477 | "version": "2.4.5", 478 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", 479 | "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==", 480 | "bin": { 481 | "mime": "cli.js" 482 | }, 483 | "engines": { 484 | "node": ">=4.0.0" 485 | } 486 | }, 487 | "node_modules/mri": { 488 | "version": "1.1.5", 489 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz", 490 | "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg==", 491 | "engines": { 492 | "node": ">=4" 493 | } 494 | }, 495 | "node_modules/normalize-path": { 496 | "version": "3.0.0", 497 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 498 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 499 | "dev": true, 500 | "engines": { 501 | "node": ">=0.10.0" 502 | } 503 | }, 504 | "node_modules/opts": { 505 | "version": "1.2.7", 506 | "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz", 507 | "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==", 508 | "dev": true 509 | }, 510 | "node_modules/path-parse": { 511 | "version": "1.0.7", 512 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 513 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 514 | "dev": true 515 | }, 516 | "node_modules/picomatch": { 517 | "version": "2.2.2", 518 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 519 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 520 | "dev": true, 521 | "engines": { 522 | "node": ">=8.6" 523 | } 524 | }, 525 | "node_modules/randombytes": { 526 | "version": "2.1.0", 527 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 528 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 529 | "dev": true, 530 | "dependencies": { 531 | "safe-buffer": "^5.1.0" 532 | } 533 | }, 534 | "node_modules/readdirp": { 535 | "version": "3.4.0", 536 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 537 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 538 | "dev": true, 539 | "dependencies": { 540 | "picomatch": "^2.2.1" 541 | }, 542 | "engines": { 543 | "node": ">=8.10.0" 544 | } 545 | }, 546 | "node_modules/require-relative": { 547 | "version": "0.8.7", 548 | "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", 549 | "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", 550 | "dev": true 551 | }, 552 | "node_modules/resolve": { 553 | "version": "1.17.0", 554 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 555 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 556 | "dev": true, 557 | "dependencies": { 558 | "path-parse": "^1.0.6" 559 | } 560 | }, 561 | "node_modules/rollup": { 562 | "version": "1.32.1", 563 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", 564 | "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", 565 | "dev": true, 566 | "dependencies": { 567 | "@types/estree": "*", 568 | "@types/node": "*", 569 | "acorn": "^7.1.0" 570 | }, 571 | "bin": { 572 | "rollup": "dist/bin/rollup" 573 | } 574 | }, 575 | "node_modules/rollup-plugin-livereload": { 576 | "version": "1.3.0", 577 | "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.3.0.tgz", 578 | "integrity": "sha512-abyqXaB21+nFHo+vJULBqfzNx6zXABC19UyvqgDfdoxR/8pFAd041GO+GIUe8ZYC2DbuMUmioh1Lvbk14YLZgw==", 579 | "dev": true, 580 | "dependencies": { 581 | "livereload": "^0.9.1" 582 | } 583 | }, 584 | "node_modules/rollup-plugin-svelte": { 585 | "version": "5.2.2", 586 | "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.2.tgz", 587 | "integrity": "sha512-I+TJ2T+VLKGbKQcpeMJ4AR2ciROqTZNjxbiMiH4Cn1yByaB9OEuy3CnrgHHuWatQcPuF3yIViyKX7OlETWDKOQ==", 588 | "dev": true, 589 | "dependencies": { 590 | "require-relative": "^0.8.7", 591 | "rollup-pluginutils": "^2.8.2", 592 | "sourcemap-codec": "^1.4.8" 593 | } 594 | }, 595 | "node_modules/rollup-plugin-terser": { 596 | "version": "5.3.1", 597 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", 598 | "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", 599 | "dev": true, 600 | "dependencies": { 601 | "@babel/code-frame": "^7.5.5", 602 | "jest-worker": "^24.9.0", 603 | "rollup-pluginutils": "^2.8.2", 604 | "serialize-javascript": "^4.0.0", 605 | "terser": "^4.6.2" 606 | }, 607 | "peerDependencies": { 608 | "rollup": ">=0.66.0 <3" 609 | } 610 | }, 611 | "node_modules/rollup-pluginutils": { 612 | "version": "2.8.2", 613 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 614 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 615 | "dev": true, 616 | "dependencies": { 617 | "estree-walker": "^0.6.1" 618 | } 619 | }, 620 | "node_modules/rollup-pluginutils/node_modules/estree-walker": { 621 | "version": "0.6.1", 622 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 623 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 624 | "dev": true 625 | }, 626 | "node_modules/sade": { 627 | "version": "1.7.3", 628 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.3.tgz", 629 | "integrity": "sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw==", 630 | "dependencies": { 631 | "mri": "^1.1.0" 632 | }, 633 | "engines": { 634 | "node": ">= 6" 635 | } 636 | }, 637 | "node_modules/safe-buffer": { 638 | "version": "5.2.1", 639 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 640 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 641 | "dev": true, 642 | "funding": [ 643 | { 644 | "type": "github", 645 | "url": "https://github.com/sponsors/feross" 646 | }, 647 | { 648 | "type": "patreon", 649 | "url": "https://www.patreon.com/feross" 650 | }, 651 | { 652 | "type": "consulting", 653 | "url": "https://feross.org/support" 654 | } 655 | ] 656 | }, 657 | "node_modules/serialize-javascript": { 658 | "version": "4.0.0", 659 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 660 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 661 | "dev": true, 662 | "dependencies": { 663 | "randombytes": "^2.1.0" 664 | } 665 | }, 666 | "node_modules/sirv": { 667 | "version": "0.4.2", 668 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.4.2.tgz", 669 | "integrity": "sha512-dQbZnsMaIiTQPZmbGmktz+c74zt/hyrJEB4tdp2Jj0RNv9J6B/OWR5RyrZEvIn9fyh9Zlg2OlE2XzKz6wMKGAw==", 670 | "dependencies": { 671 | "@polka/url": "^0.5.0", 672 | "mime": "^2.3.1" 673 | }, 674 | "engines": { 675 | "node": ">= 6" 676 | } 677 | }, 678 | "node_modules/sirv-cli": { 679 | "version": "0.4.5", 680 | "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-0.4.5.tgz", 681 | "integrity": "sha512-Fl6icSm0EwPrXSGid2xphMp//WNTSX2yENRAGnJuuZNmdc8LvE/BtdZD3MPn28ifAfDqTMwbB3dpcZojAIOiBg==", 682 | "dependencies": { 683 | "console-clear": "^1.1.0", 684 | "get-port": "^3.2.0", 685 | "kleur": "^3.0.0", 686 | "local-access": "^1.0.1", 687 | "sade": "^1.4.0", 688 | "sirv": "^0.4.2", 689 | "tinydate": "^1.0.0" 690 | }, 691 | "bin": { 692 | "sirv": "index.js" 693 | }, 694 | "engines": { 695 | "node": ">= 6" 696 | } 697 | }, 698 | "node_modules/source-map": { 699 | "version": "0.6.1", 700 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 701 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 702 | "dev": true, 703 | "engines": { 704 | "node": ">=0.10.0" 705 | } 706 | }, 707 | "node_modules/source-map-support": { 708 | "version": "0.5.19", 709 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 710 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 711 | "dev": true, 712 | "dependencies": { 713 | "buffer-from": "^1.0.0", 714 | "source-map": "^0.6.0" 715 | } 716 | }, 717 | "node_modules/sourcemap-codec": { 718 | "version": "1.4.8", 719 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 720 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 721 | "dev": true 722 | }, 723 | "node_modules/supports-color": { 724 | "version": "5.5.0", 725 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 726 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 727 | "dev": true, 728 | "dependencies": { 729 | "has-flag": "^3.0.0" 730 | }, 731 | "engines": { 732 | "node": ">=4" 733 | } 734 | }, 735 | "node_modules/svelte": { 736 | "version": "3.49.0", 737 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", 738 | "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", 739 | "dev": true, 740 | "engines": { 741 | "node": ">= 8" 742 | } 743 | }, 744 | "node_modules/terser": { 745 | "version": "4.7.0", 746 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", 747 | "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", 748 | "dev": true, 749 | "dependencies": { 750 | "commander": "^2.20.0", 751 | "source-map": "~0.6.1", 752 | "source-map-support": "~0.5.12" 753 | }, 754 | "bin": { 755 | "terser": "bin/terser" 756 | }, 757 | "engines": { 758 | "node": ">=6.0.0" 759 | } 760 | }, 761 | "node_modules/tinydate": { 762 | "version": "1.2.0", 763 | "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.2.0.tgz", 764 | "integrity": "sha512-3GwPk8VhDFnUZ2TrgkhXJs6hcMAIIw4x/xkz+ayK6dGoQmp2nUwKzBXK0WnMsqkh6vfUhpqQicQF3rbshfyJkg==", 765 | "engines": { 766 | "node": ">=4" 767 | } 768 | }, 769 | "node_modules/to-regex-range": { 770 | "version": "5.0.1", 771 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 772 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 773 | "dev": true, 774 | "dependencies": { 775 | "is-number": "^7.0.0" 776 | }, 777 | "engines": { 778 | "node": ">=8.0" 779 | } 780 | }, 781 | "node_modules/ws": { 782 | "version": "6.2.2", 783 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", 784 | "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", 785 | "dev": true, 786 | "dependencies": { 787 | "async-limiter": "~1.0.0" 788 | } 789 | } 790 | }, 791 | "dependencies": { 792 | "@babel/code-frame": { 793 | "version": "7.8.3", 794 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 795 | "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 796 | "dev": true, 797 | "requires": { 798 | "@babel/highlight": "^7.8.3" 799 | } 800 | }, 801 | "@babel/helper-validator-identifier": { 802 | "version": "7.9.5", 803 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 804 | "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 805 | "dev": true 806 | }, 807 | "@babel/highlight": { 808 | "version": "7.9.0", 809 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 810 | "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 811 | "dev": true, 812 | "requires": { 813 | "@babel/helper-validator-identifier": "^7.9.0", 814 | "chalk": "^2.0.0", 815 | "js-tokens": "^4.0.0" 816 | } 817 | }, 818 | "@polka/url": { 819 | "version": "0.5.0", 820 | "resolved": "https://registry.npmjs.org/@polka/url/-/url-0.5.0.tgz", 821 | "integrity": "sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==" 822 | }, 823 | "@rollup/plugin-commonjs": { 824 | "version": "11.0.2", 825 | "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-11.0.2.tgz", 826 | "integrity": "sha512-MPYGZr0qdbV5zZj8/2AuomVpnRVXRU5XKXb3HVniwRoRCreGlf5kOE081isNWeiLIi6IYkwTX9zE0/c7V8g81g==", 827 | "dev": true, 828 | "requires": { 829 | "@rollup/pluginutils": "^3.0.0", 830 | "estree-walker": "^1.0.1", 831 | "is-reference": "^1.1.2", 832 | "magic-string": "^0.25.2", 833 | "resolve": "^1.11.0" 834 | } 835 | }, 836 | "@rollup/plugin-node-resolve": { 837 | "version": "7.1.3", 838 | "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-7.1.3.tgz", 839 | "integrity": "sha512-RxtSL3XmdTAE2byxekYLnx+98kEUOrPHF/KRVjLH+DEIHy6kjIw7YINQzn+NXiH/NTrQLAwYs0GWB+csWygA9Q==", 840 | "dev": true, 841 | "requires": { 842 | "@rollup/pluginutils": "^3.0.8", 843 | "@types/resolve": "0.0.8", 844 | "builtin-modules": "^3.1.0", 845 | "is-module": "^1.0.0", 846 | "resolve": "^1.14.2" 847 | } 848 | }, 849 | "@rollup/pluginutils": { 850 | "version": "3.0.10", 851 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.0.10.tgz", 852 | "integrity": "sha512-d44M7t+PjmMrASHbhgpSbVgtL6EFyX7J4mYxwQ/c5eoaE6N2VgCgEcWVzNnwycIloti+/MpwFr8qfw+nRw00sw==", 853 | "dev": true, 854 | "requires": { 855 | "@types/estree": "0.0.39", 856 | "estree-walker": "^1.0.1", 857 | "picomatch": "^2.2.2" 858 | } 859 | }, 860 | "@types/estree": { 861 | "version": "0.0.39", 862 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", 863 | "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 864 | "dev": true 865 | }, 866 | "@types/node": { 867 | "version": "14.0.1", 868 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.1.tgz", 869 | "integrity": "sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA==", 870 | "dev": true 871 | }, 872 | "@types/resolve": { 873 | "version": "0.0.8", 874 | "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", 875 | "integrity": "sha512-auApPaJf3NPfe18hSoJkp8EbZzer2ISk7o8mCC3M9he/a04+gbMF97NkpD2S8riMGvm4BMRI59/SZQSaLTKpsQ==", 876 | "dev": true, 877 | "requires": { 878 | "@types/node": "*" 879 | } 880 | }, 881 | "acorn": { 882 | "version": "7.2.0", 883 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", 884 | "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", 885 | "dev": true 886 | }, 887 | "ansi-styles": { 888 | "version": "3.2.1", 889 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 890 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 891 | "dev": true, 892 | "requires": { 893 | "color-convert": "^1.9.0" 894 | } 895 | }, 896 | "anymatch": { 897 | "version": "3.1.1", 898 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", 899 | "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", 900 | "dev": true, 901 | "requires": { 902 | "normalize-path": "^3.0.0", 903 | "picomatch": "^2.0.4" 904 | } 905 | }, 906 | "async-limiter": { 907 | "version": "1.0.1", 908 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 909 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", 910 | "dev": true 911 | }, 912 | "binary-extensions": { 913 | "version": "2.0.0", 914 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 915 | "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 916 | "dev": true 917 | }, 918 | "braces": { 919 | "version": "3.0.2", 920 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 921 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 922 | "dev": true, 923 | "requires": { 924 | "fill-range": "^7.0.1" 925 | } 926 | }, 927 | "buffer-from": { 928 | "version": "1.1.1", 929 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 930 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 931 | "dev": true 932 | }, 933 | "builtin-modules": { 934 | "version": "3.1.0", 935 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.1.0.tgz", 936 | "integrity": "sha512-k0KL0aWZuBt2lrxrcASWDfwOLMnodeQjodT/1SxEQAXsHANgo6ZC/VEaSEHCXt7aSTZ4/4H5LKa+tBXmW7Vtvw==", 937 | "dev": true 938 | }, 939 | "chalk": { 940 | "version": "2.4.2", 941 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 942 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 943 | "dev": true, 944 | "requires": { 945 | "ansi-styles": "^3.2.1", 946 | "escape-string-regexp": "^1.0.5", 947 | "supports-color": "^5.3.0" 948 | } 949 | }, 950 | "chokidar": { 951 | "version": "3.4.0", 952 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", 953 | "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", 954 | "dev": true, 955 | "requires": { 956 | "anymatch": "~3.1.1", 957 | "braces": "~3.0.2", 958 | "fsevents": "~2.1.2", 959 | "glob-parent": "~5.1.0", 960 | "is-binary-path": "~2.1.0", 961 | "is-glob": "~4.0.1", 962 | "normalize-path": "~3.0.0", 963 | "readdirp": "~3.4.0" 964 | } 965 | }, 966 | "color-convert": { 967 | "version": "1.9.3", 968 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 969 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 970 | "dev": true, 971 | "requires": { 972 | "color-name": "1.1.3" 973 | } 974 | }, 975 | "color-name": { 976 | "version": "1.1.3", 977 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 978 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 979 | "dev": true 980 | }, 981 | "commander": { 982 | "version": "2.20.3", 983 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 984 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 985 | "dev": true 986 | }, 987 | "console-clear": { 988 | "version": "1.1.1", 989 | "resolved": "https://registry.npmjs.org/console-clear/-/console-clear-1.1.1.tgz", 990 | "integrity": "sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==" 991 | }, 992 | "escape-string-regexp": { 993 | "version": "1.0.5", 994 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 995 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 996 | "dev": true 997 | }, 998 | "estree-walker": { 999 | "version": "1.0.1", 1000 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", 1001 | "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", 1002 | "dev": true 1003 | }, 1004 | "fill-range": { 1005 | "version": "7.0.1", 1006 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 1007 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 1008 | "dev": true, 1009 | "requires": { 1010 | "to-regex-range": "^5.0.1" 1011 | } 1012 | }, 1013 | "fsevents": { 1014 | "version": "2.1.3", 1015 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", 1016 | "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", 1017 | "dev": true, 1018 | "optional": true 1019 | }, 1020 | "get-port": { 1021 | "version": "3.2.0", 1022 | "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz", 1023 | "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=" 1024 | }, 1025 | "glob-parent": { 1026 | "version": "5.1.2", 1027 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1028 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1029 | "dev": true, 1030 | "requires": { 1031 | "is-glob": "^4.0.1" 1032 | } 1033 | }, 1034 | "has-flag": { 1035 | "version": "3.0.0", 1036 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1037 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 1038 | "dev": true 1039 | }, 1040 | "is-binary-path": { 1041 | "version": "2.1.0", 1042 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1043 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1044 | "dev": true, 1045 | "requires": { 1046 | "binary-extensions": "^2.0.0" 1047 | } 1048 | }, 1049 | "is-extglob": { 1050 | "version": "2.1.1", 1051 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1052 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 1053 | "dev": true 1054 | }, 1055 | "is-glob": { 1056 | "version": "4.0.1", 1057 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", 1058 | "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", 1059 | "dev": true, 1060 | "requires": { 1061 | "is-extglob": "^2.1.1" 1062 | } 1063 | }, 1064 | "is-module": { 1065 | "version": "1.0.0", 1066 | "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1067 | "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", 1068 | "dev": true 1069 | }, 1070 | "is-number": { 1071 | "version": "7.0.0", 1072 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1073 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1074 | "dev": true 1075 | }, 1076 | "is-reference": { 1077 | "version": "1.1.4", 1078 | "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", 1079 | "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", 1080 | "dev": true, 1081 | "requires": { 1082 | "@types/estree": "0.0.39" 1083 | } 1084 | }, 1085 | "jest-worker": { 1086 | "version": "24.9.0", 1087 | "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", 1088 | "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", 1089 | "dev": true, 1090 | "requires": { 1091 | "merge-stream": "^2.0.0", 1092 | "supports-color": "^6.1.0" 1093 | }, 1094 | "dependencies": { 1095 | "supports-color": { 1096 | "version": "6.1.0", 1097 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", 1098 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", 1099 | "dev": true, 1100 | "requires": { 1101 | "has-flag": "^3.0.0" 1102 | } 1103 | } 1104 | } 1105 | }, 1106 | "js-tokens": { 1107 | "version": "4.0.0", 1108 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1109 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 1110 | "dev": true 1111 | }, 1112 | "kleur": { 1113 | "version": "3.0.3", 1114 | "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", 1115 | "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==" 1116 | }, 1117 | "livereload": { 1118 | "version": "0.9.1", 1119 | "resolved": "https://registry.npmjs.org/livereload/-/livereload-0.9.1.tgz", 1120 | "integrity": "sha512-9g7sua11kkyZNo2hLRCG3LuZZwqexoyEyecSlV8cAsfAVVCZqLzVir6XDqmH0r+Vzgnd5LrdHDMyjtFnJQLAYw==", 1121 | "dev": true, 1122 | "requires": { 1123 | "chokidar": "^3.3.0", 1124 | "livereload-js": "^3.1.0", 1125 | "opts": ">= 1.2.0", 1126 | "ws": "^6.2.1" 1127 | } 1128 | }, 1129 | "livereload-js": { 1130 | "version": "3.2.2", 1131 | "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-3.2.2.tgz", 1132 | "integrity": "sha512-xhScbNeC687ZINjEf/bD+BMiPx4s4q0mehcLb3zCc8+mykOtmaBR4vqzyIV9rIGdG9JjHaT0LiFdscvivCjX1Q==", 1133 | "dev": true 1134 | }, 1135 | "local-access": { 1136 | "version": "1.0.1", 1137 | "resolved": "https://registry.npmjs.org/local-access/-/local-access-1.0.1.tgz", 1138 | "integrity": "sha512-ykt2pgN0aqIy6KQC1CqdWTWkmUwNgaOS6dcpHVjyBJONA+Xi7AtSB1vuxC/U/0tjIP3wcRudwQk1YYzUvzk2bA==" 1139 | }, 1140 | "magic-string": { 1141 | "version": "0.25.7", 1142 | "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", 1143 | "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", 1144 | "dev": true, 1145 | "requires": { 1146 | "sourcemap-codec": "^1.4.4" 1147 | } 1148 | }, 1149 | "merge-stream": { 1150 | "version": "2.0.0", 1151 | "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", 1152 | "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", 1153 | "dev": true 1154 | }, 1155 | "mime": { 1156 | "version": "2.4.5", 1157 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.5.tgz", 1158 | "integrity": "sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==" 1159 | }, 1160 | "mri": { 1161 | "version": "1.1.5", 1162 | "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.5.tgz", 1163 | "integrity": "sha512-d2RKzMD4JNyHMbnbWnznPaa8vbdlq/4pNZ3IgdaGrVbBhebBsGUUE/6qorTMYNS6TwuH3ilfOlD2bf4Igh8CKg==" 1164 | }, 1165 | "normalize-path": { 1166 | "version": "3.0.0", 1167 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1168 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1169 | "dev": true 1170 | }, 1171 | "opts": { 1172 | "version": "1.2.7", 1173 | "resolved": "https://registry.npmjs.org/opts/-/opts-1.2.7.tgz", 1174 | "integrity": "sha512-hwZhzGGG/GQ7igxAVFOEun2N4fWul31qE9nfBdCnZGQCB5+L7tN9xZ+94B4aUpLOJx/of3zZs5XsuubayQYQjA==", 1175 | "dev": true 1176 | }, 1177 | "path-parse": { 1178 | "version": "1.0.7", 1179 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 1180 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 1181 | "dev": true 1182 | }, 1183 | "picomatch": { 1184 | "version": "2.2.2", 1185 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", 1186 | "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", 1187 | "dev": true 1188 | }, 1189 | "randombytes": { 1190 | "version": "2.1.0", 1191 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1192 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1193 | "dev": true, 1194 | "requires": { 1195 | "safe-buffer": "^5.1.0" 1196 | } 1197 | }, 1198 | "readdirp": { 1199 | "version": "3.4.0", 1200 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", 1201 | "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", 1202 | "dev": true, 1203 | "requires": { 1204 | "picomatch": "^2.2.1" 1205 | } 1206 | }, 1207 | "require-relative": { 1208 | "version": "0.8.7", 1209 | "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", 1210 | "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", 1211 | "dev": true 1212 | }, 1213 | "resolve": { 1214 | "version": "1.17.0", 1215 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", 1216 | "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", 1217 | "dev": true, 1218 | "requires": { 1219 | "path-parse": "^1.0.6" 1220 | } 1221 | }, 1222 | "rollup": { 1223 | "version": "1.32.1", 1224 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-1.32.1.tgz", 1225 | "integrity": "sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A==", 1226 | "dev": true, 1227 | "requires": { 1228 | "@types/estree": "*", 1229 | "@types/node": "*", 1230 | "acorn": "^7.1.0" 1231 | } 1232 | }, 1233 | "rollup-plugin-livereload": { 1234 | "version": "1.3.0", 1235 | "resolved": "https://registry.npmjs.org/rollup-plugin-livereload/-/rollup-plugin-livereload-1.3.0.tgz", 1236 | "integrity": "sha512-abyqXaB21+nFHo+vJULBqfzNx6zXABC19UyvqgDfdoxR/8pFAd041GO+GIUe8ZYC2DbuMUmioh1Lvbk14YLZgw==", 1237 | "dev": true, 1238 | "requires": { 1239 | "livereload": "^0.9.1" 1240 | } 1241 | }, 1242 | "rollup-plugin-svelte": { 1243 | "version": "5.2.2", 1244 | "resolved": "https://registry.npmjs.org/rollup-plugin-svelte/-/rollup-plugin-svelte-5.2.2.tgz", 1245 | "integrity": "sha512-I+TJ2T+VLKGbKQcpeMJ4AR2ciROqTZNjxbiMiH4Cn1yByaB9OEuy3CnrgHHuWatQcPuF3yIViyKX7OlETWDKOQ==", 1246 | "dev": true, 1247 | "requires": { 1248 | "require-relative": "^0.8.7", 1249 | "rollup-pluginutils": "^2.8.2", 1250 | "sourcemap-codec": "^1.4.8" 1251 | } 1252 | }, 1253 | "rollup-plugin-terser": { 1254 | "version": "5.3.1", 1255 | "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-5.3.1.tgz", 1256 | "integrity": "sha512-1pkwkervMJQGFYvM9nscrUoncPwiKR/K+bHdjv6PFgRo3cgPHoRT83y2Aa3GvINj4539S15t/tpFPb775TDs6w==", 1257 | "dev": true, 1258 | "requires": { 1259 | "@babel/code-frame": "^7.5.5", 1260 | "jest-worker": "^24.9.0", 1261 | "rollup-pluginutils": "^2.8.2", 1262 | "serialize-javascript": "^4.0.0", 1263 | "terser": "^4.6.2" 1264 | } 1265 | }, 1266 | "rollup-pluginutils": { 1267 | "version": "2.8.2", 1268 | "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", 1269 | "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", 1270 | "dev": true, 1271 | "requires": { 1272 | "estree-walker": "^0.6.1" 1273 | }, 1274 | "dependencies": { 1275 | "estree-walker": { 1276 | "version": "0.6.1", 1277 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", 1278 | "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", 1279 | "dev": true 1280 | } 1281 | } 1282 | }, 1283 | "sade": { 1284 | "version": "1.7.3", 1285 | "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.3.tgz", 1286 | "integrity": "sha512-m4BctppMvJ60W1dXnHq7jMmFe3hPJZDAH85kQ3ACTo7XZNVUuTItCQ+2HfyaMeV5cKrbw7l4vD/6We3GBxvdJw==", 1287 | "requires": { 1288 | "mri": "^1.1.0" 1289 | } 1290 | }, 1291 | "safe-buffer": { 1292 | "version": "5.2.1", 1293 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1294 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1295 | "dev": true 1296 | }, 1297 | "serialize-javascript": { 1298 | "version": "4.0.0", 1299 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", 1300 | "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", 1301 | "dev": true, 1302 | "requires": { 1303 | "randombytes": "^2.1.0" 1304 | } 1305 | }, 1306 | "sirv": { 1307 | "version": "0.4.2", 1308 | "resolved": "https://registry.npmjs.org/sirv/-/sirv-0.4.2.tgz", 1309 | "integrity": "sha512-dQbZnsMaIiTQPZmbGmktz+c74zt/hyrJEB4tdp2Jj0RNv9J6B/OWR5RyrZEvIn9fyh9Zlg2OlE2XzKz6wMKGAw==", 1310 | "requires": { 1311 | "@polka/url": "^0.5.0", 1312 | "mime": "^2.3.1" 1313 | } 1314 | }, 1315 | "sirv-cli": { 1316 | "version": "0.4.5", 1317 | "resolved": "https://registry.npmjs.org/sirv-cli/-/sirv-cli-0.4.5.tgz", 1318 | "integrity": "sha512-Fl6icSm0EwPrXSGid2xphMp//WNTSX2yENRAGnJuuZNmdc8LvE/BtdZD3MPn28ifAfDqTMwbB3dpcZojAIOiBg==", 1319 | "requires": { 1320 | "console-clear": "^1.1.0", 1321 | "get-port": "^3.2.0", 1322 | "kleur": "^3.0.0", 1323 | "local-access": "^1.0.1", 1324 | "sade": "^1.4.0", 1325 | "sirv": "^0.4.2", 1326 | "tinydate": "^1.0.0" 1327 | } 1328 | }, 1329 | "source-map": { 1330 | "version": "0.6.1", 1331 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1332 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1333 | "dev": true 1334 | }, 1335 | "source-map-support": { 1336 | "version": "0.5.19", 1337 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", 1338 | "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", 1339 | "dev": true, 1340 | "requires": { 1341 | "buffer-from": "^1.0.0", 1342 | "source-map": "^0.6.0" 1343 | } 1344 | }, 1345 | "sourcemap-codec": { 1346 | "version": "1.4.8", 1347 | "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", 1348 | "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", 1349 | "dev": true 1350 | }, 1351 | "supports-color": { 1352 | "version": "5.5.0", 1353 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1354 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1355 | "dev": true, 1356 | "requires": { 1357 | "has-flag": "^3.0.0" 1358 | } 1359 | }, 1360 | "svelte": { 1361 | "version": "3.49.0", 1362 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.49.0.tgz", 1363 | "integrity": "sha512-+lmjic1pApJWDfPCpUUTc1m8azDqYCG1JN9YEngrx/hUyIcFJo6VZhj0A1Ai0wqoHcEIuQy+e9tk+4uDgdtsFA==", 1364 | "dev": true 1365 | }, 1366 | "terser": { 1367 | "version": "4.7.0", 1368 | "resolved": "https://registry.npmjs.org/terser/-/terser-4.7.0.tgz", 1369 | "integrity": "sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw==", 1370 | "dev": true, 1371 | "requires": { 1372 | "commander": "^2.20.0", 1373 | "source-map": "~0.6.1", 1374 | "source-map-support": "~0.5.12" 1375 | } 1376 | }, 1377 | "tinydate": { 1378 | "version": "1.2.0", 1379 | "resolved": "https://registry.npmjs.org/tinydate/-/tinydate-1.2.0.tgz", 1380 | "integrity": "sha512-3GwPk8VhDFnUZ2TrgkhXJs6hcMAIIw4x/xkz+ayK6dGoQmp2nUwKzBXK0WnMsqkh6vfUhpqQicQF3rbshfyJkg==" 1381 | }, 1382 | "to-regex-range": { 1383 | "version": "5.0.1", 1384 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1385 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1386 | "dev": true, 1387 | "requires": { 1388 | "is-number": "^7.0.0" 1389 | } 1390 | }, 1391 | "ws": { 1392 | "version": "6.2.2", 1393 | "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.2.tgz", 1394 | "integrity": "sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==", 1395 | "dev": true, 1396 | "requires": { 1397 | "async-limiter": "~1.0.0" 1398 | } 1399 | } 1400 | } 1401 | } 1402 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-app", 3 | "version": "1.0.0", 4 | "scripts": { 5 | "build": "rollup -c", 6 | "dev": "rollup -c -w", 7 | "start": "env HOST=0.0.0.0 sirv public" 8 | }, 9 | "devDependencies": { 10 | "@rollup/plugin-commonjs": "11.0.2", 11 | "@rollup/plugin-node-resolve": "^7.0.0", 12 | "rollup": "^1.20.0", 13 | "rollup-plugin-livereload": "^1.0.0", 14 | "rollup-plugin-svelte": "^5.0.3", 15 | "rollup-plugin-terser": "^5.1.2", 16 | "svelte": "^3.49.0" 17 | }, 18 | "dependencies": { 19 | "sirv-cli": "^0.4.4" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /public/corner.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/roeeyn/svelte-tetris/79d645c07a956b8a6049d6b4db99407474ecf522/public/favicon.ico -------------------------------------------------------------------------------- /public/global.css: -------------------------------------------------------------------------------- 1 | body { 2 | margin: 0; 3 | } 4 | 5 | * { 6 | box-sizing: border-box; 7 | } 8 | 9 | p { 10 | font-family: "Roboto Mono", monospace; 11 | color: hsl(198, 52%, 95%); 12 | } 13 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Svelte Tetris 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import svelte from 'rollup-plugin-svelte'; 2 | import resolve from '@rollup/plugin-node-resolve'; 3 | import commonjs from '@rollup/plugin-commonjs'; 4 | import livereload from 'rollup-plugin-livereload'; 5 | import { terser } from 'rollup-plugin-terser'; 6 | 7 | const production = !process.env.ROLLUP_WATCH; 8 | 9 | export default { 10 | input: 'src/main.js', 11 | output: { 12 | sourcemap: true, 13 | format: 'iife', 14 | name: 'app', 15 | file: 'public/build/bundle.js' 16 | }, 17 | plugins: [ 18 | svelte({ 19 | // enable run-time checks when not in production 20 | dev: !production, 21 | // we'll extract any component CSS out into 22 | // a separate file - better for performance 23 | css: css => { 24 | css.write('public/build/bundle.css'); 25 | } 26 | }), 27 | 28 | // If you have external dependencies installed from 29 | // npm, you'll most likely need these plugins. In 30 | // some cases you'll need additional configuration - 31 | // consult the documentation for details: 32 | // https://github.com/rollup/plugins/tree/master/packages/commonjs 33 | resolve({ 34 | browser: true, 35 | dedupe: ['svelte'] 36 | }), 37 | commonjs(), 38 | 39 | // In dev mode, call `npm run start` once 40 | // the bundle has been generated 41 | !production && serve(), 42 | 43 | // Watch the `public` directory and refresh the 44 | // browser on changes when not in production 45 | !production && livereload('public'), 46 | 47 | // If we're building for production (npm run build 48 | // instead of npm run dev), minify 49 | production && terser() 50 | ], 51 | watch: { 52 | clearScreen: false 53 | } 54 | }; 55 | 56 | function serve() { 57 | let started = false; 58 | 59 | return { 60 | writeBundle() { 61 | if (!started) { 62 | started = true; 63 | 64 | require('child_process').spawn('npm', ['run', 'start', '--', '--dev'], { 65 | stdio: ['ignore', 'inherit', 'inherit'], 66 | shell: true 67 | }); 68 | } 69 | } 70 | }; 71 | } 72 | -------------------------------------------------------------------------------- /src/App.svelte: -------------------------------------------------------------------------------- 1 | 6 | 7 | 24 | 25 |
26 | 27 | fork in GitHub 28 | 29 | 30 | 31 |
32 | -------------------------------------------------------------------------------- /src/components/Game.svelte: -------------------------------------------------------------------------------- 1 | 166 | 167 | 178 | 179 | 180 |
181 |
182 | {#each squares as { color }, i} 183 |
184 | {/each} 185 |
186 |
187 | -------------------------------------------------------------------------------- /src/components/GameConsole.svelte: -------------------------------------------------------------------------------- 1 | 48 | 49 | 237 | 238 | 239 | 240 |
241 |
242 |
243 | 244 |
245 |

Lines:

246 |

{$destroyedLines}

247 | {#if $hasGameEnded} 248 |

Game Over!

249 | {/if} 250 |
251 |
252 |
253 |
254 |
259 |
260 |
277 |