From 14c9e83588b1b6cd00cafe79266452d52def676b Mon Sep 17 00:00:00 2001 From: Luciano Hanyon Wu Date: Fri, 26 Dec 2025 10:43:15 +0800 Subject: [PATCH 1/2] clean up code & setup ci --- .github/workflows/ci.yaml | 19 ++ .husky/pre-push | 1 + bun.lock | 202 ++++++++++++-------- package.json | 16 +- src/RouteEngine.js | 18 +- src/createTimer.js | 230 ----------------------- src/index.js | 5 - src/schemas/systemState/effects.yaml | 1 - src/schemas/systemState/systemState.yaml | 6 +- src/stores/constructPresentationState.js | 9 +- src/stores/constructRenderState.js | 122 +++++++----- src/stores/system.store.js | 222 +++++++++++++--------- vt/static/main.js | 110 +++++------ 13 files changed, 435 insertions(+), 526 deletions(-) create mode 100644 .github/workflows/ci.yaml create mode 100644 .husky/pre-push delete mode 100644 src/createTimer.js diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml new file mode 100644 index 00000000..10185c85 --- /dev/null +++ b/.github/workflows/ci.yaml @@ -0,0 +1,19 @@ +name: CI + +on: + pull_request: + workflow_dispatch: + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - run: bun install --frozen-lockfile + + - run: bun run lint diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100644 index 00000000..a5a10803 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1 @@ +bun run lint diff --git a/bun.lock b/bun.lock index 0854456f..d3f0c4a9 100644 --- a/bun.lock +++ b/bun.lock @@ -12,7 +12,9 @@ "devDependencies": { "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", - "vitest": "^3.2.4", + "husky": "^9.1.7", + "prettier": "^3.7.4", + "vitest": "^4.0.16", }, }, }, @@ -29,51 +31,57 @@ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.21.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.21.5", "", { "os": "android", "cpu": "arm" }, "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.2", "", { "os": "android", "cpu": "arm" }, "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.21.5", "", { "os": "android", "cpu": "arm64" }, "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.2", "", { "os": "android", "cpu": "arm64" }, "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.21.5", "", { "os": "android", "cpu": "x64" }, "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.2", "", { "os": "android", "cpu": "x64" }, "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.21.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.21.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.21.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.21.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.21.5", "", { "os": "linux", "cpu": "arm" }, "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.2", "", { "os": "linux", "cpu": "arm" }, "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.21.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.21.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.21.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.21.5", "", { "os": "linux", "cpu": "none" }, "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.2", "", { "os": "linux", "cpu": "none" }, "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.21.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.21.5", "", { "os": "linux", "cpu": "x64" }, "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.2", "", { "os": "linux", "cpu": "x64" }, "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.21.5", "", { "os": "none", "cpu": "x64" }, "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.21.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.2", "", { "os": "none", "cpu": "x64" }, "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.21.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.21.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.21.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.2", "", { "os": "none", "cpu": "arm64" }, "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.21.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg=="], + + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg=="], + + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ=="], + + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.2", "", { "os": "win32", "cpu": "x64" }, "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ=="], "@isaacs/cliui": ["@isaacs/cliui@8.0.2", "", { "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", "strip-ansi": "^7.0.1", "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", "wrap-ansi": "^8.1.0", "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" } }, "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA=="], @@ -93,37 +101,51 @@ "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.24.0", "", { "os": "android", "cpu": "arm" }, "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.54.0", "", { "os": "android", "cpu": "arm" }, "sha512-OywsdRHrFvCdvsewAInDKCNyR3laPA2mc9bRYJ6LBp5IyvF3fvXbbNR0bSzHlZVFtn6E0xw2oZlyjg4rKCVcng=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.54.0", "", { "os": "android", "cpu": "arm64" }, "sha512-Skx39Uv+u7H224Af+bDgNinitlmHyQX1K/atIA32JP3JQw6hVODX5tkbi2zof/E69M1qH2UoN3Xdxgs90mmNYw=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.54.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-k43D4qta/+6Fq+nCDhhv9yP2HdeKeP56QrUUTW7E6PhZP1US6NDqpJj4MY0jBHlJivVJD5P8NxrjuobZBJTCRw=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.54.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-cOo7biqwkpawslEfox5Vs8/qj83M/aZCSSNIWpVzfU2CYHa2G3P1UN5WF01RdTHSgCkri7XOlTdtk17BezlV3A=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.24.0", "", { "os": "android", "cpu": "arm64" }, "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.54.0", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-miSvuFkmvFbgJ1BevMa4CPCFt5MPGw094knM64W9I0giUIMMmRYcGW/JWZDriaw/k1kOBtsWh1z6nIFV1vPNtA=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.24.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.54.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-KGXIs55+b/ZfZsq9aR026tmr/+7tq6VG6MsnrvF4H8VhwflTIuYh+LFUlIsRdQSgrgmtM3fVATzEAj4hBQlaqQ=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.24.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.54.0", "", { "os": "linux", "cpu": "arm" }, "sha512-EHMUcDwhtdRGlXZsGSIuXSYwD5kOT9NVnx9sqzYiwAc91wfYOE1g1djOEDseZJKKqtHAHGwnGPQu3kytmfaXLQ=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.24.0", "", { "os": "linux", "cpu": "arm" }, "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.54.0", "", { "os": "linux", "cpu": "arm" }, "sha512-+pBrqEjaakN2ySv5RVrj/qLytYhPKEUwk+e3SFU5jTLHIcAtqh2rLrd/OkbNuHJpsBgxsD8ccJt5ga/SeG0JmA=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.24.0", "", { "os": "linux", "cpu": "arm" }, "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.54.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-NSqc7rE9wuUaRBsBp5ckQ5CVz5aIRKCwsoa6WMF7G01sX3/qHUw/z4pv+D+ahL1EIKy6Enpcnz1RY8pf7bjwng=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.24.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.54.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-gr5vDbg3Bakga5kbdpqx81m2n9IX8M6gIMlQQIXiLTNeQW6CucvuInJ91EuCJ/JYvc+rcLLsDFcfAD1K7fMofg=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.24.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw=="], + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-gsrtB1NA3ZYj2vq0Rzkylo9ylCtW/PhpLEivlgWe0bpgtX5+9j9EZa0wtZiCjgu6zmSeZWyI/e2YRX1URozpIw=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.24.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw=="], + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.54.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-y3qNOfTBStmFNq+t4s7Tmc9hW2ENtPg8FeUD/VShI7rKxNW7O4fFeaYbMsd3tpFlIg1Q8IapFgy7Q9i2BqeBvA=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.24.0", "", { "os": "linux", "cpu": "none" }, "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-89sepv7h2lIVPsFma8iwmccN7Yjjtgz0Rj/Ou6fEqg3HDhpCa+Et+YSufy27i6b0Wav69Qv4WBNl3Rs6pwhebQ=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.24.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.54.0", "", { "os": "linux", "cpu": "none" }, "sha512-ZcU77ieh0M2Q8Ur7D5X7KvK+UxbXeDHwiOt/CPSBTI1fBmeDMivW0dPkdqkT4rOgDjrDDBUed9x4EgraIKoR2A=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.24.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.54.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-2AdWy5RdDF5+4YfG/YesGDDtbyJlC9LHmL6rZw6FurBJ5n4vFGupsOBGfwMRjBYH7qRQowT8D/U4LoSvVwOhSQ=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.24.0", "", { "os": "linux", "cpu": "x64" }, "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.54.0", "", { "os": "linux", "cpu": "x64" }, "sha512-WGt5J8Ij/rvyqpFexxk3ffKqqbLf9AqrTBbWDk7ApGUzaIs6V+s2s84kAxklFwmMF/vBNGrVdYgbblCOFFezMQ=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.24.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.54.0", "", { "os": "linux", "cpu": "x64" }, "sha512-JzQmb38ATzHjxlPHuTH6tE7ojnMKM2kYNzt44LO/jJi8BpceEC8QuXYA908n8r3CNuG/B3BV8VR3Hi1rYtmPiw=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.24.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ=="], + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.54.0", "", { "os": "none", "cpu": "arm64" }, "sha512-huT3fd0iC7jigGh7n3q/+lfPcXxBi+om/Rs3yiFxjvSxbSB6aohDFXbWvlspaqjeOh+hx7DDHS+5Es5qRkWkZg=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.24.0", "", { "os": "win32", "cpu": "x64" }, "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.54.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-c2V0W1bsKIKfbLMBu/WGBz6Yci8nJ/ZJdheE0EwB73N3MvHYKiKGs3mVilX4Gs70eGeDaMqEob25Tw2Gb9Nqyw=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.54.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-woEHgqQqDCkAzrDhvDipnSirm5vxUXtSKDYTVpZG3nUdW/VVB5VdCYA2iReSj/u3yCZzXID4kuKG7OynPnB3WQ=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-dzAc53LOuFvHwbCEOS0rPbXp6SIhAf2txMP5p6mGyOXXw5mWY8NGGbPMPrs4P1WItkfApDathBj/NzMLUZ9rtQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.54.0", "", { "os": "win32", "cpu": "x64" }, "sha512-hYT5d3YNdSh3mbCU1gwQyPgQd3T2ne0A3KG8KSBdav5TiBg6eInVmV+TeR5uHufiIgSFg0XsOWGW5/RhNcSvPg=="], + + "@standard-schema/spec": ["@standard-schema/spec@1.1.0", "", {}, "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w=="], "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], @@ -133,17 +155,17 @@ "@vitest/coverage-v8": ["@vitest/coverage-v8@3.2.4", "", { "dependencies": { "@ampproject/remapping": "^2.3.0", "@bcoe/v8-coverage": "^1.0.2", "ast-v8-to-istanbul": "^0.3.3", "debug": "^4.4.1", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-lib-source-maps": "^5.0.6", "istanbul-reports": "^3.1.7", "magic-string": "^0.30.17", "magicast": "^0.3.5", "std-env": "^3.9.0", "test-exclude": "^7.0.1", "tinyrainbow": "^2.0.0" }, "peerDependencies": { "@vitest/browser": "3.2.4", "vitest": "3.2.4" }, "optionalPeers": ["@vitest/browser"] }, "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ=="], - "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + "@vitest/expect": ["@vitest/expect@4.0.16", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.0.16", "@vitest/utils": "4.0.16", "chai": "^6.2.1", "tinyrainbow": "^3.0.3" } }, "sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA=="], - "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + "@vitest/mocker": ["@vitest/mocker@4.0.16", "", { "dependencies": { "@vitest/spy": "4.0.16", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg=="], - "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + "@vitest/pretty-format": ["@vitest/pretty-format@4.0.16", "", { "dependencies": { "tinyrainbow": "^3.0.3" } }, "sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA=="], - "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + "@vitest/runner": ["@vitest/runner@4.0.16", "", { "dependencies": { "@vitest/utils": "4.0.16", "pathe": "^2.0.3" } }, "sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q=="], - "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + "@vitest/snapshot": ["@vitest/snapshot@4.0.16", "", { "dependencies": { "@vitest/pretty-format": "4.0.16", "magic-string": "^0.30.21", "pathe": "^2.0.3" } }, "sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA=="], - "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + "@vitest/spy": ["@vitest/spy@4.0.16", "", {}, "sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw=="], "@vitest/ui": ["@vitest/ui@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "fflate": "^0.8.2", "flatted": "^3.3.3", "pathe": "^2.0.3", "sirv": "^3.0.1", "tinyglobby": "^0.2.14", "tinyrainbow": "^2.0.0" }, "peerDependencies": { "vitest": "3.2.4" } }, "sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA=="], @@ -155,19 +177,13 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], - "ast-v8-to-istanbul": ["ast-v8-to-istanbul@0.3.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "estree-walker": "^3.0.3", "js-tokens": "^9.0.1" } }, "sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw=="], "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], "brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], - - "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], - - "check-error": ["check-error@2.1.1", "", {}, "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw=="], + "chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], @@ -177,19 +193,17 @@ "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], - "eastasianwidth": ["eastasianwidth@0.2.0", "", {}, "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA=="], "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], - "esbuild": ["esbuild@0.21.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.21.5", "@esbuild/android-arm": "0.21.5", "@esbuild/android-arm64": "0.21.5", "@esbuild/android-x64": "0.21.5", "@esbuild/darwin-arm64": "0.21.5", "@esbuild/darwin-x64": "0.21.5", "@esbuild/freebsd-arm64": "0.21.5", "@esbuild/freebsd-x64": "0.21.5", "@esbuild/linux-arm": "0.21.5", "@esbuild/linux-arm64": "0.21.5", "@esbuild/linux-ia32": "0.21.5", "@esbuild/linux-loong64": "0.21.5", "@esbuild/linux-mips64el": "0.21.5", "@esbuild/linux-ppc64": "0.21.5", "@esbuild/linux-riscv64": "0.21.5", "@esbuild/linux-s390x": "0.21.5", "@esbuild/linux-x64": "0.21.5", "@esbuild/netbsd-x64": "0.21.5", "@esbuild/openbsd-x64": "0.21.5", "@esbuild/sunos-x64": "0.21.5", "@esbuild/win32-arm64": "0.21.5", "@esbuild/win32-ia32": "0.21.5", "@esbuild/win32-x64": "0.21.5" }, "bin": "bin/esbuild" }, "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw=="], + "esbuild": ["esbuild@0.27.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.2", "@esbuild/android-arm": "0.27.2", "@esbuild/android-arm64": "0.27.2", "@esbuild/android-x64": "0.27.2", "@esbuild/darwin-arm64": "0.27.2", "@esbuild/darwin-x64": "0.27.2", "@esbuild/freebsd-arm64": "0.27.2", "@esbuild/freebsd-x64": "0.27.2", "@esbuild/linux-arm": "0.27.2", "@esbuild/linux-arm64": "0.27.2", "@esbuild/linux-ia32": "0.27.2", "@esbuild/linux-loong64": "0.27.2", "@esbuild/linux-mips64el": "0.27.2", "@esbuild/linux-ppc64": "0.27.2", "@esbuild/linux-riscv64": "0.27.2", "@esbuild/linux-s390x": "0.27.2", "@esbuild/linux-x64": "0.27.2", "@esbuild/netbsd-arm64": "0.27.2", "@esbuild/netbsd-x64": "0.27.2", "@esbuild/openbsd-arm64": "0.27.2", "@esbuild/openbsd-x64": "0.27.2", "@esbuild/openharmony-arm64": "0.27.2", "@esbuild/sunos-x64": "0.27.2", "@esbuild/win32-arm64": "0.27.2", "@esbuild/win32-ia32": "0.27.2", "@esbuild/win32-x64": "0.27.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw=="], "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], - "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], "fdir": ["fdir@6.4.4", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg=="], @@ -207,6 +221,8 @@ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + "husky": ["husky@9.1.7", "", { "bin": { "husky": "bin.js" } }, "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA=="], + "immer": ["immer@10.1.1", "", {}, "sha512-s2MPrmjovJcoMaHtx6K11Ra7oD05NT97w1IC5zpMkT6Atjr7H8LjaDd81iIxUYpMKSRRNMJE703M1Fhr/TctHw=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], @@ -247,7 +263,9 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "nanoid": ["nanoid@3.3.7", "", { "bin": "bin/nanoid.cjs" }, "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g=="], + "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + + "obug": ["obug@2.1.1", "", {}, "sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ=="], "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], @@ -257,17 +275,17 @@ "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], - "pathval": ["pathval@2.0.0", "", {}, "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA=="], - "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], - "postcss": ["postcss@8.4.47", "", { "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.0", "source-map-js": "^1.2.1" } }, "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "prettier": ["prettier@3.7.4", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA=="], "puty": ["puty@0.0.6", "", { "dependencies": { "js-yaml": "~4.1.0" } }, "sha512-IId4EnlUy3BzUrEpmieEqC4Zei/N8RgZieouB/ANpMpRywb4W8gPIY7aU4mHbNSLiwgSSqo/fP1AZYAyH2JutQ=="], - "rollup": ["rollup@4.24.0", "", { "dependencies": { "@types/estree": "1.0.6" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.24.0", "@rollup/rollup-android-arm64": "4.24.0", "@rollup/rollup-darwin-arm64": "4.24.0", "@rollup/rollup-darwin-x64": "4.24.0", "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", "@rollup/rollup-linux-arm-musleabihf": "4.24.0", "@rollup/rollup-linux-arm64-gnu": "4.24.0", "@rollup/rollup-linux-arm64-musl": "4.24.0", "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", "@rollup/rollup-linux-riscv64-gnu": "4.24.0", "@rollup/rollup-linux-s390x-gnu": "4.24.0", "@rollup/rollup-linux-x64-gnu": "4.24.0", "@rollup/rollup-linux-x64-musl": "4.24.0", "@rollup/rollup-win32-arm64-msvc": "4.24.0", "@rollup/rollup-win32-ia32-msvc": "4.24.0", "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" }, "bin": "dist/bin/rollup" }, "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg=="], + "rollup": ["rollup@4.54.0", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.54.0", "@rollup/rollup-android-arm64": "4.54.0", "@rollup/rollup-darwin-arm64": "4.54.0", "@rollup/rollup-darwin-x64": "4.54.0", "@rollup/rollup-freebsd-arm64": "4.54.0", "@rollup/rollup-freebsd-x64": "4.54.0", "@rollup/rollup-linux-arm-gnueabihf": "4.54.0", "@rollup/rollup-linux-arm-musleabihf": "4.54.0", "@rollup/rollup-linux-arm64-gnu": "4.54.0", "@rollup/rollup-linux-arm64-musl": "4.54.0", "@rollup/rollup-linux-loong64-gnu": "4.54.0", "@rollup/rollup-linux-ppc64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-gnu": "4.54.0", "@rollup/rollup-linux-riscv64-musl": "4.54.0", "@rollup/rollup-linux-s390x-gnu": "4.54.0", "@rollup/rollup-linux-x64-gnu": "4.54.0", "@rollup/rollup-linux-x64-musl": "4.54.0", "@rollup/rollup-openharmony-arm64": "4.54.0", "@rollup/rollup-win32-arm64-msvc": "4.54.0", "@rollup/rollup-win32-ia32-msvc": "4.54.0", "@rollup/rollup-win32-x64-gnu": "4.54.0", "@rollup/rollup-win32-x64-msvc": "4.54.0", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-3nk8Y3a9Ea8szgKhinMlGMhGMw89mqule3KWczxhIzqudyHdCIOHw8WJlj/r329fACjKLEh13ZSk7oE22kyeIw=="], "semver": ["semver@7.6.3", "", { "bin": "bin/semver.js" }, "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A=="], @@ -295,33 +313,25 @@ "strip-ansi-cjs": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], - "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "test-exclude": ["test-exclude@7.0.1", "", { "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^10.4.1", "minimatch": "^9.0.4" } }, "sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg=="], "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], - "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "tinyexec": ["tinyexec@1.0.2", "", {}, "sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg=="], "tinyglobby": ["tinyglobby@0.2.14", "", { "dependencies": { "fdir": "^6.4.4", "picomatch": "^4.0.2" } }, "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ=="], - "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], - "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], - "tinyspy": ["tinyspy@4.0.3", "", {}, "sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A=="], - "to-fast-properties": ["to-fast-properties@2.0.0", "", {}, "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog=="], "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], - "vite": ["vite@5.4.9", "", { "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", "rollup": "^4.20.0" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || >=20.0.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.4.0" }, "optionalPeers": ["@types/node", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser"], "bin": "bin/vite.js" }, "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg=="], - - "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], + "vite": ["vite@7.3.0", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg=="], - "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + "vitest": ["vitest@4.0.16", "", { "dependencies": { "@vitest/expect": "4.0.16", "@vitest/mocker": "4.0.16", "@vitest/pretty-format": "4.0.16", "@vitest/runner": "4.0.16", "@vitest/snapshot": "4.0.16", "@vitest/spy": "4.0.16", "@vitest/utils": "4.0.16", "es-module-lexer": "^1.7.0", "expect-type": "^1.2.2", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^3.10.0", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.0.3", "vite": "^6.0.0 || ^7.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.0.16", "@vitest/browser-preview": "4.0.16", "@vitest/browser-webdriverio": "4.0.16", "@vitest/ui": "4.0.16", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q=="], "which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], @@ -331,24 +341,66 @@ "wrap-ansi-cjs": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "chai/loupe": ["loupe@3.1.2", "", {}, "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg=="], + "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], + + "@vitest/expect/@vitest/utils": ["@vitest/utils@4.0.16", "", { "dependencies": { "@vitest/pretty-format": "4.0.16", "tinyrainbow": "^3.0.3" } }, "sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA=="], + + "@vitest/expect/tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], + + "@vitest/mocker/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "@vitest/pretty-format/tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], + + "@vitest/runner/@vitest/utils": ["@vitest/utils@4.0.16", "", { "dependencies": { "@vitest/pretty-format": "4.0.16", "tinyrainbow": "^3.0.3" } }, "sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA=="], + + "@vitest/snapshot/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "@vitest/utils/@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], "istanbul-lib-source-maps/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], + "rollup/@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "string-width-cjs/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "tinyglobby/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + + "vite/fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "vite/tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "vitest/@vitest/utils": ["@vitest/utils@4.0.16", "", { "dependencies": { "@vitest/pretty-format": "4.0.16", "tinyrainbow": "^3.0.3" } }, "sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA=="], + + "vitest/magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + + "vitest/std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + + "vitest/tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "vitest/tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], + "wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], "wrap-ansi-cjs/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "@vitest/mocker/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "@vitest/runner/@vitest/utils/tinyrainbow": ["tinyrainbow@3.0.3", "", {}, "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q=="], + + "@vitest/snapshot/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], + "vitest/magic-string/@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], + + "vitest/tinyglobby/fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + "wrap-ansi-cjs/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], "wrap-ansi-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], diff --git a/package.json b/package.json index cdea2495..4a2bba62 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,12 @@ "test": "vitest run", "test:watch": "vitest", "build": "bun run esbuild.js", - "lint": "bunx prettier src -c", - "lint:fix": "bunx prettier src -w", - "coverage": "vitest run --coverage", + "lint": "bun run prettier src -c", + "lint:fix": "bun run prettier src -w", + "coverage": "bun run vitest run --coverage", "vt:generate": "bun run esbuild.js && rtgl vt generate --skip-screenshots", - "serve": "bun run esbuild.js && bunx serve -p 3004 .rettangoli/vt/_site" + "serve": "bun run esbuild.js && bunx serve -p 3004 .rettangoli/vt/_site", + "prepare": "husky" }, "dependencies": { "immer": "^10.1.1", @@ -26,9 +27,14 @@ "js-yaml": "^4.1.0", "puty": "^0.0.6" }, + "lint-staged": { + "src/**/*.js": "prettier --check" + }, "devDependencies": { "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4", - "vitest": "^3.2.4" + "husky": "^9.1.7", + "prettier": "^3.7.4", + "vitest": "^4.0.16" } } diff --git a/src/RouteEngine.js b/src/RouteEngine.js index 10dbcff8..c421ec7c 100644 --- a/src/RouteEngine.js +++ b/src/RouteEngine.js @@ -9,41 +9,41 @@ export default function createRouteEngine(options) { const { handlePendingEffects } = options; const init = ({ initialState }) => { _systemStore = createSystemStore(initialState); - _systemStore.appendPendingEffect({ name: 'render' }); + _systemStore.appendPendingEffect({ name: "render" }); handleLineActions(); handlePendingEffects(_systemStore.selectPendingEffects()); _systemStore.clearPendingEffects(); - } + }; const selectPresentationState = () => { return _systemStore.selectPresentationState(); - } + }; const selectRenderState = () => { return _systemStore.selectRenderState(); - } + }; const handleAction = (actionType, payload) => { if (!_systemStore[actionType]) { return; } _systemStore[actionType](payload); - handlePendingEffects(_systemStore.selectPendingEffects()) + handlePendingEffects(_systemStore.selectPendingEffects()); _systemStore.clearPendingEffects(); - } + }; const handleActions = (actions) => { Object.entries(actions).forEach(([actionType, payload]) => { handleAction(actionType, payload); }); - } + }; const handleLineActions = () => { const line = _systemStore.selectCurrentLine(); if (line && line.actions) { handleActions(line.actions); } - } + }; return { init, @@ -51,6 +51,6 @@ export default function createRouteEngine(options) { handleActions, selectRenderState, selectPresentationState, - handleLineActions + handleLineActions, }; } diff --git a/src/createTimer.js b/src/createTimer.js deleted file mode 100644 index c332ff44..00000000 --- a/src/createTimer.js +++ /dev/null @@ -1,230 +0,0 @@ -/** - * Creates a timer system wrapped around PixiJS ticker - * @param {PIXI.Ticker} ticker - PixiJS ticker instance - */ -export const createTimer = (ticker) => { - // Internal state - const timers = new Map(); - const listeners = new Set(); - - // Emit event to all listeners - const emit = (eventType, payload) => { - const event = { eventType, payload, timestamp: performance.now() }; - listeners.forEach((listener) => listener(event)); - }; - - // Main update function added to PixiJS ticker - const update = (time) => { - const deltaMS = time.deltaMS; - - timers.forEach((timer, id) => { - if (timer.paused) return; - - timer.elapsed += deltaMS; - - if (timer.elapsed >= timer.delay) { - // Trigger the timer - const eventPayload = { - id, - elapsed: timer.elapsed, - delay: timer.delay, - type: timer.type, - triggerCount: timer.triggerCount + 1, - overshoot: timer.elapsed - timer.delay, - payload: timer.payload, - }; - - emit(id, eventPayload); - timer.triggerCount++; - - if (timer.type === "timeout") { - // Remove one-time timers - timers.delete(id); - } else if (timer.type === "interval") { - // Reset interval timers - timer.elapsed = timer.elapsed - timer.delay; - } - } - }); - }; - - // Start the update loop - ticker.add(update); - - // Public API - return { - /** - * Set a one-time timer - * @param {string} id - Timer ID - * @param {*} payload - Payload to pass when timer triggers - * @param {number} delay - Delay in milliseconds - * @returns {string} Timer ID - */ - setTimeout: (id, payload, delay) => { - if (timers.has(id)) { - console.warn(`Timer '${id}' already exists, replacing it`); - } - - timers.set(id, { - type: "timeout", - delay, - payload, - elapsed: 0, - triggerCount: 0, - paused: false, - }); - - return id; - }, - - /** - * Set a repeating timer - * @param {string} id - Timer ID - * @param {*} payload - Payload to pass when timer triggers - * @param {number} interval - Interval in milliseconds - * @returns {string} Timer ID - */ - setInterval: (id, payload, interval) => { - if (timers.has(id)) { - console.warn(`Timer '${id}' already exists, replacing it`); - } - - timers.set(id, { - type: "interval", - delay: interval, - payload, - elapsed: 0, - triggerCount: 0, - paused: false, - }); - - return id; - }, - - /** - * Clear/remove a timer - * @param {string} id - Timer ID - */ - clear: (id) => { - timers.delete(id); - }, - - /** - * Pause a timer - * @param {string} id - Timer ID - */ - pause: (id) => { - const timer = timers.get(id); - if (timer) { - timer.paused = true; - } - }, - - /** - * Resume a paused timer - * @param {string} id - Timer ID - */ - resume: (id) => { - const timer = timers.get(id); - if (timer && timer.paused) { - timer.paused = false; - } - }, - - /** - * Pause all timers - */ - pauseAll: () => { - timers.forEach((timer, id) => { - timer.paused = true; - }); - }, - - /** - * Resume all timers - */ - resumeAll: () => { - timers.forEach((timer, id) => { - timer.paused = false; - }); - }, - - /** - * Clear all timers - */ - clearAll: () => { - timers.clear(); - }, - - /** - * Register an event listener - * @param {Function} listener - Callback function - * @returns {Function} Unsubscribe function - */ - onEvent: (listener) => { - listeners.add(listener); - // Return unsubscribe function - return () => listeners.delete(listener); - }, - - /** - * Get timer info - * @param {string} id - Timer ID - * @returns {Object|null} Timer info or null if not found - */ - getTimer: (id) => { - const timer = timers.get(id); - return timer ? { id, ...timer } : null; - }, - - /** - * Get all active timer IDs - * @returns {Array} Array of timer IDs - */ - getActiveTimers: () => { - return Array.from(timers.keys()); - }, - - /** - * Destroy the timer system and clean up - */ - destroy: () => { - timers.clear(); - listeners.clear(); - ticker.remove(update); - }, - }; -}; - -// Usage Example: -/* -const timer = createTimer(app.ticker); - -// Listen for events -const unsubscribe = timer.onEvent(({ eventType, payload }) => { - if (eventType === 'timer') { - console.log(`Timer ${payload.id} triggered after ${payload.elapsed}ms`); - - if (payload.id === 'spawn-enemy') { - spawnEnemy(); - } - } -}); - -// Set timers -timer.setTimeout('game-over', 5000); -timer.setInterval('spawn-enemy', 1000); - -// Auto-generated IDs -const timerId = timer.setTimeout(3000); // Returns auto-generated ID - -// Control timers -timer.pause('spawn-enemy'); -timer.resume('spawn-enemy'); -timer.clear('game-over'); - -// Cleanup -timer.destroy(); -*/ - -export default createTimer; diff --git a/src/index.js b/src/index.js index a6b38f80..20e69eef 100644 --- a/src/index.js +++ b/src/index.js @@ -1,8 +1,3 @@ import createRouteEngine from "./RouteEngine"; -// import { -// constructPresentationState, -// constructRenderState, -// } from "./stores/index.js"; export default createRouteEngine; -// export { constructPresentationState, constructRenderState }; diff --git a/src/schemas/systemState/effects.yaml b/src/schemas/systemState/effects.yaml index 4b742323..de6e393b 100644 --- a/src/schemas/systemState/effects.yaml +++ b/src/schemas/systemState/effects.yaml @@ -124,4 +124,3 @@ oneOf: default: 0 required: [type, timerId, payload, delay] additionalProperties: false - diff --git a/src/schemas/systemState/systemState.yaml b/src/schemas/systemState/systemState.yaml index 2495b4de..83fbb28b 100644 --- a/src/schemas/systemState/systemState.yaml +++ b/src/schemas/systemState/systemState.yaml @@ -214,7 +214,6 @@ properties: properties: resourceId: type: string - type: object bgm: properties: resourceId: @@ -225,7 +224,7 @@ properties: properties: {} configuration: - $ref: './configuration.yaml' + $ref: "./configuration.yaml" historySequence: type: array @@ -235,5 +234,6 @@ properties: description: History entry default: [] -required: [variables, currentLanguagePackId, historySequence, currentMode, modes] +required: + [variables, currentLanguagePackId, historySequence, currentMode, modes] additionalProperties: false diff --git a/src/stores/constructPresentationState.js b/src/stores/constructPresentationState.js index 3d697cab..7b54907c 100644 --- a/src/stores/constructPresentationState.js +++ b/src/stores/constructPresentationState.js @@ -87,7 +87,10 @@ export const dialogue = (state, presentation) => { } // Handle NVL mode content addition - if (presentation.dialogue?.mode === "nvl" && presentation.dialogue.content !== undefined) { + if ( + presentation.dialogue?.mode === "nvl" && + presentation.dialogue.content !== undefined + ) { if (presentation.dialogue.clear) { state.dialogue.lines = []; } @@ -140,7 +143,6 @@ export const visual = (state, presentation) => { } }; - /** * Applies character from presentation to state * @param {Object} state - The current state of the system @@ -243,9 +245,8 @@ export const constructPresentationState = (presentations) => { const executeActions = createSequentialActionsExecutor( createInitialState, - actions + actions, ); return executeActions(presentations); }; - diff --git a/src/stores/constructRenderState.js b/src/stores/constructRenderState.js index caa0031e..12ec5882 100644 --- a/src/stores/constructRenderState.js +++ b/src/stores/constructRenderState.js @@ -34,9 +34,7 @@ export const addBase = (state, { presentationState, resources }) => { return state; } - if ( - presentationState.base.resourceId - ) { + if (presentationState.base.resourceId) { const layout = resources?.layouts[presentationState.base.resourceId]; if (layout) { @@ -58,7 +56,15 @@ export const addBase = (state, { presentationState, resources }) => { */ export const addBackgroundOrCg = ( state, - { presentationState, previousPresentationState, resources = {}, variables, autoMode, skipMode, currentLocalizationPackageId }, // resolveFile + { + presentationState, + previousPresentationState, + resources = {}, + variables, + autoMode, + skipMode, + currentLocalizationPackageId, + }, // resolveFile ) => { const { elements } = state; const animations = state.animations || []; @@ -69,9 +75,7 @@ export const addBackgroundOrCg = ( return state; } - if ( - presentationState.background.resourceId - ) { + if (presentationState.background.resourceId) { const { images = {} } = resources; const background = images[presentationState.background.resourceId]; if (background) { @@ -87,9 +91,7 @@ export const addBackgroundOrCg = ( } } - if ( - presentationState.background.resourceId - ) { + if (presentationState.background.resourceId) { const { layouts = {} } = resources; const layout = layouts[presentationState.background.resourceId]; if (layout) { @@ -101,11 +103,9 @@ export const addBackgroundOrCg = ( } } - if (presentationState.background.animations) { if (presentationState.background.animations.in) { - const tweenId = - presentationState.background.animations.in.resourceId; + const tweenId = presentationState.background.animations.in.resourceId; const tween = resources?.tweens[tweenId]; if (tween) { animations.push({ @@ -118,9 +118,9 @@ export const addBackgroundOrCg = ( } if (presentationState.background.animations.out) { - const tweenId = - presentationState.background.animations.out.resourceId; - const targetResourceId = previousPresentationState?.background?.resourceId; + const tweenId = presentationState.background.animations.out.resourceId; + const targetResourceId = + previousPresentationState?.background?.resourceId; const tween = resources?.tweens[tweenId]; if (tween && targetResourceId) { animations.push({ @@ -154,10 +154,7 @@ export const addBackgroundOrCg = ( * * @param {Object} params */ -export const addCharacters = ( - state, - { presentationState, resources }, -) => { +export const addCharacters = (state, { presentationState, resources }) => { const { elements } = state; const animations = state.animations || []; if (presentationState.character && resources) { @@ -270,10 +267,7 @@ export const addCharacters = ( * * @param {Object} params */ -export const addVisuals = ( - state, - { presentationState, resources }, -) => { +export const addVisuals = (state, { presentationState, resources }) => { const { elements } = state; const animations = state.animations || []; if (presentationState.visual && resources) { @@ -330,8 +324,7 @@ export const addVisuals = ( if (item.animations) { if (item.animations.in) { - const tweenId = - item.animations.in.resourceId || item.animations.in; + const tweenId = item.animations.in.resourceId || item.animations.in; const tween = resources?.tweens[tweenId]; if (tween) { animations.push({ @@ -344,8 +337,7 @@ export const addVisuals = ( } if (item.animations.out) { - const tweenId = - item.animations.out.resourceId || item.animations.out; + const tweenId = item.animations.out.resourceId || item.animations.out; const tween = resources?.tweens[tweenId]; if (tween) { animations.push({ @@ -368,7 +360,16 @@ export const addVisuals = ( */ export const addDialogue = ( state, - { presentationState, resources = {}, dialogueUIHidden, autoMode, skipMode, skipOnlyViewedLines, l10n, variables }, + { + presentationState, + resources = {}, + dialogueUIHidden, + autoMode, + skipMode, + skipOnlyViewedLines, + l10n, + variables, + }, ) => { const { elements } = state; if (!presentationState.dialogue) { @@ -384,13 +385,17 @@ export const addDialogue = ( if (!storyContainer) return state; // Handle GUI elements (dialogue layouts) from dialogue.gui.resourceId - if (presentationState.dialogue.gui && presentationState.dialogue.gui.resourceId) { + if ( + presentationState.dialogue.gui && + presentationState.dialogue.gui.resourceId + ) { const { layouts = {} } = resources; const guiLayout = layouts[presentationState.dialogue.gui.resourceId]; if (guiLayout) { let character; if (presentationState.dialogue.characterId) { - character = resources.characters[presentationState.dialogue.characterId]; + character = + resources.characters[presentationState.dialogue.characterId]; } // Check if there's a character object override @@ -412,17 +417,17 @@ export const addDialogue = ( character: { name: character?.name || "", }, - content: presentationState.dialogue?.content || [{ text: '' }], + content: presentationState.dialogue?.content || [{ text: "" }], lines: presentationState.dialogue?.lines || [], }, - l10n + l10n, }; let result = parseAndRender(wrappedTemplate, templateData, { functions: jemplFunctions, }); result = parseAndRender(result, { - l10n + l10n, }); const guiElements = result?.elements; @@ -472,10 +477,7 @@ export const addChoices = (state, { presentationState, resources }) => { return state; }; -export const addBgm = ( - state, - { presentationState, resources }, -) => { +export const addBgm = (state, { presentationState, resources }) => { const { elements, audio } = state; if (presentationState.bgm && resources) { // Find the story container @@ -546,7 +548,14 @@ export const addVoice = (state, { presentationState, resources }) => { */ export const addLayout = ( state, - { presentationState, resources = {}, variables, autoMode, skipMode, currentLocalizationPackageId }, + { + presentationState, + resources = {}, + variables, + autoMode, + skipMode, + currentLocalizationPackageId, + }, ) => { const { elements } = state; const animations = state.animations || []; @@ -593,7 +602,7 @@ export const addLayout = ( functions: jemplFunctions, }); processedContainer = parseAndRender(processedContainer, { - i18n: {} + i18n: {}, // i18n: systemStore.selectCurrentLanguagePackKeys(), }); @@ -621,7 +630,15 @@ export const addLayout = ( export const addLayeredViews = ( state, - { resources = {}, variables, autoMode, skipMode, currentLocalizationPackageId, layeredViews = [], dialogueHistory = [] }, + { + resources = {}, + variables, + autoMode, + skipMode, + currentLocalizationPackageId, + layeredViews = [], + dialogueHistory = [], + }, ) => { const { elements } = state; const animations = state.animations || []; @@ -650,11 +667,11 @@ export const addLayeredViews = ( children: layout.elements || [], }; - const historyDialogueWithNames = dialogueHistory.map(item => { + const historyDialogueWithNames = dialogueHistory.map((item) => { const character = resources.characters?.[item.characterId]; return { ...item, - characterName: character?.name || '' + characterName: character?.name || "", }; }); @@ -664,18 +681,21 @@ export const addLayeredViews = ( skipMode, currentLocalizationPackageId, historyDialogue: historyDialogueWithNames, - characters: resources.characters || {} + characters: resources.characters || {}, }; - let processedLayeredView = parseAndRender(layeredViewContainer, templateData, { - functions: jemplFunctions, - }); + let processedLayeredView = parseAndRender( + layeredViewContainer, + templateData, + { + functions: jemplFunctions, + }, + ); processedLayeredView = parseAndRender(processedLayeredView, { - i18n: {} + i18n: {}, }); elements.push(processedLayeredView); - }); } return state; @@ -698,8 +718,8 @@ export const constructRenderState = (params) => { const executeActions = createSequentialActionsExecutor( createInitialState, - actions + actions, ); return executeActions(params); -} +}; diff --git a/src/stores/system.store.js b/src/stores/system.store.js index 46637518..243895d3 100644 --- a/src/stores/system.store.js +++ b/src/stores/system.store.js @@ -4,20 +4,22 @@ import { constructRenderState } from "./constructRenderState.js"; export const createInitialState = (payload) => { const { - global: { - currentLocalizationPackageId, - }, + global: { currentLocalizationPackageId }, // initialPointer, projectData, } = payload; const initialPointer = { sceneId: projectData.story.initialSceneId, - sectionId: projectData.story.scenes[projectData.story.initialSceneId].initialSectionId, - lineId: projectData.story.scenes[projectData.story.initialSceneId] - .sections[projectData.story.scenes[projectData.story.initialSceneId].initialSectionId] - .lines[0].id, - } + sectionId: + projectData.story.scenes[projectData.story.initialSceneId] + .initialSectionId, + lineId: + projectData.story.scenes[projectData.story.initialSceneId].sections[ + projectData.story.scenes[projectData.story.initialSceneId] + .initialSectionId + ].lines[0].id, + }; const state = { projectData, @@ -32,7 +34,7 @@ export const createInitialState = (payload) => { currentLocalizationPackageId: currentLocalizationPackageId, viewedRegistry: { sections: [], - resources: [] + resources: [], }, nextLineConfig: { manual: { @@ -41,27 +43,35 @@ export const createInitialState = (payload) => { }, auto: { enabled: false, - } + }, }, saveSlots: {}, layeredViews: [], }, - contexts: [{ - currentPointerMode: 'read', - pointers: { - read: initialPointer, - history: { sectionId: undefined, lineId: undefined, historySequenceIndex: undefined }, - }, - historySequence: [{ - sectionId: '...', - }], - configuration: {}, - views: [], - bgm: { - resourceId: undefined, + contexts: [ + { + currentPointerMode: "read", + pointers: { + read: initialPointer, + history: { + sectionId: undefined, + lineId: undefined, + historySequenceIndex: undefined, + }, + }, + historySequence: [ + { + sectionId: "...", + }, + ], + configuration: {}, + views: [], + bgm: { + resourceId: undefined, + }, + variables: {}, }, - variables: {}, - }] + ], }; return state; }; @@ -107,18 +117,21 @@ export const selectDialogueHistory = ({ state }) => { } // Get all lines up to and including the current line - const currentLineIndex = section.lines.findIndex(line => line.id === lineId); + const currentLineIndex = section.lines.findIndex( + (line) => line.id === lineId, + ); const linesUpToCurrent = section.lines.slice(0, currentLineIndex + 1); // Filter for lines that have dialogue content const historyContent = linesUpToCurrent - .filter(line => line.actions?.dialogue) - .map(line => { + .filter((line) => line.actions?.dialogue) + .map((line) => { const dialogue = line.actions.dialogue; - let characterName = ''; + let characterName = ""; if (dialogue.characterId) { - const character = state.projectData.resources?.characters?.[dialogue.characterId]; - characterName = character?.name || ''; + const character = + state.projectData.resources?.characters?.[dialogue.characterId]; + characterName = character?.name || ""; } return { content: dialogue.content, @@ -137,7 +150,7 @@ export const selectCurrentLocalizationPackageId = ({ state }) => { export const selectIsLineViewed = ({ state }, payload) => { const { sectionId, lineId } = payload; const section = state.global.viewedRegistry.sections.find( - section => section.sectionId === sectionId + (section) => section.sectionId === sectionId, ); if (!section) { @@ -158,14 +171,22 @@ export const selectIsLineViewed = ({ state }, payload) => { // Use selectSection to get the section data const foundSection = selectSection({ state }, { sectionId }); - if (!foundSection || !foundSection.lines || !Array.isArray(foundSection.lines)) { + if ( + !foundSection || + !foundSection.lines || + !Array.isArray(foundSection.lines) + ) { // If we can't find the section or lines, fallback to original behavior return false; } // Find indices of both lines in the lines array - const lastLineIndex = foundSection.lines.findIndex(line => line.id === section.lastLineId); - const currentLineIndex = foundSection.lines.findIndex(line => line.id === lineId); + const lastLineIndex = foundSection.lines.findIndex( + (line) => line.id === section.lastLineId, + ); + const currentLineIndex = foundSection.lines.findIndex( + (line) => line.id === lineId, + ); // If we can't find either line in the array, fallback to simple comparison if (lastLineIndex === -1 || currentLineIndex === -1) { @@ -179,7 +200,7 @@ export const selectIsLineViewed = ({ state }, payload) => { export const selectIsResourceViewed = ({ state }, payload) => { const { resourceId } = payload; const resource = state.global.viewedRegistry.resources.find( - resource => resource.resourceId === resourceId + (resource) => resource.resourceId === resourceId, ); return !!resource; @@ -216,7 +237,7 @@ export const selectCurrentPointer = ({ state }) => { return { currentPointerMode: lastContext.currentPointerMode, - pointer + pointer, }; }; @@ -261,7 +282,7 @@ export const selectCurrentLine = ({ state }) => { return undefined; } - return section.lines.find(line => line.id === lineId); + return section.lines.find((line) => line.id === lineId); }; export const selectPresentationState = ({ state }) => { @@ -270,12 +291,12 @@ export const selectPresentationState = ({ state }) => { // get all lines up to the current line index, inclusive const lines = section?.lines || []; - const currentLineIndex = lines.findIndex(line => line.id === lineId); + const currentLineIndex = lines.findIndex((line) => line.id === lineId); // Return all lines up to and including the current line const currentLines = lines.slice(0, currentLineIndex + 1); - console.log('currentLines', currentLines); + console.log("currentLines", currentLines); // Create presentation state from unified actions const presentationActions = currentLines.map((line) => { @@ -290,16 +311,16 @@ export const selectPresentationState = ({ state }) => { return presentationData; }); - const presentationState = constructPresentationState(presentationActions) - return presentationState -} + const presentationState = constructPresentationState(presentationActions); + return presentationState; +}; export const selectPreviousPresentationState = ({ state }) => { const { sectionId, lineId } = selectCurrentPointer({ state }).pointer; const section = selectSection({ state }, { sectionId }); const lines = section?.lines || []; - const currentLineIndex = lines.findIndex(line => line.id === lineId); + const currentLineIndex = lines.findIndex((line) => line.id === lineId); // Return all lines before the current line (not including current) if (currentLineIndex <= 0) { @@ -318,26 +339,28 @@ export const selectPreviousPresentationState = ({ state }) => { }); return constructPresentationState(presentationActions); -} +}; export const selectRenderState = ({ state }) => { const presentationState = selectPresentationState({ state }); const previousPresentationState = selectPreviousPresentationState({ state }); - console.log('presentationState', presentationState); + console.log("presentationState", presentationState); const renderState = constructRenderState({ presentationState, previousPresentationState, resources: state.projectData.resources, - l10n: state.projectData.l10n.packages[state.global.currentLocalizationPackageId], + l10n: state.projectData.l10n.packages[ + state.global.currentLocalizationPackageId + ], autoMode: state.global.autoMode, skipMode: state.global.skipMode, skipOnlyViewedLines: state.global.skipOnlyViewedLines, layeredViews: state.global.layeredViews, dialogueHistory: selectDialogueHistory({ state }), }); - console.log('renderState', renderState); + console.log("renderState", renderState); return renderState; -} +}; /************************** * Actions @@ -532,15 +555,19 @@ export const appendPendingEffect = ({ state }, payload) => { export const addViewedLine = ({ state }, payload) => { const { sectionId, lineId } = payload; const section = state.global.viewedRegistry.sections.find( - section => section.sectionId === sectionId + (section) => section.sectionId === sectionId, ); if (section) { // Update existing section only if new line is after the current lastLineId const foundSection = selectSection({ state }, { sectionId }); if (foundSection?.lines && section.lastLineId !== undefined) { - const lastLineIndex = foundSection.lines.findIndex(line => line.id === section.lastLineId); - const newLineIndex = foundSection.lines.findIndex(line => line.id === lineId); + const lastLineIndex = foundSection.lines.findIndex( + (line) => line.id === section.lastLineId, + ); + const newLineIndex = foundSection.lines.findIndex( + (line) => line.id === lineId, + ); // Update only if newLineIndex is greater (later in the section) or if lastLineId not found if (lastLineIndex === -1 || newLineIndex > lastLineIndex) { @@ -554,7 +581,7 @@ export const addViewedLine = ({ state }, payload) => { // Add new section state.global.viewedRegistry.sections.push({ sectionId, - lastLineId: lineId + lastLineId: lineId, }); } @@ -567,13 +594,13 @@ export const addViewedLine = ({ state }, payload) => { export const addViewedResource = ({ state }, payload) => { const { resourceId } = payload; const existingResource = state.global.viewedRegistry.resources.find( - resource => resource.resourceId === resourceId + (resource) => resource.resourceId === resourceId, ); if (!existingResource) { // Add new resource only if it doesn't already exist state.global.viewedRegistry.resources.push({ - resourceId + resourceId, }); } @@ -605,12 +632,11 @@ export const setNextLineConfig = ({ state }, payload) => { if (manual && auto) { state.global.nextLineConfig = { manual, - auto + auto, }; } else { // Partial update - merge only provided sections if (manual) { - state.global.nextLineConfig.manual = manual; // state.global.nextLineConfig.manual = { // ...state.global.nextLineConfig.manual, @@ -646,7 +672,7 @@ export const replaceSaveSlot = ({ state }, payload) => { slotKey, date, image, - state: slotState + state: slotState, }; state.global.pendingEffects.push({ @@ -708,13 +734,16 @@ export const jumpToLine = ({ state }, payload) => { } // Validate line exists in target section - const targetSection = selectSection({ state }, { sectionId: targetSectionId }); + const targetSection = selectSection( + { state }, + { sectionId: targetSectionId }, + ); if (!targetSection?.lines || !Array.isArray(targetSection.lines)) { console.warn(`Section ${targetSectionId} has no lines`); return state; } - const targetLine = targetSection.lines.find(line => line.id === lineId); + const targetLine = targetSection.lines.find((line) => line.id === lineId); if (!targetLine) { console.warn(`Line not found: ${lineId} in section ${targetSectionId}`); return state; @@ -723,7 +752,7 @@ export const jumpToLine = ({ state }, payload) => { // Update current pointer to new line lastContext.pointers.read = { sectionId: targetSectionId, - lineId: lineId + lineId: lineId, }; // Reset line completion state @@ -734,7 +763,7 @@ export const jumpToLine = ({ state }, payload) => { name: "render", }); state.global.pendingEffects.push({ - name: "handleLineActions" + name: "handleLineActions", }); return state; @@ -776,7 +805,10 @@ export const addToHistorySequence = ({ state }, payload) => { */ export const nextLineFromCompleted = ({ state }) => { // Check if auto navigation is enabled and configured to trigger from line completion - if (state.global.nextLineConfig?.auto?.enabled !== true || state.global.nextLineConfig?.auto?.trigger !== 'fromComplete') { + if ( + state.global.nextLineConfig?.auto?.enabled !== true || + state.global.nextLineConfig?.auto?.trigger !== "fromComplete" + ) { return state; } @@ -785,7 +817,9 @@ export const nextLineFromCompleted = ({ state }) => { const section = selectSection({ state }, { sectionId }); const lines = section?.lines || []; - const currentLineIndex = lines.findIndex(line => line.id === pointer?.lineId); + const currentLineIndex = lines.findIndex( + (line) => line.id === pointer?.lineId, + ); const nextLineIndex = currentLineIndex + 1; if (nextLineIndex < lines.length) { @@ -795,7 +829,7 @@ export const nextLineFromCompleted = ({ state }) => { if (lastContext) { lastContext.pointers.read = { sectionId, - lineId: nextLine.id + lineId: nextLine.id, }; } @@ -808,7 +842,7 @@ export const nextLineFromCompleted = ({ state }) => { name: "render", }); state.global.pendingEffects.push({ - name: 'handleLineActions' + name: "handleLineActions", }); } return state; @@ -824,7 +858,9 @@ export const nextLine = ({ state }) => { const section = selectSection({ state }, { sectionId }); const lines = section?.lines || []; - const currentLineIndex = lines.findIndex(line => line.id === pointer?.lineId); + const currentLineIndex = lines.findIndex( + (line) => line.id === pointer?.lineId, + ); const nextLineIndex = currentLineIndex + 1; if (nextLineIndex < lines.length) { @@ -832,10 +868,13 @@ export const nextLine = ({ state }) => { // Check if skip mode should stop at unviewed lines if (state.global.skipMode && state.global.skipOnlyViewedLines) { - const isNextLineViewed = selectIsLineViewed({ state }, { - sectionId, - lineId: nextLine.id - }); + const isNextLineViewed = selectIsLineViewed( + { state }, + { + sectionId, + lineId: nextLine.id, + }, + ); if (!isNextLineViewed) { // Stop skip mode when encountering an unviewed line @@ -854,7 +893,7 @@ export const nextLine = ({ state }) => { lastContext.pointers.read = { sectionId, - lineId: nextLine.id + lineId: nextLine.id, }; } @@ -864,8 +903,8 @@ export const nextLine = ({ state }) => { name: "render", }); state.global.pendingEffects.push({ - name: 'handleLineActions' - }) + name: "handleLineActions", + }); } else { // Reached the end of section, stop auto/skip modes if (state.global.autoMode) { @@ -876,7 +915,7 @@ export const nextLine = ({ state }) => { } } - console.log('state', state) + console.log("state", state); return state; }; @@ -912,32 +951,38 @@ export const prevLine = ({ state }, payload) => { } // Get current history pointer or use read pointer as fallback - const currentPointer = lastContext.pointers.history || lastContext.pointers.read; + const currentPointer = + lastContext.pointers.history || lastContext.pointers.read; // If we're already in history mode, keep history pointer and move it back // Otherwise, switch to history mode and initialize it (only if we have a valid currentPointer) - if (lastContext.currentPointerMode !== 'history' || !lastContext.pointers.history) { + if ( + lastContext.currentPointerMode !== "history" || + !lastContext.pointers.history + ) { // Only switch to history mode if we have a valid current pointer to work with if (!currentPointer) { return state; } // Switch to history mode, initialize history pointer with current position - lastContext.currentPointerMode = 'history'; + lastContext.currentPointerMode = "history"; lastContext.pointers.history = { sectionId, - lineId: currentPointer?.lineId + lineId: currentPointer?.lineId, }; // Immediately move to previous line after switching to history mode - const currentLineIndex = lines.findIndex(line => line.id === currentPointer.lineId); + const currentLineIndex = lines.findIndex( + (line) => line.id === currentPointer.lineId, + ); const prevLineIndex = currentLineIndex - 1; if (prevLineIndex >= 0 && prevLineIndex < lines.length) { const prevLine = lines[prevLineIndex]; lastContext.pointers.history = { sectionId, - lineId: prevLine.id + lineId: prevLine.id, }; } @@ -950,14 +995,16 @@ export const prevLine = ({ state }, payload) => { } // Already in history mode, move history pointer to previous line - const currentLineIndex = lines.findIndex(line => line.id === lastContext.pointers.history.lineId); + const currentLineIndex = lines.findIndex( + (line) => line.id === lastContext.pointers.history.lineId, + ); const prevLineIndex = currentLineIndex - 1; if (prevLineIndex >= 0 && prevLineIndex < lines.length) { const prevLine = lines[prevLineIndex]; lastContext.pointers.history = { sectionId, - lineId: prevLine.id + lineId: prevLine.id, }; state.global.pendingEffects.push({ @@ -1003,7 +1050,7 @@ export const sectionTransition = ({ state }, payload) => { if (lastContext) { lastContext.pointers.read = { sectionId, - lineId: firstLine.id + lineId: firstLine.id, }; } @@ -1015,7 +1062,7 @@ export const sectionTransition = ({ state }, payload) => { name: "render", }); state.global.pendingEffects.push({ - name: "handleLineActions" + name: "handleLineActions", }); return state; @@ -1088,11 +1135,10 @@ export const createSystemStore = (initialState) => { return createStore(_initialState, selectorsAndActions, { transformActionFirstArgument: (state) => { - return { state } + return { state }; }, transformSelectorFirstArgument: (state) => { - return { state } + return { state }; }, }); }; - diff --git a/vt/static/main.js b/vt/static/main.js index 9ef9546c..13eea9db 100644 --- a/vt/static/main.js +++ b/vt/static/main.js @@ -176,72 +176,72 @@ const init = async () => { const uniqueEffects = Object.values(deduplicatedEffects); for (const effect of uniqueEffects) { - if (effect.name === 'render') { - const renderState = engine.selectRenderState(); - routeGraphics.render(renderState); - } else if (effect.name === 'handleLineActions') { - engine.handleLineActions(); - } else if (effect.name === 'startAutoNextTimer') { - // Remove old callback if exists - if (autoModeCallback) { - ticker.remove(autoModeCallback); - } + if (effect.name === 'render') { + const renderState = engine.selectRenderState(); + routeGraphics.render(renderState); + } else if (effect.name === 'handleLineActions') { + engine.handleLineActions(); + } else if (effect.name === 'startAutoNextTimer') { + // Remove old callback if exists + if (autoModeCallback) { + ticker.remove(autoModeCallback); + } - // Reset elapsed time - autoModeElapsed = 0; + // Reset elapsed time + autoModeElapsed = 0; - // Create new ticker callback for auto mode - autoModeCallback = (time) => { - autoModeElapsed += time.deltaMS; + // Create new ticker callback for auto mode + autoModeCallback = (time) => { + autoModeElapsed += time.deltaMS; - // Auto advance every 1000ms (1 second) - hardcoded - // TODO: Speed can adjust in the future - if (autoModeElapsed >= 1000) { - autoModeElapsed = 0; - engine.handleAction('nextLine', {}); + // Auto advance every 1000ms (1 second) - hardcoded + // TODO: Speed can adjust in the future + if (autoModeElapsed >= 1000) { + autoModeElapsed = 0; + engine.handleAction('nextLine', {}); + } + }; + + // Add to auto ticker + ticker.add(autoModeCallback); + } else if (effect.name === 'clearAutoNextTimer') { + // Remove ticker callback + if (autoModeCallback) { + ticker.remove(autoModeCallback); + autoModeCallback = null; + } + autoModeElapsed = 0; + } else if (effect.name === 'startSkipNextTimer') { + // Remove old callback if exists + if (skipModeCallback) { + ticker.remove(skipModeCallback); } - }; - // Add to auto ticker - ticker.add(autoModeCallback); - } else if (effect.name === 'clearAutoNextTimer') { - // Remove ticker callback - if (autoModeCallback) { - ticker.remove(autoModeCallback); - autoModeCallback = null; - } - autoModeElapsed = 0; - } else if (effect.name === 'startSkipNextTimer') { - // Remove old callback if exists - if (skipModeCallback) { - ticker.remove(skipModeCallback); - } + // Reset elapsed time + skipModeElapsed = 0; - // Reset elapsed time - skipModeElapsed = 0; + // Create new ticker callback for skip mode + skipModeCallback = (time) => { + skipModeElapsed += time.deltaMS; - // Create new ticker callback for skip mode - skipModeCallback = (time) => { - skipModeElapsed += time.deltaMS; + // Skip advance every 30ms + if (skipModeElapsed >= 30) { + skipModeElapsed = 0; + engine.handleAction('nextLine', {}); + } + }; - // Skip advance every 30ms - if (skipModeElapsed >= 30) { - skipModeElapsed = 0; - engine.handleAction('nextLine', {}); + // Add to skip ticker + ticker.add(skipModeCallback); + } else if (effect.name === 'clearSkipNextTimer') { + // Remove ticker callback + if (skipModeCallback) { + ticker.remove(skipModeCallback); + skipModeCallback = null; } - }; - - // Add to skip ticker - ticker.add(skipModeCallback); - } else if (effect.name === 'clearSkipNextTimer') { - // Remove ticker callback - if (skipModeCallback) { - ticker.remove(skipModeCallback); - skipModeCallback = null; + skipModeElapsed = 0; } - skipModeElapsed = 0; } - } }; }; From b07010c8bb507341040a645b8cd7c796f63daae2 Mon Sep 17 00:00:00 2001 From: Luciano Hanyon Wu Date: Fri, 26 Dec 2025 10:45:09 +0800 Subject: [PATCH 2/2] update --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index 4a2bba62..b110899f 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,6 @@ "js-yaml": "^4.1.0", "puty": "^0.0.6" }, - "lint-staged": { - "src/**/*.js": "prettier --check" - }, "devDependencies": { "@vitest/coverage-v8": "^3.2.4", "@vitest/ui": "^3.2.4",