Browse Source

Bump dependency versions & add CICD support

jerryliao 1 năm trước cách đây
mục cha
commit
92e36d18ad
24 tập tin đã thay đổi với 605 bổ sung331 xóa
  1. 4 0
      .dockerignore
  2. 25 0
      .drone.yml
  3. 13 1
      .vscode/settings.json
  4. 13 0
      Dockerfile
  5. 32 2
      deno.json
  6. 329 141
      deno.lock
  7. 4 1
      dev.ts
  8. 3 0
      fresh.config.ts
  9. 37 38
      fresh.gen.ts
  10. 41 40
      islands/Editor.tsx
  11. 0 2
      islands/HomeBar.tsx
  12. 21 20
      islands/LoginFrame.tsx
  13. 23 21
      islands/Modal.tsx
  14. 1 4
      islands/PostList.tsx
  15. 15 15
      islands/TopBar.tsx
  16. 6 2
      main.ts
  17. 4 7
      routes/[id].tsx
  18. 2 4
      routes/_404.tsx
  19. 0 3
      routes/_app.tsx
  20. 1 4
      routes/index.tsx
  21. 0 3
      routes/login.tsx
  22. 0 3
      routes/register.tsx
  23. 28 18
      utils/db.ts
  24. 3 2
      utils/server.ts

+ 4 - 0
.dockerignore

@@ -0,0 +1,4 @@
+data
+.git
+.vscode
+.drone.yml

+ 25 - 0
.drone.yml

@@ -0,0 +1,25 @@
+kind: pipeline
+type: exec
+name: default
+
+platform:
+  os: linux
+  arch: amd64
+
+steps:
+  - name: build
+    commands:
+      - docker build --build-arg GIT_REVISION=${DRONE_BUILD_NUMBER} -t ${DRONE_REPO_NAME}:rev${DRONE_BUILD_NUMBER} .
+
+  - name: clean
+    commands:
+      - docker container stop ${DRONE_REPO_NAME} || true
+      - docker container rm ${DRONE_REPO_NAME} || true
+
+  - name: deploy
+    commands:
+      - docker run --detach --name ${DRONE_REPO_NAME} --restart always -v /var/www/post/data:/app/data -p 8000:8000 ${DRONE_REPO_NAME}:rev${DRONE_BUILD_NUMBER}
+
+trigger:
+  branch:
+    - main

+ 13 - 1
.vscode/settings.json

@@ -1,5 +1,17 @@
 {
   "deno.enable": true,
   "deno.lint": true,
-  "deno.unstable": true
+  "editor.defaultFormatter": "denoland.vscode-deno",
+  "[typescriptreact]": {
+    "editor.defaultFormatter": "denoland.vscode-deno"
+  },
+  "[typescript]": {
+    "editor.defaultFormatter": "denoland.vscode-deno"
+  },
+  "[javascriptreact]": {
+    "editor.defaultFormatter": "denoland.vscode-deno"
+  },
+  "[javascript]": {
+    "editor.defaultFormatter": "denoland.vscode-deno"
+  }
 }

+ 13 - 0
Dockerfile

@@ -0,0 +1,13 @@
+FROM denoland/deno:1.38.3
+
+ARG GIT_REVISION
+ENV DENO_DEPLOYMENT_ID=${GIT_REVISION}
+
+WORKDIR /app
+
+COPY . .
+RUN deno cache main.ts
+
+EXPOSE 8000
+
+CMD ["run", "-A", "main.ts"]

+ 32 - 2
deno.json

@@ -1,6 +1,36 @@
 {
+  "lock": false,
   "tasks": {
-    "start": "deno run -A --watch=static/,routes/ dev.ts"
+    "check": "deno fmt --check && deno lint && deno check **/*.ts && deno check **/*.tsx",
+    "cli": "echo \"import '\\$fresh/src/dev/cli.ts'\" | deno run --unstable -A -",
+    "manifest": "deno task cli manifest $(pwd)",
+    "start": "deno run -A --watch=static/,routes/ dev.ts",
+    "build": "deno run -A dev.ts build",
+    "preview": "deno run -A main.ts",
+    "update": "deno run -A -r https://fresh.deno.dev/update ."
   },
-  "importMap": "./import_map.json"
+  "lint": {
+    "rules": {
+      "tags": ["fresh", "recommended"]
+    }
+  },
+  "exclude": ["**/_fresh/*"],
+  "imports": {
+    "$fresh/": "https://deno.land/x/fresh@1.6.5/",
+    "preact": "https://esm.sh/preact@10.19.2",
+    "preact/": "https://esm.sh/preact@10.19.2/",
+    "$std/": "https://deno.land/std@0.211.0/",
+    "$sqlite/": "https://deno.land/x/sqlite@v3.8/",
+    "$usid/": "https://deno.land/x/usid@2.0.0/",
+    "$encoding/": "https://deno.land/std@0.211.0/encoding/",
+    "$crypto/": "https://deno.land/std@0.211.0/crypto/",
+    "$async/": "https://deno.land/std@0.211.0/async/",
+    "$http/": "https://deno.land/std@0.211.0/http/",
+    "showdown": "https://esm.sh/showdown@2.1.0",
+    "utils/": "./utils/"
+  },
+  "compilerOptions": {
+    "jsx": "react-jsx",
+    "jsxImportSource": "preact"
+  }
 }

+ 329 - 141
deno.lock

@@ -6,10 +6,13 @@
   "remote": {
     "https://deno.land/std@0.140.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74",
     "https://deno.land/std@0.140.0/_util/os.ts": "3b4c6e27febd119d36a416d7a97bd3b0251b77c88942c8f16ee5953ea13e2e49",
+    "https://deno.land/std@0.140.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d",
+    "https://deno.land/std@0.140.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9",
+    "https://deno.land/std@0.140.0/bytes/mod.ts": "763f97d33051cc3f28af1a688dfe2830841192a9fea0cbaa55f927b49d49d0bf",
+    "https://deno.land/std@0.140.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37",
     "https://deno.land/std@0.140.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f",
     "https://deno.land/std@0.140.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d",
-    "https://deno.land/std@0.140.0/fs/expand_glob.ts": "0c10130d67c9b02164b03df8e43c6d6defbf8e395cb69d09e84a8586e6d72ac3",
-    "https://deno.land/std@0.140.0/fs/walk.ts": "117403ccd21fd322febe56ba06053b1ad5064c802170f19b1ea43214088fe95f",
+    "https://deno.land/std@0.140.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b",
     "https://deno.land/std@0.140.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3",
     "https://deno.land/std@0.140.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09",
     "https://deno.land/std@0.140.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b",
@@ -19,153 +22,338 @@
     "https://deno.land/std@0.140.0/path/posix.ts": "293cdaec3ecccec0a9cc2b534302dfe308adb6f10861fa183275d6695faace44",
     "https://deno.land/std@0.140.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9",
     "https://deno.land/std@0.140.0/path/win32.ts": "31811536855e19ba37a999cd8d1b62078235548d67902ece4aa6b814596dd757",
-    "https://deno.land/std@0.173.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
-    "https://deno.land/std@0.173.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
-    "https://deno.land/std@0.173.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
-    "https://deno.land/std@0.173.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
-    "https://deno.land/std@0.173.0/path/_util.ts": "86c2375a996c1931b2f2ac71fefd5ddf0cf0e579fa4ab12d3e4c552d4223b8d8",
-    "https://deno.land/std@0.173.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
-    "https://deno.land/std@0.173.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
-    "https://deno.land/std@0.173.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232",
-    "https://deno.land/std@0.173.0/path/posix.ts": "0874b341c2c6968ca38d323338b8b295ea1dae10fa872a768d812e2e7d634789",
-    "https://deno.land/std@0.173.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
-    "https://deno.land/std@0.173.0/path/win32.ts": "672942919dd66ce1b8c224e77d3447e2ad8254eaff13fe6946420a9f78fa141e",
-    "https://deno.land/std@0.177.0/async/abortable.ts": "73acfb3ed7261ce0d930dbe89e43db8d34e017b063cf0eaa7d215477bf53442e",
-    "https://deno.land/std@0.177.0/async/deadline.ts": "c5facb0b404eede83e38bd2717ea8ab34faa2ffb20ef87fd261fcba32ba307aa",
-    "https://deno.land/std@0.177.0/async/debounce.ts": "adab11d04ca38d699444ac8a9d9856b4155e8dda2afd07ce78276c01ea5a4332",
-    "https://deno.land/std@0.177.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8",
-    "https://deno.land/std@0.177.0/async/delay.ts": "73aa04cec034c84fc748c7be49bb15cac3dd43a57174bfdb7a4aec22c248f0dd",
-    "https://deno.land/std@0.177.0/async/mod.ts": "f04344fa21738e5ad6bea37a6bfffd57c617c2d372bb9f9dcfd118a1b622e576",
-    "https://deno.land/std@0.177.0/async/mux_async_iterator.ts": "70c7f2ee4e9466161350473ad61cac0b9f115cff4c552eaa7ef9d50c4cbb4cc9",
-    "https://deno.land/std@0.177.0/async/pool.ts": "fd082bd4aaf26445909889435a5c74334c017847842ec035739b4ae637ae8260",
-    "https://deno.land/std@0.177.0/async/retry.ts": "5efa3ba450ac0c07a40a82e2df296287b5013755d232049efd7ea2244f15b20f",
-    "https://deno.land/std@0.177.0/async/tee.ts": "47e42d35f622650b02234d43803d0383a89eb4387e1b83b5a40106d18ae36757",
-    "https://deno.land/std@0.177.0/http/server.ts": "cbb17b594651215ba95c01a395700684e569c165a567e4e04bba327f41197433",
-    "https://deno.land/std@0.178.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
-    "https://deno.land/std@0.178.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
-    "https://deno.land/std@0.178.0/async/abortable.ts": "73acfb3ed7261ce0d930dbe89e43db8d34e017b063cf0eaa7d215477bf53442e",
-    "https://deno.land/std@0.178.0/async/deadline.ts": "c5facb0b404eede83e38bd2717ea8ab34faa2ffb20ef87fd261fcba32ba307aa",
-    "https://deno.land/std@0.178.0/async/debounce.ts": "adab11d04ca38d699444ac8a9d9856b4155e8dda2afd07ce78276c01ea5a4332",
-    "https://deno.land/std@0.178.0/async/deferred.ts": "42790112f36a75a57db4a96d33974a936deb7b04d25c6084a9fa8a49f135def8",
-    "https://deno.land/std@0.178.0/async/delay.ts": "73aa04cec034c84fc748c7be49bb15cac3dd43a57174bfdb7a4aec22c248f0dd",
-    "https://deno.land/std@0.178.0/async/mod.ts": "f04344fa21738e5ad6bea37a6bfffd57c617c2d372bb9f9dcfd118a1b622e576",
-    "https://deno.land/std@0.178.0/async/mux_async_iterator.ts": "70c7f2ee4e9466161350473ad61cac0b9f115cff4c552eaa7ef9d50c4cbb4cc9",
-    "https://deno.land/std@0.178.0/async/pool.ts": "fd082bd4aaf26445909889435a5c74334c017847842ec035739b4ae637ae8260",
-    "https://deno.land/std@0.178.0/async/retry.ts": "5efa3ba450ac0c07a40a82e2df296287b5013755d232049efd7ea2244f15b20f",
-    "https://deno.land/std@0.178.0/async/tee.ts": "47e42d35f622650b02234d43803d0383a89eb4387e1b83b5a40106d18ae36757",
-    "https://deno.land/std@0.178.0/flags/mod.ts": "d1cdefa18472ef69858a17df5cf7c98445ed27ac10e1460183081303b0ebc270",
-    "https://deno.land/std@0.178.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32",
-    "https://deno.land/std@0.178.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32",
-    "https://deno.land/std@0.178.0/http/http_status.ts": "8a7bcfe3ac025199ad804075385e57f63d055b2aed539d943ccc277616d6f932",
-    "https://deno.land/std@0.178.0/http/server.ts": "cbb17b594651215ba95c01a395700684e569c165a567e4e04bba327f41197433",
-    "https://deno.land/std@0.178.0/media_types/_db.ts": "7606d83e31f23ce1a7968cbaee852810c2cf477903a095696cdc62eaab7ce570",
-    "https://deno.land/std@0.178.0/media_types/_util.ts": "916efbd30b6148a716f110e67a4db29d6949bf4048997b754415dd7e42c52378",
-    "https://deno.land/std@0.178.0/media_types/content_type.ts": "c682589a0aeb016bfed355cc1ed6fbb3ead2ea48fc0000ac5de6a5730613ad1c",
-    "https://deno.land/std@0.178.0/media_types/extension.ts": "7a4ef2813d7182f724a941f38161525996e4a67abc3cf6a0f9bc2168d73a0f0e",
-    "https://deno.land/std@0.178.0/media_types/extensions_by_type.ts": "4358023feac696e6e9d49c0f1e76a859f03ca254df57812f31f8536890c3a443",
-    "https://deno.land/std@0.178.0/media_types/format_media_type.ts": "1e35e16562e5c417401ffc388a9f8f421f97f0ee06259cbe990c51bae4e6c7a8",
-    "https://deno.land/std@0.178.0/media_types/get_charset.ts": "8be15a1fd31a545736b91ace56d0e4c66ea0d7b3fdc5c90760e8202e7b4b1fad",
-    "https://deno.land/std@0.178.0/media_types/mod.ts": "d3f0b99f85053bc0b98ecc24eaa3546dfa09b856dc0bbaf60d8956d2cdd710c8",
-    "https://deno.land/std@0.178.0/media_types/parse_media_type.ts": "bed260d868ea271445ae41d748e7afed9b5a7f407d2777ead08cecf73e9278de",
-    "https://deno.land/std@0.178.0/media_types/type_by_extension.ts": "6076a7fc63181d70f92ec582fdea2c927eb2cfc7f9c9bee9d6add2aca86f2355",
-    "https://deno.land/std@0.178.0/media_types/vendor/mime-db.v1.52.0.ts": "6925bbcae81ca37241e3f55908d0505724358cda3384eaea707773b2c7e99586",
-    "https://deno.land/std@0.178.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
-    "https://deno.land/std@0.178.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
-    "https://deno.land/std@0.178.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0",
-    "https://deno.land/std@0.178.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
-    "https://deno.land/std@0.178.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
-    "https://deno.land/std@0.178.0/path/mod.ts": "4b83694ac500d7d31b0cdafc927080a53dc0c3027eb2895790fb155082b0d232",
-    "https://deno.land/std@0.178.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d",
-    "https://deno.land/std@0.178.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
-    "https://deno.land/std@0.178.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba",
-    "https://deno.land/std@0.178.0/semver/mod.ts": "409a2691f5a411c34e917c1e6d445a6d1d53f3fadf660e44a99dd0bf9b2ef412",
-    "https://deno.land/std@0.184.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
-    "https://deno.land/std@0.184.0/async/debounce.ts": "adab11d04ca38d699444ac8a9d9856b4155e8dda2afd07ce78276c01ea5a4332",
-    "https://deno.land/std@0.184.0/crypto/_fnv/fnv32.ts": "e4649dfdefc5c987ed53c3c25db62db771a06d9d1b9c36d2b5cf0853b8e82153",
-    "https://deno.land/std@0.184.0/crypto/_fnv/fnv64.ts": "bfa0e4702061fdb490a14e6bf5f9168a22fb022b307c5723499469bfefca555e",
-    "https://deno.land/std@0.184.0/crypto/_fnv/mod.ts": "f956a95f58910f223e420340b7404702ecd429603acd4491fa77af84f746040c",
-    "https://deno.land/std@0.184.0/crypto/_fnv/util.ts": "accba12bfd80a352e32a872f87df2a195e75561f1b1304a4cb4f5a4648d288f9",
-    "https://deno.land/std@0.184.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "bdd70a6183c6bdabc086ec2a5f828c86711b4201f1ba7954fc78385a664e8fae",
-    "https://deno.land/std@0.184.0/crypto/_wasm/mod.ts": "e2df88236fc061eac7a89e8cb0b97843f5280b08b2a990e473b7397a3e566003",
-    "https://deno.land/std@0.184.0/crypto/crypto.ts": "051d941627f1b6da0d5151d744e6c94658cdf43bfe14621610f0d7268f52b05f",
-    "https://deno.land/std@0.184.0/crypto/keystack.ts": "877ab0f19eb7d37ad6495190d3c3e39f58e9c52e0b6a966f82fd6df67ca55f90",
-    "https://deno.land/std@0.184.0/crypto/mod.ts": "ae384519e85eca9aeff4e7111ed153df8f3dbda7b35b70850ed4b3e9c8cec4d5",
-    "https://deno.land/std@0.184.0/crypto/timing_safe_equal.ts": "0fae34ee02264f309ae0b6e54e9746a7aba3996e5454903ed106967a7a9ef665",
-    "https://deno.land/std@0.184.0/crypto/to_hash_string.ts": "6927c768f3e373a1be4a31555a45ccecf7bd413105455cc334ad3f908cfa986f",
-    "https://deno.land/std@0.184.0/datetime/to_imf.ts": "8f9c0af8b167031ffe2e03da01a12a3b0672cc7562f89c61942a0ab0129771b2",
-    "https://deno.land/std@0.184.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d",
-    "https://deno.land/std@0.184.0/encoding/base64url.ts": "2ed4ba122b20fedf226c5d337cf22ee2024fa73a8f85d915d442af7e9ce1fae1",
-    "https://deno.land/std@0.184.0/encoding/hex.ts": "b4b1a7cb678745b0bf181ed8cf2498c7be00d121a7de244b752fbf9c7d9c48cd",
-    "https://deno.land/std@0.184.0/http/cookie.ts": "934f92d871d50852dbd7a836d721df5a9527b14381db16001b40991d30174ee4",
-    "https://deno.land/x/code_block_writer@11.0.3/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5",
-    "https://deno.land/x/code_block_writer@11.0.3/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff",
+    "https://deno.land/std@0.140.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21",
+    "https://deno.land/std@0.181.0/_util/asserts.ts": "178dfc49a464aee693a7e285567b3d0b555dc805ff490505a8aae34f9cfb1462",
+    "https://deno.land/std@0.181.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3",
+    "https://deno.land/std@0.181.0/fs/_util.ts": "65381f341af1ff7f40198cee15c20f59951ac26e51ddc651c5293e24f9ce6f32",
+    "https://deno.land/std@0.181.0/fs/ensure_dir.ts": "dc64c4c75c64721d4e3fb681f1382f803ff3d2868f08563ff923fdd20d071c40",
+    "https://deno.land/std@0.181.0/fs/expand_glob.ts": "e4f56259a0a70fe23f05215b00de3ac5e6ba46646ab2a06ebbe9b010f81c972a",
+    "https://deno.land/std@0.181.0/fs/walk.ts": "ea95ffa6500c1eda6b365be488c056edc7c883a1db41ef46ec3bf057b1c0fe32",
+    "https://deno.land/std@0.181.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0",
+    "https://deno.land/std@0.181.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b",
+    "https://deno.land/std@0.181.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0",
+    "https://deno.land/std@0.181.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000",
+    "https://deno.land/std@0.181.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1",
+    "https://deno.land/std@0.181.0/path/mod.ts": "bf718f19a4fdd545aee1b06409ca0805bd1b68ecf876605ce632e932fe54510c",
+    "https://deno.land/std@0.181.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d",
+    "https://deno.land/std@0.181.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1",
+    "https://deno.land/std@0.181.0/path/win32.ts": "d186344e5583bcbf8b18af416d13d82b35a317116e6460a5a3953508c3de5bba",
+    "https://deno.land/std@0.211.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975",
+    "https://deno.land/std@0.211.0/assert/_diff.ts": "6a2d68f2c42d73a1e31818a4195f40598d672c7f02ac75c7f1b1e6789852c2bc",
+    "https://deno.land/std@0.211.0/assert/_format.ts": "0ba808961bf678437fb486b56405b6fefad2cf87b5809667c781ddee8c32aff4",
+    "https://deno.land/std@0.211.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5",
+    "https://deno.land/std@0.211.0/assert/assert_almost_equals.ts": "648ea72678296a5ad86d3bbb66904335fa97de3133223f44ca4596b225cdcbef",
+    "https://deno.land/std@0.211.0/assert/assert_array_includes.ts": "dbb461c20681807a884ad84d873f9e4daead380859531b1e7f27fa4e8f8bf431",
+    "https://deno.land/std@0.211.0/assert/assert_equals.ts": "b3b33ae8a85ae22a0754c61a7486d4ae870e8938830a94f5cacecba3a9b0442a",
+    "https://deno.land/std@0.211.0/assert/assert_exists.ts": "24a7bf965e634f909242cd09fbaf38bde6b791128ece08e33ab08586a7cc55c9",
+    "https://deno.land/std@0.211.0/assert/assert_false.ts": "6f382568e5128c0f855e5f7dbda8624c1ed9af4fcc33ef4a9afeeedcdce99769",
+    "https://deno.land/std@0.211.0/assert/assert_greater.ts": "8dfcf082d2bcffcaab3bd0dab48d41e41c26266529567246de47bd6864936f6d",
+    "https://deno.land/std@0.211.0/assert/assert_greater_or_equal.ts": "9e02ef89f32563f539f7e66556930033418728847aefcca4e3806a735b5f122e",
+    "https://deno.land/std@0.211.0/assert/assert_instance_of.ts": "72dc1faff1e248692d873c89382fa1579dd7b53b56d52f37f9874a75b11ba444",
+    "https://deno.land/std@0.211.0/assert/assert_is_error.ts": "6596f2b5ba89ba2fe9b074f75e9318cda97a2381e59d476812e30077fbdb6ed2",
+    "https://deno.land/std@0.211.0/assert/assert_less.ts": "91a6fed705f9c39bbd683b62aa9dfc42547bc886c29f696997e681cafb886b16",
+    "https://deno.land/std@0.211.0/assert/assert_less_or_equal.ts": "7a3c2e554eb20aa6af9dd4a410e550bcee9e8a28102d51f5f40cb1b8d141e4e1",
+    "https://deno.land/std@0.211.0/assert/assert_match.ts": "ec2d9680ed3e7b9746ec57ec923a17eef6d476202f339ad91d22277d7f1d16e1",
+    "https://deno.land/std@0.211.0/assert/assert_not_equals.ts": "cb78bf9a4357d69673c87b634491bc6b840412c8b55efe472af9877ef6f0a29b",
+    "https://deno.land/std@0.211.0/assert/assert_not_instance_of.ts": "8f720d92d83775c40b2542a8d76c60c2d4aeddaf8713c8d11df8984af2604931",
+    "https://deno.land/std@0.211.0/assert/assert_not_match.ts": "b4b7c77f146963e2b673c1ce4846473703409eb93f5ab0eb60f6e6f8aeffe39f",
+    "https://deno.land/std@0.211.0/assert/assert_not_strict_equals.ts": "89ba25e1da5233404ac4c01651c088759b7977c51034eefc6050fe3fc2d10c46",
+    "https://deno.land/std@0.211.0/assert/assert_object_match.ts": "e85e5eef62a56ce364c3afdd27978ccab979288a3e772e6855c270a7b118fa49",
+    "https://deno.land/std@0.211.0/assert/assert_rejects.ts": "e9e0c8d9c3e164c7ac962c37b3be50577c5a2010db107ed272c4c1afb1269f54",
+    "https://deno.land/std@0.211.0/assert/assert_strict_equals.ts": "0425a98f70badccb151644c902384c12771a93e65f8ff610244b8147b03a2366",
+    "https://deno.land/std@0.211.0/assert/assert_string_includes.ts": "dfb072a890167146f8e5bdd6fde887ce4657098e9f71f12716ef37f35fb6f4a7",
+    "https://deno.land/std@0.211.0/assert/assert_throws.ts": "edddd86b39606c342164b49ad88dd39a26e72a26655e07545d172f164b617fa7",
+    "https://deno.land/std@0.211.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8",
+    "https://deno.land/std@0.211.0/assert/equal.ts": "fae5e8a52a11d3ac694bbe1a53e13a7969e3f60791262312e91a3e741ae519e2",
+    "https://deno.land/std@0.211.0/assert/fail.ts": "f310e51992bac8e54f5fd8e44d098638434b2edb802383690e0d7a9be1979f1c",
+    "https://deno.land/std@0.211.0/assert/mod.ts": "325df8c0683ad83a873b9691aa66b812d6275fc9fec0b2d180ac68a2c5efed3b",
+    "https://deno.land/std@0.211.0/assert/unimplemented.ts": "47ca67d1c6dc53abd0bd729b71a31e0825fc452dbcd4fde4ca06789d5644e7fd",
+    "https://deno.land/std@0.211.0/assert/unreachable.ts": "38cfecb95d8b06906022d2f9474794fca4161a994f83354fd079cac9032b5145",
+    "https://deno.land/std@0.211.0/async/delay.ts": "eab3187eee39ccc8cc76d411fb21fb1801250ddb1090e486d5aec2ace5403391",
+    "https://deno.land/std@0.211.0/cli/parse_args.ts": "91dfad92c32c4c7f50bc5f476030cc84d0b8ad69f66cde219ddfd49516cbbdcf",
+    "https://deno.land/std@0.211.0/datetime/constants.ts": "5c198b3b47fbcc4d913e61dcae1c37e053937affc2c9a6a5ad7e5473bab3e4a6",
+    "https://deno.land/std@0.211.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376",
+    "https://deno.land/std@0.211.0/encoding/base32.ts": "44d06f3e6f6f8fa4971a4538ff9ea23ba116c14eae8c1fbb348801d10c911214",
+    "https://deno.land/std@0.211.0/encoding/hex.ts": "aaa6af2cc008dfd37e4f0c713c37b3d5563367b644fbd06db4fa60f6135f40bc",
+    "https://deno.land/std@0.211.0/flags/mod.ts": "1a3ed6646ed92f3eebcbe4630c25ec88e90352d9daa3161bf263e183b72f9883",
+    "https://deno.land/std@0.211.0/fmt/colors.ts": "be082d6a6bbb2980ae7b2bf8c23c6bb2811ba90a06a9bcb861344a71784c5a99",
+    "https://deno.land/std@0.211.0/fs/_create_walk_entry.ts": "5d9d2aaec05bcf09a06748b1684224d33eba7a4de24cf4cf5599991ca6b5b412",
+    "https://deno.land/std@0.211.0/fs/_get_file_info_type.ts": "da7bec18a7661dba360a1db475b826b18977582ce6fc9b25f3d4ee0403fe8cbd",
+    "https://deno.land/std@0.211.0/fs/_is_same_path.ts": "709c95868345fea051c58b9e96af95cff94e6ae98dfcff2b66dee0c212c4221f",
+    "https://deno.land/std@0.211.0/fs/_is_subdir.ts": "9a0a8664420f21ad92030c4ee266ec6251797d17b4a90cce5c2f381c2e1d7626",
+    "https://deno.land/std@0.211.0/fs/_to_path_string.ts": "29bfc9c6c112254961d75cbf6ba814d6de5349767818eb93090cecfa9665591e",
+    "https://deno.land/std@0.211.0/fs/copy.ts": "dc0f68c4b6c3b090bfdb909387e309f6169b746bd713927c9507c9ef545d71f6",
+    "https://deno.land/std@0.211.0/fs/empty_dir.ts": "4f01e6d56e2aa8d90ad60f20bc25601f516b00f6c3044cdf6863a058791d91aa",
+    "https://deno.land/std@0.211.0/fs/ensure_dir.ts": "139a6cf85c145003db9a2b470862ba153422e7deab2fe3c5b04c5b1cfb73d738",
+    "https://deno.land/std@0.211.0/fs/ensure_file.ts": "ac5cfde94786b0284d2c8e9f7f9425269bea1b2140612b4aea1f20b508870f59",
+    "https://deno.land/std@0.211.0/fs/ensure_link.ts": "d42af2edefeaa9817873ec6e46dc5d209ac4d744f8c69c5ecc2dffade78465b6",
+    "https://deno.land/std@0.211.0/fs/ensure_symlink.ts": "aee3f1655700f60090b4a3037f5b6c07ab37c36807cccad746ce89987719e6d2",
+    "https://deno.land/std@0.211.0/fs/eol.ts": "c9807291f78361d49fd986a9be04654610c615c5e2ec63d748976197d30ff206",
+    "https://deno.land/std@0.211.0/fs/exists.ts": "d2757ef764eaf5c6c5af7228e8447db2de42ab084a2dae540097f905723d83f5",
+    "https://deno.land/std@0.211.0/fs/expand_glob.ts": "25ef968ebbf6751f658e2ed595746576c5ddf7723146672538396d27bbd23894",
+    "https://deno.land/std@0.211.0/fs/mod.ts": "107f5afa4424c2d3ce2f7e9266173198da30302c69af662c720115fe504dc5ee",
+    "https://deno.land/std@0.211.0/fs/move.ts": "39e0d7ccb88a566d20b949712020e766b15ef1ec19159573d11f949bd677909c",
+    "https://deno.land/std@0.211.0/fs/walk.ts": "f04cc83ad3b27b5a5d078c831a01c7406069474bf280d5db015d937149a60128",
+    "https://deno.land/std@0.211.0/http/server.ts": "ddee66e9a2ee98df8b31a47fd4ad678e75a8a11f543157641fd9ea0760c20f39",
+    "https://deno.land/std@0.211.0/http/status.ts": "716c63e9f7a8d109ea3a28f9c81f895d5c30522cdaf39be87b13dfba162cdb3d",
+    "https://deno.land/std@0.211.0/jsonc/mod.ts": "82722888823e1af5a8f7918bf810ea581f68081064d529218533acad6cb7c2bc",
+    "https://deno.land/std@0.211.0/jsonc/parse.ts": "1ec8ab68fdbc4dcc25b48a8436e07421eefd0327cb7e9a79ee1bf08893a75276",
+    "https://deno.land/std@0.211.0/media_types/_db.ts": "1d695d9fe1c785e523d6de7191b33f33ecc7866db77358a4f966221cca56e2f9",
+    "https://deno.land/std@0.211.0/media_types/_util.ts": "97198fcf0fea9f3613e5294944114ab04788f709bea999e31123321f449dd098",
+    "https://deno.land/std@0.211.0/media_types/content_type.ts": "ec2325c8f8c2ce6a081620e145b6e842f98b28ca4cfb88acfc82c74d071bbbf4",
+    "https://deno.land/std@0.211.0/media_types/format_media_type.ts": "9fc070ec4dcc3193a9c048b3a20375b311685d22bf4ccf9311970b9dc1fb2ec7",
+    "https://deno.land/std@0.211.0/media_types/get_charset.ts": "678383f268db650da0f053655c5cce87cf3b7028f62436bafaf0b2dbf9e761e1",
+    "https://deno.land/std@0.211.0/media_types/parse_media_type.ts": "6cecc445f1a47adaeb1e163af7f20d29a1b6be68185c6e78eb12c04fc2dfe3ea",
+    "https://deno.land/std@0.211.0/media_types/type_by_extension.ts": "27fb0c5c306ce6c115b071b1a6fca4f1061572e214e3023775680fbe9199f7e8",
+    "https://deno.land/std@0.211.0/media_types/vendor/mime-db.v1.52.0.ts": "0218d2c7d900e8cd6fa4a866e0c387712af4af9a1bae55d6b2546c73d273a1e6",
+    "https://deno.land/std@0.211.0/path/_common/assert_path.ts": "2ca275f36ac1788b2acb60fb2b79cb06027198bc2ba6fb7e163efaedde98c297",
+    "https://deno.land/std@0.211.0/path/_common/basename.ts": "569744855bc8445f3a56087fd2aed56bdad39da971a8d92b138c9913aecc5fa2",
+    "https://deno.land/std@0.211.0/path/_common/common.ts": "6157c7ec1f4db2b4a9a187efd6ce76dcaf1e61cfd49f87e40d4ea102818df031",
+    "https://deno.land/std@0.211.0/path/_common/constants.ts": "dc5f8057159f4b48cd304eb3027e42f1148cf4df1fb4240774d3492b5d12ac0c",
+    "https://deno.land/std@0.211.0/path/_common/dirname.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8",
+    "https://deno.land/std@0.211.0/path/_common/format.ts": "92500e91ea5de21c97f5fe91e178bae62af524b72d5fcd246d6d60ae4bcada8b",
+    "https://deno.land/std@0.211.0/path/_common/from_file_url.ts": "d672bdeebc11bf80e99bf266f886c70963107bdd31134c4e249eef51133ceccf",
+    "https://deno.land/std@0.211.0/path/_common/glob_to_reg_exp.ts": "2007aa87bed6eb2c8ae8381adcc3125027543d9ec347713c1ad2c68427330770",
+    "https://deno.land/std@0.211.0/path/_common/normalize.ts": "684df4aa71a04bbcc346c692c8485594fc8a90b9408dfbc26ff32cf3e0c98cc8",
+    "https://deno.land/std@0.211.0/path/_common/normalize_string.ts": "dfdf657a1b1a7db7999f7c575ee7e6b0551d9c20f19486c6c3f5ff428384c965",
+    "https://deno.land/std@0.211.0/path/_common/relative.ts": "faa2753d9b32320ed4ada0733261e3357c186e5705678d9dd08b97527deae607",
+    "https://deno.land/std@0.211.0/path/_common/strip_trailing_separators.ts": "7024a93447efcdcfeaa9339a98fa63ef9d53de363f1fbe9858970f1bba02655a",
+    "https://deno.land/std@0.211.0/path/_common/to_file_url.ts": "7f76adbc83ece1bba173e6e98a27c647712cab773d3f8cbe0398b74afc817883",
+    "https://deno.land/std@0.211.0/path/_interface.ts": "a1419fcf45c0ceb8acdccc94394e3e94f99e18cfd32d509aab514c8841799600",
+    "https://deno.land/std@0.211.0/path/_os.ts": "8fb9b90fb6b753bd8c77cfd8a33c2ff6c5f5bc185f50de8ca4ac6a05710b2c15",
+    "https://deno.land/std@0.211.0/path/basename.ts": "5d341aadb7ada266e2280561692c165771d071c98746fcb66da928870cd47668",
+    "https://deno.land/std@0.211.0/path/common.ts": "973e019d3cfa6a134a13f1fda3f7efbaf400a64365d7a7b96f66afe373a09dc5",
+    "https://deno.land/std@0.211.0/path/dirname.ts": "85bd955bf31d62c9aafdd7ff561c4b5fb587d11a9a5a45e2b01aedffa4238a7c",
+    "https://deno.land/std@0.211.0/path/extname.ts": "593303db8ae8c865cbd9ceec6e55d4b9ac5410c1e276bfd3131916591b954441",
+    "https://deno.land/std@0.211.0/path/format.ts": "98fad25f1af7b96a48efb5b67378fcc8ed77be895df8b9c733b86411632162af",
+    "https://deno.land/std@0.211.0/path/from_file_url.ts": "911833ae4fd10a1c84f6271f36151ab785955849117dc48c6e43b929504ee069",
+    "https://deno.land/std@0.211.0/path/glob.ts": "04510962905d4b1513b44da9cb195914e0fa46c24359f6feaca20848d797dcb0",
+    "https://deno.land/std@0.211.0/path/glob_to_regexp.ts": "83c5fd36a8c86f5e72df9d0f45317f9546afa2ce39acaafe079d43a865aced08",
+    "https://deno.land/std@0.211.0/path/is_absolute.ts": "4791afc8bfd0c87f0526eaa616b0d16e7b3ab6a65b62942e50eac68de4ef67d7",
+    "https://deno.land/std@0.211.0/path/is_glob.ts": "a65f6195d3058c3050ab905705891b412ff942a292bcbaa1a807a74439a14141",
+    "https://deno.land/std@0.211.0/path/join.ts": "ae2ec5ca44c7e84a235fd532e4a0116bfb1f2368b394db1c4fb75e3c0f26a33a",
+    "https://deno.land/std@0.211.0/path/join_globs.ts": "e9589869a33dc3982101898ee50903db918ca00ad2614dbe3934d597d7b1fbea",
+    "https://deno.land/std@0.211.0/path/mod.ts": "8e1ffe983557e9637184ccb84bd6b0447e319f4a28bfad7f3f41ee050579e5e6",
+    "https://deno.land/std@0.211.0/path/normalize.ts": "4155743ccceeed319b350c1e62e931600272fad8ad00c417b91df093867a8352",
+    "https://deno.land/std@0.211.0/path/normalize_glob.ts": "98ee8268fad271193603271c203ae973280b5abfbdd2cbca1053fd2af71869ca",
+    "https://deno.land/std@0.211.0/path/parse.ts": "65e8e285f1a63b714e19ef24b68f56e76934c3df0b6e65fd440d3991f4f8aefb",
+    "https://deno.land/std@0.211.0/path/posix/_util.ts": "1e3937da30f080bfc99fe45d7ed23c47dd8585c5e473b2d771380d3a6937cf9d",
+    "https://deno.land/std@0.211.0/path/posix/basename.ts": "39ee27a29f1f35935d3603ccf01d53f3d6e0c5d4d0f84421e65bd1afeff42843",
+    "https://deno.land/std@0.211.0/path/posix/common.ts": "809cc86e79db8171b9a97ac397d56b9588c25a8f3062f483c8d651a2b6739daa",
+    "https://deno.land/std@0.211.0/path/posix/dirname.ts": "6535d2bdd566118963537b9dda8867ba9e2a361015540dc91f5afbb65c0cce8b",
+    "https://deno.land/std@0.211.0/path/posix/extname.ts": "8d36ae0082063c5e1191639699e6f77d3acf501600a3d87b74943f0ae5327427",
+    "https://deno.land/std@0.211.0/path/posix/format.ts": "185e9ee2091a42dd39e2a3b8e4925370ee8407572cee1ae52838aed96310c5c1",
+    "https://deno.land/std@0.211.0/path/posix/from_file_url.ts": "951aee3a2c46fd0ed488899d024c6352b59154c70552e90885ed0c2ab699bc40",
+    "https://deno.land/std@0.211.0/path/posix/glob_to_regexp.ts": "54d3ff40f309e3732ab6e5b19d7111d2d415248bcd35b67a99defcbc1972e697",
+    "https://deno.land/std@0.211.0/path/posix/is_absolute.ts": "cebe561ad0ae294f0ce0365a1879dcfca8abd872821519b4fcc8d8967f888ede",
+    "https://deno.land/std@0.211.0/path/posix/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9",
+    "https://deno.land/std@0.211.0/path/posix/join.ts": "aef88d5fa3650f7516730865dbb951594d1a955b785e2450dbee93b8e32694f3",
+    "https://deno.land/std@0.211.0/path/posix/join_globs.ts": "35ddd5f321d79e1fc72d2ec9a8d8863f0bb1431125e57bb2661799278d4ee9cd",
+    "https://deno.land/std@0.211.0/path/posix/mod.ts": "9dfff9f3618ba6990eb8495dadef13871e5756419b25079b6b905a4ebf790926",
+    "https://deno.land/std@0.211.0/path/posix/normalize.ts": "baeb49816a8299f90a0237d214cef46f00ba3e95c0d2ceb74205a6a584b58a91",
+    "https://deno.land/std@0.211.0/path/posix/normalize_glob.ts": "0f01bcfb0791144f0e901fd2cc706432baf84828c393f3c25c53583f03d0c0b7",
+    "https://deno.land/std@0.211.0/path/posix/parse.ts": "d5bac4eb21262ab168eead7e2196cb862940c84cee572eafedd12a0d34adc8fb",
+    "https://deno.land/std@0.211.0/path/posix/relative.ts": "3907d6eda41f0ff723d336125a1ad4349112cd4d48f693859980314d5b9da31c",
+    "https://deno.land/std@0.211.0/path/posix/resolve.ts": "bac20d9921beebbbb2b73706683b518b1d0c1b1da514140cee409e90d6b2913a",
+    "https://deno.land/std@0.211.0/path/posix/separator.ts": "6530f253a33d92d8f8a1d1d7fa7fad2992c739ad9886dde72e4e78793f1cfd49",
+    "https://deno.land/std@0.211.0/path/posix/to_file_url.ts": "7aa752ba66a35049e0e4a4be5a0a31ac6b645257d2e031142abb1854de250aaf",
+    "https://deno.land/std@0.211.0/path/posix/to_namespaced_path.ts": "28b216b3c76f892a4dca9734ff1cc0045d135532bfd9c435ae4858bfa5a2ebf0",
+    "https://deno.land/std@0.211.0/path/relative.ts": "ab739d727180ed8727e34ed71d976912461d98e2b76de3d3de834c1066667add",
+    "https://deno.land/std@0.211.0/path/resolve.ts": "a6f977bdb4272e79d8d0ed4333e3d71367cc3926acf15ac271f1d059c8494d8d",
+    "https://deno.land/std@0.211.0/path/separator.ts": "2b5a590d4f1942e70650ee7421d161c24ec7d3b94b49981e4138ae07397fb2d2",
+    "https://deno.land/std@0.211.0/path/to_file_url.ts": "88f049b769bce411e2d2db5bd9e6fd9a185a5fbd6b9f5ad8f52bef517c4ece1b",
+    "https://deno.land/std@0.211.0/path/to_namespaced_path.ts": "b706a4103b104cfadc09600a5f838c2ba94dbcdb642344557122dda444526e40",
+    "https://deno.land/std@0.211.0/path/windows/_util.ts": "d5f47363e5293fced22c984550d5e70e98e266cc3f31769e1710511803d04808",
+    "https://deno.land/std@0.211.0/path/windows/basename.ts": "e2dbf31d1d6385bfab1ce38c333aa290b6d7ae9e0ecb8234a654e583cf22f8fe",
+    "https://deno.land/std@0.211.0/path/windows/common.ts": "809cc86e79db8171b9a97ac397d56b9588c25a8f3062f483c8d651a2b6739daa",
+    "https://deno.land/std@0.211.0/path/windows/dirname.ts": "33e421be5a5558a1346a48e74c330b8e560be7424ed7684ea03c12c21b627bc9",
+    "https://deno.land/std@0.211.0/path/windows/extname.ts": "165a61b00d781257fda1e9606a48c78b06815385e7d703232548dbfc95346bef",
+    "https://deno.land/std@0.211.0/path/windows/format.ts": "bbb5ecf379305b472b1082cd2fdc010e44a0020030414974d6029be9ad52aeb6",
+    "https://deno.land/std@0.211.0/path/windows/from_file_url.ts": "ced2d587b6dff18f963f269d745c4a599cf82b0c4007356bd957cb4cb52efc01",
+    "https://deno.land/std@0.211.0/path/windows/glob_to_regexp.ts": "6dcd1242bd8907aa9660cbdd7c93446e6927b201112b0cba37ca5d80f81be51b",
+    "https://deno.land/std@0.211.0/path/windows/is_absolute.ts": "4a8f6853f8598cf91a835f41abed42112cebab09478b072e4beb00ec81f8ca8a",
+    "https://deno.land/std@0.211.0/path/windows/is_glob.ts": "8a8b08c08bf731acf2c1232218f1f45a11131bc01de81e5f803450a5914434b9",
+    "https://deno.land/std@0.211.0/path/windows/join.ts": "e0b3356615c1a75c56ebb6a7311157911659e11fd533d80d724800126b761ac3",
+    "https://deno.land/std@0.211.0/path/windows/join_globs.ts": "35ddd5f321d79e1fc72d2ec9a8d8863f0bb1431125e57bb2661799278d4ee9cd",
+    "https://deno.land/std@0.211.0/path/windows/mod.ts": "e739f7e783b69fb7956bed055e117201ccb071a7917c09f87c5c8c2b54369d38",
+    "https://deno.land/std@0.211.0/path/windows/normalize.ts": "78126170ab917f0ca355a9af9e65ad6bfa5be14d574c5fb09bb1920f52577780",
+    "https://deno.land/std@0.211.0/path/windows/normalize_glob.ts": "49c634af33a7c6bc738885c4b34633278b7ab47bd47bf11281b2190970b823e2",
+    "https://deno.land/std@0.211.0/path/windows/parse.ts": "b9239edd892a06a06625c1b58425e199f018ce5649ace024d144495c984da734",
+    "https://deno.land/std@0.211.0/path/windows/relative.ts": "3e1abc7977ee6cc0db2730d1f9cb38be87b0ce4806759d271a70e4997fc638d7",
+    "https://deno.land/std@0.211.0/path/windows/resolve.ts": "75b2e3e1238d840782cee3d8864d82bfaa593c7af8b22f19c6422cf82f330ab3",
+    "https://deno.land/std@0.211.0/path/windows/separator.ts": "2bbcc551f64810fb43252185bd1d33d66e0477d74bd52f03b89f5dc21a3dd486",
+    "https://deno.land/std@0.211.0/path/windows/to_file_url.ts": "1cd63fd35ec8d1370feaa4752eccc4cc05ea5362a878be8dc7db733650995484",
+    "https://deno.land/std@0.211.0/path/windows/to_namespaced_path.ts": "4ffa4fb6fae321448d5fe810b3ca741d84df4d7897e61ee29be961a6aac89a4c",
+    "https://deno.land/std@0.211.0/regexp/escape.ts": "3cb5b1ff9eb79d97b7e42f06fe874776f25024f3a8957a4bfbad2dfdcb6bc7b2",
+    "https://deno.land/std@0.211.0/semver/_constants.ts": "90879e4ea94a34c49c8ecea3d9c06e13e61ecb7caca80c8f289139440ca9835a",
+    "https://deno.land/std@0.211.0/semver/_shared.ts": "8d44684775cde4a64bd6bdb99b51f3bc59ed65f10af78ca136cc2eab3f6716f1",
+    "https://deno.land/std@0.211.0/semver/cmp.ts": "9afaf42bc7bfbefa03042708ac30df40df91b7a315e3cab5a5d3e7ed12e41bb7",
+    "https://deno.land/std@0.211.0/semver/comparator_format.ts": "20440cb36f4cdeb0c17b6830e23e8cbaf9951a3ce5fdca5269c52f204cb82564",
+    "https://deno.land/std@0.211.0/semver/comparator_intersects.ts": "c3d3540082458e1be5d3cde5ad0f44bc9cb443b3b34d1fa1101e290bf03138fd",
+    "https://deno.land/std@0.211.0/semver/comparator_max.ts": "9bdf4621d9ec6d8fa07b83dfdd4651c6589fc303f6f7f4874748f08728192fba",
+    "https://deno.land/std@0.211.0/semver/comparator_min.ts": "72b65a7e7d7c82e54ad898141d73c9d0f0787ffb6950873173d942315c1aa29b",
+    "https://deno.land/std@0.211.0/semver/compare.ts": "e507146fd997d33ae5abc2675e8b24a1ea84b50ddc9918cb8ddc1b1911c97011",
+    "https://deno.land/std@0.211.0/semver/compare_build.ts": "e37c2d24bc138b3fdaeb55cf85b1c94e7cf9120f16f64dff0e24659f1ba79de6",
+    "https://deno.land/std@0.211.0/semver/constants.ts": "15302a1d9a3f8f12aff47895e746c562e9a2292fe6cf845103c4f9b8b3f3f3e2",
+    "https://deno.land/std@0.211.0/semver/difference.ts": "be4f01b7745406408a16b708185a48c1c652cc87e0244b12a5ca75c5585db668",
+    "https://deno.land/std@0.211.0/semver/eq.ts": "ae97d41e4068e2dbc151a2fce35bdc9815dcd71cc297a54c9623831c8a4737b9",
+    "https://deno.land/std@0.211.0/semver/format.ts": "2d0b8690bc0659a5756aa339d0d31385c3783a0bbd7d8d25c210cd6b5e4224f8",
+    "https://deno.land/std@0.211.0/semver/gt.ts": "bdbfe1f77c9c61f7f9aaf5ab2871a65c800bc546db124eead512b06f14faecc1",
+    "https://deno.land/std@0.211.0/semver/gte.ts": "cf43eafbaa6db6fb9f1b057d81d3a8d2725099e4ee8db824c84a57fb69c8a982",
+    "https://deno.land/std@0.211.0/semver/gtr.ts": "cfa45cd249a7bb44c2898af015a6c7406e3ef9762b9fdd065b90c0608171e3ff",
+    "https://deno.land/std@0.211.0/semver/increment.ts": "427a043be71d6481e45c1a3939b955e800924d70779cb297b872d9cbf9f0e46d",
+    "https://deno.land/std@0.211.0/semver/is_comparator.ts": "d032762a6993b7cd3e4243cbeded0eeab70773dff960d4e92af8770550eea7b6",
+    "https://deno.land/std@0.211.0/semver/is_semver.ts": "57914027d6141e593eb04418aaabbfd6f4562a1c53c6c33a1743fa50ada8d849",
+    "https://deno.land/std@0.211.0/semver/is_semver_comparator.ts": "af985e88e8c35ddedac530bdab63d03478ddd6e75312e9fedfecc1989e3ae4d8",
+    "https://deno.land/std@0.211.0/semver/is_semver_range.ts": "7f2385367a551e2369afa5d22a3c8555399dee2e5218f8fd81cd2a6474a9c314",
+    "https://deno.land/std@0.211.0/semver/lt.ts": "70fecfbad1dd6b7d42f7589efc81fa039688f15a42bc6b86fb3f0fd1e758ef65",
+    "https://deno.land/std@0.211.0/semver/lte.ts": "2b59c8d54eb1ddb76ddc373ae2243532a049585e628b479cfb0bb29268bf04bb",
+    "https://deno.land/std@0.211.0/semver/ltr.ts": "84a3618f410d4b8d534c5074d92e218081345cca29eab28a0e6891d80927f647",
+    "https://deno.land/std@0.211.0/semver/max_satisfying.ts": "d735c0459c90664a645d87e3cc58ca27b4e72190a9d0acf30b061cf65bc614c6",
+    "https://deno.land/std@0.211.0/semver/min_satisfying.ts": "bff238ef9fd2ce3860c212546f51750fb1863bb1d00f6c18c183dcd1396a825f",
+    "https://deno.land/std@0.211.0/semver/mod.ts": "d4a1c97a5e7de8545886336e62b7337bc6ce94fa0b88b0445562414a3b222daa",
+    "https://deno.land/std@0.211.0/semver/neq.ts": "ac2bfcca1a616a1303079fbd1afcf205877ac1e0ca7f2bb3f77595a777bbaef5",
+    "https://deno.land/std@0.211.0/semver/outside.ts": "32c5bfd3492125f28c31daeeacb558526a4356ef77816a79b77a037a286976eb",
+    "https://deno.land/std@0.211.0/semver/parse.ts": "4b001703de877a351ad261caa2cec8a5be86f503fe9e93394f0e650cea9afa10",
+    "https://deno.land/std@0.211.0/semver/parse_comparator.ts": "4fa4379264a0cd747733de00efe9545632495e980244bad16b6fe252249bf423",
+    "https://deno.land/std@0.211.0/semver/parse_range.ts": "3d3f9fc251f4acf7e28781271bd139f436994ad4e4625f30439792af2eab9613",
+    "https://deno.land/std@0.211.0/semver/range_format.ts": "b181a92b78cf9a4636e39fedabf136b49c499412a5aa122aaaa97bb7f4466e9d",
+    "https://deno.land/std@0.211.0/semver/range_intersects.ts": "cea7f0e67794d394434b4cae7da29e57a4ba1ec57254bcf19ac4d05624cbb3df",
+    "https://deno.land/std@0.211.0/semver/range_max.ts": "7116de929c2c2b76a21757b6b449f0db31ddd20f4419ba38d7d5d92ddaf4de17",
+    "https://deno.land/std@0.211.0/semver/range_min.ts": "af3f092ebd3742f26d722817e1fdb81437e8b4a47313bb7c5297c44aa493692c",
+    "https://deno.land/std@0.211.0/semver/rcompare.ts": "f4ac2f87431e7eba58e5bcccd32840f278ce10c96859513c42c9463149c26cd9",
+    "https://deno.land/std@0.211.0/semver/reverse_sort.ts": "6e10806559a2b35415188fc984752dfe2f4ac60b3513e879b28c7b964f9c77cb",
+    "https://deno.land/std@0.211.0/semver/rsort.ts": "d6dea7ddd078446cd5f75e4d471a4fe006fcc69d05170ce4c27637216bfadb6e",
+    "https://deno.land/std@0.211.0/semver/sort.ts": "420aa202f4a3ffd2d5e5b9e1321c1a500e84bd06007dd54c655f836118aaade6",
+    "https://deno.land/std@0.211.0/semver/test_comparator.ts": "cbf58e059f8733e5b676671cdbb5bad920621b1f565e882727fbb703a3b5128f",
+    "https://deno.land/std@0.211.0/semver/test_range.ts": "43e2f830a5ee6cebe2af98e0125e542111e8513a720819df83e3da3605d192ad",
+    "https://deno.land/std@0.211.0/semver/types.ts": "0e4e2bd30e92cca7aaed023f34c30b1b1edaec33eaf3ab5749dbb14a287e7c9d",
+    "https://deno.land/std@0.211.0/testing/snapshot.ts": "35ca1c8e8bfb98d7b7e794f1b7be8d992483fcff572540e41396f22a5bddb944",
+    "https://deno.land/std@0.217.0/assert/assert.ts": "bec068b2fccdd434c138a555b19a2c2393b71dfaada02b7d568a01541e67cdc5",
+    "https://deno.land/std@0.217.0/assert/assertion_error.ts": "9f689a101ee586c4ce92f52fa7ddd362e86434ffdf1f848e45987dc7689976b8",
+    "https://deno.land/std@0.217.0/async/debounce.ts": "025a8e1a7c73e477f0c88a48f826fcdb022b04812ad7fc2f54de756ab4ed7624",
+    "https://deno.land/std@0.217.0/crypto/_fnv/fnv32.ts": "ba2c5ef976b9f047d7ce2d33dfe18671afc75154bcf20ef89d932b2fe8820535",
+    "https://deno.land/std@0.217.0/crypto/_fnv/fnv64.ts": "580cadfe2ff333fe253d15df450f927c8ac7e408b704547be26aab41b5772558",
+    "https://deno.land/std@0.217.0/crypto/_fnv/mod.ts": "8dbb60f062a6e77b82f7a62ac11fabfba52c3cd408c21916b130d8f57a880f96",
+    "https://deno.land/std@0.217.0/crypto/_fnv/util.ts": "27b36ce3440d0a180af6bf1cfc2c326f68823288540a354dc1d636b781b9b75f",
+    "https://deno.land/std@0.217.0/crypto/_wasm/lib/deno_std_wasm_crypto.generated.mjs": "76c727912539737def4549bb62a96897f37eb334b979f49c57b8af7a1617635e",
+    "https://deno.land/std@0.217.0/crypto/_wasm/mod.ts": "c55f91473846827f077dfd7e5fc6e2726dee5003b6a5747610707cdc638a22ba",
+    "https://deno.land/std@0.217.0/crypto/crypto.ts": "4448f8461c797adba8d70a2c60f7795a546d7a0926e96366391bffdd06491c16",
+    "https://deno.land/std@0.217.0/crypto/mod.ts": "7e7971e8abd90addbb02640e43c124e28d10b07e88b61851049c40fc2b5eb04b",
+    "https://deno.land/std@0.217.0/crypto/timing_safe_equal.ts": "bc3622b5aec05e2d8b735bf60633425c34333c06cfb6c4a9f102e4a0f3931ced",
+    "https://deno.land/std@0.217.0/crypto/unstable_keystack.ts": "c2a6f6ed67a4e78745e3c9b490ebb7c12f6066f5c2fe0c69d353961909dc82dd",
+    "https://deno.land/std@0.217.0/encoding/_util.ts": "beacef316c1255da9bc8e95afb1fa56ed69baef919c88dc06ae6cb7a6103d376",
+    "https://deno.land/std@0.217.0/encoding/base64.ts": "96e61a556d933201266fea84ae500453293f2aff130057b579baafda096a96bc",
+    "https://deno.land/std@0.217.0/encoding/base64url.ts": "9cc46cf510436be63ac00ebf97a7de1993e603ca58e1853b344bf90d80ea9945",
+    "https://deno.land/std@0.217.0/encoding/hex.ts": "4d47d3b25103cf81a2ed38f54b394d39a77b63338e1eaa04b70c614cb45ec2e6",
+    "https://deno.land/std@0.217.0/http/cookie.ts": "a377fa60175ba5f61dd4b8a70b34f2bbfbc70782dfd5faf36d314c42e4306006",
+    "https://deno.land/x/code_block_writer@12.0.0/mod.ts": "2c3448060e47c9d08604c8f40dee34343f553f33edcdfebbf648442be33205e5",
+    "https://deno.land/x/code_block_writer@12.0.0/utils/string_utils.ts": "60cb4ec8bd335bf241ef785ccec51e809d576ff8e8d29da43d2273b69ce2a6ff",
+    "https://deno.land/x/deno_cache@0.6.2/auth_tokens.ts": "5d1d56474c54a9d152e44d43ea17c2e6a398dd1e9682c69811a313567c01ee1e",
+    "https://deno.land/x/deno_cache@0.6.2/cache.ts": "58b53c128b742757efcad10af9a3871f23b4e200674cb5b0ddf61164fb9b2fe7",
+    "https://deno.land/x/deno_cache@0.6.2/deno_dir.ts": "1ea355b8ba11c630d076b222b197cfc937dd81e5a4a260938997da99e8ff93a0",
+    "https://deno.land/x/deno_cache@0.6.2/deps.ts": "12cca94516cf2d3ed42fccd4b721ecd8060679253f077d83057511045b0081aa",
+    "https://deno.land/x/deno_cache@0.6.2/dirs.ts": "009c6f54e0b610914d6ce9f72f6f6ccfffd2d47a79a19061e0a9eb4253836069",
+    "https://deno.land/x/deno_cache@0.6.2/disk_cache.ts": "66a1e604a8d564b6dd0500326cac33d08b561d331036bf7272def80f2f7952aa",
+    "https://deno.land/x/deno_cache@0.6.2/file_fetcher.ts": "4f3e4a2c78a5ca1e4812099e5083f815a8525ab20d389b560b3517f6b1161dd6",
+    "https://deno.land/x/deno_cache@0.6.2/http_cache.ts": "407135eaf2802809ed373c230d57da7ef8dff923c4abf205410b9b99886491fd",
+    "https://deno.land/x/deno_cache@0.6.2/lib/deno_cache_dir.generated.js": "59f8defac32e8ebf2a30f7bc77e9d88f0e60098463fb1b75e00b9791a4bbd733",
+    "https://deno.land/x/deno_cache@0.6.2/lib/snippets/deno_cache_dir-a2aecaa9536c9402/fs.js": "cbe3a976ed63c72c7cb34ef845c27013033a3b11f9d8d3e2c4aa5dda2c0c7af6",
+    "https://deno.land/x/deno_cache@0.6.2/mod.ts": "b4004287e1c6123d7f07fe9b5b3e94ce6d990c4102949a89c527c68b19627867",
+    "https://deno.land/x/deno_cache@0.6.2/util.ts": "f3f5a0cfc60051f09162942fb0ee87a0e27b11a12aec4c22076e3006be4cc1e2",
     "https://deno.land/x/denoflate@1.2.1/mod.ts": "f5628e44b80b3d80ed525afa2ba0f12408e3849db817d47a883b801f9ce69dd6",
     "https://deno.land/x/denoflate@1.2.1/pkg/denoflate.js": "b9f9ad9457d3f12f28b1fb35c555f57443427f74decb403113d67364e4f2caf4",
     "https://deno.land/x/denoflate@1.2.1/pkg/denoflate_bg.wasm.js": "d581956245407a2115a3d7e8d85a9641c032940a8e810acbd59ca86afd34d44d",
-    "https://deno.land/x/esbuild@v0.17.11/mod.d.ts": "dc279a3a46f084484453e617c0cabcd5b8bd1920c0e562e4ea02dfc828c8f968",
-    "https://deno.land/x/esbuild@v0.17.11/mod.js": "4f4e61964a551d9c0baf5bb19e973cf631cf8c66ddaf01e70070f8a100fc938c",
-    "https://deno.land/x/esbuild@v0.17.11/wasm.d.ts": "dc279a3a46f084484453e617c0cabcd5b8bd1920c0e562e4ea02dfc828c8f968",
-    "https://deno.land/x/esbuild@v0.17.11/wasm.js": "4030e7b50941ec6e06704c6b5f1f6416cc0f7f35f63daf63f184b728bea79a30",
-    "https://deno.land/x/fresh@1.1.5/dev.ts": "a66c7d64be35bcd6a8e12eec9c27ae335044c70363a241f2e36ee776db468622",
-    "https://deno.land/x/fresh@1.1.5/runtime.ts": "b02ec1e2e32cf73a33d262b7c9dcab9468ce16cd89fd424196c71003698a4ab0",
-    "https://deno.land/x/fresh@1.1.5/server.ts": "f379c9aad24471a71e58fb887fa57e5cc27ad9df035987eb260541c78df38e84",
-    "https://deno.land/x/fresh@1.1.5/src/dev/deps.ts": "aef312af6de1315fa95fc0c32e87c56301b64efeb304193d0dce0da0634144d3",
-    "https://deno.land/x/fresh@1.1.5/src/dev/error.ts": "21a38d240c00279662e6adde41367f1da0ae7e2836d993f818ea94aabab53e7b",
-    "https://deno.land/x/fresh@1.1.5/src/dev/mod.ts": "14baa66a064961afcbad74748eeb2b99ce4bb246223ed69d8cc35b073e49b039",
-    "https://deno.land/x/fresh@1.1.5/src/runtime/csp.ts": "9ee900e9b0b786057b1009da5976298c202d1b86d1f1e4d2510bde5f06530ac9",
-    "https://deno.land/x/fresh@1.1.5/src/runtime/head.ts": "0f9932874497ab6e57ed1ba01d549e843523df4a5d36ef97460e7a43e3132fdc",
-    "https://deno.land/x/fresh@1.1.5/src/runtime/utils.ts": "8320a874a44bdd5905c7d4b87a0e7a14a6c50a2ed133800e72ae57341e4d4faa",
-    "https://deno.land/x/fresh@1.1.5/src/server/bundle.ts": "2febeb5071d0647993560807ca5b2f4cd60181d370ee8612e5db728cb10db9f1",
-    "https://deno.land/x/fresh@1.1.5/src/server/constants.ts": "ad10dda1bc20c25c2926f6a8cfd79ef4368d70b4b03a645f65c04b3fa7d93a8c",
-    "https://deno.land/x/fresh@1.1.5/src/server/context.ts": "896ca59b58d0713d8429c4ec8aea4cedb0e4c09a804a2e6ec0c81379f5f83b15",
-    "https://deno.land/x/fresh@1.1.5/src/server/default_error_page.ts": "9a1a595a1a2b31c9b724b04db82b8af256285536db272658d831ac9ef1d3d448",
-    "https://deno.land/x/fresh@1.1.5/src/server/deps.ts": "e205002c298ee6bf40af1365ced243b8cd86cf39e922ec2db2c91ef022eb72ad",
-    "https://deno.land/x/fresh@1.1.5/src/server/htmlescape.ts": "834ac7d0caa9fc38dffd9b8613fb47aeecd4f22d5d70c51d4b20a310c085835c",
-    "https://deno.land/x/fresh@1.1.5/src/server/mod.ts": "72d213444334dd2e94c757a0eee0fc486c0919399ea9184d07ad042f34edd00d",
-    "https://deno.land/x/fresh@1.1.5/src/server/render.ts": "6f50707bd1f6e33ed84bb71ae3b0996d202b953cefc4285f5356524c7b21f01f",
-    "https://deno.land/x/fresh@1.1.5/src/server/types.ts": "6579aac850ea4af5cdfee8f9552fbadebb7b50841d180b75bd90466416feee86",
+    "https://deno.land/x/esbuild@v0.19.11/mod.js": "bd4916647799a0cd046dcf4eafd6ace09d22d5898870bd062206b8b6343d5e6a",
+    "https://deno.land/x/esbuild@v0.19.11/wasm.js": "e5935e262c7b5b3ed4d842e780293d6ff7132c9ddc3077b31ae305c73c741e7b",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/deps.ts": "9bc65a79ff37923c11d7470823aaa0ba9cd2e044046619a81feae074d3a2969d",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/mod.ts": "28524460bef46d487221b01ade6ed913d2e127de7eeee025ab75b34b491283da",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/src/deno.ts": "b0af3e430c068f18c6fa48c2083a1b4354b6c303e16fb37855e02fcafb95f36d",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/src/loader_native.ts": "17fe4702b285597d1ffc191cc85063bbb003956c2a67c18bac5c0c23e153561e",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/src/loader_portable.ts": "d999f452ef3d8ec2dd3c8443f542adf57efc8a2cd59b29cc41f5b3d7dff512e5",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/src/plugin_deno_loader.ts": "bbd8a462033508a92d19066034711f9e1fcb46d9e39d70050fc2fc9a07e521bc",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/src/plugin_deno_resolver.ts": "4a2d495a47ea513ba2692c33ac26b6ac8cbe765dad1c77b76fcc62aa8bfc97f5",
+    "https://deno.land/x/esbuild_deno_loader@0.8.5/src/shared.ts": "33052684aeb542ebd24da372816bbbf885cd090a7ab0fde7770801f7f5b49572",
+    "https://deno.land/x/fresh@1.6.5/dev.ts": "720dd3a64b62b852db7b6ae471c246c5c605cf4a3091c4cbc802790f36d43e4c",
+    "https://deno.land/x/fresh@1.6.5/runtime.ts": "49f4f70c24d14c5d5e112a671ef0314e438e5cd83eacb4f75c6db2fbdc22b540",
+    "https://deno.land/x/fresh@1.6.5/server.ts": "d5817615a3ac822d422627f2cd6f850a31e11f7e73b328a79807f722e6519bac",
+    "https://deno.land/x/fresh@1.6.5/src/build/aot_snapshot.ts": "4ac6330e5325dd9411fa2a46e97bb289f910fde4be82dc349d3e2b4bb1a7c07d",
+    "https://deno.land/x/fresh@1.6.5/src/build/deps.ts": "2402e389a180b815f646de6fcbae3928539b77b154713a4795c248baf588b661",
+    "https://deno.land/x/fresh@1.6.5/src/build/esbuild.ts": "b9b731263f133321fb51dc44d0d7e744d3bfa245538032627c2f7b75b1b04649",
+    "https://deno.land/x/fresh@1.6.5/src/build/mod.ts": "b9d1695a86746ac3a1c52f0e07e723faa2310d1dfd109b9a2eebab6727c4702b",
+    "https://deno.land/x/fresh@1.6.5/src/constants.ts": "4795d194b6c6b95f0e876c0a997fbaf57f94cfe253442c5819f95410870b79b3",
+    "https://deno.land/x/fresh@1.6.5/src/dev/build.ts": "9aaf84a781ee4d11d73ec549425f273fe8339812fdd8f726e1ec1ba61bdf0e9d",
+    "https://deno.land/x/fresh@1.6.5/src/dev/deps.ts": "f9a9c267b8d5ea79caafaf91a55e8981f48517889b9527c8ea9ebbc3a14ac5a1",
+    "https://deno.land/x/fresh@1.6.5/src/dev/dev_command.ts": "3e3dcc80180faf8868d44d892ddfa8c5ad06033e4d94c0934302e157db1de63d",
+    "https://deno.land/x/fresh@1.6.5/src/dev/error.ts": "21a38d240c00279662e6adde41367f1da0ae7e2836d993f818ea94aabab53e7b",
+    "https://deno.land/x/fresh@1.6.5/src/dev/imports.ts": "1e6905f40dea3ab14773acb057be8544c7d75f37a4eb5776936a75d929e5b1d9",
+    "https://deno.land/x/fresh@1.6.5/src/dev/manifest.ts": "156fb0ce3f77b9fdac18f8798eee36283c2fb440795c6024b6b6ab938e91f9cb",
+    "https://deno.land/x/fresh@1.6.5/src/dev/mod.ts": "47489f35a9e462c7b91bac6c9102a619ce6fd2300098bf8ce3f8b77599aa8dea",
+    "https://deno.land/x/fresh@1.6.5/src/dev/update_check.ts": "32e48de168e6c9df8801aaeb9d8ff73a4b2646824112f8587e74e49055e301b8",
+    "https://deno.land/x/fresh@1.6.5/src/runtime/Partial.tsx": "92e16fa7edf37dc8e254024a5410ea2c8986804a6ddf911af4d30209dff80a22",
+    "https://deno.land/x/fresh@1.6.5/src/runtime/active_url.ts": "c718797b11189c7e2c86569355d55056148907121e958e00f71c56593aecc329",
+    "https://deno.land/x/fresh@1.6.5/src/runtime/build_id.ts": "8376e70e42ce456dfa6932c638409d2ef1bca4833b4ceba0bf74510080a7f976",
+    "https://deno.land/x/fresh@1.6.5/src/runtime/csp.ts": "9ee900e9b0b786057b1009da5976298c202d1b86d1f1e4d2510bde5f06530ac9",
+    "https://deno.land/x/fresh@1.6.5/src/runtime/deserializer.ts": "1b83e75fa61c48b074ea121f33647d1ed15c68fa2f2a11b0a7f7a12cd38af627",
+    "https://deno.land/x/fresh@1.6.5/src/runtime/head.ts": "0f9932874497ab6e57ed1ba01d549e843523df4a5d36ef97460e7a43e3132fdc",
+    "https://deno.land/x/fresh@1.6.5/src/runtime/utils.ts": "4f40630c308e8ea7d53860687905caf1a2f2a46ad8692f24e905a8e996b584c3",
+    "https://deno.land/x/fresh@1.6.5/src/server/boot.ts": "af488946995049dcfc148ae0372252c6c871e0e9fbeea1a1149f92ce28031ede",
+    "https://deno.land/x/fresh@1.6.5/src/server/build_id.ts": "82d9cb985de6b1e38c3108e5a00667b16e80eedc145d73835d6b44349ebe6389",
+    "https://deno.land/x/fresh@1.6.5/src/server/code_frame.ts": "fac505f138fbd1bb260030122b87aeb2f5b5e54018e3066e105c669c686cc373",
+    "https://deno.land/x/fresh@1.6.5/src/server/compose.ts": "895c28eddc618750768b26d703660ef9646ec0e3436ce0cd4bd1619446316b4d",
+    "https://deno.land/x/fresh@1.6.5/src/server/config.ts": "a5d0545d18c68d01770a4eb321d2fc85081ad7992ae63b1497f0b92ee122410a",
+    "https://deno.land/x/fresh@1.6.5/src/server/constants.ts": "e75a7f7b14185b6f85747613591348313200fe8e218cb473b1da9db941ee68d1",
+    "https://deno.land/x/fresh@1.6.5/src/server/context.ts": "cd4f7bc5d4197e11106bbd19d67177b2c9b6f7f7efc56837ab1f78ee76ce3e78",
+    "https://deno.land/x/fresh@1.6.5/src/server/default_error_page.tsx": "094ad8d52d31f99172a606d0a0d8236604a1f9bb6d1f928d0d466d55b36dae70",
+    "https://deno.land/x/fresh@1.6.5/src/server/defines.ts": "f518ff10e499d4543bb9231f55026f26be2507eaccb072aafab93c8cc0bc3adc",
+    "https://deno.land/x/fresh@1.6.5/src/server/deps.ts": "c7bc67235d38775b382b98278a8e4d359b9e738b3733c704ff88e20a7e01539c",
+    "https://deno.land/x/fresh@1.6.5/src/server/error_overlay.tsx": "e6ab4cef0ea812a1e1f32ee9116c61f64db8466d46e228acbb953215f4517d9c",
+    "https://deno.land/x/fresh@1.6.5/src/server/fs_extract.ts": "10796d727dfad6c3e8789aea53db3c715fc4674f1ece8af2a8683c1f68a13e01",
+    "https://deno.land/x/fresh@1.6.5/src/server/htmlescape.ts": "834ac7d0caa9fc38dffd9b8613fb47aeecd4f22d5d70c51d4b20a310c085835c",
+    "https://deno.land/x/fresh@1.6.5/src/server/init_safe_deps.ts": "8c74d8708986d156126355b0935a1915069bfdc389ccabd3d2d72d1c9e04025c",
+    "https://deno.land/x/fresh@1.6.5/src/server/mod.ts": "6cee56e234f6bc19f62f3b6c0d287dc7b9632fcbfb8f56dde1d81423532d65c4",
+    "https://deno.land/x/fresh@1.6.5/src/server/render.ts": "2412e4225c12056c045eb76d50838323e2c53bd1f4523476e6f18fba171a603c",
+    "https://deno.land/x/fresh@1.6.5/src/server/rendering/fresh_tags.tsx": "707eab1f11528740d13ee53e4dece407b0c0e8710ec5154488a10576b8f6cb4f",
+    "https://deno.land/x/fresh@1.6.5/src/server/rendering/preact_hooks.ts": "5c2904cfda3acdba0f18e8095428bb35546a20a2e5bf88a5adc53f04e7453b0d",
+    "https://deno.land/x/fresh@1.6.5/src/server/rendering/state.ts": "5e0c3a60964596cc28c1804545eae323cbc92eec9ce8cb0932d5168a6d1f33e9",
+    "https://deno.land/x/fresh@1.6.5/src/server/rendering/template.tsx": "858ca33f239e3f26a932c4b0fd4d967df32d9f69dcbc5d6a5cecfe6cb7f195d1",
+    "https://deno.land/x/fresh@1.6.5/src/server/router.ts": "257a293776ee682937b8abb6d803971a6863a2f161b1e079b57c013589d0ed0b",
+    "https://deno.land/x/fresh@1.6.5/src/server/serializer.ts": "f0cffb863bbdbac6ed53fefe181e415d6aefc2101f2dc92a562b364088809e44",
+    "https://deno.land/x/fresh@1.6.5/src/server/tailwind_aot_error_page.tsx": "db968bf799362e373db6bddc3591a28c59c4e92b16403df4b6ec6a38f3eccc01",
+    "https://deno.land/x/fresh@1.6.5/src/server/types.ts": "f5911c9eef864df8ef58fe5bd353ebd22267b35ef2ef8b21def825fd274d05a6",
+    "https://deno.land/x/fresh@1.6.5/src/types.ts": "05169e3389979d8283de0ec1db3a765324ffd730b6af29ffe02752f341ae7d35",
+    "https://deno.land/x/fresh@1.6.5/versions.json": "9e3892e7500a96782d9e4745dbea91ae022207117635db30e31599074387db43",
     "https://deno.land/x/importmap@0.2.1/_util.ts": "ada9a9618b537e6c0316c048a898352396c882b9f2de38aba18fd3f2950ede89",
     "https://deno.land/x/importmap@0.2.1/mod.ts": "ae3d1cd7eabd18c01a4960d57db471126b020f23b37ef14e1359bbb949227ade",
     "https://deno.land/x/numesis@1.1.0/mod.ts": "c0f8ceffece2b417e9cdfe8cc50408a36b35a4b5ca260451a85b2169df5ec3fd",
-    "https://deno.land/x/rutt@0.1.0/mod.ts": "4662ad4f687740ac612b779ed4c62eecebd718b56d24a07f719ec3b24464c139",
-    "https://deno.land/x/sqlite@v3.7.1/build/sqlite.d.ts": "d724a21a588a0e19ae46a3476349fe5d75e896735e7362ea8cf997ffad35d0f9",
-    "https://deno.land/x/sqlite@v3.7.1/build/sqlite.js": "c59f109f100c2bae0b9342f04e0d400583e2e3211d08bb71095177a4109ee5bf",
-    "https://deno.land/x/sqlite@v3.7.1/build/vfs.js": "08533cc78fb29b9d9bd62f6bb93e5ef333407013fed185776808f11223ba0e70",
-    "https://deno.land/x/sqlite@v3.7.1/mod.ts": "e09fc79d8065fe222578114b109b1fd60077bff1bb75448532077f784f4d6a83",
-    "https://deno.land/x/sqlite@v3.7.1/src/constants.ts": "90f3be047ec0a89bcb5d6fc30db121685fc82cb00b1c476124ff47a4b0472aa9",
-    "https://deno.land/x/sqlite@v3.7.1/src/db.ts": "59c6c2b5c4127132558bb8c610eadd811822f1a5d7f9c509704179ca192f94e0",
-    "https://deno.land/x/sqlite@v3.7.1/src/error.ts": "f7a15cb00d7c3797da1aefee3cf86d23e0ae92e73f0ba3165496c3816ab9503a",
-    "https://deno.land/x/sqlite@v3.7.1/src/function.ts": "e4c83b8ec64bf88bafad2407376b0c6a3b54e777593c70336fb40d43a79865f2",
-    "https://deno.land/x/sqlite@v3.7.1/src/query.ts": "d58abda928f6582d77bad685ecf551b1be8a15e8e38403e293ec38522e030cad",
-    "https://deno.land/x/sqlite@v3.7.1/src/wasm.ts": "e79d0baa6e42423257fb3c7cc98091c54399254867e0f34a09b5bdef37bd9487",
-    "https://deno.land/x/ts_morph@17.0.1/common/DenoRuntime.ts": "537800e840d0994f9055164e11bf33eadf96419246af0d3c453793c3ae67bdb3",
-    "https://deno.land/x/ts_morph@17.0.1/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed",
-    "https://deno.land/x/ts_morph@17.0.1/common/ts_morph_common.d.ts": "ee7767b0c68b23c65bb607c94b6cb3512e8237fbcb7d1d8383a33235cde2c068",
-    "https://deno.land/x/ts_morph@17.0.1/common/ts_morph_common.js": "49a79124b941ba2b35d81ac9eb90fc33c957b2640cdb97569c1941bac5a3bbdb",
-    "https://deno.land/x/ts_morph@17.0.1/common/typescript.d.ts": "57e52a0882af4e835473dda27e4316cc31149866970210f9f79b940e916b7838",
-    "https://deno.land/x/ts_morph@17.0.1/common/typescript.js": "5dd669eb199ee2a539924c63a92e23d95df43dfe2fbe3a9d68c871648be1ad5e",
-    "https://deno.land/x/ts_morph@17.0.1/mod.ts": "adba9b82f24865d15d2c78ef6074b9a7457011719056c9928c800f130a617c93",
-    "https://deno.land/x/ts_morph@17.0.1/ts_morph.d.ts": "a54b0c51b06d84defedf5fdd59c773d803808ae7c9678f7165f7a1a6dfa7f6a3",
-    "https://deno.land/x/ts_morph@17.0.1/ts_morph.js": "1bb80284b9e31a4c5c2078cd533fe9b12b4b2d710267055cb655225aa88fb2df",
+    "https://deno.land/x/sqlite@v3.8/build/sqlite.js": "72f63689fffcb9bb5ae10b1e8f7db09ea845cdf713e0e3a9693d8416a28f92a6",
+    "https://deno.land/x/sqlite@v3.8/build/vfs.js": "08533cc78fb29b9d9bd62f6bb93e5ef333407013fed185776808f11223ba0e70",
+    "https://deno.land/x/sqlite@v3.8/mod.ts": "e09fc79d8065fe222578114b109b1fd60077bff1bb75448532077f784f4d6a83",
+    "https://deno.land/x/sqlite@v3.8/src/constants.ts": "90f3be047ec0a89bcb5d6fc30db121685fc82cb00b1c476124ff47a4b0472aa9",
+    "https://deno.land/x/sqlite@v3.8/src/db.ts": "7d3251021756fa80f382c3952217c7446c5c8c1642b63511da0938fe33562663",
+    "https://deno.land/x/sqlite@v3.8/src/error.ts": "f7a15cb00d7c3797da1aefee3cf86d23e0ae92e73f0ba3165496c3816ab9503a",
+    "https://deno.land/x/sqlite@v3.8/src/function.ts": "e4c83b8ec64bf88bafad2407376b0c6a3b54e777593c70336fb40d43a79865f2",
+    "https://deno.land/x/sqlite@v3.8/src/query.ts": "d58abda928f6582d77bad685ecf551b1be8a15e8e38403e293ec38522e030cad",
+    "https://deno.land/x/sqlite@v3.8/src/wasm.ts": "e79d0baa6e42423257fb3c7cc98091c54399254867e0f34a09b5bdef37bd9487",
+    "https://deno.land/x/ts_morph@20.0.0/common/DenoRuntime.ts": "6a7180f0c6e90dcf23ccffc86aa8271c20b1c4f34c570588d08a45880b7e172d",
+    "https://deno.land/x/ts_morph@20.0.0/common/mod.ts": "01985d2ee7da8d1caee318a9d07664774fbee4e31602bc2bb6bb62c3489555ed",
+    "https://deno.land/x/ts_morph@20.0.0/common/ts_morph_common.js": "2325f94f61dc5f3f98a1dab366dc93048d11b1433d718b10cfc6ee5a1cfebe8f",
+    "https://deno.land/x/ts_morph@20.0.0/common/typescript.js": "b9edf0a451685d13e0467a7ed4351d112b74bd1e256b915a2b941054e31c1736",
+    "https://deno.land/x/ts_morph@20.0.0/mod.ts": "adba9b82f24865d15d2c78ef6074b9a7457011719056c9928c800f130a617c93",
+    "https://deno.land/x/ts_morph@20.0.0/ts_morph.js": "ea8c6d40a5a30ea2d720ef289b7cc817d3be3d0010587c197ea4419026943e0e",
     "https://deno.land/x/usid@2.0.0/mod.ts": "cf03ac641ae7ad533d900eaedf8bd62a9dbb6ddbc1e50db1c2f4f143fcb608ab",
-    "https://esm.sh/preact-render-to-string@6.0.2?deps=preact@10.13.2": "df36fa1d653fc00225ec484bee9d8075df042f21cb861b97d40b5aff9029a6c7",
-    "https://esm.sh/preact@10.13.2": "5ebf0838bbc3c32fc6e78a4cd9dd672f2c36386d0595815d721a6b0941278488",
-    "https://esm.sh/preact@10.13.2/hooks": "884334b1560448cf16b4f14841fffdb8707615373a3c76c676a6f9e5c77e43b2",
+    "https://esm.sh/*preact-render-to-string@6.3.1": "07807f027acf54b994b630bbb2a923f5a835f9544e01144f67ab292e90a431e4",
+    "https://esm.sh/@babel/helper-validator-identifier@7.22.20": "daace34e028130297fddf97f3ef6deb4b05ec3eb46f5c5cacd6eaa43d6323b0a",
+    "https://esm.sh/preact@10.19.6": "281b115a9b79918c6b73382b4e818d6f9e48db9064b7fd4f75a45a4edee54145",
+    "https://esm.sh/preact@10.19.6/debug": "0e16b3e9f45372501b91ecf69b1bcaf2b2dad3ac470ce75113d957acbd5e277d",
+    "https://esm.sh/preact@10.19.6/hooks": "3037d71a7794c70bacb2da5dd9520334c6a24b3a7a75a2eeec9f025f8dc549f1",
     "https://esm.sh/showdown@2.1.0": "8401aeb424b74dcdf53811256d1467343610fc05c0430bb2460d4a3c4d5d5e34",
-    "https://esm.sh/stable/preact@10.13.2/deno/hooks.js": "c7a8e703bcbc6a05949f329b618c33d5d1ea5fee113ddcea44ff0f527af8556f",
-    "https://esm.sh/stable/preact@10.13.2/deno/preact.mjs": "365fab897381f4f403f859c5d12939084560545567108cc90dae901bbe892578",
-    "https://esm.sh/v116/@types/showdown@2.0.0/index.d.ts": "0cae38d42cef880ce4848fcd9ed704d65ba3ecc825443cd548ff81931c64cdca",
-    "https://esm.sh/v116/preact-render-to-string@6.0.2/X-ZC9wcmVhY3RAMTAuMTMuMg/deno/preact-render-to-string.mjs": "09ead691b3745189a4171a6ee0948592c7a862b1bf1a97fe651fb34f88eabe3b",
-    "https://esm.sh/v116/preact-render-to-string@6.0.2/X-ZC9wcmVhY3RAMTAuMTMuMg/src/index.d.ts": "36e470f81eacf9700b80c92d7bf7342f0d46e2e7152a31cbe166576bb634a96e",
-    "https://esm.sh/v116/preact@10.13.2/hooks/src/index.d.ts": "5c29febb624fc25d71cb0e125848c9b711e233337a08f7eacfade38fd4c14cc3",
-    "https://esm.sh/v116/preact@10.13.2/src/index.d.ts": "65398710de6aa0a07412da79784e05e6e96763f51c7c91b77344d2d0af06385c",
-    "https://esm.sh/v116/preact@10.13.2/src/jsx.d.ts": "9ac9b82c199fa7b04748807d750eba1a106c0be52041b8617416f88d6fc0a257",
+    "https://esm.sh/stable/preact@10.19.6/denonext/debug.js": "a0a13b66504bd149d6f0e1facde5a610f029be9c6b5539008934badfe0d87ed5",
+    "https://esm.sh/stable/preact@10.19.6/denonext/devtools.js": "662746ca22e50eb0db3356f936c891b465aea20d8f4d809262f612e66b3d705e",
+    "https://esm.sh/stable/preact@10.19.6/denonext/hooks.js": "60270845e547f2e2c8d94cdb0bf9a0376e5b02bd6bb2b8694720274c2378890e",
+    "https://esm.sh/stable/preact@10.19.6/denonext/preact.mjs": "68491395d287895f4d697e403ded5b0ebb8fed0494f9e870c422bc017e5e52f5",
     "https://esm.sh/v116/showdown@2.1.0/deno/showdown.mjs": "2bb1e756a91221282de25d2da4a207342a577b04984bfc806573dd4d47cb6434",
-    "https://raw.githubusercontent.com/lucacasonato/esbuild_deno_loader/8031f71afa1bbcd3237a94b11f53a2e5c5c0e7bf/deps.ts": "b7248e5b750be62613a9417f407e65ed43726d83b11f9631d6dbb58634bbd7d1",
-    "https://raw.githubusercontent.com/lucacasonato/esbuild_deno_loader/8031f71afa1bbcd3237a94b11f53a2e5c5c0e7bf/mod.ts": "3e507379372361162f93325a216b86f6098defb5bb60144555b507bca26d061f",
-    "https://raw.githubusercontent.com/lucacasonato/esbuild_deno_loader/8031f71afa1bbcd3237a94b11f53a2e5c5c0e7bf/src/deno.ts": "71bee6b14e72ca193c0686d8b4f1f47d639a64745b6f5c7576f7a3616f436f57",
-    "https://raw.githubusercontent.com/lucacasonato/esbuild_deno_loader/8031f71afa1bbcd3237a94b11f53a2e5c5c0e7bf/src/native_loader.ts": "2a0f5a7b68a57c4651ad48161b32532356b434597a6cf282683427482b38f6fa",
-    "https://raw.githubusercontent.com/lucacasonato/esbuild_deno_loader/8031f71afa1bbcd3237a94b11f53a2e5c5c0e7bf/src/portable_loader.ts": "47adb6d9a00f13a87d0a15f2af79118eb93503234008c31392d71270bc0a42fa",
-    "https://raw.githubusercontent.com/lucacasonato/esbuild_deno_loader/8031f71afa1bbcd3237a94b11f53a2e5c5c0e7bf/src/shared.ts": "007e8d575cb6ebcac4110f1f72188a8bec3aa29287b4ad26e98403c00bebf036"
+    "https://esm.sh/v135/@babel/helper-validator-identifier@7.22.20/denonext/helper-validator-identifier.mjs": "1ad312a9040d1f3b096e90a3e6a9da7ecfc99662140852fe3862a316c2591c93",
+    "https://esm.sh/v135/preact-render-to-string@6.3.1/X-ZS8q/denonext/preact-render-to-string.mjs": "bcaceb8c3938310aee3dd4f7b6f2136cf0b2b890988c2e6679485e052e76e920"
   }
 }

+ 4 - 1
dev.ts

@@ -1,5 +1,8 @@
 #!/usr/bin/env -S deno run -A --watch=static/,routes/
 
 import dev from "$fresh/dev.ts";
+import config from "./fresh.config.ts";
 
-await dev(import.meta.url, "./main.ts");
+import "$std/dotenv/load.ts";
+
+await dev(import.meta.url, "./main.ts", config);

+ 3 - 0
fresh.config.ts

@@ -0,0 +1,3 @@
+import { defineConfig } from "$fresh/server.ts";
+
+export default defineConfig({});

+ 37 - 38
fresh.gen.ts

@@ -1,50 +1,49 @@
-// DO NOT EDIT. This file is generated by fresh.
+// DO NOT EDIT. This file is generated by Fresh.
 // This file SHOULD be checked into source version control.
 // This file is automatically updated during development when running `dev.ts`.
 
-import config from "./deno.json" assert { type: "json" };
-import * as $0 from "./routes/[id].tsx";
-import * as $1 from "./routes/_404.tsx";
-import * as $2 from "./routes/_app.tsx";
-import * as $3 from "./routes/api/post.tsx";
-import * as $4 from "./routes/api/share.tsx";
-import * as $5 from "./routes/api/user/login.tsx";
-import * as $6 from "./routes/api/user/logout.tsx";
-import * as $7 from "./routes/api/user/register.tsx";
-import * as $8 from "./routes/index.tsx";
-import * as $9 from "./routes/login.tsx";
-import * as $10 from "./routes/register.tsx";
-import * as $$0 from "./islands/Editor.tsx";
-import * as $$1 from "./islands/HomeBar.tsx";
-import * as $$2 from "./islands/LoginFrame.tsx";
-import * as $$3 from "./islands/Modal.tsx";
-import * as $$4 from "./islands/PostList.tsx";
-import * as $$5 from "./islands/TopBar.tsx";
+import * as $_id_ from "./routes/[id].tsx";
+import * as $_404 from "./routes/_404.tsx";
+import * as $_app from "./routes/_app.tsx";
+import * as $api_post from "./routes/api/post.tsx";
+import * as $api_share from "./routes/api/share.tsx";
+import * as $api_user_login from "./routes/api/user/login.tsx";
+import * as $api_user_logout from "./routes/api/user/logout.tsx";
+import * as $api_user_register from "./routes/api/user/register.tsx";
+import * as $index from "./routes/index.tsx";
+import * as $login from "./routes/login.tsx";
+import * as $register from "./routes/register.tsx";
+import * as $Editor from "./islands/Editor.tsx";
+import * as $HomeBar from "./islands/HomeBar.tsx";
+import * as $LoginFrame from "./islands/LoginFrame.tsx";
+import * as $Modal from "./islands/Modal.tsx";
+import * as $PostList from "./islands/PostList.tsx";
+import * as $TopBar from "./islands/TopBar.tsx";
+import { type Manifest } from "$fresh/server.ts";
 
 const manifest = {
   routes: {
-    "./routes/[id].tsx": $0,
-    "./routes/_404.tsx": $1,
-    "./routes/_app.tsx": $2,
-    "./routes/api/post.tsx": $3,
-    "./routes/api/share.tsx": $4,
-    "./routes/api/user/login.tsx": $5,
-    "./routes/api/user/logout.tsx": $6,
-    "./routes/api/user/register.tsx": $7,
-    "./routes/index.tsx": $8,
-    "./routes/login.tsx": $9,
-    "./routes/register.tsx": $10,
+    "./routes/[id].tsx": $_id_,
+    "./routes/_404.tsx": $_404,
+    "./routes/_app.tsx": $_app,
+    "./routes/api/post.tsx": $api_post,
+    "./routes/api/share.tsx": $api_share,
+    "./routes/api/user/login.tsx": $api_user_login,
+    "./routes/api/user/logout.tsx": $api_user_logout,
+    "./routes/api/user/register.tsx": $api_user_register,
+    "./routes/index.tsx": $index,
+    "./routes/login.tsx": $login,
+    "./routes/register.tsx": $register,
   },
   islands: {
-    "./islands/Editor.tsx": $$0,
-    "./islands/HomeBar.tsx": $$1,
-    "./islands/LoginFrame.tsx": $$2,
-    "./islands/Modal.tsx": $$3,
-    "./islands/PostList.tsx": $$4,
-    "./islands/TopBar.tsx": $$5,
+    "./islands/Editor.tsx": $Editor,
+    "./islands/HomeBar.tsx": $HomeBar,
+    "./islands/LoginFrame.tsx": $LoginFrame,
+    "./islands/Modal.tsx": $Modal,
+    "./islands/PostList.tsx": $PostList,
+    "./islands/TopBar.tsx": $TopBar,
   },
   baseUrl: import.meta.url,
-  config,
-};
+} satisfies Manifest;
 
 export default manifest;

+ 41 - 40
islands/Editor.tsx

@@ -1,6 +1,5 @@
-/** @jsx h */
-import { h, render } from "preact";
-import { useEffect, useState, useRef } from "preact/hooks";
+import { render } from "preact";
+import { useEffect, useRef, useState } from "preact/hooks";
 import showdown, { Converter } from "showdown";
 import { debounce, DebouncedFunction } from "$async/debounce.ts";
 import { hideLoading } from "utils/ui.ts";
@@ -49,11 +48,10 @@ export default function Editor(props: EditorProps) {
       return;
     }
 
-    const currentElement =
-      scrollSide === EditorMode.Read
-        ? readViewRef.current
-        : editViewRef.current &&
-          (editViewRef.current as HTMLDivElement).querySelector("textarea");
+    const currentElement = scrollSide === EditorMode.Read
+      ? readViewRef.current
+      : editViewRef.current &&
+        (editViewRef.current as HTMLDivElement).querySelector("textarea");
     if (currentElement) {
       const currentScrollPosition = (currentElement as HTMLDivElement)
         .scrollTop;
@@ -62,11 +60,10 @@ export default function Editor(props: EditorProps) {
         (currentElement as HTMLDivElement).clientHeight;
 
       // Sync scroll ratio
-      const syncElement =
-        scrollSide === EditorMode.Read
-          ? editViewRef.current &&
-            (editViewRef.current as HTMLDivElement).querySelector("textarea")
-          : readViewRef.current;
+      const syncElement = scrollSide === EditorMode.Read
+        ? editViewRef.current &&
+          (editViewRef.current as HTMLDivElement).querySelector("textarea")
+        : readViewRef.current;
       if (syncElement) {
         (syncElement as HTMLDivElement).scrollTop =
           ((syncElement as HTMLDivElement).scrollHeight -
@@ -116,7 +113,7 @@ export default function Editor(props: EditorProps) {
       }
       render(
         <div dangerouslySetInnerHTML={{ __html: convertedContent }} />,
-        shadowRoot
+        shadowRoot,
       );
     }
   };
@@ -196,35 +193,39 @@ export default function Editor(props: EditorProps) {
 
   return (
     <div className={`pd-editor pd-mode-${getModeText(mode)}`}>
-      {props.allowMode !== EditorMode.Read ? (
-        <div className="pd-edit-view" ref={editViewRef}>
-          <textarea
-            placeholder="Some Markdown here"
-            onScroll={() => {
-              onScroll(EditorMode.Edit);
-            }}
-            onPaste={() => {
-              // Sync scroll again after render
-              setTimeout(() => {
+      {props.allowMode !== EditorMode.Read
+        ? (
+          <div className="pd-edit-view" ref={editViewRef}>
+            <textarea
+              placeholder="Some Markdown here"
+              onScroll={() => {
                 onScroll(EditorMode.Edit);
-              }, 100);
-            }}
-            onInput={(e) => {
-              convertText((e.target as HTMLInputElement).value);
+              }}
+              onPaste={() => {
+                // Sync scroll again after render
+                setTimeout(() => {
+                  onScroll(EditorMode.Edit);
+                }, 100);
+              }}
+              onInput={(e) => {
+                convertText((e.target as HTMLInputElement).value);
+              }}
+              value={displayContent}
+            />
+          </div>
+        )
+        : null}
+      {props.allowMode !== EditorMode.Edit
+        ? (
+          <div
+            className="pd-read-view"
+            ref={readViewRef}
+            onScroll={() => {
+              onScroll(EditorMode.Read);
             }}
-            value={displayContent}
           />
-        </div>
-      ) : null}
-      {props.allowMode !== EditorMode.Edit ? (
-        <div
-          className="pd-read-view"
-          ref={readViewRef}
-          onScroll={() => {
-            onScroll(EditorMode.Read);
-          }}
-        />
-      ) : null}
+        )
+        : null}
     </div>
   );
 }

+ 0 - 2
islands/HomeBar.tsx

@@ -1,5 +1,3 @@
-/** @jsx h */
-import { h } from "preact";
 import { showLoading } from "utils/ui.ts";
 
 interface HomeBarProps {

+ 21 - 20
islands/LoginFrame.tsx

@@ -1,8 +1,5 @@
-/** @jsx h */
-/** @jsxFrag Fragment */
-import { Fragment, h } from "preact";
-import { useState, useEffect } from "preact/hooks";
-import { showLoading, hideLoading } from "utils/ui.ts";
+import { useEffect, useState } from "preact/hooks";
+import { hideLoading, showLoading } from "utils/ui.ts";
 
 interface LoginFrameProps {
   mode: "login" | "register";
@@ -121,21 +118,25 @@ export default function LoginFrame(props: LoginFrameProps) {
           setPassword((e.target as HTMLInputElement).value);
         }}
       />
-      {props.mode === "register" ? (
-        <>
-          <span className="pd-login-input-label">Confirm Password</span>
-          <input
-            className={`pd-login-input${confirmPasswordError ? " error" : ""}`}
-            type="password"
-            placeholder="Confirm your password"
-            value={confirmPassword}
-            onInput={(e) => {
-              setConfirmPasswordError(false);
-              setConfirmPassword((e.target as HTMLInputElement).value);
-            }}
-          />
-        </>
-      ) : null}
+      {props.mode === "register"
+        ? (
+          <>
+            <span className="pd-login-input-label">Confirm Password</span>
+            <input
+              className={`pd-login-input${
+                confirmPasswordError ? " error" : ""
+              }`}
+              type="password"
+              placeholder="Confirm your password"
+              value={confirmPassword}
+              onInput={(e) => {
+                setConfirmPasswordError(false);
+                setConfirmPassword((e.target as HTMLInputElement).value);
+              }}
+            />
+          </>
+        )
+        : null}
       <button className="pd-login-btn" type="button" onClick={onSubmit}>
         {props.mode === "register" ? "Register" : "Sign in"}
       </button>

+ 23 - 21
islands/Modal.tsx

@@ -1,7 +1,5 @@
-/** @jsx h */
-/** @jsxFrag Fragment */
-import { JSX, Fragment, h } from "preact";
-import { useState, useEffect } from "preact/hooks";
+import { JSX } from "preact";
+import { useEffect, useState } from "preact/hooks";
 
 interface ModalAction {
   text: string;
@@ -12,7 +10,7 @@ interface ModalGlobalHook {
   show: (
     title: string,
     content: string | JSX.Element,
-    actions: ModalAction[]
+    actions: ModalAction[],
   ) => void;
   hide: () => void;
 }
@@ -32,7 +30,7 @@ export default function Modal() {
   const showModal = (
     newTitle: string,
     newContent: string | JSX.Element,
-    newActions: ModalAction[]
+    newActions: ModalAction[],
   ) => {
     setTitle(newTitle || "");
     setContent(newContent || "");
@@ -49,7 +47,7 @@ export default function Modal() {
       show: (
         title: string,
         content: string | JSX.Element,
-        actions: ModalAction[]
+        actions: ModalAction[],
       ) => showModal(title, content, actions),
       hide: () => hideModal(),
     };
@@ -71,20 +69,24 @@ export default function Modal() {
           />
           {title ? <div className="pd-modal-title">{title}</div> : null}
           <div className="pd-modal-body">{content}</div>
-          {actions.length > 0 ? (
-            <div className="pd-modal-footer">
-              {actions.map((action, index) => (
-                <button
-                  key={index}
-                  onClick={() => {
-                    action.onClick ? action.onClick(action.text) : hideModal();
-                  }}
-                >
-                  {action.text}
-                </button>
-              ))}
-            </div>
-          ) : null}
+          {actions.length > 0
+            ? (
+              <div className="pd-modal-footer">
+                {actions.map((action, index) => (
+                  <button
+                    key={index}
+                    onClick={() => {
+                      action.onClick
+                        ? action.onClick(action.text)
+                        : hideModal();
+                    }}
+                  >
+                    {action.text}
+                  </button>
+                ))}
+              </div>
+            )
+            : null}
         </div>
       </div>
     </>

+ 1 - 4
islands/PostList.tsx

@@ -1,6 +1,3 @@
-/** @jsx h */
-import { h } from "preact";
-
 interface PostListProps {
   posts: { id: string; title: string; content: string; shared: boolean }[];
 }
@@ -34,7 +31,7 @@ export default function PostList(props: PostListProps) {
         {
           text: "Cancel",
         },
-      ]
+      ],
     );
   };
 

+ 15 - 15
islands/TopBar.tsx

@@ -1,5 +1,3 @@
-/** @jsx h */
-import { h } from "preact";
 import { useEffect, useState } from "preact/hooks";
 import { EditorMode } from "./Editor.tsx";
 
@@ -76,7 +74,7 @@ export default function TopBar(props: TopBarProps) {
             }
           },
         },
-      ]
+      ],
     );
   };
 
@@ -114,7 +112,7 @@ export default function TopBar(props: TopBarProps) {
             }
           },
         },
-      ]
+      ],
     );
   };
 
@@ -186,17 +184,19 @@ export default function TopBar(props: TopBarProps) {
           Both
         </button>
       </div>
-      {!props.isLogined ? (
-        <span className="pd-top-bar-title">{props.title}</span>
-      ) : null}
-      {props.isLogined ? (
-        <div className="pd-top-bar-tool-icons">
-          <i className="bi bi-box-arrow-left" onClick={doLogout} />
-          <i className="bi bi-house-door" onClick={goHome} />
-          <i className="bi bi-share" onClick={showShare} />
-          <i className="bi bi-gear" onClick={showSetting} />
-        </div>
-      ) : null}
+      {!props.isLogined
+        ? <span className="pd-top-bar-title">{props.title}</span>
+        : null}
+      {props.isLogined
+        ? (
+          <div className="pd-top-bar-tool-icons">
+            <i className="bi bi-box-arrow-left" onClick={doLogout} />
+            <i className="bi bi-house-door" onClick={goHome} />
+            <i className="bi bi-share" onClick={showShare} />
+            <i className="bi bi-gear" onClick={showSetting} />
+          </div>
+        )
+        : null}
     </div>
   );
 }

+ 6 - 2
main.ts

@@ -1,9 +1,13 @@
 /// <reference no-default-lib="true" />
 /// <reference lib="dom" />
+/// <reference lib="dom.iterable" />
 /// <reference lib="dom.asynciterable" />
 /// <reference lib="deno.ns" />
-/// <reference lib="deno.unstable" />
+
+import "$std/dotenv/load.ts";
 
 import { start } from "$fresh/server.ts";
 import manifest from "./fresh.gen.ts";
-await start(manifest);
+import config from "./fresh.config.ts";
+
+await start(manifest, config);

+ 4 - 7
routes/[id].tsx

@@ -1,6 +1,3 @@
-/** @jsx h */
-/** @jsxFrag Fragment */
-import { Fragment, h } from "preact";
 import { Head } from "$fresh/runtime.ts";
 import { Handlers, PageProps } from "$fresh/server.ts";
 import { checkToken } from "utils/server.ts";
@@ -25,11 +22,11 @@ export const handler: Handlers<PostProps> = {
       "Post",
       tokenUserId
         ? {
-            id: postId,
-            user_id: tokenUserId,
-          }
+          id: postId,
+          user_id: tokenUserId,
+        }
         : { id: postId, shared: true },
-      ["title", "content", "shared"]
+      ["title", "content", "shared"],
     );
     if (post.length > 0) {
       return ctx.render({

+ 2 - 4
routes/_404.tsx

@@ -1,8 +1,6 @@
-/** @jsx h */
-import { h } from "preact";
-import { UnknownPageProps } from "$fresh/server.ts";
+import { PageProps } from "$fresh/server.ts";
 
-export default function NotFound(props: UnknownPageProps) {
+export default function NotFound(props: PageProps) {
   return (
     <div className="pd-page pd-page-centered">
       Not Found: {props.url.pathname}

+ 0 - 3
routes/_app.tsx

@@ -1,6 +1,3 @@
-/** @jsx h */
-/** @jsxFrag Fragment */
-import { Fragment, h } from "preact";
 import { asset, Head } from "$fresh/runtime.ts";
 import { AppProps } from "$fresh/server.ts";
 import Modal from "../islands/Modal.tsx";

+ 1 - 4
routes/index.tsx

@@ -1,6 +1,3 @@
-/** @jsx h */
-/** @jsxFrag Fragment */
-import { Fragment, h } from "preact";
 import { Head } from "$fresh/runtime.ts";
 import { Handlers, PageProps } from "$fresh/server.ts";
 import { checkToken } from "utils/server.ts";
@@ -22,7 +19,7 @@ export const handler: Handlers<HomeProps> = {
         {
           id: tokenUserId,
         },
-        ["name"]
+        ["name"],
       );
       if (user.length > 0) {
         const posts = find("Post", { user_id: tokenUserId }, [

+ 0 - 3
routes/login.tsx

@@ -1,6 +1,3 @@
-/** @jsx h */
-/** @jsxFrag Fragment */
-import { Fragment, h } from "preact";
 import { Head } from "$fresh/runtime.ts";
 import LoginFrame from "../islands/LoginFrame.tsx";
 

+ 0 - 3
routes/register.tsx

@@ -1,6 +1,3 @@
-/** @jsx h */
-/** @jsxFrag Fragment */
-import { Fragment, h } from "preact";
 import { Head } from "$fresh/runtime.ts";
 import LoginFrame from "../islands/LoginFrame.tsx";
 

+ 28 - 18
utils/db.ts

@@ -47,15 +47,17 @@ export function find(
   tableName: string,
   queryObject: { [key: string]: string | number | boolean },
   targetKeys: string[] = [],
-  limit?: number
+  limit?: number,
 ) {
   const db = prepareDB(tableName);
   const findQuery = db.prepareQuery(
     `SELECT ${
       targetKeys.length > 0 ? targetKeys.join(", ") : "*"
-    } FROM ${tableName.toLowerCase()} WHERE ${Object.keys(queryObject)
-      .map((queryKey) => `${queryKey} = :${queryKey}`)
-      .join(" AND ")} ORDER BY updated DESC ${limit ? ` LIMIT ${limit}` : ""}`
+    } FROM ${tableName.toLowerCase()} WHERE ${
+      Object.keys(queryObject)
+        .map((queryKey) => `${queryKey} = :${queryKey}`)
+        .join(" AND ")
+    } ORDER BY updated DESC ${limit ? ` LIMIT ${limit}` : ""}`,
   );
   try {
     return findQuery.all(queryObject);
@@ -70,7 +72,7 @@ export function find(
 
 export function insert(
   tableName: string,
-  userInsertObject: { [key: string]: string | number | boolean }
+  userInsertObject: { [key: string]: string | number | boolean },
 ) {
   const db = prepareDB(tableName);
   const insertObject = {
@@ -78,11 +80,15 @@ export function insert(
     updated: new Date().toISOString().slice(0, 19).replace("T", " "),
   };
   const insertQuery = db.prepareQuery(
-    `INSERT INTO ${tableName.toLowerCase()} (${Object.keys(insertObject).join(
-      ", "
-    )}) VALUES (${Object.keys(insertObject)
-      .map((key) => `:${key}`)
-      .join(", ")})`
+    `INSERT INTO ${tableName.toLowerCase()} (${
+      Object.keys(insertObject).join(
+        ", ",
+      )
+    }) VALUES (${
+      Object.keys(insertObject)
+        .map((key) => `:${key}`)
+        .join(", ")
+    })`,
   );
   try {
     insertQuery.all(insertObject);
@@ -99,7 +105,7 @@ export function insert(
 export function update(
   tableName: string,
   id: number | string,
-  userUpdateObject: { [key: string]: string | number | boolean }
+  userUpdateObject: { [key: string]: string | number | boolean },
 ) {
   const db = prepareDB(tableName);
   const updateObject = {
@@ -107,9 +113,11 @@ export function update(
     updated: new Date().toISOString().slice(0, 19).replace("T", " "),
   };
   const updateQuery = db.prepareQuery(
-    `UPDATE ${tableName.toLowerCase()} SET ${Object.keys(updateObject)
-      .map((updateKey) => `${updateKey} = :${updateKey}`)
-      .join(", ")} WHERE id = :id`
+    `UPDATE ${tableName.toLowerCase()} SET ${
+      Object.keys(updateObject)
+        .map((updateKey) => `${updateKey} = :${updateKey}`)
+        .join(", ")
+    } WHERE id = :id`,
   );
   try {
     updateQuery.all({ ...updateObject, id });
@@ -125,13 +133,15 @@ export function update(
 
 export function del(
   tableName: string,
-  queryObject: { [key: string]: string | number | boolean }
+  queryObject: { [key: string]: string | number | boolean },
 ) {
   const db = prepareDB(tableName);
   const deleteQuery = db.prepareQuery(
-    `DELETE FROM ${tableName.toLowerCase()} WHERE ${Object.keys(queryObject)
-      .map((queryKey) => `${queryKey} = :${queryKey}`)
-      .join(" AND ")}`
+    `DELETE FROM ${tableName.toLowerCase()} WHERE ${
+      Object.keys(queryObject)
+        .map((queryKey) => `${queryKey} = :${queryKey}`)
+        .join(" AND ")
+    }`,
   );
   try {
     deleteQuery.all(queryObject);

+ 3 - 2
utils/server.ts

@@ -1,4 +1,5 @@
-import { crypto, toHashString, DigestAlgorithm } from "$crypto/mod.ts";
+import { encodeHex } from "$encoding/hex.ts";
+import { crypto, DigestAlgorithm } from "$crypto/mod.ts";
 import { setCookie, getCookies, deleteCookie } from "$http/cookie.ts";
 import { find } from "utils/db.ts";
 
@@ -7,7 +8,7 @@ export async function getCryptoString(rawString: string, cryptoMethod: string) {
     cryptoMethod as DigestAlgorithm,
     new TextEncoder().encode(rawString)
   );
-  return toHashString(buffer);
+  return encodeHex(buffer);
 }
 
 export function checkToken(req: Request) {