Browse Source

Switch to ES modules and snowpack

Thomas Dy 3 years ago
parent
commit
1f93616734
28 changed files with 864 additions and 88 deletions
  1. 1 3
      .gitignore
  2. 0 0
      assets/decide.wav
  3. 1 1
      assets/levels.json
  4. 0 0
      assets/select.wav
  5. 744 2
      package-lock.json
  6. 4 1
      package.json
  7. 29 0
      snowpack.config.js
  8. 2 2
      src/audio.ts
  9. 2 2
      src/background.ts
  10. 5 8
      src/display.ts
  11. 0 0
      src/editor.css
  12. 2 5
      src/editor.html
  13. 7 5
      src/editor.ts
  14. 11 7
      src/game.ts
  15. 3 5
      src/game/common.ts
  16. 5 4
      src/game/loading.ts
  17. 10 6
      src/game/select.ts
  18. 12 7
      src/game/typing.ts
  19. 2 7
      src/index.html
  20. 6 0
      src/index.ts
  21. 7 10
      src/kana.ts
  22. 1 2
      src/level.ts
  23. 0 2
      src/polyfill.ts
  24. 1 2
      src/state.ts
  25. 0 0
      src/style.css
  26. 0 2
      src/util.ts
  27. 0 2
      src/youtube.ts
  28. 9 3
      tsconfig.json

+ 1 - 3
.gitignore

@@ -1,4 +1,2 @@
 node_modules
-dist/tm
-dist/bundle.js
-dist/bundle.js.map
+dist

+ 0 - 0
dist/decide.wav → assets/decide.wav


+ 1 - 1
dist/levels.json → assets/levels.json

@@ -1,5 +1,5 @@
 {
-  "background": "black",
+  "background": "royalblue",
   "baseColor": "white",
   "highlightColor": "cyan",
   "selectSound": "select.wav",

+ 0 - 0
dist/select.wav → assets/select.wav


+ 744 - 2
package-lock.json

@@ -1,16 +1,428 @@
 {
   "name": "typingfreaks",
-  "version": "0.0.1",
+  "version": "0.0.2",
   "lockfileVersion": 2,
   "requires": true,
   "packages": {
     "": {
-      "version": "0.0.1",
+      "version": "0.0.2",
       "license": "ISC",
       "devDependencies": {
+        "@snowpack/plugin-typescript": "^1.2.1",
+        "snowpack": "^3.2.2",
         "typescript": "^4.0.0"
       }
     },
+    "node_modules/@snowpack/plugin-typescript": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@snowpack/plugin-typescript/-/plugin-typescript-1.2.1.tgz",
+      "integrity": "sha512-wU+JNaMVkqGsqTaUY7TnEMhGt/3URTgA9dpMCtZX6wn/ceA7Gwlmue/sOLynf0OTNLygHPvjiQECQYkEi3LTtg==",
+      "dev": true,
+      "dependencies": {
+        "execa": "^5.0.0",
+        "npm-run-path": "^4.0.1"
+      },
+      "peerDependencies": {
+        "typescript": "*"
+      }
+    },
+    "node_modules/big-integer": {
+      "version": "1.6.48",
+      "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz",
+      "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==",
+      "dev": true,
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/bplist-parser": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz",
+      "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=",
+      "dev": true,
+      "dependencies": {
+        "big-integer": "^1.6.7"
+      }
+    },
+    "node_modules/cli-spinners": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz",
+      "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/default-browser-id": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-2.0.0.tgz",
+      "integrity": "sha1-AezONxpx6F8VoXF354YwR+c9vn0=",
+      "dev": true,
+      "dependencies": {
+        "bplist-parser": "^0.1.0",
+        "pify": "^2.3.0",
+        "untildify": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/esbuild": {
+      "version": "0.9.7",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.9.7.tgz",
+      "integrity": "sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==",
+      "dev": true,
+      "hasInstallScript": true,
+      "bin": {
+        "esbuild": "bin/esbuild"
+      }
+    },
+    "node_modules/execa": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+      "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+      "dev": true,
+      "dependencies": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sindresorhus/execa?sponsor=1"
+      }
+    },
+    "node_modules/fdir": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-5.0.0.tgz",
+      "integrity": "sha512-cteqwWMA43lEmgwOg5HSdvhVFD39vHjQDhZkRMlKmeoNPtSSgUw1nUypydiY2upMdGiBFBZvNBDbnoBh0yCzaQ==",
+      "dev": true
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "node_modules/get-stream": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+      "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+      "dev": true,
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "dependencies": {
+        "function-bind": "^1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true,
+      "engines": {
+        "node": ">=10.17.0"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+      "dev": true,
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-docker": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
+      "dev": true,
+      "bin": {
+        "is-docker": "cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/is-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "dependencies": {
+        "is-docker": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "node_modules/mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "dependencies": {
+        "path-key": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "dependencies": {
+        "mimic-fn": "^2.1.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+      "dev": true,
+      "dependencies": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "node_modules/picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/resolve": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "dev": true,
+      "dependencies": {
+        "is-core-module": "^2.2.0",
+        "path-parse": "^1.0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/rollup": {
+      "version": "2.44.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.44.0.tgz",
+      "integrity": "sha512-rGSF4pLwvuaH/x4nAS+zP6UNn5YUDWf/TeEU5IoXSZKBbKRNTCI3qMnYXKZgrC0D2KzS2baiOZt1OlqhMu5rnQ==",
+      "dev": true,
+      "bin": {
+        "rollup": "dist/bin/rollup"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.1"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "dev": true
+    },
+    "node_modules/snowpack": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.2.2.tgz",
+      "integrity": "sha512-lt2FEFpvrWSBhFPlQxDr2hG7hnyucLEh7QSJqUUcAljrt8UoWJjTZlvZ4shGiJLkNjxMgGrJKj37y08/9OvXMw==",
+      "dev": true,
+      "dependencies": {
+        "cli-spinners": "^2.5.0",
+        "default-browser-id": "^2.0.0",
+        "esbuild": "^0.9.3",
+        "fdir": "^5.0.0",
+        "open": "^7.0.4",
+        "picomatch": "^2.2.2",
+        "resolve": "^1.20.0",
+        "rollup": "^2.34.0"
+      },
+      "bin": {
+        "snowpack": "index.bin.js",
+        "sp": "index.bin.js"
+      },
+      "engines": {
+        "node": ">=10.19.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "^2.2.0"
+      }
+    },
+    "node_modules/strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
     "node_modules/typescript": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
@@ -23,14 +435,344 @@
       "engines": {
         "node": ">=4.2.0"
       }
+    },
+    "node_modules/untildify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
+      "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
+      "dev": true,
+      "dependencies": {
+        "os-homedir": "^1.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
     }
   },
   "dependencies": {
+    "@snowpack/plugin-typescript": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/@snowpack/plugin-typescript/-/plugin-typescript-1.2.1.tgz",
+      "integrity": "sha512-wU+JNaMVkqGsqTaUY7TnEMhGt/3URTgA9dpMCtZX6wn/ceA7Gwlmue/sOLynf0OTNLygHPvjiQECQYkEi3LTtg==",
+      "dev": true,
+      "requires": {
+        "execa": "^5.0.0",
+        "npm-run-path": "^4.0.1"
+      }
+    },
+    "big-integer": {
+      "version": "1.6.48",
+      "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.48.tgz",
+      "integrity": "sha512-j51egjPa7/i+RdiRuJbPdJ2FIUYYPhvYLjzoYbcMMm62ooO6F94fETG4MTs46zPAF9Brs04OajboA/qTGuz78w==",
+      "dev": true
+    },
+    "bplist-parser": {
+      "version": "0.1.1",
+      "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.1.1.tgz",
+      "integrity": "sha1-1g1dzCDLptx+HymbNdPh+V2vuuY=",
+      "dev": true,
+      "requires": {
+        "big-integer": "^1.6.7"
+      }
+    },
+    "cli-spinners": {
+      "version": "2.6.0",
+      "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.0.tgz",
+      "integrity": "sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q==",
+      "dev": true
+    },
+    "cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      }
+    },
+    "default-browser-id": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-2.0.0.tgz",
+      "integrity": "sha1-AezONxpx6F8VoXF354YwR+c9vn0=",
+      "dev": true,
+      "requires": {
+        "bplist-parser": "^0.1.0",
+        "pify": "^2.3.0",
+        "untildify": "^2.0.0"
+      }
+    },
+    "esbuild": {
+      "version": "0.9.7",
+      "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.9.7.tgz",
+      "integrity": "sha512-VtUf6aQ89VTmMLKrWHYG50uByMF4JQlVysb8dmg6cOgW8JnFCipmz7p+HNBl+RR3LLCuBxFGVauAe2wfnF9bLg==",
+      "dev": true
+    },
+    "execa": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz",
+      "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==",
+      "dev": true,
+      "requires": {
+        "cross-spawn": "^7.0.3",
+        "get-stream": "^6.0.0",
+        "human-signals": "^2.1.0",
+        "is-stream": "^2.0.0",
+        "merge-stream": "^2.0.0",
+        "npm-run-path": "^4.0.1",
+        "onetime": "^5.1.2",
+        "signal-exit": "^3.0.3",
+        "strip-final-newline": "^2.0.0"
+      }
+    },
+    "fdir": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/fdir/-/fdir-5.0.0.tgz",
+      "integrity": "sha512-cteqwWMA43lEmgwOg5HSdvhVFD39vHjQDhZkRMlKmeoNPtSSgUw1nUypydiY2upMdGiBFBZvNBDbnoBh0yCzaQ==",
+      "dev": true
+    },
+    "fsevents": {
+      "version": "2.3.2",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+      "dev": true,
+      "optional": true
+    },
+    "function-bind": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
+      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
+      "dev": true
+    },
+    "get-stream": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz",
+      "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==",
+      "dev": true
+    },
+    "has": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
+      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
+      "dev": true,
+      "requires": {
+        "function-bind": "^1.1.1"
+      }
+    },
+    "human-signals": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+      "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+      "dev": true
+    },
+    "is-core-module": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
+      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
+    "is-docker": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+      "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
+      "dev": true
+    },
+    "is-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+      "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+      "dev": true
+    },
+    "is-wsl": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+      "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+      "dev": true,
+      "requires": {
+        "is-docker": "^2.0.0"
+      }
+    },
+    "isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+      "dev": true
+    },
+    "merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+      "dev": true
+    },
+    "mimic-fn": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+      "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+      "dev": true
+    },
+    "npm-run-path": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+      "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+      "dev": true,
+      "requires": {
+        "path-key": "^3.0.0"
+      }
+    },
+    "onetime": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+      "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+      "dev": true,
+      "requires": {
+        "mimic-fn": "^2.1.0"
+      }
+    },
+    "open": {
+      "version": "7.4.2",
+      "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+      "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
+      "dev": true,
+      "requires": {
+        "is-docker": "^2.0.0",
+        "is-wsl": "^2.1.1"
+      }
+    },
+    "os-homedir": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+      "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
+      "dev": true
+    },
+    "path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "dev": true
+    },
+    "path-parse": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
+      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "dev": true
+    },
+    "picomatch": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+      "dev": true
+    },
+    "pify": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+      "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+      "dev": true
+    },
+    "resolve": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+      "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+      "dev": true,
+      "requires": {
+        "is-core-module": "^2.2.0",
+        "path-parse": "^1.0.6"
+      }
+    },
+    "rollup": {
+      "version": "2.44.0",
+      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.44.0.tgz",
+      "integrity": "sha512-rGSF4pLwvuaH/x4nAS+zP6UNn5YUDWf/TeEU5IoXSZKBbKRNTCI3qMnYXKZgrC0D2KzS2baiOZt1OlqhMu5rnQ==",
+      "dev": true,
+      "requires": {
+        "fsevents": "~2.3.1"
+      }
+    },
+    "shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dev": true,
+      "requires": {
+        "shebang-regex": "^3.0.0"
+      }
+    },
+    "shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "dev": true
+    },
+    "signal-exit": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
+      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "dev": true
+    },
+    "snowpack": {
+      "version": "3.2.2",
+      "resolved": "https://registry.npmjs.org/snowpack/-/snowpack-3.2.2.tgz",
+      "integrity": "sha512-lt2FEFpvrWSBhFPlQxDr2hG7hnyucLEh7QSJqUUcAljrt8UoWJjTZlvZ4shGiJLkNjxMgGrJKj37y08/9OvXMw==",
+      "dev": true,
+      "requires": {
+        "cli-spinners": "^2.5.0",
+        "default-browser-id": "^2.0.0",
+        "esbuild": "^0.9.3",
+        "fdir": "^5.0.0",
+        "fsevents": "^2.2.0",
+        "open": "^7.0.4",
+        "picomatch": "^2.2.2",
+        "resolve": "^1.20.0",
+        "rollup": "^2.34.0"
+      }
+    },
+    "strip-final-newline": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+      "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+      "dev": true
+    },
     "typescript": {
       "version": "4.2.3",
       "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.2.3.tgz",
       "integrity": "sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw==",
       "dev": true
+    },
+    "untildify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/untildify/-/untildify-2.1.0.tgz",
+      "integrity": "sha1-F+soB5h/dpUunASF/DEdBqgmouA=",
+      "dev": true,
+      "requires": {
+        "os-homedir": "^1.0.0"
+      }
+    },
+    "which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dev": true,
+      "requires": {
+        "isexe": "^2.0.0"
+      }
     }
   }
 }

+ 4 - 1
package.json

@@ -3,12 +3,15 @@
   "version": "0.0.2",
   "description": "A typing game for Japanese",
   "scripts": {
-    "build": "tsc",
+    "build": "snowpack build",
+    "dev": "snowpack dev",
     "test": "echo \"Error: no test specified\" && exit 1"
   },
   "author": "Thomas Dy <thatsmydoing@gmail.com",
   "license": "ISC",
   "devDependencies": {
+    "@snowpack/plugin-typescript": "^1.2.1",
+    "snowpack": "^3.2.2",
     "typescript": "^4.0.0"
   }
 }

+ 29 - 0
snowpack.config.js

@@ -0,0 +1,29 @@
+// Snowpack Configuration File
+// See all supported options: https://www.snowpack.dev/reference/configuration
+
+/** @type {import("snowpack").SnowpackUserConfig } */
+module.exports = {
+  mount: {
+    "src": "/",
+    "assets": "/"
+  },
+  plugins: [
+    "@snowpack/plugin-typescript"
+  ],
+  packageOptions: {
+    /* ... */
+  },
+  devOptions: {
+    open: 'none',
+    port: 8000
+  },
+  buildOptions: {
+    out: 'dist'
+    /* ... */
+  },
+  optimize: {
+    bundle: true,
+    minify: true,
+    target: 'es2018'
+  }
+};

+ 2 - 2
src/audio.ts

@@ -1,4 +1,5 @@
-namespace audio {
+import * as youtube from './youtube';
+
   export class AudioManager {
     context: AudioContext;
     volume: GainNode;
@@ -293,4 +294,3 @@ namespace audio {
       }
     }
   }
-}

+ 2 - 2
src/background.ts

@@ -1,4 +1,5 @@
-namespace background {
+import * as util from './util';
+
   export class BackgroundManager {
     element: HTMLElement;
     video: HTMLElement;
@@ -62,4 +63,3 @@ namespace background {
       this.element.appendChild(this.next);
     }
   }
-}

+ 5 - 8
src/display.ts

@@ -5,13 +5,11 @@
  * kanji is simply just for reading.
  */
 
-/// <reference path="kana.ts" />
-/// <reference path="state.ts" />
-/// <reference path="util.ts" />
-
-namespace display {
-  import InputState = kana.KanaInputState;
-  import TransitionResult = state.TransitionResult;
+import { KanaInputState as InputState } from './kana';
+import * as state from './state';
+import { TransitionResult } from './state';
+import * as level from './level';
+import * as util from './util';
 
   class SingleKanaDisplayComponent {
     element: HTMLElement;
@@ -334,4 +332,3 @@ namespace display {
       this.clearObservers();
     }
   }
-}

+ 0 - 0
dist/editor.css → src/editor.css


+ 2 - 5
dist/editor.html → src/editor.html

@@ -1,3 +1,4 @@
+<!doctype html>
 <html>
   <head>
     <title>Typing Freaks Editor</title>
@@ -53,10 +54,6 @@
         <button class="remove-section">Remove</button>
       </li>
     </template>
-    <script type="text/javascript" src="bundle.js"></script>
-    <script type="text/javascript">
-      let e = new editor.Editor();
-      e.start();
-    </script>
+    <script type="module" src="editor.js"></script>
   </body>
 </html>

+ 7 - 5
src/editor.ts

@@ -1,8 +1,8 @@
-/// <reference path="util.ts" />
-/// <reference path="level.ts" />
-/// <reference path="audio.ts" />
+import * as audio from './audio';
+import * as level from './level';
+import * as util from './util';
+import * as youtube from './youtube';
 
-namespace editor {
   export class Editor {
     audioManager: audio.AudioManager;
     urlElement: HTMLInputElement;
@@ -355,4 +355,6 @@ namespace editor {
       })
     }
   }
-}
+
+let e = new Editor();
+e.start();

+ 11 - 7
src/game.ts

@@ -1,10 +1,15 @@
-/// <reference path="audio.ts" />
-/// <reference path="background.ts" />
-/// <reference path="polyfill.ts" />
-/// <reference path="game/common.ts" />
-/// <reference path="game/loading.ts" />
+import * as audio from './audio';
+import * as background from './background';
+import * as util from './util';
+import * as polyfill from './polyfill';
+
+import {
+  GameContext,
+  Screen,
+  ScreenManager,
+} from './game/common';
+import { LoadingScreen } from './game/loading';
 
-namespace game {
   export class MainController extends ScreenManager {
     loadingScreen: Screen;
 
@@ -51,4 +56,3 @@ namespace game {
       this.container.style.setProperty('--base-font-size', `${fontSize}px`);
     }
   }
-}

+ 3 - 5
src/game/common.ts

@@ -1,8 +1,7 @@
-/// <reference path="../audio.ts" />
-/// <reference path="../background.ts" />
-/// <reference path="../level.ts" />
+import * as audio from '../audio';
+import * as background from '../background';
+import * as level from '../level';
 
-namespace game {
   export interface Screen {
     readonly name: string;
     handleInput(key: string): void;
@@ -65,4 +64,3 @@ namespace game {
 
     switchScreen(screen: Screen): void;
   }
-}

+ 5 - 4
src/game/loading.ts

@@ -1,7 +1,9 @@
-/// <reference path="select.ts" />
-/// <reference path="common.ts" />
+import * as audio from '../audio';
+import * as level from '../level';
+import * as util from '../util';
+import { GameContext, Screen } from './common';
+import { SelectScreen } from './select';
 
-namespace game {
   export class LoadingScreen implements Screen {
     readonly name: string = 'loading';
 
@@ -72,4 +74,3 @@ namespace game {
 
     transitionExit(): void {}
   }
-}

+ 10 - 6
src/game/select.ts

@@ -1,8 +1,13 @@
-/// <reference path="common.ts" />
-/// <reference path="typing.ts" />
-/// <reference path="../util.ts" />
+import * as level from '../level';
+import * as util from '../util';
+import {
+  GameContext,
+  Screen,
+} from './common';
+import {
+  TypingScreen
+} from './typing';
 
-namespace game {
   export class SelectScreen implements Screen {
     readonly name: string = 'select';
     folderInfo: HTMLElement;
@@ -89,7 +94,7 @@ namespace game {
         decideSound.play();
       }
       let level = this.currentLevelSet.levels[index];
-      let gameScreen = new game.TypingScreen(this.context, level, this);
+      let gameScreen = new TypingScreen(this.context, level, this);
       this.context.switchScreen(gameScreen);
     }
 
@@ -232,4 +237,3 @@ namespace game {
       this.onSongChoose(this.currentIndex);
     }
   }
-}

+ 12 - 7
src/game/typing.ts

@@ -1,10 +1,16 @@
-/// <reference path="../audio.ts" />
-/// <reference path="../kana.ts" />
-/// <reference path="../level.ts" />
-/// <reference path="../display.ts" />
-/// <reference path="common.ts" />
+import * as audio from '../audio';
+import * as display from '../display';
+import * as level from '../level';
+import * as kana from '../kana';
+import * as util from '../util';
+import * as youtube from '../youtube';
+
+import {
+  GameContext,
+  Screen,
+  ScreenManager,
+} from './common';
 
-namespace game {
   import Level = level.Level;
 
   class TypingScreenContext {
@@ -364,4 +370,3 @@ namespace game {
       }
     }
   }
-}

+ 2 - 7
dist/index.html → src/index.html

@@ -1,3 +1,4 @@
+<!doctype html>
 <html>
   <head>
     <title>Typing Freaks</title>
@@ -103,12 +104,6 @@
         </template>
       </template>
     </div>
-    <script type="text/javascript" src="bundle.js"></script>
-    <script type="text/javascript">
-      new game.MainController(
-        document.querySelector('#container'),
-        'levels.json'
-      ).start();
-    </script>
+    <script type="module" src="index.js"></script>
   </body>
 </html>

+ 6 - 0
src/index.ts

@@ -0,0 +1,6 @@
+import { MainController } from './game';
+
+new MainController(
+  document.querySelector('#container')!,
+  'levels.json'
+).start();

+ 7 - 10
src/kana.ts

@@ -15,13 +15,12 @@
  * up in the display.
  */
 
-/// <reference path="state.ts" />
-
-namespace kana {
-  import State = state.State;
-  import StateMachine = state.StateMachine;
-  import TransitionResult = state.TransitionResult;
-  import t = state.makeTransition;
+import * as state from './state';
+import {
+  State,
+  StateMachine,
+  makeTransition as t,
+} from './state';
 
   function literal(source: string, ...extraBoundaries: number[]): StateMachine {
     let transitions: state.Transition[] = [];
@@ -416,7 +415,7 @@ namespace kana {
    * care to not change the length of the string as we have to match it
    * one-for-one so we can display the original source kana.
    */
-  function normalizeInput(input: string): string {
+  export function normalizeInput(input: string): string {
     return input.toLowerCase().split('').map(letter => {
       let transform = KATAKANA_MAPPING[letter];
       if (transform !== undefined) {
@@ -506,5 +505,3 @@ namespace kana {
       return remaining;
     }
   }
-
-}

+ 1 - 2
src/level.ts

@@ -3,7 +3,7 @@
  * that you have to complete. Each line has the kanji of the line, which is used
  * solely for display and the kana of the line which the input is based.
  */
-namespace level {
+
   export interface Line {
     kanji: string,
     kana: string,
@@ -184,4 +184,3 @@ namespace level {
     }
     return lines;
   }
-}

+ 0 - 2
src/polyfill.ts

@@ -1,4 +1,3 @@
-namespace polyfill {
   interface API {
     request: string;
     changeEvent: string;
@@ -48,4 +47,3 @@ namespace polyfill {
   }
 
   export const fullscreen = new FullscreenPolyfill();
-}

+ 1 - 2
src/state.ts

@@ -5,7 +5,7 @@
  * state name and is also used to represent the remaining text to be input at
  * that particular state.
  */
-namespace state {
+
   export enum TransitionResult { FAILED, SUCCESS, SKIPPED }
 
   interface StateMap {
@@ -171,4 +171,3 @@ namespace state {
   ): Transition {
     return { from, input, to, boundary };
   }
-}

+ 0 - 0
dist/style.css → src/style.css


+ 0 - 2
src/util.ts

@@ -1,4 +1,3 @@
-namespace util {
   export function loadTemplate(element: ParentNode, id: string): DocumentFragment {
     let template = element.querySelector(`#${id}-template`);
     if (template !== null && template instanceof HTMLTemplateElement) {
@@ -120,4 +119,3 @@ namespace util {
       resolve: resolve!,
     }
   }
-}

+ 0 - 2
src/youtube.ts

@@ -1,4 +1,3 @@
-namespace youtube {
   let apiPromise: Promise<void>;
 
   export function loadYoutubeApi(): Promise<void> {
@@ -55,4 +54,3 @@ namespace youtube {
       return null;
     }
   }
-}

+ 9 - 3
tsconfig.json

@@ -3,10 +3,16 @@
     "strict": true,
     "removeComments": true,
     "sourceMap": true,
-    "outFile": "dist/bundle.js",
-    "target": "es6"
+    "module": "es6",
+    "moduleResolution": "node",
+    "outDir": "dist",
+    "target": "es6",
+    "types": []
   },
   "include": [
-    "src/**/*"
+    "src/**/*.ts"
+  ],
+  "exclude": [
+    "node_modules"
   ]
 }