From beebcbf753788514652e1e48287043b80a3cac9b Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 15 Dec 2025 14:36:14 -0500 Subject: [PATCH 01/87] added bun2nix template --- bun.lock | 40 +++++++++++++++++++++++ bun.nix | 36 +++++++++++++++++++++ bunfig.toml | 2 ++ default.nix | 16 +++++++++ flake.nix | 68 +++++++++++++++++++++++++++++++++++++++ package.json | 12 +++++++ packages/app/index.js | 8 +++++ packages/app/package.json | 10 ++++++ packages/lib/index.js | 10 ++++++ packages/lib/package.json | 7 ++++ 10 files changed, 209 insertions(+) create mode 100644 bun.lock create mode 100644 bun.nix create mode 100644 bunfig.toml create mode 100644 default.nix create mode 100644 flake.nix create mode 100644 package.json create mode 100644 packages/app/index.js create mode 100644 packages/app/package.json create mode 100644 packages/lib/index.js create mode 100644 packages/lib/package.json diff --git a/bun.lock b/bun.lock new file mode 100644 index 0000000..042bf8a --- /dev/null +++ b/bun.lock @@ -0,0 +1,40 @@ +{ + "lockfileVersion": 1, + "workspaces": { + "": { + "name": "test-workspace", + "devDependencies": { + "bun2nix": "^2.0.0", + }, + }, + "packages/app": { + "name": "@workspace/app", + "version": "1.0.0", + "dependencies": { + "@workspace/lib": "workspace:*", + }, + }, + "packages/lib": { + "name": "@workspace/lib", + "version": "1.0.0", + "dependencies": { + "is-odd": "^3.0.1", + }, + }, + }, + "packages": { + "@workspace/app": ["@workspace/app@workspace:packages/app"], + + "@workspace/lib": ["@workspace/lib@workspace:packages/lib"], + + "bun2nix": ["bun2nix@2.0.0", "", { "dependencies": { "sade": "^1.8.1" }, "bin": { "bun2nix": "index.ts" } }, "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="], + + "is-number": ["is-number@6.0.0", "", {}, "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg=="], + + "is-odd": ["is-odd@3.0.1", "", { "dependencies": { "is-number": "^6.0.0" } }, "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA=="], + + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + } +} diff --git a/bun.nix b/bun.nix new file mode 100644 index 0000000..531afc3 --- /dev/null +++ b/bun.nix @@ -0,0 +1,36 @@ +# Autogenerated by `bun2nix`, editing manually is not recommended +# +# Set of Bun packages to install +# +# Consume this with `fetchBunDeps` (recommended) +# or `pkgs.callPackage` if you wish to handle +# it manually. +{ + copyPathToStore, + fetchurl, + ... +}: +{ + "@workspace/app" = copyPathToStore ./packages/app; + "@workspace/lib" = copyPathToStore ./packages/lib; + "bun2nix@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; + hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; + }; + "is-number@6.0.0" = fetchurl { + url = "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz"; + hash = "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg=="; + }; + "is-odd@3.0.1" = fetchurl { + url = "https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz"; + hash = "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA=="; + }; + "mri@1.2.0" = fetchurl { + url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; + hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; + }; + "sade@1.8.1" = fetchurl { + url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; + hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; + }; +} diff --git a/bunfig.toml b/bunfig.toml new file mode 100644 index 0000000..641e878 --- /dev/null +++ b/bunfig.toml @@ -0,0 +1,2 @@ +[install] +linker = "isolated" diff --git a/default.nix b/default.nix new file mode 100644 index 0000000..076b237 --- /dev/null +++ b/default.nix @@ -0,0 +1,16 @@ +{ + bun2nix, + ... +}: +bun2nix.mkDerivation { + pname = "workspace-test-app"; + version = "1.0.0"; + + src = ./.; + + bunDeps = bun2nix.fetchBunDeps { + bunNix = ./bun.nix; + }; + + module = "packages/app/index.js"; +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..d83e10b --- /dev/null +++ b/flake.nix @@ -0,0 +1,68 @@ +{ + description = "Bun2Nix workspace sample"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + flake-utils.url = "github:numtide/flake-utils"; + systems.url = "github:nix-systems/default"; + + bun2nix.url = "github:nix-community/bun2nix?tag=2.0.6"; + bun2nix.inputs.nixpkgs.follows = "nixpkgs"; + bun2nix.inputs.systems.follows = "systems"; + }; + + # Use the cached version of bun2nix from the nix-community cli + nixConfig = { + extra-substituters = [ + "https://cache.nixos.org" + "https://nix-community.cachix.org" + ]; + extra-trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; + }; + + outputs = + inputs: + let + # Read each system from the nix-systems input + eachSystem = inputs.nixpkgs.lib.genAttrs (import inputs.systems); + + # Access the package set for a given system + pkgsFor = eachSystem ( + system: + import inputs.nixpkgs { + inherit system; + # Use the bun2nix overlay, which puts `bun2nix` in pkgs + # You can, of course, still access + # inputs.bun2nix.packages.${system}.default instead + # and use that to build your package instead + overlays = [ inputs.bun2nix.overlays.default ]; + } + ); + in + { + packages = eachSystem (system: { + # Produce a package for this template with bun2nix in + # the overlay + default = pkgsFor.${system}.callPackage ./default.nix { }; + }); + + devShells = eachSystem (system: { + default = pkgsFor.${system}.mkShell { + packages = with pkgsFor.${system}; [ + bun + + # Add the bun2nix binary to our devshell + # Optional now that we have a binary on npm + bun2nix + ]; + + shellHook = '' + bun install --frozen-lockfile + ''; + }; + }); + }; +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..faa57b5 --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "flatmmo-userscripts-workspace", + "workspaces": [ + "packages/*" + ], + "scripts": { + "postinstall": "bun2nix -o bun.nix" + }, + "devDependencies": { + "bun2nix": "^2.0.0" + } +} diff --git a/packages/app/index.js b/packages/app/index.js new file mode 100644 index 0000000..590919e --- /dev/null +++ b/packages/app/index.js @@ -0,0 +1,8 @@ +import { isEven, isOdd } from "@workspace/lib"; + +const RESET_COLOUR = "\x1b[0m"; + +console.log(`${Bun.color("blue", "ansi")}Testing workspace dependency:`); +console.log(`${RESET_COLOUR}Is 3 odd? ${isOdd(3)}`); +console.log(`${RESET_COLOUR}Is 4 even? ${isEven(4)}`); +console.log(`${Bun.color("green", "ansi")}Success!`); diff --git a/packages/app/package.json b/packages/app/package.json new file mode 100644 index 0000000..4ea3792 --- /dev/null +++ b/packages/app/package.json @@ -0,0 +1,10 @@ +{ + "name": "@workspace/app", + "version": "1.0.0", + "scripts": { + "build": "bun build --compile --minify-whitespace --minify-syntax --targetbun --outfile dist/app ./index.js" + }, + "dependencies": { + "@workspace/lib": "workspace:*" + } +} diff --git a/packages/lib/index.js b/packages/lib/index.js new file mode 100644 index 0000000..ab563ee --- /dev/null +++ b/packages/lib/index.js @@ -0,0 +1,10 @@ +const isOdd = require("is-odd"); + +function isEven(num) { + return !isOdd(num); +} + +module.exports = { + isOdd, + isEven, +}; diff --git a/packages/lib/package.json b/packages/lib/package.json new file mode 100644 index 0000000..29e5559 --- /dev/null +++ b/packages/lib/package.json @@ -0,0 +1,7 @@ +{ + "name": "@workspace/lib", + "version": "1.0.0", + "dependencies": { + "is-odd": "^3.0.1" + } +} From 4fdebb4bebeea4348c541711ef39e8f80b28b932 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 15 Dec 2025 15:12:20 -0500 Subject: [PATCH 02/87] fixed flake input format --- bun.nix | 22 ++++--- flake.lock | 174 +++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 4 +- 3 files changed, 188 insertions(+), 12 deletions(-) create mode 100644 flake.lock diff --git a/bun.nix b/bun.nix index 531afc3..efb173e 100644 --- a/bun.nix +++ b/bun.nix @@ -7,6 +7,8 @@ # it manually. { copyPathToStore, + fetchFromGitHub, + fetchgit, fetchurl, ... }: @@ -14,23 +16,23 @@ "@workspace/app" = copyPathToStore ./packages/app; "@workspace/lib" = copyPathToStore ./packages/lib; "bun2nix@2.0.0" = fetchurl { - url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; - hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; + url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; + hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; }; "is-number@6.0.0" = fetchurl { - url = "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz"; - hash = "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg=="; + url = "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz"; + hash = "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg=="; }; "is-odd@3.0.1" = fetchurl { - url = "https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz"; - hash = "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA=="; + url = "https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz"; + hash = "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA=="; }; "mri@1.2.0" = fetchurl { - url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; - hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; + url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; + hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; }; "sade@1.8.1" = fetchurl { - url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; - hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; + url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; + hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; }; } diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..9374252 --- /dev/null +++ b/flake.lock @@ -0,0 +1,174 @@ +{ + "nodes": { + "bun2nix": { + "inputs": { + "flake-parts": "flake-parts", + "import-tree": "import-tree", + "nixpkgs": [ + "nixpkgs" + ], + "systems": [ + "systems" + ], + "treefmt-nix": "treefmt-nix" + }, + "locked": { + "lastModified": 1765197994, + "narHash": "sha256-+LEKD7ZugdvW7pwgXbgaZdN8z4I3BkWjcur42o0Ud2g=", + "owner": "nix-community", + "repo": "bun2nix", + "rev": "ca7f1244410252e8dd70252c53b3d46d06363066", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "2.0.6", + "repo": "bun2nix", + "type": "github" + } + }, + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1763759067, + "narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "import-tree": { + "locked": { + "lastModified": 1763762820, + "narHash": "sha256-ZvYKbFib3AEwiNMLsejb/CWs/OL/srFQ8AogkebEPF0=", + "owner": "vic", + "repo": "import-tree", + "rev": "3c23749d8013ec6daa1d7255057590e9ca726646", + "type": "github" + }, + "original": { + "owner": "vic", + "repo": "import-tree", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1765472234, + "narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1761765539, + "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "root": { + "inputs": { + "bun2nix": "bun2nix", + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "systems": "systems_2" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "treefmt-nix": { + "inputs": { + "nixpkgs": [ + "bun2nix", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1762938485, + "narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix index d83e10b..5809a5d 100644 --- a/flake.nix +++ b/flake.nix @@ -2,11 +2,11 @@ description = "Bun2Nix workspace sample"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; flake-utils.url = "github:numtide/flake-utils"; systems.url = "github:nix-systems/default"; - bun2nix.url = "github:nix-community/bun2nix?tag=2.0.6"; + bun2nix.url = "github:nix-community/bun2nix/2.0.6"; bun2nix.inputs.nixpkgs.follows = "nixpkgs"; bun2nix.inputs.systems.follows = "systems"; }; From f2a119d8a9512c908bc79d08315d9bd33a2b5676 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 15 Dec 2025 17:28:15 -0500 Subject: [PATCH 03/87] messy wip tooling setup --- .gitignore | 119 +++++++++++++ bun.lock | 19 +- bun.nix | 14 +- flake.lock | 34 ++++ flake.nix | 75 ++++---- package.json | 4 +- packages/app/package.json | 10 -- .../better-custom-hotkeys.user.js | 0 packages/better-custom-hotkeys/index.d.ts | 2 + packages/better-custom-hotkeys/index.d.ts.map | 1 + packages/better-custom-hotkeys/index.js | 153 ++++++++++++++++ packages/better-custom-hotkeys/index.js.map | 1 + packages/better-custom-hotkeys/index.ts | 164 ++++++++++++++++++ packages/better-custom-hotkeys/package.json | 11 ++ ...ground-item-monster-click-conflict.user.js | 0 .../draw-player-on-top.user.js | 0 .../wiki/header-links.user.js | 0 .../wiki/image-links.user.js | 0 .../wiki/table-links.user.js | 0 tsconfig.json | 44 +++++ 20 files changed, 597 insertions(+), 54 deletions(-) create mode 100644 .gitignore delete mode 100644 packages/app/package.json rename better-custom-hotkeys.user.js => packages/better-custom-hotkeys/better-custom-hotkeys.user.js (100%) create mode 100644 packages/better-custom-hotkeys/index.d.ts create mode 100644 packages/better-custom-hotkeys/index.d.ts.map create mode 100644 packages/better-custom-hotkeys/index.js create mode 100644 packages/better-custom-hotkeys/index.js.map create mode 100644 packages/better-custom-hotkeys/index.ts create mode 100644 packages/better-custom-hotkeys/package.json rename fix-ground-item-monster-click-conflict.user.js => packages/click-conflict/fix-ground-item-monster-click-conflict.user.js (100%) rename draw-player-on-top.user.js => packages/draw-player-on-top/draw-player-on-top.user.js (100%) rename header-links.user.js => packages/wiki/header-links.user.js (100%) rename image-links.user.js => packages/wiki/image-links.user.js (100%) rename table-links.user.js => packages/wiki/table-links.user.js (100%) create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f306bbd --- /dev/null +++ b/.gitignore @@ -0,0 +1,119 @@ +# Ignore build outputs from performing a nix-build or `nix build` command +result +result-* + +# Ignore automatically generated direnv output +.direnv +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# database +*.sqlite + +# package-json +package-json.lock + +# bun deploy file +node_modules.bun + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port diff --git a/bun.lock b/bun.lock index 042bf8a..0df8ecb 100644 --- a/bun.lock +++ b/bun.lock @@ -1,17 +1,20 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "test-workspace", "devDependencies": { + "@violentmonkey/types": "^0.3.1", "bun2nix": "^2.0.0", + "typescript": "^5.9.3", }, }, - "packages/app": { - "name": "@workspace/app", + "packages/better-custom-hotkeys": { + "name": "@workspace/better-custom-hotkeys", "version": "1.0.0", - "dependencies": { - "@workspace/lib": "workspace:*", + "devDependencies": { + "@violentmonkey/types": "^0.3.1", }, }, "packages/lib": { @@ -23,7 +26,9 @@ }, }, "packages": { - "@workspace/app": ["@workspace/app@workspace:packages/app"], + "@violentmonkey/types": ["@violentmonkey/types@0.3.1", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="], + + "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], "@workspace/lib": ["@workspace/lib@workspace:packages/lib"], @@ -36,5 +41,9 @@ "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + + "user-agent-data-types": ["user-agent-data-types@0.4.2", "", {}, "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="], } } diff --git a/bun.nix b/bun.nix index efb173e..b1d94ae 100644 --- a/bun.nix +++ b/bun.nix @@ -13,7 +13,11 @@ ... }: { - "@workspace/app" = copyPathToStore ./packages/app; + "@violentmonkey/types@0.3.1" = fetchurl { + url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.1.tgz"; + hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; + }; + "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; "@workspace/lib" = copyPathToStore ./packages/lib; "bun2nix@2.0.0" = fetchurl { url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; @@ -35,4 +39,12 @@ url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; }; + "typescript@5.9.3" = fetchurl { + url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; + hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; + }; + "user-agent-data-types@0.4.2" = fetchurl { + url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; + hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; + }; } diff --git a/flake.lock b/flake.lock index 9374252..943565a 100644 --- a/flake.lock +++ b/flake.lock @@ -45,6 +45,24 @@ "type": "github" } }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_2" + }, + "locked": { + "lastModified": 1765835352, + "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "a34fae9c08a15ad73f295041fec82323541400a9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "flake-utils": { "inputs": { "systems": "systems" @@ -109,9 +127,25 @@ "type": "github" } }, + "nixpkgs-lib_2": { + "locked": { + "lastModified": 1761765539, + "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, "root": { "inputs": { "bun2nix": "bun2nix", + "flake-parts": "flake-parts_2", "flake-utils": "flake-utils", "nixpkgs": "nixpkgs", "systems": "systems_2" diff --git a/flake.nix b/flake.nix index 5809a5d..ac77101 100644 --- a/flake.nix +++ b/flake.nix @@ -3,12 +3,13 @@ inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; systems.url = "github:nix-systems/default"; bun2nix.url = "github:nix-community/bun2nix/2.0.6"; bun2nix.inputs.nixpkgs.follows = "nixpkgs"; bun2nix.inputs.systems.follows = "systems"; + + flake-parts.url = "github:hercules-ci/flake-parts"; }; # Use the cached version of bun2nix from the nix-community cli @@ -24,45 +25,45 @@ }; outputs = - inputs: - let - # Read each system from the nix-systems input - eachSystem = inputs.nixpkgs.lib.genAttrs (import inputs.systems); - - # Access the package set for a given system - pkgsFor = eachSystem ( - system: - import inputs.nixpkgs { - inherit system; - # Use the bun2nix overlay, which puts `bun2nix` in pkgs - # You can, of course, still access - # inputs.bun2nix.packages.${system}.default instead - # and use that to build your package instead - overlays = [ inputs.bun2nix.overlays.default ]; - } - ); - in - { - packages = eachSystem (system: { - # Produce a package for this template with bun2nix in - # the overlay - default = pkgsFor.${system}.callPackage ./default.nix { }; - }); + inputs@{ + flake-parts, + nixpkgs, + bun2nix, + ... + }: - devShells = eachSystem (system: { - default = pkgsFor.${system}.mkShell { - packages = with pkgsFor.${system}; [ - bun + flake-parts.lib.mkFlake { inherit inputs; } { + systems = [ + "x86_64-linux" + "aarch64-darwin" + ]; + perSystem = + { pkgs, system, ... }: + { + # This sets `pkgs` to a nixpkgs with allowUnfree option set. + _module.args.pkgs = import nixpkgs { + inherit system; + config.allowUnfree = true; + overlays = [ inputs.bun2nix.overlays.default ]; + }; - # Add the bun2nix binary to our devshell - # Optional now that we have a binary on npm - bun2nix - ]; + packages = { + # Produce a package for this template with bun2nix in + # the overlay + default = pkgs.callPackage ./default.nix { }; + }; + devShells.default = pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + bun + # Add the bun2nix binary to our devshell + # Optional now that we have a binary on npm + bun2nix.packages.${system}.default + ]; - shellHook = '' - bun install --frozen-lockfile - ''; + shellHook = '' + bun install --frozen-lockfile + ''; + }; }; - }); }; } diff --git a/package.json b/package.json index faa57b5..280558b 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,8 @@ "postinstall": "bun2nix -o bun.nix" }, "devDependencies": { - "bun2nix": "^2.0.0" + "@violentmonkey/types": "^0.3.1", + "bun2nix": "^2.0.0", + "typescript": "^5.9.3" } } diff --git a/packages/app/package.json b/packages/app/package.json deleted file mode 100644 index 4ea3792..0000000 --- a/packages/app/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "@workspace/app", - "version": "1.0.0", - "scripts": { - "build": "bun build --compile --minify-whitespace --minify-syntax --targetbun --outfile dist/app ./index.js" - }, - "dependencies": { - "@workspace/lib": "workspace:*" - } -} diff --git a/better-custom-hotkeys.user.js b/packages/better-custom-hotkeys/better-custom-hotkeys.user.js similarity index 100% rename from better-custom-hotkeys.user.js rename to packages/better-custom-hotkeys/better-custom-hotkeys.user.js diff --git a/packages/better-custom-hotkeys/index.d.ts b/packages/better-custom-hotkeys/index.d.ts new file mode 100644 index 0000000..e26a57a --- /dev/null +++ b/packages/better-custom-hotkeys/index.d.ts @@ -0,0 +1,2 @@ +export {}; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/better-custom-hotkeys/index.d.ts.map b/packages/better-custom-hotkeys/index.d.ts.map new file mode 100644 index 0000000..82335e7 --- /dev/null +++ b/packages/better-custom-hotkeys/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/better-custom-hotkeys/index.js b/packages/better-custom-hotkeys/index.js new file mode 100644 index 0000000..cae9696 --- /dev/null +++ b/packages/better-custom-hotkeys/index.js @@ -0,0 +1,153 @@ +"use strict"; +// ==UserScript== +// @name Better hotkeys +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.001 +// @author Joshu +// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. +// @inject-into page +// ==/UserScript== +Object.defineProperty(exports, "__esModule", { value: true }); +// User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) +const HOTKEY_CONFIG = { + [GM_getValue('hotkey_worship', '1')]: { + originalKey: 'F1', + description: 'Worship - Activates the Run worship ability' + }, + [GM_getValue('hotkey_consumeFood', '2')]: { + originalKey: 'F2', + description: 'Inventory - Consumes a piece of food' + }, + [GM_getValue('hotkey_lightFire', '3')]: { + originalKey: 'F3', + description: 'Inventory - Lights a fire' + }, + [GM_getValue('hotkey_autoEquip1', 'q')]: { + originalKey: 'F6', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_autoEquip2', 'w')]: { + originalKey: 'F7', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_autoEquip3', 'e')]: { + originalKey: 'F8', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_badge1', 'a')]: { + originalKey: 'F9', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge2', 's')]: { + originalKey: 'F10', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge3', 'd')]: { + originalKey: 'F11', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge4', 'f')]: { + originalKey: 'F12', + description: 'Badge - Right click a badge and click the \'set key binding\'' + } +}; +//can be from canvas or chat input +const focusOrSendChat = () => { + const value = chat_ele.value.trim(); + if (document.activeElement !== chat_ele) { + request_focus_chatbox(); + return; + } + if (value !== "") { + Globals.websocket.send('CHAT=' + value); + chat_ele.value = ""; + } + request_unfocus_chatbox(); +}; +// Just leaving this section the same as the OG as much as possible +const handleNpcChatModal = (e) => { + let keyCode = e.keyCode; + if (has_npc_chat_message_modal_open()) { + if (keyCode == 32) { + document.getElementById("npc-chat-message-modal-continue-btn").click(); + e.preventDefault(); + } + return; + } + if (has_npc_chat_options_modal_open()) { + switch (keyCode) { + case 49: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if (options[0].style.display != 'none') { + options[0].click(); + } + } + break; + case 50: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if (options[1].style.display != 'none') { + options[1].click(); + } + } + break; + case 51: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if (options[2].style.display != 'none') { + options[2].click(); + } + } + break; + case 52: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if (options[3].style.display != 'none') { + options[3].click(); + } + } + break; + } + } +}; +const hotkeyListener = (e) => { + if (e.repeat) + return; + // Checks from original handler + if (Globals.local_username == null) + return; + if (has_npc_chat_message_modal_open()) { + handleNpcChatModal(e); + return; + } + if (has_modal_open()) + return; + if (e.key === "Enter") { + focusOrSendChat(); + e.preventDefault(); + } + if (document.activeElement.id != "body") { + return; + } + if (e.key === "/") { + chat_ele.value = '/'; + request_focus_chatbox(); + e.preventDefault(); + } + if (e.key in HOTKEY_CONFIG) { + const pressedHotkey = HOTKEY_CONFIG[e.key]; + Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`); + e.preventDefault(); + } +}; +window.removeEventListener("keypress", keypress_listener); +window.addEventListener("keydown", hotkeyListener, false); +//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/better-custom-hotkeys/index.js.map b/packages/better-custom-hotkeys/index.js.map new file mode 100644 index 0000000..e12c2f5 --- /dev/null +++ b/packages/better-custom-hotkeys/index.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAEA,iBAAiB;AACjB,8BAA8B;AAC9B,qCAAqC;AACrC,6CAA6C;AAC7C,2BAA2B;AAC3B,2BAA2B;AAC3B,qBAAqB;AACrB,qBAAqB;AACrB,4HAA4H;AAC5H,oBAAoB;AACpB,kBAAkB;;AAElB,uFAAuF;AACvF,MAAM,aAAa,GAAG;IACpB,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,EAAE;QACpC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,6CAA6C;KAC3D;IACD,CAAC,WAAW,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,EAAE;QACxC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,sCAAsC;KACpD;IACD,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,EAAE;QACtC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,2BAA2B;KACzC;IACD,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,EAAE;QACvC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,uDAAuD;KACrE;IACD,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,EAAE;QACvC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,uDAAuD;KACrE;IACD,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,EAAE;QACvC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,uDAAuD;KACrE;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,+DAA+D;KAC7E;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,+DAA+D;KAC7E;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,+DAA+D;KAC7E;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,+DAA+D;KAC7E;CACF,CAAC;AAGF,kCAAkC;AAClC,MAAM,eAAe,GAAG,GAAG,EAAE;IACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAEpC,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACxC,qBAAqB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAG,KAAK,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;QACxC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,uBAAuB,EAAE,CAAC;AAC9B,CAAC,CAAA;AAED,mEAAmE;AACnE,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,EAAE;IAC7B,IAAI,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IACxB,IAAG,+BAA+B,EAAE,EAAE,CAAC;QACnC,IAAG,OAAO,IAAI,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,cAAc,CAAC,qCAAqC,CAAC,CAAC,KAAK,EAAE,CAAC;YACvE,CAAC,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC;QACD,OAAO;IACX,CAAC;IACD,IAAG,+BAA+B,EAAE,EAAE,CAAC;QACnC,QAAO,OAAO,EAAE,CAAC;YACb,KAAK,EAAE;gBAAE,CAAC;oBACN,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBACD,MAAM;YACN,KAAK,EAAE;gBACH,CAAC;oBACD,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,MAAM;YACN,KAAK,EAAE;gBACH,CAAC;oBACD,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,MAAM;YACN,KAAK,EAAE;gBACH,CAAC;oBACD,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;AACP,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE;IAC3B,IAAG,CAAC,CAAC,MAAM;QAAE,OAAO;IACpB,+BAA+B;IAC/B,IAAG,OAAO,CAAC,cAAc,IAAI,IAAI;QAAE,OAAO;IAE1C,IAAG,+BAA+B,EAAE,EAAE,CAAC;QACrC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAG,cAAc,EAAE;QAAE,OAAO;IAE5B,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;QACtB,eAAe,EAAE,CAAC;QAClB,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC;IAED,IAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;QACrC,OAAO;IACX,CAAC;IAED,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QAClB,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;QACrB,qBAAqB,EAAE,CAAC;QACxB,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,CAAC,GAAG,IAAI,aAAa,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,aAAa,CAAC,WAAW,EAAE,CAAC,CAAA;QACnE,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;AACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC"} \ No newline at end of file diff --git a/packages/better-custom-hotkeys/index.ts b/packages/better-custom-hotkeys/index.ts new file mode 100644 index 0000000..2d8d469 --- /dev/null +++ b/packages/better-custom-hotkeys/index.ts @@ -0,0 +1,164 @@ + + +// ==UserScript== +// @name Better hotkeys +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.001 +// @author Joshu +// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. +// @inject-into page +// ==/UserScript== + +// User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) +const HOTKEY_CONFIG = { + [GM_getValue('hotkey_worship', '1')]: { + originalKey: 'F1', + description: 'Worship - Activates the Run worship ability' + }, + [GM_getValue('hotkey_consumeFood', '2')]: { + originalKey: 'F2', + description: 'Inventory - Consumes a piece of food' + }, + [GM_getValue('hotkey_lightFire', '3')]: { + originalKey: 'F3', + description: 'Inventory - Lights a fire' + }, + [GM_getValue('hotkey_autoEquip1', 'q')]: { + originalKey: 'F6', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_autoEquip2', 'w')]: { + originalKey: 'F7', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_autoEquip3', 'e')]: { + originalKey: 'F8', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_badge1', 'a')]: { + originalKey: 'F9', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge2', 's')]: { + originalKey: 'F10', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge3', 'd')]: { + originalKey: 'F11', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge4', 'f')]: { + originalKey: 'F12', + description: 'Badge - Right click a badge and click the \'set key binding\'' + } +}; + + +//can be from canvas or chat input +const focusOrSendChat = () => { + const value = chat_ele.value.trim(); + + if (document.activeElement !== chat_ele) { + request_focus_chatbox(); + return; + } + + if(value !== "") { + Globals.websocket.send('CHAT=' + value); + chat_ele.value = ""; + } + request_unfocus_chatbox(); +} + +// Just leaving this section the same as the OG as much as possible +const handleNpcChatModal = (e) => { + let keyCode = e.keyCode; + if(has_npc_chat_message_modal_open()) { + if(keyCode == 32) { + document.getElementById("npc-chat-message-modal-continue-btn").click(); + e.preventDefault(); + } + return; + } + if(has_npc_chat_options_modal_open()) { + switch(keyCode) { + case 49: { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[0].style.display != 'none') { + options[0].click(); + } + } + break; + case 50: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[1].style.display != 'none') { + options[1].click(); + } + } + + break; + case 51: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[2].style.display != 'none') { + options[2].click(); + } + } + + break; + case 52: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[3].style.display != 'none') { + options[3].click(); + } + } + break; + } + } +} + +const hotkeyListener = (e) => { + if(e.repeat) return; + // Checks from original handler + if(Globals.local_username == null) return; + + if(has_npc_chat_message_modal_open()) { + handleNpcChatModal(e); + return; + } + + if(has_modal_open()) return; + + if (e.key === "Enter") { + focusOrSendChat(); + e.preventDefault(); + } + + if(document.activeElement.id != "body") { + return; + } + + if (e.key === "/") { + chat_ele.value = '/'; + request_focus_chatbox(); + e.preventDefault(); + } + + if (e.key in HOTKEY_CONFIG) { + const pressedHotkey = HOTKEY_CONFIG[e.key]; + Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`) + e.preventDefault(); + } +} + +window.removeEventListener("keypress", keypress_listener) +window.addEventListener("keydown", hotkeyListener, false); diff --git a/packages/better-custom-hotkeys/package.json b/packages/better-custom-hotkeys/package.json new file mode 100644 index 0000000..4f74e42 --- /dev/null +++ b/packages/better-custom-hotkeys/package.json @@ -0,0 +1,11 @@ +{ + "name": "@workspace/better-custom-hotkeys", + "version": "1.0.0", + "scripts": { + "build": "bun build --compile --minify-whitespace --minify-syntax --targetbun --outfile dist/app ./better-custom-hotkeys.user.js" + }, + "dependencies": {}, + "devDependencies": { + "@violentmonkey/types": "^0.3.1" + } +} diff --git a/fix-ground-item-monster-click-conflict.user.js b/packages/click-conflict/fix-ground-item-monster-click-conflict.user.js similarity index 100% rename from fix-ground-item-monster-click-conflict.user.js rename to packages/click-conflict/fix-ground-item-monster-click-conflict.user.js diff --git a/draw-player-on-top.user.js b/packages/draw-player-on-top/draw-player-on-top.user.js similarity index 100% rename from draw-player-on-top.user.js rename to packages/draw-player-on-top/draw-player-on-top.user.js diff --git a/header-links.user.js b/packages/wiki/header-links.user.js similarity index 100% rename from header-links.user.js rename to packages/wiki/header-links.user.js diff --git a/image-links.user.js b/packages/wiki/image-links.user.js similarity index 100% rename from image-links.user.js rename to packages/wiki/image-links.user.js diff --git a/table-links.user.js b/packages/wiki/table-links.user.js similarity index 100% rename from table-links.user.js rename to packages/wiki/table-links.user.js diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..c19a1a6 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,44 @@ +{ + // Visit https://aka.ms/tsconfig to read more about this file + "compilerOptions": { + // File Layout + // "rootDir": "./src", + // "outDir": "./dist", + + // Environment Settings + // See also https://aka.ms/tsconfig/module + "module": "nodenext", + "target": "esnext", + "types": ["@violentmonkey/types"], + // For nodejs: + // "lib": ["esnext"], + // "types": ["node"], + // and npm install -D @types/node + + // Other Outputs + "sourceMap": true, + "declaration": true, + "declarationMap": true, + + // Stricter Typechecking Options + "noUncheckedIndexedAccess": true, + "exactOptionalPropertyTypes": true, + + // Style Options + // "noImplicitReturns": true, + // "noImplicitOverride": true, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // "noFallthroughCasesInSwitch": true, + // "noPropertyAccessFromIndexSignature": true, + + // Recommended Options + "strict": true, + "jsx": "react-jsx", + "verbatimModuleSyntax": true, + "isolatedModules": true, + "noUncheckedSideEffectImports": true, + "moduleDetection": "force", + "skipLibCheck": true + } +} From 6cea4ea80b11e7e78b34a4483a9a9c06c7626fcc Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 15 Dec 2025 17:49:26 -0500 Subject: [PATCH 04/87] wip --- .gitignore | 3 + CLAUDE.md | 106 ++++++++++++ build.ts | 4 + bun.lock | 9 ++ bun.nix | 16 ++ default.nix | 19 ++- flake.lock | 36 +---- package.json | 1 + packages/better-custom-hotkeys/index.d.ts | 2 - packages/better-custom-hotkeys/index.d.ts.map | 1 - packages/better-custom-hotkeys/index.js | 153 ------------------ packages/better-custom-hotkeys/index.js.map | 1 - tsconfig.json | 57 +++---- 13 files changed, 176 insertions(+), 232 deletions(-) create mode 100644 CLAUDE.md create mode 100644 build.ts delete mode 100644 packages/better-custom-hotkeys/index.d.ts delete mode 100644 packages/better-custom-hotkeys/index.d.ts.map delete mode 100644 packages/better-custom-hotkeys/index.js delete mode 100644 packages/better-custom-hotkeys/index.js.map diff --git a/.gitignore b/.gitignore index f306bbd..18be870 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,9 @@ result-* # Ignore automatically generated direnv output .direnv + +out/ + # Logs logs *.log diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..764c1dd --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,106 @@ + +Default to using Bun instead of Node.js. + +- Use `bun ` instead of `node ` or `ts-node ` +- Use `bun test` instead of `jest` or `vitest` +- Use `bun build ` instead of `webpack` or `esbuild` +- Use `bun install` instead of `npm install` or `yarn install` or `pnpm install` +- Use `bun run + + +``` + +With the following `frontend.tsx`: + +```tsx#frontend.tsx +import React from "react"; +import { createRoot } from "react-dom/client"; + +// import .css files directly and it works +import './index.css'; + +const root = createRoot(document.body); + +export default function Frontend() { + return

Hello, world!

; +} + +root.render(); +``` + +Then, run index.ts + +```sh +bun --hot ./index.ts +``` + +For more information, read the Bun API docs in `node_modules/bun-types/docs/**.mdx`. diff --git a/build.ts b/build.ts new file mode 100644 index 0000000..109ee61 --- /dev/null +++ b/build.ts @@ -0,0 +1,4 @@ +await Bun.build({ + entrypoints: ["./packages/better-custom-hotkeys/index.ts"], + outdir: "./out", +}); diff --git a/bun.lock b/bun.lock index 0df8ecb..5fa3d83 100644 --- a/bun.lock +++ b/bun.lock @@ -5,6 +5,7 @@ "": { "name": "test-workspace", "devDependencies": { + "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", "bun2nix": "^2.0.0", "typescript": "^5.9.3", @@ -26,12 +27,18 @@ }, }, "packages": { + "@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], + + "@types/node": ["@types/node@25.0.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="], + "@violentmonkey/types": ["@violentmonkey/types@0.3.1", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="], "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], "@workspace/lib": ["@workspace/lib@workspace:packages/lib"], + "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], + "bun2nix": ["bun2nix@2.0.0", "", { "dependencies": { "sade": "^1.8.1" }, "bin": { "bun2nix": "index.ts" } }, "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="], "is-number": ["is-number@6.0.0", "", {}, "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg=="], @@ -44,6 +51,8 @@ "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "user-agent-data-types": ["user-agent-data-types@0.4.2", "", {}, "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="], } } diff --git a/bun.nix b/bun.nix index b1d94ae..a8a776b 100644 --- a/bun.nix +++ b/bun.nix @@ -13,12 +13,24 @@ ... }: { + "@types/bun@1.3.4" = fetchurl { + url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; + hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; + }; + "@types/node@25.0.2" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-25.0.2.tgz"; + hash = "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="; + }; "@violentmonkey/types@0.3.1" = fetchurl { url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.1.tgz"; hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; "@workspace/lib" = copyPathToStore ./packages/lib; + "bun-types@1.3.4" = fetchurl { + url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; + hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; + }; "bun2nix@2.0.0" = fetchurl { url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; @@ -43,6 +55,10 @@ url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; }; + "undici-types@7.16.0" = fetchurl { + url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; + hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; + }; "user-agent-data-types@0.4.2" = fetchurl { url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; diff --git a/default.nix b/default.nix index 076b237..2fa7744 100644 --- a/default.nix +++ b/default.nix @@ -1,16 +1,29 @@ { bun2nix, + stdenv, ... }: -bun2nix.mkDerivation { - pname = "workspace-test-app"; +stdenv.mkDerivation { + pname = "test-build"; version = "1.0.0"; src = ./.; + nativeBuildInputs = [ + bun2nix.hook + ]; + bunDeps = bun2nix.fetchBunDeps { bunNix = ./bun.nix; }; - module = "packages/app/index.js"; + buildPhase = '' + bun run build.ts + ''; + + installPhase = '' + mkdir -p $out/dist + + cp -R ./dist $out + ''; } diff --git a/flake.lock b/flake.lock index 943565a..3933331 100644 --- a/flake.lock +++ b/flake.lock @@ -63,24 +63,6 @@ "type": "github" } }, - "flake-utils": { - "inputs": { - "systems": "systems" - }, - "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "import-tree": { "locked": { "lastModified": 1763762820, @@ -146,9 +128,8 @@ "inputs": { "bun2nix": "bun2nix", "flake-parts": "flake-parts_2", - "flake-utils": "flake-utils", "nixpkgs": "nixpkgs", - "systems": "systems_2" + "systems": "systems" } }, "systems": { @@ -166,21 +147,6 @@ "type": "github" } }, - "systems_2": { - "locked": { - "lastModified": 1681028828, - "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", - "owner": "nix-systems", - "repo": "default", - "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default", - "type": "github" - } - }, "treefmt-nix": { "inputs": { "nixpkgs": [ diff --git a/package.json b/package.json index 280558b..f44a5de 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "postinstall": "bun2nix -o bun.nix" }, "devDependencies": { + "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", "bun2nix": "^2.0.0", "typescript": "^5.9.3" diff --git a/packages/better-custom-hotkeys/index.d.ts b/packages/better-custom-hotkeys/index.d.ts deleted file mode 100644 index e26a57a..0000000 --- a/packages/better-custom-hotkeys/index.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -export {}; -//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/better-custom-hotkeys/index.d.ts.map b/packages/better-custom-hotkeys/index.d.ts.map deleted file mode 100644 index 82335e7..0000000 --- a/packages/better-custom-hotkeys/index.d.ts.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/packages/better-custom-hotkeys/index.js b/packages/better-custom-hotkeys/index.js deleted file mode 100644 index cae9696..0000000 --- a/packages/better-custom-hotkeys/index.js +++ /dev/null @@ -1,153 +0,0 @@ -"use strict"; -// ==UserScript== -// @name Better hotkeys -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue -// @version 0.001 -// @author Joshu -// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. -// @inject-into page -// ==/UserScript== -Object.defineProperty(exports, "__esModule", { value: true }); -// User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) -const HOTKEY_CONFIG = { - [GM_getValue('hotkey_worship', '1')]: { - originalKey: 'F1', - description: 'Worship - Activates the Run worship ability' - }, - [GM_getValue('hotkey_consumeFood', '2')]: { - originalKey: 'F2', - description: 'Inventory - Consumes a piece of food' - }, - [GM_getValue('hotkey_lightFire', '3')]: { - originalKey: 'F3', - description: 'Inventory - Lights a fire' - }, - [GM_getValue('hotkey_autoEquip1', 'q')]: { - originalKey: 'F6', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip2', 'w')]: { - originalKey: 'F7', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip3', 'e')]: { - originalKey: 'F8', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_badge1', 'a')]: { - originalKey: 'F9', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge2', 's')]: { - originalKey: 'F10', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge3', 'd')]: { - originalKey: 'F11', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge4', 'f')]: { - originalKey: 'F12', - description: 'Badge - Right click a badge and click the \'set key binding\'' - } -}; -//can be from canvas or chat input -const focusOrSendChat = () => { - const value = chat_ele.value.trim(); - if (document.activeElement !== chat_ele) { - request_focus_chatbox(); - return; - } - if (value !== "") { - Globals.websocket.send('CHAT=' + value); - chat_ele.value = ""; - } - request_unfocus_chatbox(); -}; -// Just leaving this section the same as the OG as much as possible -const handleNpcChatModal = (e) => { - let keyCode = e.keyCode; - if (has_npc_chat_message_modal_open()) { - if (keyCode == 32) { - document.getElementById("npc-chat-message-modal-continue-btn").click(); - e.preventDefault(); - } - return; - } - if (has_npc_chat_options_modal_open()) { - switch (keyCode) { - case 49: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if (options[0].style.display != 'none') { - options[0].click(); - } - } - break; - case 50: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if (options[1].style.display != 'none') { - options[1].click(); - } - } - break; - case 51: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if (options[2].style.display != 'none') { - options[2].click(); - } - } - break; - case 52: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if (options[3].style.display != 'none') { - options[3].click(); - } - } - break; - } - } -}; -const hotkeyListener = (e) => { - if (e.repeat) - return; - // Checks from original handler - if (Globals.local_username == null) - return; - if (has_npc_chat_message_modal_open()) { - handleNpcChatModal(e); - return; - } - if (has_modal_open()) - return; - if (e.key === "Enter") { - focusOrSendChat(); - e.preventDefault(); - } - if (document.activeElement.id != "body") { - return; - } - if (e.key === "/") { - chat_ele.value = '/'; - request_focus_chatbox(); - e.preventDefault(); - } - if (e.key in HOTKEY_CONFIG) { - const pressedHotkey = HOTKEY_CONFIG[e.key]; - Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`); - e.preventDefault(); - } -}; -window.removeEventListener("keypress", keypress_listener); -window.addEventListener("keydown", hotkeyListener, false); -//# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/packages/better-custom-hotkeys/index.js.map b/packages/better-custom-hotkeys/index.js.map deleted file mode 100644 index e12c2f5..0000000 --- a/packages/better-custom-hotkeys/index.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":";AAEA,iBAAiB;AACjB,8BAA8B;AAC9B,qCAAqC;AACrC,6CAA6C;AAC7C,2BAA2B;AAC3B,2BAA2B;AAC3B,qBAAqB;AACrB,qBAAqB;AACrB,4HAA4H;AAC5H,oBAAoB;AACpB,kBAAkB;;AAElB,uFAAuF;AACvF,MAAM,aAAa,GAAG;IACpB,CAAC,WAAW,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC,EAAE;QACpC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,6CAA6C;KAC3D;IACD,CAAC,WAAW,CAAC,oBAAoB,EAAE,GAAG,CAAC,CAAC,EAAE;QACxC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,sCAAsC;KACpD;IACD,CAAC,WAAW,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC,EAAE;QACtC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,2BAA2B;KACzC;IACD,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,EAAE;QACvC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,uDAAuD;KACrE;IACD,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,EAAE;QACvC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,uDAAuD;KACrE;IACD,CAAC,WAAW,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC,EAAE;QACvC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,uDAAuD;KACrE;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,IAAI;QACjB,WAAW,EAAE,+DAA+D;KAC7E;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,+DAA+D;KAC7E;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,+DAA+D;KAC7E;IACD,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,EAAE;QACnC,WAAW,EAAE,KAAK;QAClB,WAAW,EAAE,+DAA+D;KAC7E;CACF,CAAC;AAGF,kCAAkC;AAClC,MAAM,eAAe,GAAG,GAAG,EAAE;IACzB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;IAEpC,IAAI,QAAQ,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;QACxC,qBAAqB,EAAE,CAAC;QACxB,OAAO;IACT,CAAC;IAED,IAAG,KAAK,KAAK,EAAE,EAAE,CAAC;QAChB,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC;QACxC,QAAQ,CAAC,KAAK,GAAG,EAAE,CAAC;IACtB,CAAC;IACD,uBAAuB,EAAE,CAAC;AAC9B,CAAC,CAAA;AAED,mEAAmE;AACnE,MAAM,kBAAkB,GAAG,CAAC,CAAC,EAAE,EAAE;IAC7B,IAAI,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC;IACxB,IAAG,+BAA+B,EAAE,EAAE,CAAC;QACnC,IAAG,OAAO,IAAI,EAAE,EAAE,CAAC;YACf,QAAQ,CAAC,cAAc,CAAC,qCAAqC,CAAC,CAAC,KAAK,EAAE,CAAC;YACvE,CAAC,CAAC,cAAc,EAAE,CAAC;QACvB,CAAC;QACD,OAAO;IACX,CAAC;IACD,IAAG,+BAA+B,EAAE,EAAE,CAAC;QACnC,QAAO,OAAO,EAAE,CAAC;YACb,KAAK,EAAE;gBAAE,CAAC;oBACN,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBACD,MAAM;YACN,KAAK,EAAE;gBACH,CAAC;oBACD,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,MAAM;YACN,KAAK,EAAE;gBACH,CAAC;oBACD,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBAED,MAAM;YACN,KAAK,EAAE;gBACH,CAAC;oBACD,IAAI,OAAO,GAAG,QAAQ,CAAC,cAAc,CAAC,gCAAgC,CAAC,CAAC;oBACxE,IAAI,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;oBAClD,IAAG,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;wBACpC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;oBACvB,CAAC;gBACL,CAAC;gBACD,MAAM;QACV,CAAC;IACH,CAAC;AACP,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,EAAE;IAC3B,IAAG,CAAC,CAAC,MAAM;QAAE,OAAO;IACpB,+BAA+B;IAC/B,IAAG,OAAO,CAAC,cAAc,IAAI,IAAI;QAAE,OAAO;IAE1C,IAAG,+BAA+B,EAAE,EAAE,CAAC;QACrC,kBAAkB,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO;IACT,CAAC;IAED,IAAG,cAAc,EAAE;QAAE,OAAO;IAE5B,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,EAAE,CAAC;QACtB,eAAe,EAAE,CAAC;QAClB,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC;IAED,IAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,IAAI,MAAM,EAAE,CAAC;QACrC,OAAO;IACX,CAAC;IAED,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;QAClB,QAAQ,CAAC,KAAK,GAAG,GAAG,CAAC;QACrB,qBAAqB,EAAE,CAAC;QACxB,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC;IAED,IAAI,CAAC,CAAC,GAAG,IAAI,aAAa,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,aAAa,CAAC,WAAW,EAAE,CAAC,CAAA;QACnE,CAAC,CAAC,cAAc,EAAE,CAAC;IACrB,CAAC;AACH,CAAC,CAAA;AAED,MAAM,CAAC,mBAAmB,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAA;AACzD,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC"} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index c19a1a6..238655f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,44 +1,27 @@ { - // Visit https://aka.ms/tsconfig to read more about this file "compilerOptions": { - // File Layout - // "rootDir": "./src", - // "outDir": "./dist", - - // Environment Settings - // See also https://aka.ms/tsconfig/module - "module": "nodenext", - "target": "esnext", - "types": ["@violentmonkey/types"], - // For nodejs: - // "lib": ["esnext"], - // "types": ["node"], - // and npm install -D @types/node - - // Other Outputs - "sourceMap": true, - "declaration": true, - "declarationMap": true, - - // Stricter Typechecking Options - "noUncheckedIndexedAccess": true, - "exactOptionalPropertyTypes": true, + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, - // Style Options - // "noImplicitReturns": true, - // "noImplicitOverride": true, - // "noUnusedLocals": true, - // "noUnusedParameters": true, - // "noFallthroughCasesInSwitch": true, - // "noPropertyAccessFromIndexSignature": true, + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, - // Recommended Options + // Best practices "strict": true, - "jsx": "react-jsx", - "verbatimModuleSyntax": true, - "isolatedModules": true, - "noUncheckedSideEffectImports": true, - "moduleDetection": "force", - "skipLibCheck": true + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, + + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false } } From 216cfd8a0df21b43a6cf0166faa9de520a76cddc Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 15 Dec 2025 21:09:37 -0500 Subject: [PATCH 05/87] wip --- build.ts | 18 ++- bun.lock | 22 +-- bun.nix | 11 +- package.json | 3 +- packages/app/index.js | 8 - packages/better-custom-hotkeys/index.ts | 60 +++---- packages/better-custom-hotkeys/package.json | 3 +- packages/draw-player-on-top/index.ts | 164 ++++++++++++++++++++ packages/draw-player-on-top/package.json | 11 ++ packages/flatmmo-types/flatmmo.d.ts | 21 +++ packages/flatmmo-types/package.json | 6 + packages/lib/index.js | 10 -- packages/lib/package.json | 7 - tsconfig.json | 1 + 14 files changed, 263 insertions(+), 82 deletions(-) delete mode 100644 packages/app/index.js create mode 100644 packages/draw-player-on-top/index.ts create mode 100644 packages/draw-player-on-top/package.json create mode 100644 packages/flatmmo-types/flatmmo.d.ts create mode 100644 packages/flatmmo-types/package.json delete mode 100644 packages/lib/index.js delete mode 100644 packages/lib/package.json diff --git a/build.ts b/build.ts index 109ee61..111d19f 100644 --- a/build.ts +++ b/build.ts @@ -1,4 +1,20 @@ +const packageName = "better-custom-hotkeys"; + await Bun.build({ entrypoints: ["./packages/better-custom-hotkeys/index.ts"], - outdir: "./out", + banner: ` +// ==UserScript== +// @name Better hotkeys +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.001 +// @author Joshu +// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. +// @inject-into page +// ==/UserScript== + `, + outdir: "./dist", + naming: `${packageName}.user.js` }); diff --git a/bun.lock b/bun.lock index 5fa3d83..6555360 100644 --- a/bun.lock +++ b/bun.lock @@ -7,6 +7,7 @@ "devDependencies": { "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*", "bun2nix": "^2.0.0", "typescript": "^5.9.3", }, @@ -16,15 +17,20 @@ "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*", }, }, - "packages/lib": { - "name": "@workspace/lib", + "packages/draw-player-on-top": { + "name": "@workspace/draw-player-on-top", "version": "1.0.0", - "dependencies": { - "is-odd": "^3.0.1", + "devDependencies": { + "@violentmonkey/types": "^0.3.1", }, }, + "packages/flatmmo-types": { + "name": "@workspace/flatmmo-types", + "version": "0.0.1", + }, }, "packages": { "@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], @@ -35,16 +41,14 @@ "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], - "@workspace/lib": ["@workspace/lib@workspace:packages/lib"], + "@workspace/draw-player-on-top": ["@workspace/draw-player-on-top@workspace:packages/draw-player-on-top"], + + "@workspace/flatmmo-types": ["@workspace/flatmmo-types@workspace:packages/flatmmo-types"], "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], "bun2nix": ["bun2nix@2.0.0", "", { "dependencies": { "sade": "^1.8.1" }, "bin": { "bun2nix": "index.ts" } }, "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="], - "is-number": ["is-number@6.0.0", "", {}, "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg=="], - - "is-odd": ["is-odd@3.0.1", "", { "dependencies": { "is-number": "^6.0.0" } }, "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA=="], - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], diff --git a/bun.nix b/bun.nix index a8a776b..9ebd50e 100644 --- a/bun.nix +++ b/bun.nix @@ -26,7 +26,8 @@ hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; - "@workspace/lib" = copyPathToStore ./packages/lib; + "@workspace/draw-player-on-top" = copyPathToStore ./packages/draw-player-on-top; + "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; "bun-types@1.3.4" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; @@ -35,14 +36,6 @@ url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; }; - "is-number@6.0.0" = fetchurl { - url = "https://registry.npmjs.org/is-number/-/is-number-6.0.0.tgz"; - hash = "sha512-Wu1VHeILBK8KAWJUAiSZQX94GmOE45Rg6/538fKwiloUu21KncEkYGPqob2oSZ5mUT73vLGrHQjKw3KMPwfDzg=="; - }; - "is-odd@3.0.1" = fetchurl { - url = "https://registry.npmjs.org/is-odd/-/is-odd-3.0.1.tgz"; - hash = "sha512-CQpnWPrDwmP1+SMHXZhtLtJv90yiyVfluGsX5iNCVkrhQtU3TQHsUWPG9wkdk9Lgd5yNpAg9jQEo90CBaXgWMA=="; - }; "mri@1.2.0" = fetchurl { url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; diff --git a/package.json b/package.json index f44a5de..a5e4c65 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", "bun2nix": "^2.0.0", - "typescript": "^5.9.3" + "typescript": "^5.9.3", + "@workspace/flatmmo-types": "workspace:*" } } diff --git a/packages/app/index.js b/packages/app/index.js deleted file mode 100644 index 590919e..0000000 --- a/packages/app/index.js +++ /dev/null @@ -1,8 +0,0 @@ -import { isEven, isOdd } from "@workspace/lib"; - -const RESET_COLOUR = "\x1b[0m"; - -console.log(`${Bun.color("blue", "ansi")}Testing workspace dependency:`); -console.log(`${RESET_COLOUR}Is 3 odd? ${isOdd(3)}`); -console.log(`${RESET_COLOUR}Is 4 even? ${isEven(4)}`); -console.log(`${Bun.color("green", "ansi")}Success!`); diff --git a/packages/better-custom-hotkeys/index.ts b/packages/better-custom-hotkeys/index.ts index 2d8d469..d2e9c3d 100644 --- a/packages/better-custom-hotkeys/index.ts +++ b/packages/better-custom-hotkeys/index.ts @@ -1,56 +1,44 @@ - - -// ==UserScript== -// @name Better hotkeys -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue -// @version 0.001 -// @author Joshu -// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. -// @inject-into page -// ==/UserScript== +// import { chat_ele, request_focus_chatbox, Globals, request_unfocus_chatbox, has_npc_chat_message_modal_open, has_modal_open, has_npc_chat_options_modal_open, keypress_listener } from "flatmmo"; // User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) -const HOTKEY_CONFIG = { - [GM_getValue('hotkey_worship', '1')]: { +const HOTKEY_CONFIG: {[x: string]: {originalKey: string; description: string}} = { + [GM_getValue('hotkey_worship', '1')]: { originalKey: 'F1', description: 'Worship - Activates the Run worship ability' }, - [GM_getValue('hotkey_consumeFood', '2')]: { + [GM_getValue('hotkey_consumeFood', '2')]: { originalKey: 'F2', description: 'Inventory - Consumes a piece of food' }, - [GM_getValue('hotkey_lightFire', '3')]: { + [GM_getValue('hotkey_lightFire', '3')]: { originalKey: 'F3', description: 'Inventory - Lights a fire' }, - [GM_getValue('hotkey_autoEquip1', 'q')]: { + [GM_getValue('hotkey_autoEquip1', 'q')]: { originalKey: 'F6', description: 'Equipment - Auto equips items that you\'ve configured' }, - [GM_getValue('hotkey_autoEquip2', 'w')]: { + [GM_getValue('hotkey_autoEquip2', 'w')]: { originalKey: 'F7', description: 'Equipment - Auto equips items that you\'ve configured' }, - [GM_getValue('hotkey_autoEquip3', 'e')]: { + [GM_getValue('hotkey_autoEquip3', 'e')]: { originalKey: 'F8', description: 'Equipment - Auto equips items that you\'ve configured' }, - [GM_getValue('hotkey_badge1', 'a')]: { + [GM_getValue('hotkey_badge1', 'a')]: { originalKey: 'F9', description: 'Badge - Right click a badge and click the \'set key binding\'' }, - [GM_getValue('hotkey_badge2', 's')]: { + [GM_getValue('hotkey_badge2', 's')]: { originalKey: 'F10', description: 'Badge - Right click a badge and click the \'set key binding\'' }, - [GM_getValue('hotkey_badge3', 'd')]: { + [GM_getValue('hotkey_badge3', 'd')]: { originalKey: 'F11', description: 'Badge - Right click a badge and click the \'set key binding\'' }, - [GM_getValue('hotkey_badge4', 'f')]: { + [GM_getValue('hotkey_badge4', 'f')]: { originalKey: 'F12', description: 'Badge - Right click a badge and click the \'set key binding\'' } @@ -74,11 +62,11 @@ const focusOrSendChat = () => { } // Just leaving this section the same as the OG as much as possible -const handleNpcChatModal = (e) => { +const handleNpcChatModal = (e: KeyboardEvent) => { let keyCode = e.keyCode; if(has_npc_chat_message_modal_open()) { if(keyCode == 32) { - document.getElementById("npc-chat-message-modal-continue-btn").click(); + document.getElementById("npc-chat-message-modal-continue-btn")?.click(); e.preventDefault(); } return; @@ -87,8 +75,8 @@ const handleNpcChatModal = (e) => { switch(keyCode) { case 49: { let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[0].style.display != 'none') { + let options = wrapper?.getElementsByTagName("div"); + if(options && options[0].style.display != 'none') { options[0].click(); } } @@ -96,8 +84,8 @@ const handleNpcChatModal = (e) => { case 50: { let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[1].style.display != 'none') { + let options = wrapper?.getElementsByTagName("div"); + if(options && options[1].style.display != 'none') { options[1].click(); } } @@ -106,8 +94,8 @@ const handleNpcChatModal = (e) => { case 51: { let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[2].style.display != 'none') { + let options = wrapper?.getElementsByTagName("div"); + if(options && options[2].style.display != 'none') { options[2].click(); } } @@ -116,8 +104,8 @@ const handleNpcChatModal = (e) => { case 52: { let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[3].style.display != 'none') { + let options = wrapper?.getElementsByTagName("div"); + if(options && options[3].style.display != 'none') { options[3].click(); } } @@ -126,7 +114,7 @@ const handleNpcChatModal = (e) => { } } -const hotkeyListener = (e) => { +const hotkeyListener = (e: KeyboardEvent) => { if(e.repeat) return; // Checks from original handler if(Globals.local_username == null) return; @@ -143,7 +131,7 @@ const hotkeyListener = (e) => { e.preventDefault(); } - if(document.activeElement.id != "body") { + if(document.activeElement?.id != "body") { return; } diff --git a/packages/better-custom-hotkeys/package.json b/packages/better-custom-hotkeys/package.json index 4f74e42..b0d9b4b 100644 --- a/packages/better-custom-hotkeys/package.json +++ b/packages/better-custom-hotkeys/package.json @@ -6,6 +6,7 @@ }, "dependencies": {}, "devDependencies": { - "@violentmonkey/types": "^0.3.1" + "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*" } } diff --git a/packages/draw-player-on-top/index.ts b/packages/draw-player-on-top/index.ts new file mode 100644 index 0000000..2d8d469 --- /dev/null +++ b/packages/draw-player-on-top/index.ts @@ -0,0 +1,164 @@ + + +// ==UserScript== +// @name Better hotkeys +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.001 +// @author Joshu +// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. +// @inject-into page +// ==/UserScript== + +// User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) +const HOTKEY_CONFIG = { + [GM_getValue('hotkey_worship', '1')]: { + originalKey: 'F1', + description: 'Worship - Activates the Run worship ability' + }, + [GM_getValue('hotkey_consumeFood', '2')]: { + originalKey: 'F2', + description: 'Inventory - Consumes a piece of food' + }, + [GM_getValue('hotkey_lightFire', '3')]: { + originalKey: 'F3', + description: 'Inventory - Lights a fire' + }, + [GM_getValue('hotkey_autoEquip1', 'q')]: { + originalKey: 'F6', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_autoEquip2', 'w')]: { + originalKey: 'F7', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_autoEquip3', 'e')]: { + originalKey: 'F8', + description: 'Equipment - Auto equips items that you\'ve configured' + }, + [GM_getValue('hotkey_badge1', 'a')]: { + originalKey: 'F9', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge2', 's')]: { + originalKey: 'F10', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge3', 'd')]: { + originalKey: 'F11', + description: 'Badge - Right click a badge and click the \'set key binding\'' + }, + [GM_getValue('hotkey_badge4', 'f')]: { + originalKey: 'F12', + description: 'Badge - Right click a badge and click the \'set key binding\'' + } +}; + + +//can be from canvas or chat input +const focusOrSendChat = () => { + const value = chat_ele.value.trim(); + + if (document.activeElement !== chat_ele) { + request_focus_chatbox(); + return; + } + + if(value !== "") { + Globals.websocket.send('CHAT=' + value); + chat_ele.value = ""; + } + request_unfocus_chatbox(); +} + +// Just leaving this section the same as the OG as much as possible +const handleNpcChatModal = (e) => { + let keyCode = e.keyCode; + if(has_npc_chat_message_modal_open()) { + if(keyCode == 32) { + document.getElementById("npc-chat-message-modal-continue-btn").click(); + e.preventDefault(); + } + return; + } + if(has_npc_chat_options_modal_open()) { + switch(keyCode) { + case 49: { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[0].style.display != 'none') { + options[0].click(); + } + } + break; + case 50: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[1].style.display != 'none') { + options[1].click(); + } + } + + break; + case 51: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[2].style.display != 'none') { + options[2].click(); + } + } + + break; + case 52: + { + let wrapper = document.getElementById("npc-chat-options-modal-content"); + let options = wrapper.getElementsByTagName("div"); + if(options[3].style.display != 'none') { + options[3].click(); + } + } + break; + } + } +} + +const hotkeyListener = (e) => { + if(e.repeat) return; + // Checks from original handler + if(Globals.local_username == null) return; + + if(has_npc_chat_message_modal_open()) { + handleNpcChatModal(e); + return; + } + + if(has_modal_open()) return; + + if (e.key === "Enter") { + focusOrSendChat(); + e.preventDefault(); + } + + if(document.activeElement.id != "body") { + return; + } + + if (e.key === "/") { + chat_ele.value = '/'; + request_focus_chatbox(); + e.preventDefault(); + } + + if (e.key in HOTKEY_CONFIG) { + const pressedHotkey = HOTKEY_CONFIG[e.key]; + Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`) + e.preventDefault(); + } +} + +window.removeEventListener("keypress", keypress_listener) +window.addEventListener("keydown", hotkeyListener, false); diff --git a/packages/draw-player-on-top/package.json b/packages/draw-player-on-top/package.json new file mode 100644 index 0000000..a508bc2 --- /dev/null +++ b/packages/draw-player-on-top/package.json @@ -0,0 +1,11 @@ +{ + "name": "@workspace/draw-player-on-top", + "version": "1.0.0", + "scripts": { + "build": "bun build --compile --minify-whitespace --minify-syntax --targetbun --outfile dist/app ./better-custom-hotkeys.user.js" + }, + "dependencies": {}, + "devDependencies": { + "@violentmonkey/types": "^0.3.1" + } +} diff --git a/packages/flatmmo-types/flatmmo.d.ts b/packages/flatmmo-types/flatmmo.d.ts new file mode 100644 index 0000000..9a0dfdf --- /dev/null +++ b/packages/flatmmo-types/flatmmo.d.ts @@ -0,0 +1,21 @@ +// import type { WebSocket, WebSocketHandler } from "bun"; + +declare function request_focus_chatbox(): void; +declare function request_unfocus_chatbox(): void; +declare function has_npc_chat_message_modal_open(): boolean; +declare function has_npc_chat_options_modal_open(): boolean; +declare function has_modal_open(): boolean; +declare function keypress_listener(): void; +declare const chat_ele: HTMLInputElement; + + // const chat_ele: HTMLInputElement; + // const Globals: {websocket: WebSocket}; + interface Globals { + websocket: WebSocket; + local_username: string; + local_id: string; + tab_active: boolean; + websocket_url: string; + } + +declare const Globals: Globals; diff --git a/packages/flatmmo-types/package.json b/packages/flatmmo-types/package.json new file mode 100644 index 0000000..8f653e5 --- /dev/null +++ b/packages/flatmmo-types/package.json @@ -0,0 +1,6 @@ +{ + "name": "@workspace/flatmmo-types", + "version": "0.0.1", + "dependencies": {}, + "devDependencies": {} +} diff --git a/packages/lib/index.js b/packages/lib/index.js deleted file mode 100644 index ab563ee..0000000 --- a/packages/lib/index.js +++ /dev/null @@ -1,10 +0,0 @@ -const isOdd = require("is-odd"); - -function isEven(num) { - return !isOdd(num); -} - -module.exports = { - isOdd, - isEven, -}; diff --git a/packages/lib/package.json b/packages/lib/package.json deleted file mode 100644 index 29e5559..0000000 --- a/packages/lib/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "@workspace/lib", - "version": "1.0.0", - "dependencies": { - "is-odd": "^3.0.1" - } -} diff --git a/tsconfig.json b/tsconfig.json index 238655f..a7c790d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "moduleDetection": "force", "jsx": "react-jsx", "allowJs": true, + "types": ["@violentmonkey/types", "bun", "@workspace/flatmmo-types" ], // Bundler mode "moduleResolution": "bundler", From f797ecb4313d03910c24233f4785b73c6743eca8 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 15 Dec 2025 21:58:56 -0500 Subject: [PATCH 06/87] moved small scripts to flatmmo page --- bun.lock | 9 - bun.nix | 1 - ...ground-item-monster-click-conflict.user.js | 135 ---------- .../draw-player-on-top.user.js | 252 ------------------ packages/draw-player-on-top/index.ts | 164 ------------ packages/draw-player-on-top/package.json | 11 - 6 files changed, 572 deletions(-) delete mode 100644 packages/click-conflict/fix-ground-item-monster-click-conflict.user.js delete mode 100644 packages/draw-player-on-top/draw-player-on-top.user.js delete mode 100644 packages/draw-player-on-top/index.ts delete mode 100644 packages/draw-player-on-top/package.json diff --git a/bun.lock b/bun.lock index 6555360..10fee03 100644 --- a/bun.lock +++ b/bun.lock @@ -20,13 +20,6 @@ "@workspace/flatmmo-types": "workspace:*", }, }, - "packages/draw-player-on-top": { - "name": "@workspace/draw-player-on-top", - "version": "1.0.0", - "devDependencies": { - "@violentmonkey/types": "^0.3.1", - }, - }, "packages/flatmmo-types": { "name": "@workspace/flatmmo-types", "version": "0.0.1", @@ -41,8 +34,6 @@ "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], - "@workspace/draw-player-on-top": ["@workspace/draw-player-on-top@workspace:packages/draw-player-on-top"], - "@workspace/flatmmo-types": ["@workspace/flatmmo-types@workspace:packages/flatmmo-types"], "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], diff --git a/bun.nix b/bun.nix index 9ebd50e..2906ea6 100644 --- a/bun.nix +++ b/bun.nix @@ -26,7 +26,6 @@ hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; - "@workspace/draw-player-on-top" = copyPathToStore ./packages/draw-player-on-top; "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; "bun-types@1.3.4" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; diff --git a/packages/click-conflict/fix-ground-item-monster-click-conflict.user.js b/packages/click-conflict/fix-ground-item-monster-click-conflict.user.js deleted file mode 100644 index cad1bcc..0000000 --- a/packages/click-conflict/fix-ground-item-monster-click-conflict.user.js +++ /dev/null @@ -1,135 +0,0 @@ - -// ==UserScript== -// @name Fix other user item enemy click conflict -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant none -// @version 0.0000001 -// @author - -// @description Fix issue where you can't click on an enemy if they are also standing on another players drop. -// @inject-into page. Currently just clicks both the enemy and the ground tile if both exist since theres no way to tell if an item is your's before clikcing on it and the update is async from the websocket -// ==/UserScript== - -// Function to paint player extracted from loop in original paint_players function. -function mouse_click_handler_patched(e) { - if(Globals.local_username == null) { - return; - } - let bounding_client_rect = canvas.getBoundingClientRect(); - const relativeX = (e.clientX - bounding_client_rect.left) / canvas_scale; - const relativeY = (e.clientY - bounding_client_rect.top) / canvas_scale; - - let clicked_tile = get_postition_from_pixel(relativeX, relativeY); - - //dev tool - if(tile_marker_mode) { - for(let i = 0; i < tiles_marked.length; i++) { - let tile = tiles_marked[i]; - if(tile.x == clicked_tile.x && tile.y == clicked_tile.y) { - tiles_marked.splice(i, 1) - return; - } - } - - tiles_marked.push({x: clicked_tile.x, y: clicked_tile.y}); - return; - } - - //highlight players - for (let username in players) { - if (players.hasOwnProperty(username)) { - let player = players[username]; - if(is_mouse_on_player(mouse_over_now.x, mouse_over_now.y, player)) { - if(e.which == 3) { - Globals.websocket.send('RIGHT_CLICKED_PLAYER=' + username); - return; - } - } - } - } - - for(let i = 0; i < ground_items.length; i++) { - let ground_item = ground_items[i]; - if(is_mouse_on_ground_item(clicked_tile.x, clicked_tile.y, ground_item)) { - Globals.websocket.send('CLICKED_GROUND_ITEM=' + ground_item.uuid); - activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); - // only break if going to click npc and not right click. kinda jank but want to minimize the diff. is_hidden means the npc is dead.... - if(Object.values(npcs).some((n) => !n.is_hidden && is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, n)) && e.which !== 3) { - break; - } - return; - } - } - - let npcs_clicked_uuid = []; - for (let uuid in npcs) { - if (npcs.hasOwnProperty(uuid)) { - let npc = npcs[uuid]; - if(npc.is_hidden) { - continue; - } - // npc.is_mouse_hovering_over() -- changed for mobile fix. - - if(is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, npc)) { - - if(e.which == 3) { - Globals.websocket.send('MONSTER_LOG=' + npc.name); - return; - } - if(npc.has_click_priority) { - npcs_clicked_uuid.unshift(npc.uuid); - } else { - npcs_clicked_uuid.push(npc.uuid); - } - } - } - } - - - if(npcs_clicked_uuid.length > 0) { - send_unrepeatable_bytes_1s('CLICKS_NPC=' + npcs_clicked_uuid[0]); - activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); - return; - } - - for(let i = 0; i < map_objects.length; i++) { - let map_object = map_objects[i]; - if(is_mouse_on_map_object(clicked_tile.x, clicked_tile.y, map_object)) { - if(map_object.is_interactable()) { - if(e.which == 3) { - Globals.websocket.send('RIGHT_CLICKED_MAP_OBJECT=' + map_object.uuid); - return; - } else { - send_unrepeatable_bytes_1s('CLICKED_MAP_OBJECT=' + map_object.uuid); - activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); - return; - } - - } - } - } - - - - - let clicked_teleport_tile_flag = false; - for(let i = 0; i < teleport_tiles.length; i++) { - let teleport_tile = teleport_tiles[i]; - - if(teleport_tile.x == clicked_tile.x && teleport_tile.y == clicked_tile.y) { - clicked_teleport_tile_flag = true; - break; - } - } - if(clicked_teleport_tile_flag) { - activate_click_animation("blue", mouse_over_now.x, mouse_over_now.y); - } else { - activate_click_animation("yellow", mouse_over_now.x, mouse_over_now.y); - } - - send_unrepeatable_bytes('CLICKED_TILE=' + clicked_tile.x + "~" + clicked_tile.y); -} - -// replace with patched listener -canvas.removeEventListener("mousedown", window.mouse_click_handler); -canvas.addEventListener("mousedown", mouse_click_handler_patched); diff --git a/packages/draw-player-on-top/draw-player-on-top.user.js b/packages/draw-player-on-top/draw-player-on-top.user.js deleted file mode 100644 index d6198be..0000000 --- a/packages/draw-player-on-top/draw-player-on-top.user.js +++ /dev/null @@ -1,252 +0,0 @@ -// ==UserScript== -// @name Draw your player on top -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant none -// @version 1.0 -// @author - -// @description 11/30/2025, 12:44:06 PM -// @inject-into page -// ==/UserScript== - -// Function to paint player extracted from loop in original paint_players function. -function paint_player(username) { - if (players.hasOwnProperty(username)) { - - - let client_x = players[username].client_x; - let client_y = players[username].client_y; - if(players[username].client_pathing != null && players[username].client_pathing.length > 0) { - - - let client_next_x_y = players[username].client_pathing[0]; - let client_next_x = client_next_x_y.x; - let client_next_y = client_next_x_y.y; - let speed = 2; - if(players[username].is_running) { - speed = 4; - } - - let moving = false; - if(client_x != client_next_x) { - if(client_next_x > client_x) { - moving = true; - players[username].client_x +=speed; - if(client_next_x < players[username].client_x) { - players[username].client_x = client_next_x; - } - } else if(client_next_x < client_x) { - moving = true; - players[username].client_x -=speed; - if(client_next_x > players[username].client_x) { - players[username].client_x = client_next_x; - } - } - } - - if(client_y != client_next_y) { - - if(client_next_y > client_y) { - moving = true; - players[username].client_y +=speed; - if(client_next_y < players[username].client_y) { - players[username].client_y = client_next_y; - } - } else if(client_next_y < client_y) { - moving = true; - players[username].client_y -=speed; - if(client_next_y > players[username].client_y) { - players[username].client_y = client_next_y; - } - } - } - if(!moving) { - players[username].client_pathing.shift(); - } - } - let flip = players[username].face_left; - - if(player_paint_dims.has(username)) { - ctx.globalAlpha = 0.2; - } - let body_animation = get_player_animation(username, 'body') - if(body_animation != null) { - let img = body_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - let necklace_animation = get_player_animation(username, 'necklace') - if(necklace_animation != null) { - let img = necklace_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - let head_animation = get_player_animation(username, 'head') - if(head_animation != null) { - let img = head_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - - let hair_animation = get_player_animation(username, 'hair') - if(hair_animation != null && (get_equipment(username, 'head') == 'none' || get_equipment(username, 'head') == 'dark')) { - let img = hair_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - let hat_animation = get_player_animation(username, 'hat') - if(hat_animation != null) { - const Y_OFFSET_40_16 = 8; // ONLY FOR HATS!!! - let img = hat_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE - Y_OFFSET_40_16); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE - Y_OFFSET_40_16); - } - } - - let legs_animation = get_player_animation(username, 'legs') - if(legs_animation != null) { - let img = legs_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - let boots_animation = get_player_animation(username, 'boots') - if(boots_animation != null) { - let img = boots_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - let gloves_animation = get_player_animation(username, 'gloves') - if(gloves_animation != null) { - let img = gloves_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - let weapon_animation = get_player_animation(username, 'weapon') - if(weapon_animation != null) { - let img = weapon_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - ctx.globalAlpha = 1.0; - - //usernames/levels - ctx.fillStyle = "yellow"; - let text_width = ctx.measureText(username).width; - ctx.fillText(username, client_x + TILE_SIZE / 2 - text_width/2, client_y + TILE_SIZE + TILE_SIZE/4); - ctx.fillStyle = "white"; - let text_level_width = ctx.measureText("level " + players[username].total_level).width; - if(players[username].total_level != null) { - ctx.fillText("level " + players[username].total_level, client_x + TILE_SIZE / 2 - text_level_width/2, client_y + TILE_SIZE + TILE_SIZE /2); - } - - //quest & ach icons - - if(players[username].has_all_quests && players[username].all_ach_completed) { - ctx.drawImage(quest_img, client_x - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - ctx.drawImage(ach_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - - } else { - if(players[username].has_all_quests) { - ctx.drawImage(quest_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - } - if(players[username].all_ach_completed) { - ctx.drawImage(ach_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - } - } - - - - //hp bar - if(players[username].hp != null && players[username].in_combat_ticker > 0) { - let max_hp = players[username].max_hp; - let hp = players[username].hp; - let perc = hp / max_hp; - ctx.fillStyle = "red"; - ctx.fillRect(players[username].client_x + 4, players[username].client_y - TILE_SIZE - TILE_SIZE/8, TILE_SIZE - 8, 10); - ctx.fillStyle = "lime"; - ctx.fillRect(players[username].client_x + 4, players[username].client_y - TILE_SIZE - TILE_SIZE/8, (TILE_SIZE - 8) * perc, 10); - players[username].in_combat_ticker--; - } - - - - //shadow - ctx.fillStyle = "black"; - ctx.beginPath(); - ctx.globalAlpha = 0.2; - ctx.ellipse(players[username].client_x + TILE_SIZE / 2, players[username].client_y + TILE_SIZE - TILE_SIZE / 8, 25, 14, Math.PI * 2, 0, 2 * Math.PI); - ctx.fill(); - ctx.globalAlpha = 1.0; - } -} - -// Follows code in original function, but skips painting in order to paint last. -function paint_players() { - for (let username in players) { - if(username === Globals.local_username) { - continue; - } - paint_player(username); - } - paint_player(Globals.local_username); -} -window.paint_player = paint_player; -window.paint_players = paint_players; diff --git a/packages/draw-player-on-top/index.ts b/packages/draw-player-on-top/index.ts deleted file mode 100644 index 2d8d469..0000000 --- a/packages/draw-player-on-top/index.ts +++ /dev/null @@ -1,164 +0,0 @@ - - -// ==UserScript== -// @name Better hotkeys -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue -// @version 0.001 -// @author Joshu -// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. -// @inject-into page -// ==/UserScript== - -// User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) -const HOTKEY_CONFIG = { - [GM_getValue('hotkey_worship', '1')]: { - originalKey: 'F1', - description: 'Worship - Activates the Run worship ability' - }, - [GM_getValue('hotkey_consumeFood', '2')]: { - originalKey: 'F2', - description: 'Inventory - Consumes a piece of food' - }, - [GM_getValue('hotkey_lightFire', '3')]: { - originalKey: 'F3', - description: 'Inventory - Lights a fire' - }, - [GM_getValue('hotkey_autoEquip1', 'q')]: { - originalKey: 'F6', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip2', 'w')]: { - originalKey: 'F7', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip3', 'e')]: { - originalKey: 'F8', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_badge1', 'a')]: { - originalKey: 'F9', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge2', 's')]: { - originalKey: 'F10', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge3', 'd')]: { - originalKey: 'F11', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge4', 'f')]: { - originalKey: 'F12', - description: 'Badge - Right click a badge and click the \'set key binding\'' - } -}; - - -//can be from canvas or chat input -const focusOrSendChat = () => { - const value = chat_ele.value.trim(); - - if (document.activeElement !== chat_ele) { - request_focus_chatbox(); - return; - } - - if(value !== "") { - Globals.websocket.send('CHAT=' + value); - chat_ele.value = ""; - } - request_unfocus_chatbox(); -} - -// Just leaving this section the same as the OG as much as possible -const handleNpcChatModal = (e) => { - let keyCode = e.keyCode; - if(has_npc_chat_message_modal_open()) { - if(keyCode == 32) { - document.getElementById("npc-chat-message-modal-continue-btn").click(); - e.preventDefault(); - } - return; - } - if(has_npc_chat_options_modal_open()) { - switch(keyCode) { - case 49: { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[0].style.display != 'none') { - options[0].click(); - } - } - break; - case 50: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[1].style.display != 'none') { - options[1].click(); - } - } - - break; - case 51: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[2].style.display != 'none') { - options[2].click(); - } - } - - break; - case 52: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[3].style.display != 'none') { - options[3].click(); - } - } - break; - } - } -} - -const hotkeyListener = (e) => { - if(e.repeat) return; - // Checks from original handler - if(Globals.local_username == null) return; - - if(has_npc_chat_message_modal_open()) { - handleNpcChatModal(e); - return; - } - - if(has_modal_open()) return; - - if (e.key === "Enter") { - focusOrSendChat(); - e.preventDefault(); - } - - if(document.activeElement.id != "body") { - return; - } - - if (e.key === "/") { - chat_ele.value = '/'; - request_focus_chatbox(); - e.preventDefault(); - } - - if (e.key in HOTKEY_CONFIG) { - const pressedHotkey = HOTKEY_CONFIG[e.key]; - Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`) - e.preventDefault(); - } -} - -window.removeEventListener("keypress", keypress_listener) -window.addEventListener("keydown", hotkeyListener, false); diff --git a/packages/draw-player-on-top/package.json b/packages/draw-player-on-top/package.json deleted file mode 100644 index a508bc2..0000000 --- a/packages/draw-player-on-top/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "@workspace/draw-player-on-top", - "version": "1.0.0", - "scripts": { - "build": "bun build --compile --minify-whitespace --minify-syntax --targetbun --outfile dist/app ./better-custom-hotkeys.user.js" - }, - "dependencies": {}, - "devDependencies": { - "@violentmonkey/types": "^0.3.1" - } -} From 751bedda948d0eb1a89ff75b5f05c640cb8262d4 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 15 Dec 2025 22:05:22 -0500 Subject: [PATCH 07/87] added missing moved files --- packages/flatmmo/draw-player-on-top.user.js | 252 ++++++++++++++++++ ...ground-item-monster-click-conflict.user.js | 135 ++++++++++ 2 files changed, 387 insertions(+) create mode 100644 packages/flatmmo/draw-player-on-top.user.js create mode 100644 packages/flatmmo/fix-ground-item-monster-click-conflict.user.js diff --git a/packages/flatmmo/draw-player-on-top.user.js b/packages/flatmmo/draw-player-on-top.user.js new file mode 100644 index 0000000..d6198be --- /dev/null +++ b/packages/flatmmo/draw-player-on-top.user.js @@ -0,0 +1,252 @@ +// ==UserScript== +// @name Draw your player on top +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant none +// @version 1.0 +// @author - +// @description 11/30/2025, 12:44:06 PM +// @inject-into page +// ==/UserScript== + +// Function to paint player extracted from loop in original paint_players function. +function paint_player(username) { + if (players.hasOwnProperty(username)) { + + + let client_x = players[username].client_x; + let client_y = players[username].client_y; + if(players[username].client_pathing != null && players[username].client_pathing.length > 0) { + + + let client_next_x_y = players[username].client_pathing[0]; + let client_next_x = client_next_x_y.x; + let client_next_y = client_next_x_y.y; + let speed = 2; + if(players[username].is_running) { + speed = 4; + } + + let moving = false; + if(client_x != client_next_x) { + if(client_next_x > client_x) { + moving = true; + players[username].client_x +=speed; + if(client_next_x < players[username].client_x) { + players[username].client_x = client_next_x; + } + } else if(client_next_x < client_x) { + moving = true; + players[username].client_x -=speed; + if(client_next_x > players[username].client_x) { + players[username].client_x = client_next_x; + } + } + } + + if(client_y != client_next_y) { + + if(client_next_y > client_y) { + moving = true; + players[username].client_y +=speed; + if(client_next_y < players[username].client_y) { + players[username].client_y = client_next_y; + } + } else if(client_next_y < client_y) { + moving = true; + players[username].client_y -=speed; + if(client_next_y > players[username].client_y) { + players[username].client_y = client_next_y; + } + } + } + if(!moving) { + players[username].client_pathing.shift(); + } + } + let flip = players[username].face_left; + + if(player_paint_dims.has(username)) { + ctx.globalAlpha = 0.2; + } + let body_animation = get_player_animation(username, 'body') + if(body_animation != null) { + let img = body_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + + let necklace_animation = get_player_animation(username, 'necklace') + if(necklace_animation != null) { + let img = necklace_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + + let head_animation = get_player_animation(username, 'head') + if(head_animation != null) { + let img = head_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + + + let hair_animation = get_player_animation(username, 'hair') + if(hair_animation != null && (get_equipment(username, 'head') == 'none' || get_equipment(username, 'head') == 'dark')) { + let img = hair_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + + let hat_animation = get_player_animation(username, 'hat') + if(hat_animation != null) { + const Y_OFFSET_40_16 = 8; // ONLY FOR HATS!!! + let img = hat_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE - Y_OFFSET_40_16); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE - Y_OFFSET_40_16); + } + } + + let legs_animation = get_player_animation(username, 'legs') + if(legs_animation != null) { + let img = legs_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + let boots_animation = get_player_animation(username, 'boots') + if(boots_animation != null) { + let img = boots_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + let gloves_animation = get_player_animation(username, 'gloves') + if(gloves_animation != null) { + let img = gloves_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + let weapon_animation = get_player_animation(username, 'weapon') + if(weapon_animation != null) { + let img = weapon_animation.get_frame() + if(flip) { + ctx.scale(-1, 1); + ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } + else { + ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); + } + } + + ctx.globalAlpha = 1.0; + + //usernames/levels + ctx.fillStyle = "yellow"; + let text_width = ctx.measureText(username).width; + ctx.fillText(username, client_x + TILE_SIZE / 2 - text_width/2, client_y + TILE_SIZE + TILE_SIZE/4); + ctx.fillStyle = "white"; + let text_level_width = ctx.measureText("level " + players[username].total_level).width; + if(players[username].total_level != null) { + ctx.fillText("level " + players[username].total_level, client_x + TILE_SIZE / 2 - text_level_width/2, client_y + TILE_SIZE + TILE_SIZE /2); + } + + //quest & ach icons + + if(players[username].has_all_quests && players[username].all_ach_completed) { + ctx.drawImage(quest_img, client_x - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); + ctx.drawImage(ach_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); + + } else { + if(players[username].has_all_quests) { + ctx.drawImage(quest_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); + } + if(players[username].all_ach_completed) { + ctx.drawImage(ach_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); + } + } + + + + //hp bar + if(players[username].hp != null && players[username].in_combat_ticker > 0) { + let max_hp = players[username].max_hp; + let hp = players[username].hp; + let perc = hp / max_hp; + ctx.fillStyle = "red"; + ctx.fillRect(players[username].client_x + 4, players[username].client_y - TILE_SIZE - TILE_SIZE/8, TILE_SIZE - 8, 10); + ctx.fillStyle = "lime"; + ctx.fillRect(players[username].client_x + 4, players[username].client_y - TILE_SIZE - TILE_SIZE/8, (TILE_SIZE - 8) * perc, 10); + players[username].in_combat_ticker--; + } + + + + //shadow + ctx.fillStyle = "black"; + ctx.beginPath(); + ctx.globalAlpha = 0.2; + ctx.ellipse(players[username].client_x + TILE_SIZE / 2, players[username].client_y + TILE_SIZE - TILE_SIZE / 8, 25, 14, Math.PI * 2, 0, 2 * Math.PI); + ctx.fill(); + ctx.globalAlpha = 1.0; + } +} + +// Follows code in original function, but skips painting in order to paint last. +function paint_players() { + for (let username in players) { + if(username === Globals.local_username) { + continue; + } + paint_player(username); + } + paint_player(Globals.local_username); +} +window.paint_player = paint_player; +window.paint_players = paint_players; diff --git a/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js b/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js new file mode 100644 index 0000000..cad1bcc --- /dev/null +++ b/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js @@ -0,0 +1,135 @@ + +// ==UserScript== +// @name Fix other user item enemy click conflict +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant none +// @version 0.0000001 +// @author - +// @description Fix issue where you can't click on an enemy if they are also standing on another players drop. +// @inject-into page. Currently just clicks both the enemy and the ground tile if both exist since theres no way to tell if an item is your's before clikcing on it and the update is async from the websocket +// ==/UserScript== + +// Function to paint player extracted from loop in original paint_players function. +function mouse_click_handler_patched(e) { + if(Globals.local_username == null) { + return; + } + let bounding_client_rect = canvas.getBoundingClientRect(); + const relativeX = (e.clientX - bounding_client_rect.left) / canvas_scale; + const relativeY = (e.clientY - bounding_client_rect.top) / canvas_scale; + + let clicked_tile = get_postition_from_pixel(relativeX, relativeY); + + //dev tool + if(tile_marker_mode) { + for(let i = 0; i < tiles_marked.length; i++) { + let tile = tiles_marked[i]; + if(tile.x == clicked_tile.x && tile.y == clicked_tile.y) { + tiles_marked.splice(i, 1) + return; + } + } + + tiles_marked.push({x: clicked_tile.x, y: clicked_tile.y}); + return; + } + + //highlight players + for (let username in players) { + if (players.hasOwnProperty(username)) { + let player = players[username]; + if(is_mouse_on_player(mouse_over_now.x, mouse_over_now.y, player)) { + if(e.which == 3) { + Globals.websocket.send('RIGHT_CLICKED_PLAYER=' + username); + return; + } + } + } + } + + for(let i = 0; i < ground_items.length; i++) { + let ground_item = ground_items[i]; + if(is_mouse_on_ground_item(clicked_tile.x, clicked_tile.y, ground_item)) { + Globals.websocket.send('CLICKED_GROUND_ITEM=' + ground_item.uuid); + activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); + // only break if going to click npc and not right click. kinda jank but want to minimize the diff. is_hidden means the npc is dead.... + if(Object.values(npcs).some((n) => !n.is_hidden && is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, n)) && e.which !== 3) { + break; + } + return; + } + } + + let npcs_clicked_uuid = []; + for (let uuid in npcs) { + if (npcs.hasOwnProperty(uuid)) { + let npc = npcs[uuid]; + if(npc.is_hidden) { + continue; + } + // npc.is_mouse_hovering_over() -- changed for mobile fix. + + if(is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, npc)) { + + if(e.which == 3) { + Globals.websocket.send('MONSTER_LOG=' + npc.name); + return; + } + if(npc.has_click_priority) { + npcs_clicked_uuid.unshift(npc.uuid); + } else { + npcs_clicked_uuid.push(npc.uuid); + } + } + } + } + + + if(npcs_clicked_uuid.length > 0) { + send_unrepeatable_bytes_1s('CLICKS_NPC=' + npcs_clicked_uuid[0]); + activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); + return; + } + + for(let i = 0; i < map_objects.length; i++) { + let map_object = map_objects[i]; + if(is_mouse_on_map_object(clicked_tile.x, clicked_tile.y, map_object)) { + if(map_object.is_interactable()) { + if(e.which == 3) { + Globals.websocket.send('RIGHT_CLICKED_MAP_OBJECT=' + map_object.uuid); + return; + } else { + send_unrepeatable_bytes_1s('CLICKED_MAP_OBJECT=' + map_object.uuid); + activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); + return; + } + + } + } + } + + + + + let clicked_teleport_tile_flag = false; + for(let i = 0; i < teleport_tiles.length; i++) { + let teleport_tile = teleport_tiles[i]; + + if(teleport_tile.x == clicked_tile.x && teleport_tile.y == clicked_tile.y) { + clicked_teleport_tile_flag = true; + break; + } + } + if(clicked_teleport_tile_flag) { + activate_click_animation("blue", mouse_over_now.x, mouse_over_now.y); + } else { + activate_click_animation("yellow", mouse_over_now.x, mouse_over_now.y); + } + + send_unrepeatable_bytes('CLICKED_TILE=' + clicked_tile.x + "~" + clicked_tile.y); +} + +// replace with patched listener +canvas.removeEventListener("mousedown", window.mouse_click_handler); +canvas.addEventListener("mousedown", mouse_click_handler_patched); From 6b921ca39344456ba2f24ccb2c739d0b4a5d5ccc Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 13:24:28 -0500 Subject: [PATCH 08/87] mostly working packaging --- default.nix | 4 +-- flake.nix | 4 ++- mkUserscript.nix | 37 +++++++++++++++++++++ packages/better-custom-hotkeys/metadata.js | 11 ++++++ packages/better-custom-hotkeys/package.json | 4 +-- 5 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 mkUserscript.nix create mode 100644 packages/better-custom-hotkeys/metadata.js diff --git a/default.nix b/default.nix index 2fa7744..4138ca3 100644 --- a/default.nix +++ b/default.nix @@ -3,7 +3,7 @@ stdenv, ... }: -stdenv.mkDerivation { +stdenv.mkDerivation rec { pname = "test-build"; version = "1.0.0"; @@ -18,7 +18,7 @@ stdenv.mkDerivation { }; buildPhase = '' - bun run build.ts + bun build ./packages/better-custom-hotkeys/index.ts --outfile dist/${pname}.user.js ''; installPhase = '' diff --git a/flake.nix b/flake.nix index ac77101..2cc4a1a 100644 --- a/flake.nix +++ b/flake.nix @@ -50,7 +50,9 @@ packages = { # Produce a package for this template with bun2nix in # the overlay - default = pkgs.callPackage ./default.nix { }; + default = pkgs.callPackage ./mkUserscript.nix { + packagePath = ./packages/better-custom-hotkeys; + }; }; devShells.default = pkgs.mkShell { nativeBuildInputs = with pkgs; [ diff --git a/mkUserscript.nix b/mkUserscript.nix new file mode 100644 index 0000000..c727171 --- /dev/null +++ b/mkUserscript.nix @@ -0,0 +1,37 @@ +{ + bun2nix, + stdenv, + packagePath, + ... +}: +let + pkgJsonContents = builtins.readFile "${packagePath}/package.json"; + package = builtins.fromJSON pkgJsonContents; + pname = package.name; + inherit (package) version; + module = "${packagePath}/${package.module}"; + metadata = builtins.readFile "${packagePath}/metadata.js"; +in +stdenv.mkDerivation { + inherit pname version; + + src = ./.; + + nativeBuildInputs = [ + bun2nix.hook + ]; + + bunDeps = bun2nix.fetchBunDeps { + bunNix = ./bun.nix; + }; + + buildPhase = '' + bun build ${module} --outfile dist/${pname}.user.js --banner "${metadata}" + ''; + + installPhase = '' + mkdir -p $out/dist + + cp -R ./dist $out + ''; +} diff --git a/packages/better-custom-hotkeys/metadata.js b/packages/better-custom-hotkeys/metadata.js new file mode 100644 index 0000000..621c665 --- /dev/null +++ b/packages/better-custom-hotkeys/metadata.js @@ -0,0 +1,11 @@ +// ==UserScript== +// @name Better hotkeys +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.001 +// @author Joshu +// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. +// @inject-into page +// ==/UserScript== diff --git a/packages/better-custom-hotkeys/package.json b/packages/better-custom-hotkeys/package.json index b0d9b4b..a4c189a 100644 --- a/packages/better-custom-hotkeys/package.json +++ b/packages/better-custom-hotkeys/package.json @@ -1,9 +1,7 @@ { "name": "@workspace/better-custom-hotkeys", "version": "1.0.0", - "scripts": { - "build": "bun build --compile --minify-whitespace --minify-syntax --targetbun --outfile dist/app ./better-custom-hotkeys.user.js" - }, + "module": "index.ts", "dependencies": {}, "devDependencies": { "@violentmonkey/types": "^0.3.1", From 24df51b0aa7211b87b764027ad6485d3e3c8b27d Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 13:24:50 -0500 Subject: [PATCH 09/87] direnv --- .envrc | 1 + 1 file changed, 1 insertion(+) create mode 100644 .envrc diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..3550a30 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +use flake From fff5248cda344a755ccfe5fa6caf7057797fceea Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 14:51:57 -0500 Subject: [PATCH 10/87] formatting --- build.ts | 8 +- default.nix | 29 - flake.lock | 37 +- flake.nix | 8 + package.json | 28 +- .../better-custom-hotkeys.user.js | 267 ++++---- packages/better-custom-hotkeys/index.ts | 270 +++++---- packages/better-custom-hotkeys/package.json | 16 +- packages/flatmmo-types/flatmmo.d.ts | 18 +- packages/flatmmo-types/package.json | 8 +- packages/flatmmo/draw-player-on-top.user.js | 573 +++++++++++------- ...ground-item-monster-click-conflict.user.js | 239 ++++---- packages/wiki/header-links.user.js | 84 ++- packages/wiki/image-links.user.js | 387 ++++++------ packages/wiki/table-links.user.js | 98 ++- tsconfig.json | 46 +- 16 files changed, 1136 insertions(+), 980 deletions(-) delete mode 100644 default.nix diff --git a/build.ts b/build.ts index 111d19f..c10d7f5 100644 --- a/build.ts +++ b/build.ts @@ -1,8 +1,8 @@ const packageName = "better-custom-hotkeys"; await Bun.build({ - entrypoints: ["./packages/better-custom-hotkeys/index.ts"], - banner: ` + entrypoints: ["./packages/better-custom-hotkeys/index.ts"], + banner: ` // ==UserScript== // @name Better hotkeys // @namespace Violentmonkey Scripts @@ -15,6 +15,6 @@ await Bun.build({ // @inject-into page // ==/UserScript== `, - outdir: "./dist", - naming: `${packageName}.user.js` + outdir: "./dist", + naming: `${packageName}.user.js`, }); diff --git a/default.nix b/default.nix deleted file mode 100644 index 4138ca3..0000000 --- a/default.nix +++ /dev/null @@ -1,29 +0,0 @@ -{ - bun2nix, - stdenv, - ... -}: -stdenv.mkDerivation rec { - pname = "test-build"; - version = "1.0.0"; - - src = ./.; - - nativeBuildInputs = [ - bun2nix.hook - ]; - - bunDeps = bun2nix.fetchBunDeps { - bunNix = ./bun.nix; - }; - - buildPhase = '' - bun build ./packages/better-custom-hotkeys/index.ts --outfile dist/${pname}.user.js - ''; - - installPhase = '' - mkdir -p $out/dist - - cp -R ./dist $out - ''; -} diff --git a/flake.lock b/flake.lock index 3933331..2c535c9 100644 --- a/flake.lock +++ b/flake.lock @@ -124,12 +124,29 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1761236834, + "narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixpkgs-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, "root": { "inputs": { "bun2nix": "bun2nix", "flake-parts": "flake-parts_2", "nixpkgs": "nixpkgs", - "systems": "systems" + "systems": "systems", + "treefmt-nix": "treefmt-nix_2" } }, "systems": { @@ -167,6 +184,24 @@ "repo": "treefmt-nix", "type": "github" } + }, + "treefmt-nix_2": { + "inputs": { + "nixpkgs": "nixpkgs_2" + }, + "locked": { + "lastModified": 1762938485, + "narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=", + "owner": "numtide", + "repo": "treefmt-nix", + "rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "treefmt-nix", + "type": "github" + } } }, "root": "root", diff --git a/flake.nix b/flake.nix index 2cc4a1a..c96d74e 100644 --- a/flake.nix +++ b/flake.nix @@ -10,6 +10,7 @@ bun2nix.inputs.systems.follows = "systems"; flake-parts.url = "github:hercules-ci/flake-parts"; + treefmt-nix.url = "github:numtide/treefmt-nix"; }; # Use the cached version of bun2nix from the nix-community cli @@ -37,6 +38,9 @@ "x86_64-linux" "aarch64-darwin" ]; + imports = [ + inputs.treefmt-nix.flakeModule + ]; perSystem = { pkgs, system, ... }: { @@ -47,6 +51,10 @@ overlays = [ inputs.bun2nix.overlays.default ]; }; + treefmt = { + programs.biome.enable = true; + }; + packages = { # Produce a package for this template with bun2nix in # the overlay diff --git a/package.json b/package.json index a5e4c65..03fec02 100644 --- a/package.json +++ b/package.json @@ -1,16 +1,16 @@ { - "name": "flatmmo-userscripts-workspace", - "workspaces": [ - "packages/*" - ], - "scripts": { - "postinstall": "bun2nix -o bun.nix" - }, - "devDependencies": { - "@types/bun": "^1.3.4", - "@violentmonkey/types": "^0.3.1", - "bun2nix": "^2.0.0", - "typescript": "^5.9.3", - "@workspace/flatmmo-types": "workspace:*" - } + "name": "flatmmo-userscripts-workspace", + "workspaces": [ + "packages/*" + ], + "scripts": { + "postinstall": "bun2nix -o bun.nix" + }, + "devDependencies": { + "@types/bun": "^1.3.4", + "@violentmonkey/types": "^0.3.1", + "bun2nix": "^2.0.0", + "typescript": "^5.9.3", + "@workspace/flatmmo-types": "workspace:*" + } } diff --git a/packages/better-custom-hotkeys/better-custom-hotkeys.user.js b/packages/better-custom-hotkeys/better-custom-hotkeys.user.js index 98bf2b7..ecfe475 100644 --- a/packages/better-custom-hotkeys/better-custom-hotkeys.user.js +++ b/packages/better-custom-hotkeys/better-custom-hotkeys.user.js @@ -1,4 +1,3 @@ - // ==UserScript== // @name Better hotkeys // @namespace Violentmonkey Scripts @@ -13,151 +12,159 @@ // User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) const HOTKEY_CONFIG = { - [GM_getValue('hotkey_worship', '1')]: { - originalKey: 'F1', - description: 'Worship - Activates the Run worship ability' - }, - [GM_getValue('hotkey_consumeFood', '2')]: { - originalKey: 'F2', - description: 'Inventory - Consumes a piece of food' - }, - [GM_getValue('hotkey_lightFire', '3')]: { - originalKey: 'F3', - description: 'Inventory - Lights a fire' - }, - [GM_getValue('hotkey_autoEquip1', 'q')]: { - originalKey: 'F6', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip2', 'w')]: { - originalKey: 'F7', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip3', 'e')]: { - originalKey: 'F8', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_badge1', 'a')]: { - originalKey: 'F9', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge2', 's')]: { - originalKey: 'F10', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge3', 'd')]: { - originalKey: 'F11', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge4', 'f')]: { - originalKey: 'F12', - description: 'Badge - Right click a badge and click the \'set key binding\'' - } + [GM_getValue("hotkey_worship", "1")]: { + originalKey: "F1", + description: "Worship - Activates the Run worship ability", + }, + [GM_getValue("hotkey_consumeFood", "2")]: { + originalKey: "F2", + description: "Inventory - Consumes a piece of food", + }, + [GM_getValue("hotkey_lightFire", "3")]: { + originalKey: "F3", + description: "Inventory - Lights a fire", + }, + [GM_getValue("hotkey_autoEquip1", "q")]: { + originalKey: "F6", + description: "Equipment - Auto equips items that you've configured", + }, + [GM_getValue("hotkey_autoEquip2", "w")]: { + originalKey: "F7", + description: "Equipment - Auto equips items that you've configured", + }, + [GM_getValue("hotkey_autoEquip3", "e")]: { + originalKey: "F8", + description: "Equipment - Auto equips items that you've configured", + }, + [GM_getValue("hotkey_badge1", "a")]: { + originalKey: "F9", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + [GM_getValue("hotkey_badge2", "s")]: { + originalKey: "F10", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + [GM_getValue("hotkey_badge3", "d")]: { + originalKey: "F11", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + [GM_getValue("hotkey_badge4", "f")]: { + originalKey: "F12", + description: "Badge - Right click a badge and click the 'set key binding'", + }, }; - //can be from canvas or chat input const focusOrSendChat = () => { - const value = chat_ele.value.trim(); + const value = chat_ele.value.trim(); - if (document.activeElement !== chat_ele) { - request_focus_chatbox(); - return; - } + if (document.activeElement !== chat_ele) { + request_focus_chatbox(); + return; + } - if(value !== "") { - Globals.websocket.send('CHAT=' + value); - chat_ele.value = ""; - } - request_unfocus_chatbox(); -} + if (value !== "") { + Globals.websocket.send("CHAT=" + value); + chat_ele.value = ""; + } + request_unfocus_chatbox(); +}; // Just leaving this section the same as the OG as much as possible const handleNpcChatModal = (e) => { - let keyCode = e.keyCode; - if(has_npc_chat_message_modal_open()) { - if(keyCode == 32) { - document.getElementById("npc-chat-message-modal-continue-btn").click(); - e.preventDefault(); - } - return; - } - if(has_npc_chat_options_modal_open()) { - switch(keyCode) { - case 49: { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[0].style.display != 'none') { - options[0].click(); - } - } - break; - case 50: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[1].style.display != 'none') { - options[1].click(); - } - } + const keyCode = e.keyCode; + if (has_npc_chat_message_modal_open()) { + if (keyCode == 32) { + document.getElementById("npc-chat-message-modal-continue-btn").click(); + e.preventDefault(); + } + return; + } + if (has_npc_chat_options_modal_open()) { + switch (keyCode) { + case 49: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper.getElementsByTagName("div"); + if (options[0].style.display != "none") { + options[0].click(); + } + } + break; + case 50: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper.getElementsByTagName("div"); + if (options[1].style.display != "none") { + options[1].click(); + } + } - break; - case 51: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[2].style.display != 'none') { - options[2].click(); - } - } + break; + case 51: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper.getElementsByTagName("div"); + if (options[2].style.display != "none") { + options[2].click(); + } + } - break; - case 52: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper.getElementsByTagName("div"); - if(options[3].style.display != 'none') { - options[3].click(); - } - } - break; - } - } -} + break; + case 52: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper.getElementsByTagName("div"); + if (options[3].style.display != "none") { + options[3].click(); + } + } + break; + } + } +}; const hotkeyListener = (e) => { - if(e.repeat) return; - // Checks from original handler - if(Globals.local_username == null) return; + if (e.repeat) return; + // Checks from original handler + if (Globals.local_username == null) return; - if(has_npc_chat_message_modal_open()) { - handleNpcChatModal(e); - return; - } - - if(has_modal_open()) return; + if (has_npc_chat_message_modal_open()) { + handleNpcChatModal(e); + return; + } - if (e.key === "Enter") { - focusOrSendChat(); - e.preventDefault(); - } - - if(document.activeElement.id != "body") { - return; - } + if (has_modal_open()) return; - if (e.key === "/") { - chat_ele.value = '/'; - request_focus_chatbox(); - e.preventDefault(); - } + if (e.key === "Enter") { + focusOrSendChat(); + e.preventDefault(); + } - if (e.key in HOTKEY_CONFIG) { - const pressedHotkey = HOTKEY_CONFIG[e.key]; - Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`) - e.preventDefault(); - } -} + if (document.activeElement.id != "body") { + return; + } + + if (e.key === "/") { + chat_ele.value = "/"; + request_focus_chatbox(); + e.preventDefault(); + } + + if (e.key in HOTKEY_CONFIG) { + const pressedHotkey = HOTKEY_CONFIG[e.key]; + Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`); + e.preventDefault(); + } +}; -window.removeEventListener("keypress", keypress_listener) +window.removeEventListener("keypress", keypress_listener); window.addEventListener("keydown", hotkeyListener, false); diff --git a/packages/better-custom-hotkeys/index.ts b/packages/better-custom-hotkeys/index.ts index d2e9c3d..f3f9a4e 100644 --- a/packages/better-custom-hotkeys/index.ts +++ b/packages/better-custom-hotkeys/index.ts @@ -1,152 +1,162 @@ // import { chat_ele, request_focus_chatbox, Globals, request_unfocus_chatbox, has_npc_chat_message_modal_open, has_modal_open, has_npc_chat_options_modal_open, keypress_listener } from "flatmmo"; // User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) -const HOTKEY_CONFIG: {[x: string]: {originalKey: string; description: string}} = { - [GM_getValue('hotkey_worship', '1')]: { - originalKey: 'F1', - description: 'Worship - Activates the Run worship ability' - }, - [GM_getValue('hotkey_consumeFood', '2')]: { - originalKey: 'F2', - description: 'Inventory - Consumes a piece of food' - }, - [GM_getValue('hotkey_lightFire', '3')]: { - originalKey: 'F3', - description: 'Inventory - Lights a fire' - }, - [GM_getValue('hotkey_autoEquip1', 'q')]: { - originalKey: 'F6', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip2', 'w')]: { - originalKey: 'F7', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_autoEquip3', 'e')]: { - originalKey: 'F8', - description: 'Equipment - Auto equips items that you\'ve configured' - }, - [GM_getValue('hotkey_badge1', 'a')]: { - originalKey: 'F9', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge2', 's')]: { - originalKey: 'F10', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge3', 'd')]: { - originalKey: 'F11', - description: 'Badge - Right click a badge and click the \'set key binding\'' - }, - [GM_getValue('hotkey_badge4', 'f')]: { - originalKey: 'F12', - description: 'Badge - Right click a badge and click the \'set key binding\'' - } +const HOTKEY_CONFIG: { + [x: string]: { originalKey: string; description: string }; +} = { + [GM_getValue("hotkey_worship", "1")]: { + originalKey: "F1", + description: "Worship - Activates the Run worship ability", + }, + [GM_getValue("hotkey_consumeFood", "2")]: { + originalKey: "F2", + description: "Inventory - Consumes a piece of food", + }, + [GM_getValue("hotkey_lightFire", "3")]: { + originalKey: "F3", + description: "Inventory - Lights a fire", + }, + [GM_getValue("hotkey_autoEquip1", "q")]: { + originalKey: "F6", + description: "Equipment - Auto equips items that you've configured", + }, + [GM_getValue("hotkey_autoEquip2", "w")]: { + originalKey: "F7", + description: "Equipment - Auto equips items that you've configured", + }, + [GM_getValue("hotkey_autoEquip3", "e")]: { + originalKey: "F8", + description: "Equipment - Auto equips items that you've configured", + }, + [GM_getValue("hotkey_badge1", "a")]: { + originalKey: "F9", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + [GM_getValue("hotkey_badge2", "s")]: { + originalKey: "F10", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + [GM_getValue("hotkey_badge3", "d")]: { + originalKey: "F11", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + [GM_getValue("hotkey_badge4", "f")]: { + originalKey: "F12", + description: "Badge - Right click a badge and click the 'set key binding'", + }, }; - //can be from canvas or chat input const focusOrSendChat = () => { - const value = chat_ele.value.trim(); + const value = chat_ele.value.trim(); - if (document.activeElement !== chat_ele) { - request_focus_chatbox(); - return; - } + if (document.activeElement !== chat_ele) { + request_focus_chatbox(); + return; + } - if(value !== "") { - Globals.websocket.send('CHAT=' + value); - chat_ele.value = ""; - } - request_unfocus_chatbox(); -} + if (value !== "") { + Globals.websocket.send("CHAT=" + value); + chat_ele.value = ""; + } + request_unfocus_chatbox(); +}; // Just leaving this section the same as the OG as much as possible const handleNpcChatModal = (e: KeyboardEvent) => { - let keyCode = e.keyCode; - if(has_npc_chat_message_modal_open()) { - if(keyCode == 32) { - document.getElementById("npc-chat-message-modal-continue-btn")?.click(); - e.preventDefault(); - } - return; - } - if(has_npc_chat_options_modal_open()) { - switch(keyCode) { - case 49: { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper?.getElementsByTagName("div"); - if(options && options[0].style.display != 'none') { - options[0].click(); - } - } - break; - case 50: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper?.getElementsByTagName("div"); - if(options && options[1].style.display != 'none') { - options[1].click(); - } - } + const keyCode = e.keyCode; + if (has_npc_chat_message_modal_open()) { + if (keyCode == 32) { + document.getElementById("npc-chat-message-modal-continue-btn")?.click(); + e.preventDefault(); + } + return; + } + if (has_npc_chat_options_modal_open()) { + switch (keyCode) { + case 49: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[0].style.display != "none") { + options[0].click(); + } + } + break; + case 50: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[1].style.display != "none") { + options[1].click(); + } + } - break; - case 51: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper?.getElementsByTagName("div"); - if(options && options[2].style.display != 'none') { - options[2].click(); - } - } + break; + case 51: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[2].style.display != "none") { + options[2].click(); + } + } - break; - case 52: - { - let wrapper = document.getElementById("npc-chat-options-modal-content"); - let options = wrapper?.getElementsByTagName("div"); - if(options && options[3].style.display != 'none') { - options[3].click(); - } - } - break; - } - } -} + break; + case 52: + { + const wrapper = document.getElementById( + "npc-chat-options-modal-content", + ); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[3].style.display != "none") { + options[3].click(); + } + } + break; + } + } +}; const hotkeyListener = (e: KeyboardEvent) => { - if(e.repeat) return; - // Checks from original handler - if(Globals.local_username == null) return; + if (e.repeat) return; + // Checks from original handler + if (Globals.local_username == null) return; - if(has_npc_chat_message_modal_open()) { - handleNpcChatModal(e); - return; - } - - if(has_modal_open()) return; + if (has_npc_chat_message_modal_open()) { + handleNpcChatModal(e); + return; + } - if (e.key === "Enter") { - focusOrSendChat(); - e.preventDefault(); - } - - if(document.activeElement?.id != "body") { - return; - } + if (has_modal_open()) return; - if (e.key === "/") { - chat_ele.value = '/'; - request_focus_chatbox(); - e.preventDefault(); - } + if (e.key === "Enter") { + focusOrSendChat(); + e.preventDefault(); + } - if (e.key in HOTKEY_CONFIG) { - const pressedHotkey = HOTKEY_CONFIG[e.key]; - Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`) - e.preventDefault(); - } -} + if (document.activeElement?.id != "body") { + return; + } + + if (e.key === "/") { + chat_ele.value = "/"; + request_focus_chatbox(); + e.preventDefault(); + } + + if (e.key in HOTKEY_CONFIG) { + const pressedHotkey = HOTKEY_CONFIG[e.key]; + Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`); + e.preventDefault(); + } +}; -window.removeEventListener("keypress", keypress_listener) +window.removeEventListener("keypress", keypress_listener); window.addEventListener("keydown", hotkeyListener, false); diff --git a/packages/better-custom-hotkeys/package.json b/packages/better-custom-hotkeys/package.json index a4c189a..b57e9d6 100644 --- a/packages/better-custom-hotkeys/package.json +++ b/packages/better-custom-hotkeys/package.json @@ -1,10 +1,10 @@ { - "name": "@workspace/better-custom-hotkeys", - "version": "1.0.0", - "module": "index.ts", - "dependencies": {}, - "devDependencies": { - "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*" - } + "name": "@workspace/better-custom-hotkeys", + "version": "1.0.0", + "module": "index.ts", + "dependencies": {}, + "devDependencies": { + "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*" + } } diff --git a/packages/flatmmo-types/flatmmo.d.ts b/packages/flatmmo-types/flatmmo.d.ts index 9a0dfdf..d7766b9 100644 --- a/packages/flatmmo-types/flatmmo.d.ts +++ b/packages/flatmmo-types/flatmmo.d.ts @@ -8,14 +8,14 @@ declare function has_modal_open(): boolean; declare function keypress_listener(): void; declare const chat_ele: HTMLInputElement; - // const chat_ele: HTMLInputElement; - // const Globals: {websocket: WebSocket}; - interface Globals { - websocket: WebSocket; - local_username: string; - local_id: string; - tab_active: boolean; - websocket_url: string; - } +// const chat_ele: HTMLInputElement; +// const Globals: {websocket: WebSocket}; +interface Globals { + websocket: WebSocket; + local_username: string; + local_id: string; + tab_active: boolean; + websocket_url: string; +} declare const Globals: Globals; diff --git a/packages/flatmmo-types/package.json b/packages/flatmmo-types/package.json index 8f653e5..0ab88c7 100644 --- a/packages/flatmmo-types/package.json +++ b/packages/flatmmo-types/package.json @@ -1,6 +1,6 @@ { - "name": "@workspace/flatmmo-types", - "version": "0.0.1", - "dependencies": {}, - "devDependencies": {} + "name": "@workspace/flatmmo-types", + "version": "0.0.1", + "dependencies": {}, + "devDependencies": {} } diff --git a/packages/flatmmo/draw-player-on-top.user.js b/packages/flatmmo/draw-player-on-top.user.js index d6198be..3b9331d 100644 --- a/packages/flatmmo/draw-player-on-top.user.js +++ b/packages/flatmmo/draw-player-on-top.user.js @@ -11,242 +11,351 @@ // Function to paint player extracted from loop in original paint_players function. function paint_player(username) { - if (players.hasOwnProperty(username)) { - - - let client_x = players[username].client_x; - let client_y = players[username].client_y; - if(players[username].client_pathing != null && players[username].client_pathing.length > 0) { - - - let client_next_x_y = players[username].client_pathing[0]; - let client_next_x = client_next_x_y.x; - let client_next_y = client_next_x_y.y; - let speed = 2; - if(players[username].is_running) { - speed = 4; - } - - let moving = false; - if(client_x != client_next_x) { - if(client_next_x > client_x) { - moving = true; - players[username].client_x +=speed; - if(client_next_x < players[username].client_x) { - players[username].client_x = client_next_x; - } - } else if(client_next_x < client_x) { - moving = true; - players[username].client_x -=speed; - if(client_next_x > players[username].client_x) { - players[username].client_x = client_next_x; - } - } - } - - if(client_y != client_next_y) { - - if(client_next_y > client_y) { - moving = true; - players[username].client_y +=speed; - if(client_next_y < players[username].client_y) { - players[username].client_y = client_next_y; - } - } else if(client_next_y < client_y) { - moving = true; - players[username].client_y -=speed; - if(client_next_y > players[username].client_y) { - players[username].client_y = client_next_y; - } - } - } - if(!moving) { - players[username].client_pathing.shift(); - } - } - let flip = players[username].face_left; - - if(player_paint_dims.has(username)) { - ctx.globalAlpha = 0.2; - } - let body_animation = get_player_animation(username, 'body') - if(body_animation != null) { - let img = body_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - let necklace_animation = get_player_animation(username, 'necklace') - if(necklace_animation != null) { - let img = necklace_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - let head_animation = get_player_animation(username, 'head') - if(head_animation != null) { - let img = head_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - - let hair_animation = get_player_animation(username, 'hair') - if(hair_animation != null && (get_equipment(username, 'head') == 'none' || get_equipment(username, 'head') == 'dark')) { - let img = hair_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - let hat_animation = get_player_animation(username, 'hat') - if(hat_animation != null) { - const Y_OFFSET_40_16 = 8; // ONLY FOR HATS!!! - let img = hat_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE - Y_OFFSET_40_16); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE - Y_OFFSET_40_16); - } - } - - let legs_animation = get_player_animation(username, 'legs') - if(legs_animation != null) { - let img = legs_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - let boots_animation = get_player_animation(username, 'boots') - if(boots_animation != null) { - let img = boots_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - let gloves_animation = get_player_animation(username, 'gloves') - if(gloves_animation != null) { - let img = gloves_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - let weapon_animation = get_player_animation(username, 'weapon') - if(weapon_animation != null) { - let img = weapon_animation.get_frame() - if(flip) { - ctx.scale(-1, 1); - ctx.drawImage(img, -1 * (players[username].client_x + TILE_SIZE + (TILE_SIZE / 2)), players[username].client_y - TILE_SIZE); - ctx.setTransform(1, 0, 0, 1, 0, 0); - } - else { - ctx.drawImage(img, players[username].client_x - TILE_SIZE / 2, players[username].client_y - TILE_SIZE); - } - } - - ctx.globalAlpha = 1.0; - - //usernames/levels - ctx.fillStyle = "yellow"; - let text_width = ctx.measureText(username).width; - ctx.fillText(username, client_x + TILE_SIZE / 2 - text_width/2, client_y + TILE_SIZE + TILE_SIZE/4); - ctx.fillStyle = "white"; - let text_level_width = ctx.measureText("level " + players[username].total_level).width; - if(players[username].total_level != null) { - ctx.fillText("level " + players[username].total_level, client_x + TILE_SIZE / 2 - text_level_width/2, client_y + TILE_SIZE + TILE_SIZE /2); - } - - //quest & ach icons - - if(players[username].has_all_quests && players[username].all_ach_completed) { - ctx.drawImage(quest_img, client_x - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - ctx.drawImage(ach_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - - } else { - if(players[username].has_all_quests) { - ctx.drawImage(quest_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - } - if(players[username].all_ach_completed) { - ctx.drawImage(ach_img, client_x + 12 - text_width / 2, client_y - 8 + (64 + TILE_SIZE / 6)); - } - } - - - - //hp bar - if(players[username].hp != null && players[username].in_combat_ticker > 0) { - let max_hp = players[username].max_hp; - let hp = players[username].hp; - let perc = hp / max_hp; - ctx.fillStyle = "red"; - ctx.fillRect(players[username].client_x + 4, players[username].client_y - TILE_SIZE - TILE_SIZE/8, TILE_SIZE - 8, 10); - ctx.fillStyle = "lime"; - ctx.fillRect(players[username].client_x + 4, players[username].client_y - TILE_SIZE - TILE_SIZE/8, (TILE_SIZE - 8) * perc, 10); - players[username].in_combat_ticker--; - } - - - - //shadow - ctx.fillStyle = "black"; - ctx.beginPath(); - ctx.globalAlpha = 0.2; - ctx.ellipse(players[username].client_x + TILE_SIZE / 2, players[username].client_y + TILE_SIZE - TILE_SIZE / 8, 25, 14, Math.PI * 2, 0, 2 * Math.PI); - ctx.fill(); - ctx.globalAlpha = 1.0; - } + if (Object.hasOwn(players, username)) { + const client_x = players[username].client_x; + const client_y = players[username].client_y; + if ( + players[username].client_pathing != null && + players[username].client_pathing.length > 0 + ) { + const client_next_x_y = players[username].client_pathing[0]; + const client_next_x = client_next_x_y.x; + const client_next_y = client_next_x_y.y; + let speed = 2; + if (players[username].is_running) { + speed = 4; + } + + let moving = false; + if (client_x != client_next_x) { + if (client_next_x > client_x) { + moving = true; + players[username].client_x += speed; + if (client_next_x < players[username].client_x) { + players[username].client_x = client_next_x; + } + } else if (client_next_x < client_x) { + moving = true; + players[username].client_x -= speed; + if (client_next_x > players[username].client_x) { + players[username].client_x = client_next_x; + } + } + } + + if (client_y != client_next_y) { + if (client_next_y > client_y) { + moving = true; + players[username].client_y += speed; + if (client_next_y < players[username].client_y) { + players[username].client_y = client_next_y; + } + } else if (client_next_y < client_y) { + moving = true; + players[username].client_y -= speed; + if (client_next_y > players[username].client_y) { + players[username].client_y = client_next_y; + } + } + } + if (!moving) { + players[username].client_pathing.shift(); + } + } + const flip = players[username].face_left; + + if (player_paint_dims.has(username)) { + ctx.globalAlpha = 0.2; + } + const body_animation = get_player_animation(username, "body"); + if (body_animation != null) { + const img = body_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + + const necklace_animation = get_player_animation(username, "necklace"); + if (necklace_animation != null) { + const img = necklace_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + + const head_animation = get_player_animation(username, "head"); + if (head_animation != null) { + const img = head_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + + const hair_animation = get_player_animation(username, "hair"); + if ( + hair_animation != null && + (get_equipment(username, "head") == "none" || + get_equipment(username, "head") == "dark") + ) { + const img = hair_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + + const hat_animation = get_player_animation(username, "hat"); + if (hat_animation != null) { + const Y_OFFSET_40_16 = 8; // ONLY FOR HATS!!! + const img = hat_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE - Y_OFFSET_40_16, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE - Y_OFFSET_40_16, + ); + } + } + + const legs_animation = get_player_animation(username, "legs"); + if (legs_animation != null) { + const img = legs_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + const boots_animation = get_player_animation(username, "boots"); + if (boots_animation != null) { + const img = boots_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + const gloves_animation = get_player_animation(username, "gloves"); + if (gloves_animation != null) { + const img = gloves_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + const weapon_animation = get_player_animation(username, "weapon"); + if (weapon_animation != null) { + const img = weapon_animation.get_frame(); + if (flip) { + ctx.scale(-1, 1); + ctx.drawImage( + img, + -1 * (players[username].client_x + TILE_SIZE + TILE_SIZE / 2), + players[username].client_y - TILE_SIZE, + ); + ctx.setTransform(1, 0, 0, 1, 0, 0); + } else { + ctx.drawImage( + img, + players[username].client_x - TILE_SIZE / 2, + players[username].client_y - TILE_SIZE, + ); + } + } + + ctx.globalAlpha = 1.0; + + //usernames/levels + ctx.fillStyle = "yellow"; + const text_width = ctx.measureText(username).width; + ctx.fillText( + username, + client_x + TILE_SIZE / 2 - text_width / 2, + client_y + TILE_SIZE + TILE_SIZE / 4, + ); + ctx.fillStyle = "white"; + const text_level_width = ctx.measureText( + "level " + players[username].total_level, + ).width; + if (players[username].total_level != null) { + ctx.fillText( + "level " + players[username].total_level, + client_x + TILE_SIZE / 2 - text_level_width / 2, + client_y + TILE_SIZE + TILE_SIZE / 2, + ); + } + + //quest & ach icons + + if ( + players[username].has_all_quests && + players[username].all_ach_completed + ) { + ctx.drawImage( + quest_img, + client_x - text_width / 2, + client_y - 8 + (64 + TILE_SIZE / 6), + ); + ctx.drawImage( + ach_img, + client_x + 12 - text_width / 2, + client_y - 8 + (64 + TILE_SIZE / 6), + ); + } else { + if (players[username].has_all_quests) { + ctx.drawImage( + quest_img, + client_x + 12 - text_width / 2, + client_y - 8 + (64 + TILE_SIZE / 6), + ); + } + if (players[username].all_ach_completed) { + ctx.drawImage( + ach_img, + client_x + 12 - text_width / 2, + client_y - 8 + (64 + TILE_SIZE / 6), + ); + } + } + + //hp bar + if ( + players[username].hp != null && + players[username].in_combat_ticker > 0 + ) { + const max_hp = players[username].max_hp; + const hp = players[username].hp; + const perc = hp / max_hp; + ctx.fillStyle = "red"; + ctx.fillRect( + players[username].client_x + 4, + players[username].client_y - TILE_SIZE - TILE_SIZE / 8, + TILE_SIZE - 8, + 10, + ); + ctx.fillStyle = "lime"; + ctx.fillRect( + players[username].client_x + 4, + players[username].client_y - TILE_SIZE - TILE_SIZE / 8, + (TILE_SIZE - 8) * perc, + 10, + ); + players[username].in_combat_ticker--; + } + + //shadow + ctx.fillStyle = "black"; + ctx.beginPath(); + ctx.globalAlpha = 0.2; + ctx.ellipse( + players[username].client_x + TILE_SIZE / 2, + players[username].client_y + TILE_SIZE - TILE_SIZE / 8, + 25, + 14, + Math.PI * 2, + 0, + 2 * Math.PI, + ); + ctx.fill(); + ctx.globalAlpha = 1.0; + } } // Follows code in original function, but skips painting in order to paint last. function paint_players() { - for (let username in players) { - if(username === Globals.local_username) { - continue; - } - paint_player(username); - } - paint_player(Globals.local_username); + for (const username in players) { + if (username === Globals.local_username) { + continue; + } + paint_player(username); + } + paint_player(Globals.local_username); } window.paint_player = paint_player; window.paint_players = paint_players; diff --git a/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js b/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js index cad1bcc..4a9601f 100644 --- a/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js +++ b/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js @@ -1,4 +1,3 @@ - // ==UserScript== // @name Fix other user item enemy click conflict // @namespace Violentmonkey Scripts @@ -12,122 +11,128 @@ // Function to paint player extracted from loop in original paint_players function. function mouse_click_handler_patched(e) { - if(Globals.local_username == null) { - return; - } - let bounding_client_rect = canvas.getBoundingClientRect(); - const relativeX = (e.clientX - bounding_client_rect.left) / canvas_scale; - const relativeY = (e.clientY - bounding_client_rect.top) / canvas_scale; - - let clicked_tile = get_postition_from_pixel(relativeX, relativeY); - - //dev tool - if(tile_marker_mode) { - for(let i = 0; i < tiles_marked.length; i++) { - let tile = tiles_marked[i]; - if(tile.x == clicked_tile.x && tile.y == clicked_tile.y) { - tiles_marked.splice(i, 1) - return; - } - } - - tiles_marked.push({x: clicked_tile.x, y: clicked_tile.y}); - return; - } - - //highlight players - for (let username in players) { - if (players.hasOwnProperty(username)) { - let player = players[username]; - if(is_mouse_on_player(mouse_over_now.x, mouse_over_now.y, player)) { - if(e.which == 3) { - Globals.websocket.send('RIGHT_CLICKED_PLAYER=' + username); - return; - } - } - } - } - - for(let i = 0; i < ground_items.length; i++) { - let ground_item = ground_items[i]; - if(is_mouse_on_ground_item(clicked_tile.x, clicked_tile.y, ground_item)) { - Globals.websocket.send('CLICKED_GROUND_ITEM=' + ground_item.uuid); - activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); - // only break if going to click npc and not right click. kinda jank but want to minimize the diff. is_hidden means the npc is dead.... - if(Object.values(npcs).some((n) => !n.is_hidden && is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, n)) && e.which !== 3) { - break; - } - return; - } - } - - let npcs_clicked_uuid = []; - for (let uuid in npcs) { - if (npcs.hasOwnProperty(uuid)) { - let npc = npcs[uuid]; - if(npc.is_hidden) { - continue; - } - // npc.is_mouse_hovering_over() -- changed for mobile fix. - - if(is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, npc)) { - - if(e.which == 3) { - Globals.websocket.send('MONSTER_LOG=' + npc.name); - return; - } - if(npc.has_click_priority) { - npcs_clicked_uuid.unshift(npc.uuid); - } else { - npcs_clicked_uuid.push(npc.uuid); - } - } - } - } - - - if(npcs_clicked_uuid.length > 0) { - send_unrepeatable_bytes_1s('CLICKS_NPC=' + npcs_clicked_uuid[0]); - activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); - return; - } - - for(let i = 0; i < map_objects.length; i++) { - let map_object = map_objects[i]; - if(is_mouse_on_map_object(clicked_tile.x, clicked_tile.y, map_object)) { - if(map_object.is_interactable()) { - if(e.which == 3) { - Globals.websocket.send('RIGHT_CLICKED_MAP_OBJECT=' + map_object.uuid); - return; - } else { - send_unrepeatable_bytes_1s('CLICKED_MAP_OBJECT=' + map_object.uuid); - activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); - return; - } - - } - } - } - - - - - let clicked_teleport_tile_flag = false; - for(let i = 0; i < teleport_tiles.length; i++) { - let teleport_tile = teleport_tiles[i]; - - if(teleport_tile.x == clicked_tile.x && teleport_tile.y == clicked_tile.y) { - clicked_teleport_tile_flag = true; - break; - } - } - if(clicked_teleport_tile_flag) { - activate_click_animation("blue", mouse_over_now.x, mouse_over_now.y); - } else { - activate_click_animation("yellow", mouse_over_now.x, mouse_over_now.y); - } - - send_unrepeatable_bytes('CLICKED_TILE=' + clicked_tile.x + "~" + clicked_tile.y); + if (Globals.local_username == null) { + return; + } + const bounding_client_rect = canvas.getBoundingClientRect(); + const relativeX = (e.clientX - bounding_client_rect.left) / canvas_scale; + const relativeY = (e.clientY - bounding_client_rect.top) / canvas_scale; + + const clicked_tile = get_postition_from_pixel(relativeX, relativeY); + + //dev tool + if (tile_marker_mode) { + for (let i = 0; i < tiles_marked.length; i++) { + const tile = tiles_marked[i]; + if (tile.x == clicked_tile.x && tile.y == clicked_tile.y) { + tiles_marked.splice(i, 1); + return; + } + } + + tiles_marked.push({ x: clicked_tile.x, y: clicked_tile.y }); + return; + } + + //highlight players + for (const username in players) { + if (Object.hasOwn(players, username)) { + const player = players[username]; + if (is_mouse_on_player(mouse_over_now.x, mouse_over_now.y, player)) { + if (e.which == 3) { + Globals.websocket.send("RIGHT_CLICKED_PLAYER=" + username); + return; + } + } + } + } + + for (let i = 0; i < ground_items.length; i++) { + const ground_item = ground_items[i]; + if (is_mouse_on_ground_item(clicked_tile.x, clicked_tile.y, ground_item)) { + Globals.websocket.send("CLICKED_GROUND_ITEM=" + ground_item.uuid); + activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); + // only break if going to click npc and not right click. kinda jank but want to minimize the diff. is_hidden means the npc is dead.... + if ( + Object.values(npcs).some( + (n) => + !n.is_hidden && + is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, n), + ) && + e.which !== 3 + ) { + break; + } + return; + } + } + + const npcs_clicked_uuid = []; + for (const uuid in npcs) { + if (Object.hasOwn(npcs, uuid)) { + const npc = npcs[uuid]; + if (npc.is_hidden) { + continue; + } + // npc.is_mouse_hovering_over() -- changed for mobile fix. + + if (is_mouse_on_npc(mouse_over_now.x, mouse_over_now.y, npc)) { + if (e.which == 3) { + Globals.websocket.send("MONSTER_LOG=" + npc.name); + return; + } + if (npc.has_click_priority) { + npcs_clicked_uuid.unshift(npc.uuid); + } else { + npcs_clicked_uuid.push(npc.uuid); + } + } + } + } + + if (npcs_clicked_uuid.length > 0) { + send_unrepeatable_bytes_1s("CLICKS_NPC=" + npcs_clicked_uuid[0]); + activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); + return; + } + + for (let i = 0; i < map_objects.length; i++) { + const map_object = map_objects[i]; + if (is_mouse_on_map_object(clicked_tile.x, clicked_tile.y, map_object)) { + if (map_object.is_interactable()) { + if (e.which == 3) { + Globals.websocket.send("RIGHT_CLICKED_MAP_OBJECT=" + map_object.uuid); + return; + } else { + send_unrepeatable_bytes_1s("CLICKED_MAP_OBJECT=" + map_object.uuid); + activate_click_animation("red", mouse_over_now.x, mouse_over_now.y); + return; + } + } + } + } + + let clicked_teleport_tile_flag = false; + for (let i = 0; i < teleport_tiles.length; i++) { + const teleport_tile = teleport_tiles[i]; + + if ( + teleport_tile.x == clicked_tile.x && + teleport_tile.y == clicked_tile.y + ) { + clicked_teleport_tile_flag = true; + break; + } + } + if (clicked_teleport_tile_flag) { + activate_click_animation("blue", mouse_over_now.x, mouse_over_now.y); + } else { + activate_click_animation("yellow", mouse_over_now.x, mouse_over_now.y); + } + + send_unrepeatable_bytes( + "CLICKED_TILE=" + clicked_tile.x + "~" + clicked_tile.y, + ); } // replace with patched listener diff --git a/packages/wiki/header-links.user.js b/packages/wiki/header-links.user.js index c0f5628..70882f6 100644 --- a/packages/wiki/header-links.user.js +++ b/packages/wiki/header-links.user.js @@ -8,47 +8,45 @@ // @description Adds anchor links to headers on wiki pages // ==/UserScript== -(function() { - 'use strict'; - - // Find all headers (h1-h6) - const headers = document.querySelectorAll('h1, h2, h3, h4, h5, h6'); - - headers.forEach(header => { - // Get text content - const text = header.textContent.trim(); - if (!text) return; - - // Check if header already has an ID, or create one - let id = header.id; - if (!id) { - // Create a URL-safe ID from the text - id = text.replace(/\s+/g, '_').replace(/[^a-zA-Z0-9_]/g, ''); - header.id = id; - } - - // Skip if header already has a link with this href (avoid duplicates) - if (header.querySelector(`a[href="#${id}"]`)) return; - - // Create anchor link - const link = document.createElement('a'); - link.href = `#${id}`; - link.textContent = '#'; - link.style.marginLeft = '5px'; - link.style.textDecoration = 'none'; - link.style.color = '#999'; - link.style.fontSize = '0.9em'; - link.title = `Link to ${text}`; - - // Add hover effect - link.addEventListener('mouseenter', () => { - link.style.color = '#0645ad'; - }); - link.addEventListener('mouseleave', () => { - link.style.color = '#999'; - }); - - // Add link to header - header.appendChild(link); - }); +(() => { + // Find all headers (h1-h6) + const headers = document.querySelectorAll("h1, h2, h3, h4, h5, h6"); + + headers.forEach((header) => { + // Get text content + const text = header.textContent.trim(); + if (!text) return; + + // Check if header already has an ID, or create one + let id = header.id; + if (!id) { + // Create a URL-safe ID from the text + id = text.replace(/\s+/g, "_").replace(/[^a-zA-Z0-9_]/g, ""); + header.id = id; + } + + // Skip if header already has a link with this href (avoid duplicates) + if (header.querySelector(`a[href="#${id}"]`)) return; + + // Create anchor link + const link = document.createElement("a"); + link.href = `#${id}`; + link.textContent = "#"; + link.style.marginLeft = "5px"; + link.style.textDecoration = "none"; + link.style.color = "#999"; + link.style.fontSize = "0.9em"; + link.title = `Link to ${text}`; + + // Add hover effect + link.addEventListener("mouseenter", () => { + link.style.color = "#0645ad"; + }); + link.addEventListener("mouseleave", () => { + link.style.color = "#999"; + }); + + // Add link to header + header.appendChild(link); + }); })(); diff --git a/packages/wiki/image-links.user.js b/packages/wiki/image-links.user.js index 76989ae..b6147f5 100644 --- a/packages/wiki/image-links.user.js +++ b/packages/wiki/image-links.user.js @@ -8,190 +8,205 @@ // @description Shows links to pages that use an image in a modal on hover // ==/UserScript== -(function() { - 'use strict'; - - // Cache for fetched link data - const linkCache = {}; - let hideTimeout = null; - - // Get current page path for comparison - const currentPath = window.location.pathname; - - // Cache for excluded page links from navbox - let excludedPageLinks = new Set(); - - // Fetch and cache all page links from the navbox template - async function getExcludedPageLinks() { - if (excludedPageLinks.size != 0) { - return excludedPageLinks; - } - - excludedPageLinks = new Set(['/index.php/Template:Navbox_Enemies']); - - try { - const response = await fetch('/index.php/Template:Navbox_Enemies'); - const html = await response.text(); - const parser = new DOMParser(); - const doc = parser.parseFromString(html, 'text/html'); - - // Find all links ONLY within mw:File spans in the flat-navbox table - const navboxTable = doc.querySelector('table.flat-navbox'); - if (navboxTable) { - const fileSpans = navboxTable.querySelectorAll('span[typeof="mw:File"]'); - fileSpans.forEach(span => { - const link = span.querySelector('a[href^="/index.php/"]'); - if (link) { - const href = link.getAttribute('href'); - if (href && !href.includes('action=edit') && !href.includes('redlink=1')) { - excludedPageLinks.add(href); - } - } - }); - } - } catch (error) { - console.error('Error fetching navbox template:', error); - } - - return excludedPageLinks; - } - - // Create modal element - const modal = document.createElement('div'); - modal.style.position = 'fixed'; - modal.style.backgroundColor = 'white'; - modal.style.border = '1px solid #a2a9b1'; - modal.style.borderRadius = '4px'; - modal.style.boxShadow = '0 2px 8px rgba(0,0,0,0.2)'; - modal.style.padding = '10px'; - modal.style.maxWidth = '300px'; - modal.style.maxHeight = '400px'; - modal.style.overflowY = 'auto'; - modal.style.zIndex = '10000'; - modal.style.display = 'none'; - modal.style.fontSize = '14px'; - document.body.appendChild(modal); - - // Find all image links - const imageLinks = document.querySelectorAll('a:has(> .mw-file-element)'); - - imageLinks.forEach(link => { - - const fileUrl = (() => { - if(link.href.search("File") !== -1) { - return link.href; - } - else { - const filename = link.firstChild.src.split("/").pop().split("-").pop(); - return `/index.php/File:${filename}`; - } - } )(); - - // Set ID on the link for anchor navigation - const urlParts = fileUrl.split("/"); - const filePageName = urlParts[urlParts.length - 1]; - const imageName = decodeURIComponent(filePageName.replace('File:', '')); - const anchor = imageName.replace(/\s+/g, '_').replace(/\.[^.]+$/, ''); - link.id = 'File:' + anchor; - - // Show modal on hover - link.addEventListener('mouseenter', async (e) => { - // Clear any pending hide timeout - if (hideTimeout) { - clearTimeout(hideTimeout); - hideTimeout = null; - } - - modal.style.display = 'block'; - modal.innerHTML = '
Loading...
'; - - // Position modal near cursor - const rect = link.getBoundingClientRect(); - modal.style.left = (rect.right + 10) + 'px'; - modal.style.top = rect.top + 'px'; - - // Fetch links if not cached - if (!linkCache[fileUrl]) { - try { - // Get excluded pages from navbox - const excludedPages = await getExcludedPageLinks(); - - const response = await fetch(fileUrl); - const html = await response.text(); - const parser = new DOMParser(); - const doc = parser.parseFromString(html, 'text/html'); - const linksContainer = doc.querySelector('ul.mw-imagepage-linkstoimage'); - - if (linksContainer) { - - // Get the image filename from the URL - const urlParts = fileUrl.split('/'); - const filePageName = urlParts[urlParts.length - 1]; - // Extract just the filename (e.g., "File:Example.png" -> "Example.png") - const imageName = decodeURIComponent(filePageName.replace('File:', '')); - - // Create the expected page path from image name - const imageBaseName = imageName.replace(/\.[^.]+$/, '').replace(/_/g, '_'); - const expectedPagePath = '/index.php/' + imageBaseName; - - // Clone the container to modify it - const allLinks = Array.from(linksContainer.querySelectorAll('a')); - - // Check if the navbox template is in the file usage list - const navboxInUsageList = allLinks.some(a => - a.getAttribute('href') === '/index.php/Template:Navbox_Enemies' - ); - // TODO better fitering - const filteredLinks = allLinks.filter(a => { - const shortHref = a.getAttribute("href"); - if (document.URL === a.href) { - return false; - } - if (navboxInUsageList && excludedPageLinks.has(shortHref)) { - return false - } - return true - }); - - const linkToUL = (a) => `
  • ${a.title}
  • ` - // Check if there are any links left - if (filteredLinks.length > 0) { - linkCache[fileUrl] = `
      ${filteredLinks.map(linkToUL).join("")}
    ` - } else { - linkCache[fileUrl] = '
    No other pages use this file
    '; - } - } else { - linkCache[fileUrl] = '
    No links found
    '; - } - } catch (error) { - console.log(error) - linkCache[fileUrl] = '
    Error loading links
    '; - } - } - - // Display cached links - modal.innerHTML = '
    Pages using this file:
    ' + linkCache[fileUrl]; - }); - - link.addEventListener('mouseleave', () => { - // Delay hiding the modal to give time to move mouse to it - hideTimeout = setTimeout(() => { - modal.style.display = 'none'; - }, 300); - }); - }); - - // Keep modal open when hovering over it - modal.addEventListener('mouseenter', () => { - // Clear any pending hide timeout - if (hideTimeout) { - clearTimeout(hideTimeout); - hideTimeout = null; - } - }); - - modal.addEventListener('mouseleave', () => { - // Hide modal when leaving it - modal.style.display = 'none'; - }); +(() => { + // Cache for fetched link data + const linkCache = {}; + let hideTimeout = null; + + // Get current page path for comparison + const currentPath = window.location.pathname; + + // Cache for excluded page links from navbox + let excludedPageLinks = new Set(); + + // Fetch and cache all page links from the navbox template + async function getExcludedPageLinks() { + if (excludedPageLinks.size != 0) { + return excludedPageLinks; + } + + excludedPageLinks = new Set(["/index.php/Template:Navbox_Enemies"]); + + try { + const response = await fetch("/index.php/Template:Navbox_Enemies"); + const html = await response.text(); + const parser = new DOMParser(); + const doc = parser.parseFromString(html, "text/html"); + + // Find all links ONLY within mw:File spans in the flat-navbox table + const navboxTable = doc.querySelector("table.flat-navbox"); + if (navboxTable) { + const fileSpans = navboxTable.querySelectorAll( + 'span[typeof="mw:File"]', + ); + fileSpans.forEach((span) => { + const link = span.querySelector('a[href^="/index.php/"]'); + if (link) { + const href = link.getAttribute("href"); + if ( + href && + !href.includes("action=edit") && + !href.includes("redlink=1") + ) { + excludedPageLinks.add(href); + } + } + }); + } + } catch (error) { + console.error("Error fetching navbox template:", error); + } + + return excludedPageLinks; + } + + // Create modal element + const modal = document.createElement("div"); + modal.style.position = "fixed"; + modal.style.backgroundColor = "white"; + modal.style.border = "1px solid #a2a9b1"; + modal.style.borderRadius = "4px"; + modal.style.boxShadow = "0 2px 8px rgba(0,0,0,0.2)"; + modal.style.padding = "10px"; + modal.style.maxWidth = "300px"; + modal.style.maxHeight = "400px"; + modal.style.overflowY = "auto"; + modal.style.zIndex = "10000"; + modal.style.display = "none"; + modal.style.fontSize = "14px"; + document.body.appendChild(modal); + + // Find all image links + const imageLinks = document.querySelectorAll("a:has(> .mw-file-element)"); + + imageLinks.forEach((link) => { + const fileUrl = (() => { + if (link.href.search("File") !== -1) { + return link.href; + } else { + const filename = link.firstChild.src.split("/").pop().split("-").pop(); + return `/index.php/File:${filename}`; + } + })(); + + // Set ID on the link for anchor navigation + const urlParts = fileUrl.split("/"); + const filePageName = urlParts[urlParts.length - 1]; + const imageName = decodeURIComponent(filePageName.replace("File:", "")); + const anchor = imageName.replace(/\s+/g, "_").replace(/\.[^.]+$/, ""); + link.id = "File:" + anchor; + + // Show modal on hover + link.addEventListener("mouseenter", async (e) => { + // Clear any pending hide timeout + if (hideTimeout) { + clearTimeout(hideTimeout); + hideTimeout = null; + } + + modal.style.display = "block"; + modal.innerHTML = '
    Loading...
    '; + + // Position modal near cursor + const rect = link.getBoundingClientRect(); + modal.style.left = rect.right + 10 + "px"; + modal.style.top = rect.top + "px"; + + // Fetch links if not cached + if (!linkCache[fileUrl]) { + try { + // Get excluded pages from navbox + const excludedPages = await getExcludedPageLinks(); + + const response = await fetch(fileUrl); + const html = await response.text(); + const parser = new DOMParser(); + const doc = parser.parseFromString(html, "text/html"); + const linksContainer = doc.querySelector( + "ul.mw-imagepage-linkstoimage", + ); + + if (linksContainer) { + // Get the image filename from the URL + const urlParts = fileUrl.split("/"); + const filePageName = urlParts[urlParts.length - 1]; + // Extract just the filename (e.g., "File:Example.png" -> "Example.png") + const imageName = decodeURIComponent( + filePageName.replace("File:", ""), + ); + + // Create the expected page path from image name + const imageBaseName = imageName + .replace(/\.[^.]+$/, "") + .replace(/_/g, "_"); + const expectedPagePath = "/index.php/" + imageBaseName; + + // Clone the container to modify it + const allLinks = Array.from(linksContainer.querySelectorAll("a")); + + // Check if the navbox template is in the file usage list + const navboxInUsageList = allLinks.some( + (a) => + a.getAttribute("href") === "/index.php/Template:Navbox_Enemies", + ); + // TODO better fitering + const filteredLinks = allLinks.filter((a) => { + const shortHref = a.getAttribute("href"); + if (document.URL === a.href) { + return false; + } + if (navboxInUsageList && excludedPageLinks.has(shortHref)) { + return false; + } + return true; + }); + + const linkToUL = (a) => + `
  • ${a.title}
  • `; + // Check if there are any links left + if (filteredLinks.length > 0) { + linkCache[fileUrl] = + `
      ${filteredLinks.map(linkToUL).join("")}
    `; + } else { + linkCache[fileUrl] = + '
    No other pages use this file
    '; + } + } else { + linkCache[fileUrl] = + '
    No links found
    '; + } + } catch (error) { + console.log(error); + linkCache[fileUrl] = + '
    Error loading links
    '; + } + } + + // Display cached links + modal.innerHTML = + '
    Pages using this file:
    ' + + linkCache[fileUrl]; + }); + + link.addEventListener("mouseleave", () => { + // Delay hiding the modal to give time to move mouse to it + hideTimeout = setTimeout(() => { + modal.style.display = "none"; + }, 300); + }); + }); + + // Keep modal open when hovering over it + modal.addEventListener("mouseenter", () => { + // Clear any pending hide timeout + if (hideTimeout) { + clearTimeout(hideTimeout); + hideTimeout = null; + } + }); + + modal.addEventListener("mouseleave", () => { + // Hide modal when leaving it + modal.style.display = "none"; + }); })(); diff --git a/packages/wiki/table-links.user.js b/packages/wiki/table-links.user.js index 4e38cd6..025b693 100644 --- a/packages/wiki/table-links.user.js +++ b/packages/wiki/table-links.user.js @@ -8,53 +8,51 @@ // @description Adds anchor links to wikitable rows based on first column text // ==/UserScript== -(function() { - 'use strict'; - - // Find all wikitable tables - const tables = document.querySelectorAll('table.wikitable'); - - tables.forEach(table => { - const rows = table.querySelectorAll('tbody tr'); - - rows.forEach(row => { - // Skip header rows (rows with th elements) - if (row.querySelector('th')) return; - - // Get first column - const firstCell = row.querySelector('td'); - if (!firstCell) return; - - // Get text content and create ID - const text = firstCell.textContent.trim(); - if (!text) return; - - // Create a URL-safe ID from the text - const id = text.replace(/\s+/g, '_').replace(/[^a-zA-Z0-9_]/g, ''); - - // Set ID on the row - row.id = id; - - // Create anchor link - const link = document.createElement('a'); - link.href = `#${id}`; - link.textContent = '#'; - link.style.marginLeft = '5px'; - link.style.textDecoration = 'none'; - link.style.color = '#999'; - link.style.fontSize = '0.9em'; - link.title = `Link to ${text}`; - - // Add hover effect - link.addEventListener('mouseenter', () => { - link.style.color = '#0645ad'; - }); - link.addEventListener('mouseleave', () => { - link.style.color = '#999'; - }); - - // Add link to first cell - firstCell.appendChild(link); - }); - }); -})(); \ No newline at end of file +(() => { + // Find all wikitable tables + const tables = document.querySelectorAll("table.wikitable"); + + tables.forEach((table) => { + const rows = table.querySelectorAll("tbody tr"); + + rows.forEach((row) => { + // Skip header rows (rows with th elements) + if (row.querySelector("th")) return; + + // Get first column + const firstCell = row.querySelector("td"); + if (!firstCell) return; + + // Get text content and create ID + const text = firstCell.textContent.trim(); + if (!text) return; + + // Create a URL-safe ID from the text + const id = text.replace(/\s+/g, "_").replace(/[^a-zA-Z0-9_]/g, ""); + + // Set ID on the row + row.id = id; + + // Create anchor link + const link = document.createElement("a"); + link.href = `#${id}`; + link.textContent = "#"; + link.style.marginLeft = "5px"; + link.style.textDecoration = "none"; + link.style.color = "#999"; + link.style.fontSize = "0.9em"; + link.title = `Link to ${text}`; + + // Add hover effect + link.addEventListener("mouseenter", () => { + link.style.color = "#0645ad"; + }); + link.addEventListener("mouseleave", () => { + link.style.color = "#999"; + }); + + // Add link to first cell + firstCell.appendChild(link); + }); + }); +})(); diff --git a/tsconfig.json b/tsconfig.json index a7c790d..5ad8c1f 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,28 +1,28 @@ { - "compilerOptions": { - // Enable latest features - "lib": ["ESNext", "DOM"], - "target": "ESNext", - "module": "ESNext", - "moduleDetection": "force", - "jsx": "react-jsx", - "allowJs": true, - "types": ["@violentmonkey/types", "bun", "@workspace/flatmmo-types" ], + "compilerOptions": { + // Enable latest features + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "module": "ESNext", + "moduleDetection": "force", + "jsx": "react-jsx", + "allowJs": true, + "types": ["@violentmonkey/types", "bun", "@workspace/flatmmo-types"], - // Bundler mode - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "verbatimModuleSyntax": true, - "noEmit": true, + // Bundler mode + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "noEmit": true, - // Best practices - "strict": true, - "skipLibCheck": true, - "noFallthroughCasesInSwitch": true, + // Best practices + "strict": true, + "skipLibCheck": true, + "noFallthroughCasesInSwitch": true, - // Some stricter flags (disabled by default) - "noUnusedLocals": false, - "noUnusedParameters": false, - "noPropertyAccessFromIndexSignature": false - } + // Some stricter flags (disabled by default) + "noUnusedLocals": false, + "noUnusedParameters": false, + "noPropertyAccessFromIndexSignature": false + } } From 855e44413ad8b2bdb8b7b8a2625cc9b24d3ad6d7 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 19:20:28 -0500 Subject: [PATCH 11/87] started on oxlint config --- .oxlintrc.json | 143 ++++++++++++++++++++++++ packages/better-custom-hotkeys/index.ts | 2 - 2 files changed, 143 insertions(+), 2 deletions(-) create mode 100644 .oxlintrc.json diff --git a/.oxlintrc.json b/.oxlintrc.json new file mode 100644 index 0000000..0a9edc7 --- /dev/null +++ b/.oxlintrc.json @@ -0,0 +1,143 @@ +{ + "plugins": ["unicorn", "typescript", "oxc"], + "categories": { + "correctness": "error", + "suspicious": "error", + "pedantic": "warn", + "perf": "warn" + }, + "rules": { + "for-direction": "warn", + "no-async-promise-executor": "warn", + "no-caller": "warn", + "no-class-assign": "warn", + "no-compare-neg-zero": "warn", + "no-cond-assign": "warn", + "no-const-assign": "warn", + "no-constant-binary-expression": "warn", + "no-constant-condition": "warn", + "no-control-regex": "warn", + "no-debugger": "warn", + "no-delete-var": "warn", + "no-dupe-class-members": "warn", + "no-dupe-else-if": "warn", + "no-dupe-keys": "warn", + "no-duplicate-case": "warn", + "no-empty-character-class": "warn", + "no-empty-pattern": "warn", + "no-empty-static-block": "warn", + "no-eval": "warn", + "no-ex-assign": "warn", + "no-extra-boolean-cast": "warn", + "no-func-assign": "warn", + "no-global-assign": "warn", + "no-import-assign": "warn", + "no-invalid-regexp": "warn", + "no-irregular-whitespace": "warn", + "no-loss-of-precision": "warn", + "no-new-native-nonconstructor": "warn", + "no-nonoctal-decimal-escape": "warn", + "no-obj-calls": "warn", + "no-self-assign": "warn", + "no-setter-return": "warn", + "no-shadow-restricted-names": "warn", + "no-sparse-arrays": "warn", + "no-this-before-super": "warn", + "no-unassigned-vars": "warn", + "no-unsafe-finally": "warn", + "no-unsafe-negation": "warn", + "no-unsafe-optional-chaining": "warn", + "no-unused-labels": "warn", + "no-unused-private-class-members": "warn", + "no-unused-vars": "warn", + "no-useless-backreference": "warn", + "no-useless-catch": "warn", + "no-useless-escape": "warn", + "no-useless-rename": "warn", + "no-with": "warn", + "require-yield": "warn", + "use-isnan": "warn", + "valid-typeof": "warn", + "oxc/bad-array-method-on-arguments": "warn", + "oxc/bad-char-at-comparison": "warn", + "oxc/bad-comparison-sequence": "warn", + "oxc/bad-min-max-func": "warn", + "oxc/bad-object-literal-comparison": "warn", + "oxc/bad-replace-all-arg": "warn", + "oxc/const-comparisons": "warn", + "oxc/double-comparisons": "warn", + "oxc/erasing-op": "warn", + "oxc/missing-throw": "warn", + "oxc/number-arg-out-of-range": "warn", + "oxc/only-used-in-recursion": "warn", + "oxc/uninvoked-array-callback": "warn", + "typescript/await-thenable": "warn", + "typescript/no-array-delete": "warn", + "typescript/no-base-to-string": "warn", + "typescript/no-confusing-void-expression": "warn", + "typescript/no-duplicate-enum-values": "warn", + "typescript/no-duplicate-type-constituents": "warn", + "typescript/no-extra-non-null-assertion": "warn", + "typescript/no-floating-promises": "warn", + "typescript/no-for-in-array": "warn", + "typescript/no-implied-eval": "warn", + "typescript/no-meaningless-void-operator": "warn", + "typescript/no-misused-new": "warn", + "typescript/no-misused-spread": "warn", + "typescript/no-non-null-asserted-optional-chain": "warn", + "typescript/no-redundant-type-constituents": "warn", + "typescript/no-this-alias": "warn", + "typescript/no-unnecessary-parameter-property-assignment": "warn", + "typescript/no-unsafe-declaration-merging": "warn", + "typescript/no-unsafe-unary-minus": "warn", + "typescript/no-useless-empty-export": "warn", + "typescript/no-wrapper-object-types": "warn", + "typescript/prefer-as-const": "warn", + "typescript/require-array-sort-compare": "warn", + "typescript/restrict-template-expressions": "warn", + "typescript/triple-slash-reference": "warn", + "typescript/unbound-method": "warn", + "unicorn/no-await-in-promise-methods": "warn", + "unicorn/no-empty-file": "warn", + "unicorn/no-invalid-fetch-options": "warn", + "unicorn/no-invalid-remove-event-listener": "warn", + "unicorn/no-new-array": "warn", + "unicorn/no-single-promise-in-promise-methods": "warn", + "unicorn/no-thenable": "warn", + "unicorn/no-unnecessary-await": "warn", + "unicorn/no-useless-fallback-in-spread": "warn", + "unicorn/no-useless-length-check": "warn", + "unicorn/no-useless-spread": "warn", + "unicorn/prefer-set-size": "warn", + "unicorn/prefer-string-starts-ends-with": "warn" + }, + "settings": { + "jsx-a11y": { + "polymorphicPropName": null, + "components": {}, + "attributes": {} + }, + "next": { + "rootDir": [] + }, + "react": { + "formComponents": [], + "linkComponents": [] + }, + "jsdoc": { + "ignorePrivate": false, + "ignoreInternal": false, + "ignoreReplacesDocs": true, + "overrideReplacesDocs": true, + "augmentsExtendsReplacesDocs": false, + "implementsReplacesDocs": false, + "exemptDestructuredRootsFromChecks": false, + "tagNamePreference": {} + } + }, + "env": { + "builtin": true + }, + "globals": {}, + "ignorePatterns": [] +} diff --git a/packages/better-custom-hotkeys/index.ts b/packages/better-custom-hotkeys/index.ts index f3f9a4e..ca28dd2 100644 --- a/packages/better-custom-hotkeys/index.ts +++ b/packages/better-custom-hotkeys/index.ts @@ -1,5 +1,3 @@ -// import { chat_ele, request_focus_chatbox, Globals, request_unfocus_chatbox, has_npc_chat_message_modal_open, has_modal_open, has_npc_chat_options_modal_open, keypress_listener } from "flatmmo"; - // User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) const HOTKEY_CONFIG: { [x: string]: { originalKey: string; description: string }; From 28b959c865e79153f08cc5c26af3e8d213f8c639 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 21:06:51 -0500 Subject: [PATCH 12/87] testing actions --- .oxlintrc.json | 6 ++-- biome.json | 34 +++++++++++++++++++++ flake.lock | 83 +++++++++++++++++++++++++++++++++++++++++++++----- flake.nix | 38 +++++++++++++++++++++++ 4 files changed, 150 insertions(+), 11 deletions(-) create mode 100644 biome.json diff --git a/.oxlintrc.json b/.oxlintrc.json index 0a9edc7..f32bd6a 100644 --- a/.oxlintrc.json +++ b/.oxlintrc.json @@ -2,9 +2,7 @@ "plugins": ["unicorn", "typescript", "oxc"], "categories": { "correctness": "error", - "suspicious": "error", - "pedantic": "warn", - "perf": "warn" + "suspicious": "error" }, "rules": { "for-direction": "warn", @@ -139,5 +137,5 @@ "builtin": true }, "globals": {}, - "ignorePatterns": [] + "ignorePatterns": ["metadata.js"] } diff --git a/biome.json b/biome.json new file mode 100644 index 0000000..ba74412 --- /dev/null +++ b/biome.json @@ -0,0 +1,34 @@ +{ + "$schema": "https://biomejs.dev/schemas/2.3.8/schema.json", + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true + }, + "files": { + "ignoreUnknown": false + }, + "formatter": { + "enabled": true, + "indentStyle": "tab" + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "javascript": { + "formatter": { + "quoteStyle": "double" + } + }, + "assist": { + "enabled": true, + "actions": { + "source": { + "organizeImports": "on" + } + } + } +} diff --git a/flake.lock b/flake.lock index 2c535c9..6e6d636 100644 --- a/flake.lock +++ b/flake.lock @@ -63,6 +63,43 @@ "type": "github" } }, + "flake-parts_3": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib_3" + }, + "locked": { + "lastModified": 1763759067, + "narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "github-actions-nix": { + "inputs": { + "flake-parts": "flake-parts_3", + "nixpkgs": "nixpkgs" + }, + "locked": { + "lastModified": 1763847365, + "narHash": "sha256-RVjSCZWzs1nn4k4jf3hj9lhoRKI8S2xc0xMXAz+gTQ8=", + "owner": "synapdeck", + "repo": "github-actions-nix", + "rev": "e941d8dde765b1a860b757e68e814e73a4b1284c", + "type": "github" + }, + "original": { + "owner": "synapdeck", + "repo": "github-actions-nix", + "type": "github" + } + }, "import-tree": { "locked": { "lastModified": 1763762820, @@ -80,15 +117,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1765472234, - "narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=", - "owner": "nixos", + "lastModified": 1763678758, + "narHash": "sha256-+hBiJ+kG5IoffUOdlANKFflTT5nO3FrrR2CA3178Y5s=", + "owner": "NixOS", "repo": "nixpkgs", - "rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b", + "rev": "117cc7f94e8072499b0a7aa4c52084fa4e11cc9b", "type": "github" }, "original": { - "owner": "nixos", + "owner": "NixOS", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" @@ -124,7 +161,38 @@ "type": "github" } }, + "nixpkgs-lib_3": { + "locked": { + "lastModified": 1761765539, + "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, "nixpkgs_2": { + "locked": { + "lastModified": 1765472234, + "narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_3": { "locked": { "lastModified": 1761236834, "narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", @@ -144,7 +212,8 @@ "inputs": { "bun2nix": "bun2nix", "flake-parts": "flake-parts_2", - "nixpkgs": "nixpkgs", + "github-actions-nix": "github-actions-nix", + "nixpkgs": "nixpkgs_2", "systems": "systems", "treefmt-nix": "treefmt-nix_2" } @@ -187,7 +256,7 @@ }, "treefmt-nix_2": { "inputs": { - "nixpkgs": "nixpkgs_2" + "nixpkgs": "nixpkgs_3" }, "locked": { "lastModified": 1762938485, diff --git a/flake.nix b/flake.nix index c96d74e..dc34298 100644 --- a/flake.nix +++ b/flake.nix @@ -11,6 +11,7 @@ flake-parts.url = "github:hercules-ci/flake-parts"; treefmt-nix.url = "github:numtide/treefmt-nix"; + github-actions-nix.url = "github:synapdeck/github-actions-nix"; }; # Use the cached version of bun2nix from the nix-community cli @@ -40,6 +41,7 @@ ]; imports = [ inputs.treefmt-nix.flakeModule + inputs.github-actions-nix.flakeModule ]; perSystem = { pkgs, system, ... }: @@ -55,6 +57,42 @@ programs.biome.enable = true; }; + githubActions = { + enable = true; + workflows = { + ci = { + name = "CI"; + on = ""; + push = ""; + pull_request = ""; + jobs = ""; + check = ""; + runs-on = "ubuntu-22.04"; + permissions = ""; + id-token = "write"; + contents = "read"; + steps = [ + { + uses = "actions/checkout@v4"; + } + { + uses = "DeterminateSystems/nix-installer-action@main"; + } + { + uses = "DeterminateSystems/magic-nix-cache-action@main"; + } + { + uses = "DeterminateSystems/flake-checker-action@main"; + } + { + name = "Run `nix build`"; + } + ]; + run = "nix build ."; + }; + }; + }; + packages = { # Produce a package for this template with bun2nix in # the overlay From 095115fda0207211a000ee51e99d4e67e7a2f670 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 21:09:44 -0500 Subject: [PATCH 13/87] updated lock --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 6e6d636..4a115eb 100644 --- a/flake.lock +++ b/flake.lock @@ -148,11 +148,11 @@ }, "nixpkgs-lib_2": { "locked": { - "lastModified": 1761765539, - "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", + "lastModified": 1765674936, + "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", + "rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85", "type": "github" }, "original": { @@ -178,11 +178,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1765472234, - "narHash": "sha256-9VvC20PJPsleGMewwcWYKGzDIyjckEz8uWmT0vCDYK0=", + "lastModified": 1765779637, + "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "2fbfb1d73d239d2402a8fe03963e37aab15abe8b", + "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", "type": "github" }, "original": { From 29ebbef4cbd939a911e74d49700b3ecb7fb3a24c Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 21:41:20 -0500 Subject: [PATCH 14/87] work? --- flake.nix | 46 ++++++++++++++++++++-------------------------- 1 file changed, 20 insertions(+), 26 deletions(-) diff --git a/flake.nix b/flake.nix index dc34298..5b96ee1 100644 --- a/flake.nix +++ b/flake.nix @@ -59,37 +59,31 @@ githubActions = { enable = true; + workflowsDir = "./.github/workflows"; workflows = { + ci = { name = "CI"; - on = ""; - push = ""; - pull_request = ""; - jobs = ""; - check = ""; - runs-on = "ubuntu-22.04"; - permissions = ""; - id-token = "write"; - contents = "read"; - steps = [ - { - uses = "actions/checkout@v4"; - } - { - uses = "DeterminateSystems/nix-installer-action@main"; - } - { - uses = "DeterminateSystems/magic-nix-cache-action@main"; - } - { - uses = "DeterminateSystems/flake-checker-action@main"; - } - { - name = "Run `nix build`"; - } + on = [ + "push" + "pull_request" ]; - run = "nix build ."; + jobs = { + build = { + runsOn = "ubuntu-latest"; + steps = [ + { + uses = "actions/checkout@v4"; + } + { + name = "Build"; + run = "npm run build"; + } + ]; + }; + }; }; + }; }; From a87235ddaffcc55a1bf19e770501dd0a2fc294e4 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 21:53:53 -0500 Subject: [PATCH 15/87] trying magic cache --- .github/workflows/ci.yaml | 19 +++++++++ flake.lock | 83 ++++----------------------------------- flake.nix | 44 ++++++--------------- 3 files changed, 38 insertions(+), 108 deletions(-) create mode 100644 .github/workflows/ci.yaml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 0000000..000a3a6 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,19 @@ +name: CI + +on: + push: + pull_request: + +jobs: + check: + runs-on: ubuntu-22.04 + permissions: + id-token: "write" + contents: "read" + steps: + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: DeterminateSystems/flake-checker-action@main + - name: Run `nix build` + run: nix build . diff --git a/flake.lock b/flake.lock index 4a115eb..6475906 100644 --- a/flake.lock +++ b/flake.lock @@ -63,43 +63,6 @@ "type": "github" } }, - "flake-parts_3": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib_3" - }, - "locked": { - "lastModified": 1763759067, - "narHash": "sha256-LlLt2Jo/gMNYAwOgdRQBrsRoOz7BPRkzvNaI/fzXi2Q=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "2cccadc7357c0ba201788ae99c4dfa90728ef5e0", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "github-actions-nix": { - "inputs": { - "flake-parts": "flake-parts_3", - "nixpkgs": "nixpkgs" - }, - "locked": { - "lastModified": 1763847365, - "narHash": "sha256-RVjSCZWzs1nn4k4jf3hj9lhoRKI8S2xc0xMXAz+gTQ8=", - "owner": "synapdeck", - "repo": "github-actions-nix", - "rev": "e941d8dde765b1a860b757e68e814e73a4b1284c", - "type": "github" - }, - "original": { - "owner": "synapdeck", - "repo": "github-actions-nix", - "type": "github" - } - }, "import-tree": { "locked": { "lastModified": 1763762820, @@ -117,15 +80,15 @@ }, "nixpkgs": { "locked": { - "lastModified": 1763678758, - "narHash": "sha256-+hBiJ+kG5IoffUOdlANKFflTT5nO3FrrR2CA3178Y5s=", - "owner": "NixOS", + "lastModified": 1765779637, + "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", + "owner": "nixos", "repo": "nixpkgs", - "rev": "117cc7f94e8072499b0a7aa4c52084fa4e11cc9b", + "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", "type": "github" }, "original": { - "owner": "NixOS", + "owner": "nixos", "ref": "nixos-unstable", "repo": "nixpkgs", "type": "github" @@ -161,38 +124,7 @@ "type": "github" } }, - "nixpkgs-lib_3": { - "locked": { - "lastModified": 1761765539, - "narHash": "sha256-b0yj6kfvO8ApcSE+QmA6mUfu8IYG6/uU28OFn4PaC8M=", - "owner": "nix-community", - "repo": "nixpkgs.lib", - "rev": "719359f4562934ae99f5443f20aa06c2ffff91fc", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nixpkgs.lib", - "type": "github" - } - }, "nixpkgs_2": { - "locked": { - "lastModified": 1765779637, - "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs_3": { "locked": { "lastModified": 1761236834, "narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", @@ -212,8 +144,7 @@ "inputs": { "bun2nix": "bun2nix", "flake-parts": "flake-parts_2", - "github-actions-nix": "github-actions-nix", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "systems": "systems", "treefmt-nix": "treefmt-nix_2" } @@ -256,7 +187,7 @@ }, "treefmt-nix_2": { "inputs": { - "nixpkgs": "nixpkgs_3" + "nixpkgs": "nixpkgs_2" }, "locked": { "lastModified": 1762938485, diff --git a/flake.nix b/flake.nix index 5b96ee1..14b4312 100644 --- a/flake.nix +++ b/flake.nix @@ -11,7 +11,6 @@ flake-parts.url = "github:hercules-ci/flake-parts"; treefmt-nix.url = "github:numtide/treefmt-nix"; - github-actions-nix.url = "github:synapdeck/github-actions-nix"; }; # Use the cached version of bun2nix from the nix-community cli @@ -41,10 +40,14 @@ ]; imports = [ inputs.treefmt-nix.flakeModule - inputs.github-actions-nix.flakeModule ]; perSystem = - { pkgs, system, ... }: + { + config, + pkgs, + system, + ... + }: { # This sets `pkgs` to a nixpkgs with allowUnfree option set. _module.args.pkgs = import nixpkgs { @@ -57,35 +60,11 @@ programs.biome.enable = true; }; - githubActions = { - enable = true; - workflowsDir = "./.github/workflows"; - workflows = { - - ci = { - name = "CI"; - on = [ - "push" - "pull_request" - ]; - jobs = { - build = { - runsOn = "ubuntu-latest"; - steps = [ - { - uses = "actions/checkout@v4"; - } - { - name = "Build"; - run = "npm run build"; - } - ]; - }; - }; - }; - - }; - }; + # Create a package that copies the workflows to .github/workflows + packages.workflows = pkgs.runCommand "copy-workflows" { } '' + mkdir -p $out/.github/workflows + cp -r ${config.githubActions.workflowsDir}/* $out/.github/workflows/ + ''; packages = { # Produce a package for this template with bun2nix in @@ -93,6 +72,7 @@ default = pkgs.callPackage ./mkUserscript.nix { packagePath = ./packages/better-custom-hotkeys; }; + }; devShells.default = pkgs.mkShell { nativeBuildInputs = with pkgs; [ From 051b458f7e953dc72ac75c6782674700171f8817 Mon Sep 17 00:00:00 2001 From: Josh Romer Date: Tue, 16 Dec 2025 22:13:29 -0500 Subject: [PATCH 16/87] Add deploy job for GitHub Pages Added a deploy job to GitHub Actions workflow for Pages deployment. --- .github/workflows/ci.yaml | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 000a3a6..c0e1206 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,7 +5,7 @@ on: pull_request: jobs: - check: + build: runs-on: ubuntu-22.04 permissions: id-token: "write" @@ -17,3 +17,24 @@ jobs: - uses: DeterminateSystems/flake-checker-action@main - name: Run `nix build` run: nix build . + # Deploy job + deploy: + # Add a dependency to the build job + needs: build + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # to verify the deployment originates from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + # Specify runner + deployment step + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 # or specific "vX.X.X" version tag for this action From c0c711a5edc1033fd167bd63e1b6826469fc692a Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 16 Dec 2025 23:21:05 -0500 Subject: [PATCH 17/87] remove github pages attempt for now lol --- .github/workflows/ci.yaml | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c0e1206..41d9a54 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,24 +17,3 @@ jobs: - uses: DeterminateSystems/flake-checker-action@main - name: Run `nix build` run: nix build . - # Deploy job - deploy: - # Add a dependency to the build job - needs: build - - # Grant GITHUB_TOKEN the permissions required to make a Pages deployment - permissions: - pages: write # to deploy to Pages - id-token: write # to verify the deployment originates from an appropriate source - - # Deploy to the github-pages environment - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - - # Specify runner + deployment step - runs-on: ubuntu-latest - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 # or specific "vX.X.X" version tag for this action From 4db14ca8f06a1db3b8330ba8fe417c0d2ce20fe6 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Wed, 17 Dec 2025 02:57:18 -0500 Subject: [PATCH 18/87] WIP mostly working mod key + prayer hot keys --- .../better-custom-hotkeys.user.js | 85 ++++-- packages/better-custom-hotkeys/index.ts | 254 ++++++++++++++++-- 2 files changed, 299 insertions(+), 40 deletions(-) diff --git a/packages/better-custom-hotkeys/better-custom-hotkeys.user.js b/packages/better-custom-hotkeys/better-custom-hotkeys.user.js index ecfe475..17af023 100644 --- a/packages/better-custom-hotkeys/better-custom-hotkeys.user.js +++ b/packages/better-custom-hotkeys/better-custom-hotkeys.user.js @@ -11,49 +11,104 @@ // ==/UserScript== // User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) -const HOTKEY_CONFIG = { - [GM_getValue("hotkey_worship", "1")]: { - originalKey: "F1", +const DEFAULT_HOTKEYS = { + 1: { + action: "run", description: "Worship - Activates the Run worship ability", }, - [GM_getValue("hotkey_consumeFood", "2")]: { - originalKey: "F2", + 2: { + action: "eat", description: "Inventory - Consumes a piece of food", }, - [GM_getValue("hotkey_lightFire", "3")]: { - originalKey: "F3", + 3: { + action: "lightFire", description: "Inventory - Lights a fire", }, - [GM_getValue("hotkey_autoEquip1", "q")]: { - originalKey: "F6", + q: { + action: "equip1", + description: "Equipment - Auto equips items that you've configured", + }, + w: { + action: "equip2", + description: "Equipment - Auto equips items that you've configured", + }, + e: { + action: "equip3", description: "Equipment - Auto equips items that you've configured", }, - [GM_getValue("hotkey_autoEquip2", "w")]: { + a: { + action: "badge1", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + s: { + action: "badge2", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + d: { + action: "badge3", + description: "Badge - Right click a badge and click the 'set key binding'", + }, + f: { + action: "badge4", + description: "Badge - Right click a badge and click the 'set key binding'", + }, +}; + +const ACTIONS = { + run: { + originalKey: "F1", + description: "Run", + socketCommand: "SHORTCUT_KEY=F1", + }, + eat: { + originalKey: "F2", + description: "Consumes a piece of food", + socketCommand: "SHORTCUT_KEY=F2", + }, + lightFire: { + originalKey: "F3", + description: "Lights a fire", + socketCommand: "SHORTCUT_KEY=F3", + }, + equip1: { + originalKey: "F6", + description: "Equipment Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F6", + }, + equip2: { originalKey: "F7", description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F7", }, - [GM_getValue("hotkey_autoEquip3", "e")]: { + equip3: { originalKey: "F8", description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F8", }, - [GM_getValue("hotkey_badge1", "a")]: { + badge1: { originalKey: "F9", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F9", }, - [GM_getValue("hotkey_badge2", "s")]: { + badge2: { originalKey: "F10", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F10", }, - [GM_getValue("hotkey_badge3", "d")]: { + badge3: { originalKey: "F11", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F11", }, - [GM_getValue("hotkey_badge4", "f")]: { + badge4: { originalKey: "F12", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F12", }, }; +const hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); + //can be from canvas or chat input const focusOrSendChat = () => { const value = chat_ele.value.trim(); diff --git a/packages/better-custom-hotkeys/index.ts b/packages/better-custom-hotkeys/index.ts index ca28dd2..7a09cdc 100644 --- a/packages/better-custom-hotkeys/index.ts +++ b/packages/better-custom-hotkeys/index.ts @@ -1,49 +1,248 @@ -// User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) -const HOTKEY_CONFIG: { - [x: string]: { originalKey: string; description: string }; -} = { - [GM_getValue("hotkey_worship", "1")]: { +const ACTIONS = { + run: { originalKey: "F1", - description: "Worship - Activates the Run worship ability", + description: "Run", + socketCommand: "SHORTCUT_KEY=F1", }, - [GM_getValue("hotkey_consumeFood", "2")]: { + eat: { originalKey: "F2", - description: "Inventory - Consumes a piece of food", + description: "Consumes a piece of food", + socketCommand: "SHORTCUT_KEY=F2", }, - [GM_getValue("hotkey_lightFire", "3")]: { + lightFire: { originalKey: "F3", - description: "Inventory - Lights a fire", + description: "Lights a fire", + socketCommand: "SHORTCUT_KEY=F3", }, - [GM_getValue("hotkey_autoEquip1", "q")]: { + equip1: { originalKey: "F6", - description: "Equipment - Auto equips items that you've configured", + description: "Equipment Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F6", }, - [GM_getValue("hotkey_autoEquip2", "w")]: { + equip2: { originalKey: "F7", description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F7", }, - [GM_getValue("hotkey_autoEquip3", "e")]: { + equip3: { originalKey: "F8", description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F8", }, - [GM_getValue("hotkey_badge1", "a")]: { + badge1: { originalKey: "F9", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F9", }, - [GM_getValue("hotkey_badge2", "s")]: { + badge2: { originalKey: "F10", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F10", }, - [GM_getValue("hotkey_badge3", "d")]: { + badge3: { originalKey: "F11", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F11", }, - [GM_getValue("hotkey_badge4", "f")]: { + badge4: { originalKey: "F12", description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F12", + }, + + teleport_everbrook: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_everbrook", + }, + + remote_sell: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=remote_sell", + }, + + dig: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=dig", + }, + + teleport_mysticvale: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_mysticvale", + }, + + timers: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=timers", + }, + + teleport_omboko: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_omboko", + }, + + teleport_dock_haven: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_dock_haven", + }, + + auto_hell_burying: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=auto_hell_burying", + }, + + teleport_jafa_outpost: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_jafa_outpost", + }, + + hunting_contact: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=hunting_contact", + }, + + mass_pickup: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=mass_pickup", }, }; +const DEFAULT_HOTKEYS: Record< + string, + { + action: string; + key: string; + altKey: boolean; + shiftKey: boolean; + crtlKey: boolean; + metaKey: boolean; + } +> = { + "1-false-false-false-false": { + key: "1", + action: "run", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "2-false-false-false-false": { + key: "2", + action: "eat", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "3-false-false-false-false": { + key: "3", + action: "lightFire", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "q-false-false-false-false": { + key: "q", + action: "equip1", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "w-false-false-false-false": { + key: "w", + action: "equip2", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "e-false-false-false-false": { + key: "e", + action: "equip3", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "a-false-false-false-false": { + key: "a", + action: "badge1", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "s-false-false-false-false": { + key: "s", + action: "badge2", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "d-false-false-false-false": { + key: "d", + action: "badge3", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "f-false-false-false-false": { + key: "f", + action: "badge4", + altKey: false, + crtlKey: false, + metaKey: false, + shiftKey: false, + }, + "f-false-true-false-true": { + key: "f", + action: "teleport_everbrook", + altKey: false, + crtlKey: true, + metaKey: false, + shiftKey: true, + }, +}; + +interface keypress { + key: string; + altKey: boolean; + ctrlKey: boolean; + metaKey: boolean; + shiftKey: boolean; +} + +const keypressToHashableString = (keypress: keypress) => { + return `${keypress.key}-${keypress.altKey}-${keypress.ctrlKey}-${keypress.metaKey}-${keypress.shiftKey}`.toLowerCase(); +}; + +const hashableStringToKeypress = (str: string) => { + const [key, altKey, ctrlKey, metaKey, shiftKey] = str.split("-"); + return { + key, + altKey, + ctrlKey, + metaKey, + shiftKey, + }; +}; + +const hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); + //can be from canvas or chat input const focusOrSendChat = () => { const value = chat_ele.value.trim(); @@ -54,7 +253,7 @@ const focusOrSendChat = () => { } if (value !== "") { - Globals.websocket.send("CHAT=" + value); + Globals.websocket.send(`CHAT=${value}`); chat_ele.value = ""; } request_unfocus_chatbox(); @@ -64,7 +263,7 @@ const focusOrSendChat = () => { const handleNpcChatModal = (e: KeyboardEvent) => { const keyCode = e.keyCode; if (has_npc_chat_message_modal_open()) { - if (keyCode == 32) { + if (keyCode === 32) { document.getElementById("npc-chat-message-modal-continue-btn")?.click(); e.preventDefault(); } @@ -139,7 +338,7 @@ const hotkeyListener = (e: KeyboardEvent) => { e.preventDefault(); } - if (document.activeElement?.id != "body") { + if (document.activeElement?.id !== "body") { return; } @@ -149,10 +348,15 @@ const hotkeyListener = (e: KeyboardEvent) => { e.preventDefault(); } - if (e.key in HOTKEY_CONFIG) { - const pressedHotkey = HOTKEY_CONFIG[e.key]; - Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`); - e.preventDefault(); + const keypressString = keypressToHashableString(e); + + if (keypressString in hotkeys) { + const pressedHotkey = hotkeys[keypressString]; + const action = ACTIONS[pressedHotkey.action]; + if (action) { + Globals.websocket.send(action.socketCommand); + e.preventDefault(); + } } }; From 3617f683d9e201fe84ab3f73bea9b7fc651b33ac Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 21 Dec 2025 22:59:45 -0500 Subject: [PATCH 19/87] Working prayer hotkeys and modifier keys --- packages/better-custom-hotkeys/ACTIONS.ts | 120 ++++++++ .../DEFAULT_HOTKEYS.1.ts | 0 .../better-custom-hotkeys/DEFAULT_HOTKEYS.ts | 214 +++++++++++++++ .../better-custom-hotkeys.user.js | 225 --------------- packages/better-custom-hotkeys/hotkeys.ts | 69 +++++ packages/better-custom-hotkeys/index.ts | 258 +----------------- 6 files changed, 411 insertions(+), 475 deletions(-) create mode 100644 packages/better-custom-hotkeys/ACTIONS.ts create mode 100644 packages/better-custom-hotkeys/DEFAULT_HOTKEYS.1.ts create mode 100644 packages/better-custom-hotkeys/DEFAULT_HOTKEYS.ts delete mode 100644 packages/better-custom-hotkeys/better-custom-hotkeys.user.js create mode 100644 packages/better-custom-hotkeys/hotkeys.ts diff --git a/packages/better-custom-hotkeys/ACTIONS.ts b/packages/better-custom-hotkeys/ACTIONS.ts new file mode 100644 index 0000000..509cb2e --- /dev/null +++ b/packages/better-custom-hotkeys/ACTIONS.ts @@ -0,0 +1,120 @@ +import type { actions } from "./hotkeys"; + +export const ACTIONS: actions = { + run: { + originalKey: "F1", + description: "Run", + socketCommand: "SHORTCUT_KEY=F1", + }, + eat: { + originalKey: "F2", + description: "Consumes a piece of food", + socketCommand: "SHORTCUT_KEY=F2", + }, + lightFire: { + originalKey: "F3", + description: "Lights a fire", + socketCommand: "SHORTCUT_KEY=F3", + }, + equip1: { + originalKey: "F6", + description: "Equipment Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F6", + }, + equip2: { + originalKey: "F7", + description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F7", + }, + equip3: { + originalKey: "F8", + description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F8", + }, + badge1: { + originalKey: "F9", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F9", + }, + badge2: { + originalKey: "F10", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F10", + }, + badge3: { + originalKey: "F11", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F11", + }, + badge4: { + originalKey: "F12", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F12", + }, + + teleport_everbrook: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_everbrook", + }, + + remote_sell: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=remote_sell", + }, + + dig: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=dig", + }, + + teleport_mysticvale: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_mysticvale", + }, + + timers: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=timers", + }, + + teleport_omboko: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_omboko", + }, + + teleport_dock_haven: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_dock_haven", + }, + + auto_hell_burying: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=auto_hell_burying", + }, + + teleport_jafa_outpost: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_jafa_outpost", + }, + + hunting_contact: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=hunting_contact", + }, + + mass_pickup: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=mass_pickup", + }, +}; diff --git a/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.1.ts b/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.1.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.ts b/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.ts new file mode 100644 index 0000000..ead5604 --- /dev/null +++ b/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.ts @@ -0,0 +1,214 @@ +import type { hotkey } from "./hotkeys"; + +export const DEFAULT_HOTKEYS: hotkey[] = [ + { + action: "run", + hotkey: { + key: "r", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "eat", + hotkey: { + key: "f", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "lightFire", + hotkey: { + key: "4", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "equip1", + hotkey: { + key: "1", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "equip2", + hotkey: { + key: "2", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "equip3", + hotkey: { + key: "3", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "badge1", + hotkey: { + key: "a", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "badge2", + hotkey: { + key: "s", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "badge3", + hotkey: { + key: "d", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "badge4", + hotkey: { + key: "v", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "teleport_everbrook", + hotkey: { + key: "e", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "remote_sell", + hotkey: { + key: "s", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "dig", + hotkey: { + key: "l", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "teleport_mysticvale", + hotkey: { + key: "m", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "timers", + hotkey: { + key: "0", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "teleport_omboko", + hotkey: { + key: "o", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "teleport_dock_haven", + hotkey: { + key: "d", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "auto_hell_burying", + hotkey: { + key: "f", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "teleport_jafa_outpost", + hotkey: { + key: "j", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "hunting_contact", + hotkey: { + key: "h", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, + { + action: "mass_pickup", + hotkey: { + key: "p", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, +]; diff --git a/packages/better-custom-hotkeys/better-custom-hotkeys.user.js b/packages/better-custom-hotkeys/better-custom-hotkeys.user.js deleted file mode 100644 index 17af023..0000000 --- a/packages/better-custom-hotkeys/better-custom-hotkeys.user.js +++ /dev/null @@ -1,225 +0,0 @@ -// ==UserScript== -// @name Better hotkeys -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue -// @version 0.001 -// @author Joshu -// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. -// @inject-into page -// ==/UserScript== - -// User Defined HotKeys - Customize via ViolentMonkey storage (GM_getValue/GM_setValue) -const DEFAULT_HOTKEYS = { - 1: { - action: "run", - description: "Worship - Activates the Run worship ability", - }, - 2: { - action: "eat", - description: "Inventory - Consumes a piece of food", - }, - 3: { - action: "lightFire", - description: "Inventory - Lights a fire", - }, - q: { - action: "equip1", - description: "Equipment - Auto equips items that you've configured", - }, - w: { - action: "equip2", - description: "Equipment - Auto equips items that you've configured", - }, - e: { - action: "equip3", - description: "Equipment - Auto equips items that you've configured", - }, - a: { - action: "badge1", - description: "Badge - Right click a badge and click the 'set key binding'", - }, - s: { - action: "badge2", - description: "Badge - Right click a badge and click the 'set key binding'", - }, - d: { - action: "badge3", - description: "Badge - Right click a badge and click the 'set key binding'", - }, - f: { - action: "badge4", - description: "Badge - Right click a badge and click the 'set key binding'", - }, -}; - -const ACTIONS = { - run: { - originalKey: "F1", - description: "Run", - socketCommand: "SHORTCUT_KEY=F1", - }, - eat: { - originalKey: "F2", - description: "Consumes a piece of food", - socketCommand: "SHORTCUT_KEY=F2", - }, - lightFire: { - originalKey: "F3", - description: "Lights a fire", - socketCommand: "SHORTCUT_KEY=F3", - }, - equip1: { - originalKey: "F6", - description: "Equipment Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F6", - }, - equip2: { - originalKey: "F7", - description: "Equipment - Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F7", - }, - equip3: { - originalKey: "F8", - description: "Equipment - Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F8", - }, - badge1: { - originalKey: "F9", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F9", - }, - badge2: { - originalKey: "F10", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F10", - }, - badge3: { - originalKey: "F11", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F11", - }, - badge4: { - originalKey: "F12", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F12", - }, -}; - -const hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); - -//can be from canvas or chat input -const focusOrSendChat = () => { - const value = chat_ele.value.trim(); - - if (document.activeElement !== chat_ele) { - request_focus_chatbox(); - return; - } - - if (value !== "") { - Globals.websocket.send("CHAT=" + value); - chat_ele.value = ""; - } - request_unfocus_chatbox(); -}; - -// Just leaving this section the same as the OG as much as possible -const handleNpcChatModal = (e) => { - const keyCode = e.keyCode; - if (has_npc_chat_message_modal_open()) { - if (keyCode == 32) { - document.getElementById("npc-chat-message-modal-continue-btn").click(); - e.preventDefault(); - } - return; - } - if (has_npc_chat_options_modal_open()) { - switch (keyCode) { - case 49: - { - const wrapper = document.getElementById( - "npc-chat-options-modal-content", - ); - const options = wrapper.getElementsByTagName("div"); - if (options[0].style.display != "none") { - options[0].click(); - } - } - break; - case 50: - { - const wrapper = document.getElementById( - "npc-chat-options-modal-content", - ); - const options = wrapper.getElementsByTagName("div"); - if (options[1].style.display != "none") { - options[1].click(); - } - } - - break; - case 51: - { - const wrapper = document.getElementById( - "npc-chat-options-modal-content", - ); - const options = wrapper.getElementsByTagName("div"); - if (options[2].style.display != "none") { - options[2].click(); - } - } - - break; - case 52: - { - const wrapper = document.getElementById( - "npc-chat-options-modal-content", - ); - const options = wrapper.getElementsByTagName("div"); - if (options[3].style.display != "none") { - options[3].click(); - } - } - break; - } - } -}; - -const hotkeyListener = (e) => { - if (e.repeat) return; - // Checks from original handler - if (Globals.local_username == null) return; - - if (has_npc_chat_message_modal_open()) { - handleNpcChatModal(e); - return; - } - - if (has_modal_open()) return; - - if (e.key === "Enter") { - focusOrSendChat(); - e.preventDefault(); - } - - if (document.activeElement.id != "body") { - return; - } - - if (e.key === "/") { - chat_ele.value = "/"; - request_focus_chatbox(); - e.preventDefault(); - } - - if (e.key in HOTKEY_CONFIG) { - const pressedHotkey = HOTKEY_CONFIG[e.key]; - Globals.websocket.send(`SHORTCUT_KEY=${pressedHotkey.originalKey}`); - e.preventDefault(); - } -}; - -window.removeEventListener("keypress", keypress_listener); -window.addEventListener("keydown", hotkeyListener, false); diff --git a/packages/better-custom-hotkeys/hotkeys.ts b/packages/better-custom-hotkeys/hotkeys.ts new file mode 100644 index 0000000..38b6750 --- /dev/null +++ b/packages/better-custom-hotkeys/hotkeys.ts @@ -0,0 +1,69 @@ +import { DEFAULT_HOTKEYS } from "./DEFAULT_HOTKEYS"; + +interface keypress { + key: string; + altKey: boolean; + ctrlKey: boolean; + metaKey: boolean; + shiftKey: boolean; +} + +interface actionProperties { + originalKey: string; + description: string; + socketCommand: string; +} + +export type actions = { + run: actionProperties; + eat: actionProperties; + lightFire: actionProperties; + equip1: actionProperties; + equip2: actionProperties; + equip3: actionProperties; + badge1: actionProperties; + badge2: actionProperties; + badge3: actionProperties; + badge4: actionProperties; + teleport_everbrook: actionProperties; + remote_sell: actionProperties; + dig: actionProperties; + teleport_mysticvale: actionProperties; + timers: actionProperties; + teleport_omboko: actionProperties; + teleport_dock_haven: actionProperties; + auto_hell_burying: actionProperties; + teleport_jafa_outpost: actionProperties; + hunting_contact: actionProperties; + mass_pickup: actionProperties; +}; + +export interface hotkey { + action: keyof actions; + hotkey: keypress; +} + +export const keypressToHashableString = (keypress: keypress) => { + return `${keypress.key}-${keypress.altKey}-${keypress.ctrlKey}-${keypress.metaKey}-${keypress.shiftKey}`.toLowerCase(); +}; + +const hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); +export const hashedHotkeyMap = hotkeys.reduce>( + (result, hotkey) => { + const hashed = keypressToHashableString(hotkey.hotkey); + result[hashed] = hotkey; + return result; + }, + {}, +); + +export const hashableStringToKeypress = (str: string) => { + const [key, altKey, ctrlKey, metaKey, shiftKey] = str.split("-"); + return { + key, + altKey, + ctrlKey, + metaKey, + shiftKey, + }; +}; diff --git a/packages/better-custom-hotkeys/index.ts b/packages/better-custom-hotkeys/index.ts index 7a09cdc..1dd0bcc 100644 --- a/packages/better-custom-hotkeys/index.ts +++ b/packages/better-custom-hotkeys/index.ts @@ -1,247 +1,5 @@ -const ACTIONS = { - run: { - originalKey: "F1", - description: "Run", - socketCommand: "SHORTCUT_KEY=F1", - }, - eat: { - originalKey: "F2", - description: "Consumes a piece of food", - socketCommand: "SHORTCUT_KEY=F2", - }, - lightFire: { - originalKey: "F3", - description: "Lights a fire", - socketCommand: "SHORTCUT_KEY=F3", - }, - equip1: { - originalKey: "F6", - description: "Equipment Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F6", - }, - equip2: { - originalKey: "F7", - description: "Equipment - Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F7", - }, - equip3: { - originalKey: "F8", - description: "Equipment - Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F8", - }, - badge1: { - originalKey: "F9", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F9", - }, - badge2: { - originalKey: "F10", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F10", - }, - badge3: { - originalKey: "F11", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F11", - }, - badge4: { - originalKey: "F12", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F12", - }, - - teleport_everbrook: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_everbrook", - }, - - remote_sell: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=remote_sell", - }, - - dig: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=dig", - }, - - teleport_mysticvale: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_mysticvale", - }, - - timers: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=timers", - }, - - teleport_omboko: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_omboko", - }, - - teleport_dock_haven: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_dock_haven", - }, - - auto_hell_burying: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=auto_hell_burying", - }, - - teleport_jafa_outpost: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_jafa_outpost", - }, - - hunting_contact: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=hunting_contact", - }, - - mass_pickup: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=mass_pickup", - }, -}; - -const DEFAULT_HOTKEYS: Record< - string, - { - action: string; - key: string; - altKey: boolean; - shiftKey: boolean; - crtlKey: boolean; - metaKey: boolean; - } -> = { - "1-false-false-false-false": { - key: "1", - action: "run", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "2-false-false-false-false": { - key: "2", - action: "eat", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "3-false-false-false-false": { - key: "3", - action: "lightFire", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "q-false-false-false-false": { - key: "q", - action: "equip1", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "w-false-false-false-false": { - key: "w", - action: "equip2", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "e-false-false-false-false": { - key: "e", - action: "equip3", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "a-false-false-false-false": { - key: "a", - action: "badge1", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "s-false-false-false-false": { - key: "s", - action: "badge2", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "d-false-false-false-false": { - key: "d", - action: "badge3", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "f-false-false-false-false": { - key: "f", - action: "badge4", - altKey: false, - crtlKey: false, - metaKey: false, - shiftKey: false, - }, - "f-false-true-false-true": { - key: "f", - action: "teleport_everbrook", - altKey: false, - crtlKey: true, - metaKey: false, - shiftKey: true, - }, -}; - -interface keypress { - key: string; - altKey: boolean; - ctrlKey: boolean; - metaKey: boolean; - shiftKey: boolean; -} - -const keypressToHashableString = (keypress: keypress) => { - return `${keypress.key}-${keypress.altKey}-${keypress.ctrlKey}-${keypress.metaKey}-${keypress.shiftKey}`.toLowerCase(); -}; - -const hashableStringToKeypress = (str: string) => { - const [key, altKey, ctrlKey, metaKey, shiftKey] = str.split("-"); - return { - key, - altKey, - ctrlKey, - metaKey, - shiftKey, - }; -}; - -const hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); +import { ACTIONS } from "./ACTIONS"; +import { hashedHotkeyMap, keypressToHashableString } from "./hotkeys"; //can be from canvas or chat input const focusOrSendChat = () => { @@ -277,7 +35,7 @@ const handleNpcChatModal = (e: KeyboardEvent) => { "npc-chat-options-modal-content", ); const options = wrapper?.getElementsByTagName("div"); - if (options && options[0].style.display != "none") { + if (options && options[0].style.display !== "none") { options[0].click(); } } @@ -288,7 +46,7 @@ const handleNpcChatModal = (e: KeyboardEvent) => { "npc-chat-options-modal-content", ); const options = wrapper?.getElementsByTagName("div"); - if (options && options[1].style.display != "none") { + if (options && options[1].style.display !== "none") { options[1].click(); } } @@ -300,7 +58,7 @@ const handleNpcChatModal = (e: KeyboardEvent) => { "npc-chat-options-modal-content", ); const options = wrapper?.getElementsByTagName("div"); - if (options && options[2].style.display != "none") { + if (options && options[2].style.display !== "none") { options[2].click(); } } @@ -312,7 +70,7 @@ const handleNpcChatModal = (e: KeyboardEvent) => { "npc-chat-options-modal-content", ); const options = wrapper?.getElementsByTagName("div"); - if (options && options[3].style.display != "none") { + if (options && options[3].style.display !== "none") { options[3].click(); } } @@ -350,8 +108,8 @@ const hotkeyListener = (e: KeyboardEvent) => { const keypressString = keypressToHashableString(e); - if (keypressString in hotkeys) { - const pressedHotkey = hotkeys[keypressString]; + if (keypressString in hashedHotkeyMap) { + const pressedHotkey = hashedHotkeyMap[keypressString]; const action = ACTIONS[pressedHotkey.action]; if (action) { Globals.websocket.send(action.socketCommand); From 9801193043323be7e5991f6ebb7eea1818784e93 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 21 Dec 2025 23:12:56 -0500 Subject: [PATCH 20/87] made it save default hotkeys --- packages/better-custom-hotkeys/hotkeys.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/better-custom-hotkeys/hotkeys.ts b/packages/better-custom-hotkeys/hotkeys.ts index 38b6750..392d6a0 100644 --- a/packages/better-custom-hotkeys/hotkeys.ts +++ b/packages/better-custom-hotkeys/hotkeys.ts @@ -47,7 +47,12 @@ export const keypressToHashableString = (keypress: keypress) => { return `${keypress.key}-${keypress.altKey}-${keypress.ctrlKey}-${keypress.metaKey}-${keypress.shiftKey}`.toLowerCase(); }; +if (GM_getValue("hotkeys", null) === null) { + GM_setValue("hotkeys", DEFAULT_HOTKEYS); +} + const hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); + export const hashedHotkeyMap = hotkeys.reduce>( (result, hotkey) => { const hashed = keypressToHashableString(hotkey.hotkey); From 5b8823981c9b8086340ed6dc06d7967986730c71 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 21 Dec 2025 23:17:11 -0500 Subject: [PATCH 21/87] updated to not use Det Nix --- .github/workflows/ci.yaml | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 41d9a54..a3774b3 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,19 +1,14 @@ -name: CI - +name: "CI" on: - push: pull_request: - + push: jobs: - build: - runs-on: ubuntu-22.04 - permissions: - id-token: "write" - contents: "read" + tests: + runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: DeterminateSystems/flake-checker-action@main - - name: Run `nix build` - run: nix build . + - uses: actions/checkout@v5 + - uses: cachix/install-nix-action@v31 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + - run: nix build + - run: nix flake check From 3dd2e50ce05d3a51e801073b6b51430809d80f4e Mon Sep 17 00:00:00 2001 From: Josh Romer Date: Sun, 21 Dec 2025 23:21:42 -0500 Subject: [PATCH 22/87] Add artifact upload step to CI workflow Added a step to upload PDF artifact unless it's a release. --- .github/workflows/ci.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a3774b3..ab3fdbb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,4 +11,9 @@ jobs: with: github_access_token: ${{ secrets.GITHUB_TOKEN }} - run: nix build - - run: nix flake check + - name: Upload PDF artifact + if: github.event_name != 'release' + uses: actions/upload-artifact@v4 + with: + name: resume + path: result/dist/@workspace/better-custom-hotkeys.user.js From 263e52a07511fdb2c0305d52e1c25966a79b74fb Mon Sep 17 00:00:00 2001 From: Josh Romer Date: Sun, 21 Dec 2025 23:27:25 -0500 Subject: [PATCH 23/87] Rename PDF artifact upload to userscripts --- .github/workflows/ci.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index ab3fdbb..0420246 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -11,9 +11,9 @@ jobs: with: github_access_token: ${{ secrets.GITHUB_TOKEN }} - run: nix build - - name: Upload PDF artifact + - name: Upload userscripts artifact if: github.event_name != 'release' uses: actions/upload-artifact@v4 with: - name: resume + name: userscripts path: result/dist/@workspace/better-custom-hotkeys.user.js From 480c693275509577a23c653901871050839baf39 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 21 Dec 2025 23:24:49 -0500 Subject: [PATCH 24/87] temp putting build result here to share lol --- out/better-custom-hotkeys.user.js | 445 ++++++++++++++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100644 out/better-custom-hotkeys.user.js diff --git a/out/better-custom-hotkeys.user.js b/out/better-custom-hotkeys.user.js new file mode 100644 index 0000000..902f758 --- /dev/null +++ b/out/better-custom-hotkeys.user.js @@ -0,0 +1,445 @@ +// ==UserScript== +// @name Better hotkeys +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.001 +// @author Joshu +// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. +// @inject-into page +// ==/UserScript== + +// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/ACTIONS.ts +var ACTIONS = { + run: { + originalKey: "F1", + description: "Run", + socketCommand: "SHORTCUT_KEY=F1" + }, + eat: { + originalKey: "F2", + description: "Consumes a piece of food", + socketCommand: "SHORTCUT_KEY=F2" + }, + lightFire: { + originalKey: "F3", + description: "Lights a fire", + socketCommand: "SHORTCUT_KEY=F3" + }, + equip1: { + originalKey: "F6", + description: "Equipment Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F6" + }, + equip2: { + originalKey: "F7", + description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F7" + }, + equip3: { + originalKey: "F8", + description: "Equipment - Auto equips items that you've configured", + socketCommand: "SHORTCUT_KEY=F8" + }, + badge1: { + originalKey: "F9", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F9" + }, + badge2: { + originalKey: "F10", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F10" + }, + badge3: { + originalKey: "F11", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F11" + }, + badge4: { + originalKey: "F12", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "SHORTCUT_KEY=F12" + }, + teleport_everbrook: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_everbrook" + }, + remote_sell: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=remote_sell" + }, + dig: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=dig" + }, + teleport_mysticvale: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_mysticvale" + }, + timers: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=timers" + }, + teleport_omboko: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_omboko" + }, + teleport_dock_haven: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_dock_haven" + }, + auto_hell_burying: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=auto_hell_burying" + }, + teleport_jafa_outpost: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=teleport_jafa_outpost" + }, + hunting_contact: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=hunting_contact" + }, + mass_pickup: { + originalKey: "N/A", + description: "Badge - Right click a badge and click the 'set key binding'", + socketCommand: "USE_WORSHIP=mass_pickup" + } +}; + +// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/DEFAULT_HOTKEYS.ts +var DEFAULT_HOTKEYS = [ + { + action: "run", + hotkey: { + key: "r", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "eat", + hotkey: { + key: "f", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "lightFire", + hotkey: { + key: "4", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "equip1", + hotkey: { + key: "1", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "equip2", + hotkey: { + key: "2", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "equip3", + hotkey: { + key: "3", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "badge1", + hotkey: { + key: "a", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "badge2", + hotkey: { + key: "s", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "badge3", + hotkey: { + key: "d", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "badge4", + hotkey: { + key: "v", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "teleport_everbrook", + hotkey: { + key: "e", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "remote_sell", + hotkey: { + key: "s", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "dig", + hotkey: { + key: "l", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "teleport_mysticvale", + hotkey: { + key: "m", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "timers", + hotkey: { + key: "0", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false + } + }, + { + action: "teleport_omboko", + hotkey: { + key: "o", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "teleport_dock_haven", + hotkey: { + key: "d", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "auto_hell_burying", + hotkey: { + key: "f", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "teleport_jafa_outpost", + hotkey: { + key: "j", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "hunting_contact", + hotkey: { + key: "h", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + }, + { + action: "mass_pickup", + hotkey: { + key: "p", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false + } + } +]; + +// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/hotkeys.ts +var keypressToHashableString = (keypress) => { + return `${keypress.key}-${keypress.altKey}-${keypress.ctrlKey}-${keypress.metaKey}-${keypress.shiftKey}`.toLowerCase(); +}; +var hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); +var hashedHotkeyMap = hotkeys.reduce((result, hotkey) => { + const hashed = keypressToHashableString(hotkey.hotkey); + result[hashed] = hotkey; + return result; +}, {}); +GM_setValue("hotkeys", DEFAULT_HOTKEYS); + +// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/index.ts +var focusOrSendChat = () => { + const value = chat_ele.value.trim(); + if (document.activeElement !== chat_ele) { + request_focus_chatbox(); + return; + } + if (value !== "") { + Globals.websocket.send(`CHAT=${value}`); + chat_ele.value = ""; + } + request_unfocus_chatbox(); +}; +var handleNpcChatModal = (e) => { + const keyCode = e.keyCode; + if (has_npc_chat_message_modal_open()) { + if (keyCode === 32) { + document.getElementById("npc-chat-message-modal-continue-btn")?.click(); + e.preventDefault(); + } + return; + } + if (has_npc_chat_options_modal_open()) { + switch (keyCode) { + case 49: + { + const wrapper = document.getElementById("npc-chat-options-modal-content"); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[0].style.display !== "none") { + options[0].click(); + } + } + break; + case 50: + { + const wrapper = document.getElementById("npc-chat-options-modal-content"); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[1].style.display !== "none") { + options[1].click(); + } + } + break; + case 51: + { + const wrapper = document.getElementById("npc-chat-options-modal-content"); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[2].style.display !== "none") { + options[2].click(); + } + } + break; + case 52: + { + const wrapper = document.getElementById("npc-chat-options-modal-content"); + const options = wrapper?.getElementsByTagName("div"); + if (options && options[3].style.display !== "none") { + options[3].click(); + } + } + break; + } + } +}; +var hotkeyListener = (e) => { + if (e.repeat) + return; + if (Globals.local_username == null) + return; + if (has_npc_chat_message_modal_open()) { + handleNpcChatModal(e); + return; + } + if (has_modal_open()) + return; + if (e.key === "Enter") { + focusOrSendChat(); + e.preventDefault(); + } + if (document.activeElement?.id !== "body") { + return; + } + if (e.key === "/") { + chat_ele.value = "/"; + request_focus_chatbox(); + e.preventDefault(); + } + const keypressString = keypressToHashableString(e); + if (keypressString in hashedHotkeyMap) { + const pressedHotkey = hashedHotkeyMap[keypressString]; + const action = ACTIONS[pressedHotkey.action]; + if (action) { + Globals.websocket.send(action.socketCommand); + e.preventDefault(); + } + } +}; +window.removeEventListener("keypress", keypress_listener); +window.addEventListener("keydown", hotkeyListener, false); From a7a699fd7ed977714dc522f3f0a7e7fe061b5629 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 22 Dec 2025 00:10:57 -0500 Subject: [PATCH 25/87] removed accidentally created file --- .github/workflows/ci.yaml | 1 - packages/better-custom-hotkeys/DEFAULT_HOTKEYS.1.ts | 0 2 files changed, 1 deletion(-) delete mode 100644 packages/better-custom-hotkeys/DEFAULT_HOTKEYS.1.ts diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0420246..de56685 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,7 +1,6 @@ name: "CI" on: pull_request: - push: jobs: tests: runs-on: ubuntu-latest diff --git a/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.1.ts b/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.1.ts deleted file mode 100644 index e69de29..0000000 From c1b41f711be927847ef3130b86d8f730c2e488fa Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 26 Dec 2025 04:25:56 -0500 Subject: [PATCH 26/87] wip script to show current action bar --- bun.lock | 10 +++ bun.nix | 1 + flake.nix | 9 +- packages/current-action-ui/index.ts | 105 ++++++++++++++++++++++++ packages/current-action-ui/metadata.js | 11 +++ packages/current-action-ui/package.json | 10 +++ packages/flatmmo-types/flatmmo.d.ts | 24 ++++++ 7 files changed, 164 insertions(+), 6 deletions(-) create mode 100644 packages/current-action-ui/index.ts create mode 100644 packages/current-action-ui/metadata.js create mode 100644 packages/current-action-ui/package.json diff --git a/bun.lock b/bun.lock index 10fee03..e71b382 100644 --- a/bun.lock +++ b/bun.lock @@ -20,6 +20,14 @@ "@workspace/flatmmo-types": "workspace:*", }, }, + "packages/current-action-ui": { + "name": "@workspace/current-action-ui", + "version": "1.0.0", + "devDependencies": { + "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*", + }, + }, "packages/flatmmo-types": { "name": "@workspace/flatmmo-types", "version": "0.0.1", @@ -34,6 +42,8 @@ "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], + "@workspace/current-action-ui": ["@workspace/current-action-ui@workspace:packages/current-action-ui"], + "@workspace/flatmmo-types": ["@workspace/flatmmo-types@workspace:packages/flatmmo-types"], "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], diff --git a/bun.nix b/bun.nix index 2906ea6..d26870a 100644 --- a/bun.nix +++ b/bun.nix @@ -26,6 +26,7 @@ hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; + "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; "bun-types@1.3.4" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; diff --git a/flake.nix b/flake.nix index 14b4312..4976b11 100644 --- a/flake.nix +++ b/flake.nix @@ -60,18 +60,15 @@ programs.biome.enable = true; }; - # Create a package that copies the workflows to .github/workflows - packages.workflows = pkgs.runCommand "copy-workflows" { } '' - mkdir -p $out/.github/workflows - cp -r ${config.githubActions.workflowsDir}/* $out/.github/workflows/ - ''; - packages = { # Produce a package for this template with bun2nix in # the overlay default = pkgs.callPackage ./mkUserscript.nix { packagePath = ./packages/better-custom-hotkeys; }; + current-action-ui = pkgs.callPackage ./mkUserscript.nix { + packagePath = ./packages/current-action-ui; + }; }; devShells.default = pkgs.mkShell { diff --git a/packages/current-action-ui/index.ts b/packages/current-action-ui/index.ts new file mode 100644 index 0000000..cf71f22 --- /dev/null +++ b/packages/current-action-ui/index.ts @@ -0,0 +1,105 @@ +const customConfig = { + x: 10, + y: 80, + height: 20, + width: TILE_SIZE * 2, + backgroundColor: "black", + foregroundColor: "purple", +}; + +const handleChangeColor = ( + color: string, + field: "backgroundColor" | "foregroundColor", +) => { + customConfig[field] = color; +}; + +const menuModal = ` +
    +

    Choose your colors:

    + +
    + + +
    + +
    + + +
    +
    +`; + +// Inject the modal into the page +const modalContainer = document.createElement("div"); +modalContainer.innerHTML = menuModal; +document.body.appendChild(modalContainer); + +// Attach event listeners to the color inputs +const foregroundInput = document.getElementById( + "foreground", +) as HTMLInputElement; +const backgroundInput = document.getElementById( + "background", +) as HTMLInputElement; + +foregroundInput?.addEventListener("input", (e) => { + handleChangeColor((e.target as HTMLInputElement).value, "foregroundColor"); +}); + +backgroundInput?.addEventListener("input", (e) => { + handleChangeColor((e.target as HTMLInputElement).value, "backgroundColor"); +}); + +function paintCustomProgressBar() { + //progress bar + if (progress_bar_active) { + const { x, y, height, width } = customConfig; + const perc = progress_bar_at / progress_bar_target; + ctx.fillStyle = customConfig.backgroundColor; + ctx.fillRect(x, y - TILE_SIZE / 8, width, height); + ctx.fillStyle = customConfig.foregroundColor; + ctx.fillRect(x, y - TILE_SIZE / 8, width * perc, height); + ctx.strokeStyle = "green"; + ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); + } else { + const { x, y, height, width } = customConfig; + ctx.fillStyle = customConfig.backgroundColor; + ctx.fillRect(x, y - TILE_SIZE / 8, width, height); + ctx.strokeStyle = "red"; + ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); + } +} + +const paint_progress_bar_proxy = new Proxy(paint_progress_bar, { + // wraps + apply(target, thisArg, argArray) { + paintCustomProgressBar(); + target(); + }, +}); + +window.addEventListener("keydown", moveBar); + +unsafeWindow.paint_progress_bar = paint_progress_bar_proxy; + +function moveBar(this: Window, ev: KeyboardEvent) { + if (ev.altKey && ev.ctrlKey && ev.key === "z") { + customConfig.x = mouse_over_now.x; + customConfig.y = mouse_over_now.y; + } + if (ev.altKey && ev.ctrlKey && ev.key === "j") { + customConfig.width = customConfig.width * 0.9; + customConfig.height = customConfig.height * 0.9; + } + if (ev.altKey && ev.ctrlKey && ev.key === "k") { + customConfig.width = customConfig.width * 1.1; + customConfig.height = customConfig.height * 1.1; + } +} diff --git a/packages/current-action-ui/metadata.js b/packages/current-action-ui/metadata.js new file mode 100644 index 0000000..cf8e6d4 --- /dev/null +++ b/packages/current-action-ui/metadata.js @@ -0,0 +1,11 @@ +// ==UserScript== +// @name Custom Action UI +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.001 +// @author Joshu +// @description ui tweaks to make it easier to tell at what action your character is doing +// @inject-into page +// ==/UserScript== diff --git a/packages/current-action-ui/package.json b/packages/current-action-ui/package.json new file mode 100644 index 0000000..631bca9 --- /dev/null +++ b/packages/current-action-ui/package.json @@ -0,0 +1,10 @@ +{ + "name": "@workspace/current-action-ui", + "version": "1.0.0", + "module": "index.ts", + "dependencies": {}, + "devDependencies": { + "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*" + } +} diff --git a/packages/flatmmo-types/flatmmo.d.ts b/packages/flatmmo-types/flatmmo.d.ts index d7766b9..ccc8998 100644 --- a/packages/flatmmo-types/flatmmo.d.ts +++ b/packages/flatmmo-types/flatmmo.d.ts @@ -8,6 +8,13 @@ declare function has_modal_open(): boolean; declare function keypress_listener(): void; declare const chat_ele: HTMLInputElement; +declare function paint_progress_bar(): void; +declare let progress_bar_active: boolean; +declare let progress_bar_at: number; +declare let progress_bar_target: number; +declare const TILE_SIZE: number; +declare const ctx: CanvasRenderingContext2D; + // const chat_ele: HTMLInputElement; // const Globals: {websocket: WebSocket}; interface Globals { @@ -18,4 +25,21 @@ interface Globals { websocket_url: string; } +interface player { + username: string; + client_x: number; + client_y: number; +} + +interface mouseOver { + x: number; + y: number; + x_tile: number; + y_tile: number; +} + +declare const mouse_over_now: mouseOver; + +declare const players: player[]; + declare const Globals: Globals; From c6f529576180fa6e5fdafdd7170c732c60724ca9 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 26 Dec 2025 04:29:46 -0500 Subject: [PATCH 27/87] wip script to show current action bar --- packages/current-action-ui/index.ts | 45 +++++++++++++++++++---------- 1 file changed, 29 insertions(+), 16 deletions(-) diff --git a/packages/current-action-ui/index.ts b/packages/current-action-ui/index.ts index cf71f22..f61842a 100644 --- a/packages/current-action-ui/index.ts +++ b/packages/current-action-ui/index.ts @@ -15,24 +15,37 @@ const handleChangeColor = ( }; const menuModal = ` -
    -

    Choose your colors:

    +
    +

    Choose your colors:

    -
    - - -
    +
    + + +
    -
    - - -
    +
    + + +
    `; From 03a4458f97024acf4139bf695cd87193368b82ca Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 26 Dec 2025 05:16:45 -0500 Subject: [PATCH 28/87] initial mostly working script --- packages/current-action-ui/index.ts | 131 +++++++++++++++++++++------- 1 file changed, 98 insertions(+), 33 deletions(-) diff --git a/packages/current-action-ui/index.ts b/packages/current-action-ui/index.ts index f61842a..8b05cad 100644 --- a/packages/current-action-ui/index.ts +++ b/packages/current-action-ui/index.ts @@ -3,15 +3,20 @@ const customConfig = { y: 80, height: 20, width: TILE_SIZE * 2, - backgroundColor: "black", - foregroundColor: "purple", + colors: { + activeBackgroundColor: "black", + activeForegroundColor: "purple", + activeStrokeColor: "green", + idleBackgroundColor: "black", + idleStrokeColor: "red", + }, }; const handleChangeColor = ( color: string, - field: "backgroundColor" | "foregroundColor", + field: keyof (typeof customConfig)["colors"], ) => { - customConfig[field] = color; + customConfig.colors[field] = color; }; const menuModal = ` @@ -26,25 +31,50 @@ const menuModal = ` padding: 20px; box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); z-index: 10000; - min-width: 300px; + min-width: 320px; + display: none; "> -

    Choose your colors:

    +

    Progress Bar Colors

    + +
    +

    Active State

    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    - - +

    Idle State

    + +
    +
    + + +
    + +
    + + +
    +
    -
    - - +
    + Press Ctrl+Alt+M to toggle
    `; @@ -55,37 +85,66 @@ modalContainer.innerHTML = menuModal; document.body.appendChild(modalContainer); // Attach event listeners to the color inputs -const foregroundInput = document.getElementById( - "foreground", +const activeBackgroundInput = document.getElementById( + "activeBackground", +) as HTMLInputElement; +const activeForegroundInput = document.getElementById( + "activeForeground", ) as HTMLInputElement; -const backgroundInput = document.getElementById( - "background", +const activeStrokeInput = document.getElementById( + "activeStroke", +) as HTMLInputElement; +const idleBackgroundInput = document.getElementById( + "idleBackground", +) as HTMLInputElement; +const idleStrokeInput = document.getElementById( + "idleStroke", ) as HTMLInputElement; -foregroundInput?.addEventListener("input", (e) => { - handleChangeColor((e.target as HTMLInputElement).value, "foregroundColor"); +activeBackgroundInput?.addEventListener("input", (e) => { + handleChangeColor( + (e.target as HTMLInputElement).value, + "activeBackgroundColor", + ); }); -backgroundInput?.addEventListener("input", (e) => { - handleChangeColor((e.target as HTMLInputElement).value, "backgroundColor"); +activeForegroundInput?.addEventListener("input", (e) => { + handleChangeColor( + (e.target as HTMLInputElement).value, + "activeForegroundColor", + ); +}); + +activeStrokeInput?.addEventListener("input", (e) => { + handleChangeColor((e.target as HTMLInputElement).value, "activeStrokeColor"); +}); + +idleBackgroundInput?.addEventListener("input", (e) => { + handleChangeColor( + (e.target as HTMLInputElement).value, + "idleBackgroundColor", + ); +}); + +idleStrokeInput?.addEventListener("input", (e) => { + handleChangeColor((e.target as HTMLInputElement).value, "idleStrokeColor"); }); function paintCustomProgressBar() { //progress bar + const { x, y, height, width, colors } = customConfig; if (progress_bar_active) { - const { x, y, height, width } = customConfig; const perc = progress_bar_at / progress_bar_target; - ctx.fillStyle = customConfig.backgroundColor; + ctx.fillStyle = colors.activeBackgroundColor; ctx.fillRect(x, y - TILE_SIZE / 8, width, height); - ctx.fillStyle = customConfig.foregroundColor; + ctx.fillStyle = colors.activeForegroundColor; ctx.fillRect(x, y - TILE_SIZE / 8, width * perc, height); - ctx.strokeStyle = "green"; + ctx.strokeStyle = colors.activeStrokeColor; ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); } else { - const { x, y, height, width } = customConfig; - ctx.fillStyle = customConfig.backgroundColor; + ctx.fillStyle = colors.idleBackgroundColor; ctx.fillRect(x, y - TILE_SIZE / 8, width, height); - ctx.strokeStyle = "red"; + ctx.strokeStyle = colors.idleStrokeColor; ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); } } @@ -115,4 +174,10 @@ function moveBar(this: Window, ev: KeyboardEvent) { customConfig.width = customConfig.width * 1.1; customConfig.height = customConfig.height * 1.1; } + if (ev.altKey && ev.ctrlKey && ev.key === "m") { + const modal = document.getElementById("color-picker-modal"); + if (modal) { + modal.style.display = modal.style.display === "none" ? "block" : "none"; + } + } } From b8ef6a14aa436d1d7a4eff149e96fe14c9cad9fb Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 26 Dec 2025 22:05:58 -0500 Subject: [PATCH 29/87] working basic script --- packages/current-action-ui/index.ts | 55 +++++++++++++++++++------- packages/current-action-ui/metadata.js | 3 +- 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/packages/current-action-ui/index.ts b/packages/current-action-ui/index.ts index 8b05cad..51bb616 100644 --- a/packages/current-action-ui/index.ts +++ b/packages/current-action-ui/index.ts @@ -1,4 +1,4 @@ -const customConfig = { +const defaultConfig = { x: 10, y: 80, height: 20, @@ -12,11 +12,17 @@ const customConfig = { }, }; +if (GM_getValue("config", null) === null) { + GM_setValue("config", config); +} +const config = GM_getValue("config", defaultConfig); + const handleChangeColor = ( color: string, - field: keyof (typeof customConfig)["colors"], + field: keyof (typeof config)["colors"], ) => { - customConfig.colors[field] = color; + config.colors[field] = color; + GM_setValue(`config`, config); }; const menuModal = ` @@ -42,17 +48,17 @@ const menuModal = `
    - +
    - +
    - +
    @@ -63,12 +69,12 @@ const menuModal = `
    - +
    - +
    @@ -132,7 +138,7 @@ idleStrokeInput?.addEventListener("input", (e) => { function paintCustomProgressBar() { //progress bar - const { x, y, height, width, colors } = customConfig; + const { x, y, height, width, colors } = config; if (progress_bar_active) { const perc = progress_bar_at / progress_bar_target; ctx.fillStyle = colors.activeBackgroundColor; @@ -158,21 +164,29 @@ const paint_progress_bar_proxy = new Proxy(paint_progress_bar, { }); window.addEventListener("keydown", moveBar); +window.addEventListener("keyup", setCoordinates); unsafeWindow.paint_progress_bar = paint_progress_bar_proxy; +GM_registerMenuCommand( + "Reset to default settings", + () => GM_setValue("config", config), + {}, +); +GM_registerMenuCommand; + function moveBar(this: Window, ev: KeyboardEvent) { if (ev.altKey && ev.ctrlKey && ev.key === "z") { - customConfig.x = mouse_over_now.x; - customConfig.y = mouse_over_now.y; + config.x = mouse_over_now.x; + config.y = mouse_over_now.y; } if (ev.altKey && ev.ctrlKey && ev.key === "j") { - customConfig.width = customConfig.width * 0.9; - customConfig.height = customConfig.height * 0.9; + config.width = config.width * 0.9; + config.height = config.height * 0.9; } if (ev.altKey && ev.ctrlKey && ev.key === "k") { - customConfig.width = customConfig.width * 1.1; - customConfig.height = customConfig.height * 1.1; + config.width = config.width * 1.1; + config.height = config.height * 1.1; } if (ev.altKey && ev.ctrlKey && ev.key === "m") { const modal = document.getElementById("color-picker-modal"); @@ -181,3 +195,14 @@ function moveBar(this: Window, ev: KeyboardEvent) { } } } +function setCoordinates(this: Window, ev: KeyboardEvent) { + if (ev.altKey && ev.ctrlKey && ev.key === "z") { + GM_setValue("config", config); + } + if (ev.altKey && ev.ctrlKey && ev.key === "j") { + GM_setValue("config", config); + } + if (ev.altKey && ev.ctrlKey && ev.key === "k") { + GM_setValue("config", config); + } +} diff --git a/packages/current-action-ui/metadata.js b/packages/current-action-ui/metadata.js index cf8e6d4..601d07b 100644 --- a/packages/current-action-ui/metadata.js +++ b/packages/current-action-ui/metadata.js @@ -4,7 +4,8 @@ // @match https://flatmmo.com/play.php* // @grant GM_getValue // @grant GM_setValue -// @version 0.001 +// @grant GM_registerCommand +// @version 0.001250 // @author Joshu // @description ui tweaks to make it easier to tell at what action your character is doing // @inject-into page From 952b5e9127d810652dda9cc7339ac2a2758f18e0 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 26 Dec 2025 22:16:23 -0500 Subject: [PATCH 30/87] fixed menu, checking in build till deal w/ deployment --- out/current-action-ui.user.js | 183 +++++++++++++++++++++++++ packages/current-action-ui/index.ts | 9 +- packages/current-action-ui/metadata.js | 2 +- 3 files changed, 192 insertions(+), 2 deletions(-) create mode 100644 out/current-action-ui.user.js diff --git a/out/current-action-ui.user.js b/out/current-action-ui.user.js new file mode 100644 index 0000000..627775a --- /dev/null +++ b/out/current-action-ui.user.js @@ -0,0 +1,183 @@ +// ==UserScript== +// @name Custom Action UI +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @grant GM_registerMenuCommand +// @version 0.001250 +// @author Joshu +// @description ui tweaks to make it easier to tell at what action your character is doing +// @inject-into page +// ==/UserScript== + +// ../../nix/store/hmb7fbcyni0l66c42ds5hybm6nd585p6-current-action-ui/index.ts +var defaultConfig = { + x: 10, + y: 80, + height: 20, + width: TILE_SIZE * 2, + colors: { + activeBackgroundColor: "black", + activeForegroundColor: "purple", + activeStrokeColor: "green", + idleBackgroundColor: "black", + idleStrokeColor: "red" + } +}; +if (GM_getValue("config", null) === null) { + GM_setValue("config", config); +} +var config = GM_getValue("config", defaultConfig); +var handleChangeColor = (color, field) => { + config.colors[field] = color; + GM_setValue(`config`, config); +}; +var menuModal = ` +
    +

    Progress Bar Colors

    + +
    +

    Active State

    + +
    +
    + + +
    + +
    + + +
    + +
    + + +
    +
    +
    + +
    +

    Idle State

    + +
    +
    + + +
    + +
    + + +
    +
    +
    + +
    + Press Ctrl+Alt+M to toggle +
    +
    +`; +var modalContainer = document.createElement("div"); +modalContainer.innerHTML = menuModal; +document.body.appendChild(modalContainer); +var activeBackgroundInput = document.getElementById("activeBackground"); +var activeForegroundInput = document.getElementById("activeForeground"); +var activeStrokeInput = document.getElementById("activeStroke"); +var idleBackgroundInput = document.getElementById("idleBackground"); +var idleStrokeInput = document.getElementById("idleStroke"); +activeBackgroundInput?.addEventListener("input", (e) => { + handleChangeColor(e.target.value, "activeBackgroundColor"); +}); +activeForegroundInput?.addEventListener("input", (e) => { + handleChangeColor(e.target.value, "activeForegroundColor"); +}); +activeStrokeInput?.addEventListener("input", (e) => { + handleChangeColor(e.target.value, "activeStrokeColor"); +}); +idleBackgroundInput?.addEventListener("input", (e) => { + handleChangeColor(e.target.value, "idleBackgroundColor"); +}); +idleStrokeInput?.addEventListener("input", (e) => { + handleChangeColor(e.target.value, "idleStrokeColor"); +}); +function paintCustomProgressBar() { + const { x, y, height, width, colors } = config; + if (progress_bar_active) { + const perc = progress_bar_at / progress_bar_target; + ctx.fillStyle = colors.activeBackgroundColor; + ctx.fillRect(x, y - TILE_SIZE / 8, width, height); + ctx.fillStyle = colors.activeForegroundColor; + ctx.fillRect(x, y - TILE_SIZE / 8, width * perc, height); + ctx.strokeStyle = colors.activeStrokeColor; + ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); + } else { + ctx.fillStyle = colors.idleBackgroundColor; + ctx.fillRect(x, y - TILE_SIZE / 8, width, height); + ctx.strokeStyle = colors.idleStrokeColor; + ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); + } +} +var paint_progress_bar_proxy = new Proxy(paint_progress_bar, { + apply(target, thisArg, argArray) { + paintCustomProgressBar(); + target(); + } +}); +window.addEventListener("keydown", moveBar); +window.addEventListener("keyup", setCoordinates); +unsafeWindow.paint_progress_bar = paint_progress_bar_proxy; +GM_registerMenuCommand("Reset to default settings", () => { + GM_setValue("config", defaultConfig); + config.colors = defaultConfig.colors; + config.height = defaultConfig.height; + config.width = defaultConfig.width; + config.x = defaultConfig.x; + config.y = defaultConfig.y; +}, {}); +GM_registerMenuCommand; +function moveBar(ev) { + if (ev.altKey && ev.ctrlKey && ev.key === "z") { + config.x = mouse_over_now.x; + config.y = mouse_over_now.y; + } + if (ev.altKey && ev.ctrlKey && ev.key === "j") { + config.width = config.width * 0.9; + config.height = config.height * 0.9; + } + if (ev.altKey && ev.ctrlKey && ev.key === "k") { + config.width = config.width * 1.1; + config.height = config.height * 1.1; + } + if (ev.altKey && ev.ctrlKey && ev.key === "m") { + const modal = document.getElementById("color-picker-modal"); + if (modal) { + modal.style.display = modal.style.display === "none" ? "block" : "none"; + } + } +} +function setCoordinates(ev) { + if (ev.altKey && ev.ctrlKey && ev.key === "z") { + GM_setValue("config", config); + } + if (ev.altKey && ev.ctrlKey && ev.key === "j") { + GM_setValue("config", config); + } + if (ev.altKey && ev.ctrlKey && ev.key === "k") { + GM_setValue("config", config); + } +} diff --git a/packages/current-action-ui/index.ts b/packages/current-action-ui/index.ts index 51bb616..347ba93 100644 --- a/packages/current-action-ui/index.ts +++ b/packages/current-action-ui/index.ts @@ -170,7 +170,14 @@ unsafeWindow.paint_progress_bar = paint_progress_bar_proxy; GM_registerMenuCommand( "Reset to default settings", - () => GM_setValue("config", config), + () => { + GM_setValue("config", defaultConfig); + config.colors = defaultConfig.colors; + config.height = defaultConfig.height; + config.width = defaultConfig.width; + config.x = defaultConfig.x; + config.y = defaultConfig.y; + }, {}, ); GM_registerMenuCommand; diff --git a/packages/current-action-ui/metadata.js b/packages/current-action-ui/metadata.js index 601d07b..17578de 100644 --- a/packages/current-action-ui/metadata.js +++ b/packages/current-action-ui/metadata.js @@ -4,7 +4,7 @@ // @match https://flatmmo.com/play.php* // @grant GM_getValue // @grant GM_setValue -// @grant GM_registerCommand +// @grant GM_registerMenuCommand // @version 0.001250 // @author Joshu // @description ui tweaks to make it easier to tell at what action your character is doing From 4cf4411584a52571c19bec211c6db138c18ae305 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sat, 27 Dec 2025 02:37:14 -0500 Subject: [PATCH 31/87] added settings w/o ui for animation settings --- packages/current-action-ui/index.ts | 53 ++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 5 deletions(-) diff --git a/packages/current-action-ui/index.ts b/packages/current-action-ui/index.ts index 347ba93..dd0cfab 100644 --- a/packages/current-action-ui/index.ts +++ b/packages/current-action-ui/index.ts @@ -1,4 +1,18 @@ -const defaultConfig = { +interface Config { + x: number; + y: number; + height: number; + width: number; + colors: { + activeBackgroundColor: string; + activeForegroundColor: string; + activeStrokeColor: string; + idleBackgroundColor: string; + idleStrokeColor: string; + }; + animation: "smooth" | "default" | "off"; +} +const defaultConfig: Config = { x: 10, y: 80, height: 20, @@ -10,10 +24,11 @@ const defaultConfig = { idleBackgroundColor: "black", idleStrokeColor: "red", }, + animation: "smooth", }; if (GM_getValue("config", null) === null) { - GM_setValue("config", config); + GM_setValue("config", defaultConfig); } const config = GM_getValue("config", defaultConfig); @@ -136,18 +151,45 @@ idleStrokeInput?.addEventListener("input", (e) => { handleChangeColor((e.target as HTMLInputElement).value, "idleStrokeColor"); }); +let count = 0; +let prevProgress = 0; +const countTickFraction = (() => { + const tickFrames = 28; + return () => { + const totalFrames = (progress_bar_target + 1) * tickFrames; + if (progress_bar_at <= 0 && prevProgress !== 0) { + count = 0; + } else { + count = count + 1; + } + prevProgress = progress_bar_at; + return Math.min(count / totalFrames, 1); + }; +})(); + +const getPercent = (animationType: Config["animation"]) => { + if (animationType === "smooth") { + return countTickFraction(); + } else if (animationType === "default") { + return progress_bar_at / progress_bar_target; + } else if (animationType === "off") { + return 100; + } +}; + function paintCustomProgressBar() { //progress bar const { x, y, height, width, colors } = config; if (progress_bar_active) { - const perc = progress_bar_at / progress_bar_target; + const percent = getPercent(config.animation); ctx.fillStyle = colors.activeBackgroundColor; ctx.fillRect(x, y - TILE_SIZE / 8, width, height); ctx.fillStyle = colors.activeForegroundColor; - ctx.fillRect(x, y - TILE_SIZE / 8, width * perc, height); + ctx.fillRect(x, y - TILE_SIZE / 8, width * percent, height); ctx.strokeStyle = colors.activeStrokeColor; ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); } else { + prevProgress = 0; ctx.fillStyle = colors.idleBackgroundColor; ctx.fillRect(x, y - TILE_SIZE / 8, width, height); ctx.strokeStyle = colors.idleStrokeColor; @@ -177,10 +219,11 @@ GM_registerMenuCommand( config.width = defaultConfig.width; config.x = defaultConfig.x; config.y = defaultConfig.y; + config.animation = defaultConfig.animation; }, + {}, ); -GM_registerMenuCommand; function moveBar(this: Window, ev: KeyboardEvent) { if (ev.altKey && ev.ctrlKey && ev.key === "z") { From 2b77823270e391c55c205d3662cef1c2931c132e Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sat, 27 Dec 2025 02:50:29 -0500 Subject: [PATCH 32/87] added option to modal to control modal --- packages/current-action-ui/index.ts | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/packages/current-action-ui/index.ts b/packages/current-action-ui/index.ts index dd0cfab..fe44cdb 100644 --- a/packages/current-action-ui/index.ts +++ b/packages/current-action-ui/index.ts @@ -94,6 +94,15 @@ const menuModal = ` +
    +

    Animation Style

    + +
    +
    Press Ctrl+Alt+M to toggle
    @@ -151,6 +160,16 @@ idleStrokeInput?.addEventListener("input", (e) => { handleChangeColor((e.target as HTMLInputElement).value, "idleStrokeColor"); }); +const animationStyleSelect = document.getElementById( + "animationStyle", +) as HTMLSelectElement; + +animationStyleSelect?.addEventListener("change", (e) => { + const value = (e.target as HTMLSelectElement).value as Config["animation"]; + config.animation = value; + GM_setValue("config", config); +}); + let count = 0; let prevProgress = 0; const countTickFraction = (() => { @@ -173,7 +192,7 @@ const getPercent = (animationType: Config["animation"]) => { } else if (animationType === "default") { return progress_bar_at / progress_bar_target; } else if (animationType === "off") { - return 100; + return 1; } }; From 689e005837a8a71b8d8881cd07cc63624c2b4ac9 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 01:29:50 -0500 Subject: [PATCH 33/87] mostly working build scripts and static site index generation --- build-userscript-cli.ts | 18 ++++++++ build-userscript.ts | 16 +++++++ build.ts | 40 +++++++++-------- flake.nix | 16 +++++-- mkStaticSite.nix | 44 +++++++++++++++++++ mkUserscript.nix | 14 +++--- .../static-userscript-index/build-site-cli.ts | 19 ++++++++ .../static-userscript-index/build-site.ts | 36 +++++++++++++++ packages/static-userscript-index/index.html | 13 ++++++ .../static-userscript-index/write-html.ts | 23 ++++++++++ 10 files changed, 209 insertions(+), 30 deletions(-) create mode 100644 build-userscript-cli.ts create mode 100644 build-userscript.ts create mode 100644 mkStaticSite.nix create mode 100644 packages/static-userscript-index/build-site-cli.ts create mode 100644 packages/static-userscript-index/build-site.ts create mode 100644 packages/static-userscript-index/index.html create mode 100644 packages/static-userscript-index/write-html.ts diff --git a/build-userscript-cli.ts b/build-userscript-cli.ts new file mode 100644 index 0000000..a866b2a --- /dev/null +++ b/build-userscript-cli.ts @@ -0,0 +1,18 @@ +import { parseArgs } from "util"; +import { buildScript } from "./build-userscript"; + +const { values } = parseArgs({ + args: Bun.argv, + strict: true, + options: { + scriptName: { type: "string" }, + }, + allowPositionals: true, +}); +if (!values.scriptName) { + throw "must have data"; +} + +const name = values.scriptName; + +buildScript(name); diff --git a/build-userscript.ts b/build-userscript.ts new file mode 100644 index 0000000..e4f41f2 --- /dev/null +++ b/build-userscript.ts @@ -0,0 +1,16 @@ +export const buildScript = async (packageName: string) => { + const packagePath = `./packages/${packageName}`; + const { default: packageJson } = await import(`${packagePath}/package.json`, { + with: { type: "jsonc" }, + }); + const { default: metadata } = await import(`${packagePath}/metadata.js`, { + with: { type: "text" }, + }); + return Bun.build({ + entrypoints: [`${packagePath}/${packageJson.module}`], + banner: metadata, + outdir: `./dist/userscripts`, + naming: `${packageName}.user.[ext]`, + root: ".", + }); +}; diff --git a/build.ts b/build.ts index c10d7f5..940f5b8 100644 --- a/build.ts +++ b/build.ts @@ -1,20 +1,22 @@ -const packageName = "better-custom-hotkeys"; +import { buildScript } from "./build-userscript"; +import { buildStaticSite } from "./packages/static-userscript-index/build-site"; -await Bun.build({ - entrypoints: ["./packages/better-custom-hotkeys/index.ts"], - banner: ` -// ==UserScript== -// @name Better hotkeys -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue -// @version 0.001 -// @author Joshu -// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. -// @inject-into page -// ==/UserScript== - `, - outdir: "./dist", - naming: `${packageName}.user.js`, -}); +const packageNames = ["better-custom-hotkeys", "current-action-ui"]; + +const userscriptInfo = packageNames.map((packageName) => ({ + path: `./dist/userscripts/${packageName}.user.js`, + filename: `${packageName}.user.js`, + packageName, +})); + +import { rm } from "node:fs/promises"; + +// Delete a directory and all its contents +await rm("./dist", { recursive: true, force: true }); + +await Promise.all(packageNames.map(buildScript)); + +const time = new Date(); +const result = await buildStaticSite(userscriptInfo); +console.log(time); +console.log(result.success); diff --git a/flake.nix b/flake.nix index 4976b11..1e1c11a 100644 --- a/flake.nix +++ b/flake.nix @@ -60,14 +60,22 @@ programs.biome.enable = true; }; - packages = { + packages = rec { # Produce a package for this template with bun2nix in # the overlay - default = pkgs.callPackage ./mkUserscript.nix { - packagePath = ./packages/better-custom-hotkeys; + better-custom-hotkeys = pkgs.callPackage ./mkUserscript.nix { + packageName = "better-custom-hotkeys"; + packagePath = "packages/better-custom-hotkeys/"; }; current-action-ui = pkgs.callPackage ./mkUserscript.nix { - packagePath = ./packages/current-action-ui; + packageName = "current-action-ui"; + packagePath = "packages/current-action-ui"; + }; + default = pkgs.callPackage ./mkStaticSite.nix { + userscripts = [ + current-action-ui + better-custom-hotkeys + ]; }; }; diff --git a/mkStaticSite.nix b/mkStaticSite.nix new file mode 100644 index 0000000..e13048f --- /dev/null +++ b/mkStaticSite.nix @@ -0,0 +1,44 @@ +{ + bun2nix, + stdenv, + userscripts, + lib, + ... +}: +let + pname = "username-index-site"; + version = "0.0.1"; + userscript-metadata = ( + map (x: rec { + filename = "${x.pname}.user.js"; + path = "${x}/share/userscripts/${filename}"; + packageName = x.pname; + }) userscripts + ); +in +stdenv.mkDerivation { + inherit pname version; + + src = ./.; + + nativeBuildInputs = [ + bun2nix.hook + ] + ++ userscripts; + + buildInputs = userscripts; + + bunDeps = bun2nix.fetchBunDeps { + bunNix = ./bun.nix; + }; + + buildPhase = '' + bun packages/static-userscript-index/build-site-cli.ts --data='${builtins.toJSON userscript-metadata}' + ''; + + installPhase = '' + mkdir -p $out/static + + cp -R ./dist/static $out + ''; +} diff --git a/mkUserscript.nix b/mkUserscript.nix index c727171..417dc73 100644 --- a/mkUserscript.nix +++ b/mkUserscript.nix @@ -1,16 +1,16 @@ { bun2nix, stdenv, + packageName, packagePath, ... }: let pkgJsonContents = builtins.readFile "${packagePath}/package.json"; package = builtins.fromJSON pkgJsonContents; - pname = package.name; - inherit (package) version; - module = "${packagePath}/${package.module}"; - metadata = builtins.readFile "${packagePath}/metadata.js"; + pname = packageName; + version = "1.0.0"; + # inherit (package) version; in stdenv.mkDerivation { inherit pname version; @@ -26,12 +26,12 @@ stdenv.mkDerivation { }; buildPhase = '' - bun build ${module} --outfile dist/${pname}.user.js --banner "${metadata}" + bun build-userscript-cli.ts --scriptName=${packageName} ''; installPhase = '' - mkdir -p $out/dist + mkdir -p $out/share/userscripts - cp -R ./dist $out + cp ./dist/userscripts/**.js $out/share/userscripts/ ''; } diff --git a/packages/static-userscript-index/build-site-cli.ts b/packages/static-userscript-index/build-site-cli.ts new file mode 100644 index 0000000..ddb40c4 --- /dev/null +++ b/packages/static-userscript-index/build-site-cli.ts @@ -0,0 +1,19 @@ +import { parseArgs } from "util"; +import { buildStaticSite } from "./build-site"; + +const { values } = parseArgs({ + args: Bun.argv, + strict: true, + options: { + data: { type: "string" }, + }, + allowPositionals: true, +}); +if (!values.data) { + throw "must have data"; +} + +const data = JSON.parse(values.data); +console.log(data); + +buildStaticSite(data); diff --git a/packages/static-userscript-index/build-site.ts b/packages/static-userscript-index/build-site.ts new file mode 100644 index 0000000..7ba4cac --- /dev/null +++ b/packages/static-userscript-index/build-site.ts @@ -0,0 +1,36 @@ +import { addScriptLinksRewriter } from "./write-html"; + +export const buildStaticSite = ( + userscriptInfo: { filename: string; packageName: string; path: string }[], +) => + Bun.build({ + entrypoints: [ + "./packages/static-userscript-index/index.html", + ...userscriptInfo.map((us) => us.path), + ], + outdir: "./dist/static", + loader: { ".js": "file" }, + naming: { + chunk: `[name].[ext]`, + asset: `[name].[ext]`, + entry: `[name].[ext]`, + }, + root: ".", + splitting: false, + plugins: [ + { + // A plugin that makes every HTML tag lowercase + name: "add-user-scripts", + setup({ onLoad }) { + onLoad({ filter: /\.html$/ }, async (args) => { + const html = await Bun.file(args.path).text(); + + return { + contents: addScriptLinksRewriter(html, userscriptInfo), + loader: "html", + }; + }); + }, + }, + ], + }); diff --git a/packages/static-userscript-index/index.html b/packages/static-userscript-index/index.html new file mode 100644 index 0000000..2e8c986 --- /dev/null +++ b/packages/static-userscript-index/index.html @@ -0,0 +1,13 @@ + + + + + +

    Userscripts

    + + + diff --git a/packages/static-userscript-index/write-html.ts b/packages/static-userscript-index/write-html.ts new file mode 100644 index 0000000..c4c1b17 --- /dev/null +++ b/packages/static-userscript-index/write-html.ts @@ -0,0 +1,23 @@ +export const addScriptLinksRewriter = ( + html: string, + userscriptPaths: { filename: string; packageName: string }[], +) => { + const rewriter = new HTMLRewriter().on("#script-list", { + element(ul) { + userscriptPaths.forEach((us) => { + ul.append( + ` +
  • + ${us.packageName} +
  • `, + { + html: true, + }, + ); + }); + }, + }); + + const result = rewriter.transform(html); + return result; +}; From 88c4dfde2c46b5740e56b92e52a28d0f01f4f0f5 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 01:48:42 -0500 Subject: [PATCH 34/87] test build --- .github/workflows/ci.yaml | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index de56685..000a3a6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,18 +1,19 @@ -name: "CI" +name: CI + on: + push: pull_request: + jobs: - tests: - runs-on: ubuntu-latest + check: + runs-on: ubuntu-22.04 + permissions: + id-token: "write" + contents: "read" steps: - - uses: actions/checkout@v5 - - uses: cachix/install-nix-action@v31 - with: - github_access_token: ${{ secrets.GITHUB_TOKEN }} - - run: nix build - - name: Upload userscripts artifact - if: github.event_name != 'release' - uses: actions/upload-artifact@v4 - with: - name: userscripts - path: result/dist/@workspace/better-custom-hotkeys.user.js + - uses: actions/checkout@v4 + - uses: DeterminateSystems/nix-installer-action@main + - uses: DeterminateSystems/magic-nix-cache-action@main + - uses: DeterminateSystems/flake-checker-action@main + - name: Run `nix build` + run: nix build . From 71ef32ded91ff77c1420dfeb6af743fe41ea2b33 Mon Sep 17 00:00:00 2001 From: Josh Romer Date: Sun, 28 Dec 2025 19:20:47 -0500 Subject: [PATCH 35/87] Integrate Cloudflare Workers deployment in CI Added deployment step for Cloudflare Workers using Wrangler. --- .github/workflows/ci.yaml | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 000a3a6..2ac5078 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,4 +16,33 @@ jobs: - uses: DeterminateSystems/magic-nix-cache-action@main - uses: DeterminateSystems/flake-checker-action@main - name: Run `nix build` - run: nix build . + run: nix build . + - name: Deploy to Cloudflare Workers with Wrangler + # You may pin to the exact commit or the version. + # uses: cloudflare/wrangler-action@c25aadc9657b0cdc4786c04e59a6fe92765a783b + uses: cloudflare/wrangler-action@v3.1.0 + with: + #Your Cloudflare API Token + apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} + # Your Cloudflare Account ID + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy ./result/static --project-name=flatmmo-userscripts + # Supresses output from Wrangler commands, defaults to `false` + # quiet: # optional, default is false + # The environment you'd like to deploy your Workers project to - must be defined in wrangler.toml + # environment: # optional + # The relative path which Wrangler commands should be run from + # workingDirectory: # optional + # The version of Wrangler you'd like to use to deploy your Workers project + # wranglerVersion: # optional + # A string of environment variable names, separated by newlines. These will be bound to your Worker as Secrets and must match the names of environment variables declared in `env` of this workflow. + # secrets: # optional + # Commands to execute before deploying the Workers project + # preCommands: # optional + # Commands to execute after deploying the Workers project + # postCommands: # optional + # The Wrangler command (along with any arguments) you wish to run. Multiple Wrangler commands can be run by separating each command with a newline. Defaults to `"deploy"`. + # command: # optional + # A string of environment variable names, separated by newlines. These will be bound to your Worker using the values of matching environment variables declared in `env` of this workflow. + # vars: # optional + From 830d451c838a74c4a712bd64f233a2906079cd4d Mon Sep 17 00:00:00 2001 From: Josh Romer Date: Sun, 28 Dec 2025 19:27:55 -0500 Subject: [PATCH 36/87] Remove './' from deploy command path --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2ac5078..8fb2420 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -26,7 +26,7 @@ jobs: apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} # Your Cloudflare Account ID accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: pages deploy ./result/static --project-name=flatmmo-userscripts + command: pages deploy result/static --project-name=flatmmo-userscripts # Supresses output from Wrangler commands, defaults to `false` # quiet: # optional, default is false # The environment you'd like to deploy your Workers project to - must be defined in wrangler.toml From 4aff915775fd5e6a6b445695bf51386a77343e25 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 04:20:04 -0500 Subject: [PATCH 37/87] moved build scripts --- mkUserscript.nix | 7 +++---- .../build/build-userscript-cli.ts | 0 build-userscript.ts => packages/build/build-userscript.ts | 4 ++-- build.ts => packages/build/build.ts | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) rename build-userscript-cli.ts => packages/build/build-userscript-cli.ts (100%) rename build-userscript.ts => packages/build/build-userscript.ts (78%) rename build.ts => packages/build/build.ts (88%) diff --git a/mkUserscript.nix b/mkUserscript.nix index 417dc73..f036e5e 100644 --- a/mkUserscript.nix +++ b/mkUserscript.nix @@ -2,12 +2,11 @@ bun2nix, stdenv, packageName, - packagePath, ... }: let - pkgJsonContents = builtins.readFile "${packagePath}/package.json"; - package = builtins.fromJSON pkgJsonContents; + # pkgJsonContents = builtins.readFile "${packagePath}/package.json"; + # package = builtins.fromJSON pkgJsonContents; pname = packageName; version = "1.0.0"; # inherit (package) version; @@ -26,7 +25,7 @@ stdenv.mkDerivation { }; buildPhase = '' - bun build-userscript-cli.ts --scriptName=${packageName} + bun ./packages/build/build-userscript-cli.ts --scriptName=${packageName} ''; installPhase = '' diff --git a/build-userscript-cli.ts b/packages/build/build-userscript-cli.ts similarity index 100% rename from build-userscript-cli.ts rename to packages/build/build-userscript-cli.ts diff --git a/build-userscript.ts b/packages/build/build-userscript.ts similarity index 78% rename from build-userscript.ts rename to packages/build/build-userscript.ts index e4f41f2..3a6f538 100644 --- a/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -1,5 +1,5 @@ export const buildScript = async (packageName: string) => { - const packagePath = `./packages/${packageName}`; + const packagePath = `../${packageName}`; const { default: packageJson } = await import(`${packagePath}/package.json`, { with: { type: "jsonc" }, }); @@ -7,7 +7,7 @@ export const buildScript = async (packageName: string) => { with: { type: "text" }, }); return Bun.build({ - entrypoints: [`${packagePath}/${packageJson.module}`], + entrypoints: [`./packages/${packageName}/${packageJson.module}`], banner: metadata, outdir: `./dist/userscripts`, naming: `${packageName}.user.[ext]`, diff --git a/build.ts b/packages/build/build.ts similarity index 88% rename from build.ts rename to packages/build/build.ts index 940f5b8..c6c76cd 100644 --- a/build.ts +++ b/packages/build/build.ts @@ -1,5 +1,5 @@ +import { buildStaticSite } from "../static-userscript-index/build-site"; import { buildScript } from "./build-userscript"; -import { buildStaticSite } from "./packages/static-userscript-index/build-site"; const packageNames = ["better-custom-hotkeys", "current-action-ui"]; From f1e59445f4edcdac3b70ad2c4ac0349fcbe8c55d Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 18:40:41 -0500 Subject: [PATCH 38/87] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'nixpkgs': 'github:nixos/nixpkgs/1306659b587dc277866c7b69eb97e5f07864d8c4' (2025-12-15) → 'github:nixos/nixpkgs/3e2499d5539c16d0d173ba53552a4ff8547f4539' (2025-12-25) • Updated input 'treefmt-nix': 'github:numtide/treefmt-nix/5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4' (2025-11-12) → 'github:numtide/treefmt-nix/42d96e75aa56a3f70cab7e7dc4a32868db28e8fd' (2025-12-17) --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 6475906..30da3ed 100644 --- a/flake.lock +++ b/flake.lock @@ -80,11 +80,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1765779637, - "narHash": "sha256-KJ2wa/BLSrTqDjbfyNx70ov/HdgNBCBBSQP3BIzKnv4=", + "lastModified": 1766651565, + "narHash": "sha256-QEhk0eXgyIqTpJ/ehZKg9IKS7EtlWxF3N7DXy42zPfU=", "owner": "nixos", "repo": "nixpkgs", - "rev": "1306659b587dc277866c7b69eb97e5f07864d8c4", + "rev": "3e2499d5539c16d0d173ba53552a4ff8547f4539", "type": "github" }, "original": { @@ -190,11 +190,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1762938485, - "narHash": "sha256-AlEObg0syDl+Spi4LsZIBrjw+snSVU4T8MOeuZJUJjM=", + "lastModified": 1766000401, + "narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "5b4ee75aeefd1e2d5a1cc43cf6ba65eba75e83e4", + "rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd", "type": "github" }, "original": { From c144cb8f93bde24ab92c9d90ec3acf6d2ac74a1c Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 19:44:59 -0500 Subject: [PATCH 39/87] Test action again --- .github/workflows/ci.yaml | 4 ++-- wrangler.toml | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 wrangler.toml diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 8fb2420..e8f6ae1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -5,7 +5,7 @@ on: pull_request: jobs: - check: + build: runs-on: ubuntu-22.04 permissions: id-token: "write" @@ -26,7 +26,7 @@ jobs: apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} # Your Cloudflare Account ID accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - command: pages deploy result/static --project-name=flatmmo-userscripts + command: pages deploy # Supresses output from Wrangler commands, defaults to `false` # quiet: # optional, default is false # The environment you'd like to deploy your Workers project to - must be defined in wrangler.toml diff --git a/wrangler.toml b/wrangler.toml new file mode 100644 index 0000000..4a19bb2 --- /dev/null +++ b/wrangler.toml @@ -0,0 +1,6 @@ +# Generated by Wrangler on Sun Dec 28 2025 19:40:36 GMT-0500 (Eastern Standard Time) +name = "flatmmo-userscripts" +compatibility_date = "2025-12-17" +pages_build_output_dir = "result/static" + +[env.production] From cc165fd3c071a36928706020a133e519b5457d59 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 19:48:41 -0500 Subject: [PATCH 40/87] Test action again --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index e8f6ae1..6c491e1 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -34,7 +34,7 @@ jobs: # The relative path which Wrangler commands should be run from # workingDirectory: # optional # The version of Wrangler you'd like to use to deploy your Workers project - # wranglerVersion: # optional + wranglerVersion: 4.54.0 # optional # A string of environment variable names, separated by newlines. These will be bound to your Worker as Secrets and must match the names of environment variables declared in `env` of this workflow. # secrets: # optional # Commands to execute before deploying the Workers project From 8434efd98f2384ee473cc4201eb21050babb004f Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 19:52:59 -0500 Subject: [PATCH 41/87] fixed to use bun --- .github/workflows/ci.yaml | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 6c491e1..0cb4cdf 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -27,22 +27,7 @@ jobs: # Your Cloudflare Account ID accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: pages deploy - # Supresses output from Wrangler commands, defaults to `false` - # quiet: # optional, default is false - # The environment you'd like to deploy your Workers project to - must be defined in wrangler.toml - # environment: # optional - # The relative path which Wrangler commands should be run from - # workingDirectory: # optional + packageManager: bun # The version of Wrangler you'd like to use to deploy your Workers project wranglerVersion: 4.54.0 # optional - # A string of environment variable names, separated by newlines. These will be bound to your Worker as Secrets and must match the names of environment variables declared in `env` of this workflow. - # secrets: # optional - # Commands to execute before deploying the Workers project - # preCommands: # optional - # Commands to execute after deploying the Workers project - # postCommands: # optional - # The Wrangler command (along with any arguments) you wish to run. Multiple Wrangler commands can be run by separating each command with a newline. Defaults to `"deploy"`. - # command: # optional - # A string of environment variable names, separated by newlines. These will be bound to your Worker using the values of matching environment variables declared in `env` of this workflow. - # vars: # optional From af80fbf33fc5f1a61fef1f902890d88e1ce67105 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 20:03:42 -0500 Subject: [PATCH 42/87] updated action version --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0cb4cdf..c99f15a 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -20,7 +20,7 @@ jobs: - name: Deploy to Cloudflare Workers with Wrangler # You may pin to the exact commit or the version. # uses: cloudflare/wrangler-action@c25aadc9657b0cdc4786c04e59a6fe92765a783b - uses: cloudflare/wrangler-action@v3.1.0 + uses: cloudflare/wrangler-action@v3.14.1 with: #Your Cloudflare API Token apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} From 55d5f9327c033832bfae4dda3a8087610efa1a09 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 20:16:45 -0500 Subject: [PATCH 43/87] hopefully works --- .github/workflows/ci.yaml | 3 + bun.lock | 193 +++++++++++++++++++ bun.nix | 384 ++++++++++++++++++++++++++++++++++++++ package.json | 3 +- 4 files changed, 582 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c99f15a..22d0046 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,6 +17,8 @@ jobs: - uses: DeterminateSystems/flake-checker-action@main - name: Run `nix build` run: nix build . + - name: Run `nix develop` + run: nix develop - name: Deploy to Cloudflare Workers with Wrangler # You may pin to the exact commit or the version. # uses: cloudflare/wrangler-action@c25aadc9657b0cdc4786c04e59a6fe92765a783b @@ -26,6 +28,7 @@ jobs: apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} # Your Cloudflare Account ID accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + preCommand: nix develop command: pages deploy packageManager: bun # The version of Wrangler you'd like to use to deploy your Workers project diff --git a/bun.lock b/bun.lock index e71b382..34a01b1 100644 --- a/bun.lock +++ b/bun.lock @@ -10,6 +10,7 @@ "@workspace/flatmmo-types": "workspace:*", "bun2nix": "^2.0.0", "typescript": "^5.9.3", + "wrangler": "^4.54.0", }, }, "packages/better-custom-hotkeys": { @@ -34,6 +35,130 @@ }, }, "packages": { + "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.1", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg=="], + + "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.7.13", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251202.0" }, "optionalPeers": ["workerd"] }, "sha512-NulO1H8R/DzsJguLC0ndMuk4Ufv0KSlN+E54ay9rn9ZCQo0kpAPwwh3LhgpZ96a3Dr6L9LqW57M4CqC34iLOvw=="], + + "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20251210.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ=="], + + "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20251210.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw=="], + + "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20251210.0", "", { "os": "linux", "cpu": "x64" }, "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g=="], + + "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20251210.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA=="], + + "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20251210.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw=="], + + "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], + + "@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="], + + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.0", "", { "os": "android", "cpu": "arm" }, "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="], + + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.0", "", { "os": "android", "cpu": "arm64" }, "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ=="], + + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.0", "", { "os": "android", "cpu": "x64" }, "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q=="], + + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ=="], + + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw=="], + + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg=="], + + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg=="], + + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA=="], + + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ=="], + + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w=="], + + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw=="], + + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w=="], + + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.0", "", { "os": "none", "cpu": "x64" }, "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA=="], + + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ=="], + + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A=="], + + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA=="], + + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg=="], + + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], + + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], + + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], + + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], + + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], + + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], + + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], + + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], + + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], + + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], + + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], + + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], + + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], + + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], + + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], + + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], + + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], + + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], + + "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="], + + "@poppinss/dumper": ["@poppinss/dumper@0.6.5", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="], + + "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="], + + "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], + + "@speed-highlight/core": ["@speed-highlight/core@1.2.12", "", {}, "sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA=="], + "@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], "@types/node": ["@types/node@25.0.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="], @@ -46,18 +171,86 @@ "@workspace/flatmmo-types": ["@workspace/flatmmo-types@workspace:packages/flatmmo-types"], + "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], + + "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], + + "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], + "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], "bun2nix": ["bun2nix@2.0.0", "", { "dependencies": { "sade": "^1.8.1" }, "bin": { "bun2nix": "index.ts" } }, "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="], + "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], + + "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], + + "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], + + "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], + + "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], + + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + + "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], + + "esbuild": ["esbuild@0.27.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.0", "@esbuild/android-arm": "0.27.0", "@esbuild/android-arm64": "0.27.0", "@esbuild/android-x64": "0.27.0", "@esbuild/darwin-arm64": "0.27.0", "@esbuild/darwin-x64": "0.27.0", "@esbuild/freebsd-arm64": "0.27.0", "@esbuild/freebsd-x64": "0.27.0", "@esbuild/linux-arm": "0.27.0", "@esbuild/linux-arm64": "0.27.0", "@esbuild/linux-ia32": "0.27.0", "@esbuild/linux-loong64": "0.27.0", "@esbuild/linux-mips64el": "0.27.0", "@esbuild/linux-ppc64": "0.27.0", "@esbuild/linux-riscv64": "0.27.0", "@esbuild/linux-s390x": "0.27.0", "@esbuild/linux-x64": "0.27.0", "@esbuild/netbsd-arm64": "0.27.0", "@esbuild/netbsd-x64": "0.27.0", "@esbuild/openbsd-arm64": "0.27.0", "@esbuild/openbsd-x64": "0.27.0", "@esbuild/openharmony-arm64": "0.27.0", "@esbuild/sunos-x64": "0.27.0", "@esbuild/win32-arm64": "0.27.0", "@esbuild/win32-ia32": "0.27.0", "@esbuild/win32-x64": "0.27.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="], + + "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], + + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + + "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], + + "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], + + "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], + + "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], + + "miniflare": ["miniflare@4.20251210.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20251210.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw=="], + "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], + + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + + "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], + + "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], + + "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], + + "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], + "undici": ["undici@7.14.0", "", {}, "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ=="], + "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], + "user-agent-data-types": ["user-agent-data-types@0.4.2", "", {}, "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="], + + "workerd": ["workerd@1.20251210.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251210.0", "@cloudflare/workerd-darwin-arm64": "1.20251210.0", "@cloudflare/workerd-linux-64": "1.20251210.0", "@cloudflare/workerd-linux-arm64": "1.20251210.0", "@cloudflare/workerd-windows-64": "1.20251210.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw=="], + + "wrangler": ["wrangler@4.54.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.7.13", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20251210.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251210.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251210.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A=="], + + "ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], + + "youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="], + + "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], + + "zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], } } diff --git a/bun.nix b/bun.nix index d26870a..cfa996d 100644 --- a/bun.nix +++ b/bun.nix @@ -13,6 +13,254 @@ ... }: { + "@cloudflare/kv-asset-handler@0.4.1" = fetchurl { + url = "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.1.tgz"; + hash = "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg=="; + }; + "@cloudflare/unenv-preset@2.7.13" = fetchurl { + url = "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.13.tgz"; + hash = "sha512-NulO1H8R/DzsJguLC0ndMuk4Ufv0KSlN+E54ay9rn9ZCQo0kpAPwwh3LhgpZ96a3Dr6L9LqW57M4CqC34iLOvw=="; + }; + "@cloudflare/workerd-darwin-64@1.20251210.0" = fetchurl { + url = "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251210.0.tgz"; + hash = "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ=="; + }; + "@cloudflare/workerd-darwin-arm64@1.20251210.0" = fetchurl { + url = "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251210.0.tgz"; + hash = "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw=="; + }; + "@cloudflare/workerd-linux-64@1.20251210.0" = fetchurl { + url = "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251210.0.tgz"; + hash = "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g=="; + }; + "@cloudflare/workerd-linux-arm64@1.20251210.0" = fetchurl { + url = "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251210.0.tgz"; + hash = "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA=="; + }; + "@cloudflare/workerd-windows-64@1.20251210.0" = fetchurl { + url = "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251210.0.tgz"; + hash = "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw=="; + }; + "@cspotcode/source-map-support@0.8.1" = fetchurl { + url = "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz"; + hash = "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="; + }; + "@emnapi/runtime@1.7.1" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz"; + hash = "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="; + }; + "@esbuild/aix-ppc64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz"; + hash = "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="; + }; + "@esbuild/android-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz"; + hash = "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ=="; + }; + "@esbuild/android-arm@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz"; + hash = "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="; + }; + "@esbuild/android-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz"; + hash = "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q=="; + }; + "@esbuild/darwin-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz"; + hash = "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg=="; + }; + "@esbuild/darwin-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz"; + hash = "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g=="; + }; + "@esbuild/freebsd-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz"; + hash = "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw=="; + }; + "@esbuild/freebsd-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz"; + hash = "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g=="; + }; + "@esbuild/linux-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz"; + hash = "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ=="; + }; + "@esbuild/linux-arm@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz"; + hash = "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ=="; + }; + "@esbuild/linux-ia32@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz"; + hash = "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw=="; + }; + "@esbuild/linux-loong64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz"; + hash = "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg=="; + }; + "@esbuild/linux-mips64el@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz"; + hash = "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg=="; + }; + "@esbuild/linux-ppc64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz"; + hash = "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA=="; + }; + "@esbuild/linux-riscv64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz"; + hash = "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ=="; + }; + "@esbuild/linux-s390x@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz"; + hash = "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w=="; + }; + "@esbuild/linux-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz"; + hash = "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw=="; + }; + "@esbuild/netbsd-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz"; + hash = "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w=="; + }; + "@esbuild/netbsd-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz"; + hash = "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA=="; + }; + "@esbuild/openbsd-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz"; + hash = "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ=="; + }; + "@esbuild/openbsd-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz"; + hash = "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A=="; + }; + "@esbuild/openharmony-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz"; + hash = "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA=="; + }; + "@esbuild/sunos-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz"; + hash = "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA=="; + }; + "@esbuild/win32-arm64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz"; + hash = "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg=="; + }; + "@esbuild/win32-ia32@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz"; + hash = "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ=="; + }; + "@esbuild/win32-x64@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz"; + hash = "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg=="; + }; + "@img/sharp-darwin-arm64@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz"; + hash = "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="; + }; + "@img/sharp-darwin-x64@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz"; + hash = "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="; + }; + "@img/sharp-libvips-darwin-arm64@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz"; + hash = "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="; + }; + "@img/sharp-libvips-darwin-x64@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz"; + hash = "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="; + }; + "@img/sharp-libvips-linux-arm64@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz"; + hash = "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="; + }; + "@img/sharp-libvips-linux-arm@1.0.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz"; + hash = "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="; + }; + "@img/sharp-libvips-linux-s390x@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz"; + hash = "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="; + }; + "@img/sharp-libvips-linux-x64@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz"; + hash = "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="; + }; + "@img/sharp-libvips-linuxmusl-arm64@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz"; + hash = "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="; + }; + "@img/sharp-libvips-linuxmusl-x64@1.0.4" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz"; + hash = "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="; + }; + "@img/sharp-linux-arm64@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz"; + hash = "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="; + }; + "@img/sharp-linux-arm@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz"; + hash = "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="; + }; + "@img/sharp-linux-s390x@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz"; + hash = "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="; + }; + "@img/sharp-linux-x64@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz"; + hash = "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="; + }; + "@img/sharp-linuxmusl-arm64@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz"; + hash = "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="; + }; + "@img/sharp-linuxmusl-x64@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz"; + hash = "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="; + }; + "@img/sharp-wasm32@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz"; + hash = "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="; + }; + "@img/sharp-win32-ia32@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz"; + hash = "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="; + }; + "@img/sharp-win32-x64@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz"; + hash = "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="; + }; + "@jridgewell/resolve-uri@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"; + hash = "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="; + }; + "@jridgewell/sourcemap-codec@1.5.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"; + hash = "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="; + }; + "@jridgewell/trace-mapping@0.3.9" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"; + hash = "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="; + }; + "@poppinss/colors@4.1.6" = fetchurl { + url = "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz"; + hash = "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="; + }; + "@poppinss/dumper@0.6.5" = fetchurl { + url = "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz"; + hash = "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="; + }; + "@poppinss/exception@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz"; + hash = "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="; + }; + "@sindresorhus/is@7.2.0" = fetchurl { + url = "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz"; + hash = "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="; + }; + "@speed-highlight/core@1.2.12" = fetchurl { + url = "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.12.tgz"; + hash = "sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA=="; + }; "@types/bun@1.3.4" = fetchurl { url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; @@ -28,6 +276,18 @@ "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; + "acorn-walk@8.3.2" = fetchurl { + url = "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz"; + hash = "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="; + }; + "acorn@8.14.0" = fetchurl { + url = "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz"; + hash = "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="; + }; + "blake3-wasm@2.1.5" = fetchurl { + url = "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz"; + hash = "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="; + }; "bun-types@1.3.4" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; @@ -36,14 +296,106 @@ url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; }; + "color-convert@2.0.1" = fetchurl { + url = "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"; + hash = "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="; + }; + "color-name@1.1.4" = fetchurl { + url = "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"; + hash = "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="; + }; + "color-string@1.9.1" = fetchurl { + url = "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz"; + hash = "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="; + }; + "color@4.2.3" = fetchurl { + url = "https://registry.npmjs.org/color/-/color-4.2.3.tgz"; + hash = "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="; + }; + "cookie@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz"; + hash = "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="; + }; + "detect-libc@2.1.2" = fetchurl { + url = "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"; + hash = "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="; + }; + "error-stack-parser-es@1.0.5" = fetchurl { + url = "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz"; + hash = "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="; + }; + "esbuild@0.27.0" = fetchurl { + url = "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz"; + hash = "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="; + }; + "exit-hook@2.2.1" = fetchurl { + url = "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz"; + hash = "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="; + }; + "fsevents@2.3.3" = fetchurl { + url = "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"; + hash = "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="; + }; + "glob-to-regexp@0.4.1" = fetchurl { + url = "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"; + hash = "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="; + }; + "is-arrayish@0.3.4" = fetchurl { + url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz"; + hash = "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="; + }; + "kleur@4.1.5" = fetchurl { + url = "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz"; + hash = "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="; + }; + "mime@3.0.0" = fetchurl { + url = "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz"; + hash = "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="; + }; + "miniflare@4.20251210.0" = fetchurl { + url = "https://registry.npmjs.org/miniflare/-/miniflare-4.20251210.0.tgz"; + hash = "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw=="; + }; "mri@1.2.0" = fetchurl { url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; }; + "path-to-regexp@6.3.0" = fetchurl { + url = "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz"; + hash = "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="; + }; + "pathe@2.0.3" = fetchurl { + url = "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz"; + hash = "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="; + }; "sade@1.8.1" = fetchurl { url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; }; + "semver@7.7.3" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"; + hash = "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="; + }; + "sharp@0.33.5" = fetchurl { + url = "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz"; + hash = "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="; + }; + "simple-swizzle@0.2.4" = fetchurl { + url = "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz"; + hash = "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="; + }; + "stoppable@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz"; + hash = "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="; + }; + "supports-color@10.2.2" = fetchurl { + url = "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz"; + hash = "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="; + }; + "tslib@2.8.1" = fetchurl { + url = "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"; + hash = "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="; + }; "typescript@5.9.3" = fetchurl { url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; @@ -52,8 +404,40 @@ url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; }; + "undici@7.14.0" = fetchurl { + url = "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz"; + hash = "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ=="; + }; + "unenv@2.0.0-rc.24" = fetchurl { + url = "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz"; + hash = "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="; + }; "user-agent-data-types@0.4.2" = fetchurl { url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; }; + "workerd@1.20251210.0" = fetchurl { + url = "https://registry.npmjs.org/workerd/-/workerd-1.20251210.0.tgz"; + hash = "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw=="; + }; + "wrangler@4.54.0" = fetchurl { + url = "https://registry.npmjs.org/wrangler/-/wrangler-4.54.0.tgz"; + hash = "sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A=="; + }; + "ws@8.18.0" = fetchurl { + url = "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz"; + hash = "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="; + }; + "youch-core@0.3.3" = fetchurl { + url = "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz"; + hash = "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="; + }; + "youch@4.1.0-beta.10" = fetchurl { + url = "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz"; + hash = "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="; + }; + "zod@3.22.3" = fetchurl { + url = "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz"; + hash = "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="; + }; } diff --git a/package.json b/package.json index 03fec02..bf56fd3 100644 --- a/package.json +++ b/package.json @@ -9,8 +9,9 @@ "devDependencies": { "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*", "bun2nix": "^2.0.0", "typescript": "^5.9.3", - "@workspace/flatmmo-types": "workspace:*" + "wrangler": "^4.54.0" } } From 86196b9bc52c9996c6909ac8adfa64b94f2f0410 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 20:47:00 -0500 Subject: [PATCH 44/87] moved to nix wrangler --- .github/workflows/ci.yaml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 22d0046..477d900 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -17,8 +17,11 @@ jobs: - uses: DeterminateSystems/flake-checker-action@main - name: Run `nix build` run: nix build . - - name: Run `nix develop` - run: nix develop + - name: Run `nix build` + run: nix develop + env: + CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} + CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - name: Deploy to Cloudflare Workers with Wrangler # You may pin to the exact commit or the version. # uses: cloudflare/wrangler-action@c25aadc9657b0cdc4786c04e59a6fe92765a783b From 286e9d12b5a3e0b51db5de5a662a8468f08d94ce Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 20:48:38 -0500 Subject: [PATCH 45/87] moved to nix wrangler --- .github/workflows/ci.yaml | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 477d900..0605bfd 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,18 +22,18 @@ jobs: env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - - name: Deploy to Cloudflare Workers with Wrangler - # You may pin to the exact commit or the version. - # uses: cloudflare/wrangler-action@c25aadc9657b0cdc4786c04e59a6fe92765a783b - uses: cloudflare/wrangler-action@v3.14.1 - with: - #Your Cloudflare API Token - apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} - # Your Cloudflare Account ID - accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - preCommand: nix develop - command: pages deploy - packageManager: bun - # The version of Wrangler you'd like to use to deploy your Workers project - wranglerVersion: 4.54.0 # optional + # - name: Deploy to Cloudflare Workers with Wrangler + # # You may pin to the exact commit or the version. + # # uses: cloudflare/wrangler-action@c25aadc9657b0cdc4786c04e59a6fe92765a783b + # uses: cloudflare/wrangler-action@v3.14.1 + # with: + # #Your Cloudflare API Token + # apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} + # # Your Cloudflare Account ID + # accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + # preCommand: nix develop + # command: pages deploy + # packageManager: bun + # # The version of Wrangler you'd like to use to deploy your Workers project + # wranglerVersion: 4.54.0 # optional From 98fa182344ba74533145087b1c3da5f0d2f91a9f Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 20:52:22 -0500 Subject: [PATCH 46/87] fixed missing command --- .github/workflows/ci.yaml | 2 +- bun.lock | 193 ------------------- bun.nix | 384 -------------------------------------- package.json | 3 +- 4 files changed, 2 insertions(+), 580 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 0605bfd..a89bfa0 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: - name: Run `nix build` run: nix build . - name: Run `nix build` - run: nix develop + run: nix develop --command bunx wrangler pages deploy env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} diff --git a/bun.lock b/bun.lock index 34a01b1..e71b382 100644 --- a/bun.lock +++ b/bun.lock @@ -10,7 +10,6 @@ "@workspace/flatmmo-types": "workspace:*", "bun2nix": "^2.0.0", "typescript": "^5.9.3", - "wrangler": "^4.54.0", }, }, "packages/better-custom-hotkeys": { @@ -35,130 +34,6 @@ }, }, "packages": { - "@cloudflare/kv-asset-handler": ["@cloudflare/kv-asset-handler@0.4.1", "", { "dependencies": { "mime": "^3.0.0" } }, "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg=="], - - "@cloudflare/unenv-preset": ["@cloudflare/unenv-preset@2.7.13", "", { "peerDependencies": { "unenv": "2.0.0-rc.24", "workerd": "^1.20251202.0" }, "optionalPeers": ["workerd"] }, "sha512-NulO1H8R/DzsJguLC0ndMuk4Ufv0KSlN+E54ay9rn9ZCQo0kpAPwwh3LhgpZ96a3Dr6L9LqW57M4CqC34iLOvw=="], - - "@cloudflare/workerd-darwin-64": ["@cloudflare/workerd-darwin-64@1.20251210.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ=="], - - "@cloudflare/workerd-darwin-arm64": ["@cloudflare/workerd-darwin-arm64@1.20251210.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw=="], - - "@cloudflare/workerd-linux-64": ["@cloudflare/workerd-linux-64@1.20251210.0", "", { "os": "linux", "cpu": "x64" }, "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g=="], - - "@cloudflare/workerd-linux-arm64": ["@cloudflare/workerd-linux-arm64@1.20251210.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA=="], - - "@cloudflare/workerd-windows-64": ["@cloudflare/workerd-windows-64@1.20251210.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw=="], - - "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], - - "@emnapi/runtime": ["@emnapi/runtime@1.7.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="], - - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.0", "", { "os": "aix", "cpu": "ppc64" }, "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="], - - "@esbuild/android-arm": ["@esbuild/android-arm@0.27.0", "", { "os": "android", "cpu": "arm" }, "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="], - - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.0", "", { "os": "android", "cpu": "arm64" }, "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ=="], - - "@esbuild/android-x64": ["@esbuild/android-x64@0.27.0", "", { "os": "android", "cpu": "x64" }, "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q=="], - - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg=="], - - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g=="], - - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw=="], - - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g=="], - - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.0", "", { "os": "linux", "cpu": "arm" }, "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ=="], - - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ=="], - - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.0", "", { "os": "linux", "cpu": "ia32" }, "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw=="], - - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg=="], - - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg=="], - - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA=="], - - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.0", "", { "os": "linux", "cpu": "none" }, "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ=="], - - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w=="], - - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw=="], - - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w=="], - - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.0", "", { "os": "none", "cpu": "x64" }, "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA=="], - - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.0", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ=="], - - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.0", "", { "os": "openbsd", "cpu": "x64" }, "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A=="], - - "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.0", "", { "os": "none", "cpu": "arm64" }, "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA=="], - - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.0", "", { "os": "sunos", "cpu": "x64" }, "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA=="], - - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg=="], - - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ=="], - - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.0", "", { "os": "win32", "cpu": "x64" }, "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg=="], - - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.0.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="], - - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.0.4" }, "os": "darwin", "cpu": "x64" }, "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="], - - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.0.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="], - - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.0.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="], - - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.0.5", "", { "os": "linux", "cpu": "arm" }, "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="], - - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="], - - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.0.4", "", { "os": "linux", "cpu": "s390x" }, "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="], - - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="], - - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.0.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="], - - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.0.4", "", { "os": "linux", "cpu": "x64" }, "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="], - - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.0.5" }, "os": "linux", "cpu": "arm" }, "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="], - - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="], - - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.0.4" }, "os": "linux", "cpu": "s390x" }, "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="], - - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="], - - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.0.4" }, "os": "linux", "cpu": "arm64" }, "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="], - - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.33.5", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.0.4" }, "os": "linux", "cpu": "x64" }, "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="], - - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.33.5", "", { "dependencies": { "@emnapi/runtime": "^1.2.0" }, "cpu": "none" }, "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="], - - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.33.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="], - - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.33.5", "", { "os": "win32", "cpu": "x64" }, "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="], - - "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - - "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], - - "@poppinss/colors": ["@poppinss/colors@4.1.6", "", { "dependencies": { "kleur": "^4.1.5" } }, "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="], - - "@poppinss/dumper": ["@poppinss/dumper@0.6.5", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@sindresorhus/is": "^7.0.2", "supports-color": "^10.0.0" } }, "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="], - - "@poppinss/exception": ["@poppinss/exception@1.2.3", "", {}, "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="], - - "@sindresorhus/is": ["@sindresorhus/is@7.2.0", "", {}, "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="], - - "@speed-highlight/core": ["@speed-highlight/core@1.2.12", "", {}, "sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA=="], - "@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], "@types/node": ["@types/node@25.0.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="], @@ -171,86 +46,18 @@ "@workspace/flatmmo-types": ["@workspace/flatmmo-types@workspace:packages/flatmmo-types"], - "acorn": ["acorn@8.14.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="], - - "acorn-walk": ["acorn-walk@8.3.2", "", {}, "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="], - - "blake3-wasm": ["blake3-wasm@2.1.5", "", {}, "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="], - "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], "bun2nix": ["bun2nix@2.0.0", "", { "dependencies": { "sade": "^1.8.1" }, "bin": { "bun2nix": "index.ts" } }, "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="], - "color": ["color@4.2.3", "", { "dependencies": { "color-convert": "^2.0.1", "color-string": "^1.9.0" } }, "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="], - - "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], - - "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - - "color-string": ["color-string@1.9.1", "", { "dependencies": { "color-name": "^1.0.0", "simple-swizzle": "^0.2.2" } }, "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="], - - "cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="], - - "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - - "error-stack-parser-es": ["error-stack-parser-es@1.0.5", "", {}, "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="], - - "esbuild": ["esbuild@0.27.0", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.0", "@esbuild/android-arm": "0.27.0", "@esbuild/android-arm64": "0.27.0", "@esbuild/android-x64": "0.27.0", "@esbuild/darwin-arm64": "0.27.0", "@esbuild/darwin-x64": "0.27.0", "@esbuild/freebsd-arm64": "0.27.0", "@esbuild/freebsd-x64": "0.27.0", "@esbuild/linux-arm": "0.27.0", "@esbuild/linux-arm64": "0.27.0", "@esbuild/linux-ia32": "0.27.0", "@esbuild/linux-loong64": "0.27.0", "@esbuild/linux-mips64el": "0.27.0", "@esbuild/linux-ppc64": "0.27.0", "@esbuild/linux-riscv64": "0.27.0", "@esbuild/linux-s390x": "0.27.0", "@esbuild/linux-x64": "0.27.0", "@esbuild/netbsd-arm64": "0.27.0", "@esbuild/netbsd-x64": "0.27.0", "@esbuild/openbsd-arm64": "0.27.0", "@esbuild/openbsd-x64": "0.27.0", "@esbuild/openharmony-arm64": "0.27.0", "@esbuild/sunos-x64": "0.27.0", "@esbuild/win32-arm64": "0.27.0", "@esbuild/win32-ia32": "0.27.0", "@esbuild/win32-x64": "0.27.0" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="], - - "exit-hook": ["exit-hook@2.2.1", "", {}, "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="], - - "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - - "glob-to-regexp": ["glob-to-regexp@0.4.1", "", {}, "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="], - - "is-arrayish": ["is-arrayish@0.3.4", "", {}, "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="], - - "kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="], - - "mime": ["mime@3.0.0", "", { "bin": { "mime": "cli.js" } }, "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="], - - "miniflare": ["miniflare@4.20251210.0", "", { "dependencies": { "@cspotcode/source-map-support": "0.8.1", "acorn": "8.14.0", "acorn-walk": "8.3.2", "exit-hook": "2.2.1", "glob-to-regexp": "0.4.1", "sharp": "^0.33.5", "stoppable": "1.1.0", "undici": "7.14.0", "workerd": "1.20251210.0", "ws": "8.18.0", "youch": "4.1.0-beta.10", "zod": "3.22.3" }, "bin": { "miniflare": "bootstrap.js" } }, "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw=="], - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], - "path-to-regexp": ["path-to-regexp@6.3.0", "", {}, "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="], - - "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], - "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], - - "sharp": ["sharp@0.33.5", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.3", "semver": "^7.6.3" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.33.5", "@img/sharp-darwin-x64": "0.33.5", "@img/sharp-libvips-darwin-arm64": "1.0.4", "@img/sharp-libvips-darwin-x64": "1.0.4", "@img/sharp-libvips-linux-arm": "1.0.5", "@img/sharp-libvips-linux-arm64": "1.0.4", "@img/sharp-libvips-linux-s390x": "1.0.4", "@img/sharp-libvips-linux-x64": "1.0.4", "@img/sharp-libvips-linuxmusl-arm64": "1.0.4", "@img/sharp-libvips-linuxmusl-x64": "1.0.4", "@img/sharp-linux-arm": "0.33.5", "@img/sharp-linux-arm64": "0.33.5", "@img/sharp-linux-s390x": "0.33.5", "@img/sharp-linux-x64": "0.33.5", "@img/sharp-linuxmusl-arm64": "0.33.5", "@img/sharp-linuxmusl-x64": "0.33.5", "@img/sharp-wasm32": "0.33.5", "@img/sharp-win32-ia32": "0.33.5", "@img/sharp-win32-x64": "0.33.5" } }, "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="], - - "simple-swizzle": ["simple-swizzle@0.2.4", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="], - - "stoppable": ["stoppable@1.1.0", "", {}, "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="], - - "supports-color": ["supports-color@10.2.2", "", {}, "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="], - - "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "undici": ["undici@7.14.0", "", {}, "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ=="], - "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "unenv": ["unenv@2.0.0-rc.24", "", { "dependencies": { "pathe": "^2.0.3" } }, "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="], - "user-agent-data-types": ["user-agent-data-types@0.4.2", "", {}, "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="], - - "workerd": ["workerd@1.20251210.0", "", { "optionalDependencies": { "@cloudflare/workerd-darwin-64": "1.20251210.0", "@cloudflare/workerd-darwin-arm64": "1.20251210.0", "@cloudflare/workerd-linux-64": "1.20251210.0", "@cloudflare/workerd-linux-arm64": "1.20251210.0", "@cloudflare/workerd-windows-64": "1.20251210.0" }, "bin": { "workerd": "bin/workerd" } }, "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw=="], - - "wrangler": ["wrangler@4.54.0", "", { "dependencies": { "@cloudflare/kv-asset-handler": "0.4.1", "@cloudflare/unenv-preset": "2.7.13", "blake3-wasm": "2.1.5", "esbuild": "0.27.0", "miniflare": "4.20251210.0", "path-to-regexp": "6.3.0", "unenv": "2.0.0-rc.24", "workerd": "1.20251210.0" }, "optionalDependencies": { "fsevents": "~2.3.2" }, "peerDependencies": { "@cloudflare/workers-types": "^4.20251210.0" }, "optionalPeers": ["@cloudflare/workers-types"], "bin": { "wrangler": "bin/wrangler.js", "wrangler2": "bin/wrangler.js" } }, "sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A=="], - - "ws": ["ws@8.18.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="], - - "youch": ["youch@4.1.0-beta.10", "", { "dependencies": { "@poppinss/colors": "^4.1.5", "@poppinss/dumper": "^0.6.4", "@speed-highlight/core": "^1.2.7", "cookie": "^1.0.2", "youch-core": "^0.3.3" } }, "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="], - - "youch-core": ["youch-core@0.3.3", "", { "dependencies": { "@poppinss/exception": "^1.2.2", "error-stack-parser-es": "^1.0.5" } }, "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="], - - "zod": ["zod@3.22.3", "", {}, "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="], } } diff --git a/bun.nix b/bun.nix index cfa996d..d26870a 100644 --- a/bun.nix +++ b/bun.nix @@ -13,254 +13,6 @@ ... }: { - "@cloudflare/kv-asset-handler@0.4.1" = fetchurl { - url = "https://registry.npmjs.org/@cloudflare/kv-asset-handler/-/kv-asset-handler-0.4.1.tgz"; - hash = "sha512-Nu8ahitGFFJztxUml9oD/DLb7Z28C8cd8F46IVQ7y5Btz575pvMY8AqZsXkX7Gds29eCKdMgIHjIvzskHgPSFg=="; - }; - "@cloudflare/unenv-preset@2.7.13" = fetchurl { - url = "https://registry.npmjs.org/@cloudflare/unenv-preset/-/unenv-preset-2.7.13.tgz"; - hash = "sha512-NulO1H8R/DzsJguLC0ndMuk4Ufv0KSlN+E54ay9rn9ZCQo0kpAPwwh3LhgpZ96a3Dr6L9LqW57M4CqC34iLOvw=="; - }; - "@cloudflare/workerd-darwin-64@1.20251210.0" = fetchurl { - url = "https://registry.npmjs.org/@cloudflare/workerd-darwin-64/-/workerd-darwin-64-1.20251210.0.tgz"; - hash = "sha512-Nn9X1moUDERA9xtFdCQ2XpQXgAS9pOjiCxvOT8sVx9UJLAiBLkfSCGbpsYdarODGybXCpjRlc77Yppuolvt7oQ=="; - }; - "@cloudflare/workerd-darwin-arm64@1.20251210.0" = fetchurl { - url = "https://registry.npmjs.org/@cloudflare/workerd-darwin-arm64/-/workerd-darwin-arm64-1.20251210.0.tgz"; - hash = "sha512-Mg8iYIZQFnbevq/ls9eW/eneWTk/EE13Pej1MwfkY5et0jVpdHnvOLywy/o+QtMJFef1AjsqXGULwAneYyBfHw=="; - }; - "@cloudflare/workerd-linux-64@1.20251210.0" = fetchurl { - url = "https://registry.npmjs.org/@cloudflare/workerd-linux-64/-/workerd-linux-64-1.20251210.0.tgz"; - hash = "sha512-kjC2fCZhZ2Gkm1biwk2qByAYpGguK5Gf5ic8owzSCUw0FOUfQxTZUT9Lp3gApxsfTLbbnLBrX/xzWjywH9QR4g=="; - }; - "@cloudflare/workerd-linux-arm64@1.20251210.0" = fetchurl { - url = "https://registry.npmjs.org/@cloudflare/workerd-linux-arm64/-/workerd-linux-arm64-1.20251210.0.tgz"; - hash = "sha512-2IB37nXi7PZVQLa1OCuO7/6pNxqisRSO8DmCQ5x/3sezI5op1vwOxAcb1osAnuVsVN9bbvpw70HJvhKruFJTuA=="; - }; - "@cloudflare/workerd-windows-64@1.20251210.0" = fetchurl { - url = "https://registry.npmjs.org/@cloudflare/workerd-windows-64/-/workerd-windows-64-1.20251210.0.tgz"; - hash = "sha512-Uaz6/9XE+D6E7pCY4OvkCuJHu7HcSDzeGcCGY1HLhojXhHd7yL52c3yfiyJdS8hPatiAa0nn5qSI/42+aTdDSw=="; - }; - "@cspotcode/source-map-support@0.8.1" = fetchurl { - url = "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz"; - hash = "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="; - }; - "@emnapi/runtime@1.7.1" = fetchurl { - url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz"; - hash = "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA=="; - }; - "@esbuild/aix-ppc64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.0.tgz"; - hash = "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A=="; - }; - "@esbuild/android-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.0.tgz"; - hash = "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ=="; - }; - "@esbuild/android-arm@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.0.tgz"; - hash = "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ=="; - }; - "@esbuild/android-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.0.tgz"; - hash = "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q=="; - }; - "@esbuild/darwin-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.0.tgz"; - hash = "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg=="; - }; - "@esbuild/darwin-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.0.tgz"; - hash = "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g=="; - }; - "@esbuild/freebsd-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.0.tgz"; - hash = "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw=="; - }; - "@esbuild/freebsd-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.0.tgz"; - hash = "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g=="; - }; - "@esbuild/linux-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.0.tgz"; - hash = "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ=="; - }; - "@esbuild/linux-arm@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.0.tgz"; - hash = "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ=="; - }; - "@esbuild/linux-ia32@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.0.tgz"; - hash = "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw=="; - }; - "@esbuild/linux-loong64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.0.tgz"; - hash = "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg=="; - }; - "@esbuild/linux-mips64el@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.0.tgz"; - hash = "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg=="; - }; - "@esbuild/linux-ppc64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.0.tgz"; - hash = "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA=="; - }; - "@esbuild/linux-riscv64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.0.tgz"; - hash = "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ=="; - }; - "@esbuild/linux-s390x@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.0.tgz"; - hash = "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w=="; - }; - "@esbuild/linux-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.0.tgz"; - hash = "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw=="; - }; - "@esbuild/netbsd-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.0.tgz"; - hash = "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w=="; - }; - "@esbuild/netbsd-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.0.tgz"; - hash = "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA=="; - }; - "@esbuild/openbsd-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.0.tgz"; - hash = "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ=="; - }; - "@esbuild/openbsd-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.0.tgz"; - hash = "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A=="; - }; - "@esbuild/openharmony-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.0.tgz"; - hash = "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA=="; - }; - "@esbuild/sunos-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.0.tgz"; - hash = "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA=="; - }; - "@esbuild/win32-arm64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.0.tgz"; - hash = "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg=="; - }; - "@esbuild/win32-ia32@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.0.tgz"; - hash = "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ=="; - }; - "@esbuild/win32-x64@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.0.tgz"; - hash = "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg=="; - }; - "@img/sharp-darwin-arm64@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz"; - hash = "sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ=="; - }; - "@img/sharp-darwin-x64@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz"; - hash = "sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q=="; - }; - "@img/sharp-libvips-darwin-arm64@1.0.4" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz"; - hash = "sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg=="; - }; - "@img/sharp-libvips-darwin-x64@1.0.4" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz"; - hash = "sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ=="; - }; - "@img/sharp-libvips-linux-arm64@1.0.4" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz"; - hash = "sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA=="; - }; - "@img/sharp-libvips-linux-arm@1.0.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz"; - hash = "sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g=="; - }; - "@img/sharp-libvips-linux-s390x@1.0.4" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz"; - hash = "sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA=="; - }; - "@img/sharp-libvips-linux-x64@1.0.4" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz"; - hash = "sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw=="; - }; - "@img/sharp-libvips-linuxmusl-arm64@1.0.4" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz"; - hash = "sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA=="; - }; - "@img/sharp-libvips-linuxmusl-x64@1.0.4" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz"; - hash = "sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw=="; - }; - "@img/sharp-linux-arm64@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz"; - hash = "sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA=="; - }; - "@img/sharp-linux-arm@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz"; - hash = "sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ=="; - }; - "@img/sharp-linux-s390x@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz"; - hash = "sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q=="; - }; - "@img/sharp-linux-x64@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz"; - hash = "sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA=="; - }; - "@img/sharp-linuxmusl-arm64@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz"; - hash = "sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g=="; - }; - "@img/sharp-linuxmusl-x64@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz"; - hash = "sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw=="; - }; - "@img/sharp-wasm32@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz"; - hash = "sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg=="; - }; - "@img/sharp-win32-ia32@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz"; - hash = "sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ=="; - }; - "@img/sharp-win32-x64@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz"; - hash = "sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg=="; - }; - "@jridgewell/resolve-uri@3.1.2" = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"; - hash = "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="; - }; - "@jridgewell/sourcemap-codec@1.5.5" = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"; - hash = "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="; - }; - "@jridgewell/trace-mapping@0.3.9" = fetchurl { - url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz"; - hash = "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="; - }; - "@poppinss/colors@4.1.6" = fetchurl { - url = "https://registry.npmjs.org/@poppinss/colors/-/colors-4.1.6.tgz"; - hash = "sha512-H9xkIdFswbS8n1d6vmRd8+c10t2Qe+rZITbbDHHkQixH5+2x1FDGmi/0K+WgWiqQFKPSlIYB7jlH6Kpfn6Fleg=="; - }; - "@poppinss/dumper@0.6.5" = fetchurl { - url = "https://registry.npmjs.org/@poppinss/dumper/-/dumper-0.6.5.tgz"; - hash = "sha512-NBdYIb90J7LfOI32dOewKI1r7wnkiH6m920puQ3qHUeZkxNkQiFnXVWoE6YtFSv6QOiPPf7ys6i+HWWecDz7sw=="; - }; - "@poppinss/exception@1.2.3" = fetchurl { - url = "https://registry.npmjs.org/@poppinss/exception/-/exception-1.2.3.tgz"; - hash = "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw=="; - }; - "@sindresorhus/is@7.2.0" = fetchurl { - url = "https://registry.npmjs.org/@sindresorhus/is/-/is-7.2.0.tgz"; - hash = "sha512-P1Cz1dWaFfR4IR+U13mqqiGsLFf1KbayybWwdd2vfctdV6hDpUkgCY0nKOLLTMSoRd/jJNjtbqzf13K8DCCXQw=="; - }; - "@speed-highlight/core@1.2.12" = fetchurl { - url = "https://registry.npmjs.org/@speed-highlight/core/-/core-1.2.12.tgz"; - hash = "sha512-uilwrK0Ygyri5dToHYdZSjcvpS2ZwX0w5aSt3GCEN9hrjxWCoeV4Z2DTXuxjwbntaLQIEEAlCeNQss5SoHvAEA=="; - }; "@types/bun@1.3.4" = fetchurl { url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; @@ -276,18 +28,6 @@ "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; - "acorn-walk@8.3.2" = fetchurl { - url = "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz"; - hash = "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A=="; - }; - "acorn@8.14.0" = fetchurl { - url = "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz"; - hash = "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA=="; - }; - "blake3-wasm@2.1.5" = fetchurl { - url = "https://registry.npmjs.org/blake3-wasm/-/blake3-wasm-2.1.5.tgz"; - hash = "sha512-F1+K8EbfOZE49dtoPtmxUQrpXaBIl3ICvasLh+nJta0xkz+9kF/7uet9fLnwKqhDrmj6g+6K3Tw9yQPUg2ka5g=="; - }; "bun-types@1.3.4" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; @@ -296,106 +36,14 @@ url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; }; - "color-convert@2.0.1" = fetchurl { - url = "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"; - hash = "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="; - }; - "color-name@1.1.4" = fetchurl { - url = "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"; - hash = "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="; - }; - "color-string@1.9.1" = fetchurl { - url = "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz"; - hash = "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg=="; - }; - "color@4.2.3" = fetchurl { - url = "https://registry.npmjs.org/color/-/color-4.2.3.tgz"; - hash = "sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A=="; - }; - "cookie@1.1.1" = fetchurl { - url = "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz"; - hash = "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="; - }; - "detect-libc@2.1.2" = fetchurl { - url = "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz"; - hash = "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="; - }; - "error-stack-parser-es@1.0.5" = fetchurl { - url = "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-1.0.5.tgz"; - hash = "sha512-5qucVt2XcuGMcEGgWI7i+yZpmpByQ8J1lHhcL7PwqCwu9FPP3VUXzT4ltHe5i2z9dePwEHcDVOAfSnHsOlCXRA=="; - }; - "esbuild@0.27.0" = fetchurl { - url = "https://registry.npmjs.org/esbuild/-/esbuild-0.27.0.tgz"; - hash = "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA=="; - }; - "exit-hook@2.2.1" = fetchurl { - url = "https://registry.npmjs.org/exit-hook/-/exit-hook-2.2.1.tgz"; - hash = "sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw=="; - }; - "fsevents@2.3.3" = fetchurl { - url = "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz"; - hash = "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="; - }; - "glob-to-regexp@0.4.1" = fetchurl { - url = "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz"; - hash = "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="; - }; - "is-arrayish@0.3.4" = fetchurl { - url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.4.tgz"; - hash = "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA=="; - }; - "kleur@4.1.5" = fetchurl { - url = "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz"; - hash = "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="; - }; - "mime@3.0.0" = fetchurl { - url = "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz"; - hash = "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A=="; - }; - "miniflare@4.20251210.0" = fetchurl { - url = "https://registry.npmjs.org/miniflare/-/miniflare-4.20251210.0.tgz"; - hash = "sha512-k6kIoXwGVqlPZb0hcn+X7BmnK+8BjIIkusQPY22kCo2RaQJ/LzAjtxHQdGXerlHSnJyQivDQsL6BJHMpQfUFyw=="; - }; "mri@1.2.0" = fetchurl { url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; }; - "path-to-regexp@6.3.0" = fetchurl { - url = "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz"; - hash = "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="; - }; - "pathe@2.0.3" = fetchurl { - url = "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz"; - hash = "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="; - }; "sade@1.8.1" = fetchurl { url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; }; - "semver@7.7.3" = fetchurl { - url = "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz"; - hash = "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="; - }; - "sharp@0.33.5" = fetchurl { - url = "https://registry.npmjs.org/sharp/-/sharp-0.33.5.tgz"; - hash = "sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw=="; - }; - "simple-swizzle@0.2.4" = fetchurl { - url = "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.4.tgz"; - hash = "sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw=="; - }; - "stoppable@1.1.0" = fetchurl { - url = "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz"; - hash = "sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw=="; - }; - "supports-color@10.2.2" = fetchurl { - url = "https://registry.npmjs.org/supports-color/-/supports-color-10.2.2.tgz"; - hash = "sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g=="; - }; - "tslib@2.8.1" = fetchurl { - url = "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"; - hash = "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="; - }; "typescript@5.9.3" = fetchurl { url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; @@ -404,40 +52,8 @@ url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; }; - "undici@7.14.0" = fetchurl { - url = "https://registry.npmjs.org/undici/-/undici-7.14.0.tgz"; - hash = "sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ=="; - }; - "unenv@2.0.0-rc.24" = fetchurl { - url = "https://registry.npmjs.org/unenv/-/unenv-2.0.0-rc.24.tgz"; - hash = "sha512-i7qRCmY42zmCwnYlh9H2SvLEypEFGye5iRmEMKjcGi7zk9UquigRjFtTLz0TYqr0ZGLZhaMHl/foy1bZR+Cwlw=="; - }; "user-agent-data-types@0.4.2" = fetchurl { url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; }; - "workerd@1.20251210.0" = fetchurl { - url = "https://registry.npmjs.org/workerd/-/workerd-1.20251210.0.tgz"; - hash = "sha512-9MUUneP1BnRE9XAYi94FXxHmiLGbO75EHQZsgWqSiOXjoXSqJCw8aQbIEPxCy19TclEl/kHUFYce8ST2W+Qpjw=="; - }; - "wrangler@4.54.0" = fetchurl { - url = "https://registry.npmjs.org/wrangler/-/wrangler-4.54.0.tgz"; - hash = "sha512-bANFsjDwJLbprYoBK+hUDZsVbUv2SqJd8QvArLIcZk+fPq4h/Ohtj5vkKXD3k0s2bD1DXLk08D+hYmeNH+xC6A=="; - }; - "ws@8.18.0" = fetchurl { - url = "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz"; - hash = "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw=="; - }; - "youch-core@0.3.3" = fetchurl { - url = "https://registry.npmjs.org/youch-core/-/youch-core-0.3.3.tgz"; - hash = "sha512-ho7XuGjLaJ2hWHoK8yFnsUGy2Y5uDpqSTq1FkHLK4/oqKtyUU1AFbOOxY4IpC9f0fTLjwYbslUz0Po5BpD1wrA=="; - }; - "youch@4.1.0-beta.10" = fetchurl { - url = "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz"; - hash = "sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ=="; - }; - "zod@3.22.3" = fetchurl { - url = "https://registry.npmjs.org/zod/-/zod-3.22.3.tgz"; - hash = "sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug=="; - }; } diff --git a/package.json b/package.json index bf56fd3..dad7750 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "@violentmonkey/types": "^0.3.1", "@workspace/flatmmo-types": "workspace:*", "bun2nix": "^2.0.0", - "typescript": "^5.9.3", - "wrangler": "^4.54.0" + "typescript": "^5.9.3" } } From 54c8363a1ad4dfb5a901bd559b027373bdd589c9 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 21:08:03 -0500 Subject: [PATCH 47/87] debug --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index a89bfa0..1f4ae8d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: - name: Run `nix build` run: nix build . - name: Run `nix build` - run: nix develop --command bunx wrangler pages deploy + run: nix develop --command bunx wrangler whoami && bunx wrangler pages deploy env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} From 8b6f3678315550c3a5eb8770ca9c4f062bc1f682 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 21:19:46 -0500 Subject: [PATCH 48/87] rollback --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 1f4ae8d..5340053 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: - name: Run `nix build` run: nix build . - name: Run `nix build` - run: nix develop --command bunx wrangler whoami && bunx wrangler pages deploy + run: nix develop --command -- bunx wrangler pages deploy env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} From c5af28801b84652e01f32f71e8c30234c7068de7 Mon Sep 17 00:00:00 2001 From: Josh Romer Date: Sun, 28 Dec 2025 21:36:33 -0500 Subject: [PATCH 49/87] Modify CI workflow for debugging and artifact upload Updated CI workflow to include debug step and upload static site artifact. --- .github/workflows/ci.yaml | 32 ++++++++++++-------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 5340053..034eba6 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -1,4 +1,4 @@ -name: CI +name: debug on: push: @@ -14,26 +14,18 @@ jobs: - uses: actions/checkout@v4 - uses: DeterminateSystems/nix-installer-action@main - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: DeterminateSystems/flake-checker-action@main + - uses: DeterminateSystems/flake-checker-action@main - name: Run `nix build` - run: nix build . - - name: Run `nix build` - run: nix develop --command -- bunx wrangler pages deploy + run: nix build + - name: Upload static site artifact + uses: actions/upload-artifact@v4 + with: + name: site + path: result/static + - name: debug + run: ls -R; printenv; + - name: Run `nix shell` + run: nix develop --command -- bunx wrangler pages deploy result/static --branch dev env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - # - name: Deploy to Cloudflare Workers with Wrangler - # # You may pin to the exact commit or the version. - # # uses: cloudflare/wrangler-action@c25aadc9657b0cdc4786c04e59a6fe92765a783b - # uses: cloudflare/wrangler-action@v3.14.1 - # with: - # #Your Cloudflare API Token - # apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} - # # Your Cloudflare Account ID - # accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} - # preCommand: nix develop - # command: pages deploy - # packageManager: bun - # # The version of Wrangler you'd like to use to deploy your Workers project - # wranglerVersion: 4.54.0 # optional - From a6c48da0cebf82f0a3d700223ef24b55bcb32d33 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 21:39:59 -0500 Subject: [PATCH 50/87] removed debug --- .github/workflows/ci.yaml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 034eba6..c1265d7 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,10 +22,8 @@ jobs: with: name: site path: result/static - - name: debug - run: ls -R; printenv; - name: Run `nix shell` - run: nix develop --command -- bunx wrangler pages deploy result/static --branch dev + run: nix develop --command -- bunx wrangler pages deploy result/static env: CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} From 7dea53a993fe4825ba3e83057c10652ccf800824 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 28 Dec 2025 23:26:33 -0500 Subject: [PATCH 51/87] added some simple style and removed checked in build files --- out/better-custom-hotkeys.user.js | 445 ------------------ out/current-action-ui.user.js | 183 ------- packages/static-userscript-index/favicon.png | Bin 0 -> 263 bytes packages/static-userscript-index/index.html | 36 +- .../static-userscript-index/write-html.ts | 2 + 5 files changed, 29 insertions(+), 637 deletions(-) delete mode 100644 out/better-custom-hotkeys.user.js delete mode 100644 out/current-action-ui.user.js create mode 100644 packages/static-userscript-index/favicon.png diff --git a/out/better-custom-hotkeys.user.js b/out/better-custom-hotkeys.user.js deleted file mode 100644 index 902f758..0000000 --- a/out/better-custom-hotkeys.user.js +++ /dev/null @@ -1,445 +0,0 @@ -// ==UserScript== -// @name Better hotkeys -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue -// @version 0.001 -// @author Joshu -// @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. -// @inject-into page -// ==/UserScript== - -// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/ACTIONS.ts -var ACTIONS = { - run: { - originalKey: "F1", - description: "Run", - socketCommand: "SHORTCUT_KEY=F1" - }, - eat: { - originalKey: "F2", - description: "Consumes a piece of food", - socketCommand: "SHORTCUT_KEY=F2" - }, - lightFire: { - originalKey: "F3", - description: "Lights a fire", - socketCommand: "SHORTCUT_KEY=F3" - }, - equip1: { - originalKey: "F6", - description: "Equipment Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F6" - }, - equip2: { - originalKey: "F7", - description: "Equipment - Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F7" - }, - equip3: { - originalKey: "F8", - description: "Equipment - Auto equips items that you've configured", - socketCommand: "SHORTCUT_KEY=F8" - }, - badge1: { - originalKey: "F9", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F9" - }, - badge2: { - originalKey: "F10", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F10" - }, - badge3: { - originalKey: "F11", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F11" - }, - badge4: { - originalKey: "F12", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "SHORTCUT_KEY=F12" - }, - teleport_everbrook: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_everbrook" - }, - remote_sell: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=remote_sell" - }, - dig: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=dig" - }, - teleport_mysticvale: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_mysticvale" - }, - timers: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=timers" - }, - teleport_omboko: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_omboko" - }, - teleport_dock_haven: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_dock_haven" - }, - auto_hell_burying: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=auto_hell_burying" - }, - teleport_jafa_outpost: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=teleport_jafa_outpost" - }, - hunting_contact: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=hunting_contact" - }, - mass_pickup: { - originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", - socketCommand: "USE_WORSHIP=mass_pickup" - } -}; - -// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/DEFAULT_HOTKEYS.ts -var DEFAULT_HOTKEYS = [ - { - action: "run", - hotkey: { - key: "r", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "eat", - hotkey: { - key: "f", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "lightFire", - hotkey: { - key: "4", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "equip1", - hotkey: { - key: "1", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "equip2", - hotkey: { - key: "2", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "equip3", - hotkey: { - key: "3", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "badge1", - hotkey: { - key: "a", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "badge2", - hotkey: { - key: "s", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "badge3", - hotkey: { - key: "d", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "badge4", - hotkey: { - key: "v", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "teleport_everbrook", - hotkey: { - key: "e", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "remote_sell", - hotkey: { - key: "s", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "dig", - hotkey: { - key: "l", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "teleport_mysticvale", - hotkey: { - key: "m", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "timers", - hotkey: { - key: "0", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false - } - }, - { - action: "teleport_omboko", - hotkey: { - key: "o", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "teleport_dock_haven", - hotkey: { - key: "d", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "auto_hell_burying", - hotkey: { - key: "f", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "teleport_jafa_outpost", - hotkey: { - key: "j", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "hunting_contact", - hotkey: { - key: "h", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - }, - { - action: "mass_pickup", - hotkey: { - key: "p", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false - } - } -]; - -// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/hotkeys.ts -var keypressToHashableString = (keypress) => { - return `${keypress.key}-${keypress.altKey}-${keypress.ctrlKey}-${keypress.metaKey}-${keypress.shiftKey}`.toLowerCase(); -}; -var hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); -var hashedHotkeyMap = hotkeys.reduce((result, hotkey) => { - const hashed = keypressToHashableString(hotkey.hotkey); - result[hashed] = hotkey; - return result; -}, {}); -GM_setValue("hotkeys", DEFAULT_HOTKEYS); - -// ../../nix/store/cipbmsmi8iqqarhpiyhm2w34b3c9swz1-better-custom-hotkeys/index.ts -var focusOrSendChat = () => { - const value = chat_ele.value.trim(); - if (document.activeElement !== chat_ele) { - request_focus_chatbox(); - return; - } - if (value !== "") { - Globals.websocket.send(`CHAT=${value}`); - chat_ele.value = ""; - } - request_unfocus_chatbox(); -}; -var handleNpcChatModal = (e) => { - const keyCode = e.keyCode; - if (has_npc_chat_message_modal_open()) { - if (keyCode === 32) { - document.getElementById("npc-chat-message-modal-continue-btn")?.click(); - e.preventDefault(); - } - return; - } - if (has_npc_chat_options_modal_open()) { - switch (keyCode) { - case 49: - { - const wrapper = document.getElementById("npc-chat-options-modal-content"); - const options = wrapper?.getElementsByTagName("div"); - if (options && options[0].style.display !== "none") { - options[0].click(); - } - } - break; - case 50: - { - const wrapper = document.getElementById("npc-chat-options-modal-content"); - const options = wrapper?.getElementsByTagName("div"); - if (options && options[1].style.display !== "none") { - options[1].click(); - } - } - break; - case 51: - { - const wrapper = document.getElementById("npc-chat-options-modal-content"); - const options = wrapper?.getElementsByTagName("div"); - if (options && options[2].style.display !== "none") { - options[2].click(); - } - } - break; - case 52: - { - const wrapper = document.getElementById("npc-chat-options-modal-content"); - const options = wrapper?.getElementsByTagName("div"); - if (options && options[3].style.display !== "none") { - options[3].click(); - } - } - break; - } - } -}; -var hotkeyListener = (e) => { - if (e.repeat) - return; - if (Globals.local_username == null) - return; - if (has_npc_chat_message_modal_open()) { - handleNpcChatModal(e); - return; - } - if (has_modal_open()) - return; - if (e.key === "Enter") { - focusOrSendChat(); - e.preventDefault(); - } - if (document.activeElement?.id !== "body") { - return; - } - if (e.key === "/") { - chat_ele.value = "/"; - request_focus_chatbox(); - e.preventDefault(); - } - const keypressString = keypressToHashableString(e); - if (keypressString in hashedHotkeyMap) { - const pressedHotkey = hashedHotkeyMap[keypressString]; - const action = ACTIONS[pressedHotkey.action]; - if (action) { - Globals.websocket.send(action.socketCommand); - e.preventDefault(); - } - } -}; -window.removeEventListener("keypress", keypress_listener); -window.addEventListener("keydown", hotkeyListener, false); diff --git a/out/current-action-ui.user.js b/out/current-action-ui.user.js deleted file mode 100644 index 627775a..0000000 --- a/out/current-action-ui.user.js +++ /dev/null @@ -1,183 +0,0 @@ -// ==UserScript== -// @name Custom Action UI -// @namespace Violentmonkey Scripts -// @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue -// @grant GM_registerMenuCommand -// @version 0.001250 -// @author Joshu -// @description ui tweaks to make it easier to tell at what action your character is doing -// @inject-into page -// ==/UserScript== - -// ../../nix/store/hmb7fbcyni0l66c42ds5hybm6nd585p6-current-action-ui/index.ts -var defaultConfig = { - x: 10, - y: 80, - height: 20, - width: TILE_SIZE * 2, - colors: { - activeBackgroundColor: "black", - activeForegroundColor: "purple", - activeStrokeColor: "green", - idleBackgroundColor: "black", - idleStrokeColor: "red" - } -}; -if (GM_getValue("config", null) === null) { - GM_setValue("config", config); -} -var config = GM_getValue("config", defaultConfig); -var handleChangeColor = (color, field) => { - config.colors[field] = color; - GM_setValue(`config`, config); -}; -var menuModal = ` -
    -

    Progress Bar Colors

    - -
    -

    Active State

    - -
    -
    - - -
    - -
    - - -
    - -
    - - -
    -
    -
    - -
    -

    Idle State

    - -
    -
    - - -
    - -
    - - -
    -
    -
    - -
    - Press Ctrl+Alt+M to toggle -
    -
    -`; -var modalContainer = document.createElement("div"); -modalContainer.innerHTML = menuModal; -document.body.appendChild(modalContainer); -var activeBackgroundInput = document.getElementById("activeBackground"); -var activeForegroundInput = document.getElementById("activeForeground"); -var activeStrokeInput = document.getElementById("activeStroke"); -var idleBackgroundInput = document.getElementById("idleBackground"); -var idleStrokeInput = document.getElementById("idleStroke"); -activeBackgroundInput?.addEventListener("input", (e) => { - handleChangeColor(e.target.value, "activeBackgroundColor"); -}); -activeForegroundInput?.addEventListener("input", (e) => { - handleChangeColor(e.target.value, "activeForegroundColor"); -}); -activeStrokeInput?.addEventListener("input", (e) => { - handleChangeColor(e.target.value, "activeStrokeColor"); -}); -idleBackgroundInput?.addEventListener("input", (e) => { - handleChangeColor(e.target.value, "idleBackgroundColor"); -}); -idleStrokeInput?.addEventListener("input", (e) => { - handleChangeColor(e.target.value, "idleStrokeColor"); -}); -function paintCustomProgressBar() { - const { x, y, height, width, colors } = config; - if (progress_bar_active) { - const perc = progress_bar_at / progress_bar_target; - ctx.fillStyle = colors.activeBackgroundColor; - ctx.fillRect(x, y - TILE_SIZE / 8, width, height); - ctx.fillStyle = colors.activeForegroundColor; - ctx.fillRect(x, y - TILE_SIZE / 8, width * perc, height); - ctx.strokeStyle = colors.activeStrokeColor; - ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); - } else { - ctx.fillStyle = colors.idleBackgroundColor; - ctx.fillRect(x, y - TILE_SIZE / 8, width, height); - ctx.strokeStyle = colors.idleStrokeColor; - ctx.strokeRect(x, y - TILE_SIZE / 8, width, height); - } -} -var paint_progress_bar_proxy = new Proxy(paint_progress_bar, { - apply(target, thisArg, argArray) { - paintCustomProgressBar(); - target(); - } -}); -window.addEventListener("keydown", moveBar); -window.addEventListener("keyup", setCoordinates); -unsafeWindow.paint_progress_bar = paint_progress_bar_proxy; -GM_registerMenuCommand("Reset to default settings", () => { - GM_setValue("config", defaultConfig); - config.colors = defaultConfig.colors; - config.height = defaultConfig.height; - config.width = defaultConfig.width; - config.x = defaultConfig.x; - config.y = defaultConfig.y; -}, {}); -GM_registerMenuCommand; -function moveBar(ev) { - if (ev.altKey && ev.ctrlKey && ev.key === "z") { - config.x = mouse_over_now.x; - config.y = mouse_over_now.y; - } - if (ev.altKey && ev.ctrlKey && ev.key === "j") { - config.width = config.width * 0.9; - config.height = config.height * 0.9; - } - if (ev.altKey && ev.ctrlKey && ev.key === "k") { - config.width = config.width * 1.1; - config.height = config.height * 1.1; - } - if (ev.altKey && ev.ctrlKey && ev.key === "m") { - const modal = document.getElementById("color-picker-modal"); - if (modal) { - modal.style.display = modal.style.display === "none" ? "block" : "none"; - } - } -} -function setCoordinates(ev) { - if (ev.altKey && ev.ctrlKey && ev.key === "z") { - GM_setValue("config", config); - } - if (ev.altKey && ev.ctrlKey && ev.key === "j") { - GM_setValue("config", config); - } - if (ev.altKey && ev.ctrlKey && ev.key === "k") { - GM_setValue("config", config); - } -} diff --git a/packages/static-userscript-index/favicon.png b/packages/static-userscript-index/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..f140c874313bc296430f3f3d660dc1f8e526e9d8 GIT binary patch literal 263 zcmeAS@N?(olHy`uVBq!ia0vp^Dj>|l3?zm1T2})pg=CK)Uj~LMH3o);76yi2K%s^g z3=E|P3=FRl7#OT(FffQ0%-I!a1C$U7@Ck7R()#LhK=S5-w0DPR{r~^JK+@_Ykk3>S z~;3W-<_qAE`p;{g quUVHr@%;G?u48{1Ugq literal 0 HcmV?d00001 diff --git a/packages/static-userscript-index/index.html b/packages/static-userscript-index/index.html index 2e8c986..1859980 100644 --- a/packages/static-userscript-index/index.html +++ b/packages/static-userscript-index/index.html @@ -1,13 +1,31 @@ - - - -

    Userscripts

    + + + + Flat Scripts + + + + + + +
    +

    Flatmmo Userscripts

    + +
    +
    - - +
    + + + \ No newline at end of file diff --git a/packages/static-userscript-index/write-html.ts b/packages/static-userscript-index/write-html.ts index c4c1b17..b1be55a 100644 --- a/packages/static-userscript-index/write-html.ts +++ b/packages/static-userscript-index/write-html.ts @@ -4,6 +4,8 @@ export const addScriptLinksRewriter = ( ) => { const rewriter = new HTMLRewriter().on("#script-list", { element(ul) { + // remove placeholder content + ul.setInnerContent(""); userscriptPaths.forEach((us) => { ul.append( ` From 9d27ded41568bec48f735f2510e6ff05005a968e Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 9 Jan 2026 17:28:51 -0500 Subject: [PATCH 52/87] added chat leading space fix scripb --- bun.lock | 10 ++++++++++ bun.nix | 1 + flake.nix | 5 +++++ packages/chat-space-fix/index.ts | 14 ++++++++++++++ packages/chat-space-fix/metadata.js | 11 +++++++++++ packages/chat-space-fix/package.json | 10 ++++++++++ 6 files changed, 51 insertions(+) create mode 100644 packages/chat-space-fix/index.ts create mode 100644 packages/chat-space-fix/metadata.js create mode 100644 packages/chat-space-fix/package.json diff --git a/bun.lock b/bun.lock index e71b382..3fccc58 100644 --- a/bun.lock +++ b/bun.lock @@ -20,6 +20,14 @@ "@workspace/flatmmo-types": "workspace:*", }, }, + "packages/chat-space-fix": { + "name": "@workspace/chat-space-fix", + "version": "1.0.0", + "devDependencies": { + "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*", + }, + }, "packages/current-action-ui": { "name": "@workspace/current-action-ui", "version": "1.0.0", @@ -42,6 +50,8 @@ "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], + "@workspace/chat-space-fix": ["@workspace/chat-space-fix@workspace:packages/chat-space-fix"], + "@workspace/current-action-ui": ["@workspace/current-action-ui@workspace:packages/current-action-ui"], "@workspace/flatmmo-types": ["@workspace/flatmmo-types@workspace:packages/flatmmo-types"], diff --git a/bun.nix b/bun.nix index d26870a..08dd835 100644 --- a/bun.nix +++ b/bun.nix @@ -26,6 +26,7 @@ hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; + "@workspace/chat-space-fix" = copyPathToStore ./packages/chat-space-fix; "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; "bun-types@1.3.4" = fetchurl { diff --git a/flake.nix b/flake.nix index 1e1c11a..8e75fbf 100644 --- a/flake.nix +++ b/flake.nix @@ -71,10 +71,15 @@ packageName = "current-action-ui"; packagePath = "packages/current-action-ui"; }; + chat-space-fix = pkgs.callPackage ./mkUserscript.nix { + packageName = "chat-space-fix"; + packagePath = "packages/chat-space-fix/"; + }; default = pkgs.callPackage ./mkStaticSite.nix { userscripts = [ current-action-ui better-custom-hotkeys + chat-space-fix ]; }; diff --git a/packages/chat-space-fix/index.ts b/packages/chat-space-fix/index.ts new file mode 100644 index 0000000..a0f4813 --- /dev/null +++ b/packages/chat-space-fix/index.ts @@ -0,0 +1,14 @@ +window.removeEventListener("keydown", keydown_listener); +window.addEventListener( + "keydown", + (e) => { + if (e.key.trim().length !== 0) return; + if (chat_ele.value.trimStart().length !== 0) return; + chat_ele.value = chat_ele.value.trimStart(); + + e.preventDefault(); + e.stopPropagation(); + }, + true, +); +window.addEventListener("keydown", keydown_listener); diff --git a/packages/chat-space-fix/metadata.js b/packages/chat-space-fix/metadata.js new file mode 100644 index 0000000..78b6d1b --- /dev/null +++ b/packages/chat-space-fix/metadata.js @@ -0,0 +1,11 @@ +// ==UserScript== +// @name Chat Leading Space Fix +// @namespace Violentmonkey Scripts +// @match https://flatmmo.com/play.php* +// @grant GM_getValue +// @grant GM_setValue +// @version 0.00132576 +// @author Joshu +// @description Fix chat with only space. +// @inject-into page +// ==/UserScript== diff --git a/packages/chat-space-fix/package.json b/packages/chat-space-fix/package.json new file mode 100644 index 0000000..1d22b01 --- /dev/null +++ b/packages/chat-space-fix/package.json @@ -0,0 +1,10 @@ +{ + "name": "@workspace/chat-space-fix", + "version": "1.0.0", + "module": "index.ts", + "dependencies": {}, + "devDependencies": { + "@violentmonkey/types": "^0.3.1", + "@workspace/flatmmo-types": "workspace:*" + } +} From addaaab09f7b0e7f078015aec822c360aa14818c Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 9 Jan 2026 20:48:41 -0500 Subject: [PATCH 53/87] fixed typo and uneeded permissions --- packages/chat-space-fix/metadata.js | 2 -- packages/flatmmo-types/flatmmo.d.ts | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/chat-space-fix/metadata.js b/packages/chat-space-fix/metadata.js index 78b6d1b..272a287 100644 --- a/packages/chat-space-fix/metadata.js +++ b/packages/chat-space-fix/metadata.js @@ -2,8 +2,6 @@ // @name Chat Leading Space Fix // @namespace Violentmonkey Scripts // @match https://flatmmo.com/play.php* -// @grant GM_getValue -// @grant GM_setValue // @version 0.00132576 // @author Joshu // @description Fix chat with only space. diff --git a/packages/flatmmo-types/flatmmo.d.ts b/packages/flatmmo-types/flatmmo.d.ts index ccc8998..90feaff 100644 --- a/packages/flatmmo-types/flatmmo.d.ts +++ b/packages/flatmmo-types/flatmmo.d.ts @@ -6,6 +6,7 @@ declare function has_npc_chat_message_modal_open(): boolean; declare function has_npc_chat_options_modal_open(): boolean; declare function has_modal_open(): boolean; declare function keypress_listener(): void; +declare function keydown_listener(): void; declare const chat_ele: HTMLInputElement; declare function paint_progress_bar(): void; From eac2bb2755d8fab1b197b16f1dd5984fcbe5237e Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 9 Jan 2026 21:25:34 -0500 Subject: [PATCH 54/87] updated flake to reduce boilerplate --- flake.nix | 38 ++++++++++++++++++-------------------- 1 file changed, 18 insertions(+), 20 deletions(-) diff --git a/flake.nix b/flake.nix index 8e75fbf..d1a2fb3 100644 --- a/flake.nix +++ b/flake.nix @@ -48,6 +48,20 @@ system, ... }: + let + userscriptNames = [ + "better-custom-hotkeys" + "current-action-ui" + "chat-space-fix" + ]; + mkFromName = + packageName: + pkgs.callPackage ./mkUserscript.nix { + inherit packageName; + packagePath = "packages/better-custom-hotkeys/"; + }; + userscriptAttrs = pkgs.lib.genAttrs userscriptNames mkFromName; + in { # This sets `pkgs` to a nixpkgs with allowUnfree option set. _module.args.pkgs = import nixpkgs { @@ -60,30 +74,14 @@ programs.biome.enable = true; }; - packages = rec { + packages = { # Produce a package for this template with bun2nix in # the overlay - better-custom-hotkeys = pkgs.callPackage ./mkUserscript.nix { - packageName = "better-custom-hotkeys"; - packagePath = "packages/better-custom-hotkeys/"; - }; - current-action-ui = pkgs.callPackage ./mkUserscript.nix { - packageName = "current-action-ui"; - packagePath = "packages/current-action-ui"; - }; - chat-space-fix = pkgs.callPackage ./mkUserscript.nix { - packageName = "chat-space-fix"; - packagePath = "packages/chat-space-fix/"; - }; default = pkgs.callPackage ./mkStaticSite.nix { - userscripts = [ - current-action-ui - better-custom-hotkeys - chat-space-fix - ]; + userscripts = pkgs.lib.attrValues userscriptAttrs; }; - - }; + } + // userscriptAttrs; devShells.default = pkgs.mkShell { nativeBuildInputs = with pkgs; [ bun From a3fd5a2072a74a68f78bb14428fa25fe1a2bfd1a Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 9 Jan 2026 21:50:18 -0500 Subject: [PATCH 55/87] formatting --- bun.nix | 40 ++++++++++++++++++++-------------------- flake.nix | 1 + 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/bun.nix b/bun.nix index 08dd835..b4d1b74 100644 --- a/bun.nix +++ b/bun.nix @@ -14,47 +14,47 @@ }: { "@types/bun@1.3.4" = fetchurl { - url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; - hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; + url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; + hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; }; "@types/node@25.0.2" = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-25.0.2.tgz"; - hash = "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="; + url = "https://registry.npmjs.org/@types/node/-/node-25.0.2.tgz"; + hash = "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="; }; "@violentmonkey/types@0.3.1" = fetchurl { - url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.1.tgz"; - hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; + url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.1.tgz"; + hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; "@workspace/chat-space-fix" = copyPathToStore ./packages/chat-space-fix; "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; "bun-types@1.3.4" = fetchurl { - url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; - hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; + url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; + hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; }; "bun2nix@2.0.0" = fetchurl { - url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; - hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; + url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; + hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; }; "mri@1.2.0" = fetchurl { - url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; - hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; + url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; + hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; }; "sade@1.8.1" = fetchurl { - url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; - hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; + url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; + hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; }; "typescript@5.9.3" = fetchurl { - url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; - hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; + url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; + hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; }; "undici-types@7.16.0" = fetchurl { - url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; - hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; + url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; + hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; }; "user-agent-data-types@0.4.2" = fetchurl { - url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; - hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; + url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; + hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; }; } diff --git a/flake.nix b/flake.nix index d1a2fb3..ae9e337 100644 --- a/flake.nix +++ b/flake.nix @@ -72,6 +72,7 @@ treefmt = { programs.biome.enable = true; + programs.nixfmt.enable = true; }; packages = { From 73f43404b27df0159f13a4da91820dc420c7f462 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 9 Jan 2026 21:54:30 -0500 Subject: [PATCH 56/87] bun.nix update --- bun.nix | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/bun.nix b/bun.nix index b4d1b74..08dd835 100644 --- a/bun.nix +++ b/bun.nix @@ -14,47 +14,47 @@ }: { "@types/bun@1.3.4" = fetchurl { - url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; - hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; + url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; + hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; }; "@types/node@25.0.2" = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-25.0.2.tgz"; - hash = "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="; + url = "https://registry.npmjs.org/@types/node/-/node-25.0.2.tgz"; + hash = "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="; }; "@violentmonkey/types@0.3.1" = fetchurl { - url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.1.tgz"; - hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; + url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.1.tgz"; + hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; "@workspace/chat-space-fix" = copyPathToStore ./packages/chat-space-fix; "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; "bun-types@1.3.4" = fetchurl { - url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; - hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; + url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; + hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; }; "bun2nix@2.0.0" = fetchurl { - url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; - hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; + url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; + hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; }; "mri@1.2.0" = fetchurl { - url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; - hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; + url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; + hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; }; "sade@1.8.1" = fetchurl { - url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; - hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; + url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; + hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; }; "typescript@5.9.3" = fetchurl { - url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; - hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; + url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; + hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; }; "undici-types@7.16.0" = fetchurl { - url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; - hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; + url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; + hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; }; "user-agent-data-types@0.4.2" = fetchurl { - url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; - hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; + url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; + hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; }; } From 07025cce08210a9c86d1a727b3d086208c0041fc Mon Sep 17 00:00:00 2001 From: josh-romer Date: Fri, 9 Jan 2026 22:00:22 -0500 Subject: [PATCH 57/87] properly ignored generated file for formatting lol --- flake.nix | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index ae9e337..0d77f76 100644 --- a/flake.nix +++ b/flake.nix @@ -72,7 +72,10 @@ treefmt = { programs.biome.enable = true; - programs.nixfmt.enable = true; + programs.nixfmt = { + enable = true; + excludes = [ "bun.nix" ]; + }; }; packages = { From a359a101147962f150a661b18ee44dbd1686607c Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sat, 10 Jan 2026 00:05:07 -0500 Subject: [PATCH 58/87] WIP dev watch --- flake.nix | 1 + package.json | 4 +++- packages/build/build.ts | 6 +++++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/flake.nix b/flake.nix index 0d77f76..85e334f 100644 --- a/flake.nix +++ b/flake.nix @@ -95,6 +95,7 @@ ]; shellHook = '' + export PACKAGESDIR=$(pwd)/packages/ bun install --frozen-lockfile ''; }; diff --git a/package.json b/package.json index dad7750..28d9d25 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,9 @@ "packages/*" ], "scripts": { - "postinstall": "bun2nix -o bun.nix" + "postinstall": "bun2nix -o bun.nix", + "build-static": "bun run packages/build/build.ts", + "dev": "bun run packages/build/dev-watch.ts" }, "devDependencies": { "@types/bun": "^1.3.4", diff --git a/packages/build/build.ts b/packages/build/build.ts index c6c76cd..b4a3e8f 100644 --- a/packages/build/build.ts +++ b/packages/build/build.ts @@ -1,7 +1,11 @@ import { buildStaticSite } from "../static-userscript-index/build-site"; import { buildScript } from "./build-userscript"; -const packageNames = ["better-custom-hotkeys", "current-action-ui"]; +const packageNames = [ + "better-custom-hotkeys", + "current-action-ui", + "chat-space-fix", +]; const userscriptInfo = packageNames.map((packageName) => ({ path: `./dist/userscripts/${packageName}.user.js`, From 83de82b623e266df5cbbe17950a12d7f892172ac Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sat, 10 Jan 2026 23:04:25 -0500 Subject: [PATCH 59/87] reduced boilerplate for dev env --- flake.nix | 1 + packages/build/build.ts | 7 ++----- packages/build/dev-watch.ts | 20 ++++++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 packages/build/dev-watch.ts diff --git a/flake.nix b/flake.nix index 85e334f..ed883aa 100644 --- a/flake.nix +++ b/flake.nix @@ -96,6 +96,7 @@ shellHook = '' export PACKAGESDIR=$(pwd)/packages/ + export USERSCRIPTS=${builtins.concatStringsSep "," userscriptNames} bun install --frozen-lockfile ''; }; diff --git a/packages/build/build.ts b/packages/build/build.ts index b4a3e8f..18d9921 100644 --- a/packages/build/build.ts +++ b/packages/build/build.ts @@ -1,11 +1,8 @@ import { buildStaticSite } from "../static-userscript-index/build-site"; import { buildScript } from "./build-userscript"; -const packageNames = [ - "better-custom-hotkeys", - "current-action-ui", - "chat-space-fix", -]; +const packageNames = process.env.USERSCRIPTS?.split(",") ?? []; +const names = ["better-custom-hotkeys", "current-action-ui", "chat-space-fix"]; const userscriptInfo = packageNames.map((packageName) => ({ path: `./dist/userscripts/${packageName}.user.js`, diff --git a/packages/build/dev-watch.ts b/packages/build/dev-watch.ts new file mode 100644 index 0000000..ba81fea --- /dev/null +++ b/packages/build/dev-watch.ts @@ -0,0 +1,20 @@ +import { watch } from "fs"; +import { $ } from "bun"; + +await $`bun run build-static`; // => "Hello, world!" +const watchDir = import.meta.env.PACKAGESDIR; +const watcher = watch( + watchDir, + { recursive: true }, + async (event, filename) => { + console.log(`Detected ${event} in ${filename}`); + await $`bun run build-static`; // => "Hello, world!" + }, +); + +process.on("SIGINT", () => { + // close watcher when Ctrl-C is pressed + watcher.close(); + + process.exit(0); +}); From 41c24e009e24e44bffe030e393160b2ea7ca004f Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 11 Jan 2026 00:18:07 -0500 Subject: [PATCH 60/87] WIP build updates for programatically setting metadata of scripts. --- flake.nix | 1 + packages/build/build-userscript.ts | 8 +++++--- packages/chat-space-fix/metadata.js | 2 +- packages/current-action-ui/metadata.js | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/flake.nix b/flake.nix index ed883aa..02ef2a9 100644 --- a/flake.nix +++ b/flake.nix @@ -97,6 +97,7 @@ shellHook = '' export PACKAGESDIR=$(pwd)/packages/ export USERSCRIPTS=${builtins.concatStringsSep "," userscriptNames} + export BUILD_ENV=dev bun install --frozen-lockfile ''; }; diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index 3a6f538..69752eb 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -3,9 +3,11 @@ export const buildScript = async (packageName: string) => { const { default: packageJson } = await import(`${packagePath}/package.json`, { with: { type: "jsonc" }, }); - const { default: metadata } = await import(`${packagePath}/metadata.js`, { - with: { type: "text" }, - }); + // Temp auto versioning + const version = `${Date.now()}${process.env.BUILD_ENV ?? ""}`; + const metadata = ( + await Bun.file(`./packages/${packageName}/metadata.js`).text() + ).replace(/VERSION/, version); return Bun.build({ entrypoints: [`./packages/${packageName}/${packageJson.module}`], banner: metadata, diff --git a/packages/chat-space-fix/metadata.js b/packages/chat-space-fix/metadata.js index 272a287..ba6c804 100644 --- a/packages/chat-space-fix/metadata.js +++ b/packages/chat-space-fix/metadata.js @@ -2,7 +2,7 @@ // @name Chat Leading Space Fix // @namespace Violentmonkey Scripts // @match https://flatmmo.com/play.php* -// @version 0.00132576 +// @version VERSION // @author Joshu // @description Fix chat with only space. // @inject-into page diff --git a/packages/current-action-ui/metadata.js b/packages/current-action-ui/metadata.js index 17578de..4df0f05 100644 --- a/packages/current-action-ui/metadata.js +++ b/packages/current-action-ui/metadata.js @@ -5,7 +5,7 @@ // @grant GM_getValue // @grant GM_setValue // @grant GM_registerMenuCommand -// @version 0.001250 +// @version VERSION // @author Joshu // @description ui tweaks to make it easier to tell at what action your character is doing // @inject-into page From ea194f6be2b72d6ec50cecef96ed63cc1e8369ef Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 11 Jan 2026 00:20:42 -0500 Subject: [PATCH 61/87] updated to version to be epoch based --- packages/better-custom-hotkeys/metadata.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/better-custom-hotkeys/metadata.js b/packages/better-custom-hotkeys/metadata.js index 621c665..ffd85d9 100644 --- a/packages/better-custom-hotkeys/metadata.js +++ b/packages/better-custom-hotkeys/metadata.js @@ -4,7 +4,7 @@ // @match https://flatmmo.com/play.php* // @grant GM_getValue // @grant GM_setValue -// @version 0.001 +// @version VERSION // @author Joshu // @description set the default f key shortcuts to regular keys, sets enter to toggle chat focus istead of always listening. // @inject-into page From 1154194eace37d850de5695fc527bf9cfdee05ea Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 13 Jan 2026 00:25:59 -0500 Subject: [PATCH 62/87] build updates --- bun.lock | 35 ++++++-------- bun.nix | 52 ++++++++------------- mkStaticSite.nix | 12 ++++- mkUserscript.nix | 21 ++++++--- package.json | 3 +- packages/better-custom-hotkeys/package.json | 2 +- packages/build/build.ts | 1 - packages/build/dev-watch.ts | 2 +- packages/chat-space-fix/package.json | 4 +- packages/current-action-ui/package.json | 2 +- packages/flatmmo-types/package.json | 2 +- tsconfig.json | 2 +- 12 files changed, 68 insertions(+), 70 deletions(-) diff --git a/bun.lock b/bun.lock index 3fccc58..a30ab33 100644 --- a/bun.lock +++ b/bun.lock @@ -1,14 +1,13 @@ { "lockfileVersion": 1, - "configVersion": 0, + "configVersion": 1, "workspaces": { "": { - "name": "test-workspace", + "name": "flatmmo-userscripts-workspace", "devDependencies": { "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*", - "bun2nix": "^2.0.0", + "flatmmo-types": "workspace:*", "typescript": "^5.9.3", }, }, @@ -17,15 +16,15 @@ "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*", + "flatmmo-types": "workspace:*", }, }, "packages/chat-space-fix": { - "name": "@workspace/chat-space-fix", + "name": "chat-space-fix", "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*", + "flatmmo-types": "workspace:*", }, }, "packages/current-action-ui": { @@ -33,36 +32,30 @@ "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*", + "flatmmo-types": "workspace:*", }, }, "packages/flatmmo-types": { - "name": "@workspace/flatmmo-types", + "name": "flatmmo-types", "version": "0.0.1", }, }, "packages": { - "@types/bun": ["@types/bun@1.3.4", "", { "dependencies": { "bun-types": "1.3.4" } }, "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="], + "@types/bun": ["@types/bun@1.3.5", "", { "dependencies": { "bun-types": "1.3.5" } }, "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="], - "@types/node": ["@types/node@25.0.2", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="], + "@types/node": ["@types/node@25.0.7", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w=="], - "@violentmonkey/types": ["@violentmonkey/types@0.3.1", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="], + "@violentmonkey/types": ["@violentmonkey/types@0.3.2", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="], "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], - "@workspace/chat-space-fix": ["@workspace/chat-space-fix@workspace:packages/chat-space-fix"], - "@workspace/current-action-ui": ["@workspace/current-action-ui@workspace:packages/current-action-ui"], - "@workspace/flatmmo-types": ["@workspace/flatmmo-types@workspace:packages/flatmmo-types"], - - "bun-types": ["bun-types@1.3.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="], - - "bun2nix": ["bun2nix@2.0.0", "", { "dependencies": { "sade": "^1.8.1" }, "bin": { "bun2nix": "index.ts" } }, "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="], + "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], - "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], + "chat-space-fix": ["chat-space-fix@workspace:packages/chat-space-fix"], - "sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="], + "flatmmo-types": ["flatmmo-types@workspace:packages/flatmmo-types"], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], diff --git a/bun.nix b/bun.nix index 08dd835..7ff9059 100644 --- a/bun.nix +++ b/bun.nix @@ -13,48 +13,36 @@ ... }: { - "@types/bun@1.3.4" = fetchurl { - url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.4.tgz"; - hash = "sha512-EEPTKXHP+zKGPkhRLv+HI0UEX8/o+65hqARxLy8Ov5rIxMBPNTjeZww00CIihrIQGEQBYg+0roO5qOnS/7boGA=="; + "@types/bun@1.3.5" = fetchurl { + url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.5.tgz"; + hash = "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="; }; - "@types/node@25.0.2" = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-25.0.2.tgz"; - hash = "sha512-gWEkeiyYE4vqjON/+Obqcoeffmk0NF15WSBwSs7zwVA2bAbTaE0SJ7P0WNGoJn8uE7fiaV5a7dKYIJriEqOrmA=="; + "@types/node@25.0.7" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-25.0.7.tgz"; + hash = "sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w=="; }; - "@violentmonkey/types@0.3.1" = fetchurl { - url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.1.tgz"; - hash = "sha512-40pq15SRSgTU5JAL0f6NabSH5Q6OIgm2IUF1j0eSm1QMkJgsH/bNU72qW2QNAPa9MSRnoyfKoiY0bcDdnztIMw=="; + "@violentmonkey/types@0.3.2" = fetchurl { + url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.2.tgz"; + hash = "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="; }; "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; - "@workspace/chat-space-fix" = copyPathToStore ./packages/chat-space-fix; "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; - "@workspace/flatmmo-types" = copyPathToStore ./packages/flatmmo-types; - "bun-types@1.3.4" = fetchurl { - url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.4.tgz"; - hash = "sha512-5ua817+BZPZOlNaRgGBpZJOSAQ9RQ17pkwPD0yR7CfJg+r8DgIILByFifDTa+IPDDxzf5VNhtNlcKqFzDgJvlQ=="; - }; - "bun2nix@2.0.0" = fetchurl { - url = "https://registry.npmjs.org/bun2nix/-/bun2nix-2.0.0.tgz"; - hash = "sha512-PCMrscGu/uEYQiG0jBZKf1ZM5nrpqYLjZNV+g4UQiGokakWsYrLaKRma4FqbxxwZ8s2VZXBkOyCn7U3Q/Bybjg=="; - }; - "mri@1.2.0" = fetchurl { - url = "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz"; - hash = "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="; - }; - "sade@1.8.1" = fetchurl { - url = "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz"; - hash = "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="; + "bun-types@1.3.5" = fetchurl { + url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.5.tgz"; + hash = "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="; }; + "chat-space-fix" = copyPathToStore ./packages/chat-space-fix; + "flatmmo-types" = copyPathToStore ./packages/flatmmo-types; "typescript@5.9.3" = fetchurl { - url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; - hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; + url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; + hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; }; "undici-types@7.16.0" = fetchurl { - url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; - hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; + url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; + hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; }; "user-agent-data-types@0.4.2" = fetchurl { - url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; - hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; + url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; + hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; }; } diff --git a/mkStaticSite.nix b/mkStaticSite.nix index e13048f..016d4f7 100644 --- a/mkStaticSite.nix +++ b/mkStaticSite.nix @@ -6,6 +6,7 @@ ... }: let + inherit (lib.fileset) toSource unions; pname = "username-index-site"; version = "0.0.1"; userscript-metadata = ( @@ -19,7 +20,16 @@ in stdenv.mkDerivation { inherit pname version; - src = ./.; + src = toSource { + root = ./.; + fileset = unions [ + ./package.json + ./packages + ./bun.nix + ./bun.lock + ./bunfig.toml + ]; + }; nativeBuildInputs = [ bun2nix.hook diff --git a/mkUserscript.nix b/mkUserscript.nix index f036e5e..34614ac 100644 --- a/mkUserscript.nix +++ b/mkUserscript.nix @@ -2,30 +2,39 @@ bun2nix, stdenv, packageName, + lib, ... }: let - # pkgJsonContents = builtins.readFile "${packagePath}/package.json"; - # package = builtins.fromJSON pkgJsonContents; + inherit (lib.fileset) toSource unions; pname = packageName; version = "1.0.0"; - # inherit (package) version; + build-script = "./packages/build/build-userscript-cli.ts"; in stdenv.mkDerivation { inherit pname version; - src = ./.; - + src = toSource { + root = ./.; + fileset = unions [ + ./package.json + ./packages + ./bun.nix + ./bun.lock + ./bunfig.toml + ]; + }; nativeBuildInputs = [ bun2nix.hook ]; + dontRunLifecycleScripts = true; bunDeps = bun2nix.fetchBunDeps { bunNix = ./bun.nix; }; buildPhase = '' - bun ./packages/build/build-userscript-cli.ts --scriptName=${packageName} + bun ${build-script} --scriptName=${packageName} ''; installPhase = '' diff --git a/package.json b/package.json index 28d9d25..7aaa0ea 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,7 @@ "devDependencies": { "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*", - "bun2nix": "^2.0.0", + "flatmmo-types": "workspace:*", "typescript": "^5.9.3" } } diff --git a/packages/better-custom-hotkeys/package.json b/packages/better-custom-hotkeys/package.json index b57e9d6..425444c 100644 --- a/packages/better-custom-hotkeys/package.json +++ b/packages/better-custom-hotkeys/package.json @@ -5,6 +5,6 @@ "dependencies": {}, "devDependencies": { "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*" + "flatmmo-types": "workspace:*" } } diff --git a/packages/build/build.ts b/packages/build/build.ts index 18d9921..2c32269 100644 --- a/packages/build/build.ts +++ b/packages/build/build.ts @@ -2,7 +2,6 @@ import { buildStaticSite } from "../static-userscript-index/build-site"; import { buildScript } from "./build-userscript"; const packageNames = process.env.USERSCRIPTS?.split(",") ?? []; -const names = ["better-custom-hotkeys", "current-action-ui", "chat-space-fix"]; const userscriptInfo = packageNames.map((packageName) => ({ path: `./dist/userscripts/${packageName}.user.js`, diff --git a/packages/build/dev-watch.ts b/packages/build/dev-watch.ts index ba81fea..e37f084 100644 --- a/packages/build/dev-watch.ts +++ b/packages/build/dev-watch.ts @@ -1,5 +1,5 @@ -import { watch } from "fs"; import { $ } from "bun"; +import { watch } from "fs"; await $`bun run build-static`; // => "Hello, world!" const watchDir = import.meta.env.PACKAGESDIR; diff --git a/packages/chat-space-fix/package.json b/packages/chat-space-fix/package.json index 1d22b01..3418016 100644 --- a/packages/chat-space-fix/package.json +++ b/packages/chat-space-fix/package.json @@ -1,10 +1,10 @@ { - "name": "@workspace/chat-space-fix", + "name": "chat-space-fix", "version": "1.0.0", "module": "index.ts", "dependencies": {}, "devDependencies": { "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*" + "flatmmo-types": "workspace:*" } } diff --git a/packages/current-action-ui/package.json b/packages/current-action-ui/package.json index 631bca9..3ec40aa 100644 --- a/packages/current-action-ui/package.json +++ b/packages/current-action-ui/package.json @@ -5,6 +5,6 @@ "dependencies": {}, "devDependencies": { "@violentmonkey/types": "^0.3.1", - "@workspace/flatmmo-types": "workspace:*" + "flatmmo-types": "workspace:*" } } diff --git a/packages/flatmmo-types/package.json b/packages/flatmmo-types/package.json index 0ab88c7..48cc5cc 100644 --- a/packages/flatmmo-types/package.json +++ b/packages/flatmmo-types/package.json @@ -1,5 +1,5 @@ { - "name": "@workspace/flatmmo-types", + "name": "flatmmo-types", "version": "0.0.1", "dependencies": {}, "devDependencies": {} diff --git a/tsconfig.json b/tsconfig.json index 5ad8c1f..a5403f9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,7 +7,7 @@ "moduleDetection": "force", "jsx": "react-jsx", "allowJs": true, - "types": ["@violentmonkey/types", "bun", "@workspace/flatmmo-types"], + "types": ["@violentmonkey/types", "bun", "flatmmo-types"], // Bundler mode "moduleResolution": "bundler", From bbc724c35f0daf59cf1a4c8f6b5d0e096c9a0453 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Wed, 14 Jan 2026 23:30:36 -0500 Subject: [PATCH 63/87] wip script metadata generation changes --- bun.lock | 84 ++++++++- bun.nix | 150 +++++++++++++-- mkStaticSite.nix | 4 +- package.json | 4 + packages/better-custom-hotkeys/package.json | 2 +- packages/build/UserscriptMetadata.ts | 192 ++++++++++++++++++++ packages/build/build-userscript.ts | 80 ++++++-- packages/current-action-ui/package.json | 2 +- 8 files changed, 480 insertions(+), 38 deletions(-) create mode 100644 packages/build/UserscriptMetadata.ts diff --git a/bun.lock b/bun.lock index a30ab33..b18811d 100644 --- a/bun.lock +++ b/bun.lock @@ -4,6 +4,10 @@ "workspaces": { "": { "name": "flatmmo-userscripts-workspace", + "dependencies": { + "effect": "^3.19.14", + "oxc-parser": "^0.108.0", + }, "devDependencies": { "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", @@ -12,7 +16,7 @@ }, }, "packages/better-custom-hotkeys": { - "name": "@workspace/better-custom-hotkeys", + "name": "better-custom-hotkeys", "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", @@ -28,7 +32,7 @@ }, }, "packages/current-action-ui": { - "name": "@workspace/current-action-ui", + "name": "current-action-ui", "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", @@ -41,22 +45,86 @@ }, }, "packages": { - "@types/bun": ["@types/bun@1.3.5", "", { "dependencies": { "bun-types": "1.3.5" } }, "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="], + "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], - "@types/node": ["@types/node@25.0.7", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w=="], + "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], - "@violentmonkey/types": ["@violentmonkey/types@0.3.2", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], + + "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.108.0", "", { "os": "android", "cpu": "arm" }, "sha512-TemaHZYErFqspRHfsGb1dvWICigOciP4xKlcBVvO8znkHzdJGWbtPwqQc5f1cfrdFynctXIzRQh3qizzQJMqpg=="], + + "@oxc-parser/binding-android-arm64": ["@oxc-parser/binding-android-arm64@0.108.0", "", { "os": "android", "cpu": "arm64" }, "sha512-dnsD8uS2FaqpTv+AKCN3iVSRiWvR0PsrSqJCy4Z4+E4YLTpD0Ui9IYFSeu1rZVxwJUnCXs4j56dvZ4LO2NUv7A=="], + + "@oxc-parser/binding-darwin-arm64": ["@oxc-parser/binding-darwin-arm64@0.108.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-EPKhTey/qzezNIRot95CUMLGmK6sn9bDWgdfWSYCUXv9AwJJNjc6klRf3bslQTN35fyFXz/EM6Z9gD45YXcj0g=="], + + "@oxc-parser/binding-darwin-x64": ["@oxc-parser/binding-darwin-x64@0.108.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-vhBov136GRb03/v0FmcgC2voAfNv89vOeUs5I64yvWqc3EFI9/Ja2jp1+982RGp6+wfVUKSDTymUOkAS8STGDA=="], + + "@oxc-parser/binding-freebsd-x64": ["@oxc-parser/binding-freebsd-x64@0.108.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-TbFhRqPzck2IGmJBrD/+SWGIv3NaimcAZySmi9dqG7aiMyhbt/XOMVith6cmuoSWcZDrEJiBr7RNQ/aW7YhsDQ=="], + + "@oxc-parser/binding-linux-arm-gnueabihf": ["@oxc-parser/binding-linux-arm-gnueabihf@0.108.0", "", { "os": "linux", "cpu": "arm" }, "sha512-X8BRbNGAM8t4oLmgp9mANZhN/rLcBledr33BT9BpCJwcIjZbPxPlQHmj/JuM4Ww6wYNeWWpeZCCKp4uDQHE06A=="], + + "@oxc-parser/binding-linux-arm-musleabihf": ["@oxc-parser/binding-linux-arm-musleabihf@0.108.0", "", { "os": "linux", "cpu": "arm" }, "sha512-FtQwtAg/N/LqqSwSNsWu1TEywOETQwHXuHDYzIpa3DwvRPWYTlqLta6OPaXfAxqj5Iiy95GiZPf+dOb77mn5gQ=="], + + "@oxc-parser/binding-linux-arm64-gnu": ["@oxc-parser/binding-linux-arm64-gnu@0.108.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-+oP0UaHHIKx/VtREFuB/m0EyZKKHt+8/LUL9hSdqakNByD9CFg2i1Fu98x+pAOPYn0C8WiTzJLoaClhLBJYKdA=="], + + "@oxc-parser/binding-linux-arm64-musl": ["@oxc-parser/binding-linux-arm64-musl@0.108.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-s45g0+UDL7fR9z+WewuA0YEwZWJrpL+Nma4Xay20TGMnYnUsl7H5E0te+1ovLIeBMVK6CKUFg1A0AUqxaSagmg=="], + + "@oxc-parser/binding-linux-ppc64-gnu": ["@oxc-parser/binding-linux-ppc64-gnu@0.108.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-h4ExnKtDzlZy577LxVL0N7XOyyn+UUqmSCzz/HPk3RwPEEL1YXZFPEcW1tYqXZnSZmBfmGxw9svSeTJlH37czw=="], + + "@oxc-parser/binding-linux-riscv64-gnu": ["@oxc-parser/binding-linux-riscv64-gnu@0.108.0", "", { "os": "linux", "cpu": "none" }, "sha512-gi7fGSz6tiR8BIkN6JaQ0vjH6QGfAXB402lyKS6y5RcEBDnfrBAymYyjZJ3bQPV5rbev7YD/KzY0hJrNDQqUmQ=="], + + "@oxc-parser/binding-linux-riscv64-musl": ["@oxc-parser/binding-linux-riscv64-musl@0.108.0", "", { "os": "linux", "cpu": "none" }, "sha512-c44OgBdt3FE9P+OyboIYObg/2eejsor90wQM6A8fEZzi2CCJJzPeXEQDsdVIJBpSla5b2HkDeB5FJpEHyhMZyw=="], + + "@oxc-parser/binding-linux-s390x-gnu": ["@oxc-parser/binding-linux-s390x-gnu@0.108.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-MMPAQSxaHwsDNMOc3b+RIcqSnQWWOVYCFl2nuOvz2OxA1MHA2xvkB2w8B6QxnM5r4ikA6d/yydpvOynNugnJoA=="], + + "@oxc-parser/binding-linux-x64-gnu": ["@oxc-parser/binding-linux-x64-gnu@0.108.0", "", { "os": "linux", "cpu": "x64" }, "sha512-uao/CmiUkSrfIF4WIT0c/mh+PqwIzux43/Q8NZvJrn4KLZaKR8veGPsJjUBN5igJerh+I5XJ4tjtYbFJV1So+A=="], + + "@oxc-parser/binding-linux-x64-musl": ["@oxc-parser/binding-linux-x64-musl@0.108.0", "", { "os": "linux", "cpu": "x64" }, "sha512-5TTi3ohehU+VLTbq3g8XYpyrjsmQHaaicOvVgOh+3QGWm3x0JLsYZ+Pa23oHj++dBbYnhYKB+O1KwOoNIibtVg=="], - "@workspace/better-custom-hotkeys": ["@workspace/better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], + "@oxc-parser/binding-openharmony-arm64": ["@oxc-parser/binding-openharmony-arm64@0.108.0", "", { "os": "none", "cpu": "arm64" }, "sha512-YTNJnBoyVSNdGG9xmvfi8mzLDbHqlOKHrYzGvORFPFImBj3VYfQXEYJ2v2rp5eQ8B+wffPg+8+IE2GQLLQ2B2A=="], - "@workspace/current-action-ui": ["@workspace/current-action-ui@workspace:packages/current-action-ui"], + "@oxc-parser/binding-wasm32-wasi": ["@oxc-parser/binding-wasm32-wasi@0.108.0", "", { "dependencies": { "@napi-rs/wasm-runtime": "^1.1.1" }, "cpu": "none" }, "sha512-zzalhAJT9PA6HdXtzfcDOvP9nXN/vBLswPtPBR7bFTsjowIcclHSBi8aj34pbhDABcmJeFPdwe+o2o4Midv25Q=="], - "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], + "@oxc-parser/binding-win32-arm64-msvc": ["@oxc-parser/binding-win32-arm64-msvc@0.108.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-VZwk6B8MYzPrhrQLlfkMb3lXhLvOxf/mR5BG299EgqlHIu7/NS/KNCoX7cXtDdlghNmChfu/G6vEdjYOyyERgg=="], + + "@oxc-parser/binding-win32-ia32-msvc": ["@oxc-parser/binding-win32-ia32-msvc@0.108.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-pjZlfs7k41Ui/tL9ibOn1wA3b6/ow7ugQBSPU8etQnUv5qTB+TxZLQvxtV0lJI4wVRSUuwM709ngrjctFtix0g=="], + + "@oxc-parser/binding-win32-x64-msvc": ["@oxc-parser/binding-win32-x64-msvc@0.108.0", "", { "os": "win32", "cpu": "x64" }, "sha512-3yUPthhhF6BelQKfuOiyFO5/MRYmuSc2fK6if/ft84D1sp8lX7hvuDl+/90owmls1N4rGGS/Jp9R5YlJXzQ8nQ=="], + + "@oxc-project/types": ["@oxc-project/types@0.108.0", "", {}, "sha512-7lf13b2IA/kZO6xgnIZA88sq3vwrxWk+2vxf6cc+omwYCRTiA5e63Beqf3fz/v8jEviChWWmFYBwzfSeyrsj7Q=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], + + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + + "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="], + + "@types/node": ["@types/node@25.0.8", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg=="], + + "@violentmonkey/types": ["@violentmonkey/types@0.3.2", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="], + + "better-custom-hotkeys": ["better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], + + "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], "chat-space-fix": ["chat-space-fix@workspace:packages/chat-space-fix"], + "current-action-ui": ["current-action-ui@workspace:packages/current-action-ui"], + + "effect": ["effect@3.19.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="], + + "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], + "flatmmo-types": ["flatmmo-types@workspace:packages/flatmmo-types"], + "oxc-parser": ["oxc-parser@0.108.0", "", { "dependencies": { "@oxc-project/types": "^0.108.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.108.0", "@oxc-parser/binding-android-arm64": "0.108.0", "@oxc-parser/binding-darwin-arm64": "0.108.0", "@oxc-parser/binding-darwin-x64": "0.108.0", "@oxc-parser/binding-freebsd-x64": "0.108.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.108.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.108.0", "@oxc-parser/binding-linux-arm64-gnu": "0.108.0", "@oxc-parser/binding-linux-arm64-musl": "0.108.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-musl": "0.108.0", "@oxc-parser/binding-linux-s390x-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-musl": "0.108.0", "@oxc-parser/binding-openharmony-arm64": "0.108.0", "@oxc-parser/binding-wasm32-wasi": "0.108.0", "@oxc-parser/binding-win32-arm64-msvc": "0.108.0", "@oxc-parser/binding-win32-ia32-msvc": "0.108.0", "@oxc-parser/binding-win32-x64-msvc": "0.108.0" } }, "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="], + + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], + "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], diff --git a/bun.nix b/bun.nix index 7ff9059..397ff12 100644 --- a/bun.nix +++ b/bun.nix @@ -13,26 +13,154 @@ ... }: { - "@types/bun@1.3.5" = fetchurl { - url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.5.tgz"; - hash = "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="; + "@emnapi/core@1.8.1" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz"; + hash = "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="; }; - "@types/node@25.0.7" = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-25.0.7.tgz"; - hash = "sha512-C/er7DlIZgRJO7WtTdYovjIFzGsz0I95UlMyR9anTb4aCpBSRWe5Jc1/RvLKUfzmOxHPGjSE5+63HgLtndxU4w=="; + "@emnapi/runtime@1.8.1" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz"; + hash = "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="; + }; + "@emnapi/wasi-threads@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz"; + hash = "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="; + }; + "@napi-rs/wasm-runtime@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz"; + hash = "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="; + }; + "@oxc-parser/binding-android-arm-eabi@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-android-arm-eabi/-/binding-android-arm-eabi-0.108.0.tgz"; + hash = "sha512-TemaHZYErFqspRHfsGb1dvWICigOciP4xKlcBVvO8znkHzdJGWbtPwqQc5f1cfrdFynctXIzRQh3qizzQJMqpg=="; + }; + "@oxc-parser/binding-android-arm64@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-android-arm64/-/binding-android-arm64-0.108.0.tgz"; + hash = "sha512-dnsD8uS2FaqpTv+AKCN3iVSRiWvR0PsrSqJCy4Z4+E4YLTpD0Ui9IYFSeu1rZVxwJUnCXs4j56dvZ4LO2NUv7A=="; + }; + "@oxc-parser/binding-darwin-arm64@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.108.0.tgz"; + hash = "sha512-EPKhTey/qzezNIRot95CUMLGmK6sn9bDWgdfWSYCUXv9AwJJNjc6klRf3bslQTN35fyFXz/EM6Z9gD45YXcj0g=="; + }; + "@oxc-parser/binding-darwin-x64@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-darwin-x64/-/binding-darwin-x64-0.108.0.tgz"; + hash = "sha512-vhBov136GRb03/v0FmcgC2voAfNv89vOeUs5I64yvWqc3EFI9/Ja2jp1+982RGp6+wfVUKSDTymUOkAS8STGDA=="; + }; + "@oxc-parser/binding-freebsd-x64@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-freebsd-x64/-/binding-freebsd-x64-0.108.0.tgz"; + hash = "sha512-TbFhRqPzck2IGmJBrD/+SWGIv3NaimcAZySmi9dqG7aiMyhbt/XOMVith6cmuoSWcZDrEJiBr7RNQ/aW7YhsDQ=="; + }; + "@oxc-parser/binding-linux-arm-gnueabihf@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.108.0.tgz"; + hash = "sha512-X8BRbNGAM8t4oLmgp9mANZhN/rLcBledr33BT9BpCJwcIjZbPxPlQHmj/JuM4Ww6wYNeWWpeZCCKp4uDQHE06A=="; + }; + "@oxc-parser/binding-linux-arm-musleabihf@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.108.0.tgz"; + hash = "sha512-FtQwtAg/N/LqqSwSNsWu1TEywOETQwHXuHDYzIpa3DwvRPWYTlqLta6OPaXfAxqj5Iiy95GiZPf+dOb77mn5gQ=="; + }; + "@oxc-parser/binding-linux-arm64-gnu@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.108.0.tgz"; + hash = "sha512-+oP0UaHHIKx/VtREFuB/m0EyZKKHt+8/LUL9hSdqakNByD9CFg2i1Fu98x+pAOPYn0C8WiTzJLoaClhLBJYKdA=="; + }; + "@oxc-parser/binding-linux-arm64-musl@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.108.0.tgz"; + hash = "sha512-s45g0+UDL7fR9z+WewuA0YEwZWJrpL+Nma4Xay20TGMnYnUsl7H5E0te+1ovLIeBMVK6CKUFg1A0AUqxaSagmg=="; + }; + "@oxc-parser/binding-linux-ppc64-gnu@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.108.0.tgz"; + hash = "sha512-h4ExnKtDzlZy577LxVL0N7XOyyn+UUqmSCzz/HPk3RwPEEL1YXZFPEcW1tYqXZnSZmBfmGxw9svSeTJlH37czw=="; + }; + "@oxc-parser/binding-linux-riscv64-gnu@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.108.0.tgz"; + hash = "sha512-gi7fGSz6tiR8BIkN6JaQ0vjH6QGfAXB402lyKS6y5RcEBDnfrBAymYyjZJ3bQPV5rbev7YD/KzY0hJrNDQqUmQ=="; + }; + "@oxc-parser/binding-linux-riscv64-musl@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.108.0.tgz"; + hash = "sha512-c44OgBdt3FE9P+OyboIYObg/2eejsor90wQM6A8fEZzi2CCJJzPeXEQDsdVIJBpSla5b2HkDeB5FJpEHyhMZyw=="; + }; + "@oxc-parser/binding-linux-s390x-gnu@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.108.0.tgz"; + hash = "sha512-MMPAQSxaHwsDNMOc3b+RIcqSnQWWOVYCFl2nuOvz2OxA1MHA2xvkB2w8B6QxnM5r4ikA6d/yydpvOynNugnJoA=="; + }; + "@oxc-parser/binding-linux-x64-gnu@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.108.0.tgz"; + hash = "sha512-uao/CmiUkSrfIF4WIT0c/mh+PqwIzux43/Q8NZvJrn4KLZaKR8veGPsJjUBN5igJerh+I5XJ4tjtYbFJV1So+A=="; + }; + "@oxc-parser/binding-linux-x64-musl@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-linux-x64-musl/-/binding-linux-x64-musl-0.108.0.tgz"; + hash = "sha512-5TTi3ohehU+VLTbq3g8XYpyrjsmQHaaicOvVgOh+3QGWm3x0JLsYZ+Pa23oHj++dBbYnhYKB+O1KwOoNIibtVg=="; + }; + "@oxc-parser/binding-openharmony-arm64@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-openharmony-arm64/-/binding-openharmony-arm64-0.108.0.tgz"; + hash = "sha512-YTNJnBoyVSNdGG9xmvfi8mzLDbHqlOKHrYzGvORFPFImBj3VYfQXEYJ2v2rp5eQ8B+wffPg+8+IE2GQLLQ2B2A=="; + }; + "@oxc-parser/binding-wasm32-wasi@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-wasm32-wasi/-/binding-wasm32-wasi-0.108.0.tgz"; + hash = "sha512-zzalhAJT9PA6HdXtzfcDOvP9nXN/vBLswPtPBR7bFTsjowIcclHSBi8aj34pbhDABcmJeFPdwe+o2o4Midv25Q=="; + }; + "@oxc-parser/binding-win32-arm64-msvc@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.108.0.tgz"; + hash = "sha512-VZwk6B8MYzPrhrQLlfkMb3lXhLvOxf/mR5BG299EgqlHIu7/NS/KNCoX7cXtDdlghNmChfu/G6vEdjYOyyERgg=="; + }; + "@oxc-parser/binding-win32-ia32-msvc@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.108.0.tgz"; + hash = "sha512-pjZlfs7k41Ui/tL9ibOn1wA3b6/ow7ugQBSPU8etQnUv5qTB+TxZLQvxtV0lJI4wVRSUuwM709ngrjctFtix0g=="; + }; + "@oxc-parser/binding-win32-x64-msvc@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-parser/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.108.0.tgz"; + hash = "sha512-3yUPthhhF6BelQKfuOiyFO5/MRYmuSc2fK6if/ft84D1sp8lX7hvuDl+/90owmls1N4rGGS/Jp9R5YlJXzQ8nQ=="; + }; + "@oxc-project/types@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/@oxc-project/types/-/types-0.108.0.tgz"; + hash = "sha512-7lf13b2IA/kZO6xgnIZA88sq3vwrxWk+2vxf6cc+omwYCRTiA5e63Beqf3fz/v8jEviChWWmFYBwzfSeyrsj7Q=="; + }; + "@standard-schema/spec@1.1.0" = fetchurl { + url = "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz"; + hash = "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="; + }; + "@tybys/wasm-util@0.10.1" = fetchurl { + url = "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz"; + hash = "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="; + }; + "@types/bun@1.3.6" = fetchurl { + url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.6.tgz"; + hash = "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="; + }; + "@types/node@25.0.8" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-25.0.8.tgz"; + hash = "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg=="; }; "@violentmonkey/types@0.3.2" = fetchurl { url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.2.tgz"; hash = "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="; }; - "@workspace/better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; - "@workspace/current-action-ui" = copyPathToStore ./packages/current-action-ui; - "bun-types@1.3.5" = fetchurl { - url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.5.tgz"; - hash = "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="; + "better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; + "bun-types@1.3.6" = fetchurl { + url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.6.tgz"; + hash = "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="; }; "chat-space-fix" = copyPathToStore ./packages/chat-space-fix; + "current-action-ui" = copyPathToStore ./packages/current-action-ui; + "effect@3.19.14" = fetchurl { + url = "https://registry.npmjs.org/effect/-/effect-3.19.14.tgz"; + hash = "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="; + }; + "fast-check@3.23.2" = fetchurl { + url = "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz"; + hash = "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="; + }; "flatmmo-types" = copyPathToStore ./packages/flatmmo-types; + "oxc-parser@0.108.0" = fetchurl { + url = "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.108.0.tgz"; + hash = "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="; + }; + "pure-rand@6.1.0" = fetchurl { + url = "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz"; + hash = "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="; + }; + "tslib@2.8.1" = fetchurl { + url = "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"; + hash = "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="; + }; "typescript@5.9.3" = fetchurl { url = "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz"; hash = "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="; diff --git a/mkStaticSite.nix b/mkStaticSite.nix index 016d4f7..c3e6333 100644 --- a/mkStaticSite.nix +++ b/mkStaticSite.nix @@ -33,10 +33,8 @@ stdenv.mkDerivation { nativeBuildInputs = [ bun2nix.hook - ] - ++ userscripts; + ]; - buildInputs = userscripts; bunDeps = bun2nix.fetchBunDeps { bunNix = ./bun.nix; diff --git a/package.json b/package.json index 7aaa0ea..729dafc 100644 --- a/package.json +++ b/package.json @@ -13,5 +13,9 @@ "@violentmonkey/types": "^0.3.1", "flatmmo-types": "workspace:*", "typescript": "^5.9.3" + }, + "dependencies": { + "effect": "^3.19.14", + "oxc-parser": "^0.108.0" } } diff --git a/packages/better-custom-hotkeys/package.json b/packages/better-custom-hotkeys/package.json index 425444c..5a4ec2e 100644 --- a/packages/better-custom-hotkeys/package.json +++ b/packages/better-custom-hotkeys/package.json @@ -1,5 +1,5 @@ { - "name": "@workspace/better-custom-hotkeys", + "name": "better-custom-hotkeys", "version": "1.0.0", "module": "index.ts", "dependencies": {}, diff --git a/packages/build/UserscriptMetadata.ts b/packages/build/UserscriptMetadata.ts new file mode 100644 index 0000000..c212599 --- /dev/null +++ b/packages/build/UserscriptMetadata.ts @@ -0,0 +1,192 @@ +/** + * Violentmonkey userscript metadata + */ + +type LocaleKey = `${"name" | "description"}:${string}`; +export type ViolentmonkeyMetadata = { + /** + * The name of the script (required) + * Can include language variants using suffix (e.g., 'name:zh-CN') + */ + name: string; + + [locales: LocaleKey]: string; + + /** + * Namespace for the script (defaults to empty string if not provided) + * Combination of namespace and name creates unique identifier + */ + namespace?: string; + + /** + * Match patterns to decide when script should execute (recommended over @include) + */ + match?: string[]; + + /** + * Exclude match patterns + */ + "exclude-match"?: string[]; + + /** + * Include patterns (old way, prefer @match) + */ + include?: string[]; + + /** + * Exclude patterns + */ + exclude?: string[]; + + /** + * Script version (required for auto-updates) + * Format: numeric parts joined by dots, optionally followed by letters + * @example '1.0', '1.2a.3' + */ + version?: string; + + /** + * Brief description of the script + */ + description?: string; + + /** + * Icon URL for the script + */ + icon?: string; + + /** + * URLs of scripts to load before this one + */ + require?: string[]; + + /** + * Static resources accessible via GM_getResourceText/GM_getResourceURL + */ + resource?: Array<{ + name: string; + url: string; + }>; + + /** + * When the script should run + */ + "run-at"?: + | "document-start" + | "document-body" + | "document-end" + | "document-idle"; + + /** + * If true, script only runs in top-level document, not nested frames + */ + noframes?: boolean; + + /** + * Special APIs and privileges to grant + * Use 'none' to disable sandbox, or specify individual APIs + * @example ['GM_getValue', 'GM_setValue', 'GM.getValue', 'window.close'] + */ + grant?: string[] | ["none"]; + + /** + * Context to inject the script into + */ + "inject-into"?: "page" | "content" | "auto"; + + /** + * URL where script can be downloaded for updates + */ + downloadURL?: string; + + /** + * URL for support/help (linked via question mark icon) + */ + supportURL?: string; + + /** + * URL for script homepage (linked via home icon) + */ + homepageURL?: string; + + /** + * If true, inject script without wrapper into global scope (since VM2.13.1) + * Disables GM API access, can't be used with @top-level-await + */ + unwrap?: boolean; + + /** + * Enables top-level await in script (since VM2.19.2) + * Can't be used with @unwrap + */ + "top-level-await"?: boolean; +}; + +/** + * Metadata field definitions with their types + */ +export const METADATA_FIELDS = [ + { key: "name", type: "string" }, + { key: "namespace", type: "string" }, + { key: "match", type: "list" }, + { key: "exclude-match", type: "list" }, + { key: "include", type: "list" }, + { key: "exclude", type: "list" }, + { key: "version", type: "string" }, + { key: "description", type: "string" }, + { key: "icon", type: "string" }, + { key: "require", type: "list" }, + { key: "resource", type: "list" }, + { key: "run-at", type: "string" }, + { key: "noframes", type: "boolean" }, + { key: "grant", type: "list" }, + { key: "inject-into", type: "string" }, + { key: "downloadURL", type: "string" }, + { key: "supportURL", type: "string" }, + { key: "homepageURL", type: "string" }, + { key: "unwrap", type: "boolean" }, + { key: "top-level-await", type: "boolean" }, +] as const satisfies { + key: keyof ViolentmonkeyMetadata; + type: "string" | "list" | "boolean"; +}[]; + +const boolToLine = (key: keyof ViolentmonkeyMetadata) => `// @${key}`; + +const toLine = (key: keyof ViolentmonkeyMetadata, value: string) => + `// @${key.padEnd(12)} ${value}`; + +const listToLine = (key: keyof ViolentmonkeyMetadata, values: string[]) => { + return values.map((v) => toLine(key, v)); +}; + +export const generateMetadataString = (metadata: ViolentmonkeyMetadata) => { + const localeLines = Object.keys(metadata) + .filter( + (k): k is LocaleKey => + k.startsWith("name:") || k.startsWith("description:"), + ) + .map((k) => toLine(k, metadata[k])); + const lines = METADATA_FIELDS.filter((f) => metadata[f.key]).flatMap((f) => { + if (f.type === "list") { + // Handle array values + if (f.key === "resource") { + const values = metadata[f.key] ?? []; + const to = values.map(({ name, url }) => `${name} ${url}`); + return listToLine(f.key, to); + } + const values = metadata[f.key] ?? []; + return listToLine(f.key, values); + } else if (f.type === "boolean") { + return boolToLine(f.key); + } else { + const value = metadata[f.key] ?? ""; + return toLine(f.key, value); + } + }); + const allLines = [...lines, ...localeLines]; + return `// ==UserScript== +${allLines.join("\n")} +// ==/UserScript== +`; +}; diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index 69752eb..30cab57 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -1,18 +1,70 @@ +import { parseSync, Visitor } from "oxc-parser"; +import { Schema } from "effect"; +import { + generateMetadataString, + type ViolentmonkeyMetadata, +} from "./UserscriptMetadata"; + +const PackageJson = Schema.Struct({ + name: Schema.String, + module: Schema.String, +}); export const buildScript = async (packageName: string) => { - const packagePath = `../${packageName}`; - const { default: packageJson } = await import(`${packagePath}/package.json`, { - with: { type: "jsonc" }, - }); + const packagePath = `packages/${packageName}`; + const file: unknown = await Bun.file(`${packagePath}/package.json`).json(); + const packageInfo = Schema.decodeUnknownSync(PackageJson)(file); + if (typeof file !== "object") throw new Error("Must have package.json"); + + const bundledScript = await getBundledScript( + `./packages/${packageName}/${packageInfo.module}`, + ); + // Temp auto versioning - const version = `${Date.now()}${process.env.BUILD_ENV ?? ""}`; - const metadata = ( - await Bun.file(`./packages/${packageName}/metadata.js`).text() - ).replace(/VERSION/, version); - return Bun.build({ - entrypoints: [`./packages/${packageName}/${packageJson.module}`], - banner: metadata, - outdir: `./dist/userscripts`, - naming: `${packageName}.user.[ext]`, - root: ".", + const defaultMetadataValues: ViolentmonkeyMetadata = { + name: packageInfo.name + .replaceAll("-", " ") + .split(" ") + .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) + .join(" "), + namespace: "Joshu FlatMMO Scripts", + grant: parseGrantsCalled(bundledScript), + match: ["https://flatmmo.com/play.php*"], + version: `${Date.now()}${process.env.BUILD_ENV ?? ""}`, + }; + const metadata = generateMetadataString(defaultMetadataValues); + + const finalScript = `${metadata} + +${bundledScript} + `; + console.log(finalScript); + + Bun.write(`./dist/userscripts/${packageName}.user.js`, finalScript); +}; + +const parseGrantsCalled = (scriptText: string) => { + const parsed = parseSync("userscript.js", scriptText); + + // Visit the AST + const grants = new Set(); + const visitor = new Visitor({ + CallExpression(callExp) { + if (callExp.callee.type === "Identifier") { + const name = callExp.callee.name; + if (name.startsWith("GM")) { + grants.add(name); + } + } + }, + }); + + visitor.visit(parsed.program); + return Array.from(grants.keys()); +}; +const getBundledScript = async (entrypoint: string) => { + const bundled = await Bun.build({ + entrypoints: [entrypoint], }); + + return await bundled.outputs[0].text(); }; diff --git a/packages/current-action-ui/package.json b/packages/current-action-ui/package.json index 3ec40aa..5cc0505 100644 --- a/packages/current-action-ui/package.json +++ b/packages/current-action-ui/package.json @@ -1,5 +1,5 @@ { - "name": "@workspace/current-action-ui", + "name": "current-action-ui", "version": "1.0.0", "module": "index.ts", "dependencies": {}, From 6c060e1787e29e229edc88290349e1ec6eeb2998 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sat, 17 Jan 2026 23:10:20 -0500 Subject: [PATCH 64/87] Initial version of metadata generation including parsing which GM methods are called --- bun.nix | 2 +- packages/build/build-userscript.ts | 17 ++++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/bun.nix b/bun.nix index 397ff12..4cab744 100644 --- a/bun.nix +++ b/bun.nix @@ -173,4 +173,4 @@ url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; }; -} +} \ No newline at end of file diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index 30cab57..5bf8691 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -48,13 +48,24 @@ const parseGrantsCalled = (scriptText: string) => { // Visit the AST const grants = new Set(); const visitor = new Visitor({ - CallExpression(callExp) { - if (callExp.callee.type === "Identifier") { - const name = callExp.callee.name; + CallExpression({ callee }) { + const { type } = callee; + if (type === "Identifier") { + const name = callee.name; if (name.startsWith("GM")) { grants.add(name); } } + if ( + type === "MemberExpression" && + callee.object.type === "Identifier" && + callee.object.name === "GM" + ) { + const { property } = callee; + if (property.type === "Identifier") { + grants.add(`GM.${property.name}`); + } + } }, }); From 16a01c5f61314c837139909ebb531c5f0e5021ee Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 19 Jan 2026 04:23:35 -0500 Subject: [PATCH 65/87] updated build script for easier dev watching --- mkUserscript.nix | 2 +- package.json | 4 +- packages/build/build-userscript-cli.ts | 52 ++++++++++++++++++++++---- packages/build/build-userscript.ts | 5 ++- 4 files changed, 52 insertions(+), 11 deletions(-) diff --git a/mkUserscript.nix b/mkUserscript.nix index 34614ac..3cd7ca2 100644 --- a/mkUserscript.nix +++ b/mkUserscript.nix @@ -34,7 +34,7 @@ stdenv.mkDerivation { }; buildPhase = '' - bun ${build-script} --scriptName=${packageName} + bun ${build-script} ${packageName} ''; installPhase = '' diff --git a/package.json b/package.json index 729dafc..ffad720 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,9 @@ "scripts": { "postinstall": "bun2nix -o bun.nix", "build-static": "bun run packages/build/build.ts", - "dev": "bun run packages/build/dev-watch.ts" + "dev-static": "bun run packages/build/dev-watch.ts", + "build-script": "bun run packages/build/build-userscript-cli.ts", + "dev-script": "bun run packages/build/build-userscript-cli.ts --dev" }, "devDependencies": { "@types/bun": "^1.3.4", diff --git a/packages/build/build-userscript-cli.ts b/packages/build/build-userscript-cli.ts index a866b2a..2dabcfa 100644 --- a/packages/build/build-userscript-cli.ts +++ b/packages/build/build-userscript-cli.ts @@ -1,18 +1,56 @@ import { parseArgs } from "util"; import { buildScript } from "./build-userscript"; +import { watch } from "fs"; -const { values } = parseArgs({ +const { values, positionals } = parseArgs({ args: Bun.argv, strict: true, options: { - scriptName: { type: "string" }, + dev: { type: "boolean" }, }, + positionals: ["scriptName"], allowPositionals: true, }); -if (!values.scriptName) { - throw "must have data"; -} -const name = values.scriptName; +const name = positionals[2]; +const dev = values.dev; + +const runBuild = async () => { + const t0 = performance.now(); + try { + const filePath = await buildScript(name); + const url = Bun.pathToFileURL(filePath); + const t1 = performance.now(); + + console.log(""); + console.log(`Wrote ${name} in ${t1 - t0} milliseconds to:`); + console.log(url.href); // "file:///foo/bar.txt" + console.log(url.pathname); // "file:///foo/bar.txt" + console.log(""); + } catch (e) { + console.log(`Error while bundling ${name}:`); + console.log(e); // "TypeError" + } +}; + +await runBuild(); -buildScript(name); +if (dev) { + const watchDir = `${import.meta.env.PACKAGESDIR}/${name}`; + + const watcher = watch( + watchDir, + { recursive: true }, + async (event, filename) => { + console.log(`Detected ${event} in ${filename}`); + await runBuild(); + }, + ); + + process.on("SIGINT", () => { + // close watcher when Ctrl-C is pressed + watcher.close(); + + process.exit(0); + }); +} diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index 5bf8691..c198655 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -37,9 +37,10 @@ export const buildScript = async (packageName: string) => { ${bundledScript} `; - console.log(finalScript); - Bun.write(`./dist/userscripts/${packageName}.user.js`, finalScript); + const scriptDest = `./dist/userscripts/${packageName}.user.js`; + await Bun.write(scriptDest, finalScript); + return scriptDest; }; const parseGrantsCalled = (scriptText: string) => { From 60af836daa2ea2457bc1e6a13f582f8f4a5df3d1 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 19 Jan 2026 05:27:00 -0500 Subject: [PATCH 66/87] moved package dirs to userscripts and lib --- bun.lock | 24 +++++++++---------- bun.nix | 14 +++++------ flake.nix | 2 +- package.json | 3 ++- .../flatmmo/draw-player-on-top.user.js | 0 ...ground-item-monster-click-conflict.user.js | 0 .../{ => archive}/wiki/header-links.user.js | 0 .../{ => archive}/wiki/image-links.user.js | 0 .../{ => archive}/wiki/table-links.user.js | 0 packages/build/build-userscript-cli.ts | 2 +- packages/build/build-userscript.ts | 4 ++-- packages/{ => lib}/flatmmo-types/flatmmo.d.ts | 0 packages/{ => lib}/flatmmo-types/package.json | 0 .../better-custom-hotkeys/ACTIONS.ts | 0 .../better-custom-hotkeys/DEFAULT_HOTKEYS.ts | 0 .../better-custom-hotkeys/hotkeys.ts | 0 .../better-custom-hotkeys/index.ts | 0 .../better-custom-hotkeys/metadata.js | 0 .../better-custom-hotkeys/package.json | 0 .../{ => userscripts}/chat-space-fix/index.ts | 0 .../chat-space-fix/metadata.js | 0 .../chat-space-fix/package.json | 0 .../current-action-ui/index.ts | 0 .../current-action-ui/metadata.js | 0 .../current-action-ui/package.json | 0 25 files changed, 25 insertions(+), 24 deletions(-) rename packages/{ => archive}/flatmmo/draw-player-on-top.user.js (100%) rename packages/{ => archive}/flatmmo/fix-ground-item-monster-click-conflict.user.js (100%) rename packages/{ => archive}/wiki/header-links.user.js (100%) rename packages/{ => archive}/wiki/image-links.user.js (100%) rename packages/{ => archive}/wiki/table-links.user.js (100%) rename packages/{ => lib}/flatmmo-types/flatmmo.d.ts (100%) rename packages/{ => lib}/flatmmo-types/package.json (100%) rename packages/{ => userscripts}/better-custom-hotkeys/ACTIONS.ts (100%) rename packages/{ => userscripts}/better-custom-hotkeys/DEFAULT_HOTKEYS.ts (100%) rename packages/{ => userscripts}/better-custom-hotkeys/hotkeys.ts (100%) rename packages/{ => userscripts}/better-custom-hotkeys/index.ts (100%) rename packages/{ => userscripts}/better-custom-hotkeys/metadata.js (100%) rename packages/{ => userscripts}/better-custom-hotkeys/package.json (100%) rename packages/{ => userscripts}/chat-space-fix/index.ts (100%) rename packages/{ => userscripts}/chat-space-fix/metadata.js (100%) rename packages/{ => userscripts}/chat-space-fix/package.json (100%) rename packages/{ => userscripts}/current-action-ui/index.ts (100%) rename packages/{ => userscripts}/current-action-ui/metadata.js (100%) rename packages/{ => userscripts}/current-action-ui/package.json (100%) diff --git a/bun.lock b/bun.lock index b18811d..030aaa5 100644 --- a/bun.lock +++ b/bun.lock @@ -15,7 +15,11 @@ "typescript": "^5.9.3", }, }, - "packages/better-custom-hotkeys": { + "packages/lib/flatmmo-types": { + "name": "flatmmo-types", + "version": "0.0.1", + }, + "packages/userscripts/better-custom-hotkeys": { "name": "better-custom-hotkeys", "version": "1.0.0", "devDependencies": { @@ -23,7 +27,7 @@ "flatmmo-types": "workspace:*", }, }, - "packages/chat-space-fix": { + "packages/userscripts/chat-space-fix": { "name": "chat-space-fix", "version": "1.0.0", "devDependencies": { @@ -31,7 +35,7 @@ "flatmmo-types": "workspace:*", }, }, - "packages/current-action-ui": { + "packages/userscripts/current-action-ui": { "name": "current-action-ui", "version": "1.0.0", "devDependencies": { @@ -39,10 +43,6 @@ "flatmmo-types": "workspace:*", }, }, - "packages/flatmmo-types": { - "name": "flatmmo-types", - "version": "0.0.1", - }, }, "packages": { "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], @@ -101,23 +101,23 @@ "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="], - "@types/node": ["@types/node@25.0.8", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg=="], + "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], "@violentmonkey/types": ["@violentmonkey/types@0.3.2", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="], - "better-custom-hotkeys": ["better-custom-hotkeys@workspace:packages/better-custom-hotkeys"], + "better-custom-hotkeys": ["better-custom-hotkeys@workspace:packages/userscripts/better-custom-hotkeys"], "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], - "chat-space-fix": ["chat-space-fix@workspace:packages/chat-space-fix"], + "chat-space-fix": ["chat-space-fix@workspace:packages/userscripts/chat-space-fix"], - "current-action-ui": ["current-action-ui@workspace:packages/current-action-ui"], + "current-action-ui": ["current-action-ui@workspace:packages/userscripts/current-action-ui"], "effect": ["effect@3.19.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="], "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], - "flatmmo-types": ["flatmmo-types@workspace:packages/flatmmo-types"], + "flatmmo-types": ["flatmmo-types@workspace:packages/lib/flatmmo-types"], "oxc-parser": ["oxc-parser@0.108.0", "", { "dependencies": { "@oxc-project/types": "^0.108.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.108.0", "@oxc-parser/binding-android-arm64": "0.108.0", "@oxc-parser/binding-darwin-arm64": "0.108.0", "@oxc-parser/binding-darwin-x64": "0.108.0", "@oxc-parser/binding-freebsd-x64": "0.108.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.108.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.108.0", "@oxc-parser/binding-linux-arm64-gnu": "0.108.0", "@oxc-parser/binding-linux-arm64-musl": "0.108.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-musl": "0.108.0", "@oxc-parser/binding-linux-s390x-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-musl": "0.108.0", "@oxc-parser/binding-openharmony-arm64": "0.108.0", "@oxc-parser/binding-wasm32-wasi": "0.108.0", "@oxc-parser/binding-win32-arm64-msvc": "0.108.0", "@oxc-parser/binding-win32-ia32-msvc": "0.108.0", "@oxc-parser/binding-win32-x64-msvc": "0.108.0" } }, "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="], diff --git a/bun.nix b/bun.nix index 4cab744..e5aa578 100644 --- a/bun.nix +++ b/bun.nix @@ -125,21 +125,21 @@ url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.6.tgz"; hash = "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="; }; - "@types/node@25.0.8" = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-25.0.8.tgz"; - hash = "sha512-powIePYMmC3ibL0UJ2i2s0WIbq6cg6UyVFQxSCpaPxxzAaziRfimGivjdF943sSGV6RADVbk0Nvlm5P/FB44Zg=="; + "@types/node@25.0.9" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz"; + hash = "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="; }; "@violentmonkey/types@0.3.2" = fetchurl { url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.2.tgz"; hash = "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="; }; - "better-custom-hotkeys" = copyPathToStore ./packages/better-custom-hotkeys; + "better-custom-hotkeys" = copyPathToStore ./packages/userscripts/better-custom-hotkeys; "bun-types@1.3.6" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.6.tgz"; hash = "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="; }; - "chat-space-fix" = copyPathToStore ./packages/chat-space-fix; - "current-action-ui" = copyPathToStore ./packages/current-action-ui; + "chat-space-fix" = copyPathToStore ./packages/userscripts/chat-space-fix; + "current-action-ui" = copyPathToStore ./packages/userscripts/current-action-ui; "effect@3.19.14" = fetchurl { url = "https://registry.npmjs.org/effect/-/effect-3.19.14.tgz"; hash = "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="; @@ -148,7 +148,7 @@ url = "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz"; hash = "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="; }; - "flatmmo-types" = copyPathToStore ./packages/flatmmo-types; + "flatmmo-types" = copyPathToStore ./packages/lib/flatmmo-types; "oxc-parser@0.108.0" = fetchurl { url = "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.108.0.tgz"; hash = "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="; diff --git a/flake.nix b/flake.nix index 02ef2a9..11ce2a4 100644 --- a/flake.nix +++ b/flake.nix @@ -58,7 +58,7 @@ packageName: pkgs.callPackage ./mkUserscript.nix { inherit packageName; - packagePath = "packages/better-custom-hotkeys/"; + packagePath = "packages/userscripts/better-custom-hotkeys/"; }; userscriptAttrs = pkgs.lib.genAttrs userscriptNames mkFromName; in diff --git a/package.json b/package.json index ffad720..5e2602f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,8 @@ { "name": "flatmmo-userscripts-workspace", "workspaces": [ - "packages/*" + "packages/lib/*", + "packages/userscripts/*" ], "scripts": { "postinstall": "bun2nix -o bun.nix", diff --git a/packages/flatmmo/draw-player-on-top.user.js b/packages/archive/flatmmo/draw-player-on-top.user.js similarity index 100% rename from packages/flatmmo/draw-player-on-top.user.js rename to packages/archive/flatmmo/draw-player-on-top.user.js diff --git a/packages/flatmmo/fix-ground-item-monster-click-conflict.user.js b/packages/archive/flatmmo/fix-ground-item-monster-click-conflict.user.js similarity index 100% rename from packages/flatmmo/fix-ground-item-monster-click-conflict.user.js rename to packages/archive/flatmmo/fix-ground-item-monster-click-conflict.user.js diff --git a/packages/wiki/header-links.user.js b/packages/archive/wiki/header-links.user.js similarity index 100% rename from packages/wiki/header-links.user.js rename to packages/archive/wiki/header-links.user.js diff --git a/packages/wiki/image-links.user.js b/packages/archive/wiki/image-links.user.js similarity index 100% rename from packages/wiki/image-links.user.js rename to packages/archive/wiki/image-links.user.js diff --git a/packages/wiki/table-links.user.js b/packages/archive/wiki/table-links.user.js similarity index 100% rename from packages/wiki/table-links.user.js rename to packages/archive/wiki/table-links.user.js diff --git a/packages/build/build-userscript-cli.ts b/packages/build/build-userscript-cli.ts index 2dabcfa..6a70f36 100644 --- a/packages/build/build-userscript-cli.ts +++ b/packages/build/build-userscript-cli.ts @@ -36,7 +36,7 @@ const runBuild = async () => { await runBuild(); if (dev) { - const watchDir = `${import.meta.env.PACKAGESDIR}/${name}`; + const watchDir = `${import.meta.env.PACKAGESDIR}/userscripts/${name}`; const watcher = watch( watchDir, diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index c198655..6c209a7 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -10,13 +10,13 @@ const PackageJson = Schema.Struct({ module: Schema.String, }); export const buildScript = async (packageName: string) => { - const packagePath = `packages/${packageName}`; + const packagePath = `packages/userscripts/${packageName}`; const file: unknown = await Bun.file(`${packagePath}/package.json`).json(); const packageInfo = Schema.decodeUnknownSync(PackageJson)(file); if (typeof file !== "object") throw new Error("Must have package.json"); const bundledScript = await getBundledScript( - `./packages/${packageName}/${packageInfo.module}`, + `./packages/userscripts/${packageName}/${packageInfo.module}`, ); // Temp auto versioning diff --git a/packages/flatmmo-types/flatmmo.d.ts b/packages/lib/flatmmo-types/flatmmo.d.ts similarity index 100% rename from packages/flatmmo-types/flatmmo.d.ts rename to packages/lib/flatmmo-types/flatmmo.d.ts diff --git a/packages/flatmmo-types/package.json b/packages/lib/flatmmo-types/package.json similarity index 100% rename from packages/flatmmo-types/package.json rename to packages/lib/flatmmo-types/package.json diff --git a/packages/better-custom-hotkeys/ACTIONS.ts b/packages/userscripts/better-custom-hotkeys/ACTIONS.ts similarity index 100% rename from packages/better-custom-hotkeys/ACTIONS.ts rename to packages/userscripts/better-custom-hotkeys/ACTIONS.ts diff --git a/packages/better-custom-hotkeys/DEFAULT_HOTKEYS.ts b/packages/userscripts/better-custom-hotkeys/DEFAULT_HOTKEYS.ts similarity index 100% rename from packages/better-custom-hotkeys/DEFAULT_HOTKEYS.ts rename to packages/userscripts/better-custom-hotkeys/DEFAULT_HOTKEYS.ts diff --git a/packages/better-custom-hotkeys/hotkeys.ts b/packages/userscripts/better-custom-hotkeys/hotkeys.ts similarity index 100% rename from packages/better-custom-hotkeys/hotkeys.ts rename to packages/userscripts/better-custom-hotkeys/hotkeys.ts diff --git a/packages/better-custom-hotkeys/index.ts b/packages/userscripts/better-custom-hotkeys/index.ts similarity index 100% rename from packages/better-custom-hotkeys/index.ts rename to packages/userscripts/better-custom-hotkeys/index.ts diff --git a/packages/better-custom-hotkeys/metadata.js b/packages/userscripts/better-custom-hotkeys/metadata.js similarity index 100% rename from packages/better-custom-hotkeys/metadata.js rename to packages/userscripts/better-custom-hotkeys/metadata.js diff --git a/packages/better-custom-hotkeys/package.json b/packages/userscripts/better-custom-hotkeys/package.json similarity index 100% rename from packages/better-custom-hotkeys/package.json rename to packages/userscripts/better-custom-hotkeys/package.json diff --git a/packages/chat-space-fix/index.ts b/packages/userscripts/chat-space-fix/index.ts similarity index 100% rename from packages/chat-space-fix/index.ts rename to packages/userscripts/chat-space-fix/index.ts diff --git a/packages/chat-space-fix/metadata.js b/packages/userscripts/chat-space-fix/metadata.js similarity index 100% rename from packages/chat-space-fix/metadata.js rename to packages/userscripts/chat-space-fix/metadata.js diff --git a/packages/chat-space-fix/package.json b/packages/userscripts/chat-space-fix/package.json similarity index 100% rename from packages/chat-space-fix/package.json rename to packages/userscripts/chat-space-fix/package.json diff --git a/packages/current-action-ui/index.ts b/packages/userscripts/current-action-ui/index.ts similarity index 100% rename from packages/current-action-ui/index.ts rename to packages/userscripts/current-action-ui/index.ts diff --git a/packages/current-action-ui/metadata.js b/packages/userscripts/current-action-ui/metadata.js similarity index 100% rename from packages/current-action-ui/metadata.js rename to packages/userscripts/current-action-ui/metadata.js diff --git a/packages/current-action-ui/package.json b/packages/userscripts/current-action-ui/package.json similarity index 100% rename from packages/current-action-ui/package.json rename to packages/userscripts/current-action-ui/package.json From ebf422fa0fdda62de203bb6c67595f4f1c4fa85b Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 19 Jan 2026 05:29:59 -0500 Subject: [PATCH 67/87] removed unused arg --- flake.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/flake.nix b/flake.nix index 11ce2a4..e5ace8a 100644 --- a/flake.nix +++ b/flake.nix @@ -58,7 +58,6 @@ packageName: pkgs.callPackage ./mkUserscript.nix { inherit packageName; - packagePath = "packages/userscripts/better-custom-hotkeys/"; }; userscriptAttrs = pkgs.lib.genAttrs userscriptNames mkFromName; in From c3607cbbba98d9b7d4db8af516c94b55b47ca185 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 19 Jan 2026 05:40:08 -0500 Subject: [PATCH 68/87] renamed userscripts --- bun.lock | 20 +++++++++---------- bun.nix | 4 ++-- flake.nix | 4 ++-- .../index.ts | 0 .../metadata.js | 0 .../package.json | 2 +- .../ACTIONS.ts | 0 .../DEFAULT_HOTKEYS.ts | 0 .../hotkeys.ts | 0 .../index.ts | 0 .../metadata.js | 0 .../package.json | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) rename packages/userscripts/{current-action-ui => hud-improved}/index.ts (100%) rename packages/userscripts/{current-action-ui => hud-improved}/metadata.js (100%) rename packages/userscripts/{current-action-ui => hud-improved}/package.json (84%) rename packages/userscripts/{better-custom-hotkeys => keybinds-improved}/ACTIONS.ts (100%) rename packages/userscripts/{better-custom-hotkeys => keybinds-improved}/DEFAULT_HOTKEYS.ts (100%) rename packages/userscripts/{better-custom-hotkeys => keybinds-improved}/hotkeys.ts (100%) rename packages/userscripts/{better-custom-hotkeys => keybinds-improved}/index.ts (100%) rename packages/userscripts/{better-custom-hotkeys => keybinds-improved}/metadata.js (100%) rename packages/userscripts/{better-custom-hotkeys => keybinds-improved}/package.json (82%) diff --git a/bun.lock b/bun.lock index 030aaa5..e1f58fa 100644 --- a/bun.lock +++ b/bun.lock @@ -19,24 +19,24 @@ "name": "flatmmo-types", "version": "0.0.1", }, - "packages/userscripts/better-custom-hotkeys": { - "name": "better-custom-hotkeys", + "packages/userscripts/chat-space-fix": { + "name": "chat-space-fix", "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", "flatmmo-types": "workspace:*", }, }, - "packages/userscripts/chat-space-fix": { - "name": "chat-space-fix", + "packages/userscripts/hud-improved": { + "name": "hud-improved", "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", "flatmmo-types": "workspace:*", }, }, - "packages/userscripts/current-action-ui": { - "name": "current-action-ui", + "packages/userscripts/keybinds-improved": { + "name": "keybinds-improved", "version": "1.0.0", "devDependencies": { "@violentmonkey/types": "^0.3.1", @@ -105,20 +105,20 @@ "@violentmonkey/types": ["@violentmonkey/types@0.3.2", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="], - "better-custom-hotkeys": ["better-custom-hotkeys@workspace:packages/userscripts/better-custom-hotkeys"], - "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], "chat-space-fix": ["chat-space-fix@workspace:packages/userscripts/chat-space-fix"], - "current-action-ui": ["current-action-ui@workspace:packages/userscripts/current-action-ui"], - "effect": ["effect@3.19.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="], "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], "flatmmo-types": ["flatmmo-types@workspace:packages/lib/flatmmo-types"], + "hud-improved": ["hud-improved@workspace:packages/userscripts/hud-improved"], + + "keybinds-improved": ["keybinds-improved@workspace:packages/userscripts/keybinds-improved"], + "oxc-parser": ["oxc-parser@0.108.0", "", { "dependencies": { "@oxc-project/types": "^0.108.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.108.0", "@oxc-parser/binding-android-arm64": "0.108.0", "@oxc-parser/binding-darwin-arm64": "0.108.0", "@oxc-parser/binding-darwin-x64": "0.108.0", "@oxc-parser/binding-freebsd-x64": "0.108.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.108.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.108.0", "@oxc-parser/binding-linux-arm64-gnu": "0.108.0", "@oxc-parser/binding-linux-arm64-musl": "0.108.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-musl": "0.108.0", "@oxc-parser/binding-linux-s390x-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-musl": "0.108.0", "@oxc-parser/binding-openharmony-arm64": "0.108.0", "@oxc-parser/binding-wasm32-wasi": "0.108.0", "@oxc-parser/binding-win32-arm64-msvc": "0.108.0", "@oxc-parser/binding-win32-ia32-msvc": "0.108.0", "@oxc-parser/binding-win32-x64-msvc": "0.108.0" } }, "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="], "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], diff --git a/bun.nix b/bun.nix index e5aa578..4ebb04c 100644 --- a/bun.nix +++ b/bun.nix @@ -133,13 +133,11 @@ url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.2.tgz"; hash = "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="; }; - "better-custom-hotkeys" = copyPathToStore ./packages/userscripts/better-custom-hotkeys; "bun-types@1.3.6" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.6.tgz"; hash = "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="; }; "chat-space-fix" = copyPathToStore ./packages/userscripts/chat-space-fix; - "current-action-ui" = copyPathToStore ./packages/userscripts/current-action-ui; "effect@3.19.14" = fetchurl { url = "https://registry.npmjs.org/effect/-/effect-3.19.14.tgz"; hash = "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="; @@ -149,6 +147,8 @@ hash = "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="; }; "flatmmo-types" = copyPathToStore ./packages/lib/flatmmo-types; + "hud-improved" = copyPathToStore ./packages/userscripts/hud-improved; + "keybinds-improved" = copyPathToStore ./packages/userscripts/keybinds-improved; "oxc-parser@0.108.0" = fetchurl { url = "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.108.0.tgz"; hash = "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="; diff --git a/flake.nix b/flake.nix index e5ace8a..982e4c7 100644 --- a/flake.nix +++ b/flake.nix @@ -50,8 +50,8 @@ }: let userscriptNames = [ - "better-custom-hotkeys" - "current-action-ui" + "keybinds-improved" + "hud-improved" "chat-space-fix" ]; mkFromName = diff --git a/packages/userscripts/current-action-ui/index.ts b/packages/userscripts/hud-improved/index.ts similarity index 100% rename from packages/userscripts/current-action-ui/index.ts rename to packages/userscripts/hud-improved/index.ts diff --git a/packages/userscripts/current-action-ui/metadata.js b/packages/userscripts/hud-improved/metadata.js similarity index 100% rename from packages/userscripts/current-action-ui/metadata.js rename to packages/userscripts/hud-improved/metadata.js diff --git a/packages/userscripts/current-action-ui/package.json b/packages/userscripts/hud-improved/package.json similarity index 84% rename from packages/userscripts/current-action-ui/package.json rename to packages/userscripts/hud-improved/package.json index 5cc0505..c1b6fa8 100644 --- a/packages/userscripts/current-action-ui/package.json +++ b/packages/userscripts/hud-improved/package.json @@ -1,5 +1,5 @@ { - "name": "current-action-ui", + "name": "hud-improved", "version": "1.0.0", "module": "index.ts", "dependencies": {}, diff --git a/packages/userscripts/better-custom-hotkeys/ACTIONS.ts b/packages/userscripts/keybinds-improved/ACTIONS.ts similarity index 100% rename from packages/userscripts/better-custom-hotkeys/ACTIONS.ts rename to packages/userscripts/keybinds-improved/ACTIONS.ts diff --git a/packages/userscripts/better-custom-hotkeys/DEFAULT_HOTKEYS.ts b/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts similarity index 100% rename from packages/userscripts/better-custom-hotkeys/DEFAULT_HOTKEYS.ts rename to packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts diff --git a/packages/userscripts/better-custom-hotkeys/hotkeys.ts b/packages/userscripts/keybinds-improved/hotkeys.ts similarity index 100% rename from packages/userscripts/better-custom-hotkeys/hotkeys.ts rename to packages/userscripts/keybinds-improved/hotkeys.ts diff --git a/packages/userscripts/better-custom-hotkeys/index.ts b/packages/userscripts/keybinds-improved/index.ts similarity index 100% rename from packages/userscripts/better-custom-hotkeys/index.ts rename to packages/userscripts/keybinds-improved/index.ts diff --git a/packages/userscripts/better-custom-hotkeys/metadata.js b/packages/userscripts/keybinds-improved/metadata.js similarity index 100% rename from packages/userscripts/better-custom-hotkeys/metadata.js rename to packages/userscripts/keybinds-improved/metadata.js diff --git a/packages/userscripts/better-custom-hotkeys/package.json b/packages/userscripts/keybinds-improved/package.json similarity index 82% rename from packages/userscripts/better-custom-hotkeys/package.json rename to packages/userscripts/keybinds-improved/package.json index 5a4ec2e..af9861e 100644 --- a/packages/userscripts/better-custom-hotkeys/package.json +++ b/packages/userscripts/keybinds-improved/package.json @@ -1,5 +1,5 @@ { - "name": "better-custom-hotkeys", + "name": "keybinds-improved", "version": "1.0.0", "module": "index.ts", "dependencies": {}, From 57183bb80adc85fccd3545b16049acbfd809da41 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 19 Jan 2026 05:56:23 -0500 Subject: [PATCH 69/87] updated nix to dynamically find userscripts to reduce boilerplate for new scripts --- flake.nix | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/flake.nix b/flake.nix index 982e4c7..c48af50 100644 --- a/flake.nix +++ b/flake.nix @@ -49,11 +49,8 @@ ... }: let - userscriptNames = [ - "keybinds-improved" - "hud-improved" - "chat-space-fix" - ]; + # fetch scripts dynamically based on dir location. May need a stricter/more correct check + userscriptNames = builtins.attrNames (inputs.nixpkgs.lib.filterAttrs (n: v: v == "directory") (builtins.readDir ./packages/userscripts)); mkFromName = packageName: pkgs.callPackage ./mkUserscript.nix { From 3a5309372177514538ba5a4490e90e6eb33cb162 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 19 Jan 2026 06:56:12 -0500 Subject: [PATCH 70/87] Added new prayer --- .../userscripts/keybinds-improved/ACTIONS.ts | 28 +++++++++++-------- .../keybinds-improved/DEFAULT_HOTKEYS.ts | 12 +++++++- .../userscripts/keybinds-improved/hotkeys.ts | 3 +- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/packages/userscripts/keybinds-improved/ACTIONS.ts b/packages/userscripts/keybinds-improved/ACTIONS.ts index 509cb2e..64ac008 100644 --- a/packages/userscripts/keybinds-improved/ACTIONS.ts +++ b/packages/userscripts/keybinds-improved/ACTIONS.ts @@ -54,67 +54,73 @@ export const ACTIONS: actions = { teleport_everbrook: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=teleport_everbrook", }, remote_sell: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=remote_sell", }, dig: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=dig", }, teleport_mysticvale: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=teleport_mysticvale", }, timers: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=timers", }, teleport_omboko: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=teleport_omboko", }, teleport_dock_haven: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=teleport_dock_haven", }, auto_hell_burying: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=auto_hell_burying", }, teleport_jafa_outpost: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=teleport_jafa_outpost", }, + teleport_frostvale: { + originalKey: "N/A", + description: "Worship skill, originally no hotkey", + socketCommand: "USE_WORSHIP=teleport_frostvale", + }, + hunting_contact: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=hunting_contact", }, mass_pickup: { originalKey: "N/A", - description: "Badge - Right click a badge and click the 'set key binding'", + description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=mass_pickup", }, }; diff --git a/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts b/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts index ead5604..012a607 100644 --- a/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts +++ b/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts @@ -174,7 +174,7 @@ export const DEFAULT_HOTKEYS: hotkey[] = [ { action: "auto_hell_burying", hotkey: { - key: "f", + key: "b", altKey: false, ctrlKey: true, metaKey: false, @@ -191,6 +191,16 @@ export const DEFAULT_HOTKEYS: hotkey[] = [ shiftKey: false, }, }, + { + action: "teleport_frostvale", + hotkey: { + key: "f", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + }, { action: "hunting_contact", hotkey: { diff --git a/packages/userscripts/keybinds-improved/hotkeys.ts b/packages/userscripts/keybinds-improved/hotkeys.ts index 392d6a0..bcf7b8a 100644 --- a/packages/userscripts/keybinds-improved/hotkeys.ts +++ b/packages/userscripts/keybinds-improved/hotkeys.ts @@ -34,7 +34,8 @@ export type actions = { teleport_dock_haven: actionProperties; auto_hell_burying: actionProperties; teleport_jafa_outpost: actionProperties; - hunting_contact: actionProperties; + teleport_frostvale: actionProperties; + hunting_contact: actionProperties; // typo matches the spelling from game mass_pickup: actionProperties; }; From 20bc94a92bc27dd48ec923faf70044feefcda972 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Mon, 19 Jan 2026 23:19:05 -0500 Subject: [PATCH 71/87] initial version of keybindings UI menu --- packages/userscripts/keybinds-improved/hotkeys.ts | 15 ++++++++++++--- packages/userscripts/keybinds-improved/index.ts | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/packages/userscripts/keybinds-improved/hotkeys.ts b/packages/userscripts/keybinds-improved/hotkeys.ts index bcf7b8a..86c4212 100644 --- a/packages/userscripts/keybinds-improved/hotkeys.ts +++ b/packages/userscripts/keybinds-improved/hotkeys.ts @@ -35,7 +35,7 @@ export type actions = { auto_hell_burying: actionProperties; teleport_jafa_outpost: actionProperties; teleport_frostvale: actionProperties; - hunting_contact: actionProperties; // typo matches the spelling from game + hunting_contact: actionProperties; mass_pickup: actionProperties; }; @@ -49,10 +49,19 @@ export const keypressToHashableString = (keypress: keypress) => { }; if (GM_getValue("hotkeys", null) === null) { - GM_setValue("hotkeys", DEFAULT_HOTKEYS); + GM_setValue("hotkeys", []); } +const usersHotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); -const hotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); +export const mergeHotkeys = () => { + const usersActions = new Set(usersHotkeys.map((x) => x.action)); + const unsetDefaultKeys = DEFAULT_HOTKEYS.filter( + (x) => !usersActions.has(x.action), + ); + return [...usersHotkeys, ...unsetDefaultKeys]; +}; + +const hotkeys = mergeHotkeys(); export const hashedHotkeyMap = hotkeys.reduce>( (result, hotkey) => { diff --git a/packages/userscripts/keybinds-improved/index.ts b/packages/userscripts/keybinds-improved/index.ts index 1dd0bcc..63b709c 100644 --- a/packages/userscripts/keybinds-improved/index.ts +++ b/packages/userscripts/keybinds-improved/index.ts @@ -1,5 +1,6 @@ import { ACTIONS } from "./ACTIONS"; import { hashedHotkeyMap, keypressToHashableString } from "./hotkeys"; +import { toggleModal } from "./settings"; //can be from canvas or chat input const focusOrSendChat = () => { @@ -118,5 +119,6 @@ const hotkeyListener = (e: KeyboardEvent) => { } }; +GM.registerMenuCommand("Toggle Settings menu", toggleModal); window.removeEventListener("keypress", keypress_listener); window.addEventListener("keydown", hotkeyListener, false); From 1c10410ed7e8bcf84f15edd78ea3eea474d51a27 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Tue, 20 Jan 2026 01:08:31 -0500 Subject: [PATCH 72/87] The modal now allows editting to change hotkeys --- .../keybinds-improved/DEFAULT_HOTKEYS.ts | 380 ++++++++---------- .../userscripts/keybinds-improved/hotkeys.ts | 53 +-- 2 files changed, 187 insertions(+), 246 deletions(-) diff --git a/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts b/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts index 012a607..d79ff2e 100644 --- a/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts +++ b/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts @@ -1,224 +1,158 @@ -import type { hotkey } from "./hotkeys"; +import type { actions, keypress } from "./hotkeys"; -export const DEFAULT_HOTKEYS: hotkey[] = [ - { - action: "run", - hotkey: { - key: "r", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "eat", - hotkey: { - key: "f", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "lightFire", - hotkey: { - key: "4", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "equip1", - hotkey: { - key: "1", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "equip2", - hotkey: { - key: "2", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "equip3", - hotkey: { - key: "3", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "badge1", - hotkey: { - key: "a", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "badge2", - hotkey: { - key: "s", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "badge3", - hotkey: { - key: "d", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "badge4", - hotkey: { - key: "v", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "teleport_everbrook", - hotkey: { - key: "e", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "remote_sell", - hotkey: { - key: "s", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "dig", - hotkey: { - key: "l", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "teleport_mysticvale", - hotkey: { - key: "m", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "timers", - hotkey: { - key: "0", - altKey: false, - ctrlKey: false, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "teleport_omboko", - hotkey: { - key: "o", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "teleport_dock_haven", - hotkey: { - key: "d", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "auto_hell_burying", - hotkey: { - key: "b", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "teleport_jafa_outpost", - hotkey: { - key: "j", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "teleport_frostvale", - hotkey: { - key: "f", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "hunting_contact", - hotkey: { - key: "h", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, - { - action: "mass_pickup", - hotkey: { - key: "p", - altKey: false, - ctrlKey: true, - metaKey: false, - shiftKey: false, - }, - }, -]; +export const DEFAULT_HOTKEYS: Record = { + run: { + key: "r", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + eat: { + key: "f", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + lightFire: { + key: "4", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + equip1: { + key: "1", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + equip2: { + key: "2", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + equip3: { + key: "3", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + badge1: { + key: "a", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + badge2: { + key: "s", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + badge3: { + key: "d", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + badge4: { + key: "v", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + teleport_everbrook: { + key: "e", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + remote_sell: { + key: "s", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + dig: { + key: "l", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + teleport_mysticvale: { + key: "m", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + timers: { + key: "0", + altKey: false, + ctrlKey: false, + metaKey: false, + shiftKey: false, + }, + teleport_omboko: { + key: "o", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + teleport_dock_haven: { + key: "d", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + auto_hell_burying: { + key: "b", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + teleport_jafa_outpost: { + key: "j", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + teleport_frostvale: { + key: "f", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + hunting_contact: { + key: "h", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + mass_pickup: { + key: "p", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, +}; diff --git a/packages/userscripts/keybinds-improved/hotkeys.ts b/packages/userscripts/keybinds-improved/hotkeys.ts index 86c4212..a8632b2 100644 --- a/packages/userscripts/keybinds-improved/hotkeys.ts +++ b/packages/userscripts/keybinds-improved/hotkeys.ts @@ -1,6 +1,6 @@ import { DEFAULT_HOTKEYS } from "./DEFAULT_HOTKEYS"; -interface keypress { +export interface keypress { key: string; altKey: boolean; ctrlKey: boolean; @@ -39,7 +39,9 @@ export type actions = { mass_pickup: actionProperties; }; -export interface hotkey { +export type HotkeyMap = Record; + +export interface Hotkey { action: keyof actions; hotkey: keypress; } @@ -49,36 +51,41 @@ export const keypressToHashableString = (keypress: keypress) => { }; if (GM_getValue("hotkeys", null) === null) { - GM_setValue("hotkeys", []); + GM_setValue("hotkeys", {}); } -const usersHotkeys = GM_getValue("hotkeys", DEFAULT_HOTKEYS); -export const mergeHotkeys = () => { - const usersActions = new Set(usersHotkeys.map((x) => x.action)); - const unsetDefaultKeys = DEFAULT_HOTKEYS.filter( - (x) => !usersActions.has(x.action), +let usersHotkeys: Partial = GM_getValue("hotkeys", {}); + +export const mergeHotkeys = (): HotkeyMap => { + return { ...DEFAULT_HOTKEYS, ...usersHotkeys }; +}; + +const hashKeymap = () => { + return Object.entries(mergeHotkeys()).reduce>( + (result, [action, kp]) => { + const hashed = keypressToHashableString(kp); + result[hashed] = { action: action as keyof actions, hotkey: kp }; + return result; + }, + {}, ); - return [...usersHotkeys, ...unsetDefaultKeys]; }; -const hotkeys = mergeHotkeys(); +export let hashedHotkeyMap = hashKeymap(); -export const hashedHotkeyMap = hotkeys.reduce>( - (result, hotkey) => { - const hashed = keypressToHashableString(hotkey.hotkey); - result[hashed] = hotkey; - return result; - }, - {}, -); +export const setHotkeys = (updatedHotkeys: Partial) => { + usersHotkeys = { ...usersHotkeys, ...updatedHotkeys }; + GM.setValue("hotkeys", usersHotkeys); + hashedHotkeyMap = hashKeymap(); +}; -export const hashableStringToKeypress = (str: string) => { +export const hashableStringToKeypress = (str: string): keypress => { const [key, altKey, ctrlKey, metaKey, shiftKey] = str.split("-"); return { key, - altKey, - ctrlKey, - metaKey, - shiftKey, + altKey: altKey === "true", + ctrlKey: ctrlKey === "true", + metaKey: metaKey === "true", + shiftKey: shiftKey === "true", }; }; From fb2b7654c0bc3cff60e438415c002668d04d8693 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Wed, 21 Jan 2026 22:09:39 -0500 Subject: [PATCH 73/87] added missing settings file and fixed conflicting hotkeys UI indicator --- .../userscripts/keybinds-improved/settings.ts | 437 ++++++++++++++++++ 1 file changed, 437 insertions(+) create mode 100644 packages/userscripts/keybinds-improved/settings.ts diff --git a/packages/userscripts/keybinds-improved/settings.ts b/packages/userscripts/keybinds-improved/settings.ts new file mode 100644 index 0000000..88ca38e --- /dev/null +++ b/packages/userscripts/keybinds-improved/settings.ts @@ -0,0 +1,437 @@ +import { ACTIONS } from "./ACTIONS"; +import { + mergeHotkeys, + setHotkeys, + keypressToHashableString, + type keypress, + type actions, +} from "./hotkeys"; + +const formatKeypress = (kp: keypress): string => { + const parts: string[] = []; + if (kp.ctrlKey) parts.push("Ctrl"); + if (kp.altKey) parts.push("Alt"); + if (kp.shiftKey) parts.push("Shift"); + if (kp.metaKey) parts.push("Meta"); + parts.push(kp.key.toUpperCase()); + return parts.join(" + "); +}; + +const formatKeypressFromEvent = (e: KeyboardEvent): string => { + const parts: string[] = []; + if (e.ctrlKey) parts.push("Ctrl"); + if (e.altKey) parts.push("Alt"); + if (e.shiftKey) parts.push("Shift"); + if (e.metaKey) parts.push("Meta"); + parts.push(e.key.toUpperCase()); + return parts.join(" + "); +}; + +const formatActionName = (action: string): string => { + return action.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()); +}; + +const createModalStyles = (): HTMLStyleElement => { + const style = document.createElement("style"); + style.textContent = ` + #hotkeys-modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.7); + display: none; + justify-content: center; + align-items: center; + z-index: 10000; + } + + #hotkeys-modal-overlay.visible { + display: flex; + } + + #hotkeys-modal { + background: #1a1a2e; + border: 2px solid #4a4a6a; + border-radius: 8px; + max-width: 850px; + max-height: 80vh; + width: 90%; + overflow: hidden; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); + } + + #hotkeys-modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 16px; + background: #252540; + border-bottom: 1px solid #4a4a6a; + } + + #hotkeys-modal-header h2 { + margin: 0; + color: #e0e0e0; + font-size: 18px; + } + + #hotkeys-modal-close { + background: none; + border: none; + color: #888; + font-size: 24px; + cursor: pointer; + padding: 0; + line-height: 1; + } + + #hotkeys-modal-close:hover { + color: #fff; + } + + #hotkeys-modal-content { + overflow-y: auto; + max-height: calc(80vh - 60px); + padding: 16px; + } + + #hotkeys-table { + width: 100%; + border-collapse: collapse; + color: #e0e0e0; + } + + #hotkeys-table th { + text-align: left; + padding: 8px 12px; + background: #252540; + border-bottom: 2px solid #4a4a6a; + font-weight: 600; + } + + #hotkeys-table td { + padding: 8px 12px; + border-bottom: 1px solid #333; + } + + #hotkeys-table tr:hover td { + background: #252540; + } + + .hotkey-key { + display: inline-block; + background: #333; + border: 1px solid #555; + border-radius: 4px; + padding: 4px 12px; + font-family: monospace; + font-size: 14px; + cursor: pointer; + transition: all 0.15s ease; + } + + .hotkey-key:hover { + background: #444; + border-color: #777; + } + + .hotkey-key.recording { + background: #4a3a2e; + border-color: #f0a050; + } + + .hotkey-key.conflict { + background: #4a2a2a; + border-color: #c55; + } + + #hotkeys-table td:nth-child(2) { + min-width: 140px; + } + + .hotkey-description { + color: #999; + font-size: 12px; + } + `; + return style; +}; + +let currentlyRecording: HTMLSpanElement | null = null; +let recordingAction: keyof actions | null = null; + +const stopRecording = (restoreText = false) => { + if (currentlyRecording) { + if (restoreText && recordingAction) { + const currentHotkeys = mergeHotkeys(); + currentlyRecording.textContent = formatKeypress( + currentHotkeys[recordingAction], + ); + } + currentlyRecording.classList.remove("recording"); + currentlyRecording = null; + recordingAction = null; + } +}; + +// Track spans for conflict detection +const allSpans: HTMLSpanElement[] = []; + +// Mark conflicts +const updateConflicts = () => { + const currentHotkeys = mergeHotkeys(); + const hashCounts = Object.values(currentHotkeys) + .map(keypressToHashableString) + .reduce((acc: Record, hash) => { + acc[hash] = (acc[hash] || 0) + 1; + return acc; + }, {}); + + for (const span of allSpans) { + const action = span.dataset.action as keyof actions; + const kp = currentHotkeys[action]; + const hash = keypressToHashableString(kp); + const count = hashCounts[hash]; + if (count > 1) { + span.classList.add("conflict"); + } else { + span.classList.remove("conflict"); + } + } +}; + +const startRecording = (element: HTMLSpanElement, action: keyof actions) => { + // If clicking the same element, just stop + if (currentlyRecording === element) { + stopRecording(true); + return; + } + + // If recording a different one, stop it first + if (currentlyRecording) { + stopRecording(true); + } + + // Start recording on this element + currentlyRecording = element; + recordingAction = action; + element.classList.add("recording"); + element.textContent = "Press a key..."; +}; + +const getModifierText = (e: KeyboardEvent): string => { + const parts: string[] = []; + if (e.ctrlKey) parts.push("Ctrl"); + if (e.altKey) parts.push("Alt"); + if (e.shiftKey) parts.push("Shift"); + if (e.metaKey) parts.push("Meta"); + return parts.length > 0 ? `${parts.join(" + ")} + ...` : "Press a key..."; +}; + +const updateRecordingDisplay = (e: KeyboardEvent) => { + if (!currentlyRecording) return; + currentlyRecording.textContent = getModifierText(e); +}; + +const handleRecordingKeypress = (e: KeyboardEvent) => { + if (!currentlyRecording || !recordingAction) return; + + // Show modifiers while held + if (["Control", "Alt", "Shift", "Meta"].includes(e.key)) { + updateRecordingDisplay(e); + return; + } + + e.preventDefault(); + e.stopPropagation(); + + const newKeypress: keypress = { + key: e.key, + altKey: e.altKey, + ctrlKey: e.ctrlKey, + metaKey: e.metaKey, + shiftKey: e.shiftKey, + }; + + // Save immediately + setHotkeys({ [recordingAction]: newKeypress }); + + // Update the display + currentlyRecording.textContent = formatKeypressFromEvent(e); + currentlyRecording.classList.remove("recording"); + + // Update conflict highlighting + updateConflicts(); + + stopRecording(); +}; + +const handleRecordingKeyup = (e: KeyboardEvent) => { + if (!currentlyRecording) return; + + // Update display when modifiers are released + if (["Control", "Alt", "Shift", "Meta"].includes(e.key)) { + updateRecordingDisplay(e); + } +}; + +const createModal = (): HTMLDivElement => { + const overlay = document.createElement("div"); + overlay.id = "hotkeys-modal-overlay"; + + const modal = document.createElement("div"); + modal.id = "hotkeys-modal"; + + const header = document.createElement("div"); + header.id = "hotkeys-modal-header"; + + const title = document.createElement("h2"); + title.textContent = "Hotkey Bindings"; + + const closeBtn = document.createElement("button"); + closeBtn.id = "hotkeys-modal-close"; + closeBtn.textContent = "×"; + closeBtn.addEventListener("click", () => hideModal()); + + header.appendChild(title); + header.appendChild(closeBtn); + + const content = document.createElement("div"); + content.id = "hotkeys-modal-content"; + + const table = document.createElement("table"); + table.id = "hotkeys-table"; + + const thead = document.createElement("thead"); + thead.innerHTML = ` + + Action + Hotkey + Description + + `; + + const tbody = document.createElement("tbody"); + const hotkeys = mergeHotkeys(); + + for (const [action, kp] of Object.entries(hotkeys) as [ + keyof actions, + keypress, + ][]) { + const actionInfo = ACTIONS[action]; + if (!actionInfo) continue; + + const row = document.createElement("tr"); + + const actionCell = document.createElement("td"); + actionCell.textContent = formatActionName(action); + + const hotkeyCell = document.createElement("td"); + const hotkeySpan = document.createElement("span"); + hotkeySpan.className = "hotkey-key"; + hotkeySpan.textContent = formatKeypress(kp); + hotkeySpan.dataset.action = action; + + allSpans.push(hotkeySpan); + + hotkeySpan.addEventListener("click", () => { + startRecording(hotkeySpan, action); + }); + + hotkeyCell.appendChild(hotkeySpan); + + const descCell = document.createElement("td"); + descCell.className = "hotkey-description"; + descCell.textContent = actionInfo.description; + + row.appendChild(actionCell); + row.appendChild(hotkeyCell); + row.appendChild(descCell); + tbody.appendChild(row); + } + + updateConflicts(); + + table.appendChild(thead); + table.appendChild(tbody); + content.appendChild(table); + + modal.appendChild(header); + modal.appendChild(content); + overlay.appendChild(modal); + + overlay.addEventListener("click", (e) => { + if (e.target === overlay) { + hideModal(); + } + }); + + // Stop recording when clicking elsewhere in the modal + modal.addEventListener("click", (e) => { + const target = e.target as HTMLElement; + if (!target.classList.contains("hotkey-key") && currentlyRecording) { + stopRecording(true); + } + }); + + return overlay; +}; + +let modalElement: HTMLDivElement | null = null; + +const initModal = () => { + if (modalElement) return; + document.head.appendChild(createModalStyles()); + modalElement = createModal(); + document.body.appendChild(modalElement); +}; + +export const showModal = () => { + initModal(); + modalElement?.classList.add("visible"); +}; + +export const hideModal = () => { + modalElement?.classList.remove("visible"); +}; + +export const toggleModal = () => { + initModal(); + if (modalElement?.classList.contains("visible")) { + hideModal(); + } else { + showModal(); + } +}; + +// Listen for keypresses when modal is open +document.addEventListener("keydown", (e) => { + if (!modalElement?.classList.contains("visible")) return; + + // If recording, handle the keypress + if (currentlyRecording) { + // Escape cancels recording + if (e.key === "Escape") { + stopRecording(true); + e.preventDefault(); + return; + } + + handleRecordingKeypress(e); + return; + } + + // Escape closes modal when not recording + if (e.key === "Escape") { + hideModal(); + e.preventDefault(); + } +}); + +// Listen for key releases to update modifier display +document.addEventListener("keyup", (e) => { + if (!modalElement?.classList.contains("visible")) return; + handleRecordingKeyup(e); +}); From 773f9cdae76c9c9f2eb408ba5c300f83c7bd6d60 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Wed, 21 Jan 2026 22:39:32 -0500 Subject: [PATCH 74/87] Testing grid settings layout --- .../userscripts/keybinds-improved/settings.ts | 77 +++++++------------ 1 file changed, 26 insertions(+), 51 deletions(-) diff --git a/packages/userscripts/keybinds-improved/settings.ts b/packages/userscripts/keybinds-improved/settings.ts index 88ca38e..8b2eba1 100644 --- a/packages/userscripts/keybinds-improved/settings.ts +++ b/packages/userscripts/keybinds-improved/settings.ts @@ -97,27 +97,29 @@ const createModalStyles = (): HTMLStyleElement => { padding: 16px; } - #hotkeys-table { - width: 100%; - border-collapse: collapse; + #hotkeys-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 8px; color: #e0e0e0; } - #hotkeys-table th { - text-align: left; + .hotkey-item { + display: flex; + justify-content: space-between; + align-items: center; padding: 8px 12px; - background: #252540; - border-bottom: 2px solid #4a4a6a; - font-weight: 600; + border: 1px solid #333; + border-radius: 4px; + transition: background 0.15s ease; } - #hotkeys-table td { - padding: 8px 12px; - border-bottom: 1px solid #333; + .hotkey-item:hover { + background: #252540; } - #hotkeys-table tr:hover td { - background: #252540; + .hotkey-action { + flex: 1; } .hotkey-key { @@ -146,15 +148,6 @@ const createModalStyles = (): HTMLStyleElement => { background: #4a2a2a; border-color: #c55; } - - #hotkeys-table td:nth-child(2) { - min-width: 140px; - } - - .hotkey-description { - color: #999; - font-size: 12px; - } `; return style; }; @@ -301,19 +294,9 @@ const createModal = (): HTMLDivElement => { const content = document.createElement("div"); content.id = "hotkeys-modal-content"; - const table = document.createElement("table"); - table.id = "hotkeys-table"; + const grid = document.createElement("div"); + grid.id = "hotkeys-grid"; - const thead = document.createElement("thead"); - thead.innerHTML = ` - - Action - Hotkey - Description - - `; - - const tbody = document.createElement("tbody"); const hotkeys = mergeHotkeys(); for (const [action, kp] of Object.entries(hotkeys) as [ @@ -323,12 +306,13 @@ const createModal = (): HTMLDivElement => { const actionInfo = ACTIONS[action]; if (!actionInfo) continue; - const row = document.createElement("tr"); + const item = document.createElement("div"); + item.className = "hotkey-item"; - const actionCell = document.createElement("td"); - actionCell.textContent = formatActionName(action); + const actionName = document.createElement("span"); + actionName.className = "hotkey-action"; + actionName.textContent = formatActionName(action); - const hotkeyCell = document.createElement("td"); const hotkeySpan = document.createElement("span"); hotkeySpan.className = "hotkey-key"; hotkeySpan.textContent = formatKeypress(kp); @@ -340,23 +324,14 @@ const createModal = (): HTMLDivElement => { startRecording(hotkeySpan, action); }); - hotkeyCell.appendChild(hotkeySpan); - - const descCell = document.createElement("td"); - descCell.className = "hotkey-description"; - descCell.textContent = actionInfo.description; - - row.appendChild(actionCell); - row.appendChild(hotkeyCell); - row.appendChild(descCell); - tbody.appendChild(row); + item.appendChild(actionName); + item.appendChild(hotkeySpan); + grid.appendChild(item); } updateConflicts(); - table.appendChild(thead); - table.appendChild(tbody); - content.appendChild(table); + content.appendChild(grid); modal.appendChild(header); modal.appendChild(content); From b14700f81e21a487692ef108771d6a5111064a02 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Wed, 21 Jan 2026 22:59:53 -0500 Subject: [PATCH 75/87] Working grid settings layout --- packages/userscripts/keybinds-improved/settings.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/userscripts/keybinds-improved/settings.ts b/packages/userscripts/keybinds-improved/settings.ts index 8b2eba1..f0ce502 100644 --- a/packages/userscripts/keybinds-improved/settings.ts +++ b/packages/userscripts/keybinds-improved/settings.ts @@ -105,9 +105,10 @@ const createModalStyles = (): HTMLStyleElement => { } .hotkey-item { - display: flex; - justify-content: space-between; + display: grid; + grid-template-columns: 1fr auto; align-items: center; + gap: 12px; padding: 8px 12px; border: 1px solid #333; border-radius: 4px; @@ -119,7 +120,9 @@ const createModalStyles = (): HTMLStyleElement => { } .hotkey-action { - flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } .hotkey-key { From 3c40b4a239b8be235d1c55f1c6d64d4aa6e4ce13 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Wed, 21 Jan 2026 23:36:47 -0500 Subject: [PATCH 76/87] Finalized initial version of grid settings UI grouped by category --- .../userscripts/keybinds-improved/settings.ts | 189 +++++++++++++++--- 1 file changed, 156 insertions(+), 33 deletions(-) diff --git a/packages/userscripts/keybinds-improved/settings.ts b/packages/userscripts/keybinds-improved/settings.ts index f0ce502..e18ffdf 100644 --- a/packages/userscripts/keybinds-improved/settings.ts +++ b/packages/userscripts/keybinds-improved/settings.ts @@ -31,6 +31,28 @@ const formatActionName = (action: string): string => { return action.replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase()); }; +const CATEGORIES: Record = { + "Basic Actions": ["run", "eat", "lightFire"], + Equipment: ["equip1", "equip2", "equip3"], + Badges: ["badge1", "badge2", "badge3", "badge4"], + Teleports: [ + "teleport_everbrook", + "teleport_mysticvale", + "teleport_omboko", + "teleport_dock_haven", + "teleport_jafa_outpost", + "teleport_frostvale", + ], + "Worship Skills": [ + "remote_sell", + "dig", + "timers", + "auto_hell_burying", + "hunting_contact", + "mass_pickup", + ], +}; + const createModalStyles = (): HTMLStyleElement => { const style = document.createElement("style"); style.textContent = ` @@ -38,13 +60,13 @@ const createModalStyles = (): HTMLStyleElement => { position: fixed; top: 0; left: 0; - width: 100%; - height: 100%; + width: 100vw; + height: 100vh; background: rgba(0, 0, 0, 0.7); display: none; justify-content: center; - align-items: center; z-index: 10000; + padding-top: 5vh; } #hotkeys-modal-overlay.visible { @@ -55,11 +77,13 @@ const createModalStyles = (): HTMLStyleElement => { background: #1a1a2e; border: 2px solid #4a4a6a; border-radius: 8px; - max-width: 850px; + max-width: 1000px; max-height: 80vh; width: 90%; overflow: hidden; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.5); + height: fit-content; + padding-bottom: 20px; } #hotkeys-modal-header { @@ -97,11 +121,54 @@ const createModalStyles = (): HTMLStyleElement => { padding: 16px; } + .hotkey-category { + font-size: 16px; + font-weight: 600; + color: #e0e0e0; + padding: 12px 0 8px 0; + border-bottom: 2px solid #4a4a6a; + margin-bottom: 8px; + } + #hotkeys-grid { + display: flex; + flex-direction: column; + gap: 16px; + color: #e0e0e0; + } + + .category-section { + display: contents; + } + + .category-section.full-width { + display: flex; + flex-direction: column; + gap: 8px; + } + + .small-categories-row { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); + gap: 16px; + } + + .small-category-container { + display: flex; + flex-direction: column; + gap: 8px; + } + + .full-width .items-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 8px; - color: #e0e0e0; + } + + .small-category-container .items-grid { + display: flex; + flex-direction: column; + gap: 8px; } .hotkey-item { @@ -119,12 +186,6 @@ const createModalStyles = (): HTMLStyleElement => { background: #252540; } - .hotkey-action { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - .hotkey-key { display: inline-block; background: #333; @@ -302,34 +363,96 @@ const createModal = (): HTMLDivElement => { const hotkeys = mergeHotkeys(); - for (const [action, kp] of Object.entries(hotkeys) as [ - keyof actions, - keypress, - ][]) { - const actionInfo = ACTIONS[action]; - if (!actionInfo) continue; + // Group categories by size + const smallCategories: [string, (keyof actions)[]][] = []; + const largeCategories: [string, (keyof actions)[]][] = []; + + for (const [categoryName, categoryActions] of Object.entries(CATEGORIES)) { + if (categoryActions.length <= 4) { + smallCategories.push([categoryName, categoryActions]); + } else { + largeCategories.push([categoryName, categoryActions]); + } + } + + // Helper function to create category items + const createCategoryItems = ( + categoryActions: (keyof actions)[], + ): HTMLElement[] => { + const items: HTMLElement[] = []; + for (const action of categoryActions) { + const kp = hotkeys[action]; + const actionInfo = ACTIONS[action]; + if (!actionInfo || !kp) continue; + + const item = document.createElement("div"); + item.className = "hotkey-item"; + + const actionName = document.createElement("span"); + actionName.className = "hotkey-action"; + actionName.textContent = formatActionName(action); + + const hotkeySpan = document.createElement("span"); + hotkeySpan.className = "hotkey-key"; + hotkeySpan.textContent = formatKeypress(kp); + hotkeySpan.dataset.action = action; + + allSpans.push(hotkeySpan); + + hotkeySpan.addEventListener("click", () => { + startRecording(hotkeySpan, action); + }); + + item.appendChild(actionName); + item.appendChild(hotkeySpan); + items.push(item); + } + return items; + }; + + // Add small categories in a row + if (smallCategories.length > 0) { + const smallCategoriesRow = document.createElement("div"); + smallCategoriesRow.className = "small-categories-row"; - const item = document.createElement("div"); - item.className = "hotkey-item"; + for (const [categoryName, categoryActions] of smallCategories) { + const container = document.createElement("div"); + container.className = "small-category-container"; - const actionName = document.createElement("span"); - actionName.className = "hotkey-action"; - actionName.textContent = formatActionName(action); + const categoryHeader = document.createElement("div"); + categoryHeader.className = "hotkey-category"; + categoryHeader.textContent = categoryName; + container.appendChild(categoryHeader); + + const itemsGrid = document.createElement("div"); + itemsGrid.className = "items-grid"; + const items = createCategoryItems(categoryActions); + items.forEach((item) => itemsGrid.appendChild(item)); + container.appendChild(itemsGrid); + + smallCategoriesRow.appendChild(container); + } + + grid.appendChild(smallCategoriesRow); + } - const hotkeySpan = document.createElement("span"); - hotkeySpan.className = "hotkey-key"; - hotkeySpan.textContent = formatKeypress(kp); - hotkeySpan.dataset.action = action; + // Add large categories + for (const [categoryName, categoryActions] of largeCategories) { + const section = document.createElement("div"); + section.className = "category-section full-width"; - allSpans.push(hotkeySpan); + const categoryHeader = document.createElement("div"); + categoryHeader.className = "hotkey-category"; + categoryHeader.textContent = categoryName; + section.appendChild(categoryHeader); - hotkeySpan.addEventListener("click", () => { - startRecording(hotkeySpan, action); - }); + const itemsGrid = document.createElement("div"); + itemsGrid.className = "items-grid"; + const items = createCategoryItems(categoryActions); + items.forEach((item) => itemsGrid.appendChild(item)); + section.appendChild(itemsGrid); - item.appendChild(actionName); - item.appendChild(hotkeySpan); - grid.appendChild(item); + grid.appendChild(section); } updateConflicts(); From e4276613192d35a96b9f2f3ad6dde99b17e4c46a Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 22 Jan 2026 00:25:54 -0500 Subject: [PATCH 77/87] Made build script prepend FlatMMO to the front of the script names for optimal Greasy Fork SEO --- packages/build/build-userscript.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index 6c209a7..2d0b11e 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -21,7 +21,7 @@ export const buildScript = async (packageName: string) => { // Temp auto versioning const defaultMetadataValues: ViolentmonkeyMetadata = { - name: packageInfo.name + name: `FlatMMO ${packageInfo.name}` .replaceAll("-", " ") .split(" ") .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase()) From 17f67158474608343f8bc579891a737b38bf4dff Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sun, 25 Jan 2026 19:50:32 -0500 Subject: [PATCH 78/87] started on rough poc for dev tools plugin --- bun.lock | 143 +++++++- bun.nix | 261 +++++++++++++- package.json | 1 + packages/build/build-userscript.ts | 11 +- packages/lib/flatmmo-types/flatmmo.d.ts | 19 + packages/userscripts/dev-tools/App.module.css | 23 ++ packages/userscripts/dev-tools/index.tsx | 160 +++++++++ packages/userscripts/dev-tools/package.json | 13 + test/UserscriptMetadata.test.ts | 324 ++++++++++++++++++ tsconfig.json | 3 +- 10 files changed, 948 insertions(+), 10 deletions(-) create mode 100644 packages/userscripts/dev-tools/App.module.css create mode 100644 packages/userscripts/dev-tools/index.tsx create mode 100644 packages/userscripts/dev-tools/package.json create mode 100644 test/UserscriptMetadata.test.ts diff --git a/bun.lock b/bun.lock index e1f58fa..db8e4dc 100644 --- a/bun.lock +++ b/bun.lock @@ -11,6 +11,7 @@ "devDependencies": { "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", + "bun-plugin-solid": "^1.0.0", "flatmmo-types": "workspace:*", "typescript": "^5.9.3", }, @@ -27,6 +28,18 @@ "flatmmo-types": "workspace:*", }, }, + "packages/userscripts/dev-tools": { + "name": "dev-tools", + "version": "1.0.0", + "dependencies": { + "solid-js": "^1.9.5", + }, + "devDependencies": { + "@violentmonkey/types": "^0.3.1", + "bun-plugin-solid": "^1.0.0", + "flatmmo-types": "workspace:*", + }, + }, "packages/userscripts/hud-improved": { "name": "hud-improved", "version": "1.0.0", @@ -45,12 +58,78 @@ }, }, "packages": { + "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="], + + "@babel/compat-data": ["@babel/compat-data@7.28.6", "", {}, "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg=="], + + "@babel/core": ["@babel/core@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw=="], + + "@babel/generator": ["@babel/generator@7.28.6", "", { "dependencies": { "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw=="], + + "@babel/helper-annotate-as-pure": ["@babel/helper-annotate-as-pure@7.27.3", "", { "dependencies": { "@babel/types": "^7.27.3" } }, "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="], + + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "dependencies": { "@babel/compat-data": "^7.28.6", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + + "@babel/helper-create-class-features-plugin": ["@babel/helper-create-class-features-plugin@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/helper-replace-supers": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/traverse": "^7.28.6", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="], + + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + + "@babel/helper-member-expression-to-functions": ["@babel/helper-member-expression-to-functions@7.28.5", "", { "dependencies": { "@babel/traverse": "^7.28.5", "@babel/types": "^7.28.5" } }, "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="], + + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + + "@babel/helper-optimise-call-expression": ["@babel/helper-optimise-call-expression@7.27.1", "", { "dependencies": { "@babel/types": "^7.27.1" } }, "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="], + + "@babel/helper-plugin-utils": ["@babel/helper-plugin-utils@7.28.6", "", {}, "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="], + + "@babel/helper-replace-supers": ["@babel/helper-replace-supers@7.28.6", "", { "dependencies": { "@babel/helper-member-expression-to-functions": "^7.28.5", "@babel/helper-optimise-call-expression": "^7.27.1", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="], + + "@babel/helper-skip-transparent-expression-wrappers": ["@babel/helper-skip-transparent-expression-wrappers@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="], + + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + + "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + + "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], + + "@babel/plugin-syntax-jsx": ["@babel/plugin-syntax-jsx@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="], + + "@babel/plugin-syntax-typescript": ["@babel/plugin-syntax-typescript@7.28.6", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="], + + "@babel/plugin-transform-modules-commonjs": ["@babel/plugin-transform-modules-commonjs@7.28.6", "", { "dependencies": { "@babel/helper-module-transforms": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="], + + "@babel/plugin-transform-typescript": ["@babel/plugin-transform-typescript@7.28.6", "", { "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.3", "@babel/helper-create-class-features-plugin": "^7.28.6", "@babel/helper-plugin-utils": "^7.28.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="], + + "@babel/preset-typescript": ["@babel/preset-typescript@7.28.5", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1", "@babel/helper-validator-option": "^7.27.1", "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-transform-modules-commonjs": "^7.27.1", "@babel/plugin-transform-typescript": "^7.28.5" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="], + + "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + + "@babel/traverse": ["@babel/traverse@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/types": "^7.28.6", "debug": "^4.3.1" } }, "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg=="], + + "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], + "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], + + "@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="], + + "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], + + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.1", "", { "dependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1", "@tybys/wasm-util": "^0.10.1" } }, "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="], "@oxc-parser/binding-android-arm-eabi": ["@oxc-parser/binding-android-arm-eabi@0.108.0", "", { "os": "android", "cpu": "arm" }, "sha512-TemaHZYErFqspRHfsGb1dvWICigOciP4xKlcBVvO8znkHzdJGWbtPwqQc5f1cfrdFynctXIzRQh3qizzQJMqpg=="], @@ -101,34 +180,94 @@ "@types/bun": ["@types/bun@1.3.6", "", { "dependencies": { "bun-types": "1.3.6" } }, "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="], - "@types/node": ["@types/node@25.0.9", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="], + "@types/node": ["@types/node@25.0.10", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="], "@violentmonkey/types": ["@violentmonkey/types@0.3.2", "", { "dependencies": { "user-agent-data-types": "^0.4.2" } }, "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="], + "babel-plugin-jsx-dom-expressions": ["babel-plugin-jsx-dom-expressions@0.40.3", "", { "dependencies": { "@babel/helper-module-imports": "7.18.6", "@babel/plugin-syntax-jsx": "^7.18.6", "@babel/types": "^7.20.7", "html-entities": "2.3.3", "parse5": "^7.1.2" }, "peerDependencies": { "@babel/core": "^7.20.12" } }, "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w=="], + + "babel-preset-solid": ["babel-preset-solid@1.9.10", "", { "dependencies": { "babel-plugin-jsx-dom-expressions": "^0.40.3" }, "peerDependencies": { "@babel/core": "^7.0.0", "solid-js": "^1.9.10" }, "optionalPeers": ["solid-js"] }, "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ=="], + + "baseline-browser-mapping": ["baseline-browser-mapping@2.9.18", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA=="], + + "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + + "bun-plugin-solid": ["bun-plugin-solid@1.0.0", "", { "dependencies": { "@babel/core": ">=7.0.0", "@babel/preset-typescript": ">=7.0.0", "babel-preset-solid": ">=1.8.0" } }, "sha512-H4ZcW4afCLYLDtBsog5cvCfQo8f5E7SD8AeT1woVmIKBOMguy/ml9f1jz9UlikN/i+VK1bS6GII46ZR2OdhbBQ=="], + "bun-types": ["bun-types@1.3.6", "", { "dependencies": { "@types/node": "*" } }, "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="], + "caniuse-lite": ["caniuse-lite@1.0.30001766", "", {}, "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA=="], + "chat-space-fix": ["chat-space-fix@workspace:packages/userscripts/chat-space-fix"], - "effect": ["effect@3.19.14", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], + + "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], + + "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], + + "dev-tools": ["dev-tools@workspace:packages/userscripts/dev-tools"], + + "effect": ["effect@3.19.15", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-vzMmgfZKLcojmUjBdlQx+uaKryO7yULlRxjpDnHdnvcp1NPHxJyoM6IOXBLlzz2I/uPtZpGKavt5hBv7IvGZkA=="], + + "electron-to-chromium": ["electron-to-chromium@1.5.278", "", {}, "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw=="], + + "entities": ["entities@6.0.1", "", {}, "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="], + + "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "fast-check": ["fast-check@3.23.2", "", { "dependencies": { "pure-rand": "^6.1.0" } }, "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="], "flatmmo-types": ["flatmmo-types@workspace:packages/lib/flatmmo-types"], + "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], + + "html-entities": ["html-entities@2.3.3", "", {}, "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="], + "hud-improved": ["hud-improved@workspace:packages/userscripts/hud-improved"], + "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], + + "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], + "keybinds-improved": ["keybinds-improved@workspace:packages/userscripts/keybinds-improved"], + "lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], + + "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], + + "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + "oxc-parser": ["oxc-parser@0.108.0", "", { "dependencies": { "@oxc-project/types": "^0.108.0" }, "optionalDependencies": { "@oxc-parser/binding-android-arm-eabi": "0.108.0", "@oxc-parser/binding-android-arm64": "0.108.0", "@oxc-parser/binding-darwin-arm64": "0.108.0", "@oxc-parser/binding-darwin-x64": "0.108.0", "@oxc-parser/binding-freebsd-x64": "0.108.0", "@oxc-parser/binding-linux-arm-gnueabihf": "0.108.0", "@oxc-parser/binding-linux-arm-musleabihf": "0.108.0", "@oxc-parser/binding-linux-arm64-gnu": "0.108.0", "@oxc-parser/binding-linux-arm64-musl": "0.108.0", "@oxc-parser/binding-linux-ppc64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-gnu": "0.108.0", "@oxc-parser/binding-linux-riscv64-musl": "0.108.0", "@oxc-parser/binding-linux-s390x-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-gnu": "0.108.0", "@oxc-parser/binding-linux-x64-musl": "0.108.0", "@oxc-parser/binding-openharmony-arm64": "0.108.0", "@oxc-parser/binding-wasm32-wasi": "0.108.0", "@oxc-parser/binding-win32-arm64-msvc": "0.108.0", "@oxc-parser/binding-win32-ia32-msvc": "0.108.0", "@oxc-parser/binding-win32-x64-msvc": "0.108.0" } }, "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="], + "parse5": ["parse5@7.3.0", "", { "dependencies": { "entities": "^6.0.0" } }, "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], + "semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], + + "seroval": ["seroval@1.5.0", "", {}, "sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw=="], + + "seroval-plugins": ["seroval-plugins@1.5.0", "", { "peerDependencies": { "seroval": "^1.0" } }, "sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA=="], + + "solid-js": ["solid-js@1.9.11", "", { "dependencies": { "csstype": "^3.1.0", "seroval": "~1.5.0", "seroval-plugins": "~1.5.0" } }, "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q=="], + "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "user-agent-data-types": ["user-agent-data-types@0.4.2", "", {}, "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="], + + "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], + + "babel-plugin-jsx-dom-expressions/@babel/helper-module-imports": ["@babel/helper-module-imports@7.18.6", "", { "dependencies": { "@babel/types": "^7.18.6" } }, "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="], } } diff --git a/bun.nix b/bun.nix index 4ebb04c..c753980 100644 --- a/bun.nix +++ b/bun.nix @@ -13,6 +13,122 @@ ... }: { + "@babel/code-frame@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz"; + hash = "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="; + }; + "@babel/compat-data@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz"; + hash = "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg=="; + }; + "@babel/core@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz"; + hash = "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw=="; + }; + "@babel/generator@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/generator/-/generator-7.28.6.tgz"; + hash = "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw=="; + }; + "@babel/helper-annotate-as-pure@7.27.3" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz"; + hash = "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg=="; + }; + "@babel/helper-compilation-targets@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz"; + hash = "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="; + }; + "@babel/helper-create-class-features-plugin@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz"; + hash = "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow=="; + }; + "@babel/helper-globals@7.28.0" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz"; + hash = "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="; + }; + "@babel/helper-member-expression-to-functions@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz"; + hash = "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg=="; + }; + "@babel/helper-module-imports@7.18.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz"; + hash = "sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA=="; + }; + "@babel/helper-module-imports@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz"; + hash = "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="; + }; + "@babel/helper-module-transforms@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz"; + hash = "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="; + }; + "@babel/helper-optimise-call-expression@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz"; + hash = "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw=="; + }; + "@babel/helper-plugin-utils@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz"; + hash = "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug=="; + }; + "@babel/helper-replace-supers@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz"; + hash = "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg=="; + }; + "@babel/helper-skip-transparent-expression-wrappers@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz"; + hash = "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg=="; + }; + "@babel/helper-string-parser@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz"; + hash = "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="; + }; + "@babel/helper-validator-identifier@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz"; + hash = "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="; + }; + "@babel/helper-validator-option@7.27.1" = fetchurl { + url = "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz"; + hash = "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="; + }; + "@babel/helpers@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz"; + hash = "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="; + }; + "@babel/parser@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz"; + hash = "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="; + }; + "@babel/plugin-syntax-jsx@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz"; + hash = "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w=="; + }; + "@babel/plugin-syntax-typescript@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz"; + hash = "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A=="; + }; + "@babel/plugin-transform-modules-commonjs@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz"; + hash = "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA=="; + }; + "@babel/plugin-transform-typescript@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz"; + hash = "sha512-0YWL2RFxOqEm9Efk5PvreamxPME8OyY0wM5wh5lHjF+VtVhdneCWGzZeSqzOfiobVqQaNCd2z0tQvnI9DaPWPw=="; + }; + "@babel/preset-typescript@7.28.5" = fetchurl { + url = "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz"; + hash = "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g=="; + }; + "@babel/template@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz"; + hash = "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="; + }; + "@babel/traverse@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.6.tgz"; + hash = "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg=="; + }; + "@babel/types@7.28.6" = fetchurl { + url = "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz"; + hash = "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="; + }; "@emnapi/core@1.8.1" = fetchurl { url = "https://registry.npmjs.org/@emnapi/core/-/core-1.8.1.tgz"; hash = "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="; @@ -25,6 +141,26 @@ url = "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz"; hash = "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="; }; + "@jridgewell/gen-mapping@0.3.13" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz"; + hash = "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="; + }; + "@jridgewell/remapping@2.3.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz"; + hash = "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="; + }; + "@jridgewell/resolve-uri@3.1.2" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz"; + hash = "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="; + }; + "@jridgewell/sourcemap-codec@1.5.5" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz"; + hash = "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="; + }; + "@jridgewell/trace-mapping@0.3.31" = fetchurl { + url = "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz"; + hash = "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="; + }; "@napi-rs/wasm-runtime@1.1.1" = fetchurl { url = "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.1.tgz"; hash = "sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A=="; @@ -125,38 +261,143 @@ url = "https://registry.npmjs.org/@types/bun/-/bun-1.3.6.tgz"; hash = "sha512-uWCv6FO/8LcpREhenN1d1b6fcspAB+cefwD7uti8C8VffIv0Um08TKMn98FynpTiU38+y2dUO55T11NgDt8VAA=="; }; - "@types/node@25.0.9" = fetchurl { - url = "https://registry.npmjs.org/@types/node/-/node-25.0.9.tgz"; - hash = "sha512-/rpCXHlCWeqClNBwUhDcusJxXYDjZTyE8v5oTO7WbL8eij2nKhUeU89/6xgjU7N4/Vh3He0BtyhJdQbDyhiXAw=="; + "@types/node@25.0.10" = fetchurl { + url = "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz"; + hash = "sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg=="; }; "@violentmonkey/types@0.3.2" = fetchurl { url = "https://registry.npmjs.org/@violentmonkey/types/-/types-0.3.2.tgz"; hash = "sha512-SclmkQqyN22upcCsNYoRDh3Tco7YRGXHBThWOSl09YA3fk7DxSi1sKDfm0uVQc+g8wrjfykVxN3Ws7Jh+5ccIg=="; }; + "babel-plugin-jsx-dom-expressions@0.40.3" = fetchurl { + url = "https://registry.npmjs.org/babel-plugin-jsx-dom-expressions/-/babel-plugin-jsx-dom-expressions-0.40.3.tgz"; + hash = "sha512-5HOwwt0BYiv/zxl7j8Pf2bGL6rDXfV6nUhLs8ygBX+EFJXzBPHM/euj9j/6deMZ6wa52Wb2PBaAV5U/jKwIY1w=="; + }; + "babel-preset-solid@1.9.10" = fetchurl { + url = "https://registry.npmjs.org/babel-preset-solid/-/babel-preset-solid-1.9.10.tgz"; + hash = "sha512-HCelrgua/Y+kqO8RyL04JBWS/cVdrtUv/h45GntgQY+cJl4eBcKkCDV3TdMjtKx1nXwRaR9QXslM/Npm1dxdZQ=="; + }; + "baseline-browser-mapping@2.9.18" = fetchurl { + url = "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.18.tgz"; + hash = "sha512-e23vBV1ZLfjb9apvfPk4rHVu2ry6RIr2Wfs+O324okSidrX7pTAnEJPCh/O5BtRlr7QtZI7ktOP3vsqr7Z5XoA=="; + }; + "browserslist@4.28.1" = fetchurl { + url = "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"; + hash = "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="; + }; + "bun-plugin-solid@1.0.0" = fetchurl { + url = "https://registry.npmjs.org/bun-plugin-solid/-/bun-plugin-solid-1.0.0.tgz"; + hash = "sha512-H4ZcW4afCLYLDtBsog5cvCfQo8f5E7SD8AeT1woVmIKBOMguy/ml9f1jz9UlikN/i+VK1bS6GII46ZR2OdhbBQ=="; + }; "bun-types@1.3.6" = fetchurl { url = "https://registry.npmjs.org/bun-types/-/bun-types-1.3.6.tgz"; hash = "sha512-OlFwHcnNV99r//9v5IIOgQ9Uk37gZqrNMCcqEaExdkVq3Avwqok1bJFmvGMCkCE0FqzdY8VMOZpfpR3lwI+CsQ=="; }; + "caniuse-lite@1.0.30001766" = fetchurl { + url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001766.tgz"; + hash = "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA=="; + }; "chat-space-fix" = copyPathToStore ./packages/userscripts/chat-space-fix; - "effect@3.19.14" = fetchurl { - url = "https://registry.npmjs.org/effect/-/effect-3.19.14.tgz"; - hash = "sha512-3vwdq0zlvQOxXzXNKRIPKTqZNMyGCdaFUBfMPqpsyzZDre67kgC1EEHDV4EoQTovJ4w5fmJW756f86kkuz7WFA=="; + "convert-source-map@2.0.0" = fetchurl { + url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz"; + hash = "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="; + }; + "csstype@3.2.3" = fetchurl { + url = "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"; + hash = "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="; + }; + "debug@4.4.3" = fetchurl { + url = "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz"; + hash = "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="; + }; + "dev-tools" = copyPathToStore ./packages/userscripts/dev-tools; + "effect@3.19.15" = fetchurl { + url = "https://registry.npmjs.org/effect/-/effect-3.19.15.tgz"; + hash = "sha512-vzMmgfZKLcojmUjBdlQx+uaKryO7yULlRxjpDnHdnvcp1NPHxJyoM6IOXBLlzz2I/uPtZpGKavt5hBv7IvGZkA=="; + }; + "electron-to-chromium@1.5.278" = fetchurl { + url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.278.tgz"; + hash = "sha512-dQ0tM1svDRQOwxnXxm+twlGTjr9Upvt8UFWAgmLsxEzFQxhbti4VwxmMjsDxVC51Zo84swW7FVCXEV+VAkhuPw=="; + }; + "entities@6.0.1" = fetchurl { + url = "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz"; + hash = "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g=="; + }; + "escalade@3.2.0" = fetchurl { + url = "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz"; + hash = "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="; }; "fast-check@3.23.2" = fetchurl { url = "https://registry.npmjs.org/fast-check/-/fast-check-3.23.2.tgz"; hash = "sha512-h5+1OzzfCC3Ef7VbtKdcv7zsstUQwUDlYpUTvjeUsJAssPgLn7QzbboPtL5ro04Mq0rPOsMzl7q5hIbRs2wD1A=="; }; "flatmmo-types" = copyPathToStore ./packages/lib/flatmmo-types; + "gensync@1.0.0-beta.2" = fetchurl { + url = "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"; + hash = "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="; + }; + "html-entities@2.3.3" = fetchurl { + url = "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz"; + hash = "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA=="; + }; "hud-improved" = copyPathToStore ./packages/userscripts/hud-improved; + "js-tokens@4.0.0" = fetchurl { + url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"; + hash = "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="; + }; + "jsesc@3.1.0" = fetchurl { + url = "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz"; + hash = "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="; + }; + "json5@2.2.3" = fetchurl { + url = "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz"; + hash = "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="; + }; "keybinds-improved" = copyPathToStore ./packages/userscripts/keybinds-improved; + "lru-cache@5.1.1" = fetchurl { + url = "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz"; + hash = "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="; + }; + "ms@2.1.3" = fetchurl { + url = "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"; + hash = "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="; + }; + "node-releases@2.0.27" = fetchurl { + url = "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz"; + hash = "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="; + }; "oxc-parser@0.108.0" = fetchurl { url = "https://registry.npmjs.org/oxc-parser/-/oxc-parser-0.108.0.tgz"; hash = "sha512-eM0GUxQgVZXZxB364HRlakUH8rBxh5E6dN+RiiCLtOk84WgLFbhydULyd2DUJYxguvcbjWUmmKgVDyvVCeplDA=="; }; + "parse5@7.3.0" = fetchurl { + url = "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz"; + hash = "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw=="; + }; + "picocolors@1.1.1" = fetchurl { + url = "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"; + hash = "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="; + }; "pure-rand@6.1.0" = fetchurl { url = "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz"; hash = "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="; }; + "semver@6.3.1" = fetchurl { + url = "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz"; + hash = "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="; + }; + "seroval-plugins@1.5.0" = fetchurl { + url = "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.0.tgz"; + hash = "sha512-EAHqADIQondwRZIdeW2I636zgsODzoBDwb3PT/+7TLDWyw1Dy/Xv7iGUIEXXav7usHDE9HVhOU61irI3EnyyHA=="; + }; + "seroval@1.5.0" = fetchurl { + url = "https://registry.npmjs.org/seroval/-/seroval-1.5.0.tgz"; + hash = "sha512-OE4cvmJ1uSPrKorFIH9/w/Qwuvi/IMcGbv5RKgcJ/zjA/IohDLU6SVaxFN9FwajbP7nsX0dQqMDes1whk3y+yw=="; + }; + "solid-js@1.9.11" = fetchurl { + url = "https://registry.npmjs.org/solid-js/-/solid-js-1.9.11.tgz"; + hash = "sha512-WEJtcc5mkh/BnHA6Yrg4whlF8g6QwpmXXRg4P2ztPmcKeHHlH4+djYecBLhSpecZY2RRECXYUwIc/C2r3yzQ4Q=="; + }; "tslib@2.8.1" = fetchurl { url = "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz"; hash = "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="; @@ -169,8 +410,16 @@ url = "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz"; hash = "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="; }; + "update-browserslist-db@1.2.3" = fetchurl { + url = "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz"; + hash = "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="; + }; "user-agent-data-types@0.4.2" = fetchurl { url = "https://registry.npmjs.org/user-agent-data-types/-/user-agent-data-types-0.4.2.tgz"; hash = "sha512-jXep3kO/dGNmDOkbDa8ccp4QArgxR4I76m3QVcJ1aOF0B9toc+YtSXtX5gLdDTZXyWlpQYQrABr6L1L2GZOghw=="; }; + "yallist@3.1.1" = fetchurl { + url = "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz"; + hash = "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="; + }; } \ No newline at end of file diff --git a/package.json b/package.json index 5e2602f..9cd597b 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "devDependencies": { "@types/bun": "^1.3.4", "@violentmonkey/types": "^0.3.1", + "bun-plugin-solid": "^1.0.0", "flatmmo-types": "workspace:*", "typescript": "^5.9.3" }, diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index 2d0b11e..6fff89a 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -1,4 +1,6 @@ import { parseSync, Visitor } from "oxc-parser"; +import { SolidPlugin } from "bun-plugin-solid"; + import { Schema } from "effect"; import { generateMetadataString, @@ -76,7 +78,14 @@ const parseGrantsCalled = (scriptText: string) => { const getBundledScript = async (entrypoint: string) => { const bundled = await Bun.build({ entrypoints: [entrypoint], + plugins: [SolidPlugin({ generate: "dom", hydratable: false })], }); - return await bundled.outputs[0].text(); + const css = bundled.outputs.filter((x) => x.path.endsWith(".css")).pop(); + const js = await bundled.outputs[0].text(); + if (css) { + const injectCSS = `const cssString = \`${await css.text()}\`;\nGM.addStyle(cssString);`; + return [js, injectCSS].join("\n\n"); + } + return js; }; diff --git a/packages/lib/flatmmo-types/flatmmo.d.ts b/packages/lib/flatmmo-types/flatmmo.d.ts index 90feaff..2fd2d21 100644 --- a/packages/lib/flatmmo-types/flatmmo.d.ts +++ b/packages/lib/flatmmo-types/flatmmo.d.ts @@ -8,6 +8,11 @@ declare function has_modal_open(): boolean; declare function keypress_listener(): void; declare function keydown_listener(): void; declare const chat_ele: HTMLInputElement; +declare function server_command( + key: string, + values: unknown, + raw_data: unknown, +): void; declare function paint_progress_bar(): void; declare let progress_bar_active: boolean; @@ -30,6 +35,19 @@ interface player { username: string; client_x: number; client_y: number; + x: number; + y: number; + level: number; + hp: number; +} +interface npc { + name: string; + client_x: number; + client_y: number; + x: number; + y: number; + in_combat: boolean; + hp: number; } interface mouseOver { @@ -42,5 +60,6 @@ interface mouseOver { declare const mouse_over_now: mouseOver; declare const players: player[]; +declare const npcs: npc[]; declare const Globals: Globals; diff --git a/packages/userscripts/dev-tools/App.module.css b/packages/userscripts/dev-tools/App.module.css new file mode 100644 index 0000000..26c3f28 --- /dev/null +++ b/packages/userscripts/dev-tools/App.module.css @@ -0,0 +1,23 @@ +.App { + text-align: start; +} + +.header { + background-color: #282c34; + min-height: 100vh; + display: flex; + flex-direction: column; + /* font-size: calc(10px + 2vmin); */ + color: white; +} + +.link { + color: #b318f0; +} + +.columns { + display: flex; + flex-direction: row; + gap: 25px; + padding: 25px; +} \ No newline at end of file diff --git a/packages/userscripts/dev-tools/index.tsx b/packages/userscripts/dev-tools/index.tsx new file mode 100644 index 0000000..1996396 --- /dev/null +++ b/packages/userscripts/dev-tools/index.tsx @@ -0,0 +1,160 @@ +/* @refresh reload */ + +import { createSignal, For, type Component } from "solid-js"; +import { render } from "solid-js/web"; +// import cssString from "./App.module.css" with { type: "text" }; +import styles from "./App.module.css"; + +// import 'solid-devtools'; + +// import './index.css'; +const root = document.createElement("div"); +const body = document.getElementById("body"); +body.appendChild(root); +// GM.addStyle(cssString); + +// if (import.meta.env.DEV && !(root instanceof HTMLElement)) { +// throw new Error( +// 'Root element not found. Did you forget to add it to your index.html? Or maybe the id attribute got misspelled?', +// ); +// } +const [currPlayers, setPlayers] = createSignal([]); +const [items, setItems] = createSignal([]); +const [currNpcs, setCurrNpcs] = createSignal([]); + +const [progressBarStatus, setCount] = createSignal({ + progress_bar_at, + progress_bar_active, + progress_bar_target, + current_action_uuid, +}); +const [socketEvents, setSocketEvents] = createSignal([]); +const setLatestSocketEvents = (key: string) => { + if (socketEvents().length >= 10) { + setSocketEvents([key, ...socketEvents().slice(0, 10)]); + } else { + setSocketEvents([key, ...socketEvents()]); + } +}; +const webSocketProxy = new Proxy(server_command, { + // wraps + apply(target, thisArg, argArray) { + const [key, values, raw_data] = argArray; + // console.log(target.arguments); + // console.log(key, values, raw_data); + target(key, values, raw_data); + if (key === "PROGRESS_BAR" || key === "PROGRESS_BAR_OFF") { + setCount({ + progress_bar_at, + progress_bar_active, + progress_bar_target, + current_action_uuid, + }); + } + if (key === "ACTION_ID_UPDATED") { + setCount({ + progress_bar_at, + progress_bar_active, + progress_bar_target, + current_action_uuid, + }); + } + setPlayers( + Object.entries(players).map( + ([name, p]) => `${name} hp: ${p.hp ?? "-"} x:${p.x} y:${p.y}`, + ), + ); + setCurrNpcs( + Object.values(npcs).map( + (p) => + `${p.name} hp: ${p.hp} x:${p.x} y:${p.y} in_combat: ${p.in_combat}`, + ), + ); + setLatestSocketEvents(key); + }, +}); + +server_command = webSocketProxy; + +const ProgressTracker: Component = () => { + return ( +
    +
    +

    Status

    +

    + progress_bar_active:{" "} + {progressBarStatus().progress_bar_active.toString()} +

    +
    +
    +

    progress_bar_at: {progressBarStatus().progress_bar_at}

    +
    +
    +

    progress_bar_target: {progressBarStatus().progress_bar_target}

    +
    +
    +

    current_action_id: {progressBarStatus().current_action_uuid}

    +
    +
    + ); +}; + +const SocketChatter: Component = () => { + return ( +
    +

    Recent Socket Messages

    + + {(socket, i) => ( +

    + {i()}: {socket} +

    + )} +
    {" "} +
    + ); +}; +const Players: Component = () => { + return ( +
    +

    Players

    + + {(socket, i) => ( +

    + {i()}: {socket} +

    + )} +
    {" "} +
    + ); +}; +const Npcs: Component = () => { + return ( +
    +

    NPCs

    + + {(socket, i) => ( +

    + {i()}: {socket} +

    + )} +
    {" "} +
    + ); +}; + +const App: Component = () => { + return ( +
    +
    +
    + + + + +
    +
    +
    + ); +}; + +render(() => , root); diff --git a/packages/userscripts/dev-tools/package.json b/packages/userscripts/dev-tools/package.json new file mode 100644 index 0000000..d5b5cc8 --- /dev/null +++ b/packages/userscripts/dev-tools/package.json @@ -0,0 +1,13 @@ +{ + "name": "dev-tools", + "version": "1.0.0", + "module": "index.tsx", + "dependencies": { + "solid-js": "^1.9.5" + }, + "devDependencies": { + "@violentmonkey/types": "^0.3.1", + "bun-plugin-solid": "^1.0.0", + "flatmmo-types": "workspace:*" + } +} diff --git a/test/UserscriptMetadata.test.ts b/test/UserscriptMetadata.test.ts new file mode 100644 index 0000000..41b2286 --- /dev/null +++ b/test/UserscriptMetadata.test.ts @@ -0,0 +1,324 @@ +import { test, expect, describe } from "bun:test"; +import { + generateMetadataString, + type ViolentmonkeyMetadata, +} from "../packages/build/UserscriptMetadata"; + +describe("generateMetadataString", () => { + test("generates basic metadata with required fields", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// ==UserScript=="); + expect(result).toContain("// ==/UserScript=="); + expect(result).toContain("// @name Test Script"); + }); + + test("handles optional string fields", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + namespace: "https://example.com", + version: "1.0.0", + description: "A test script", + icon: "https://example.com/icon.png", + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @name Test Script"); + expect(result).toContain("// @namespace https://example.com"); + expect(result).toContain("// @version 1.0.0"); + expect(result).toContain("// @description A test script"); + expect(result).toContain("// @icon https://example.com/icon.png"); + }); + + test("handles list fields", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + match: ["https://example.com/*", "https://test.com/*"], + grant: ["GM.getValue", "GM.setValue"], + require: ["https://cdn.example.com/lib.js"], + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @match https://example.com/*"); + expect(result).toContain("// @match https://test.com/*"); + expect(result).toContain("// @grant GM.getValue"); + expect(result).toContain("// @grant GM.setValue"); + expect(result).toContain("// @require https://cdn.example.com/lib.js"); + }); + + test("handles boolean fields", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + noframes: true, + unwrap: true, + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @noframes"); + expect(result).toContain("// @unwrap"); + }); + + test("handles locale fields", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + "name:zh-CN": "测试脚本", + "name:ja": "テストスクリプト", + description: "A test script", + "description:zh-CN": "测试脚本描述", + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @name Test Script"); + expect(result).toContain("// @name:zh-CN 测试脚本"); + expect(result).toContain("// @name:ja テストスクリプト"); + expect(result).toContain("// @description A test script"); + expect(result).toContain("// @description:zh-CN 测试脚本描述"); + }); + + test("handles resource fields with special format", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + resource: [ + { name: "logo", url: "https://example.com/logo.png" }, + { name: "config", url: "https://example.com/config.json" }, + ], + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @resource logo https://example.com/logo.png"); + expect(result).toContain( + "// @resource config https://example.com/config.json", + ); + }); + + test("handles run-at field", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + "run-at": "document-idle", + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @run-at document-idle"); + }); + + test("handles inject-into field", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + "inject-into": "page", + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @inject-into page"); + }); + + test("handles top-level-await field", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + "top-level-await": true, + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// @top-level-await"); + }); + + test("handles URL fields", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + downloadURL: "https://example.com/script.user.js", + supportURL: "https://example.com/support", + homepageURL: "https://example.com", + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain( + "// @downloadURL https://example.com/script.user.js", + ); + expect(result).toContain("// @supportURL https://example.com/support"); + expect(result).toContain("// @homepageURL https://example.com"); + }); + + test("omits undefined optional fields", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + }; + + const result = generateMetadataString(metadata); + + expect(result).not.toContain("// @namespace"); + expect(result).not.toContain("// @version"); + expect(result).not.toContain("// @description"); + expect(result).not.toContain("// @match"); + expect(result).not.toContain("// @grant"); + }); + + test("generates complete real-world example", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Custom Action UI", + "name:zh-CN": "自定义动作界面", + namespace: "Joshu FlatMMO Scripts", + version: "1.0.0", + description: + "ui tweaks to make it easier to tell at what action your character is doing", + "description:zh-CN": "UI调整,更容易看出角色正在执行什么动作", + match: ["https://flatmmo.com/play.php*"], + grant: ["GM.getValue", "GM.setValue"], + "inject-into": "page", + "run-at": "document-idle", + }; + + const result = generateMetadataString(metadata); + + expect(result).toContain("// ==UserScript=="); + expect(result).toContain("// @name Custom Action UI"); + expect(result).toContain("// @name:zh-CN 自定义动作界面"); + expect(result).toContain("// @namespace Joshu FlatMMO Scripts"); + expect(result).toContain("// @version 1.0.0"); + expect(result).toContain( + "// @description ui tweaks to make it easier to tell at what action your character is doing", + ); + expect(result).toContain( + "// @description:zh-CN UI调整,更容易看出角色正在执行什么动作", + ); + expect(result).toContain("// @match https://flatmmo.com/play.php*"); + expect(result).toContain("// @grant GM.getValue"); + expect(result).toContain("// @grant GM.setValue"); + expect(result).toContain("// @inject-into page"); + expect(result).toContain("// @run-at document-idle"); + expect(result).toContain("// ==/UserScript=="); + }); + + test("handles empty arrays", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + match: [], + grant: [], + }; + + const result = generateMetadataString(metadata); + + // Empty arrays should not generate any lines + expect(result).not.toContain("// @match"); + expect(result).not.toContain("// @grant"); + }); + + describe("strict formatting requirements", () => { + test("first line must be exactly // ==UserScript==", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + }; + + const result = generateMetadataString(metadata); + const lines = result.split("\n").filter((line) => line.trim()); + + expect(lines[0]).toBe("// ==UserScript=="); + }); + + test("last line must be exactly // ==/UserScript==", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + }; + + const result = generateMetadataString(metadata); + const lines = result.split("\n").filter((line) => line.trim()); + + expect(lines[lines.length - 1]).toBe("// ==/UserScript=="); + }); + + test("every line must start with //", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + namespace: "https://example.com", + version: "1.0.0", + match: ["https://example.com/*"], + grant: ["GM.getValue"], + }; + + const result = generateMetadataString(metadata); + const lines = result.split("\n").filter((line) => line.trim()); + + lines.forEach((line) => { + expect(line.startsWith("//")).toBe(true); + }); + }); + + test("every line must have exactly one space after //", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + namespace: "https://example.com", + version: "1.0.0", + description: "A test", + match: ["https://example.com/*"], + grant: ["GM.getValue"], + noframes: true, + }; + + const result = generateMetadataString(metadata); + const lines = result.split("\n").filter((line) => line.trim()); + + lines.forEach((line) => { + // After //, there should be exactly one space + expect(line.match(/^\/\/ /)).toBeTruthy(); + // Should not have multiple spaces after // + expect(line.match(/^\/\/ /)).toBeFalsy(); + }); + }); + + test("no extraneous text at beginning of metadata block", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + }; + + const result = generateMetadataString(metadata); + + // Should not start with whitespace or other characters before // + expect(result.trimStart()).toBe(result); + expect(result.startsWith("//")).toBe(true); + }); + + test("no extraneous text at end of metadata block", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + }; + + const result = generateMetadataString(metadata); + + // Should end with ==/UserScript== and newline, no extra whitespace + expect(result.trimEnd() + "\n").toBe(result); + expect(result.trim().endsWith("// ==/UserScript==")).toBe(true); + }); + + test("no blank lines within metadata block", () => { + const metadata: ViolentmonkeyMetadata = { + name: "Test Script", + namespace: "https://example.com", + version: "1.0.0", + match: ["https://example.com/*"], + }; + + const result = generateMetadataString(metadata); + const lines = result.split("\n"); + + // Find the metadata block (between ==UserScript== markers) + const startIdx = lines.findIndex((l) => l.includes("==UserScript==")); + const endIdx = lines.findIndex((l) => l.includes("==/UserScript==")); + + // Check there are no empty lines within the block + for (let i = startIdx + 1; i < endIdx; i++) { + expect(lines[i].trim()).not.toBe(""); + } + }); + }); +}); diff --git a/tsconfig.json b/tsconfig.json index a5403f9..9187215 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,7 +5,8 @@ "target": "ESNext", "module": "ESNext", "moduleDetection": "force", - "jsx": "react-jsx", + "jsx": "preserve", + "jsxImportSource": "solid-js", "allowJs": true, "types": ["@violentmonkey/types", "bun", "flatmmo-types"], From 073f0b5be2431961626e4779dc904e1f888d7c21 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Sat, 21 Feb 2026 23:13:58 -0500 Subject: [PATCH 79/87] css fix --- packages/userscripts/dev-tools/App.module.css | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/userscripts/dev-tools/App.module.css b/packages/userscripts/dev-tools/App.module.css index 26c3f28..1d7957c 100644 --- a/packages/userscripts/dev-tools/App.module.css +++ b/packages/userscripts/dev-tools/App.module.css @@ -4,7 +4,6 @@ .header { background-color: #282c34; - min-height: 100vh; display: flex; flex-direction: column; /* font-size: calc(10px + 2vmin); */ From f4ce617ee88cbcc199c51591a0441517e1cf6433 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 17:40:16 -0400 Subject: [PATCH 80/87] flake.lock: Update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flake lock file updates: • Updated input 'flake-parts': 'github:hercules-ci/flake-parts/a34fae9c08a15ad73f295041fec82323541400a9' (2025-12-15) → 'github:hercules-ci/flake-parts/f20dc5d9b8027381c474144ecabc9034d6a839a3' (2026-03-01) • Updated input 'flake-parts/nixpkgs-lib': 'github:nix-community/nixpkgs.lib/2075416fcb47225d9b68ac469a5c4801a9c4dd85' (2025-12-14) → 'github:nix-community/nixpkgs.lib/c185c7a5e5dd8f9add5b2f8ebeff00888b070742' (2026-03-01) • Updated input 'nixpkgs': 'github:nixos/nixpkgs/3e2499d5539c16d0d173ba53552a4ff8547f4539' (2025-12-25) → 'github:nixos/nixpkgs/b40629efe5d6ec48dd1efba650c797ddbd39ace0' (2026-03-18) • Updated input 'treefmt-nix': 'github:numtide/treefmt-nix/42d96e75aa56a3f70cab7e7dc4a32868db28e8fd' (2025-12-17) → 'github:numtide/treefmt-nix/71b125cd05fbfd78cab3e070b73544abe24c5016' (2026-03-12) • Updated input 'treefmt-nix/nixpkgs': 'github:nixos/nixpkgs/d5faa84122bc0a1fd5d378492efce4e289f8eac1' (2025-10-23) → 'github:nixos/nixpkgs/4533d9293756b63904b7238acb84ac8fe4c8c2c4' (2026-02-03) --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index 30da3ed..79c44f0 100644 --- a/flake.lock +++ b/flake.lock @@ -50,11 +50,11 @@ "nixpkgs-lib": "nixpkgs-lib_2" }, "locked": { - "lastModified": 1765835352, - "narHash": "sha256-XswHlK/Qtjasvhd1nOa1e8MgZ8GS//jBoTqWtrS1Giw=", + "lastModified": 1772408722, + "narHash": "sha256-rHuJtdcOjK7rAHpHphUb1iCvgkU3GpfvicLMwwnfMT0=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "a34fae9c08a15ad73f295041fec82323541400a9", + "rev": "f20dc5d9b8027381c474144ecabc9034d6a839a3", "type": "github" }, "original": { @@ -80,11 +80,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1766651565, - "narHash": "sha256-QEhk0eXgyIqTpJ/ehZKg9IKS7EtlWxF3N7DXy42zPfU=", + "lastModified": 1773821835, + "narHash": "sha256-TJ3lSQtW0E2JrznGVm8hOQGVpXjJyXY2guAxku2O9A4=", "owner": "nixos", "repo": "nixpkgs", - "rev": "3e2499d5539c16d0d173ba53552a4ff8547f4539", + "rev": "b40629efe5d6ec48dd1efba650c797ddbd39ace0", "type": "github" }, "original": { @@ -111,11 +111,11 @@ }, "nixpkgs-lib_2": { "locked": { - "lastModified": 1765674936, - "narHash": "sha256-k00uTP4JNfmejrCLJOwdObYC9jHRrr/5M/a/8L2EIdo=", + "lastModified": 1772328832, + "narHash": "sha256-e+/T/pmEkLP6BHhYjx6GmwP5ivonQQn0bJdH9YrRB+Q=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "2075416fcb47225d9b68ac469a5c4801a9c4dd85", + "rev": "c185c7a5e5dd8f9add5b2f8ebeff00888b070742", "type": "github" }, "original": { @@ -126,11 +126,11 @@ }, "nixpkgs_2": { "locked": { - "lastModified": 1761236834, - "narHash": "sha256-+pthv6hrL5VLW2UqPdISGuLiUZ6SnAXdd2DdUE+fV2Q=", + "lastModified": 1770107345, + "narHash": "sha256-tbS0Ebx2PiA1FRW8mt8oejR0qMXmziJmPaU1d4kYY9g=", "owner": "nixos", "repo": "nixpkgs", - "rev": "d5faa84122bc0a1fd5d378492efce4e289f8eac1", + "rev": "4533d9293756b63904b7238acb84ac8fe4c8c2c4", "type": "github" }, "original": { @@ -190,11 +190,11 @@ "nixpkgs": "nixpkgs_2" }, "locked": { - "lastModified": 1766000401, - "narHash": "sha256-+cqN4PJz9y0JQXfAK5J1drd0U05D5fcAGhzhfVrDlsI=", + "lastModified": 1773297127, + "narHash": "sha256-6E/yhXP7Oy/NbXtf1ktzmU8SdVqJQ09HC/48ebEGBpk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "42d96e75aa56a3f70cab7e7dc4a32868db28e8fd", + "rev": "71b125cd05fbfd78cab3e070b73544abe24c5016", "type": "github" }, "original": { From 302e36a6181e3e386a4230857c2deb9bbe797f07 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 17:54:32 -0400 Subject: [PATCH 81/87] fixed bun2nix --- flake.lock | 7 +++---- flake.nix | 2 +- mkUserscript.nix | 2 ++ 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 79c44f0..4e2cda6 100644 --- a/flake.lock +++ b/flake.lock @@ -13,16 +13,15 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1765197994, - "narHash": "sha256-+LEKD7ZugdvW7pwgXbgaZdN8z4I3BkWjcur42o0Ud2g=", + "lastModified": 1770895533, + "narHash": "sha256-v3QaK9ugy9bN9RXDnjw0i2OifKmz2NnKM82agtqm/UY=", "owner": "nix-community", "repo": "bun2nix", - "rev": "ca7f1244410252e8dd70252c53b3d46d06363066", + "rev": "c843f477b15f51151f8c6bcc886954699440a6e1", "type": "github" }, "original": { "owner": "nix-community", - "ref": "2.0.6", "repo": "bun2nix", "type": "github" } diff --git a/flake.nix b/flake.nix index c48af50..08e4e57 100644 --- a/flake.nix +++ b/flake.nix @@ -5,7 +5,7 @@ nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; systems.url = "github:nix-systems/default"; - bun2nix.url = "github:nix-community/bun2nix/2.0.6"; + bun2nix.url = "github:nix-community/bun2nix"; bun2nix.inputs.nixpkgs.follows = "nixpkgs"; bun2nix.inputs.systems.follows = "systems"; diff --git a/mkUserscript.nix b/mkUserscript.nix index 3cd7ca2..c6e12b8 100644 --- a/mkUserscript.nix +++ b/mkUserscript.nix @@ -37,6 +37,8 @@ stdenv.mkDerivation { bun ${build-script} ${packageName} ''; + bunInstallFlags = "--backend=hardlink"; + installPhase = '' mkdir -p $out/share/userscripts From fc0d60df364652ce4057f1c497ad1f5a6c930368 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 18:21:11 -0400 Subject: [PATCH 82/87] added new worship skills --- packages/userscripts/keybinds-improved/ACTIONS.ts | 10 ++++++++++ .../keybinds-improved/DEFAULT_HOTKEYS.ts | 14 ++++++++++++++ packages/userscripts/keybinds-improved/hotkeys.ts | 2 ++ packages/userscripts/keybinds-improved/settings.ts | 2 ++ 4 files changed, 28 insertions(+) diff --git a/packages/userscripts/keybinds-improved/ACTIONS.ts b/packages/userscripts/keybinds-improved/ACTIONS.ts index 64ac008..962900c 100644 --- a/packages/userscripts/keybinds-improved/ACTIONS.ts +++ b/packages/userscripts/keybinds-improved/ACTIONS.ts @@ -123,4 +123,14 @@ export const ACTIONS: actions = { description: "Worship skill, originally no hotkey", socketCommand: "USE_WORSHIP=mass_pickup", }, + focus: { + originalKey: "N/A", + description: "Worship skill, originally no hotkey", + socketCommand: "USE_WORSHIP=focus", + }, + clarity: { + originalKey: "N/A", + description: "Worship skill, originally no hotkey", + socketCommand: "USE_WORSHIP=clarity", + }, }; diff --git a/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts b/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts index d79ff2e..8101dae 100644 --- a/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts +++ b/packages/userscripts/keybinds-improved/DEFAULT_HOTKEYS.ts @@ -155,4 +155,18 @@ export const DEFAULT_HOTKEYS: Record = { metaKey: false, shiftKey: false, }, + focus: { + key: "k", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, + clarity: { + key: "c", + altKey: false, + ctrlKey: true, + metaKey: false, + shiftKey: false, + }, }; diff --git a/packages/userscripts/keybinds-improved/hotkeys.ts b/packages/userscripts/keybinds-improved/hotkeys.ts index a8632b2..1e6fa18 100644 --- a/packages/userscripts/keybinds-improved/hotkeys.ts +++ b/packages/userscripts/keybinds-improved/hotkeys.ts @@ -37,6 +37,8 @@ export type actions = { teleport_frostvale: actionProperties; hunting_contact: actionProperties; mass_pickup: actionProperties; + focus: actionProperties; + clarity: actionProperties; }; export type HotkeyMap = Record; diff --git a/packages/userscripts/keybinds-improved/settings.ts b/packages/userscripts/keybinds-improved/settings.ts index e18ffdf..2dd2622 100644 --- a/packages/userscripts/keybinds-improved/settings.ts +++ b/packages/userscripts/keybinds-improved/settings.ts @@ -50,6 +50,8 @@ const CATEGORIES: Record = { "auto_hell_burying", "hunting_contact", "mass_pickup", + "focus", + "clarity", ], }; From 6358a5d4e37964b257ad7517c6b5de586494e816 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 18:38:56 -0400 Subject: [PATCH 83/87] hopefully fix ci --- .github/workflows/ci.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index c1265d7..2e65d58 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -6,17 +6,17 @@ on: jobs: build: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest permissions: id-token: "write" contents: "read" steps: - - uses: actions/checkout@v4 - - uses: DeterminateSystems/nix-installer-action@main - - uses: DeterminateSystems/magic-nix-cache-action@main - - uses: DeterminateSystems/flake-checker-action@main - - name: Run `nix build` - run: nix build + - uses: actions/checkout@v5 + - uses: cachix/install-nix-action@v31 + with: + github_access_token: ${{ secrets.GITHUB_TOKEN }} + - run: nix build + - run: nix flake check - name: Upload static site artifact uses: actions/upload-artifact@v4 with: From 8c93349d919ddd9492a22d5ca34f60deb38655f1 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 18:41:19 -0400 Subject: [PATCH 84/87] formatting --- flake.nix | 4 +++- mkStaticSite.nix | 1 - packages/build/build-userscript-cli.ts | 2 +- packages/build/build-userscript.ts | 3 +-- packages/userscripts/dev-tools/App.module.css | 24 +++++++++---------- packages/userscripts/dev-tools/index.tsx | 2 +- .../userscripts/keybinds-improved/settings.ts | 6 ++--- test/UserscriptMetadata.test.ts | 8 ++++--- tsconfig.json | 2 +- 9 files changed, 27 insertions(+), 25 deletions(-) diff --git a/flake.nix b/flake.nix index 08e4e57..8d35c8b 100644 --- a/flake.nix +++ b/flake.nix @@ -50,7 +50,9 @@ }: let # fetch scripts dynamically based on dir location. May need a stricter/more correct check - userscriptNames = builtins.attrNames (inputs.nixpkgs.lib.filterAttrs (n: v: v == "directory") (builtins.readDir ./packages/userscripts)); + userscriptNames = builtins.attrNames ( + inputs.nixpkgs.lib.filterAttrs (n: v: v == "directory") (builtins.readDir ./packages/userscripts) + ); mkFromName = packageName: pkgs.callPackage ./mkUserscript.nix { diff --git a/mkStaticSite.nix b/mkStaticSite.nix index c3e6333..480c956 100644 --- a/mkStaticSite.nix +++ b/mkStaticSite.nix @@ -35,7 +35,6 @@ stdenv.mkDerivation { bun2nix.hook ]; - bunDeps = bun2nix.fetchBunDeps { bunNix = ./bun.nix; }; diff --git a/packages/build/build-userscript-cli.ts b/packages/build/build-userscript-cli.ts index 6a70f36..a6c6d8a 100644 --- a/packages/build/build-userscript-cli.ts +++ b/packages/build/build-userscript-cli.ts @@ -1,6 +1,6 @@ +import { watch } from "fs"; import { parseArgs } from "util"; import { buildScript } from "./build-userscript"; -import { watch } from "fs"; const { values, positionals } = parseArgs({ args: Bun.argv, diff --git a/packages/build/build-userscript.ts b/packages/build/build-userscript.ts index 6fff89a..cb4994a 100644 --- a/packages/build/build-userscript.ts +++ b/packages/build/build-userscript.ts @@ -1,7 +1,6 @@ -import { parseSync, Visitor } from "oxc-parser"; import { SolidPlugin } from "bun-plugin-solid"; - import { Schema } from "effect"; +import { parseSync, Visitor } from "oxc-parser"; import { generateMetadataString, type ViolentmonkeyMetadata, diff --git a/packages/userscripts/dev-tools/App.module.css b/packages/userscripts/dev-tools/App.module.css index 1d7957c..076b53e 100644 --- a/packages/userscripts/dev-tools/App.module.css +++ b/packages/userscripts/dev-tools/App.module.css @@ -1,22 +1,22 @@ .App { - text-align: start; + text-align: start; } .header { - background-color: #282c34; - display: flex; - flex-direction: column; - /* font-size: calc(10px + 2vmin); */ - color: white; + background-color: #282c34; + display: flex; + flex-direction: column; + /* font-size: calc(10px + 2vmin); */ + color: white; } .link { - color: #b318f0; + color: #b318f0; } .columns { - display: flex; - flex-direction: row; - gap: 25px; - padding: 25px; -} \ No newline at end of file + display: flex; + flex-direction: row; + gap: 25px; + padding: 25px; +} diff --git a/packages/userscripts/dev-tools/index.tsx b/packages/userscripts/dev-tools/index.tsx index 1996396..d6132f0 100644 --- a/packages/userscripts/dev-tools/index.tsx +++ b/packages/userscripts/dev-tools/index.tsx @@ -1,6 +1,6 @@ /* @refresh reload */ -import { createSignal, For, type Component } from "solid-js"; +import { type Component, createSignal, For } from "solid-js"; import { render } from "solid-js/web"; // import cssString from "./App.module.css" with { type: "text" }; import styles from "./App.module.css"; diff --git a/packages/userscripts/keybinds-improved/settings.ts b/packages/userscripts/keybinds-improved/settings.ts index 2dd2622..6eb84a7 100644 --- a/packages/userscripts/keybinds-improved/settings.ts +++ b/packages/userscripts/keybinds-improved/settings.ts @@ -1,10 +1,10 @@ import { ACTIONS } from "./ACTIONS"; import { + type actions, + type keypress, + keypressToHashableString, mergeHotkeys, setHotkeys, - keypressToHashableString, - type keypress, - type actions, } from "./hotkeys"; const formatKeypress = (kp: keypress): string => { diff --git a/test/UserscriptMetadata.test.ts b/test/UserscriptMetadata.test.ts index 41b2286..cc1ddee 100644 --- a/test/UserscriptMetadata.test.ts +++ b/test/UserscriptMetadata.test.ts @@ -1,4 +1,4 @@ -import { test, expect, describe } from "bun:test"; +import { describe, expect, test } from "bun:test"; import { generateMetadataString, type ViolentmonkeyMetadata, @@ -94,7 +94,9 @@ describe("generateMetadataString", () => { const result = generateMetadataString(metadata); - expect(result).toContain("// @resource logo https://example.com/logo.png"); + expect(result).toContain( + "// @resource logo https://example.com/logo.png", + ); expect(result).toContain( "// @resource config https://example.com/config.json", ); @@ -272,7 +274,7 @@ describe("generateMetadataString", () => { // After //, there should be exactly one space expect(line.match(/^\/\/ /)).toBeTruthy(); // Should not have multiple spaces after // - expect(line.match(/^\/\/ /)).toBeFalsy(); + expect(line.match(/^\/\/ {2}/)).toBeFalsy(); }); }); diff --git a/tsconfig.json b/tsconfig.json index 9187215..1e2f078 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -6,7 +6,7 @@ "module": "ESNext", "moduleDetection": "force", "jsx": "preserve", - "jsxImportSource": "solid-js", + "jsxImportSource": "solid-js", "allowJs": true, "types": ["@violentmonkey/types", "bun", "flatmmo-types"], From c6a6fa58d2a9e8487aceecc63b616038a804a30d Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 18:46:16 -0400 Subject: [PATCH 85/87] remove check for now since linting not totally setup --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 2e65d58..330f2fb 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -16,7 +16,7 @@ jobs: with: github_access_token: ${{ secrets.GITHUB_TOKEN }} - run: nix build - - run: nix flake check + # - run: nix flake check - name: Upload static site artifact uses: actions/upload-artifact@v4 with: From f53bbcafb0a38e0ba20e11f36686e3191447a28e Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 18:53:25 -0400 Subject: [PATCH 86/87] disable cloudflare pages build for now --- .github/workflows/ci.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 330f2fb..fbde1a9 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -22,8 +22,8 @@ jobs: with: name: site path: result/static - - name: Run `nix shell` - run: nix develop --command -- bunx wrangler pages deploy result/static - env: - CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} - CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + # - name: Run `nix shell` + # run: nix develop --command -- bunx wrangler pages deploy result/static + # env: + # CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_PAGES_API_KEY }} + # CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} From cf8de42560ca4db8ee77ecca79d075f9eec45302 Mon Sep 17 00:00:00 2001 From: josh-romer Date: Thu, 19 Mar 2026 18:59:11 -0400 Subject: [PATCH 87/87] update action to remove warning --- .github/workflows/ci.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index fbde1a9..10d1919 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -18,7 +18,7 @@ jobs: - run: nix build # - run: nix flake check - name: Upload static site artifact - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@v7 with: name: site path: result/static