diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 82c3078b..00000000 --- a/.prettierignore +++ /dev/null @@ -1,35 +0,0 @@ -# Build artifacts & dependencies -builddir/ -flatpak-build/ -.flatpak-builder/ -repo/ -.yarn/ -node_modules/ -dist/ -**/dist/ -packages/*/dist/ - -# Caches & metadata -.idea/ -.vscode/ -.flatpak-builder/cache/ -.flatpak-builder/ccache/ - -# Generated files -eu.jumplink.Learn6502.tar.gz - -# Specific file types to ignore (as requested) -*.blp - -# Ignore specific configuration files if needed -# .env - -# Ignore specific generated folders -packages/app-android/platforms/ -packages/app-web/_site/ -packages/app-web/_includes/ -packages/app-android/app/i18n/ -references/ - -# Ignore large data files if any -# *.bin \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 6e6ae713..df0e88ba 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,7 @@ { "recommendations": [ "arcanis.vscode-zipfs", - "esbenp.prettier-vscode", + "biomejs.biome", "yoavbls.pretty-ts-errors", "bodil.blueprint-gtk", "nativescript.nativescript" diff --git a/.vscode/settings.json b/.vscode/settings.json index b2377faf..d395e320 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -3,30 +3,29 @@ "**/.yarn": true, "**/.pnp.*": true }, - "prettier.prettierPath": ".yarn/sdks/prettier/index.cjs", "typescript.tsdk": ".yarn/sdks/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, "javascript.updateImportsOnFileMove.enabled": "never", "typescript.updateImportsOnFileMove.enabled": "never", "editor.formatOnSave": true, - "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.defaultFormatter": "biomejs.biome", "[typescript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, "[json]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, "[jsonc]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, "[yaml]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, "[markdown]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" + "editor.defaultFormatter": "biomejs.biome" }, "xml.downloadExternalResources.enabled": true } diff --git a/.yarn/cache/@biomejs-biome-npm-2.4.15-94796dbe64-46ac114b97.zip b/.yarn/cache/@biomejs-biome-npm-2.4.15-94796dbe64-46ac114b97.zip new file mode 100644 index 00000000..65b8b70d Binary files /dev/null and b/.yarn/cache/@biomejs-biome-npm-2.4.15-94796dbe64-46ac114b97.zip differ diff --git a/.yarn/cache/@biomejs-cli-linux-arm64-npm-2.4.15-a2956b9760-10c0.zip b/.yarn/cache/@biomejs-cli-linux-arm64-npm-2.4.15-a2956b9760-10c0.zip new file mode 100644 index 00000000..a2eb6a34 Binary files /dev/null and b/.yarn/cache/@biomejs-cli-linux-arm64-npm-2.4.15-a2956b9760-10c0.zip differ diff --git a/.yarn/cache/@biomejs-cli-linux-x64-npm-2.4.15-783eb97173-10c0.zip b/.yarn/cache/@biomejs-cli-linux-x64-npm-2.4.15-783eb97173-10c0.zip new file mode 100644 index 00000000..719bed16 Binary files /dev/null and b/.yarn/cache/@biomejs-cli-linux-x64-npm-2.4.15-783eb97173-10c0.zip differ diff --git a/.yarn/cache/@girs-cairo-1.0-npm-1.0.0-4.0.0-rc.9-7fd272e9f8-c823c9c05d.zip b/.yarn/cache/@girs-cairo-1.0-npm-1.0.0-4.0.0-rc.9-7fd272e9f8-c823c9c05d.zip deleted file mode 100644 index f796ee0b..00000000 Binary files a/.yarn/cache/@girs-cairo-1.0-npm-1.0.0-4.0.0-rc.9-7fd272e9f8-c823c9c05d.zip and /dev/null differ diff --git a/.yarn/cache/@girs-gda-6.0-npm-6.0.0-4.0.0-rc.9-c066dcf66e-db939d76c6.zip b/.yarn/cache/@girs-gda-6.0-npm-6.0.0-4.0.0-rc.9-c066dcf66e-db939d76c6.zip deleted file mode 100644 index 35f46be7..00000000 Binary files a/.yarn/cache/@girs-gda-6.0-npm-6.0.0-4.0.0-rc.9-c066dcf66e-db939d76c6.zip and /dev/null differ diff --git a/.yarn/cache/@girs-gio-2.0-npm-2.88.0-4.0.0-rc.9-3a53d1b4af-38597c6919.zip b/.yarn/cache/@girs-gio-2.0-npm-2.88.0-4.0.0-rc.9-3a53d1b4af-38597c6919.zip deleted file mode 100644 index d14e3719..00000000 Binary files a/.yarn/cache/@girs-gio-2.0-npm-2.88.0-4.0.0-rc.9-3a53d1b4af-38597c6919.zip and /dev/null differ diff --git a/.yarn/cache/@girs-giounix-2.0-npm-2.0.0-4.0.0-rc.9-6f6b731edc-9f61f87316.zip b/.yarn/cache/@girs-giounix-2.0-npm-2.0.0-4.0.0-rc.9-6f6b731edc-9f61f87316.zip deleted file mode 100644 index 8d6ef62b..00000000 Binary files a/.yarn/cache/@girs-giounix-2.0-npm-2.0.0-4.0.0-rc.9-6f6b731edc-9f61f87316.zip and /dev/null differ diff --git a/.yarn/cache/@girs-gjs-npm-4.0.0-rc.9-4f13960954-9b5c16ef20.zip b/.yarn/cache/@girs-gjs-npm-4.0.0-rc.9-4f13960954-9b5c16ef20.zip deleted file mode 100644 index e9a23a07..00000000 Binary files a/.yarn/cache/@girs-gjs-npm-4.0.0-rc.9-4f13960954-9b5c16ef20.zip and /dev/null differ diff --git a/.yarn/cache/@girs-glib-2.0-npm-2.88.0-4.0.0-rc.9-603e710194-b2419dd107.zip b/.yarn/cache/@girs-glib-2.0-npm-2.88.0-4.0.0-rc.9-603e710194-b2419dd107.zip deleted file mode 100644 index 87a18fc6..00000000 Binary files a/.yarn/cache/@girs-glib-2.0-npm-2.88.0-4.0.0-rc.9-603e710194-b2419dd107.zip and /dev/null differ diff --git a/.yarn/cache/@girs-gmodule-2.0-npm-2.0.0-4.0.0-rc.9-ee74602d70-c7852562f2.zip b/.yarn/cache/@girs-gmodule-2.0-npm-2.0.0-4.0.0-rc.9-ee74602d70-c7852562f2.zip deleted file mode 100644 index 1ba1be93..00000000 Binary files a/.yarn/cache/@girs-gmodule-2.0-npm-2.0.0-4.0.0-rc.9-ee74602d70-c7852562f2.zip and /dev/null differ diff --git a/.yarn/cache/@girs-gobject-2.0-npm-2.88.0-4.0.0-rc.9-ba040167c7-98463e0e05.zip b/.yarn/cache/@girs-gobject-2.0-npm-2.88.0-4.0.0-rc.9-ba040167c7-98463e0e05.zip deleted file mode 100644 index f5a27d23..00000000 Binary files a/.yarn/cache/@girs-gobject-2.0-npm-2.88.0-4.0.0-rc.9-ba040167c7-98463e0e05.zip and /dev/null differ diff --git a/.yarn/cache/@girs-libxml2-2.0-npm-2.0.0-4.0.0-rc.9-ab079766d9-fa512dbd88.zip b/.yarn/cache/@girs-libxml2-2.0-npm-2.0.0-4.0.0-rc.9-ab079766d9-fa512dbd88.zip deleted file mode 100644 index ce93a739..00000000 Binary files a/.yarn/cache/@girs-libxml2-2.0-npm-2.0.0-4.0.0-rc.9-ab079766d9-fa512dbd88.zip and /dev/null differ diff --git a/.yarn/cache/@girs-soup-3.0-npm-3.6.6-4.0.0-rc.9-bd2cf7347e-5626c35b6e.zip b/.yarn/cache/@girs-soup-3.0-npm-3.6.6-4.0.0-rc.9-bd2cf7347e-5626c35b6e.zip deleted file mode 100644 index 2fe29c57..00000000 Binary files a/.yarn/cache/@girs-soup-3.0-npm-3.6.6-4.0.0-rc.9-bd2cf7347e-5626c35b6e.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-abort-controller-npm-0.3.16-e57cdea792-6b09fae044.zip b/.yarn/cache/@gjsify-abort-controller-npm-0.3.16-e57cdea792-6b09fae044.zip deleted file mode 100644 index 363426ed..00000000 Binary files a/.yarn/cache/@gjsify-abort-controller-npm-0.3.16-e57cdea792-6b09fae044.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-abort-controller-npm-0.4.13-388ed16ed2-a4a87dba73.zip b/.yarn/cache/@gjsify-abort-controller-npm-0.4.14-e9cf584769-a7a43ba97a.zip similarity index 97% rename from .yarn/cache/@gjsify-abort-controller-npm-0.4.13-388ed16ed2-a4a87dba73.zip rename to .yarn/cache/@gjsify-abort-controller-npm-0.4.14-e9cf584769-a7a43ba97a.zip index 9f255c54..25355a38 100644 Binary files a/.yarn/cache/@gjsify-abort-controller-npm-0.4.13-388ed16ed2-a4a87dba73.zip and b/.yarn/cache/@gjsify-abort-controller-npm-0.4.14-e9cf584769-a7a43ba97a.zip differ diff --git a/.yarn/cache/@gjsify-assert-npm-0.3.16-be5b5e82d2-61cfba28a3.zip b/.yarn/cache/@gjsify-assert-npm-0.3.16-be5b5e82d2-61cfba28a3.zip deleted file mode 100644 index 5e20bdde..00000000 Binary files a/.yarn/cache/@gjsify-assert-npm-0.3.16-be5b5e82d2-61cfba28a3.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-assert-npm-0.4.13-09212d7142-f44bb4e6f2.zip b/.yarn/cache/@gjsify-assert-npm-0.4.14-2d06cef10b-61ab63d41e.zip similarity index 99% rename from .yarn/cache/@gjsify-assert-npm-0.4.13-09212d7142-f44bb4e6f2.zip rename to .yarn/cache/@gjsify-assert-npm-0.4.14-2d06cef10b-61ab63d41e.zip index 88f67516..6fbb95ab 100644 Binary files a/.yarn/cache/@gjsify-assert-npm-0.4.13-09212d7142-f44bb4e6f2.zip and b/.yarn/cache/@gjsify-assert-npm-0.4.14-2d06cef10b-61ab63d41e.zip differ diff --git a/.yarn/cache/@gjsify-async_hooks-npm-0.3.16-69459f0c6c-6b338dbdf4.zip b/.yarn/cache/@gjsify-async_hooks-npm-0.3.16-69459f0c6c-6b338dbdf4.zip deleted file mode 100644 index 92fc1ede..00000000 Binary files a/.yarn/cache/@gjsify-async_hooks-npm-0.3.16-69459f0c6c-6b338dbdf4.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-async_hooks-npm-0.4.13-56767d3fff-5661021b64.zip b/.yarn/cache/@gjsify-async_hooks-npm-0.4.14-6cca58f281-30e796a60a.zip similarity index 96% rename from .yarn/cache/@gjsify-async_hooks-npm-0.4.13-56767d3fff-5661021b64.zip rename to .yarn/cache/@gjsify-async_hooks-npm-0.4.14-6cca58f281-30e796a60a.zip index a297a667..17d720ed 100644 Binary files a/.yarn/cache/@gjsify-async_hooks-npm-0.4.13-56767d3fff-5661021b64.zip and b/.yarn/cache/@gjsify-async_hooks-npm-0.4.14-6cca58f281-30e796a60a.zip differ diff --git a/.yarn/cache/@gjsify-buffer-npm-0.3.16-27cda62415-ebdf6b185d.zip b/.yarn/cache/@gjsify-buffer-npm-0.3.16-27cda62415-ebdf6b185d.zip deleted file mode 100644 index 31786017..00000000 Binary files a/.yarn/cache/@gjsify-buffer-npm-0.3.16-27cda62415-ebdf6b185d.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-buffer-npm-0.4.13-7f07caedcc-5e1ea8a83d.zip b/.yarn/cache/@gjsify-buffer-npm-0.4.14-e9199af6db-9add119778.zip similarity index 59% rename from .yarn/cache/@gjsify-buffer-npm-0.4.13-7f07caedcc-5e1ea8a83d.zip rename to .yarn/cache/@gjsify-buffer-npm-0.4.14-e9199af6db-9add119778.zip index cba51f43..adde5fd5 100644 Binary files a/.yarn/cache/@gjsify-buffer-npm-0.4.13-7f07caedcc-5e1ea8a83d.zip and b/.yarn/cache/@gjsify-buffer-npm-0.4.14-e9199af6db-9add119778.zip differ diff --git a/.yarn/cache/@gjsify-child_process-npm-0.3.16-c1b87ddd6d-e85627236d.zip b/.yarn/cache/@gjsify-child_process-npm-0.3.16-c1b87ddd6d-e85627236d.zip deleted file mode 100644 index 70106ff7..00000000 Binary files a/.yarn/cache/@gjsify-child_process-npm-0.3.16-c1b87ddd6d-e85627236d.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-child_process-npm-0.4.13-0265226737-1aa00671f0.zip b/.yarn/cache/@gjsify-child_process-npm-0.4.14-2f32d0e08a-b081a97bd0.zip similarity index 97% rename from .yarn/cache/@gjsify-child_process-npm-0.4.13-0265226737-1aa00671f0.zip rename to .yarn/cache/@gjsify-child_process-npm-0.4.14-2f32d0e08a-b081a97bd0.zip index d7530f84..708f2e72 100644 Binary files a/.yarn/cache/@gjsify-child_process-npm-0.4.13-0265226737-1aa00671f0.zip and b/.yarn/cache/@gjsify-child_process-npm-0.4.14-2f32d0e08a-b081a97bd0.zip differ diff --git a/.yarn/cache/@gjsify-cli-npm-0.3.16-864c00178d-9d12d58bcb.zip b/.yarn/cache/@gjsify-cli-npm-0.3.16-864c00178d-9d12d58bcb.zip deleted file mode 100644 index 71d64a6d..00000000 Binary files a/.yarn/cache/@gjsify-cli-npm-0.3.16-864c00178d-9d12d58bcb.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-cli-npm-0.4.13-4acb5218af-c171ee02ff.zip b/.yarn/cache/@gjsify-cli-npm-0.4.14-b04e8a8d01-6518622482.zip similarity index 94% rename from .yarn/cache/@gjsify-cli-npm-0.4.13-4acb5218af-c171ee02ff.zip rename to .yarn/cache/@gjsify-cli-npm-0.4.14-b04e8a8d01-6518622482.zip index f736fd4f..d005b6eb 100644 Binary files a/.yarn/cache/@gjsify-cli-npm-0.4.13-4acb5218af-c171ee02ff.zip and b/.yarn/cache/@gjsify-cli-npm-0.4.14-b04e8a8d01-6518622482.zip differ diff --git a/.yarn/cache/@gjsify-cluster-npm-0.3.16-4ef1f4ddb2-3160d6ce2c.zip b/.yarn/cache/@gjsify-cluster-npm-0.3.16-4ef1f4ddb2-3160d6ce2c.zip deleted file mode 100644 index 455ae7b7..00000000 Binary files a/.yarn/cache/@gjsify-cluster-npm-0.3.16-4ef1f4ddb2-3160d6ce2c.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-cluster-npm-0.4.13-d5c53f3b1e-13f6f452db.zip b/.yarn/cache/@gjsify-cluster-npm-0.4.14-172946b5d4-ec31b23d7f.zip similarity index 95% rename from .yarn/cache/@gjsify-cluster-npm-0.4.13-d5c53f3b1e-13f6f452db.zip rename to .yarn/cache/@gjsify-cluster-npm-0.4.14-172946b5d4-ec31b23d7f.zip index b0c58f6c..6f5594b0 100644 Binary files a/.yarn/cache/@gjsify-cluster-npm-0.4.13-d5c53f3b1e-13f6f452db.zip and b/.yarn/cache/@gjsify-cluster-npm-0.4.14-172946b5d4-ec31b23d7f.zip differ diff --git a/.yarn/cache/@gjsify-compression-streams-npm-0.3.16-44716e1548-8bd648c0b1.zip b/.yarn/cache/@gjsify-compression-streams-npm-0.3.16-44716e1548-8bd648c0b1.zip deleted file mode 100644 index 53fb9c9d..00000000 Binary files a/.yarn/cache/@gjsify-compression-streams-npm-0.3.16-44716e1548-8bd648c0b1.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-compression-streams-npm-0.4.13-ad0a41461c-715bd76200.zip b/.yarn/cache/@gjsify-compression-streams-npm-0.4.14-a7ba19d997-70430c332b.zip similarity index 97% rename from .yarn/cache/@gjsify-compression-streams-npm-0.4.13-ad0a41461c-715bd76200.zip rename to .yarn/cache/@gjsify-compression-streams-npm-0.4.14-a7ba19d997-70430c332b.zip index 3a833c2e..535c2187 100644 Binary files a/.yarn/cache/@gjsify-compression-streams-npm-0.4.13-ad0a41461c-715bd76200.zip and b/.yarn/cache/@gjsify-compression-streams-npm-0.4.14-a7ba19d997-70430c332b.zip differ diff --git a/.yarn/cache/@gjsify-console-npm-0.3.16-3f08d5e9a2-c762c56a80.zip b/.yarn/cache/@gjsify-console-npm-0.3.16-3f08d5e9a2-c762c56a80.zip deleted file mode 100644 index 49f4fd28..00000000 Binary files a/.yarn/cache/@gjsify-console-npm-0.3.16-3f08d5e9a2-c762c56a80.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-console-npm-0.4.13-5831d01a83-06886f5d42.zip b/.yarn/cache/@gjsify-console-npm-0.4.14-b232d57905-f3379f725a.zip similarity index 98% rename from .yarn/cache/@gjsify-console-npm-0.4.13-5831d01a83-06886f5d42.zip rename to .yarn/cache/@gjsify-console-npm-0.4.14-b232d57905-f3379f725a.zip index 5d5b9ff1..07e33d8e 100644 Binary files a/.yarn/cache/@gjsify-console-npm-0.4.13-5831d01a83-06886f5d42.zip and b/.yarn/cache/@gjsify-console-npm-0.4.14-b232d57905-f3379f725a.zip differ diff --git a/.yarn/cache/@gjsify-constants-npm-0.3.16-143f9eaad4-8508644bfa.zip b/.yarn/cache/@gjsify-constants-npm-0.3.16-143f9eaad4-8508644bfa.zip deleted file mode 100644 index 1ba03b04..00000000 Binary files a/.yarn/cache/@gjsify-constants-npm-0.3.16-143f9eaad4-8508644bfa.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-constants-npm-0.4.13-3215094930-0821b5b11e.zip b/.yarn/cache/@gjsify-constants-npm-0.4.14-b9f26b4f3e-402b0717b2.zip similarity index 95% rename from .yarn/cache/@gjsify-constants-npm-0.4.13-3215094930-0821b5b11e.zip rename to .yarn/cache/@gjsify-constants-npm-0.4.14-b9f26b4f3e-402b0717b2.zip index 31be8e76..f42eedb4 100644 Binary files a/.yarn/cache/@gjsify-constants-npm-0.4.13-3215094930-0821b5b11e.zip and b/.yarn/cache/@gjsify-constants-npm-0.4.14-b9f26b4f3e-402b0717b2.zip differ diff --git a/.yarn/cache/@gjsify-create-app-npm-0.3.16-85c7ee6ec8-85cc300a18.zip b/.yarn/cache/@gjsify-create-app-npm-0.3.16-85c7ee6ec8-85cc300a18.zip deleted file mode 100644 index cb85c45e..00000000 Binary files a/.yarn/cache/@gjsify-create-app-npm-0.3.16-85c7ee6ec8-85cc300a18.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-create-app-npm-0.4.13-4fd3f94596-908a053c0f.zip b/.yarn/cache/@gjsify-create-app-npm-0.4.14-f7366946ed-46a654ea49.zip similarity index 96% rename from .yarn/cache/@gjsify-create-app-npm-0.4.13-4fd3f94596-908a053c0f.zip rename to .yarn/cache/@gjsify-create-app-npm-0.4.14-f7366946ed-46a654ea49.zip index 131ca1ae..8b94ecec 100644 Binary files a/.yarn/cache/@gjsify-create-app-npm-0.4.13-4fd3f94596-908a053c0f.zip and b/.yarn/cache/@gjsify-create-app-npm-0.4.14-f7366946ed-46a654ea49.zip differ diff --git a/.yarn/cache/@gjsify-crypto-npm-0.3.16-4f57a4ef99-db3cff03d5.zip b/.yarn/cache/@gjsify-crypto-npm-0.3.16-4f57a4ef99-db3cff03d5.zip deleted file mode 100644 index 573cba9e..00000000 Binary files a/.yarn/cache/@gjsify-crypto-npm-0.3.16-4f57a4ef99-db3cff03d5.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-crypto-npm-0.4.13-92fca83774-fe791215d9.zip b/.yarn/cache/@gjsify-crypto-npm-0.4.14-2265e10582-4314db2463.zip similarity index 99% rename from .yarn/cache/@gjsify-crypto-npm-0.4.13-92fca83774-fe791215d9.zip rename to .yarn/cache/@gjsify-crypto-npm-0.4.14-2265e10582-4314db2463.zip index c07e6f71..c32e8882 100644 Binary files a/.yarn/cache/@gjsify-crypto-npm-0.4.13-92fca83774-fe791215d9.zip and b/.yarn/cache/@gjsify-crypto-npm-0.4.14-2265e10582-4314db2463.zip differ diff --git a/.yarn/cache/@gjsify-dgram-npm-0.3.16-202d96ad1e-a88292e5a4.zip b/.yarn/cache/@gjsify-dgram-npm-0.3.16-202d96ad1e-a88292e5a4.zip deleted file mode 100644 index 2d57b46a..00000000 Binary files a/.yarn/cache/@gjsify-dgram-npm-0.3.16-202d96ad1e-a88292e5a4.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-dgram-npm-0.4.13-bc1d0f8ac5-8b9a97a724.zip b/.yarn/cache/@gjsify-dgram-npm-0.4.14-8d841809cc-83a0513c48.zip similarity index 97% rename from .yarn/cache/@gjsify-dgram-npm-0.4.13-bc1d0f8ac5-8b9a97a724.zip rename to .yarn/cache/@gjsify-dgram-npm-0.4.14-8d841809cc-83a0513c48.zip index 2ac861e5..493a1f34 100644 Binary files a/.yarn/cache/@gjsify-dgram-npm-0.4.13-bc1d0f8ac5-8b9a97a724.zip and b/.yarn/cache/@gjsify-dgram-npm-0.4.14-8d841809cc-83a0513c48.zip differ diff --git a/.yarn/cache/@gjsify-diagnostics_channel-npm-0.3.16-c1580b5862-c89d172083.zip b/.yarn/cache/@gjsify-diagnostics_channel-npm-0.3.16-c1580b5862-c89d172083.zip deleted file mode 100644 index 26a5a8fb..00000000 Binary files a/.yarn/cache/@gjsify-diagnostics_channel-npm-0.3.16-c1580b5862-c89d172083.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-diagnostics_channel-npm-0.4.13-3c75ca7fec-343b8ca56c.zip b/.yarn/cache/@gjsify-diagnostics_channel-npm-0.4.14-fc2bd60b58-900e56a7d8.zip similarity index 98% rename from .yarn/cache/@gjsify-diagnostics_channel-npm-0.4.13-3c75ca7fec-343b8ca56c.zip rename to .yarn/cache/@gjsify-diagnostics_channel-npm-0.4.14-fc2bd60b58-900e56a7d8.zip index a04eba1d..5401f842 100644 Binary files a/.yarn/cache/@gjsify-diagnostics_channel-npm-0.4.13-3c75ca7fec-343b8ca56c.zip and b/.yarn/cache/@gjsify-diagnostics_channel-npm-0.4.14-fc2bd60b58-900e56a7d8.zip differ diff --git a/.yarn/cache/@gjsify-dns-npm-0.3.16-c2ca734e58-7f72d94117.zip b/.yarn/cache/@gjsify-dns-npm-0.3.16-c2ca734e58-7f72d94117.zip deleted file mode 100644 index d4f30bcc..00000000 Binary files a/.yarn/cache/@gjsify-dns-npm-0.3.16-c2ca734e58-7f72d94117.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-dns-npm-0.4.13-c2f6265ccd-43d0a51748.zip b/.yarn/cache/@gjsify-dns-npm-0.4.14-20a695065e-5854d777f6.zip similarity index 97% rename from .yarn/cache/@gjsify-dns-npm-0.4.13-c2f6265ccd-43d0a51748.zip rename to .yarn/cache/@gjsify-dns-npm-0.4.14-20a695065e-5854d777f6.zip index f948b487..3bded95e 100644 Binary files a/.yarn/cache/@gjsify-dns-npm-0.4.13-c2f6265ccd-43d0a51748.zip and b/.yarn/cache/@gjsify-dns-npm-0.4.14-20a695065e-5854d777f6.zip differ diff --git a/.yarn/cache/@gjsify-dom-events-npm-0.3.16-9742ca84a1-2330700816.zip b/.yarn/cache/@gjsify-dom-events-npm-0.3.16-9742ca84a1-2330700816.zip deleted file mode 100644 index 27b279d7..00000000 Binary files a/.yarn/cache/@gjsify-dom-events-npm-0.3.16-9742ca84a1-2330700816.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-dom-events-npm-0.4.13-02a2bb1c6f-307013ce91.zip b/.yarn/cache/@gjsify-dom-events-npm-0.4.14-bc0a3cf5ab-3da1b572b8.zip similarity index 99% rename from .yarn/cache/@gjsify-dom-events-npm-0.4.13-02a2bb1c6f-307013ce91.zip rename to .yarn/cache/@gjsify-dom-events-npm-0.4.14-bc0a3cf5ab-3da1b572b8.zip index 78365eb9..673a5f9f 100644 Binary files a/.yarn/cache/@gjsify-dom-events-npm-0.4.13-02a2bb1c6f-307013ce91.zip and b/.yarn/cache/@gjsify-dom-events-npm-0.4.14-bc0a3cf5ab-3da1b572b8.zip differ diff --git a/.yarn/cache/@gjsify-dom-exception-npm-0.3.16-509f8399c2-0fd0ab0a24.zip b/.yarn/cache/@gjsify-dom-exception-npm-0.3.16-509f8399c2-0fd0ab0a24.zip deleted file mode 100644 index 64ed1f17..00000000 Binary files a/.yarn/cache/@gjsify-dom-exception-npm-0.3.16-509f8399c2-0fd0ab0a24.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-dom-exception-npm-0.4.13-6300867055-8efc113ce8.zip b/.yarn/cache/@gjsify-dom-exception-npm-0.4.14-74f4c2b5c0-9f8639eb86.zip similarity index 96% rename from .yarn/cache/@gjsify-dom-exception-npm-0.4.13-6300867055-8efc113ce8.zip rename to .yarn/cache/@gjsify-dom-exception-npm-0.4.14-74f4c2b5c0-9f8639eb86.zip index 9b526954..8523c125 100644 Binary files a/.yarn/cache/@gjsify-dom-exception-npm-0.4.13-6300867055-8efc113ce8.zip and b/.yarn/cache/@gjsify-dom-exception-npm-0.4.14-74f4c2b5c0-9f8639eb86.zip differ diff --git a/.yarn/cache/@gjsify-domain-npm-0.3.16-e29ea7b148-be576a4427.zip b/.yarn/cache/@gjsify-domain-npm-0.3.16-e29ea7b148-be576a4427.zip deleted file mode 100644 index 16181aef..00000000 Binary files a/.yarn/cache/@gjsify-domain-npm-0.3.16-e29ea7b148-be576a4427.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-domain-npm-0.4.13-09cfb61a5c-db1c1c9b93.zip b/.yarn/cache/@gjsify-domain-npm-0.4.14-da7ca9eaf1-a415edcd7c.zip similarity index 95% rename from .yarn/cache/@gjsify-domain-npm-0.4.13-09cfb61a5c-db1c1c9b93.zip rename to .yarn/cache/@gjsify-domain-npm-0.4.14-da7ca9eaf1-a415edcd7c.zip index e9c4dc66..1dc391de 100644 Binary files a/.yarn/cache/@gjsify-domain-npm-0.4.13-09cfb61a5c-db1c1c9b93.zip and b/.yarn/cache/@gjsify-domain-npm-0.4.14-da7ca9eaf1-a415edcd7c.zip differ diff --git a/.yarn/cache/@gjsify-domparser-npm-0.3.16-e009834a8e-a45f4d265f.zip b/.yarn/cache/@gjsify-domparser-npm-0.3.16-e009834a8e-a45f4d265f.zip deleted file mode 100644 index 5899d043..00000000 Binary files a/.yarn/cache/@gjsify-domparser-npm-0.3.16-e009834a8e-a45f4d265f.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-domparser-npm-0.4.13-d3d989d400-5c6f7db4c7.zip b/.yarn/cache/@gjsify-domparser-npm-0.4.14-84e9bd55d4-b9ff943ffa.zip similarity index 97% rename from .yarn/cache/@gjsify-domparser-npm-0.4.13-d3d989d400-5c6f7db4c7.zip rename to .yarn/cache/@gjsify-domparser-npm-0.4.14-84e9bd55d4-b9ff943ffa.zip index d50a8877..7e8d41aa 100644 Binary files a/.yarn/cache/@gjsify-domparser-npm-0.4.13-d3d989d400-5c6f7db4c7.zip and b/.yarn/cache/@gjsify-domparser-npm-0.4.14-84e9bd55d4-b9ff943ffa.zip differ diff --git a/.yarn/cache/@gjsify-events-npm-0.3.16-152131bd9a-af910e2276.zip b/.yarn/cache/@gjsify-events-npm-0.3.16-152131bd9a-af910e2276.zip deleted file mode 100644 index 22878b5b..00000000 Binary files a/.yarn/cache/@gjsify-events-npm-0.3.16-152131bd9a-af910e2276.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-events-npm-0.4.13-cf19f94485-3da43a8daf.zip b/.yarn/cache/@gjsify-events-npm-0.4.14-cc22d57849-b661550f28.zip similarity index 98% rename from .yarn/cache/@gjsify-events-npm-0.4.13-cf19f94485-3da43a8daf.zip rename to .yarn/cache/@gjsify-events-npm-0.4.14-cc22d57849-b661550f28.zip index 877dc2d3..27cb3b8e 100644 Binary files a/.yarn/cache/@gjsify-events-npm-0.4.13-cf19f94485-3da43a8daf.zip and b/.yarn/cache/@gjsify-events-npm-0.4.14-cc22d57849-b661550f28.zip differ diff --git a/.yarn/cache/@gjsify-eventsource-npm-0.3.16-353270da41-c9b6646c2f.zip b/.yarn/cache/@gjsify-eventsource-npm-0.3.16-353270da41-c9b6646c2f.zip deleted file mode 100644 index 003036b5..00000000 Binary files a/.yarn/cache/@gjsify-eventsource-npm-0.3.16-353270da41-c9b6646c2f.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-eventsource-npm-0.4.13-a78774969c-e98af55a81.zip b/.yarn/cache/@gjsify-eventsource-npm-0.4.14-5c4f46e089-48d5ac0e9b.zip similarity index 97% rename from .yarn/cache/@gjsify-eventsource-npm-0.4.13-a78774969c-e98af55a81.zip rename to .yarn/cache/@gjsify-eventsource-npm-0.4.14-5c4f46e089-48d5ac0e9b.zip index f5e4f3f2..c597367e 100644 Binary files a/.yarn/cache/@gjsify-eventsource-npm-0.4.13-a78774969c-e98af55a81.zip and b/.yarn/cache/@gjsify-eventsource-npm-0.4.14-5c4f46e089-48d5ac0e9b.zip differ diff --git a/.yarn/cache/@gjsify-fetch-npm-0.3.16-fdaac1e491-21213cd755.zip b/.yarn/cache/@gjsify-fetch-npm-0.3.16-fdaac1e491-21213cd755.zip deleted file mode 100644 index be99d5d2..00000000 Binary files a/.yarn/cache/@gjsify-fetch-npm-0.3.16-fdaac1e491-21213cd755.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-fetch-npm-0.4.13-3cb902de0c-bcc188404d.zip b/.yarn/cache/@gjsify-fetch-npm-0.4.14-aa71dba9d1-6535adaf41.zip similarity index 99% rename from .yarn/cache/@gjsify-fetch-npm-0.4.13-3cb902de0c-bcc188404d.zip rename to .yarn/cache/@gjsify-fetch-npm-0.4.14-aa71dba9d1-6535adaf41.zip index 89f78ded..99b4a11b 100644 Binary files a/.yarn/cache/@gjsify-fetch-npm-0.4.13-3cb902de0c-bcc188404d.zip and b/.yarn/cache/@gjsify-fetch-npm-0.4.14-aa71dba9d1-6535adaf41.zip differ diff --git a/.yarn/cache/@gjsify-formdata-npm-0.3.16-ff4ca7f2f9-8662d4367b.zip b/.yarn/cache/@gjsify-formdata-npm-0.3.16-ff4ca7f2f9-8662d4367b.zip deleted file mode 100644 index 798099fc..00000000 Binary files a/.yarn/cache/@gjsify-formdata-npm-0.3.16-ff4ca7f2f9-8662d4367b.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-formdata-npm-0.4.13-b3c4e1e6c6-0f701f63f3.zip b/.yarn/cache/@gjsify-formdata-npm-0.4.14-7ae4d66710-c8328f3add.zip similarity index 98% rename from .yarn/cache/@gjsify-formdata-npm-0.4.13-b3c4e1e6c6-0f701f63f3.zip rename to .yarn/cache/@gjsify-formdata-npm-0.4.14-7ae4d66710-c8328f3add.zip index 21928357..9cb382ae 100644 Binary files a/.yarn/cache/@gjsify-formdata-npm-0.4.13-b3c4e1e6c6-0f701f63f3.zip and b/.yarn/cache/@gjsify-formdata-npm-0.4.14-7ae4d66710-c8328f3add.zip differ diff --git a/.yarn/cache/@gjsify-fs-npm-0.3.16-5c55643605-4c2746b302.zip b/.yarn/cache/@gjsify-fs-npm-0.3.16-5c55643605-4c2746b302.zip deleted file mode 100644 index ba745a8e..00000000 Binary files a/.yarn/cache/@gjsify-fs-npm-0.3.16-5c55643605-4c2746b302.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-fs-npm-0.4.13-274c2fd35f-9146b7252f.zip b/.yarn/cache/@gjsify-fs-npm-0.4.14-ad0ec96e7c-b7482fd796.zip similarity index 99% rename from .yarn/cache/@gjsify-fs-npm-0.4.13-274c2fd35f-9146b7252f.zip rename to .yarn/cache/@gjsify-fs-npm-0.4.14-ad0ec96e7c-b7482fd796.zip index b3c3dfc0..69971dfd 100644 Binary files a/.yarn/cache/@gjsify-fs-npm-0.4.13-274c2fd35f-9146b7252f.zip and b/.yarn/cache/@gjsify-fs-npm-0.4.14-ad0ec96e7c-b7482fd796.zip differ diff --git a/.yarn/cache/@gjsify-gamepad-npm-0.3.16-dd71e1d7b0-e5100d5b58.zip b/.yarn/cache/@gjsify-gamepad-npm-0.3.16-dd71e1d7b0-e5100d5b58.zip deleted file mode 100644 index df55171a..00000000 Binary files a/.yarn/cache/@gjsify-gamepad-npm-0.3.16-dd71e1d7b0-e5100d5b58.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-gamepad-npm-0.4.13-0d30715593-93d47ae182.zip b/.yarn/cache/@gjsify-gamepad-npm-0.4.14-913f5a8e4d-dec6536fbd.zip similarity index 98% rename from .yarn/cache/@gjsify-gamepad-npm-0.4.13-0d30715593-93d47ae182.zip rename to .yarn/cache/@gjsify-gamepad-npm-0.4.14-913f5a8e4d-dec6536fbd.zip index eef2da81..08034fa0 100644 Binary files a/.yarn/cache/@gjsify-gamepad-npm-0.4.13-0d30715593-93d47ae182.zip and b/.yarn/cache/@gjsify-gamepad-npm-0.4.14-913f5a8e4d-dec6536fbd.zip differ diff --git a/.yarn/cache/@gjsify-http-npm-0.3.16-7729bdd4c3-3f55a66c4a.zip b/.yarn/cache/@gjsify-http-npm-0.3.16-7729bdd4c3-3f55a66c4a.zip deleted file mode 100644 index f031f935..00000000 Binary files a/.yarn/cache/@gjsify-http-npm-0.3.16-7729bdd4c3-3f55a66c4a.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-http-npm-0.4.13-52bc3876dd-ff06e4659a.zip b/.yarn/cache/@gjsify-http-npm-0.4.14-81371789f9-90efc6f8ef.zip similarity index 98% rename from .yarn/cache/@gjsify-http-npm-0.4.13-52bc3876dd-ff06e4659a.zip rename to .yarn/cache/@gjsify-http-npm-0.4.14-81371789f9-90efc6f8ef.zip index 4576ae28..b98ca798 100644 Binary files a/.yarn/cache/@gjsify-http-npm-0.4.13-52bc3876dd-ff06e4659a.zip and b/.yarn/cache/@gjsify-http-npm-0.4.14-81371789f9-90efc6f8ef.zip differ diff --git a/.yarn/cache/@gjsify-http-soup-bridge-npm-0.3.16-3ba1328b09-84a12e6dab.zip b/.yarn/cache/@gjsify-http-soup-bridge-npm-0.3.16-3ba1328b09-84a12e6dab.zip deleted file mode 100644 index e63213c3..00000000 Binary files a/.yarn/cache/@gjsify-http-soup-bridge-npm-0.3.16-3ba1328b09-84a12e6dab.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-http-soup-bridge-npm-0.4.13-65214f867f-195c0bc274.zip b/.yarn/cache/@gjsify-http-soup-bridge-npm-0.4.14-dede8ae2d6-60f34ecf2a.zip similarity index 99% rename from .yarn/cache/@gjsify-http-soup-bridge-npm-0.4.13-65214f867f-195c0bc274.zip rename to .yarn/cache/@gjsify-http-soup-bridge-npm-0.4.14-dede8ae2d6-60f34ecf2a.zip index a7f51640..709e9639 100644 Binary files a/.yarn/cache/@gjsify-http-soup-bridge-npm-0.4.13-65214f867f-195c0bc274.zip and b/.yarn/cache/@gjsify-http-soup-bridge-npm-0.4.14-dede8ae2d6-60f34ecf2a.zip differ diff --git a/.yarn/cache/@gjsify-http2-native-npm-0.4.13-b9f78060e2-02dbef78b1.zip b/.yarn/cache/@gjsify-http2-native-npm-0.4.14-1302f33ef6-9252ca7e94.zip similarity index 99% rename from .yarn/cache/@gjsify-http2-native-npm-0.4.13-b9f78060e2-02dbef78b1.zip rename to .yarn/cache/@gjsify-http2-native-npm-0.4.14-1302f33ef6-9252ca7e94.zip index aa1f1874..ca88e1b2 100644 Binary files a/.yarn/cache/@gjsify-http2-native-npm-0.4.13-b9f78060e2-02dbef78b1.zip and b/.yarn/cache/@gjsify-http2-native-npm-0.4.14-1302f33ef6-9252ca7e94.zip differ diff --git a/.yarn/cache/@gjsify-http2-npm-0.3.16-0027320d53-dcb2456cbf.zip b/.yarn/cache/@gjsify-http2-npm-0.3.16-0027320d53-dcb2456cbf.zip deleted file mode 100644 index a81ae609..00000000 Binary files a/.yarn/cache/@gjsify-http2-npm-0.3.16-0027320d53-dcb2456cbf.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-http2-npm-0.4.13-4a52ed80c7-5b747320e9.zip b/.yarn/cache/@gjsify-http2-npm-0.4.14-f6a8ebfff1-00c973d22b.zip similarity index 99% rename from .yarn/cache/@gjsify-http2-npm-0.4.13-4a52ed80c7-5b747320e9.zip rename to .yarn/cache/@gjsify-http2-npm-0.4.14-f6a8ebfff1-00c973d22b.zip index 4c1e4a7b..bba2e330 100644 Binary files a/.yarn/cache/@gjsify-http2-npm-0.4.13-4a52ed80c7-5b747320e9.zip and b/.yarn/cache/@gjsify-http2-npm-0.4.14-f6a8ebfff1-00c973d22b.zip differ diff --git a/.yarn/cache/@gjsify-https-npm-0.3.16-4107c37d8d-8366c2d9d0.zip b/.yarn/cache/@gjsify-https-npm-0.3.16-4107c37d8d-8366c2d9d0.zip deleted file mode 100644 index 275cb2ae..00000000 Binary files a/.yarn/cache/@gjsify-https-npm-0.3.16-4107c37d8d-8366c2d9d0.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-https-npm-0.4.13-f1bc740b06-2da7298869.zip b/.yarn/cache/@gjsify-https-npm-0.4.14-93309305df-09ad40e936.zip similarity index 96% rename from .yarn/cache/@gjsify-https-npm-0.4.13-f1bc740b06-2da7298869.zip rename to .yarn/cache/@gjsify-https-npm-0.4.14-93309305df-09ad40e936.zip index e73f3331..2d8de46a 100644 Binary files a/.yarn/cache/@gjsify-https-npm-0.4.13-f1bc740b06-2da7298869.zip and b/.yarn/cache/@gjsify-https-npm-0.4.14-93309305df-09ad40e936.zip differ diff --git a/.yarn/cache/@gjsify-inspector-npm-0.3.16-628fe15244-da8dada067.zip b/.yarn/cache/@gjsify-inspector-npm-0.3.16-628fe15244-da8dada067.zip deleted file mode 100644 index 665b5a09..00000000 Binary files a/.yarn/cache/@gjsify-inspector-npm-0.3.16-628fe15244-da8dada067.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-inspector-npm-0.4.13-7e1a093cb1-4052b84295.zip b/.yarn/cache/@gjsify-inspector-npm-0.4.14-2263f673cd-938a4a1778.zip similarity index 97% rename from .yarn/cache/@gjsify-inspector-npm-0.4.13-7e1a093cb1-4052b84295.zip rename to .yarn/cache/@gjsify-inspector-npm-0.4.14-2263f673cd-938a4a1778.zip index 7d4b7b40..7b5b1426 100644 Binary files a/.yarn/cache/@gjsify-inspector-npm-0.4.13-7e1a093cb1-4052b84295.zip and b/.yarn/cache/@gjsify-inspector-npm-0.4.14-2263f673cd-938a4a1778.zip differ diff --git a/.yarn/cache/@gjsify-message-channel-npm-0.4.13-b73705710e-77a02daa15.zip b/.yarn/cache/@gjsify-message-channel-npm-0.4.14-492810d73a-ce1a0e1043.zip similarity index 96% rename from .yarn/cache/@gjsify-message-channel-npm-0.4.13-b73705710e-77a02daa15.zip rename to .yarn/cache/@gjsify-message-channel-npm-0.4.14-492810d73a-ce1a0e1043.zip index 7e8c2844..2e28de16 100644 Binary files a/.yarn/cache/@gjsify-message-channel-npm-0.4.13-b73705710e-77a02daa15.zip and b/.yarn/cache/@gjsify-message-channel-npm-0.4.14-492810d73a-ce1a0e1043.zip differ diff --git a/.yarn/cache/@gjsify-module-npm-0.3.16-c0af4fa86e-1d19dd8a6c.zip b/.yarn/cache/@gjsify-module-npm-0.3.16-c0af4fa86e-1d19dd8a6c.zip deleted file mode 100644 index e3607a89..00000000 Binary files a/.yarn/cache/@gjsify-module-npm-0.3.16-c0af4fa86e-1d19dd8a6c.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-module-npm-0.4.13-8064b8f554-26185b5cfe.zip b/.yarn/cache/@gjsify-module-npm-0.4.14-2ba0262e35-b55b92b73a.zip similarity index 98% rename from .yarn/cache/@gjsify-module-npm-0.4.13-8064b8f554-26185b5cfe.zip rename to .yarn/cache/@gjsify-module-npm-0.4.14-2ba0262e35-b55b92b73a.zip index 3105bee2..cfa4253d 100644 Binary files a/.yarn/cache/@gjsify-module-npm-0.4.13-8064b8f554-26185b5cfe.zip and b/.yarn/cache/@gjsify-module-npm-0.4.14-2ba0262e35-b55b92b73a.zip differ diff --git a/.yarn/cache/@gjsify-net-npm-0.3.16-8889093634-6545714f06.zip b/.yarn/cache/@gjsify-net-npm-0.3.16-8889093634-6545714f06.zip deleted file mode 100644 index 2f78b184..00000000 Binary files a/.yarn/cache/@gjsify-net-npm-0.3.16-8889093634-6545714f06.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-net-npm-0.4.13-e039234808-ac8804911e.zip b/.yarn/cache/@gjsify-net-npm-0.4.14-3d8f86cae3-952d40d8fe.zip similarity index 98% rename from .yarn/cache/@gjsify-net-npm-0.4.13-e039234808-ac8804911e.zip rename to .yarn/cache/@gjsify-net-npm-0.4.14-3d8f86cae3-952d40d8fe.zip index cc9c381e..b943aa35 100644 Binary files a/.yarn/cache/@gjsify-net-npm-0.4.13-e039234808-ac8804911e.zip and b/.yarn/cache/@gjsify-net-npm-0.4.14-3d8f86cae3-952d40d8fe.zip differ diff --git a/.yarn/cache/@gjsify-node-globals-npm-0.3.16-b2206bd8a6-4b3b0c036e.zip b/.yarn/cache/@gjsify-node-globals-npm-0.3.16-b2206bd8a6-4b3b0c036e.zip deleted file mode 100644 index adade9a6..00000000 Binary files a/.yarn/cache/@gjsify-node-globals-npm-0.3.16-b2206bd8a6-4b3b0c036e.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-node-globals-npm-0.4.13-ff39ec4a64-fb24c44971.zip b/.yarn/cache/@gjsify-node-globals-npm-0.4.14-d3cb190b53-830784a456.zip similarity index 98% rename from .yarn/cache/@gjsify-node-globals-npm-0.4.13-ff39ec4a64-fb24c44971.zip rename to .yarn/cache/@gjsify-node-globals-npm-0.4.14-d3cb190b53-830784a456.zip index 7069f657..f382ed95 100644 Binary files a/.yarn/cache/@gjsify-node-globals-npm-0.4.13-ff39ec4a64-fb24c44971.zip and b/.yarn/cache/@gjsify-node-globals-npm-0.4.14-d3cb190b53-830784a456.zip differ diff --git a/.yarn/cache/@gjsify-node-polyfills-npm-0.3.16-54ffa3c6d4-0d6999c871.zip b/.yarn/cache/@gjsify-node-polyfills-npm-0.3.16-54ffa3c6d4-0d6999c871.zip deleted file mode 100644 index e4176ffe..00000000 Binary files a/.yarn/cache/@gjsify-node-polyfills-npm-0.3.16-54ffa3c6d4-0d6999c871.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-node-polyfills-npm-0.4.13-afd9d618d7-dc0fdfc03b.zip b/.yarn/cache/@gjsify-node-polyfills-npm-0.4.13-afd9d618d7-dc0fdfc03b.zip deleted file mode 100644 index a00cfa43..00000000 Binary files a/.yarn/cache/@gjsify-node-polyfills-npm-0.4.13-afd9d618d7-dc0fdfc03b.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-node-polyfills-npm-0.4.14-1d0266f2dc-21fefa7852.zip b/.yarn/cache/@gjsify-node-polyfills-npm-0.4.14-1d0266f2dc-21fefa7852.zip new file mode 100644 index 00000000..96731cc9 Binary files /dev/null and b/.yarn/cache/@gjsify-node-polyfills-npm-0.4.14-1d0266f2dc-21fefa7852.zip differ diff --git a/.yarn/cache/@gjsify-npm-registry-npm-0.3.16-8cc4e91333-d767109c80.zip b/.yarn/cache/@gjsify-npm-registry-npm-0.3.16-8cc4e91333-d767109c80.zip deleted file mode 100644 index ae88945a..00000000 Binary files a/.yarn/cache/@gjsify-npm-registry-npm-0.3.16-8cc4e91333-d767109c80.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-npm-registry-npm-0.4.13-08bbfc5a3d-a77986f6e1.zip b/.yarn/cache/@gjsify-npm-registry-npm-0.4.14-f40aa78e84-e5a72fc21a.zip similarity index 99% rename from .yarn/cache/@gjsify-npm-registry-npm-0.4.13-08bbfc5a3d-a77986f6e1.zip rename to .yarn/cache/@gjsify-npm-registry-npm-0.4.14-f40aa78e84-e5a72fc21a.zip index 016e1024..0006a56b 100644 Binary files a/.yarn/cache/@gjsify-npm-registry-npm-0.4.13-08bbfc5a3d-a77986f6e1.zip and b/.yarn/cache/@gjsify-npm-registry-npm-0.4.14-f40aa78e84-e5a72fc21a.zip differ diff --git a/.yarn/cache/@gjsify-os-npm-0.3.16-a26045362a-94787f35c9.zip b/.yarn/cache/@gjsify-os-npm-0.3.16-a26045362a-94787f35c9.zip deleted file mode 100644 index 9f19da91..00000000 Binary files a/.yarn/cache/@gjsify-os-npm-0.3.16-a26045362a-94787f35c9.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-os-npm-0.4.13-237472d3ed-468d4bc3a7.zip b/.yarn/cache/@gjsify-os-npm-0.4.14-f3a8d15234-89d8e66cb5.zip similarity index 99% rename from .yarn/cache/@gjsify-os-npm-0.4.13-237472d3ed-468d4bc3a7.zip rename to .yarn/cache/@gjsify-os-npm-0.4.14-f3a8d15234-89d8e66cb5.zip index 9d431a64..6cdfeeda 100644 Binary files a/.yarn/cache/@gjsify-os-npm-0.4.13-237472d3ed-468d4bc3a7.zip and b/.yarn/cache/@gjsify-os-npm-0.4.14-f3a8d15234-89d8e66cb5.zip differ diff --git a/.yarn/cache/@gjsify-path-npm-0.3.16-336d2c2701-b38eecf20c.zip b/.yarn/cache/@gjsify-path-npm-0.3.16-336d2c2701-b38eecf20c.zip deleted file mode 100644 index 32c66520..00000000 Binary files a/.yarn/cache/@gjsify-path-npm-0.3.16-336d2c2701-b38eecf20c.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-path-npm-0.4.13-0eef415892-4ea9970542.zip b/.yarn/cache/@gjsify-path-npm-0.4.14-3588049dcc-397ab44c23.zip similarity index 99% rename from .yarn/cache/@gjsify-path-npm-0.4.13-0eef415892-4ea9970542.zip rename to .yarn/cache/@gjsify-path-npm-0.4.14-3588049dcc-397ab44c23.zip index dcc4df67..c234b435 100644 Binary files a/.yarn/cache/@gjsify-path-npm-0.4.13-0eef415892-4ea9970542.zip and b/.yarn/cache/@gjsify-path-npm-0.4.14-3588049dcc-397ab44c23.zip differ diff --git a/.yarn/cache/@gjsify-perf_hooks-npm-0.3.16-fc7cf3e45d-0e93d35139.zip b/.yarn/cache/@gjsify-perf_hooks-npm-0.3.16-fc7cf3e45d-0e93d35139.zip deleted file mode 100644 index 428f9452..00000000 Binary files a/.yarn/cache/@gjsify-perf_hooks-npm-0.3.16-fc7cf3e45d-0e93d35139.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-perf_hooks-npm-0.4.13-40d1f995c9-22c31cce74.zip b/.yarn/cache/@gjsify-perf_hooks-npm-0.4.14-57c50ea9be-a66bb5dee9.zip similarity index 97% rename from .yarn/cache/@gjsify-perf_hooks-npm-0.4.13-40d1f995c9-22c31cce74.zip rename to .yarn/cache/@gjsify-perf_hooks-npm-0.4.14-57c50ea9be-a66bb5dee9.zip index 09bfeab5..19935a12 100644 Binary files a/.yarn/cache/@gjsify-perf_hooks-npm-0.4.13-40d1f995c9-22c31cce74.zip and b/.yarn/cache/@gjsify-perf_hooks-npm-0.4.14-57c50ea9be-a66bb5dee9.zip differ diff --git a/.yarn/cache/@gjsify-process-npm-0.3.16-6c2eb86682-cf4a987def.zip b/.yarn/cache/@gjsify-process-npm-0.3.16-6c2eb86682-cf4a987def.zip deleted file mode 100644 index 7f70922a..00000000 Binary files a/.yarn/cache/@gjsify-process-npm-0.3.16-6c2eb86682-cf4a987def.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-process-npm-0.4.13-fc749c0ce3-40f2e6dcb0.zip b/.yarn/cache/@gjsify-process-npm-0.4.14-b35b3f64af-86d743c9e6.zip similarity index 98% rename from .yarn/cache/@gjsify-process-npm-0.4.13-fc749c0ce3-40f2e6dcb0.zip rename to .yarn/cache/@gjsify-process-npm-0.4.14-b35b3f64af-86d743c9e6.zip index a9a80ed0..9bf7f53b 100644 Binary files a/.yarn/cache/@gjsify-process-npm-0.4.13-fc749c0ce3-40f2e6dcb0.zip and b/.yarn/cache/@gjsify-process-npm-0.4.14-b35b3f64af-86d743c9e6.zip differ diff --git a/.yarn/cache/@gjsify-querystring-npm-0.3.16-d0067fbba0-edd3177178.zip b/.yarn/cache/@gjsify-querystring-npm-0.3.16-d0067fbba0-edd3177178.zip deleted file mode 100644 index 993a1c4f..00000000 Binary files a/.yarn/cache/@gjsify-querystring-npm-0.3.16-d0067fbba0-edd3177178.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-querystring-npm-0.4.13-2fe0577608-28068a270d.zip b/.yarn/cache/@gjsify-querystring-npm-0.4.14-967fa65666-7b920a6a52.zip similarity index 98% rename from .yarn/cache/@gjsify-querystring-npm-0.4.13-2fe0577608-28068a270d.zip rename to .yarn/cache/@gjsify-querystring-npm-0.4.14-967fa65666-7b920a6a52.zip index 79944eb5..d5c2a334 100644 Binary files a/.yarn/cache/@gjsify-querystring-npm-0.4.13-2fe0577608-28068a270d.zip and b/.yarn/cache/@gjsify-querystring-npm-0.4.14-967fa65666-7b920a6a52.zip differ diff --git a/.yarn/cache/@gjsify-readline-npm-0.3.16-4558b6b2e9-067e3edcf4.zip b/.yarn/cache/@gjsify-readline-npm-0.3.16-4558b6b2e9-067e3edcf4.zip deleted file mode 100644 index d21f9423..00000000 Binary files a/.yarn/cache/@gjsify-readline-npm-0.3.16-4558b6b2e9-067e3edcf4.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-readline-npm-0.4.13-e29a870f23-e8b60792b0.zip b/.yarn/cache/@gjsify-readline-npm-0.4.14-4540d72cb6-002ea093f4.zip similarity index 98% rename from .yarn/cache/@gjsify-readline-npm-0.4.13-e29a870f23-e8b60792b0.zip rename to .yarn/cache/@gjsify-readline-npm-0.4.14-4540d72cb6-002ea093f4.zip index 6ccd2f84..bc216b21 100644 Binary files a/.yarn/cache/@gjsify-readline-npm-0.4.13-e29a870f23-e8b60792b0.zip and b/.yarn/cache/@gjsify-readline-npm-0.4.14-4540d72cb6-002ea093f4.zip differ diff --git a/.yarn/cache/@gjsify-resolve-npm-npm-0.3.16-88f75362c7-e27f1b85e6.zip b/.yarn/cache/@gjsify-resolve-npm-npm-0.3.16-88f75362c7-e27f1b85e6.zip deleted file mode 100644 index 6bda0617..00000000 Binary files a/.yarn/cache/@gjsify-resolve-npm-npm-0.3.16-88f75362c7-e27f1b85e6.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-resolve-npm-npm-0.4.13-575f423f49-1f028350b9.zip b/.yarn/cache/@gjsify-resolve-npm-npm-0.4.14-2915132619-bad5f5fc37.zip similarity index 99% rename from .yarn/cache/@gjsify-resolve-npm-npm-0.4.13-575f423f49-1f028350b9.zip rename to .yarn/cache/@gjsify-resolve-npm-npm-0.4.14-2915132619-bad5f5fc37.zip index ba38a2c8..6828464c 100644 Binary files a/.yarn/cache/@gjsify-resolve-npm-npm-0.4.13-575f423f49-1f028350b9.zip and b/.yarn/cache/@gjsify-resolve-npm-npm-0.4.14-2915132619-bad5f5fc37.zip differ diff --git a/.yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.3.16-c87781d9f2-80c29ff3ab.zip b/.yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.3.16-c87781d9f2-80c29ff3ab.zip deleted file mode 100644 index b0b16a54..00000000 Binary files a/.yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.3.16-c87781d9f2-80c29ff3ab.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.4.13-83040d81c8-eb55887c4f.zip b/.yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.4.14-ba4824912b-f3fc7e37ff.zip similarity index 97% rename from .yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.4.13-83040d81c8-eb55887c4f.zip rename to .yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.4.14-ba4824912b-f3fc7e37ff.zip index 1f7b7533..02efb3c4 100644 Binary files a/.yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.4.13-83040d81c8-eb55887c4f.zip and b/.yarn/cache/@gjsify-rolldown-plugin-deepkit-npm-0.4.14-ba4824912b-f3fc7e37ff.zip differ diff --git a/.yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.3.16-60fa215bed-5d44690989.zip b/.yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.3.16-60fa215bed-5d44690989.zip deleted file mode 100644 index a1571c9a..00000000 Binary files a/.yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.3.16-60fa215bed-5d44690989.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.4.13-4a150a4cf3-f46e0d0509.zip b/.yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.4.14-1c63e18f33-6724cf1748.zip similarity index 99% rename from .yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.4.13-4a150a4cf3-f46e0d0509.zip rename to .yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.4.14-1c63e18f33-6724cf1748.zip index 25027f97..f1c6a58a 100644 Binary files a/.yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.4.13-4a150a4cf3-f46e0d0509.zip and b/.yarn/cache/@gjsify-rolldown-plugin-gjsify-npm-0.4.14-1c63e18f33-6724cf1748.zip differ diff --git a/.yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.3.16-9859584931-81745b66cb.zip b/.yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.3.16-9859584931-81745b66cb.zip deleted file mode 100644 index 27244ceb..00000000 Binary files a/.yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.3.16-9859584931-81745b66cb.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.4.13-149a477c2c-50ccb5a84a.zip b/.yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.4.14-7dbf8e6c1a-4a8a3efc64.zip similarity index 98% rename from .yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.4.13-149a477c2c-50ccb5a84a.zip rename to .yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.4.14-7dbf8e6c1a-4a8a3efc64.zip index 31acdd0a..01b055ae 100644 Binary files a/.yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.4.13-149a477c2c-50ccb5a84a.zip and b/.yarn/cache/@gjsify-rolldown-plugin-pnp-npm-0.4.14-7dbf8e6c1a-4a8a3efc64.zip differ diff --git a/.yarn/cache/@gjsify-sab-native-npm-0.4.13-6ef50c675d-32177e7af0.zip b/.yarn/cache/@gjsify-sab-native-npm-0.4.14-0d0b899143-bc6ad3d8b7.zip similarity index 98% rename from .yarn/cache/@gjsify-sab-native-npm-0.4.13-6ef50c675d-32177e7af0.zip rename to .yarn/cache/@gjsify-sab-native-npm-0.4.14-0d0b899143-bc6ad3d8b7.zip index a6bfb404..f1347a8a 100644 Binary files a/.yarn/cache/@gjsify-sab-native-npm-0.4.13-6ef50c675d-32177e7af0.zip and b/.yarn/cache/@gjsify-sab-native-npm-0.4.14-0d0b899143-bc6ad3d8b7.zip differ diff --git a/.yarn/cache/@gjsify-semver-npm-0.3.16-7acde642b0-446f722fa5.zip b/.yarn/cache/@gjsify-semver-npm-0.3.16-7acde642b0-446f722fa5.zip deleted file mode 100644 index 4b875d8b..00000000 Binary files a/.yarn/cache/@gjsify-semver-npm-0.3.16-7acde642b0-446f722fa5.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-semver-npm-0.4.13-c4f0db348f-c2075d82a7.zip b/.yarn/cache/@gjsify-semver-npm-0.4.14-12e35f5890-0f6dcf97fe.zip similarity index 99% rename from .yarn/cache/@gjsify-semver-npm-0.4.13-c4f0db348f-c2075d82a7.zip rename to .yarn/cache/@gjsify-semver-npm-0.4.14-12e35f5890-0f6dcf97fe.zip index b9800edb..994842e3 100644 Binary files a/.yarn/cache/@gjsify-semver-npm-0.4.13-c4f0db348f-c2075d82a7.zip and b/.yarn/cache/@gjsify-semver-npm-0.4.14-12e35f5890-0f6dcf97fe.zip differ diff --git a/.yarn/cache/@gjsify-sqlite-npm-0.3.16-57483e6e17-44e4e99f64.zip b/.yarn/cache/@gjsify-sqlite-npm-0.3.16-57483e6e17-44e4e99f64.zip deleted file mode 100644 index 2b5d552d..00000000 Binary files a/.yarn/cache/@gjsify-sqlite-npm-0.3.16-57483e6e17-44e4e99f64.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-sqlite-npm-0.4.13-15106fd449-b8902d31ba.zip b/.yarn/cache/@gjsify-sqlite-npm-0.4.14-d7c9c21d25-8f468b8620.zip similarity index 99% rename from .yarn/cache/@gjsify-sqlite-npm-0.4.13-15106fd449-b8902d31ba.zip rename to .yarn/cache/@gjsify-sqlite-npm-0.4.14-d7c9c21d25-8f468b8620.zip index 0c6f70e7..bfd6b2a8 100644 Binary files a/.yarn/cache/@gjsify-sqlite-npm-0.4.13-15106fd449-b8902d31ba.zip and b/.yarn/cache/@gjsify-sqlite-npm-0.4.14-d7c9c21d25-8f468b8620.zip differ diff --git a/.yarn/cache/@gjsify-stream-npm-0.3.16-a1a30418ce-71d59e8c5f.zip b/.yarn/cache/@gjsify-stream-npm-0.3.16-a1a30418ce-71d59e8c5f.zip deleted file mode 100644 index 64712257..00000000 Binary files a/.yarn/cache/@gjsify-stream-npm-0.3.16-a1a30418ce-71d59e8c5f.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-stream-npm-0.4.13-1d6028632b-9a9463e8ec.zip b/.yarn/cache/@gjsify-stream-npm-0.4.14-79e53aa384-8c6122b212.zip similarity index 99% rename from .yarn/cache/@gjsify-stream-npm-0.4.13-1d6028632b-9a9463e8ec.zip rename to .yarn/cache/@gjsify-stream-npm-0.4.14-79e53aa384-8c6122b212.zip index d7f1fe9c..59c80bc5 100644 Binary files a/.yarn/cache/@gjsify-stream-npm-0.4.13-1d6028632b-9a9463e8ec.zip and b/.yarn/cache/@gjsify-stream-npm-0.4.14-79e53aa384-8c6122b212.zip differ diff --git a/.yarn/cache/@gjsify-string_decoder-npm-0.3.16-b87ee2753c-c60816fdba.zip b/.yarn/cache/@gjsify-string_decoder-npm-0.3.16-b87ee2753c-c60816fdba.zip deleted file mode 100644 index 57aeacf6..00000000 Binary files a/.yarn/cache/@gjsify-string_decoder-npm-0.3.16-b87ee2753c-c60816fdba.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-string_decoder-npm-0.4.13-9250916703-3222a70b28.zip b/.yarn/cache/@gjsify-string_decoder-npm-0.4.14-4e473a1e6b-e222b3cf4f.zip similarity index 97% rename from .yarn/cache/@gjsify-string_decoder-npm-0.4.13-9250916703-3222a70b28.zip rename to .yarn/cache/@gjsify-string_decoder-npm-0.4.14-4e473a1e6b-e222b3cf4f.zip index c4f80b35..77b3d76b 100644 Binary files a/.yarn/cache/@gjsify-string_decoder-npm-0.4.13-9250916703-3222a70b28.zip and b/.yarn/cache/@gjsify-string_decoder-npm-0.4.14-4e473a1e6b-e222b3cf4f.zip differ diff --git a/.yarn/cache/@gjsify-sys-npm-0.3.16-e2b0d11616-eb2f97af4d.zip b/.yarn/cache/@gjsify-sys-npm-0.3.16-e2b0d11616-eb2f97af4d.zip deleted file mode 100644 index f2c7487e..00000000 Binary files a/.yarn/cache/@gjsify-sys-npm-0.3.16-e2b0d11616-eb2f97af4d.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-sys-npm-0.4.13-4ddb7d5b3f-4365ac4c49.zip b/.yarn/cache/@gjsify-sys-npm-0.4.14-c7ba7c96a8-dc80eb1288.zip similarity index 92% rename from .yarn/cache/@gjsify-sys-npm-0.4.13-4ddb7d5b3f-4365ac4c49.zip rename to .yarn/cache/@gjsify-sys-npm-0.4.14-c7ba7c96a8-dc80eb1288.zip index e6df8fca..0145ba7c 100644 Binary files a/.yarn/cache/@gjsify-sys-npm-0.4.13-4ddb7d5b3f-4365ac4c49.zip and b/.yarn/cache/@gjsify-sys-npm-0.4.14-c7ba7c96a8-dc80eb1288.zip differ diff --git a/.yarn/cache/@gjsify-tar-npm-0.3.16-8c5b78a4ae-6c13d75077.zip b/.yarn/cache/@gjsify-tar-npm-0.3.16-8c5b78a4ae-6c13d75077.zip deleted file mode 100644 index ef2359e8..00000000 Binary files a/.yarn/cache/@gjsify-tar-npm-0.3.16-8c5b78a4ae-6c13d75077.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-tar-npm-0.4.13-f94ad70820-fce1932761.zip b/.yarn/cache/@gjsify-tar-npm-0.4.14-9db5ae6d69-b94d4de558.zip similarity index 99% rename from .yarn/cache/@gjsify-tar-npm-0.4.13-f94ad70820-fce1932761.zip rename to .yarn/cache/@gjsify-tar-npm-0.4.14-9db5ae6d69-b94d4de558.zip index 3250e858..47706074 100644 Binary files a/.yarn/cache/@gjsify-tar-npm-0.4.13-f94ad70820-fce1932761.zip and b/.yarn/cache/@gjsify-tar-npm-0.4.14-9db5ae6d69-b94d4de558.zip differ diff --git a/.yarn/cache/@gjsify-terminal-native-npm-0.3.16-2d40d14da0-2ed9c19791.zip b/.yarn/cache/@gjsify-terminal-native-npm-0.3.16-2d40d14da0-2ed9c19791.zip deleted file mode 100644 index 0b77ba70..00000000 Binary files a/.yarn/cache/@gjsify-terminal-native-npm-0.3.16-2d40d14da0-2ed9c19791.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-terminal-native-npm-0.4.13-a58b278363-856748f8a3.zip b/.yarn/cache/@gjsify-terminal-native-npm-0.4.14-18780dc2d9-0ba8e2bc2c.zip similarity index 99% rename from .yarn/cache/@gjsify-terminal-native-npm-0.4.13-a58b278363-856748f8a3.zip rename to .yarn/cache/@gjsify-terminal-native-npm-0.4.14-18780dc2d9-0ba8e2bc2c.zip index 127a4c92..5011ef88 100644 Binary files a/.yarn/cache/@gjsify-terminal-native-npm-0.4.13-a58b278363-856748f8a3.zip and b/.yarn/cache/@gjsify-terminal-native-npm-0.4.14-18780dc2d9-0ba8e2bc2c.zip differ diff --git a/.yarn/cache/@gjsify-timers-npm-0.3.16-985f0e778a-5c3fd56b26.zip b/.yarn/cache/@gjsify-timers-npm-0.3.16-985f0e778a-5c3fd56b26.zip deleted file mode 100644 index 46e48376..00000000 Binary files a/.yarn/cache/@gjsify-timers-npm-0.3.16-985f0e778a-5c3fd56b26.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-timers-npm-0.4.13-685c866119-469ffb9d93.zip b/.yarn/cache/@gjsify-timers-npm-0.4.14-9aec22928a-02c127ec13.zip similarity index 98% rename from .yarn/cache/@gjsify-timers-npm-0.4.13-685c866119-469ffb9d93.zip rename to .yarn/cache/@gjsify-timers-npm-0.4.14-9aec22928a-02c127ec13.zip index 5935126e..209fee99 100644 Binary files a/.yarn/cache/@gjsify-timers-npm-0.4.13-685c866119-469ffb9d93.zip and b/.yarn/cache/@gjsify-timers-npm-0.4.14-9aec22928a-02c127ec13.zip differ diff --git a/.yarn/cache/@gjsify-tls-npm-0.3.16-ab0bd24099-9721db8027.zip b/.yarn/cache/@gjsify-tls-npm-0.3.16-ab0bd24099-9721db8027.zip deleted file mode 100644 index c875f4cb..00000000 Binary files a/.yarn/cache/@gjsify-tls-npm-0.3.16-ab0bd24099-9721db8027.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-tls-npm-0.4.13-b6d5cce744-14ae61a27f.zip b/.yarn/cache/@gjsify-tls-npm-0.4.14-3ae9304584-8c4542c7d6.zip similarity index 98% rename from .yarn/cache/@gjsify-tls-npm-0.4.13-b6d5cce744-14ae61a27f.zip rename to .yarn/cache/@gjsify-tls-npm-0.4.14-3ae9304584-8c4542c7d6.zip index 419493de..b420472a 100644 Binary files a/.yarn/cache/@gjsify-tls-npm-0.4.13-b6d5cce744-14ae61a27f.zip and b/.yarn/cache/@gjsify-tls-npm-0.4.14-3ae9304584-8c4542c7d6.zip differ diff --git a/.yarn/cache/@gjsify-tty-npm-0.3.16-df7d6f0a99-5a5f867402.zip b/.yarn/cache/@gjsify-tty-npm-0.3.16-df7d6f0a99-5a5f867402.zip deleted file mode 100644 index 60402f1d..00000000 Binary files a/.yarn/cache/@gjsify-tty-npm-0.3.16-df7d6f0a99-5a5f867402.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-tty-npm-0.4.13-03065b2007-58328a2b4a.zip b/.yarn/cache/@gjsify-tty-npm-0.4.14-838c25e60c-09569712d0.zip similarity index 96% rename from .yarn/cache/@gjsify-tty-npm-0.4.13-03065b2007-58328a2b4a.zip rename to .yarn/cache/@gjsify-tty-npm-0.4.14-838c25e60c-09569712d0.zip index 3bfb81fe..0a201df6 100644 Binary files a/.yarn/cache/@gjsify-tty-npm-0.4.13-03065b2007-58328a2b4a.zip and b/.yarn/cache/@gjsify-tty-npm-0.4.14-838c25e60c-09569712d0.zip differ diff --git a/.yarn/cache/@gjsify-url-npm-0.3.16-11ced6566b-0f15e60727.zip b/.yarn/cache/@gjsify-url-npm-0.3.16-11ced6566b-0f15e60727.zip deleted file mode 100644 index 3e9d95a7..00000000 Binary files a/.yarn/cache/@gjsify-url-npm-0.3.16-11ced6566b-0f15e60727.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-url-npm-0.4.13-9fcf3ad367-7235f11d57.zip b/.yarn/cache/@gjsify-url-npm-0.4.14-5bfcf08e6c-58a207cb41.zip similarity index 98% rename from .yarn/cache/@gjsify-url-npm-0.4.13-9fcf3ad367-7235f11d57.zip rename to .yarn/cache/@gjsify-url-npm-0.4.14-5bfcf08e6c-58a207cb41.zip index 0b63a56c..8e696c8c 100644 Binary files a/.yarn/cache/@gjsify-url-npm-0.4.13-9fcf3ad367-7235f11d57.zip and b/.yarn/cache/@gjsify-url-npm-0.4.14-5bfcf08e6c-58a207cb41.zip differ diff --git a/.yarn/cache/@gjsify-util-npm-0.3.16-058d815506-e55b9ac067.zip b/.yarn/cache/@gjsify-util-npm-0.3.16-058d815506-e55b9ac067.zip deleted file mode 100644 index ff763b39..00000000 Binary files a/.yarn/cache/@gjsify-util-npm-0.3.16-058d815506-e55b9ac067.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-util-npm-0.4.13-0a990a7776-ab8e9c6389.zip b/.yarn/cache/@gjsify-util-npm-0.4.14-9e40c1e696-7dfef6a0db.zip similarity index 99% rename from .yarn/cache/@gjsify-util-npm-0.4.13-0a990a7776-ab8e9c6389.zip rename to .yarn/cache/@gjsify-util-npm-0.4.14-9e40c1e696-7dfef6a0db.zip index 45a51ccd..a94856c4 100644 Binary files a/.yarn/cache/@gjsify-util-npm-0.4.13-0a990a7776-ab8e9c6389.zip and b/.yarn/cache/@gjsify-util-npm-0.4.14-9e40c1e696-7dfef6a0db.zip differ diff --git a/.yarn/cache/@gjsify-utils-npm-0.3.16-6368c60f4c-04f14bf801.zip b/.yarn/cache/@gjsify-utils-npm-0.3.16-6368c60f4c-04f14bf801.zip deleted file mode 100644 index 80c5630c..00000000 Binary files a/.yarn/cache/@gjsify-utils-npm-0.3.16-6368c60f4c-04f14bf801.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-utils-npm-0.4.13-e4b3b98b3e-c9a6ba1aff.zip b/.yarn/cache/@gjsify-utils-npm-0.4.14-3de514f34b-2cde80ad2c.zip similarity index 99% rename from .yarn/cache/@gjsify-utils-npm-0.4.13-e4b3b98b3e-c9a6ba1aff.zip rename to .yarn/cache/@gjsify-utils-npm-0.4.14-3de514f34b-2cde80ad2c.zip index 735c8c31..8be71811 100644 Binary files a/.yarn/cache/@gjsify-utils-npm-0.4.13-e4b3b98b3e-c9a6ba1aff.zip and b/.yarn/cache/@gjsify-utils-npm-0.4.14-3de514f34b-2cde80ad2c.zip differ diff --git a/.yarn/cache/@gjsify-v8-npm-0.3.16-8a3f61189b-ddaf8d7090.zip b/.yarn/cache/@gjsify-v8-npm-0.3.16-8a3f61189b-ddaf8d7090.zip deleted file mode 100644 index 39a16561..00000000 Binary files a/.yarn/cache/@gjsify-v8-npm-0.3.16-8a3f61189b-ddaf8d7090.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-v8-npm-0.4.13-7a6907d722-877802fee7.zip b/.yarn/cache/@gjsify-v8-npm-0.4.14-dcdbdddbb1-5f6a737d0e.zip similarity index 98% rename from .yarn/cache/@gjsify-v8-npm-0.4.13-7a6907d722-877802fee7.zip rename to .yarn/cache/@gjsify-v8-npm-0.4.14-dcdbdddbb1-5f6a737d0e.zip index e63ccd30..3fe7d128 100644 Binary files a/.yarn/cache/@gjsify-v8-npm-0.4.13-7a6907d722-877802fee7.zip and b/.yarn/cache/@gjsify-v8-npm-0.4.14-dcdbdddbb1-5f6a737d0e.zip differ diff --git a/.yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.3.16-6c1329433c-fd8fb7b8db.zip b/.yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.3.16-6c1329433c-fd8fb7b8db.zip deleted file mode 100644 index 84261705..00000000 Binary files a/.yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.3.16-6c1329433c-fd8fb7b8db.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.4.13-3c53c8722a-47d050699b.zip b/.yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.4.14-4924481cbf-dc7d844fd0.zip similarity index 96% rename from .yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.4.13-3c53c8722a-47d050699b.zip rename to .yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.4.14-4924481cbf-dc7d844fd0.zip index 489b733f..1ed8f9ba 100644 Binary files a/.yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.4.13-3c53c8722a-47d050699b.zip and b/.yarn/cache/@gjsify-vite-plugin-blueprint-npm-0.4.14-4924481cbf-dc7d844fd0.zip differ diff --git a/.yarn/cache/@gjsify-vite-plugin-gettext-npm-0.4.14-88580904e2-8d5f6ec12a.zip b/.yarn/cache/@gjsify-vite-plugin-gettext-npm-0.4.14-88580904e2-8d5f6ec12a.zip new file mode 100644 index 00000000..82e0b405 Binary files /dev/null and b/.yarn/cache/@gjsify-vite-plugin-gettext-npm-0.4.14-88580904e2-8d5f6ec12a.zip differ diff --git a/.yarn/cache/@gjsify-vm-npm-0.3.16-cb6085c0ed-db450e79c7.zip b/.yarn/cache/@gjsify-vm-npm-0.3.16-cb6085c0ed-db450e79c7.zip deleted file mode 100644 index d33f2da2..00000000 Binary files a/.yarn/cache/@gjsify-vm-npm-0.3.16-cb6085c0ed-db450e79c7.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-vm-npm-0.4.13-9ed988b190-0c8dea1636.zip b/.yarn/cache/@gjsify-vm-npm-0.4.14-1445e1cc27-fbf969c081.zip similarity index 97% rename from .yarn/cache/@gjsify-vm-npm-0.4.13-9ed988b190-0c8dea1636.zip rename to .yarn/cache/@gjsify-vm-npm-0.4.14-1445e1cc27-fbf969c081.zip index 3188d0c6..1e1b23c6 100644 Binary files a/.yarn/cache/@gjsify-vm-npm-0.4.13-9ed988b190-0c8dea1636.zip and b/.yarn/cache/@gjsify-vm-npm-0.4.14-1445e1cc27-fbf969c081.zip differ diff --git a/.yarn/cache/@gjsify-web-globals-npm-0.3.16-b4fb49e235-b68d341354.zip b/.yarn/cache/@gjsify-web-globals-npm-0.3.16-b4fb49e235-b68d341354.zip deleted file mode 100644 index 405e3d22..00000000 Binary files a/.yarn/cache/@gjsify-web-globals-npm-0.3.16-b4fb49e235-b68d341354.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-web-globals-npm-0.4.13-71b26d19e3-43b12be8d5.zip b/.yarn/cache/@gjsify-web-globals-npm-0.4.14-78af4b2fe5-cdb1312954.zip similarity index 92% rename from .yarn/cache/@gjsify-web-globals-npm-0.4.13-71b26d19e3-43b12be8d5.zip rename to .yarn/cache/@gjsify-web-globals-npm-0.4.14-78af4b2fe5-cdb1312954.zip index f433207a..86b9bc73 100644 Binary files a/.yarn/cache/@gjsify-web-globals-npm-0.4.13-71b26d19e3-43b12be8d5.zip and b/.yarn/cache/@gjsify-web-globals-npm-0.4.14-78af4b2fe5-cdb1312954.zip differ diff --git a/.yarn/cache/@gjsify-web-polyfills-npm-0.3.16-fcb08317a9-77d2dfe6f2.zip b/.yarn/cache/@gjsify-web-polyfills-npm-0.3.16-fcb08317a9-77d2dfe6f2.zip deleted file mode 100644 index c2bdf079..00000000 Binary files a/.yarn/cache/@gjsify-web-polyfills-npm-0.3.16-fcb08317a9-77d2dfe6f2.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-web-polyfills-npm-0.4.13-d0d2f121b7-dad93fc7c7.zip b/.yarn/cache/@gjsify-web-polyfills-npm-0.4.13-d0d2f121b7-dad93fc7c7.zip deleted file mode 100644 index 3f38c222..00000000 Binary files a/.yarn/cache/@gjsify-web-polyfills-npm-0.4.13-d0d2f121b7-dad93fc7c7.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-web-polyfills-npm-0.4.14-1a70197a9f-9acecacb19.zip b/.yarn/cache/@gjsify-web-polyfills-npm-0.4.14-1a70197a9f-9acecacb19.zip new file mode 100644 index 00000000..fab8a36e Binary files /dev/null and b/.yarn/cache/@gjsify-web-polyfills-npm-0.4.14-1a70197a9f-9acecacb19.zip differ diff --git a/.yarn/cache/@gjsify-web-streams-npm-0.3.16-7d6c020300-4dd1e60549.zip b/.yarn/cache/@gjsify-web-streams-npm-0.3.16-7d6c020300-4dd1e60549.zip deleted file mode 100644 index 32c4c60b..00000000 Binary files a/.yarn/cache/@gjsify-web-streams-npm-0.3.16-7d6c020300-4dd1e60549.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-web-streams-npm-0.4.13-b0891567b7-c907fd5fb2.zip b/.yarn/cache/@gjsify-web-streams-npm-0.4.14-820bab1116-70d19060e0.zip similarity index 99% rename from .yarn/cache/@gjsify-web-streams-npm-0.4.13-b0891567b7-c907fd5fb2.zip rename to .yarn/cache/@gjsify-web-streams-npm-0.4.14-820bab1116-70d19060e0.zip index 93fe301b..627216c8 100644 Binary files a/.yarn/cache/@gjsify-web-streams-npm-0.4.13-b0891567b7-c907fd5fb2.zip and b/.yarn/cache/@gjsify-web-streams-npm-0.4.14-820bab1116-70d19060e0.zip differ diff --git a/.yarn/cache/@gjsify-webassembly-npm-0.3.16-6eff07e63b-a711a12bc7.zip b/.yarn/cache/@gjsify-webassembly-npm-0.3.16-6eff07e63b-a711a12bc7.zip deleted file mode 100644 index 941c249c..00000000 Binary files a/.yarn/cache/@gjsify-webassembly-npm-0.3.16-6eff07e63b-a711a12bc7.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-webassembly-npm-0.4.13-dc4b8a5026-a5b25bc496.zip b/.yarn/cache/@gjsify-webassembly-npm-0.4.14-15e944ae26-50a7dd3461.zip similarity index 97% rename from .yarn/cache/@gjsify-webassembly-npm-0.4.13-dc4b8a5026-a5b25bc496.zip rename to .yarn/cache/@gjsify-webassembly-npm-0.4.14-15e944ae26-50a7dd3461.zip index aa1001e0..80cd7b9b 100644 Binary files a/.yarn/cache/@gjsify-webassembly-npm-0.4.13-dc4b8a5026-a5b25bc496.zip and b/.yarn/cache/@gjsify-webassembly-npm-0.4.14-15e944ae26-50a7dd3461.zip differ diff --git a/.yarn/cache/@gjsify-webaudio-npm-0.3.16-6ee59f9746-77cdf5ab5f.zip b/.yarn/cache/@gjsify-webaudio-npm-0.3.16-6ee59f9746-77cdf5ab5f.zip deleted file mode 100644 index 2318efbf..00000000 Binary files a/.yarn/cache/@gjsify-webaudio-npm-0.3.16-6ee59f9746-77cdf5ab5f.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-webaudio-npm-0.4.13-476fb95915-ecdf42185d.zip b/.yarn/cache/@gjsify-webaudio-npm-0.4.14-55f070f631-55ded8e34e.zip similarity index 99% rename from .yarn/cache/@gjsify-webaudio-npm-0.4.13-476fb95915-ecdf42185d.zip rename to .yarn/cache/@gjsify-webaudio-npm-0.4.14-55f070f631-55ded8e34e.zip index dbe5b9a1..f8d2e6c2 100644 Binary files a/.yarn/cache/@gjsify-webaudio-npm-0.4.13-476fb95915-ecdf42185d.zip and b/.yarn/cache/@gjsify-webaudio-npm-0.4.14-55f070f631-55ded8e34e.zip differ diff --git a/.yarn/cache/@gjsify-webcrypto-npm-0.3.16-2306377c98-9ef533837a.zip b/.yarn/cache/@gjsify-webcrypto-npm-0.3.16-2306377c98-9ef533837a.zip deleted file mode 100644 index 4edc99c0..00000000 Binary files a/.yarn/cache/@gjsify-webcrypto-npm-0.3.16-2306377c98-9ef533837a.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-webcrypto-npm-0.4.13-1bd2b670c4-1ffdfe35d1.zip b/.yarn/cache/@gjsify-webcrypto-npm-0.4.14-2a59ce2b3c-8a4dc0276b.zip similarity index 99% rename from .yarn/cache/@gjsify-webcrypto-npm-0.4.13-1bd2b670c4-1ffdfe35d1.zip rename to .yarn/cache/@gjsify-webcrypto-npm-0.4.14-2a59ce2b3c-8a4dc0276b.zip index c53e400d..7f1c9d83 100644 Binary files a/.yarn/cache/@gjsify-webcrypto-npm-0.4.13-1bd2b670c4-1ffdfe35d1.zip and b/.yarn/cache/@gjsify-webcrypto-npm-0.4.14-2a59ce2b3c-8a4dc0276b.zip differ diff --git a/.yarn/cache/@gjsify-websocket-npm-0.3.16-247c97c86c-bf08647409.zip b/.yarn/cache/@gjsify-websocket-npm-0.3.16-247c97c86c-bf08647409.zip deleted file mode 100644 index 2fe29ed8..00000000 Binary files a/.yarn/cache/@gjsify-websocket-npm-0.3.16-247c97c86c-bf08647409.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-websocket-npm-0.4.13-d09ef0cf43-6b61ee3084.zip b/.yarn/cache/@gjsify-websocket-npm-0.4.14-dd69762ff5-33f787f3b4.zip similarity index 98% rename from .yarn/cache/@gjsify-websocket-npm-0.4.13-d09ef0cf43-6b61ee3084.zip rename to .yarn/cache/@gjsify-websocket-npm-0.4.14-dd69762ff5-33f787f3b4.zip index 2cbca6e2..19870c34 100644 Binary files a/.yarn/cache/@gjsify-websocket-npm-0.4.13-d09ef0cf43-6b61ee3084.zip and b/.yarn/cache/@gjsify-websocket-npm-0.4.14-dd69762ff5-33f787f3b4.zip differ diff --git a/.yarn/cache/@gjsify-webstorage-npm-0.3.16-8b15dd5c96-75dfaf2be5.zip b/.yarn/cache/@gjsify-webstorage-npm-0.3.16-8b15dd5c96-75dfaf2be5.zip deleted file mode 100644 index 91b3c56e..00000000 Binary files a/.yarn/cache/@gjsify-webstorage-npm-0.3.16-8b15dd5c96-75dfaf2be5.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-webstorage-npm-0.4.13-82c8918174-3c507a64fc.zip b/.yarn/cache/@gjsify-webstorage-npm-0.4.14-e01538f82c-76839eb6a2.zip similarity index 96% rename from .yarn/cache/@gjsify-webstorage-npm-0.4.13-82c8918174-3c507a64fc.zip rename to .yarn/cache/@gjsify-webstorage-npm-0.4.14-e01538f82c-76839eb6a2.zip index 55e11040..a5796ebb 100644 Binary files a/.yarn/cache/@gjsify-webstorage-npm-0.4.13-82c8918174-3c507a64fc.zip and b/.yarn/cache/@gjsify-webstorage-npm-0.4.14-e01538f82c-76839eb6a2.zip differ diff --git a/.yarn/cache/@gjsify-worker_threads-npm-0.3.16-0022d65243-9953a8693d.zip b/.yarn/cache/@gjsify-worker_threads-npm-0.3.16-0022d65243-9953a8693d.zip deleted file mode 100644 index 604d2b4f..00000000 Binary files a/.yarn/cache/@gjsify-worker_threads-npm-0.3.16-0022d65243-9953a8693d.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-worker_threads-npm-0.4.13-abcdb4beb0-081e99bd31.zip b/.yarn/cache/@gjsify-worker_threads-npm-0.4.14-a6e1944d27-debd7c494a.zip similarity index 80% rename from .yarn/cache/@gjsify-worker_threads-npm-0.4.13-abcdb4beb0-081e99bd31.zip rename to .yarn/cache/@gjsify-worker_threads-npm-0.4.14-a6e1944d27-debd7c494a.zip index 00d4387c..0dfe482d 100644 Binary files a/.yarn/cache/@gjsify-worker_threads-npm-0.4.13-abcdb4beb0-081e99bd31.zip and b/.yarn/cache/@gjsify-worker_threads-npm-0.4.14-a6e1944d27-debd7c494a.zip differ diff --git a/.yarn/cache/@gjsify-workspace-npm-0.4.13-86382d4397-e943bda5c7.zip b/.yarn/cache/@gjsify-workspace-npm-0.4.14-00c4c1b203-279ba9b2d8.zip similarity index 99% rename from .yarn/cache/@gjsify-workspace-npm-0.4.13-86382d4397-e943bda5c7.zip rename to .yarn/cache/@gjsify-workspace-npm-0.4.14-00c4c1b203-279ba9b2d8.zip index 90759e8c..0ef3da92 100644 Binary files a/.yarn/cache/@gjsify-workspace-npm-0.4.13-86382d4397-e943bda5c7.zip and b/.yarn/cache/@gjsify-workspace-npm-0.4.14-00c4c1b203-279ba9b2d8.zip differ diff --git a/.yarn/cache/@gjsify-xmlhttprequest-npm-0.3.16-4a3e346f38-5d51524e9d.zip b/.yarn/cache/@gjsify-xmlhttprequest-npm-0.3.16-4a3e346f38-5d51524e9d.zip deleted file mode 100644 index eb3f524e..00000000 Binary files a/.yarn/cache/@gjsify-xmlhttprequest-npm-0.3.16-4a3e346f38-5d51524e9d.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-xmlhttprequest-npm-0.4.13-40a0a858f4-15a5f43899.zip b/.yarn/cache/@gjsify-xmlhttprequest-npm-0.4.14-bcde1723e1-7ec23b23ca.zip similarity index 99% rename from .yarn/cache/@gjsify-xmlhttprequest-npm-0.4.13-40a0a858f4-15a5f43899.zip rename to .yarn/cache/@gjsify-xmlhttprequest-npm-0.4.14-bcde1723e1-7ec23b23ca.zip index 466e6b08..2a6a6a7f 100644 Binary files a/.yarn/cache/@gjsify-xmlhttprequest-npm-0.4.13-40a0a858f4-15a5f43899.zip and b/.yarn/cache/@gjsify-xmlhttprequest-npm-0.4.14-bcde1723e1-7ec23b23ca.zip differ diff --git a/.yarn/cache/@gjsify-zlib-npm-0.3.16-0f578a792c-fefbb916c8.zip b/.yarn/cache/@gjsify-zlib-npm-0.3.16-0f578a792c-fefbb916c8.zip deleted file mode 100644 index 0a660597..00000000 Binary files a/.yarn/cache/@gjsify-zlib-npm-0.3.16-0f578a792c-fefbb916c8.zip and /dev/null differ diff --git a/.yarn/cache/@gjsify-zlib-npm-0.4.13-216ce59de8-f2518a87bc.zip b/.yarn/cache/@gjsify-zlib-npm-0.4.14-0c130e4492-a4a926ca5c.zip similarity index 98% rename from .yarn/cache/@gjsify-zlib-npm-0.4.13-216ce59de8-f2518a87bc.zip rename to .yarn/cache/@gjsify-zlib-npm-0.4.14-0c130e4492-a4a926ca5c.zip index 5440fbe7..51ea11b7 100644 Binary files a/.yarn/cache/@gjsify-zlib-npm-0.4.13-216ce59de8-f2518a87bc.zip and b/.yarn/cache/@gjsify-zlib-npm-0.4.14-0c130e4492-a4a926ca5c.zip differ diff --git a/.yarn/cache/@oxc-project-types-npm-0.129.0-b4f236a01a-3714ba117a.zip b/.yarn/cache/@oxc-project-types-npm-0.129.0-b4f236a01a-3714ba117a.zip deleted file mode 100644 index 6a5683e6..00000000 Binary files a/.yarn/cache/@oxc-project-types-npm-0.129.0-b4f236a01a-3714ba117a.zip and /dev/null differ diff --git a/.yarn/cache/@rolldown-binding-linux-arm64-gnu-npm-1.0.0-0a6bd960f9-10c0.zip b/.yarn/cache/@rolldown-binding-linux-arm64-gnu-npm-1.0.0-0a6bd960f9-10c0.zip deleted file mode 100644 index b3a5c7e8..00000000 Binary files a/.yarn/cache/@rolldown-binding-linux-arm64-gnu-npm-1.0.0-0a6bd960f9-10c0.zip and /dev/null differ diff --git a/.yarn/cache/@rolldown-binding-linux-x64-gnu-npm-1.0.0-1925068cf0-10c0.zip b/.yarn/cache/@rolldown-binding-linux-x64-gnu-npm-1.0.0-1925068cf0-10c0.zip deleted file mode 100644 index 2d5fdc24..00000000 Binary files a/.yarn/cache/@rolldown-binding-linux-x64-gnu-npm-1.0.0-1925068cf0-10c0.zip and /dev/null differ diff --git a/.yarn/cache/@rolldown-pluginutils-npm-1.0.0-9fa8d44a94-44aba36386.zip b/.yarn/cache/@rolldown-pluginutils-npm-1.0.0-9fa8d44a94-44aba36386.zip deleted file mode 100644 index 4c3da5f5..00000000 Binary files a/.yarn/cache/@rolldown-pluginutils-npm-1.0.0-9fa8d44a94-44aba36386.zip and /dev/null differ diff --git a/.yarn/cache/gettext-parser-npm-9.0.2-2db65b342a-080b026b18.zip b/.yarn/cache/gettext-parser-npm-9.0.2-2db65b342a-080b026b18.zip new file mode 100644 index 00000000..809e8ce5 Binary files /dev/null and b/.yarn/cache/gettext-parser-npm-9.0.2-2db65b342a-080b026b18.zip differ diff --git a/.yarn/cache/prettier-npm-3.8.3-ecd857a540-754816fd75.zip b/.yarn/cache/prettier-npm-3.8.3-ecd857a540-754816fd75.zip deleted file mode 100644 index 59540e0d..00000000 Binary files a/.yarn/cache/prettier-npm-3.8.3-ecd857a540-754816fd75.zip and /dev/null differ diff --git a/.yarn/cache/rolldown-npm-1.0.0-48dff562be-8e8c4ebcd8.zip b/.yarn/cache/rolldown-npm-1.0.0-48dff562be-8e8c4ebcd8.zip deleted file mode 100644 index 78449bf0..00000000 Binary files a/.yarn/cache/rolldown-npm-1.0.0-48dff562be-8e8c4ebcd8.zip and /dev/null differ diff --git a/.yarn/sdks/prettier/bin/prettier.cjs b/.yarn/sdks/prettier/bin/prettier.cjs deleted file mode 100755 index 9a4098f7..00000000 --- a/.yarn/sdks/prettier/bin/prettier.cjs +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env node - -const {existsSync} = require(`fs`); -const {createRequire, register} = require(`module`); -const {resolve} = require(`path`); -const {pathToFileURL} = require(`url`); - -const relPnpApiPath = "../../../../.pnp.cjs"; - -const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`); -const absRequire = createRequire(absPnpApiPath); - -const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`); -const isPnpLoaderEnabled = existsSync(absPnpLoaderPath); - -if (existsSync(absPnpApiPath)) { - if (!process.versions.pnp) { - // Setup the environment to be able to require prettier/bin/prettier.cjs - require(absPnpApiPath).setup(); - if (isPnpLoaderEnabled && register) { - register(pathToFileURL(absPnpLoaderPath)); - } - } -} - -const wrapWithUserWrapper = existsSync(absUserWrapperPath) - ? exports => absRequire(absUserWrapperPath)(exports) - : exports => exports; - -// Defer to the real prettier/bin/prettier.cjs your application uses -module.exports = wrapWithUserWrapper(absRequire(`prettier/bin/prettier.cjs`)); diff --git a/.yarn/sdks/prettier/index.cjs b/.yarn/sdks/prettier/index.cjs deleted file mode 100644 index 57cb2ab1..00000000 --- a/.yarn/sdks/prettier/index.cjs +++ /dev/null @@ -1,32 +0,0 @@ -#!/usr/bin/env node - -const {existsSync} = require(`fs`); -const {createRequire, register} = require(`module`); -const {resolve} = require(`path`); -const {pathToFileURL} = require(`url`); - -const relPnpApiPath = "../../../.pnp.cjs"; - -const absPnpApiPath = resolve(__dirname, relPnpApiPath); -const absUserWrapperPath = resolve(__dirname, `./sdk.user.cjs`); -const absRequire = createRequire(absPnpApiPath); - -const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`); -const isPnpLoaderEnabled = existsSync(absPnpLoaderPath); - -if (existsSync(absPnpApiPath)) { - if (!process.versions.pnp) { - // Setup the environment to be able to require prettier - require(absPnpApiPath).setup(); - if (isPnpLoaderEnabled && register) { - register(pathToFileURL(absPnpLoaderPath)); - } - } -} - -const wrapWithUserWrapper = existsSync(absUserWrapperPath) - ? exports => absRequire(absUserWrapperPath)(exports) - : exports => exports; - -// Defer to the real prettier your application uses -module.exports = wrapWithUserWrapper(absRequire(`prettier`)); diff --git a/.yarn/sdks/prettier/package.json b/.yarn/sdks/prettier/package.json deleted file mode 100644 index cf1b58d4..00000000 --- a/.yarn/sdks/prettier/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "prettier", - "version": "3.3.3-sdk", - "main": "./index.cjs", - "type": "commonjs", - "bin": "./bin/prettier.cjs" -} diff --git a/biome.json b/biome.json new file mode 100644 index 00000000..8186bd99 --- /dev/null +++ b/biome.json @@ -0,0 +1,92 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.4.13/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 120, + "lineEnding": "lf" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true, + "style": { + "useImportType": "warn", + "useNodejsImportProtocol": "error", + "noNonNullAssertion": "off" + }, + "suspicious": { + "noExplicitAny": "warn", + "noConsole": "off" + }, + "correctness": { + "noUnusedImports": "warn" + } + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double", + "jsxQuoteStyle": "double", + "semicolons": "always", + "trailingCommas": "es5", + "arrowParentheses": "always", + "bracketSpacing": true, + "bracketSameLine": false + } + }, + "json": { + "formatter": { + "indentWidth": 2, + "trailingCommas": "none", + "lineWidth": 120 + } + }, + "css": { + "parser": { + "tailwindDirectives": true + }, + "formatter": { + "indentWidth": 2, + "quoteStyle": "single" + } + }, + "files": { + "includes": [ + "**", + "!**/node_modules", + "!**/dist", + "!**/lib", + "!**/build", + "!**/builddir", + "!**/flatpak-build", + "!**/.flatpak-builder", + "!**/repo", + "!**/.yarn", + "!**/coverage", + "!**/refs", + "!**/references", + "!**/@types", + "!**/templates", + "!**/prebuilds", + "!**/eu.jumplink.Learn6502.tar.gz", + "!**/_site", + "!**/_includes", + "!**/platforms", + "!packages/app-android/app/i18n", + "!packages/app-web/_site", + "!packages/app-web/_includes", + "!packages/app-android/platforms", + "!**/*.blp", + "!**/*.gresource", + "!**/*.compiled", + "!**/*.metainfo.xml" + ] + } +} diff --git a/eu.jumplink.Learn6502.json b/eu.jumplink.Learn6502.json index 29b6b793..e57d290a 100644 --- a/eu.jumplink.Learn6502.json +++ b/eu.jumplink.Learn6502.json @@ -3,20 +3,12 @@ "runtime": "org.gnome.Platform", "runtime-version": "50", "sdk": "org.gnome.Sdk", - "sdk-extensions": [ - "org.freedesktop.Sdk.Extension.node24", - "org.freedesktop.Sdk.Extension.typescript" - ], + "sdk-extensions": ["org.freedesktop.Sdk.Extension.node24", "org.freedesktop.Sdk.Extension.typescript"], "build-options": { "append-path": "/usr/lib/sdk/node24/bin:/usr/lib/sdk/typescript/bin:/app/bin" }, "command": "eu.jumplink.Learn6502", - "finish-args": [ - "--device=dri", - "--share=ipc", - "--socket=fallback-x11", - "--socket=wayland" - ], + "finish-args": ["--device=dri", "--share=ipc", "--socket=fallback-x11", "--socket=wayland"], "modules": [ { "name": "Learn6502", diff --git a/package.json b/package.json index 1a2ccb18..0dd09df5 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "developer": { "id": "eu.jumplink", "name": "Pascal Garber", - "email": "pascal@mailfreund.de", + "email": "pascal@mailfreun.de", "nameTranslatable": false }, "summary": "Program vintage game consoles", @@ -363,7 +363,7 @@ "build:android": "yarn workspace @learn6502/app-android run build", "check": "yarn workspaces foreach -v -W -t run check", "check:flatpak:repo": "flatpak run --command=flatpak-builder-lint org.flatpak.Builder repo repo", - "check:format": "yarn exec prettier . --check", + "check:format": "gjsify format --check", "flatpak:regen": "gjsify flatpak init --force --metainfo packages/app-gnome/data/metainfo/eu.jumplink.Learn6502.metainfo.xml.in --desktop packages/app-gnome/data/eu.jumplink.Learn6502.desktop.in", "start": "yarn start:gnome", "start:gnome": "yarn workspace @learn6502/app-gnome run start", @@ -372,10 +372,10 @@ "start:android": "yarn workspace @learn6502/app-android run start", "clear": "yarn workspaces foreach -v --parallel -W run clear && yarn _clear", "_clear": "rm -rf builddir build-dir .flatpak-builder flatpak-build repo eu.jumplink.Learn6502.tar.gz", - "format": "yarn exec prettier . --write", - "prettier": "node .yarn/sdks/prettier/index.cjs" + "format": "gjsify format", + "fix": "gjsify fix" }, - "author": "Pascal Garber ", + "author": "Pascal Garber ", "license": "GPL-3.0", "workspaces": [ "packages/*", @@ -383,8 +383,8 @@ "packages/app-web" ], "devDependencies": { - "@gjsify/cli": "^0.4.13", - "prettier": "^3.8.3", + "@biomejs/biome": "^2.4.13", + "@gjsify/cli": "^0.4.14", "typescript": "^6.0.3" }, "packageManager": "yarn@4.13.0" diff --git a/packages/6502/global.d.ts b/packages/6502/global.d.ts index 255ed3a1..ccfddfff 100644 --- a/packages/6502/global.d.ts +++ b/packages/6502/global.d.ts @@ -1,17 +1,9 @@ // We don't want to use the DOM types in the 6502 package to make it cross-platform, // but we need the interval and timeout functions. -declare function setInterval( - handler: TimerHandler, - timeout?: number, - ...arguments: any[] -): number; +declare function setInterval(handler: TimerHandler, timeout?: number, ...arguments: any[]): number; declare function clearInterval(handle?: number): void; -declare function setTimeout( - handler: TimerHandler, - timeout?: number, - ...arguments: any[] -): number; +declare function setTimeout(handler: TimerHandler, timeout?: number, ...arguments: any[]): number; declare function clearTimeout(handle?: number): void; type TimerHandler = string | Function; diff --git a/packages/6502/src/assembler.ts b/packages/6502/src/assembler.ts index a1df17f6..25f009b9 100644 --- a/packages/6502/src/assembler.ts +++ b/packages/6502/src/assembler.ts @@ -4,12 +4,7 @@ import { EventDispatcher } from "./event-dispatcher.js"; import { _, addr2hex, num2hex } from "./utils.js"; import { ADDRESSING_MODES, INSTRUCTION_LENGTH } from "./constants.js"; -import type { - Symbols, - AssemblerEventsMap, - DisassembledData, - InstructionData, -} from "./types/index.js"; +import type { Symbols, AssemblerEventsMap, DisassembledData, InstructionData } from "./types/index.js"; /** * Represents the assembler for the 6502 simulator. @@ -27,876 +22,64 @@ export class Assembler { private opcodes = [ /* Name, Imm, ZP, ZPX, ZPY, ABS, ABSX, ABSY, IND, INDX, INDY, SNGL, BRA */ - [ - "ADC", - 0x69, - 0x65, - 0x75, - null, - 0x6d, - 0x7d, - 0x79, - null, - 0x61, - 0x71, - null, - null, - ], - [ - "AND", - 0x29, - 0x25, - 0x35, - null, - 0x2d, - 0x3d, - 0x39, - null, - 0x21, - 0x31, - null, - null, - ], - [ - "ASL", - null, - 0x06, - 0x16, - null, - 0x0e, - 0x1e, - null, - null, - null, - null, - 0x0a, - null, - ], - [ - "BIT", - null, - 0x24, - null, - null, - 0x2c, - null, - null, - null, - null, - null, - null, - null, - ], - [ - "BPL", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x10, - ], - [ - "BMI", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x30, - ], - [ - "BVC", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x50, - ], - [ - "BVS", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x70, - ], - [ - "BCC", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x90, - ], - [ - "BCS", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xb0, - ], - [ - "BNE", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xd0, - ], - [ - "BEQ", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xf0, - ], - [ - "BRK", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x00, - null, - ], - [ - "CMP", - 0xc9, - 0xc5, - 0xd5, - null, - 0xcd, - 0xdd, - 0xd9, - null, - 0xc1, - 0xd1, - null, - null, - ], - [ - "CPX", - 0xe0, - 0xe4, - null, - null, - 0xec, - null, - null, - null, - null, - null, - null, - null, - ], - [ - "CPY", - 0xc0, - 0xc4, - null, - null, - 0xcc, - null, - null, - null, - null, - null, - null, - null, - ], - [ - "DEC", - null, - 0xc6, - 0xd6, - null, - 0xce, - 0xde, - null, - null, - null, - null, - null, - null, - ], - [ - "EOR", - 0x49, - 0x45, - 0x55, - null, - 0x4d, - 0x5d, - 0x59, - null, - 0x41, - 0x51, - null, - null, - ], - [ - "CLC", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x18, - null, - ], - [ - "SEC", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x38, - null, - ], - [ - "CLI", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x58, - null, - ], - [ - "SEI", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x78, - null, - ], - [ - "CLV", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xb8, - null, - ], - [ - "CLD", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xd8, - null, - ], - [ - "SED", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xf8, - null, - ], - [ - "INC", - null, - 0xe6, - 0xf6, - null, - 0xee, - 0xfe, - null, - null, - null, - null, - null, - null, - ], - [ - "JMP", - null, - null, - null, - null, - 0x4c, - null, - null, - 0x6c, - null, - null, - null, - null, - ], - [ - "JSR", - null, - null, - null, - null, - 0x20, - null, - null, - null, - null, - null, - null, - null, - ], - [ - "LDA", - 0xa9, - 0xa5, - 0xb5, - null, - 0xad, - 0xbd, - 0xb9, - null, - 0xa1, - 0xb1, - null, - null, - ], - [ - "LDX", - 0xa2, - 0xa6, - null, - 0xb6, - 0xae, - null, - 0xbe, - null, - null, - null, - null, - null, - ], - [ - "LDY", - 0xa0, - 0xa4, - 0xb4, - null, - 0xac, - 0xbc, - null, - null, - null, - null, - null, - null, - ], - [ - "LSR", - null, - 0x46, - 0x56, - null, - 0x4e, - 0x5e, - null, - null, - null, - null, - 0x4a, - null, - ], - [ - "NOP", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xea, - null, - ], - [ - "ORA", - 0x09, - 0x05, - 0x15, - null, - 0x0d, - 0x1d, - 0x19, - null, - 0x01, - 0x11, - null, - null, - ], - [ - "TAX", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xaa, - null, - ], - [ - "TXA", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x8a, - null, - ], - [ - "DEX", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xca, - null, - ], - [ - "INX", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xe8, - null, - ], - [ - "TAY", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xa8, - null, - ], - [ - "TYA", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x98, - null, - ], - [ - "DEY", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x88, - null, - ], - [ - "INY", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xc8, - null, - ], - [ - "ROR", - null, - 0x66, - 0x76, - null, - 0x6e, - 0x7e, - null, - null, - null, - null, - 0x6a, - null, - ], - [ - "ROL", - null, - 0x26, - 0x36, - null, - 0x2e, - 0x3e, - null, - null, - null, - null, - 0x2a, - null, - ], - [ - "RTI", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x40, - null, - ], - [ - "RTS", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x60, - null, - ], - [ - "SBC", - 0xe9, - 0xe5, - 0xf5, - null, - 0xed, - 0xfd, - 0xf9, - null, - 0xe1, - 0xf1, - null, - null, - ], - [ - "STA", - null, - 0x85, - 0x95, - null, - 0x8d, - 0x9d, - 0x99, - null, - 0x81, - 0x91, - null, - null, - ], - [ - "TXS", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x9a, - null, - ], - [ - "TSX", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0xba, - null, - ], - [ - "PHA", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x48, - null, - ], - [ - "PLA", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x68, - null, - ], - [ - "PHP", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x08, - null, - ], - [ - "PLP", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - 0x28, - null, - ], - [ - "STX", - null, - 0x86, - null, - 0x96, - 0x8e, - null, - null, - null, - null, - null, - null, - null, - ], - [ - "STY", - null, - 0x84, - 0x94, - null, - 0x8c, - null, - null, - null, - null, - null, - null, - null, - ], - [ - "WDM", - 0x42, - 0x42, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], - [ - "---", - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - null, - ], + ["ADC", 0x69, 0x65, 0x75, null, 0x6d, 0x7d, 0x79, null, 0x61, 0x71, null, null], + ["AND", 0x29, 0x25, 0x35, null, 0x2d, 0x3d, 0x39, null, 0x21, 0x31, null, null], + ["ASL", null, 0x06, 0x16, null, 0x0e, 0x1e, null, null, null, null, 0x0a, null], + ["BIT", null, 0x24, null, null, 0x2c, null, null, null, null, null, null, null], + ["BPL", null, null, null, null, null, null, null, null, null, null, null, 0x10], + ["BMI", null, null, null, null, null, null, null, null, null, null, null, 0x30], + ["BVC", null, null, null, null, null, null, null, null, null, null, null, 0x50], + ["BVS", null, null, null, null, null, null, null, null, null, null, null, 0x70], + ["BCC", null, null, null, null, null, null, null, null, null, null, null, 0x90], + ["BCS", null, null, null, null, null, null, null, null, null, null, null, 0xb0], + ["BNE", null, null, null, null, null, null, null, null, null, null, null, 0xd0], + ["BEQ", null, null, null, null, null, null, null, null, null, null, null, 0xf0], + ["BRK", null, null, null, null, null, null, null, null, null, null, 0x00, null], + ["CMP", 0xc9, 0xc5, 0xd5, null, 0xcd, 0xdd, 0xd9, null, 0xc1, 0xd1, null, null], + ["CPX", 0xe0, 0xe4, null, null, 0xec, null, null, null, null, null, null, null], + ["CPY", 0xc0, 0xc4, null, null, 0xcc, null, null, null, null, null, null, null], + ["DEC", null, 0xc6, 0xd6, null, 0xce, 0xde, null, null, null, null, null, null], + ["EOR", 0x49, 0x45, 0x55, null, 0x4d, 0x5d, 0x59, null, 0x41, 0x51, null, null], + ["CLC", null, null, null, null, null, null, null, null, null, null, 0x18, null], + ["SEC", null, null, null, null, null, null, null, null, null, null, 0x38, null], + ["CLI", null, null, null, null, null, null, null, null, null, null, 0x58, null], + ["SEI", null, null, null, null, null, null, null, null, null, null, 0x78, null], + ["CLV", null, null, null, null, null, null, null, null, null, null, 0xb8, null], + ["CLD", null, null, null, null, null, null, null, null, null, null, 0xd8, null], + ["SED", null, null, null, null, null, null, null, null, null, null, 0xf8, null], + ["INC", null, 0xe6, 0xf6, null, 0xee, 0xfe, null, null, null, null, null, null], + ["JMP", null, null, null, null, 0x4c, null, null, 0x6c, null, null, null, null], + ["JSR", null, null, null, null, 0x20, null, null, null, null, null, null, null], + ["LDA", 0xa9, 0xa5, 0xb5, null, 0xad, 0xbd, 0xb9, null, 0xa1, 0xb1, null, null], + ["LDX", 0xa2, 0xa6, null, 0xb6, 0xae, null, 0xbe, null, null, null, null, null], + ["LDY", 0xa0, 0xa4, 0xb4, null, 0xac, 0xbc, null, null, null, null, null, null], + ["LSR", null, 0x46, 0x56, null, 0x4e, 0x5e, null, null, null, null, 0x4a, null], + ["NOP", null, null, null, null, null, null, null, null, null, null, 0xea, null], + ["ORA", 0x09, 0x05, 0x15, null, 0x0d, 0x1d, 0x19, null, 0x01, 0x11, null, null], + ["TAX", null, null, null, null, null, null, null, null, null, null, 0xaa, null], + ["TXA", null, null, null, null, null, null, null, null, null, null, 0x8a, null], + ["DEX", null, null, null, null, null, null, null, null, null, null, 0xca, null], + ["INX", null, null, null, null, null, null, null, null, null, null, 0xe8, null], + ["TAY", null, null, null, null, null, null, null, null, null, null, 0xa8, null], + ["TYA", null, null, null, null, null, null, null, null, null, null, 0x98, null], + ["DEY", null, null, null, null, null, null, null, null, null, null, 0x88, null], + ["INY", null, null, null, null, null, null, null, null, null, null, 0xc8, null], + ["ROR", null, 0x66, 0x76, null, 0x6e, 0x7e, null, null, null, null, 0x6a, null], + ["ROL", null, 0x26, 0x36, null, 0x2e, 0x3e, null, null, null, null, 0x2a, null], + ["RTI", null, null, null, null, null, null, null, null, null, null, 0x40, null], + ["RTS", null, null, null, null, null, null, null, null, null, null, 0x60, null], + ["SBC", 0xe9, 0xe5, 0xf5, null, 0xed, 0xfd, 0xf9, null, 0xe1, 0xf1, null, null], + ["STA", null, 0x85, 0x95, null, 0x8d, 0x9d, 0x99, null, 0x81, 0x91, null, null], + ["TXS", null, null, null, null, null, null, null, null, null, null, 0x9a, null], + ["TSX", null, null, null, null, null, null, null, null, null, null, 0xba, null], + ["PHA", null, null, null, null, null, null, null, null, null, null, 0x48, null], + ["PLA", null, null, null, null, null, null, null, null, null, null, 0x68, null], + ["PHP", null, null, null, null, null, null, null, null, null, null, 0x08, null], + ["PLP", null, null, null, null, null, null, null, null, null, null, 0x28, null], + ["STX", null, 0x86, null, 0x96, 0x8e, null, null, null, null, null, null, null], + ["STY", null, 0x84, 0x94, null, 0x8c, null, null, null, null, null, null, null], + ["WDM", 0x42, 0x42, null, null, null, null, null, null, null, null, null, null], + ["---", null, null, null, null, null, null, null, null, null, null, null, null], ]; private readonly events = new EventDispatcher(); @@ -911,10 +94,7 @@ export class Assembler { * @param event - The event name to listen for * @param listener - Callback function that receives the assembler event */ - public on( - event: K, - listener: (event: AssemblerEventsMap[K]) => void - ): void { + public on(event: K, listener: (event: AssemblerEventsMap[K]) => void): void { this.events.on(event, listener); } @@ -923,10 +103,7 @@ export class Assembler { * @param event - The event name to stop listening for * @param listener - Callback function to remove */ - public off( - event: K, - listener: (event: AssemblerEventsMap[K]) => void - ): void { + public off(event: K, listener: (event: AssemblerEventsMap[K]) => void): void { this.events.off(event, listener); } @@ -935,10 +112,7 @@ export class Assembler { * @param event - The event name to listen for * @param listener - Callback function that receives the assembler event */ - public once( - event: K, - listener: (event: AssemblerEventsMap[K]) => void - ): void { + public once(event: K, listener: (event: AssemblerEventsMap[K]) => void): void { this.events.once(event, listener); } @@ -950,10 +124,7 @@ export class Assembler { * @returns True if assembly was successful, false otherwise. */ public assembleLine(input: string, lineno: number, symbols: Symbols) { - let label: string | undefined, - command: string | undefined, - param: string | undefined, - addr: number | undefined; + let label: string | undefined, command: string | undefined, param: string | undefined, addr: number | undefined; // Find command or label if (input.match(/^\w+:/)) { @@ -986,9 +157,7 @@ export class Assembler { } if (addr < 0 || addr > 0xffff) { // TRANSLATORS: Error when setting the program counter outside the 64KB address space - this.dispatchAssembleFailure( - _("Unable to relocate code outside 64k memory") - ); + this.dispatchAssembleFailure(_("Unable to relocate code outside 64k memory")); return false; } this.currentPC = addr; @@ -1037,9 +206,7 @@ export class Assembler { if (this.checkIndirectX(param, this.opcodes[o][9] as number, symbols)) { return true; } - if ( - this.checkIndirectY(param, this.opcodes[o][10] as number, symbols) - ) { + if (this.checkIndirectY(param, this.opcodes[o][10] as number, symbols)) { return true; } if (this.checkAbsolute(param, this.opcodes[o][5] as number, symbols)) { @@ -1110,9 +277,7 @@ export class Assembler { params = [i + 1, str]; } else { // TRANSLATORS: Error when a relative branch target is out of the valid range - message = _( - "Out of range branch on line %d (branches are limited to -128 to +127): %s" - ); + message = _("Out of range branch on line %d (branches are limited to -128 to +127): %s"); params = [i + 1, str]; } } @@ -1122,9 +287,7 @@ export class Assembler { } // TRANSLATORS: Success message after assembly with total bytes of machine code - this.dispatchAssembleSuccess(_("Code assembled successfully, %d bytes."), [ - this.codeLen, - ]); + this.dispatchAssembleSuccess(_("Code assembled successfully, %d bytes."), [this.codeLen]); return true; } @@ -1134,11 +297,7 @@ export class Assembler { * @param options Configure output format (addresses, spaces, newlines) * @returns Formatted hex string of the assembled code */ - public hexdump(options: { - includeAddress: boolean; - includeSpaces: boolean; - includeNewline: boolean; - }): string { + public hexdump(options: { includeAddress: boolean; includeSpaces: boolean; includeNewline: boolean }): string { const hexdump = this.memory.format({ start: 0x600, length: this.codeLen, @@ -1177,8 +336,7 @@ export class Assembler { inst.addByte(byte); modeAndCode = this.getModeAndCode(byte); - length = - INSTRUCTION_LENGTH[modeAndCode.mode as keyof typeof INSTRUCTION_LENGTH]; + length = INSTRUCTION_LENGTH[modeAndCode.mode as keyof typeof INSTRUCTION_LENGTH]; inst.setModeAndCode(modeAndCode); for (let i = 1; i < length; i++) { @@ -1208,9 +366,7 @@ export class Assembler { let formatted = "Address Hexdump Disassembly\n"; formatted += "-------------------------------\n"; - formatted += instructions - .map((inst) => inst.formattedInstruction) - .join("\n"); + formatted += instructions.map((inst) => inst.formattedInstruction).join("\n"); const data: DisassembledData = { formatted, @@ -1231,10 +387,7 @@ export class Assembler { return this.currentPC; } - private dispatchAssembleSuccess( - message: string, - params: Array = [] - ) { + private dispatchAssembleSuccess(message: string, params: Array = []) { this.events.dispatch("assemble-success", { assembler: this, message, @@ -1242,10 +395,7 @@ export class Assembler { }); } - private dispatchAssembleFailure( - message: string, - params: Array = [] - ) { + private dispatchAssembleFailure(message: string, params: Array = []) { this.events.dispatch("assemble-failure", { assembler: this, message, @@ -1253,10 +403,7 @@ export class Assembler { }); } - private dispatchHexdump( - message: string, - params: Array = [] - ) { + private dispatchHexdump(message: string, params: Array = []) { this.events.dispatch("hexdump", { assembler: this, message, params }); } @@ -1264,10 +411,7 @@ export class Assembler { this.events.dispatch("disassembly", { assembler: this, data }); } - private dispatchInfo( - message: string, - params: Array = [] - ) { + private dispatchInfo(message: string, params: Array = []) { this.events.dispatch("assemble-info", { assembler: this, message, params }); } @@ -1906,16 +1050,7 @@ export class Assembler { toString: function () { const bytesString = bytes.map(num2hex).join(" "); const padding = Array(11 - bytesString.length).join(" "); - return ( - "$" + - addr2hex(address) + - " " + - bytesString + - padding + - opCode + - " " + - formatArguments(args) - ); + return "$" + addr2hex(address) + " " + bytesString + padding + opCode + " " + formatArguments(args); }, getFormattedArgs: function () { return formatArguments(args); diff --git a/packages/6502/src/event-dispatcher.ts b/packages/6502/src/event-dispatcher.ts index 38c750e1..bfefe1ab 100644 --- a/packages/6502/src/event-dispatcher.ts +++ b/packages/6502/src/event-dispatcher.ts @@ -14,10 +14,7 @@ export class EventDispatcher { * @param event The event name to listen for * @param callback The callback function to execute when the event occurs */ - public on( - event: K, - callback: EventListener - ): void { + public on(event: K, callback: EventListener): void { if (!this.listeners[event]) { this.listeners[event] = []; } @@ -29,16 +26,11 @@ export class EventDispatcher { * @param event The event name to remove the listener from * @param callback The callback function to remove */ - public off( - event: K, - callback: EventListener - ): void { + public off(event: K, callback: EventListener): void { if (!this.listeners[event]) { return; } - this.listeners[event] = this.listeners[event]!.filter( - (listener) => listener !== callback - ); + this.listeners[event] = this.listeners[event]!.filter((listener) => listener !== callback); } /** @@ -46,18 +38,13 @@ export class EventDispatcher { * @param event The event name to dispatch * @param data The data to pass to the listeners */ - public dispatch( - event: K, - data: TEventMap[K] - ): void { + public dispatch(event: K, data: TEventMap[K]): void { if (!this.listeners[event]) { return; } this.listeners[event]!.forEach((listener) => listener(data)); // Automatically remove listeners registered with `once` - this.listeners[event] = this.listeners[event]!.filter( - (listener) => !listener.once - ); + this.listeners[event] = this.listeners[event]!.filter((listener) => !listener.once); } /** @@ -65,10 +52,7 @@ export class EventDispatcher { * @param event The event name to listen for * @param callback The callback function to execute when the event occurs */ - public once( - event: K, - callback: EventListener - ): void { + public once(event: K, callback: EventListener): void { const onceWrapper = ((data: TEventMap[K]) => { callback(data); onceWrapper.once = true; // Mark for removal diff --git a/packages/6502/src/labels.ts b/packages/6502/src/labels.ts index 60926eb2..c7129981 100644 --- a/packages/6502/src/labels.ts +++ b/packages/6502/src/labels.ts @@ -20,10 +20,7 @@ export class Labels { * @param event - The event name to listen for * @param listener - Callback function that receives the labels event */ - public on( - event: K, - listener: (event: LabelsEventsMap[K]) => void - ): void { + public on(event: K, listener: (event: LabelsEventsMap[K]) => void): void { this.events.on(event, listener); } @@ -32,10 +29,7 @@ export class Labels { * @param event - The event name to stop listening for * @param listener - Callback function to remove */ - public off( - event: K, - listener: (event: LabelsEventsMap[K]) => void - ): void { + public off(event: K, listener: (event: LabelsEventsMap[K]) => void): void { this.events.off(event, listener); } @@ -44,10 +38,7 @@ export class Labels { * @param event - The event name to listen for * @param listener - Callback function that receives the labels event */ - public once( - event: K, - listener: (event: LabelsEventsMap[K]) => void - ): void { + public once(event: K, listener: (event: LabelsEventsMap[K]) => void): void { this.events.once(event, listener); } @@ -67,9 +58,7 @@ export class Labels { * @returns True if label was found and updated, false otherwise. */ public setPC(name: string, addr: number): boolean { - const index = this.labelIndex.findIndex( - (label) => label.split("|")[0] === name - ); + const index = this.labelIndex.findIndex((label) => label.split("|")[0] === name); if (index !== -1) { this.labelIndex[index] = `${name}|${addr}`; return true; @@ -116,35 +105,22 @@ export class Labels { * @param assembler - Assembler instance. * @returns True if indexing was successful, false otherwise. */ - public indexLines( - lines: string[], - symbols: Symbols, - assembler: Assembler - ): boolean { + public indexLines(lines: string[], symbols: Symbols, assembler: Assembler): boolean { this.dispatchInfo(_("Indexing labels...")); for (let i = 0; i < lines.length; i++) { if (!this.indexLine(lines[i], symbols, assembler)) { - this.dispatchFailure(_("Label already defined at line %s: %d"), [ - i + 1, - lines[i], - ]); + this.dispatchFailure(_("Label already defined at line %s: %d"), [i + 1, lines[i]]); return false; } } return true; } - private dispatchInfo( - message: string, - params: Array = [] - ) { + private dispatchInfo(message: string, params: Array = []) { this.events.dispatch("labels-info", { labels: this, message, params }); } - private dispatchFailure( - message: string, - params: Array = [] - ) { + private dispatchFailure(message: string, params: Array = []) { this.events.dispatch("labels-failure", { labels: this, message, params }); } @@ -155,11 +131,7 @@ export class Labels { * @param assembler - Assembler instance. * @returns False if label already exists, true otherwise. */ - private indexLine( - input: string, - symbols: Symbols, - assembler: Assembler - ): boolean { + private indexLine(input: string, symbols: Symbols, assembler: Assembler): boolean { const currentPC = assembler.getCurrentPC(); assembler.assembleLine(input, 0, symbols); // TODO: find a better way for Labels to have access to assembler @@ -168,12 +140,7 @@ export class Labels { if (symbols.lookup(label)) { // TRANSLATORS: Error when a label name conflicts with a defined symbol - this.dispatchFailure( - _( - "Label {label} is already used as a symbol; please rename one of them" - ), - [label] - ); + this.dispatchFailure(_("Label {label} is already used as a symbol; please rename one of them"), [label]); return false; } diff --git a/packages/6502/src/memory.ts b/packages/6502/src/memory.ts index 68c251f6..c6be8369 100644 --- a/packages/6502/src/memory.ts +++ b/packages/6502/src/memory.ts @@ -26,10 +26,7 @@ export class Memory { * @param event - The event name ("changed") * @param listener - Callback function that receives the memory change event */ - public on( - event: K, - listener: (event: MemoryEventsMap[K]) => void - ): void { + public on(event: K, listener: (event: MemoryEventsMap[K]) => void): void { this.events.on(event, listener); } @@ -38,10 +35,7 @@ export class Memory { * @param event - The event name ("changed") * @param listener - Callback function that was previously registered */ - public off( - event: K, - listener: (event: MemoryEventsMap[K]) => void - ): void { + public off(event: K, listener: (event: MemoryEventsMap[K]) => void): void { this.events.off(event, listener); } @@ -50,10 +44,7 @@ export class Memory { * @param event - The event name ("changed") * @param listener - Callback function that receives the memory change event */ - public once( - event: K, - listener: (event: MemoryEventsMap[K]) => void - ): void { + public once(event: K, listener: (event: MemoryEventsMap[K]) => void): void { this.events.once(event, listener); } diff --git a/packages/6502/src/simulator.ts b/packages/6502/src/simulator.ts index 9af04b82..a0c36bb7 100644 --- a/packages/6502/src/simulator.ts +++ b/packages/6502/src/simulator.ts @@ -87,12 +87,7 @@ export class Simulator { // If PC is at the initial address (0x600) and registers are zeroed, // this indicates the simulator is in READY state (was reset or not started yet) - if ( - this.regPC === 0x600 && - this.regA === 0 && - this.regX === 0 && - this.regY === 0 - ) { + if (this.regPC === 0x600 && this.regA === 0 && this.regX === 0 && this.regY === 0) { // Check if any code is loaded in memory let hasCode = false; @@ -132,10 +127,7 @@ export class Simulator { * @param event - The event to listen for * @param listener - The callback function to execute when the event occurs */ - public on( - event: K, - listener: (event: SimulatorEventsMap[K]) => void - ): void { + public on(event: K, listener: (event: SimulatorEventsMap[K]) => void): void { this.events.on(event, listener); } @@ -144,10 +136,7 @@ export class Simulator { * @param event - The event to stop listening for * @param listener - The callback function to remove */ - public off( - event: K, - listener: (event: SimulatorEventsMap[K]) => void - ): void { + public off(event: K, listener: (event: SimulatorEventsMap[K]) => void): void { this.events.off(event, listener); } @@ -156,10 +145,7 @@ export class Simulator { * @param event - The event to listen for once * @param listener - The callback function to execute when the event occurs */ - public once( - event: K, - listener: (event: SimulatorEventsMap[K]) => void - ): void { + public once(event: K, listener: (event: SimulatorEventsMap[K]) => void): void { this.events.once(event, listener); } @@ -247,9 +233,7 @@ export class Simulator { } if (addr === 0) { // TRANSLATORS: Error when the given address or label cannot be parsed or found - this.dispatchSimulatorFailureEvent( - _("Unable to find/parse given address/label") - ); + this.dispatchSimulatorFailureEvent(_("Unable to find/parse given address/label")); } else { this.regPC = addr; } @@ -286,10 +270,7 @@ export class Simulator { this.dispatchStopEvent(message); } - private dispatchStepEvent( - message?: string, - params: Array = [] - ) { + private dispatchStepEvent(message?: string, params: Array = []) { this.events.dispatch("step", { simulator: this, message, @@ -298,10 +279,7 @@ export class Simulator { }); } - private dispatchMultiStepEvent( - message?: string, - params: Array = [] - ) { + private dispatchMultiStepEvent(message?: string, params: Array = []) { this.events.dispatch("multistep", { simulator: this, message, @@ -310,10 +288,7 @@ export class Simulator { }); } - private dispatchResetEvent( - message?: string, - params: Array = [] - ) { + private dispatchResetEvent(message?: string, params: Array = []) { this.events.dispatch("reset", { simulator: this, message, @@ -322,10 +297,7 @@ export class Simulator { }); } - private dispatchStartEvent( - message?: string, - params: Array = [] - ) { + private dispatchStartEvent(message?: string, params: Array = []) { this.events.dispatch("start", { simulator: this, message, @@ -334,10 +306,7 @@ export class Simulator { }); } - private dispatchStopEvent( - message?: string, - params: Array = [] - ) { + private dispatchStopEvent(message?: string, params: Array = []) { this.events.dispatch("stop", { simulator: this, message, @@ -346,10 +315,7 @@ export class Simulator { }); } - private dispatchGotoEvent( - message?: string, - params: Array = [] - ) { + private dispatchGotoEvent(message?: string, params: Array = []) { this.events.dispatch("goto", { simulator: this, message, @@ -358,10 +324,7 @@ export class Simulator { }); } - private dispatchSimulatorFailureEvent( - message?: string, - params: Array = [] - ) { + private dispatchSimulatorFailureEvent(message?: string, params: Array = []) { this.events.dispatch("simulator-failure", { simulator: this, message, @@ -370,10 +333,7 @@ export class Simulator { }); } - private dispatchSimulatorInfoEvent( - message?: string, - params: Array = [] - ) { + private dispatchSimulatorInfoEvent(message?: string, params: Array = []) { this.events.dispatch("simulator-info", { simulator: this, message, @@ -382,11 +342,7 @@ export class Simulator { }); } - private dispatchPseudoOpEvent( - type: string, - message?: string, - params: Array = [] - ) { + private dispatchPseudoOpEvent(type: string, message?: string, params: Array = []) { this.events.dispatch("pseudo-op", { simulator: this, type, @@ -1732,9 +1688,7 @@ export class Simulator { ierr: () => { // TRANSLATORS: Error message when an unknown opcode is encountered at address - this.dispatchSimulatorFailureEvent(_("Address %s - unknown opcode"), [ - addr2hex(this.regPC), - ]); + this.dispatchSimulatorFailureEvent(_("Address %s - unknown opcode"), [addr2hex(this.regPC)]); this._codeRunning = false; }, }; @@ -1848,9 +1802,7 @@ export class Simulator { this._programCompleted = true; if (this.executeId !== undefined) clearInterval(this.executeId); // TRANSLATORS: Info message shown when program finishes execution at address - this.dispatchStopEvent(_("Program completed at PC=$%s"), [ - addr2hex(this.regPC - 1), - ]); + this.dispatchStopEvent(_("Program completed at PC=$%s"), [addr2hex(this.regPC - 1)]); } else { this.dispatchStepEvent(); } diff --git a/packages/6502/src/types/assembler-events.ts b/packages/6502/src/types/assembler-events.ts index f291bc02..4b7a4eea 100644 --- a/packages/6502/src/types/assembler-events.ts +++ b/packages/6502/src/types/assembler-events.ts @@ -36,5 +36,4 @@ export interface AssemblerInfoEvent extends AssemblerBaseEvent {} /** * Event emitted when disassembly is generated */ -export interface AssemblerDisassemblyEvent - extends AssemblerBaseEvent, DisassembledEvent {} +export interface AssemblerDisassemblyEvent extends AssemblerBaseEvent, DisassembledEvent {} diff --git a/packages/app-android/app/app.css b/packages/app-android/app/app.css index de192536..437e0254 100644 --- a/packages/app-android/app/app.css +++ b/packages/app-android/app/app.css @@ -1,10 +1,10 @@ -@import "tailwindcss"; -@import "css/_light.css"; -@import "css/_light-mc.css"; -@import "css/_light-hc.css"; -@import "css/_dark.css"; -@import "css/_dark-mc.css"; -@import "css/_dark-hc.css"; +@import 'tailwindcss'; +@import 'css/_light.css'; +@import 'css/_light-mc.css'; +@import 'css/_light-hc.css'; +@import 'css/_dark.css'; +@import 'css/_dark-mc.css'; +@import 'css/_dark-hc.css'; @custom-variant dark (&:is(.ns-dark *)); @custom-variant high (&:is(.ns-contrast-high *)); diff --git a/packages/app-android/app/mdx/mdx-view.ts b/packages/app-android/app/mdx/mdx-view.ts index 7ac47dfb..e5b40ad6 100644 --- a/packages/app-android/app/mdx/mdx-view.ts +++ b/packages/app-android/app/mdx/mdx-view.ts @@ -1,10 +1,7 @@ import { ContentView, Builder, HtmlView, View } from "@nativescript/core"; import { localize } from "@nativescript/localize"; import { EventDispatcher } from "@learn6502/6502"; -import type { - SourceViewEventMap, - SourceViewCopyEvent, -} from "@learn6502/common-ui"; +import type { SourceViewEventMap, SourceViewCopyEvent } from "@learn6502/common-ui"; import { SourceView } from "~/widgets/source-view"; import { logger } from "~/utils"; @@ -36,10 +33,7 @@ export abstract class MdxView extends ContentView { }); if (!componentView) { - logger.error( - "MdxView", - `Failed to load ${this.getViewName()}.xml template` - ); + logger.error("MdxView", `Failed to load ${this.getViewName()}.xml template`); return; } @@ -98,11 +92,7 @@ export abstract class MdxView extends ContentView { try { html = localize(htmlView.html); } catch (error) { - logger.error( - "MdxView", - `Error localizing HTML string "${originalHtml}":`, - error - ); + logger.error("MdxView", `Error localizing HTML string "${originalHtml}":`, error); } if (html) { htmlView.html = html; @@ -110,10 +100,7 @@ export abstract class MdxView extends ContentView { if (originalHtml === html) { LOG_MISSING_TRANSLATIONS && - logger.debug( - "MdxView", - `HTML string "${originalHtml.slice(0, 100)}..." is not localized` - ); + logger.debug("MdxView", `HTML string "${originalHtml.slice(0, 100)}..." is not localized`); } }); } diff --git a/packages/app-android/app/services/file.service.ts b/packages/app-android/app/services/file.service.ts index 4ac0b2c2..15137ea0 100644 --- a/packages/app-android/app/services/file.service.ts +++ b/packages/app-android/app/services/file.service.ts @@ -1,8 +1,5 @@ import { FileService as BaseFileService } from "@learn6502/common-ui"; -import { - Application, - AndroidActivityResultEventData, -} from "@nativescript/core"; +import { Application, AndroidActivityResultEventData } from "@nativescript/core"; import { Observable } from "@nativescript/core/data/observable"; import { logger, showError } from "~/utils"; @@ -39,9 +36,7 @@ export class FileService extends BaseFileService { } // Create an intent for opening a document - const intent = new android.content.Intent( - android.content.Intent.ACTION_OPEN_DOCUMENT - ); + const intent = new android.content.Intent(android.content.Intent.ACTION_OPEN_DOCUMENT); intent.setType("*/*"); intent.addCategory(android.content.Intent.CATEGORY_OPENABLE); @@ -54,89 +49,74 @@ export class FileService extends BaseFileService { activity.startActivityForResult(intent, 101); // Handle activity result (use once to prevent listener accumulation) - Application.android.once( - Application.android.activityResultEvent, - (args) => { - const { - requestCode, - resultCode, - intent: data, - } = args as AndroidActivityResultEventData; - - // Check if it's our file request and it was successful - if ( - requestCode === 101 && - resultCode === android.app.Activity.RESULT_OK && - data - ) { - const uri = data.getData(); - if (uri) { - try { - // Get content resolver - const contentResolver = activity.getContentResolver(); - - // Get file name from URI - let fileName = "unknown.asm"; - - // Query for file name - const cursor = contentResolver.query( - uri, - [android.provider.OpenableColumns.DISPLAY_NAME], - null!, - null!, - null! - ); - - if (cursor && cursor.moveToFirst()) { - const nameIndex = cursor.getColumnIndex( - android.provider.OpenableColumns.DISPLAY_NAME - ); - if (nameIndex !== -1) { - fileName = cursor.getString(nameIndex); - } - cursor.close(); + Application.android.once(Application.android.activityResultEvent, (args) => { + const { requestCode, resultCode, intent: data } = args as AndroidActivityResultEventData; + + // Check if it's our file request and it was successful + if (requestCode === 101 && resultCode === android.app.Activity.RESULT_OK && data) { + const uri = data.getData(); + if (uri) { + try { + // Get content resolver + const contentResolver = activity.getContentResolver(); + + // Get file name from URI + let fileName = "unknown.asm"; + + // Query for file name + const cursor = contentResolver.query( + uri, + [android.provider.OpenableColumns.DISPLAY_NAME], + null!, + null!, + null! + ); + + if (cursor && cursor.moveToFirst()) { + const nameIndex = cursor.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME); + if (nameIndex !== -1) { + fileName = cursor.getString(nameIndex); } + cursor.close(); + } - // Open input stream and read file content - const inputStream = contentResolver.openInputStream(uri); - const reader = new java.io.BufferedReader( - new java.io.InputStreamReader(inputStream) - ); - - let line; - const stringBuilder = new java.lang.StringBuilder(); - while ((line = reader.readLine()) !== null) { - stringBuilder.append(line); - stringBuilder.append("\n"); - } + // Open input stream and read file content + const inputStream = contentResolver.openInputStream(uri); + const reader = new java.io.BufferedReader(new java.io.InputStreamReader(inputStream)); - inputStream.close(); - - // Get file content as string - const fileContent = stringBuilder.toString(); - - // Set current file - this.currentFileName = fileName; - this.currentFilePath = uri.toString(); - - // Return file content and name - resolve({ - content: fileContent, - filename: fileName, - }); - } catch (error) { - showError(error, { - forcedMessage: "Failed to read file", - showAsNotification: true, - }); - resolve(null); + let line; + const stringBuilder = new java.lang.StringBuilder(); + while ((line = reader.readLine()) !== null) { + stringBuilder.append(line); + stringBuilder.append("\n"); } - } else { + + inputStream.close(); + + // Get file content as string + const fileContent = stringBuilder.toString(); + + // Set current file + this.currentFileName = fileName; + this.currentFilePath = uri.toString(); + + // Return file content and name + resolve({ + content: fileContent, + filename: fileName, + }); + } catch (error) { + showError(error, { + forcedMessage: "Failed to read file", + showAsNotification: true, + }); resolve(null); } + } else { + resolve(null); } } - ); + }); }); } catch (error) { showError(error, { @@ -150,10 +130,7 @@ export class FileService extends BaseFileService { /** * Save content to a new file with file selection dialog */ - public async saveFileAs( - content: string, - suggestedName?: string - ): Promise { + public async saveFileAs(content: string, suggestedName?: string): Promise { try { // Get the current activity const activity = Application.android.foregroundActivity; @@ -163,94 +140,71 @@ export class FileService extends BaseFileService { } // Create intent for creating a new document - const intent = new android.content.Intent( - android.content.Intent.ACTION_CREATE_DOCUMENT - ); + const intent = new android.content.Intent(android.content.Intent.ACTION_CREATE_DOCUMENT); intent.setType("text/plain"); intent.addCategory(android.content.Intent.CATEGORY_OPENABLE); // Set suggested file name - intent.putExtra( - android.content.Intent.EXTRA_TITLE, - suggestedName || this.getCurrentFileName() || "untitled.asm" - ); + intent.putExtra(android.content.Intent.EXTRA_TITLE, suggestedName || this.getCurrentFileName() || "untitled.asm"); return new Promise((resolve) => { // Start the activity for result activity.startActivityForResult(intent, 102); // Handle activity result (use once to prevent listener accumulation) - Application.android.once( - Application.android.activityResultEvent, - (args) => { - const { - requestCode, - resultCode, - intent: data, - } = args as AndroidActivityResultEventData; - - // Check if it's our save request and it was successful - if ( - requestCode === 102 && - resultCode === android.app.Activity.RESULT_OK && - data - ) { - const uri = data.getData(); - if (uri) { - try { - // Get content resolver - const contentResolver = activity.getContentResolver(); - - // Query for file name - const cursor = contentResolver.query( - uri, - [android.provider.OpenableColumns.DISPLAY_NAME], - null!, - null!, - null! - ); - - if (cursor && cursor.moveToFirst()) { - const nameIndex = cursor.getColumnIndex( - android.provider.OpenableColumns.DISPLAY_NAME - ); - if (nameIndex !== -1) { - this.currentFileName = cursor.getString(nameIndex); - } - cursor.close(); + Application.android.once(Application.android.activityResultEvent, (args) => { + const { requestCode, resultCode, intent: data } = args as AndroidActivityResultEventData; + + // Check if it's our save request and it was successful + if (requestCode === 102 && resultCode === android.app.Activity.RESULT_OK && data) { + const uri = data.getData(); + if (uri) { + try { + // Get content resolver + const contentResolver = activity.getContentResolver(); + + // Query for file name + const cursor = contentResolver.query( + uri, + [android.provider.OpenableColumns.DISPLAY_NAME], + null!, + null!, + null! + ); + + if (cursor && cursor.moveToFirst()) { + const nameIndex = cursor.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME); + if (nameIndex !== -1) { + this.currentFileName = cursor.getString(nameIndex); } - - // Open output stream and write content - const outputStream = contentResolver.openOutputStream( - uri, - "wt" - ); - const writer = new java.io.BufferedWriter( - new java.io.OutputStreamWriter(outputStream) - ); - - writer.write(content); - writer.flush(); - writer.close(); - - // Update current file - this.currentFilePath = uri.toString(); - this.setUnsavedChanges(false); - - resolve(true); - } catch (error) { - showError(error, { - forcedMessage: "Failed to save file", - showAsNotification: true, - }); - resolve(false); + cursor.close(); } - } else { + + // Open output stream and write content + const outputStream = contentResolver.openOutputStream(uri, "wt"); + const writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(outputStream)); + + writer.write(content); + writer.flush(); + writer.close(); + + // Update current file + this.currentFilePath = uri.toString(); + this.setUnsavedChanges(false); + + resolve(true); + } catch (error) { + showError(error, { + forcedMessage: "Failed to save file", + showAsNotification: true, + }); resolve(false); } + } else { + resolve(false); } } - ); + }); }); } catch (error) { showError(error, { @@ -282,9 +236,7 @@ export class FileService extends BaseFileService { // Open output stream and write content const outputStream = contentResolver.openOutputStream(uri, "wt"); - const writer = new java.io.BufferedWriter( - new java.io.OutputStreamWriter(outputStream) - ); + const writer = new java.io.BufferedWriter(new java.io.OutputStreamWriter(outputStream)); writer.write(content); writer.flush(); diff --git a/packages/app-android/app/services/notification.service.ts b/packages/app-android/app/services/notification.service.ts index 0fa32bb9..112b53c5 100644 --- a/packages/app-android/app/services/notification.service.ts +++ b/packages/app-android/app/services/notification.service.ts @@ -24,11 +24,7 @@ class NotificationService extends BaseNotificationService { // Use Android's native Toast API const context = Application.android.context; if (context) { - const toast = android.widget.Toast.makeText( - context, - options.title, - android.widget.Toast.LENGTH_SHORT - ); + const toast = android.widget.Toast.makeText(context, options.title, android.widget.Toast.LENGTH_SHORT); toast.show(); } @@ -45,9 +41,7 @@ class NotificationService extends BaseNotificationService { /** * Display a confirmation dialog using NativeScript confirm dialog */ - protected async displayConfirmDialog( - options: DialogOptions - ): Promise { + protected async displayConfirmDialog(options: DialogOptions): Promise { try { const result = await confirm({ title: options.title, @@ -58,11 +52,7 @@ class NotificationService extends BaseNotificationService { return result; } catch (error) { - logger.error( - "NotificationService", - "Error showing confirm dialog:", - error - ); + logger.error("NotificationService", "Error showing confirm dialog:", error); return false; } } diff --git a/packages/app-android/app/services/theme.service.ts b/packages/app-android/app/services/theme.service.ts index dadd2c9f..b9b6b96d 100644 --- a/packages/app-android/app/services/theme.service.ts +++ b/packages/app-android/app/services/theme.service.ts @@ -82,16 +82,13 @@ export class ThemeService extends BaseThemeService { private setupActivityLifecycleHandlers(): void { // Handle activity start - update theme colors (like reference projects) // This ensures dynamic colors are applied on every activity start - Application.android?.on( - Application.android.activityStartedEvent, - (event: any) => { - if (event?.activity) { - this.log.debug("Activity started, updating theme colors"); - // Ensure theme is applied - event.activity.getDelegate().applyDayNight(); - } + Application.android?.on(Application.android.activityStartedEvent, (event: any) => { + if (event?.activity) { + this.log.debug("Activity started, updating theme colors"); + // Ensure theme is applied + event.activity.getDelegate().applyDayNight(); } - ); + }); } /** @@ -108,8 +105,7 @@ export class ThemeService extends BaseThemeService { */ protected applyTheme(mode: ThemeMode): void { try { - const activity = Application.android - .startActivity as androidx.appcompat.app.AppCompatActivity; + const activity = Application.android.startActivity as androidx.appcompat.app.AppCompatActivity; if (!activity) { this.log.error("Could not apply theme, no start activity"); return; @@ -151,18 +147,10 @@ export class ThemeService extends BaseThemeService { private loadThemeFromSettings(): void { try { this.log.debug("Loading theme from settings..."); - const savedTheme = ApplicationSettings.getString( - SETTINGS_THEME, - DEFAULT_THEME - ); + const savedTheme = ApplicationSettings.getString(SETTINGS_THEME, DEFAULT_THEME); this.log.debug("Saved theme:", savedTheme); - if ( - savedTheme && - (savedTheme === "light" || - savedTheme === "dark" || - savedTheme === "system") - ) { + if (savedTheme && (savedTheme === "light" || savedTheme === "dark" || savedTheme === "system")) { this.setTheme(savedTheme as ThemeMode); } else { // Use system theme by default @@ -192,32 +180,28 @@ export class ThemeService extends BaseThemeService { */ private monitorSystemAppearance(): void { // Listen for system appearance changes and apply them - systemStates.events.on( - SystemStates.systemAppearanceChangedEvent, - (event) => { - DEV_LOG && this.log.debug("System appearance changed:", event); - // Only update isDarkTheme if we're in system mode - if (this._currentTheme === "system") { - this._isDarkTheme = systemStates.systemAppearance === "dark"; - this.notifyThemeChanged(); - } + systemStates.events.on(SystemStates.systemAppearanceChangedEvent, (event) => { + DEV_LOG && this.log.debug("System appearance changed:", event); + // Only update isDarkTheme if we're in system mode + if (this._currentTheme === "system") { + this._isDarkTheme = systemStates.systemAppearance === "dark"; + this.notifyThemeChanged(); + } - // Apply day/night mode to the activity - // Like reference projects: use startActivity and call applyDayNight - try { - const activity = Application.android - .startActivity as androidx.appcompat.app.AppCompatActivity; - if (activity) { - activity.getDelegate().applyDayNight(); - } - } catch (error) { - // Silent error - theme changes are non-critical - showError(error, { - silent: true, - }); + // Apply day/night mode to the activity + // Like reference projects: use startActivity and call applyDayNight + try { + const activity = Application.android.startActivity as androidx.appcompat.app.AppCompatActivity; + if (activity) { + activity.getDelegate().applyDayNight(); } + } catch (error) { + // Silent error - theme changes are non-critical + showError(error, { + silent: true, + }); } - ); + }); } /** @@ -225,38 +209,32 @@ export class ThemeService extends BaseThemeService { */ private monitorContrastChanges(): void { // Listen for contrast changes - systemStates.events.on( - SystemStates.contrastChangedEvent, - async (event: ContrastChangeEvent) => { - this.log.debug("contrastChangedEvent", event); - - // WORKAROUND: Flag the app for restart when the contrast mode changes - // (instead of restarting immediately) - if (!event.initial) { - DEV_LOG && - this.log.debug("Contrast changed, flagging for restart on resume"); - this.restartRequiredOnResume = true; - } + systemStates.events.on(SystemStates.contrastChangedEvent, async (event: ContrastChangeEvent) => { + this.log.debug("contrastChangedEvent", event); + + // WORKAROUND: Flag the app for restart when the contrast mode changes + // (instead of restarting immediately) + if (!event.initial) { + DEV_LOG && this.log.debug("Contrast changed, flagging for restart on resume"); + this.restartRequiredOnResume = true; + } - // Update CSS classes for contrast mode - try { - await this.updateContrastClasses(event.newValue); - } catch (error) { - // Silent error - contrast changes are non-critical - showError(error, { - silent: true, - }); - } + // Update CSS classes for contrast mode + try { + await this.updateContrastClasses(event.newValue); + } catch (error) { + // Silent error - contrast changes are non-critical + showError(error, { + silent: true, + }); } - ); + }); } /** * Update CSS classes for the specified contrast mode */ - private async updateContrastClasses( - contrast: ContrastMode | null - ): Promise { + private async updateContrastClasses(contrast: ContrastMode | null): Promise { if (!contrast) return; try { @@ -284,11 +262,7 @@ export class ThemeService extends BaseThemeService { view?._onCssStateChange(); }); - DEV_LOG && - this.log.debug( - "rootView cssClasses", - Array.from(rootView.cssClasses.values()) - ); + DEV_LOG && this.log.debug("rootView cssClasses", Array.from(rootView.cssClasses.values())); } catch (error) { // Silent error - contrast changes are non-critical showError(error, { @@ -302,40 +276,21 @@ export class ThemeService extends BaseThemeService { * These variables can be used throughout the app via var(--safeAreaInset*) * Pattern from reference projects (conty, alpimaps, oss-weather) - using camelCase */ - public updateSafeAreaInsets(insets: { - top: number; - bottom: number; - left: number; - right: number; - }): void { + public updateSafeAreaInsets(insets: { top: number; bottom: number; left: number; right: number }): void { try { const rootViewStyle = Application.getRootView()?.style; if (!rootViewStyle) { - this.log.warn( - "Root view style not available for setting safe area insets" - ); + this.log.warn("Root view style not available for setting safe area insets"); return; } // Set CSS variables using setUnscopedCssVariable (like reference projects) // Using camelCase naming convention like --windowInsetLeft, --actionBarHeight // Values are set without units (NativeScript uses dip automatically) - rootViewStyle.setUnscopedCssVariable( - "--safeAreaInsetTop", - insets.top + "" - ); - rootViewStyle.setUnscopedCssVariable( - "--safeAreaInsetBottom", - insets.bottom + "" - ); - rootViewStyle.setUnscopedCssVariable( - "--safeAreaInsetLeft", - insets.left + "" - ); - rootViewStyle.setUnscopedCssVariable( - "--safeAreaInsetRight", - insets.right + "" - ); + rootViewStyle.setUnscopedCssVariable("--safeAreaInsetTop", insets.top + ""); + rootViewStyle.setUnscopedCssVariable("--safeAreaInsetBottom", insets.bottom + ""); + rootViewStyle.setUnscopedCssVariable("--safeAreaInsetLeft", insets.left + ""); + rootViewStyle.setUnscopedCssVariable("--safeAreaInsetRight", insets.right + ""); // Trigger CSS state change to apply the new variables (pattern from reference projects) // This ensures all views using these CSS variables are re-rendered @@ -344,9 +299,7 @@ export class ThemeService extends BaseThemeService { rootView._onCssStateChange(); const rootModalViews = rootView._getRootModalViews(); if (rootModalViews) { - rootModalViews.forEach((rootModalView) => - rootModalView._onCssStateChange() - ); + rootModalViews.forEach((rootModalView) => rootModalView._onCssStateChange()); } } diff --git a/packages/app-android/app/states/system.states.ts b/packages/app-android/app/states/system.states.ts index c6a6367b..7da49379 100644 --- a/packages/app-android/app/states/system.states.ts +++ b/packages/app-android/app/states/system.states.ts @@ -8,27 +8,15 @@ * Pattern from reference projects: centralized state with EventDispatcher */ -import { - Application, - LaunchEventData, - type SystemAppearanceChangedEventData, - Utils, -} from "@nativescript/core"; -import { - androidLaunchEventLocalizationHandler, - overrideLocale, -} from "@nativescript/localize"; +import { Application, LaunchEventData, type SystemAppearanceChangedEventData, Utils } from "@nativescript/core"; +import { androidLaunchEventLocalizationHandler, overrideLocale } from "@nativescript/localize"; import { EventDispatcher } from "@learn6502/6502"; import { ContrastMode } from "../constants"; // Direct imports to avoid circular dependency (utils/index → color → system.states → utils/index) import { contrastLevelToMode } from "../utils/contrast"; import { logger } from "../utils/logger"; -import type { - ContrastChangeEvent, - SystemAppearanceChangeEvent, - SystemEventsMap, -} from "~/types"; +import type { ContrastChangeEvent, SystemAppearanceChangeEvent, SystemEventsMap } from "~/types"; /** * Class for managing system-related states and events @@ -46,8 +34,7 @@ export class SystemStates { * Event name for property change events * These constants provide string literals for the events defined in SystemEventsMap */ - public static readonly systemAppearanceChangedEvent = - "systemAppearance:changed"; + public static readonly systemAppearanceChangedEvent = "systemAppearance:changed"; public static readonly contrastChangedEvent = "contrast:changed"; public static readonly launchEvent = "launchEvent"; @@ -111,10 +98,8 @@ export class SystemStates { * Initializes theme-related functionality when the app is ready */ public onLaunch(event: LaunchEventData): void { - if (!event.android) - throw new Error("SystemStates:: onLaunch - No Android event found"); - if (this.initialized) - throw new Error("SystemStates:: onLaunch - Already initialized"); + if (!event.android) throw new Error("SystemStates:: onLaunch - No Android event found"); + if (this.initialized) throw new Error("SystemStates:: onLaunch - Already initialized"); this.initialized = true; androidLaunchEventLocalizationHandler(); @@ -128,11 +113,7 @@ export class SystemStates { // Set the default locale for testing, see https://docs.nativescript.org/plugins/localize#changing-the-language-dynamically-at-runtime const localeOverriddenSuccessfully = overrideLocale("de-DE"); - DEV_LOG && - this.log.debug( - "localeOverriddenSuccessfully", - localeOverriddenSuccessfully - ); + DEV_LOG && this.log.debug("localeOverriddenSuccessfully", localeOverriddenSuccessfully); this.events.dispatch("launchEvent", event); @@ -143,20 +124,14 @@ export class SystemStates { // Listen for contrast changes (API 35+) // addContrastChangeListener and getContrast() are only available on Android 15+ (API 35+) if (android.os.Build.VERSION.SDK_INT < 35) { - DEV_LOG && - this.log.debug( - "ContrastChangeListener requires API level 35+, using default contrast" - ); + DEV_LOG && this.log.debug("ContrastChangeListener requires API level 35+, using default contrast"); this.contrast = ContrastMode.NORMAL; return; } const context = Utils.android.getApplicationContext(); if (!context) { - DEV_LOG && - this.log.debug( - "Could not get application context for contrast listener, using default contrast" - ); + DEV_LOG && this.log.debug("Could not get application context for contrast listener, using default contrast"); this.contrast = ContrastMode.NORMAL; return; } @@ -166,10 +141,7 @@ export class SystemStates { ) as android.app.UiModeManager; if (!uiModeManager) { - DEV_LOG && - this.log.debug( - "Could not get UiModeManager service for contrast listener, using default contrast" - ); + DEV_LOG && this.log.debug("Could not get UiModeManager service for contrast listener, using default contrast"); this.contrast = ContrastMode.NORMAL; return; } @@ -177,30 +149,25 @@ export class SystemStates { // Get the main executor to run the callback on the main thread const mainExecutor = context.getMainExecutor(); if (!mainExecutor) { - DEV_LOG && - this.log.debug( - "Could not get main executor for ContrastChangeListener, using default contrast" - ); + DEV_LOG && this.log.debug("Could not get main executor for ContrastChangeListener, using default contrast"); this.contrast = ContrastMode.NORMAL; return; } - const contrastListener = - new android.app.UiModeManager.ContrastChangeListener({ - onContrastChanged: (contrastLevel: number) => { - DEV_LOG && this.log.debug("System contrast changed:", contrastLevel); - // Set the contrast property (this will trigger property change event) - this.contrast = contrastLevelToMode(contrastLevel); - }, - }); + const contrastListener = new android.app.UiModeManager.ContrastChangeListener({ + onContrastChanged: (contrastLevel: number) => { + DEV_LOG && this.log.debug("System contrast changed:", contrastLevel); + // Set the contrast property (this will trigger property change event) + this.contrast = contrastLevelToMode(contrastLevel); + }, + }); // Get initial contrast state and dispatch // getContrast() and addContrastChangeListener() are only available on Android 15+ (API 35+) // Even on API 35+, these methods might not be available on all devices/emulators try { const initialContrast = uiModeManager.getContrast(); - DEV_LOG && - this.log.debug("Initial system contrast level:", initialContrast); + DEV_LOG && this.log.debug("Initial system contrast level:", initialContrast); // Set the contrast property (this will trigger property change event) this.contrast = contrastLevelToMode(initialContrast); @@ -211,9 +178,7 @@ export class SystemStates { // Method might not be available even on API 35+ (e.g., on some devices/emulators) // This is expected and not an error - we just use the default contrast mode DEV_LOG && - this.log.debug( - "Contrast API methods not available on this device/emulator, using default contrast mode" - ); + this.log.debug("Contrast API methods not available on this device/emulator, using default contrast mode"); // Fallback: use default contrast mode this.contrast = ContrastMode.NORMAL; } @@ -224,9 +189,7 @@ export class SystemStates { */ public setupEvents(): void { if (!Application.android) { - throw new Error( - "SystemStates:: setupEvents - No Android application found" - ); + throw new Error("SystemStates:: setupEvents - No Android application found"); } // This registers the onLaunch handler to the native Application event. @@ -234,13 +197,10 @@ export class SystemStates { Application.once(Application.launchEvent, (event) => this.onLaunch(event)); // Listen for theme changes - Application.on( - Application.systemAppearanceChangedEvent, - (event: SystemAppearanceChangedEventData) => { - // Update the systemAppearance property (this will trigger property change event) - this.systemAppearance = event.newValue; - } - ); + Application.on(Application.systemAppearanceChangedEvent, (event: SystemAppearanceChangedEventData) => { + // Update the systemAppearance property (this will trigger property change event) + this.systemAppearance = event.newValue; + }); // Listen for resume events Application.on(Application.resumeEvent, (args) => { diff --git a/packages/app-android/app/types/system-appearance-change-event.ts b/packages/app-android/app/types/system-appearance-change-event.ts index de6afca9..a3ef0fe7 100644 --- a/packages/app-android/app/types/system-appearance-change-event.ts +++ b/packages/app-android/app/types/system-appearance-change-event.ts @@ -3,6 +3,4 @@ import { PropertyChangeEvent } from "./property-change-event"; /** * Interface for system appearance change events */ -export interface SystemAppearanceChangeEvent extends PropertyChangeEvent< - "light" | "dark" | null -> {} +export interface SystemAppearanceChangeEvent extends PropertyChangeEvent<"light" | "dark" | null> {} diff --git a/packages/app-android/app/typings/material.android.d.ts b/packages/app-android/app/typings/material.android.d.ts index 00094bab..ef46a89a 100644 --- a/packages/app-android/app/typings/material.android.d.ts +++ b/packages/app-android/app/typings/material.android.d.ts @@ -22,17 +22,12 @@ declare module com { * * @see https://m3.material.io/components/switch/overview */ - export class MaterialSwitch - extends androidx.appcompat.widget.SwitchCompat - { + export class MaterialSwitch extends androidx.appcompat.widget.SwitchCompat { public static class: java.lang.Class; // Constructors public constructor(param0: globalAndroid.content.Context); - public constructor( - param0: globalAndroid.content.Context, - param1: globalAndroid.util.AttributeSet - ); + public constructor(param0: globalAndroid.content.Context, param1: globalAndroid.util.AttributeSet); public constructor( param0: globalAndroid.content.Context, param1: globalAndroid.util.AttributeSet, @@ -46,58 +41,34 @@ declare module com { ); // Track decoration (border/outline) - public setTrackDecorationTintList( - param0: globalAndroid.content.res.ColorStateList - ): void; + public setTrackDecorationTintList(param0: globalAndroid.content.res.ColorStateList): void; public getTrackDecorationTintList(): globalAndroid.content.res.ColorStateList; - public setTrackDecorationTintMode( - param0: globalAndroid.graphics.PorterDuff.Mode - ): void; + public setTrackDecorationTintMode(param0: globalAndroid.graphics.PorterDuff.Mode): void; public getTrackDecorationTintMode(): globalAndroid.graphics.PorterDuff.Mode; - public setTrackDecorationDrawable( - param0: globalAndroid.graphics.drawable.Drawable - ): void; + public setTrackDecorationDrawable(param0: globalAndroid.graphics.drawable.Drawable): void; public getTrackDecorationDrawable(): globalAndroid.graphics.drawable.Drawable; public setTrackDecorationResource(param0: number): void; // Track - public setTrackTintList( - param0: globalAndroid.content.res.ColorStateList - ): void; + public setTrackTintList(param0: globalAndroid.content.res.ColorStateList): void; public getTrackTintList(): globalAndroid.content.res.ColorStateList; - public setTrackTintMode( - param0: globalAndroid.graphics.PorterDuff.Mode - ): void; - public setTrackDrawable( - param0: globalAndroid.graphics.drawable.Drawable - ): void; + public setTrackTintMode(param0: globalAndroid.graphics.PorterDuff.Mode): void; + public setTrackDrawable(param0: globalAndroid.graphics.drawable.Drawable): void; public getTrackDrawable(): globalAndroid.graphics.drawable.Drawable; // Thumb - public setThumbTintList( - param0: globalAndroid.content.res.ColorStateList - ): void; + public setThumbTintList(param0: globalAndroid.content.res.ColorStateList): void; public getThumbTintList(): globalAndroid.content.res.ColorStateList; - public setThumbTintMode( - param0: globalAndroid.graphics.PorterDuff.Mode - ): void; - public setThumbDrawable( - param0: globalAndroid.graphics.drawable.Drawable - ): void; + public setThumbTintMode(param0: globalAndroid.graphics.PorterDuff.Mode): void; + public setThumbDrawable(param0: globalAndroid.graphics.drawable.Drawable): void; public getThumbDrawable(): globalAndroid.graphics.drawable.Drawable; // Thumb icon (MD3 feature) - public setThumbIconTintList( - param0: globalAndroid.content.res.ColorStateList - ): void; + public setThumbIconTintList(param0: globalAndroid.content.res.ColorStateList): void; public getThumbIconTintList(): globalAndroid.content.res.ColorStateList; - public setThumbIconTintMode( - param0: globalAndroid.graphics.PorterDuff.Mode - ): void; + public setThumbIconTintMode(param0: globalAndroid.graphics.PorterDuff.Mode): void; public getThumbIconTintMode(): globalAndroid.graphics.PorterDuff.Mode; - public setThumbIconDrawable( - param0: globalAndroid.graphics.drawable.Drawable - ): void; + public setThumbIconDrawable(param0: globalAndroid.graphics.drawable.Drawable): void; public getThumbIconDrawable(): globalAndroid.graphics.drawable.Drawable; public setThumbIconResource(param0: number): void; @@ -110,14 +81,10 @@ declare module com { // Accessibility public sendAccessibilityEvent(param0: number): void; - public sendAccessibilityEventUnchecked( - param0: globalAndroid.view.accessibility.AccessibilityEvent - ): void; + public sendAccessibilityEventUnchecked(param0: globalAndroid.view.accessibility.AccessibilityEvent): void; // Drawable callbacks - public invalidateDrawable( - param0: globalAndroid.graphics.drawable.Drawable - ): void; + public invalidateDrawable(param0: globalAndroid.graphics.drawable.Drawable): void; public scheduleDrawable( param0: globalAndroid.graphics.drawable.Drawable, param1: java.lang.Runnable, @@ -127,44 +94,22 @@ declare module com { param0: globalAndroid.graphics.drawable.Drawable, param1: java.lang.Runnable ): void; - public unscheduleDrawable( - param0: globalAndroid.graphics.drawable.Drawable - ): void; + public unscheduleDrawable(param0: globalAndroid.graphics.drawable.Drawable): void; // View methods public invalidate(): void; /** @deprecated */ - public invalidate( - param0: number, - param1: number, - param2: number, - param3: number - ): void; + public invalidate(param0: number, param1: number, param2: number, param3: number): void; /** @deprecated */ public invalidate(param0: globalAndroid.graphics.Rect): void; - public onCreateDrawableState( - param0: number - ): androidNative.Array; + public onCreateDrawableState(param0: number): androidNative.Array; public onPreDraw(): boolean; // Key events - public onKeyDown( - param0: number, - param1: globalAndroid.view.KeyEvent - ): boolean; - public onKeyUp( - param0: number, - param1: globalAndroid.view.KeyEvent - ): boolean; - public onKeyLongPress( - param0: number, - param1: globalAndroid.view.KeyEvent - ): boolean; - public onKeyMultiple( - param0: number, - param1: number, - param2: globalAndroid.view.KeyEvent - ): boolean; + public onKeyDown(param0: number, param1: globalAndroid.view.KeyEvent): boolean; + public onKeyUp(param0: number, param1: globalAndroid.view.KeyEvent): boolean; + public onKeyLongPress(param0: number, param1: globalAndroid.view.KeyEvent): boolean; + public onKeyMultiple(param0: number, param1: number, param2: globalAndroid.view.KeyEvent): boolean; } } } diff --git a/packages/app-android/app/utils/color.ts b/packages/app-android/app/utils/color.ts index 141a27b0..3349d6d2 100644 --- a/packages/app-android/app/utils/color.ts +++ b/packages/app-android/app/utils/color.ts @@ -3,10 +3,7 @@ import { ContrastMode } from "../constants"; import { systemStates } from "../states/system.states"; // Credits https://github.com/henrychavez/nativescript-bottom-navigation/blob/bec186cc2a6dbceec17d59416824207c027e169b/src/lib/android/utils.ts -export function createColorStateList( - activeColor: number, - inactiveColor?: number -) { +export function createColorStateList(activeColor: number, inactiveColor?: number) { const ColorStateList = android.content.res.ColorStateList; if (!inactiveColor) { @@ -17,10 +14,7 @@ export function createColorStateList( stateChecked[0] = android.R.attr.state_checked; const stateUnChecked = Array.create("int", 0); - const states = java.lang.reflect.Array.newInstance( - stateChecked.getClass() || stateUnChecked.getClass(), - 2 - ); + const states = java.lang.reflect.Array.newInstance(stateChecked.getClass() || stateUnChecked.getClass(), 2); states[0] = stateChecked; states[1] = stateUnChecked; @@ -79,10 +73,7 @@ export const getMaterialColor = ( if (contrastMode !== ContrastMode.NORMAL) { const contrastedColorName = `${baseColorName}_${contrastMode}Contrast`; // Check if the contrasted color resource exists - const contrastedResourceId = Utils.android.resources.getResource( - contrastedColorName, - "color" - ); + const contrastedResourceId = Utils.android.resources.getResource(contrastedColorName, "color"); if (contrastedResourceId !== 0) { // Use the contrasted color if it exists diff --git a/packages/app-android/app/utils/error-handler.ts b/packages/app-android/app/utils/error-handler.ts index 952c8dd4..d7a419a0 100644 --- a/packages/app-android/app/utils/error-handler.ts +++ b/packages/app-android/app/utils/error-handler.ts @@ -15,10 +15,7 @@ import { logger } from "./logger"; * Check if an error should be ignored */ function shouldIgnoreError(error: Error | ExtendedError): boolean { - return ( - error instanceof Error && - (error as ExtendedError).customErrorConstructorName === "IgnoreError" - ); + return error instanceof Error && (error as ExtendedError).customErrorConstructorName === "IgnoreError"; } /** @@ -36,27 +33,17 @@ function extractErrorMessage(err: Error | string): string { * Automatically logs errors using the logger utility * Uses NativeScript dialogs for UI */ -export async function showError( - err: unknown, - options: ErrorHandlerOptions = {} -): Promise { +export async function showError(err: unknown, options: ErrorHandlerOptions = {}): Promise { try { if (!err) { return; } - const { - showAsNotification = false, - forcedMessage, - silent = false, - title, - } = options; + const { showAsNotification = false, forcedMessage, silent = false, title } = options; // Convert to Error for consistent handling const error: Error | ExtendedError = - err instanceof Error - ? err - : new Error(typeof err === "string" ? err : String(err)); + err instanceof Error ? err : new Error(typeof err === "string" ? err : String(err)); // Check for ignore flag if (shouldIgnoreError(error)) { @@ -105,10 +92,7 @@ export async function showError( * Replaces global.__errorHandler with better implementation */ export function setupGlobalErrorHandler(): void { - (globalThis as any).__errorHandler = function ( - error: Error | null | undefined, - nativeError?: unknown - ): boolean { + (globalThis as any).__errorHandler = function (error: Error | null | undefined, nativeError?: unknown): boolean { // Log error using logger (automatically handles Error objects) if (error) { logger.error("GlobalErrorHandler", "Global error caught:", error); diff --git a/packages/app-android/app/utils/navigation.ts b/packages/app-android/app/utils/navigation.ts index bd952a3b..b672f521 100644 --- a/packages/app-android/app/utils/navigation.ts +++ b/packages/app-android/app/utils/navigation.ts @@ -5,13 +5,7 @@ * Pattern from reference projects (conty, oss-weather, alpimaps). */ -import { - Application, - Frame, - Page, - View, - type AndroidActivityBackPressedEventData, -} from "@nativescript/core"; +import { Application, Frame, Page, View, type AndroidActivityBackPressedEventData } from "@nativescript/core"; import { logger } from "./logger"; /** @@ -33,21 +27,13 @@ function shouldHandleBackButton(view: View): boolean { // Check for modals let modalParent = view; - const lastModalInStack = (modalParent as any) - ._getRootModalViews?.() - ?.slice(-1)[0]; + const lastModalInStack = (modalParent as any)._getRootModalViews?.()?.slice(-1)[0]; while (modalParent.parent && !(modalParent as any)._modalParent) { modalParent = modalParent.parent as View; } - logger.debug( - "Navigation", - "shouldHandleBackButton", - view.id, - (modalParent as any)._modalParent, - lastModalInStack - ); + logger.debug("Navigation", "shouldHandleBackButton", view.id, (modalParent as any)._modalParent, lastModalInStack); // If there's a modal in the stack that's not the current parent, ignore if (lastModalInStack && lastModalInStack !== modalParent) { @@ -77,65 +63,57 @@ export function handleBackButton(view: View, callback: () => void): boolean { */ export function setupBackButtonHandler(): void { if (!Application.android) { - DEV_LOG && - logger.warn( - "Navigation", - "Android application not available, skipping back button handler setup" - ); + DEV_LOG && logger.warn("Navigation", "Android application not available, skipping back button handler setup"); return; } if (!Application.android.activityBackPressedEvent) { - DEV_LOG && - logger.warn("Navigation", "Activity back pressed event not available"); + DEV_LOG && logger.warn("Navigation", "Activity back pressed event not available"); return; } - Application.android.on( - Application.android.activityBackPressedEvent, - (event: AndroidActivityBackPressedEventData) => { - const rootView = Application.getRootView(); - if (!rootView) { - return; - } + Application.android.on(Application.android.activityBackPressedEvent, (event: AndroidActivityBackPressedEventData) => { + const rootView = Application.getRootView(); + if (!rootView) { + return; + } + + let handled = false; - let handled = false; - - // Try to handle with Frame navigation first - if (rootView instanceof Frame) { - if (rootView.canGoBack()) { - rootView.goBack(); - handled = true; - } - } else { - // Try to handle with view's onBackPressed - const viewArgs = { - eventName: "activityBackPressed", - object: rootView, - activity: event.activity, - cancel: false, - }; - rootView.notify(viewArgs); - - if (viewArgs.cancel || rootView.onBackPressed()) { - handled = true; - } + // Try to handle with Frame navigation first + if (rootView instanceof Frame) { + if (rootView.canGoBack()) { + rootView.goBack(); + handled = true; } + } else { + // Try to handle with view's onBackPressed + const viewArgs = { + eventName: "activityBackPressed", + object: rootView, + activity: event.activity, + cancel: false, + }; + rootView.notify(viewArgs); + + if (viewArgs.cancel || rootView.onBackPressed()) { + handled = true; + } + } - // If handled, cancel the default behavior - if (handled) { + // If handled, cancel the default behavior + if (handled) { + event.cancel = true; + } else { + // If no navigation possible, move app to background + // This follows the pattern from reference projects + const activity = Application.android.foregroundActivity; + if (activity) { + activity.moveTaskToBack(true); event.cancel = true; - } else { - // If no navigation possible, move app to background - // This follows the pattern from reference projects - const activity = Application.android.foregroundActivity; - if (activity) { - activity.moveTaskToBack(true); - event.cancel = true; - } } } - ); + }); logger.debug("Navigation", "Back button handler setup complete"); } diff --git a/packages/app-android/app/utils/system.ts b/packages/app-android/app/utils/system.ts index 5d269c66..86268646 100644 --- a/packages/app-android/app/utils/system.ts +++ b/packages/app-android/app/utils/system.ts @@ -38,10 +38,7 @@ export function restartApp(): void { } // Use flags to clear the existing task and start a new one - intent.addFlags( - android.content.Intent.FLAG_ACTIVITY_NEW_TASK | - android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK - ); + intent.addFlags(android.content.Intent.FLAG_ACTIVITY_NEW_TASK | android.content.Intent.FLAG_ACTIVITY_CLEAR_TASK); // Start the main activity context.startActivity(intent); @@ -62,9 +59,7 @@ export function restartApp(): void { */ export async function getRootViewWhenReady() { try { - const rootView = await waitForFunctionResult( - Application.getRootView.bind(Application) - ); + const rootView = await waitForFunctionResult(Application.getRootView.bind(Application)); log.debug("Root view is ready:", rootView); return rootView; } catch (error) { diff --git a/packages/app-android/app/variables.ts b/packages/app-android/app/variables.ts index 2060b1fa..c1c1ba53 100644 --- a/packages/app-android/app/variables.ts +++ b/packages/app-android/app/variables.ts @@ -24,8 +24,7 @@ class AppVariables { // Screen dimensions (constant after app start) public readonly screenHeightDips = Screen.mainScreen.heightDIPs; public readonly screenWidthDips = Screen.mainScreen.widthDIPs; - public readonly screenRatio = - Screen.mainScreen.widthDIPs / Screen.mainScreen.heightDIPs; + public readonly screenRatio = Screen.mainScreen.widthDIPs / Screen.mainScreen.heightDIPs; // Private backing fields private _actionBarHeight: number = 56; // Default Material action bar height @@ -142,14 +141,9 @@ class AppVariables { const actionBarSizeAttr = 16843499; const typedValue = new android.util.TypedValue(); - if ( - context.getTheme().resolveAttribute(actionBarSizeAttr, typedValue, true) - ) { + if (context.getTheme().resolveAttribute(actionBarSizeAttr, typedValue, true)) { const newHeight = Utils.layout.toDeviceIndependentPixels( - android.util.TypedValue.complexToDimensionPixelSize( - typedValue.data, - context.getResources().getDisplayMetrics() - ) + android.util.TypedValue.complexToDimensionPixelSize(typedValue.data, context.getResources().getDisplayMetrics()) ); if (newHeight > 0 && newHeight !== this._actionBarHeight) { diff --git a/packages/app-android/app/views/main.ts b/packages/app-android/app/views/main.ts index 142f26e9..75bc7b23 100644 --- a/packages/app-android/app/views/main.ts +++ b/packages/app-android/app/views/main.ts @@ -1,10 +1,4 @@ -import { - Page, - ScrollView, - ScrollEventData, - Frame, - Application, -} from "@nativescript/core"; +import { Page, ScrollView, ScrollEventData, Frame, Application } from "@nativescript/core"; import { EventData } from "@nativescript/core"; import { systemStates, SystemStates } from "~/states"; @@ -91,10 +85,7 @@ export class MainController implements MainView { updateDebugger: () => { // Android: update debugger view if available if (gameConsoleView.memory && gameConsoleView.simulator) { - debuggerView.update( - gameConsoleView.memory, - gameConsoleView.simulator - ); + debuggerView.update(gameConsoleView.memory, gameConsoleView.simulator); } }, updateAssemblerViews: (assembler) => { @@ -198,20 +189,14 @@ export class MainController implements MainView { // Find UI elements this.actionBar = this.page.getViewById("main-action-bar"); this.mainButton = this.page.getViewById("mainButton"); - this.bottomNavigation = - this.page.getViewById("bottomNavigation"); + this.bottomNavigation = this.page.getViewById("bottomNavigation"); this.mainFrame = this.page.getViewById("mainFrame"); // Log if bottomNavigation was found - this.log.debug( - `BottomNavigation ${this.bottomNavigation ? "found" : "NOT FOUND"}` - ); + this.log.debug(`BottomNavigation ${this.bottomNavigation ? "found" : "NOT FOUND"}`); // Set up system event listeners - systemStates.events.on( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.on(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); this.onSystemAppearanceChanged({ newValue: systemStates.systemAppearance, oldValue: null, @@ -250,10 +235,7 @@ export class MainController implements MainView { this.mainBridge.disconnect(); // Unsubscribe appearance change handler - systemStates.events.off( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.off(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); } public initFabScrollBehavior(): void { @@ -283,8 +265,7 @@ export class MainController implements MainView { // Calculate scroll position as percentage (0 = top, 1 = bottom) const scrollableHeight = scrollView.scrollableHeight; - const scrollPercentage = - scrollableHeight > 0 ? currentScrollY / scrollableHeight : 0; + const scrollPercentage = scrollableHeight > 0 ? currentScrollY / scrollableHeight : 0; // Material Design 3 Extended FAB behavior: // - At top (scrollPercentage < 0.1): Extended FAB @@ -463,11 +444,7 @@ export class MainController implements MainView { const codeChanged = mainStateController.getCodeChanged(); const currentState = this.state; - const enabledState = mainStateController.getActionEnabledState( - currentState, - hasCode, - codeChanged - ); + const enabledState = mainStateController.getActionEnabledState(currentState, hasCode, codeChanged); // Apply enabled states to button actions this.mainButton.setActionEnabledStates(enabledState); diff --git a/packages/app-android/app/views/main/debugger.ts b/packages/app-android/app/views/main/debugger.ts index fec13450..752b8b67 100644 --- a/packages/app-android/app/views/main/debugger.ts +++ b/packages/app-android/app/views/main/debugger.ts @@ -1,12 +1,4 @@ -import { - EventData, - Page, - GridLayout, - ScrollView, - TextView, - LayoutBase, - Application, -} from "@nativescript/core"; +import { EventData, Page, GridLayout, ScrollView, TextView, LayoutBase, Application } from "@nativescript/core"; import { debuggerController, DebuggerView, @@ -18,13 +10,7 @@ import { import type { Memory, Simulator, Assembler } from "@learn6502/6502"; // Import custom widgets -import { - MessageConsole, - DebugInfo, - HexMonitor, - Hexdump, - Disassembled, -} from "~/widgets/debugger"; +import { MessageConsole, DebugInfo, HexMonitor, Hexdump, Disassembled } from "~/widgets/debugger"; import { notificationService } from "~/services"; import { gameConsoleView } from "./game-console"; @@ -66,20 +52,13 @@ class Debugger implements DebuggerView { this.log.debug(`onNavigatingTo - isInitialized: ${this._isInitialized}`); // Get widget references from XML - this.messageConsole = - this.page.getViewById("messageConsole"); + this.messageConsole = this.page.getViewById("messageConsole"); this.debugInfo = this.page.getViewById("debugInfo"); this.hexMonitor = this.page.getViewById("hexMonitor"); this.hexdump = this.page.getViewById("hexdump"); this.disassembled = this.page.getViewById("disassembled"); - if ( - !this.messageConsole || - !this.debugInfo || - !this.hexMonitor || - !this.hexdump || - !this.disassembled - ) { + if (!this.messageConsole || !this.debugInfo || !this.hexMonitor || !this.hexdump || !this.disassembled) { this.log.error("Failed to find required components in debugger view"); return; } @@ -272,7 +251,6 @@ const debuggerView = new Debugger(); // Export the instance methods for view binding export const onNavigatingTo = debuggerView.onNavigatingTo.bind(debuggerView); -export const onNavigatingFrom = - debuggerView.onNavigatingFrom.bind(debuggerView); +export const onNavigatingFrom = debuggerView.onNavigatingFrom.bind(debuggerView); // Export the instance for external access if needed export { debuggerView }; diff --git a/packages/app-android/app/views/main/editor.ts b/packages/app-android/app/views/main/editor.ts index b7030918..2ffab5fe 100644 --- a/packages/app-android/app/views/main/editor.ts +++ b/packages/app-android/app/views/main/editor.ts @@ -1,15 +1,5 @@ -import { - Observable, - Page, - EventData, - Button, - StackLayout, -} from "@nativescript/core"; -import { - EditorView, - EditorEventMap, - editorController, -} from "@learn6502/common-ui"; +import { Observable, Page, EventData, Button, StackLayout } from "@nativescript/core"; +import { EditorView, EditorEventMap, editorController } from "@learn6502/common-ui"; import { SourceView } from "~/widgets/source-view"; import { EventDispatcher } from "@learn6502/6502"; import { logger } from "~/utils"; @@ -19,8 +9,7 @@ import { logger } from "~/utils"; * Implements the EditorView from common-ui */ class Editor extends Observable implements EditorView { - readonly events: EventDispatcher = - new EventDispatcher(); + readonly events: EventDispatcher = new EventDispatcher(); private _sourceView: SourceView | null = null; private _helpPanel: StackLayout | null = null; @@ -116,9 +105,7 @@ class Editor extends Observable implements EditorView { * Handle controller help visibility changes * @param event The help visibility changed event */ - private onControllerHelpVisibilityChanged = (event: { - visible: boolean; - }): void => { + private onControllerHelpVisibilityChanged = (event: { visible: boolean }): void => { this._helpVisible = event.visible; this.updateHelpPanelUI(); }; @@ -129,9 +116,7 @@ class Editor extends Observable implements EditorView { private updateHelpPanelUI(): void { if (this._helpPanel && this._helpToggleButton) { this._helpPanel.visibility = this._helpVisible ? "visible" : "collapsed"; - this._helpToggleButton.text = this._helpVisible - ? "Hide Help" - : "Show Help"; + this._helpToggleButton.text = this._helpVisible ? "Hide Help" : "Show Help"; } } @@ -167,10 +152,7 @@ class Editor extends Observable implements EditorView { // Subscribe to controller events editorController.events.on("changed", this.onControllerCodeChanged); - editorController.events.on( - "helpVisibilityChanged", - this.onControllerHelpVisibilityChanged - ); + editorController.events.on("helpVisibilityChanged", this.onControllerHelpVisibilityChanged); this._isInitialized = true; } @@ -178,9 +160,7 @@ class Editor extends Observable implements EditorView { // Always restore state when navigating to the view this.restoreState(); } else { - this.log.error( - "SourceView (sourceView) not found on page. Editor will not function correctly." - ); + this.log.error("SourceView (sourceView) not found on page. Editor will not function correctly."); } } diff --git a/packages/app-android/app/views/main/game-console.ts b/packages/app-android/app/views/main/game-console.ts index 48596a9a..1183b64d 100644 --- a/packages/app-android/app/views/main/game-console.ts +++ b/packages/app-android/app/views/main/game-console.ts @@ -1,11 +1,5 @@ import { EventData, Page } from "@nativescript/core"; -import { - type Memory, - type Labels, - type Simulator, - type Assembler, - SimulatorState, -} from "@learn6502/6502"; +import { type Memory, type Labels, type Simulator, type Assembler, SimulatorState } from "@learn6502/6502"; // Import child widgets import { Display, Gamepad } from "~/widgets/game-console"; @@ -228,9 +222,7 @@ export class GameConsole implements GameConsoleView { // Debug output for memory and controller this.log.debug(`Memory initialized (${this._memory ? "ok" : "failed"})`); - this.log.debug( - `Controller memory initialized (${gameConsoleController.memory ? "ok" : "failed"})` - ); + this.log.debug(`Controller memory initialized (${gameConsoleController.memory ? "ok" : "failed"})`); // Initialize display with memory FIRST this._display.initialize(this._memory); @@ -240,10 +232,7 @@ export class GameConsole implements GameConsoleView { // Add test pattern to memory via shared controller AFTER display initialization // This ensures the display is ready to receive and show the pattern - gameConsoleStateService.initializeMemoryWithTestPattern( - this._memory, - "colorChart" - ); + gameConsoleStateService.initializeMemoryWithTestPattern(this._memory, "colorChart"); this.log.debug("Initialization complete"); } diff --git a/packages/app-android/app/views/main/learn.ts b/packages/app-android/app/views/main/learn.ts index 4a99f693..7e1aa4eb 100644 --- a/packages/app-android/app/views/main/learn.ts +++ b/packages/app-android/app/views/main/learn.ts @@ -28,9 +28,7 @@ class Learn implements LearnView { this.tutorialView = this.page.getViewById("tutorialView"); if (!this.tutorialView) { - throw new Error( - "LearnView (Android): TutorialView not found on the page." - ); + throw new Error("LearnView (Android): TutorialView not found on the page."); } if (!this._isInitialized) { diff --git a/packages/app-android/app/views/main/storybook.ts b/packages/app-android/app/views/main/storybook.ts index 0133e04c..bee7bdee 100644 --- a/packages/app-android/app/views/main/storybook.ts +++ b/packages/app-android/app/views/main/storybook.ts @@ -43,11 +43,7 @@ class Storybook { "threeLineItem2", ]; - const selectableItemIds = [ - "selectableItem1", - "selectableItem2", - "selectableItem3", - ]; + const selectableItemIds = ["selectableItem1", "selectableItem2", "selectableItem3"]; // Set up handlers for standard items (non-selectable) this.setupStandardItemHandlers(standardItemIds); @@ -90,9 +86,7 @@ class Storybook { if (item) { item.on(ListItem.tapEvent, () => { item.selected = !item.selected; - this.log.debug( - `List item tapped: ${item.headline}, selected: ${item.selected}` - ); + this.log.debug(`List item tapped: ${item.headline}, selected: ${item.selected}`); }); } else { this.log.warn(`Selectable list item not found with id: ${id}`); @@ -107,23 +101,14 @@ class Storybook { if (!this.page) return; // Define all standalone switch IDs - const switchIds = [ - "switch1", - "switch2", - "switch3", - "switchTertiary", - "switchError", - "switchInteractive", - ]; + const switchIds = ["switch1", "switch2", "switch3", "switchTertiary", "switchError", "switchInteractive"]; // Set up handlers for all standalone switches switchIds.forEach((id) => { const switchView = this.page!.getViewById(id); if (switchView) { switchView.on(Switch.checkedChangeEvent, (args: EventData) => { - this.log.debug( - `Switch ${id} changed: ${(args as EventData & { value: boolean }).value}` - ); + this.log.debug(`Switch ${id} changed: ${(args as EventData & { value: boolean }).value}`); }); } else { this.log.warn(`Switch not found with id: ${id}`); @@ -141,11 +126,7 @@ class Storybook { if (!this.page) return; // Define all list item IDs that have trailing switches - const listItemSwitchIds = [ - "switchListItem", - "darkModeListItem", - "autoUpdateListItem", - ]; + const listItemSwitchIds = ["switchListItem", "darkModeListItem", "autoUpdateListItem"]; // Set up handlers for ListItems with trailing switches listItemSwitchIds.forEach((id) => { @@ -154,9 +135,7 @@ class Storybook { // Handle tap on list item (toggles the switch) listItem.on(ListItem.tapEvent, () => { listItem.trailingSwitchChecked = !listItem.trailingSwitchChecked; - this.log.debug( - `ListItem ${listItem.headline} tapped, switch: ${listItem.trailingSwitchChecked}` - ); + this.log.debug(`ListItem ${listItem.headline} tapped, switch: ${listItem.trailingSwitchChecked}`); }); // Handle switch change directly @@ -174,5 +153,4 @@ class Storybook { const storybookController = new Storybook(); -export const onNavigatingTo = - storybookController.onNavigatingTo.bind(storybookController); +export const onNavigatingTo = storybookController.onNavigatingTo.bind(storybookController); diff --git a/packages/app-android/app/widgets/bottom-navigation.ts b/packages/app-android/app/widgets/bottom-navigation.ts index 473fdb6e..f25a34c3 100644 --- a/packages/app-android/app/widgets/bottom-navigation.ts +++ b/packages/app-android/app/widgets/bottom-navigation.ts @@ -1,10 +1,4 @@ -import { - ContentView, - Property, - Frame, - Utils, - GridLayout, -} from "@nativescript/core"; +import { ContentView, Property, Frame, Utils, GridLayout } from "@nativescript/core"; import { BottomTab } from "./bottom-tab"; import { createColorStateList, getMaterialColor } from "../utils/index"; import { systemStates, SystemStates } from "../states"; @@ -220,18 +214,13 @@ export class BottomNavigation extends ContentView { // Use custom style defined in styles.xml const defStyleAttr = this.context .getResources() - .getIdentifier( - "bottomNavigationStyle", - "attr", - this.context.getPackageName() - ); - - this.bottomNav = - new com.google.android.material.bottomnavigation.BottomNavigationView( - this.context, - null!, - defStyleAttr - ); + .getIdentifier("bottomNavigationStyle", "attr", this.context.getPackageName()); + + this.bottomNav = new com.google.android.material.bottomnavigation.BottomNavigationView( + this.context, + null!, + defStyleAttr + ); this.bottomNav.setClipToPadding(false); @@ -242,22 +231,12 @@ export class BottomNavigation extends ContentView { // CRITICAL: Set initial background color immediately after creation // This prevents any black background from showing during initialization try { - const surfaceContainerColor = getMaterialColor( - "surfaceContainer", - this.context - ); - if ( - surfaceContainerColor !== undefined && - surfaceContainerColor !== null - ) { + const surfaceContainerColor = getMaterialColor("surfaceContainer", this.context); + if (surfaceContainerColor !== undefined && surfaceContainerColor !== null) { this.bottomNav.setBackgroundColor(surfaceContainerColor); } } catch (error) { - logger.error( - "BottomNavigation", - "Error setting initial background color:", - error - ); + logger.error("BottomNavigation", "Error setting initial background color:", error); } // Ensure minimum height for visibility @@ -266,46 +245,35 @@ export class BottomNavigation extends ContentView { // Set label visibility mode this.bottomNav.setLabelVisibilityMode( - com.google.android.material.bottomnavigation.LabelVisibilityMode - .LABEL_VISIBILITY_LABELED + com.google.android.material.bottomnavigation.LabelVisibilityMode.LABEL_VISIBILITY_LABELED ); // Set up item selection listener this.bottomNav.setOnItemSelectedListener( - new com.google.android.material.navigation.NavigationBarView.OnItemSelectedListener( - { - onNavigationItemSelected: ( - menuItem: android.view.MenuItem - ): boolean => { - const menuId = menuItem.getItemId(); - // Find the tab with this menu ID and navigate to its page - for (const [tabId, menuItemId] of this.idToMenuId.entries()) { - if (menuItemId === menuId) { - const tab = this.tabsById.get(tabId); - if (!tab) { - logger.error( - "BottomNavigation", - `onNavigationItemSelected - Tab with ID ${tabId} not found` - ); - return false; - } - this.navigateToTab(tab); - return true; + new com.google.android.material.navigation.NavigationBarView.OnItemSelectedListener({ + onNavigationItemSelected: (menuItem: android.view.MenuItem): boolean => { + const menuId = menuItem.getItemId(); + // Find the tab with this menu ID and navigate to its page + for (const [tabId, menuItemId] of this.idToMenuId.entries()) { + if (menuItemId === menuId) { + const tab = this.tabsById.get(tabId); + if (!tab) { + logger.error("BottomNavigation", `onNavigationItemSelected - Tab with ID ${tabId} not found`); + return false; } + this.navigateToTab(tab); + return true; } - return false; - }, - } - ) + } + return false; + }, + }) ); // Apply current theme this.applyTheme(); - systemStates.events.on( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.on(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); // Process any pending tabs that were added before view creation if (this.pendingTabs.length > 0) { @@ -325,30 +293,17 @@ export class BottomNavigation extends ContentView { // Set background color on the ContentView wrapper itself try { - const surfaceContainerColor = getMaterialColor( - "surfaceContainer", - this.context - ); - if ( - surfaceContainerColor !== undefined && - surfaceContainerColor !== null - ) { + const surfaceContainerColor = getMaterialColor("surfaceContainer", this.context); + if (surfaceContainerColor !== undefined && surfaceContainerColor !== null) { this.nativeViewProtected?.setBackgroundColor(surfaceContainerColor); } } catch (error) { - logger.error( - "BottomNavigation", - "Error setting ContentView background color:", - error - ); + logger.error("BottomNavigation", "Error setting ContentView background color:", error); } // Store base height from XML attribute (default: 80 DIPs) // Note: height might be a string (e.g., "80") or number, so we parse it - const currentHeight = - typeof this.height === "string" - ? parseFloat(this.height) - : (this.height as number) || 0; + const currentHeight = typeof this.height === "string" ? parseFloat(this.height) : (this.height as number) || 0; if (currentHeight > 0) { this.baseHeight = currentHeight; @@ -365,11 +320,7 @@ export class BottomNavigation extends ContentView { ); } } catch (error) { - logger.error( - "BottomNavigation", - "Error logging BottomNavigation dimensions:", - error - ); + logger.error("BottomNavigation", "Error logging BottomNavigation dimensions:", error); } } @@ -377,12 +328,7 @@ export class BottomNavigation extends ContentView { * Called after the view is laid out * Ensures the BottomNavigation has a proper height */ - public onLayout( - left: number, - top: number, - right: number, - bottom: number - ): void { + public onLayout(left: number, top: number, right: number, bottom: number): void { super.onLayout(left, top, right, bottom); // CRITICAL: Force the native view to have a height if it's still 0 @@ -394,8 +340,7 @@ export class BottomNavigation extends ContentView { if (currentHeight === 0 && minHeight > 0) { // Convert pixels to DIPs and set explicit height - const heightInDips = - Utils.layout.toDeviceIndependentPixels(minHeight); + const heightInDips = Utils.layout.toDeviceIndependentPixels(minHeight); this.height = heightInDips; logger.debug( "BottomNavigation", @@ -406,11 +351,7 @@ export class BottomNavigation extends ContentView { } } } catch (error) { - logger.error( - "BottomNavigation", - "Error setting BottomNavigation height in onLayout:", - error - ); + logger.error("BottomNavigation", "Error setting BottomNavigation height in onLayout:", error); } } @@ -426,41 +367,21 @@ export class BottomNavigation extends ContentView { * Applies the current theme colors to the bottom navigation * Called when colors change or system theme changes */ - private applyTheme( - _isDarkMode = systemStates.systemAppearance === "dark" - ): void { + private applyTheme(_isDarkMode = systemStates.systemAppearance === "dark"): void { if (!this.bottomNav) return; logger.debug("BottomNavigation", "applyTheme"); // Get colors using the new properties - const activeTextColor = getMaterialColor( - this._activeTextColor, - this.context - ); - const inactiveTextColor = getMaterialColor( - this._inactiveTextColor, - this.context - ); - const activeIconColor = getMaterialColor( - this._activeIconColor, - this.context - ); - const inactiveIconColor = getMaterialColor( - this._inactiveIconColor, - this.context - ); + const activeTextColor = getMaterialColor(this._activeTextColor, this.context); + const inactiveTextColor = getMaterialColor(this._inactiveTextColor, this.context); + const activeIconColor = getMaterialColor(this._activeIconColor, this.context); + const inactiveIconColor = getMaterialColor(this._inactiveIconColor, this.context); const indicatorColor = getMaterialColor(this._indicatorColor, this.context); // Create separate state lists for text and icons - const textStateList = createColorStateList( - activeTextColor, - inactiveTextColor - ); - const iconStateList = createColorStateList( - activeIconColor, - inactiveIconColor - ); + const textStateList = createColorStateList(activeTextColor, inactiveTextColor); + const iconStateList = createColorStateList(activeIconColor, inactiveIconColor); const indicatorStateList = createColorStateList(indicatorColor); // Apply the state lists @@ -475,10 +396,7 @@ export class BottomNavigation extends ContentView { */ public disposeNativeView(): void { // Remove listeners - systemStates.events.off( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.off(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); this.bottomNav = null!; this.tabsById.clear(); @@ -555,10 +473,7 @@ export class BottomNavigation extends ContentView { */ public selectTab(tabId: string): boolean { if (!this.bottomNav || !this.idToMenuId.has(tabId)) { - logger.debug( - "BottomNavigation", - `selectTab - Tab with ID ${tabId} not found` - ); + logger.debug("BottomNavigation", `selectTab - Tab with ID ${tabId} not found`); return false; } diff --git a/packages/app-android/app/widgets/debugger/debug-info.ts b/packages/app-android/app/widgets/debugger/debug-info.ts index efb6a43a..87234c3b 100644 --- a/packages/app-android/app/widgets/debugger/debug-info.ts +++ b/packages/app-android/app/widgets/debugger/debug-info.ts @@ -46,14 +46,7 @@ export class DebugInfo extends ContentView implements DebugInfoWidget { this.itemPC = componentView.getViewById("itemPC"); this.itemFlags = componentView.getViewById("itemFlags"); - if ( - !this.itemA || - !this.itemX || - !this.itemY || - !this.itemSP || - !this.itemPC || - !this.itemFlags - ) { + if (!this.itemA || !this.itemX || !this.itemY || !this.itemSP || !this.itemPC || !this.itemFlags) { logger.error("DebugInfo", "Failed to find list items in template"); } else { logger.debug("DebugInfo", "All list items loaded successfully"); diff --git a/packages/app-android/app/widgets/debugger/disassembled.ts b/packages/app-android/app/widgets/debugger/disassembled.ts index ac767d9f..0da5186b 100644 --- a/packages/app-android/app/widgets/debugger/disassembled.ts +++ b/packages/app-android/app/widgets/debugger/disassembled.ts @@ -1,8 +1,5 @@ import { TextView } from "@nativescript/core"; -import type { - DisassembledWidget, - DisassembledEventMap, -} from "@learn6502/common-ui"; +import type { DisassembledWidget, DisassembledEventMap } from "@learn6502/common-ui"; import type { Assembler } from "@learn6502/6502"; import { EventDispatcher } from "@learn6502/6502"; @@ -14,8 +11,7 @@ export class Disassembled extends TextView implements DisassembledWidget { constructor() { super(); this.editable = false; - this.className = - "disassembled bg-surface-container text-on-surface font-mono text-xs"; + this.className = "disassembled bg-surface-container text-on-surface font-mono text-xs"; (this as any).textWrap = true; // Add tap gesture for copying diff --git a/packages/app-android/app/widgets/debugger/hex-monitor.ts b/packages/app-android/app/widgets/debugger/hex-monitor.ts index 4527a320..c7bd4ce8 100644 --- a/packages/app-android/app/widgets/debugger/hex-monitor.ts +++ b/packages/app-android/app/widgets/debugger/hex-monitor.ts @@ -1,10 +1,5 @@ import { GridLayout, Label, ScrollView } from "@nativescript/core"; -import type { - HexMonitorWidget, - HexMonitorOptions, - MemoryRegion, - HexMonitorEventMap, -} from "@learn6502/common-ui"; +import type { HexMonitorWidget, HexMonitorOptions, MemoryRegion, HexMonitorEventMap } from "@learn6502/common-ui"; import { memoryRegions } from "@learn6502/common-ui"; import type { Memory } from "@learn6502/6502"; import { EventDispatcher, num2hex, addr2hex } from "@learn6502/6502"; @@ -73,16 +68,9 @@ export class HexMonitor extends ScrollView implements HexMonitorWidget { let currentRow = 0; // Check if range is valid - if ( - isNaN(start) || - isNaN(length) || - start < 0 || - length <= 0 || - end > 0xffff - ) { + if (isNaN(start) || isNaN(length) || start < 0 || length <= 0 || end > 0xffff) { const errorLabel = new Label(); - errorLabel.text = - "Cannot monitor this range. Valid ranges are between $0000 and $ffff."; + errorLabel.text = "Cannot monitor this range. Valid ranges are between $0000 and $ffff."; errorLabel.className = "text-sm text-error p-4"; errorLabel.textWrap = true; errorLabel.row = 0; @@ -102,11 +90,7 @@ export class HexMonitor extends ScrollView implements HexMonitorWidget { this.grid.addChild(addrLabel); // Memory bytes - for ( - let i = 0; - i < bytesPerRow && addr + i <= end && addr + i <= 0xffff; - i++ - ) { + for (let i = 0; i < bytesPerRow && addr + i <= end && addr + i <= 0xffff; i++) { const byteLabel = new Label(); const value = memory.get(addr + i); byteLabel.text = num2hex(value !== undefined ? value : 0); @@ -133,9 +117,7 @@ export class HexMonitor extends ScrollView implements HexMonitorWidget { const { start, length } = this._options; // Find the current region name - const region = this.memoryRegions.find( - (r) => r.start === start && r.length === length - ); + const region = this.memoryRegions.find((r) => r.start === start && r.length === length); const regionName = region ? region.name : `Custom Range`; return memory.format({ diff --git a/packages/app-android/app/widgets/debugger/message-console.ts b/packages/app-android/app/widgets/debugger/message-console.ts index 3a91166c..84f57c44 100644 --- a/packages/app-android/app/widgets/debugger/message-console.ts +++ b/packages/app-android/app/widgets/debugger/message-console.ts @@ -17,9 +17,7 @@ export class MessageConsole extends TextView implements MessageConsoleWidget { public warn(message: string): void { const currentText = this.text || ""; const warningMessage = `⚠️ ${message}`; - const newText = currentText - ? `${currentText}\n${warningMessage}` - : warningMessage; + const newText = currentText ? `${currentText}\n${warningMessage}` : warningMessage; this.text = newText; this.scrollToBottom(); } @@ -27,9 +25,7 @@ export class MessageConsole extends TextView implements MessageConsoleWidget { public error(message: string): void { const currentText = this.text || ""; const errorMessage = `❌ ${message}`; - const newText = currentText - ? `${currentText}\n${errorMessage}` - : errorMessage; + const newText = currentText ? `${currentText}\n${errorMessage}` : errorMessage; this.text = newText; this.scrollToBottom(); } diff --git a/packages/app-android/app/widgets/fab.ts b/packages/app-android/app/widgets/fab.ts index 5928e902..5a6ae6b9 100644 --- a/packages/app-android/app/widgets/fab.ts +++ b/packages/app-android/app/widgets/fab.ts @@ -82,8 +82,7 @@ export class Fab extends ContentView { /** The native Android Extended FAB view */ // Use ExtendedFloatingActionButton to support text labels - private _nativeFab: com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton | null = - null; + private _nativeFab: com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton | null = null; public get nativeFab(): com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton | null { return this._nativeFab; @@ -190,10 +189,7 @@ export class Fab extends ContentView { */ public createNativeView(): android.view.View { // Use ExtendedFloatingActionButton to support text - this._nativeFab = - new com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton( - this.context - ); + this._nativeFab = new com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton(this.context); // Ensure it's clickable this.nativeFab!.setClickable(true); @@ -212,10 +208,7 @@ export class Fab extends ContentView { this.applyIcon(); this.applyText(); - systemStates.events.on( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.on(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); return this.nativeFab!; } @@ -241,15 +234,10 @@ export class Fab extends ContentView { * Applies the current theme colors to the FAB * Called when colors change or system theme changes */ - private applyTheme( - isDarkMode = systemStates.systemAppearance === "dark" - ): void { + private applyTheme(isDarkMode = systemStates.systemAppearance === "dark"): void { if (!this.nativeFab) return; - const backgroundColor = getMaterialColor( - this._containerColor, - this.context - ); + const backgroundColor = getMaterialColor(this._containerColor, this.context); const contentColor = getMaterialColor(this._contentColor, this.context); const backgroundTintList = createColorStateList(backgroundColor); @@ -279,10 +267,7 @@ export class Fab extends ContentView { this.nativeFab.setIcon(null!); // Clear icon if not found } } else if (this._icon) { - logger.warn( - "FAB", - `Icon format not supported (expected res://): ${this._icon}` - ); + logger.warn("FAB", `Icon format not supported (expected res://): ${this._icon}`); this.nativeFab.setIcon(null!); } else { // If no icon is provided, clear it @@ -304,10 +289,7 @@ export class Fab extends ContentView { */ public disposeNativeView(): void { // Remove theme change listener - systemStates.events.off( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.off(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); this._nativeFab = null; super.disposeNativeView(); } diff --git a/packages/app-android/app/widgets/game-console/display.ts b/packages/app-android/app/widgets/game-console/display.ts index 50ff9cc4..e5b8701b 100644 --- a/packages/app-android/app/widgets/game-console/display.ts +++ b/packages/app-android/app/widgets/game-console/display.ts @@ -76,14 +76,10 @@ export class Display extends GridLayout implements DisplayWidget { // Create the ImageView for our canvas this.canvasImageView = new android.widget.ImageView(context); - this.canvasImageView.setScaleType( - android.widget.ImageView.ScaleType.FIT_XY - ); + this.canvasImageView.setScaleType(android.widget.ImageView.ScaleType.FIT_XY); // Create a bitmap and canvas - this.log.debug( - `Creating bitmap with dimensions ${this.canvasWidth}x${this.canvasHeight}` - ); + this.log.debug(`Creating bitmap with dimensions ${this.canvasWidth}x${this.canvasHeight}`); this.bitmap = android.graphics.Bitmap.createBitmap( this.canvasWidth, this.canvasHeight, @@ -136,9 +132,7 @@ export class Display extends GridLayout implements DisplayWidget { this.pendingDraw = false; } } catch (error) { - this.log.error( - `Error in canvas initialization - ${error instanceof Error ? error.message : String(error)}` - ); + this.log.error(`Error in canvas initialization - ${error instanceof Error ? error.message : String(error)}`); } } @@ -213,10 +207,7 @@ export class Display extends GridLayout implements DisplayWidget { } try { - const color = gameConsoleStateService.getColorForAddress( - this.memory, - addr - ); + const color = gameConsoleStateService.getColorForAddress(this.memory, addr); this.paintObj.setARGB( 255, @@ -231,12 +222,7 @@ export class Display extends GridLayout implements DisplayWidget { const right = (x + 1) * this.pixelSize; const bottom = (y + 1) * this.pixelSize; - if ( - left < 0 || - top < 0 || - right > this.canvasWidth || - bottom > this.canvasHeight - ) { + if (left < 0 || top < 0 || right > this.canvasWidth || bottom > this.canvasHeight) { return; } @@ -246,9 +232,7 @@ export class Display extends GridLayout implements DisplayWidget { this.refreshCanvas(); } } catch (error) { - this.log.error( - `Error in drawPixelToCanvas: ${error instanceof Error ? error.message : String(error)}` - ); + this.log.error(`Error in drawPixelToCanvas: ${error instanceof Error ? error.message : String(error)}`); } } @@ -257,9 +241,7 @@ export class Display extends GridLayout implements DisplayWidget { */ private processPendingUpdates(): void { if (this.pendingPixelUpdates.size > 0) { - this.log.debug( - `Processing ${this.pendingPixelUpdates.size} pending pixel updates` - ); + this.log.debug(`Processing ${this.pendingPixelUpdates.size} pending pixel updates`); // Create a copy to avoid modification during iteration const updates = Array.from(this.pendingPixelUpdates); @@ -322,9 +304,7 @@ export class Display extends GridLayout implements DisplayWidget { this.log.debug("drawAllPixels called"); if (!this.canvas) { - this.log.debug( - "drawAllPixels: Canvas is not initialized, will draw when ready" - ); + this.log.debug("drawAllPixels: Canvas is not initialized, will draw when ready"); // Mark that we need to draw when canvas becomes available this.pendingDraw = true; return; @@ -342,11 +322,7 @@ export class Display extends GridLayout implements DisplayWidget { try { // Draw all pixels in the display range - for ( - let addr = DisplayAddressRange.START; - addr <= DisplayAddressRange.END; - addr++ - ) { + for (let addr = DisplayAddressRange.START; addr <= DisplayAddressRange.END; addr++) { this.drawPixelToCanvas(addr, true); } @@ -354,9 +330,7 @@ export class Display extends GridLayout implements DisplayWidget { this.refreshCanvas(); this.log.debug("drawAllPixels - Completed drawing all pixels"); } catch (error) { - this.log.error( - `Error in drawAllPixels: ${error instanceof Error ? error.message : String(error)}` - ); + this.log.error(`Error in drawAllPixels: ${error instanceof Error ? error.message : String(error)}`); } } @@ -372,9 +346,7 @@ export class Display extends GridLayout implements DisplayWidget { try { this.canvasImageView.invalidate(); } catch (error) { - this.log.error( - `Error in refreshCanvas: ${error instanceof Error ? error.message : String(error)}` - ); + this.log.error(`Error in refreshCanvas: ${error instanceof Error ? error.message : String(error)}`); } } diff --git a/packages/app-android/app/widgets/game-console/gamepad.ts b/packages/app-android/app/widgets/game-console/gamepad.ts index 93dd3a0e..c98cd3ed 100644 --- a/packages/app-android/app/widgets/game-console/gamepad.ts +++ b/packages/app-android/app/widgets/game-console/gamepad.ts @@ -1,9 +1,5 @@ import { GridLayout, Button, Builder } from "@nativescript/core"; -import type { - GamepadKey, - GamepadEventMap, - GamepadWidget, -} from "@learn6502/common-ui"; +import type { GamepadKey, GamepadEventMap, GamepadWidget } from "@learn6502/common-ui"; import { getGamepadKeyCode, getGamepadKeyChar } from "@learn6502/common-ui"; import { EventDispatcher } from "@learn6502/6502"; import { logger } from "~/utils"; @@ -51,10 +47,7 @@ export class Gamepad extends GridLayout implements GamepadWidget { public press(keyName: GamepadKey): void { const keyCode = getGamepadKeyCode(keyName); const keyChar = getGamepadKeyChar(keyName); - logger.debug( - "Gamepad", - `Button ${keyName} pressed, keyCode=${keyCode} (ASCII: ${keyChar})` - ); + logger.debug("Gamepad", `Button ${keyName} pressed, keyCode=${keyCode} (ASCII: ${keyChar})`); this.applyPressEffectToButton(keyName); diff --git a/packages/app-android/app/widgets/list-item.ts b/packages/app-android/app/widgets/list-item.ts index 6504c885..aad4e078 100644 --- a/packages/app-android/app/widgets/list-item.ts +++ b/packages/app-android/app/widgets/list-item.ts @@ -1,9 +1,4 @@ -import { - booleanConverter, - ContentView, - Property, - Utils, -} from "@nativescript/core"; +import { booleanConverter, ContentView, Property, Utils } from "@nativescript/core"; import { createColorStateList, getMaterialColor } from "../utils/index"; import { systemStates, SystemStates } from "../states"; import { SystemAppearanceChangeEvent } from "~/types"; @@ -208,10 +203,8 @@ export class ListItem extends ContentView { private _leadingImage!: string; private _trailingText!: string; private _trailingIcon!: string; - private _showTrailingSwitch: boolean = - showTrailingSwitchProperty.defaultValue; - private _trailingSwitchChecked: boolean = - trailingSwitchCheckedProperty.defaultValue; + private _showTrailingSwitch: boolean = showTrailingSwitchProperty.defaultValue; + private _trailingSwitchChecked: boolean = trailingSwitchCheckedProperty.defaultValue; private _containerColor: string = containerColorProperty.defaultValue; private _headlineColor: string = headlineColorProperty.defaultValue; private _supportingColor: string = supportingColorProperty.defaultValue; @@ -451,12 +444,7 @@ export class ListItem extends ContentView { const horizontalPadding = this.dpToPx(16); // Vertical padding: 8dp for one-line, 12dp for two-line, 12dp for three-line const verticalPadding = this.dpToPx(8); - this.contentLayout.setPadding( - horizontalPadding, - verticalPadding, - horizontalPadding, - verticalPadding - ); + this.contentLayout.setPadding(horizontalPadding, verticalPadding, horizontalPadding, verticalPadding); // Set minimum height according to Material Design 3 specs // One-line: 56dp, Two-line: 72dp, Three-line: 88dp @@ -488,30 +476,20 @@ export class ListItem extends ContentView { // Create leading icon ImageView this.leadingIconView = new android.widget.ImageView(this.context); const iconSize = this.dpToPx(24); // Material Design 3: 24dp - const iconLayoutParams = new android.widget.LinearLayout.LayoutParams( - iconSize, - iconSize - ); + const iconLayoutParams = new android.widget.LinearLayout.LayoutParams(iconSize, iconSize); iconLayoutParams.setMarginEnd(this.dpToPx(16)); // 16dp margin to text this.leadingIconView.setLayoutParams(iconLayoutParams); this.leadingIconView.setVisibility(android.view.View.GONE); - this.leadingIconView.setImportantForAccessibility( - android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO - ); + this.leadingIconView.setImportantForAccessibility(android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO); // Create leading image ImageView (for avatars) this.leadingImageView = new android.widget.ImageView(this.context); const imageSize = this.dpToPx(40); // Material Design 3: 40dp for avatars - const imageLayoutParams = new android.widget.LinearLayout.LayoutParams( - imageSize, - imageSize - ); + const imageLayoutParams = new android.widget.LinearLayout.LayoutParams(imageSize, imageSize); imageLayoutParams.setMarginEnd(this.dpToPx(16)); // 16dp margin to text this.leadingImageView.setLayoutParams(imageLayoutParams); this.leadingImageView.setVisibility(android.view.View.GONE); - this.leadingImageView.setImportantForAccessibility( - android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO - ); + this.leadingImageView.setImportantForAccessibility(android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO); // Create text container (vertical layout) this.textLayout = new android.widget.LinearLayout(this.context); @@ -531,20 +509,14 @@ export class ListItem extends ContentView { // Create supporting TextView this.supportingView = new android.widget.TextView(this.context); - this.supportingView.setTextSize( - android.util.TypedValue.COMPLEX_UNIT_SP, - 14 - ); // Material Design 3: 14sp + this.supportingView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 14); // Material Design 3: 14sp this.supportingView.setMaxLines(2); // Default to 2 lines (can be changed for three-line) this.supportingView.setEllipsize(android.text.TextUtils.TruncateAt.END); this.supportingView.setVisibility(android.view.View.GONE); // Create trailing text TextView this.trailingTextView = new android.widget.TextView(this.context); - this.trailingTextView.setTextSize( - android.util.TypedValue.COMPLEX_UNIT_SP, - 12 - ); // Material Design 3: 12sp for trailing text + this.trailingTextView.setTextSize(android.util.TypedValue.COMPLEX_UNIT_SP, 12); // Material Design 3: 12sp for trailing text const trailingTextParams = new android.widget.LinearLayout.LayoutParams( android.widget.LinearLayout.LayoutParams.WRAP_CONTENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT @@ -552,29 +524,19 @@ export class ListItem extends ContentView { trailingTextParams.setMarginStart(this.dpToPx(16)); // 16dp margin from text this.trailingTextView.setLayoutParams(trailingTextParams); this.trailingTextView.setVisibility(android.view.View.GONE); - this.trailingTextView.setImportantForAccessibility( - android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO - ); + this.trailingTextView.setImportantForAccessibility(android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO); // Create trailing icon ImageView this.trailingIconView = new android.widget.ImageView(this.context); const trailingIconSize = this.dpToPx(24); // Material Design 3: 24dp - const trailingIconParams = new android.widget.LinearLayout.LayoutParams( - trailingIconSize, - trailingIconSize - ); + const trailingIconParams = new android.widget.LinearLayout.LayoutParams(trailingIconSize, trailingIconSize); trailingIconParams.setMarginStart(this.dpToPx(16)); // 16dp margin from text this.trailingIconView.setLayoutParams(trailingIconParams); this.trailingIconView.setVisibility(android.view.View.GONE); - this.trailingIconView.setImportantForAccessibility( - android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO - ); + this.trailingIconView.setImportantForAccessibility(android.view.View.IMPORTANT_FOR_ACCESSIBILITY_NO); // Create trailing switch (MaterialSwitch for MD3) - this.trailingSwitchView = - new com.google.android.material.materialswitch.MaterialSwitch( - this.context - ); + this.trailingSwitchView = new com.google.android.material.materialswitch.MaterialSwitch(this.context); const trailingSwitchParams = new android.widget.LinearLayout.LayoutParams( android.widget.LinearLayout.LayoutParams.WRAP_CONTENT, android.widget.LinearLayout.LayoutParams.WRAP_CONTENT @@ -585,10 +547,7 @@ export class ListItem extends ContentView { // Set up checked change listener this.trailingSwitchView.setOnCheckedChangeListener( new android.widget.CompoundButton.OnCheckedChangeListener({ - onCheckedChanged: ( - _buttonView: android.widget.CompoundButton, - isChecked: boolean - ): void => { + onCheckedChanged: (_buttonView: android.widget.CompoundButton, isChecked: boolean): void => { if (!this._isUpdatingSwitch) { this._trailingSwitchChecked = isChecked; this.notify({ @@ -640,10 +599,7 @@ export class ListItem extends ContentView { this.applyDivider(); this.applyAccessibility(); - systemStates.events.on( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.on(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); return this.container; } @@ -661,10 +617,7 @@ export class ListItem extends ContentView { * Called by NativeScript when the view is no longer needed */ public disposeNativeView(): void { - systemStates.events.off( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.off(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); if (this.trailingSwitchView) { this.trailingSwitchView.setOnCheckedChangeListener(null!); } @@ -717,13 +670,7 @@ export class ListItem extends ContentView { } else { // Fallback for older Android versions const outValue = new android.util.TypedValue(); - this.context - .getTheme() - .resolveAttribute( - android.R.attr.selectableItemBackground, - outValue, - true - ); + this.context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true); this.contentLayout.setBackgroundResource(outValue.resourceId); } } catch (error) { @@ -743,9 +690,7 @@ export class ListItem extends ContentView { * Applies the current theme colors to the list item * Called when colors change or system theme changes */ - private applyTheme( - isDarkMode = systemStates.systemAppearance === "dark" - ): void { + private applyTheme(isDarkMode = systemStates.systemAppearance === "dark"): void { try { // Only apply if container is initialized if (!this.container) return; @@ -993,27 +938,15 @@ export class ListItem extends ContentView { try { // Get MD3 colors const checkedTrackColor = getMaterialColor("primary", this.context); - const uncheckedTrackColor = getMaterialColor( - "surfaceContainerHighest", - this.context - ); + const uncheckedTrackColor = getMaterialColor("surfaceContainerHighest", this.context); const checkedThumbColor = getMaterialColor("onPrimary", this.context); const uncheckedThumbColor = getMaterialColor("outline", this.context); const uncheckedBorderColor = getMaterialColor("outline", this.context); // Create color state lists - const trackColorStateList = createColorStateList( - checkedTrackColor, - uncheckedTrackColor - ); - const thumbColorStateList = createColorStateList( - checkedThumbColor, - uncheckedThumbColor - ); - const borderColorStateList = createColorStateList( - checkedTrackColor, - uncheckedBorderColor - ); + const trackColorStateList = createColorStateList(checkedTrackColor, uncheckedTrackColor); + const thumbColorStateList = createColorStateList(checkedThumbColor, uncheckedThumbColor); + const borderColorStateList = createColorStateList(checkedTrackColor, uncheckedBorderColor); // Apply colors this.trailingSwitchView.setTrackTintList(trackColorStateList); @@ -1057,9 +990,7 @@ export class ListItem extends ContentView { private applyDivider(): void { if (!this.dividerView) return; - this.dividerView.setVisibility( - this._showDivider ? android.view.View.VISIBLE : android.view.View.GONE - ); + this.dividerView.setVisibility(this._showDivider ? android.view.View.VISIBLE : android.view.View.GONE); } /** @@ -1102,9 +1033,7 @@ export class ListItem extends ContentView { } // Make the content layout important for accessibility - this.contentLayout.setImportantForAccessibility( - android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES - ); + this.contentLayout.setImportantForAccessibility(android.view.View.IMPORTANT_FOR_ACCESSIBILITY_YES); } catch (error) { logger.error("ListItem", "Failed to apply accessibility", error); } @@ -1116,9 +1045,7 @@ export class ListItem extends ContentView { * @returns The value in pixels */ private dpToPx(dp: number): number { - return Math.round( - dp * this.context.getResources().getDisplayMetrics().density - ); + return Math.round(dp * this.context.getResources().getDisplayMetrics().density); } } diff --git a/packages/app-android/app/widgets/list.ts b/packages/app-android/app/widgets/list.ts index b5e2ec2f..4a2f7e51 100644 --- a/packages/app-android/app/widgets/list.ts +++ b/packages/app-android/app/widgets/list.ts @@ -90,19 +90,13 @@ export class List extends StackLayout { public onLoaded(): void { super.onLoaded(); - systemStates.events.on( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.on(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); this.applyTheme(); } public onUnloaded(): void { - systemStates.events.off( - SystemStates.systemAppearanceChangedEvent, - this.onSystemAppearanceChanged - ); + systemStates.events.off(SystemStates.systemAppearanceChangedEvent, this.onSystemAppearanceChanged); super.onUnloaded(); } diff --git a/packages/app-android/app/widgets/main-button.ts b/packages/app-android/app/widgets/main-button.ts index 033a92bb..a6a93e7f 100644 --- a/packages/app-android/app/widgets/main-button.ts +++ b/packages/app-android/app/widgets/main-button.ts @@ -200,32 +200,16 @@ export class MainButton extends Fab implements MainButtonWidget { * Convenience method to get enabled state for actions * Uses the common helper for consistency across platforms */ - public static getActionEnabledState( - simulatorState: SimulatorState, - hasCode: boolean, - codeChanged: boolean - ) { - return mainStateController.getActionEnabledState( - simulatorState, - hasCode, - codeChanged - ); + public static getActionEnabledState(simulatorState: SimulatorState, hasCode: boolean, codeChanged: boolean) { + return mainStateController.getActionEnabledState(simulatorState, hasCode, codeChanged); } /** * Instance method to get enabled state for actions * Uses the common helper for consistency across platforms */ - public getActionEnabledState( - simulatorState: SimulatorState, - hasCode: boolean, - codeChanged: boolean - ) { - return mainStateController.getActionEnabledState( - simulatorState, - hasCode, - codeChanged - ); + public getActionEnabledState(simulatorState: SimulatorState, hasCode: boolean, codeChanged: boolean) { + return mainStateController.getActionEnabledState(simulatorState, hasCode, codeChanged); } /** diff --git a/packages/app-android/app/widgets/source-view.ts b/packages/app-android/app/widgets/source-view.ts index ffc18c57..a97f345b 100644 --- a/packages/app-android/app/widgets/source-view.ts +++ b/packages/app-android/app/widgets/source-view.ts @@ -1,22 +1,7 @@ -import { - ContentView, - Property, - TextView, - Builder, - booleanConverter, - Color, - Button, -} from "@nativescript/core"; +import { ContentView, Property, TextView, Builder, booleanConverter, Color, Button } from "@nativescript/core"; import { debounce, EventDispatcher } from "@learn6502/6502"; -import type { - SourceViewEventMap, - SourceViewWidget, -} from "@learn6502/common-ui"; -import { - OPCODE_PATTERN, - COMMENT_PATTERN, - HEX_VALUE_PATTERN, -} from "@learn6502/common-ui"; +import type { SourceViewEventMap, SourceViewWidget } from "@learn6502/common-ui"; +import { OPCODE_PATTERN, COMMENT_PATTERN, HEX_VALUE_PATTERN } from "@learn6502/common-ui"; import { logger } from "~/utils"; export class SourceView extends ContentView implements SourceViewWidget { @@ -53,8 +38,7 @@ export class SourceView extends ContentView implements SourceViewWidget { // Editable state is handled by template binding: editable="{{ editable }}" // But we still need to handle native Android-specific properties if (target.textView && target.textView.android) { - const nativeEditText = target.textView - .android as android.widget.EditText; + const nativeEditText = target.textView.android as android.widget.EditText; nativeEditText.setEnabled(newValue); } }, @@ -79,8 +63,7 @@ export class SourceView extends ContentView implements SourceViewWidget { valueChanged(target, oldValue, newValue) { target._selectable = newValue; if (target.textView && target.textView.android) { - const nativeEditText = target.textView - .android as android.widget.EditText; + const nativeEditText = target.textView.android as android.widget.EditText; nativeEditText.setTextIsSelectable(newValue); nativeEditText.setCursorVisible(newValue); nativeEditText.setFocusable(newValue); @@ -118,8 +101,7 @@ export class SourceView extends ContentView implements SourceViewWidget { }); // Instance properties - public - readonly events: EventDispatcher = - new EventDispatcher(); + readonly events: EventDispatcher = new EventDispatcher(); // Instance properties - private private debouncedHighlighting: (code: string) => void; @@ -313,8 +295,7 @@ export class SourceView extends ContentView implements SourceViewWidget { }); this.textView = componentView.getViewById("textView"); - this.lineNumbersView = - componentView.getViewById("lineNumbersView"); + this.lineNumbersView = componentView.getViewById("lineNumbersView"); this.copyButton = componentView.getViewById