From a7df913f206dad04bfe9ddce32bffd69a82cd13b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Jerci=C5=84ski?= Date: Sat, 11 Jul 2026 10:31:53 +0200 Subject: [PATCH] chore: migrate to the @j4k scope on the Forge npm registry Rename oxlint-config-j4k to @j4k/oxlint-config and point pnpm at the self-hosted Forgejo npm registry (code.j4k.dev) instead of Verdaccio. - pnpm-workspace.yaml registries: default npmjs + "@j4k" -> code.j4k.dev, with minimumReleaseAgeIgnoreMissingTime false and an "@j4k/*" exclude - workflows install via secrets.FORGEJO_NPM_TOKEN against code.j4k.dev; pr-review passes it to the axgithub reusable as its NPM_TOKEN input - bump oxlint/oxlint-tsgolint/oxfmt floors for @j4k/oxlint-config 2.11 - hand-fix vitest lint errors surfaced by the config jump; add the css-modules ambient shim to the knip entry list No runtime behavior changes, so this is a non-releasing chore. --- .github/workflows/checks.yml | 10 +- .github/workflows/dedupe-check.yml | 14 +- .github/workflows/pr-review.yml | 6 +- .github/workflows/release-npm.yml | 12 +- .gitignore | 1 + knip.json | 2 +- oxlint.config.ts | 2 +- package.json | 10 +- pnpm-lock.yaml | 690 +++++++++--------- pnpm-workspace.yaml | 6 +- src/cli/collect-pattern-warnings.ts | 8 +- src/cli/main.test.ts | 2 +- src/config/config.test.ts | 22 +- src/config/loader.createSampleConfig.test.ts | 17 +- src/core/execution.test.ts | 26 +- src/core/execution.ts | 1 + src/core/sync-global.test.ts | 30 +- src/core/sync.test.ts | 13 +- src/utils/errors.test.ts | 88 ++- .../integration/execution.integration.test.ts | 4 +- .../integration/rules-fs.integration.test.ts | 16 +- types/css-modules.d.ts | 18 + 22 files changed, 529 insertions(+), 469 deletions(-) create mode 100644 types/css-modules.d.ts diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index eff76c5..acaebf7 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -30,24 +30,24 @@ jobs: - name: Verify install secret env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} run: | set -eu if [ -z "${NODE_AUTH_TOKEN:-}" ]; then - echo "::error::Missing required install secret NPM_TOKEN; set it in the repo or org Actions secrets." + echo "::error::Missing required install secret FORGEJO_NPM_TOKEN; set it in the repo Actions secrets." exit 1 fi - name: Configure registry auth - run: echo "//npm.j4k.dev/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc + run: echo "//code.j4k.dev/api/packages/j4k/npm/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} - name: Install dependencies run: pnpm install --frozen-lockfile --ignore-scripts --ignore-pnpmfile - name: Strip registry token - # pull_request gets secrets on same-repo PRs; remove the token before any PR-controlled script reads ~/.npmrc. + # pull_request runs PR-controlled scripts below; remove the token before any of them reads ~/.npmrc. run: rm -f ~/.npmrc - name: Run knip diff --git a/.github/workflows/dedupe-check.yml b/.github/workflows/dedupe-check.yml index 48c892f..7124da3 100644 --- a/.github/workflows/dedupe-check.yml +++ b/.github/workflows/dedupe-check.yml @@ -20,7 +20,7 @@ jobs: uses: actions/checkout@v6 - name: Strip untrusted project install config - # pull_request checks out attacker-controlled code: drop committed .npmrc (redirects installs / leaks the registry token) and both pnpmfile variants .pnpmfile.cjs/.pnpmfile.mjs (pnpm 11 loads .mjs first, and their hooks run under --ignore-scripts during both install and dedupe, which keep the token on disk). + # pull_request checks out attacker-controlled code: drop committed .npmrc (redirects installs / leaks the registry token) and both pnpmfile variants .pnpmfile.cjs/.pnpmfile.mjs (pnpm 11 loads .mjs first, and their install hooks run even under --ignore-scripts). run: rm -f .npmrc .pnpmfile.cjs .pnpmfile.mjs - name: Setup pnpm @@ -34,22 +34,22 @@ jobs: - name: Verify install secret env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} run: | set -eu if [ -z "${NODE_AUTH_TOKEN:-}" ]; then - echo "::error::Missing required install secret NPM_TOKEN; set it in the repo or org Actions secrets." + echo "::error::Missing required install secret FORGEJO_NPM_TOKEN; set it in the repo Actions secrets." exit 1 fi - name: Configure registry auth - run: echo "//npm.j4k.dev/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc + run: echo "//code.j4k.dev/api/packages/j4k/npm/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} - name: Install dependencies run: pnpm install --frozen-lockfile --ignore-scripts --ignore-pnpmfile - name: Check for dedupe opportunities - # No token strip here (unlike checks.yml, which strips before untrusted build/test): install ran --ignore-scripts --ignore-pnpmfile and `pnpm dedupe --check` is a builtin, so no untrusted code runs with ~/.npmrc present — stripping it would only risk breaking dedupe on private-registry repos. - run: pnpm dedupe --check --ignore-scripts + # --ignore-pnpmfile is load-bearing: pnpm dedupe runs the full install pipeline and loads pnpmfiles gated only by ignore-pnpmfile, NOT --ignore-scripts, so without it a PR-set pnpmfile: path in pnpm-workspace.yaml (surviving the .pnpmfile.* strip) executes arbitrary code with the registry token in ~/.npmrc. No token strip: dedupe needs the private registry and both ignore flags block every untrusted code path. + run: pnpm dedupe --check --ignore-scripts --ignore-pnpmfile diff --git a/.github/workflows/pr-review.yml b/.github/workflows/pr-review.yml index 387afee..18473e5 100644 --- a/.github/workflows/pr-review.yml +++ b/.github/workflows/pr-review.yml @@ -24,7 +24,9 @@ jobs: recipes: '[{"recipe":"pr-review-approach-smart","name":"smart draw 1"},{"recipe":"pr-review-approach-smart","name":"smart draw 2"},"pr-review-approach-2","pr-review-approach-3"]' pr_number: ${{ github.event.pull_request.number || inputs.pr_number }} secrets: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + # The reusable workflow's secret input keeps its legacy NPM_TOKEN name; the + # value is the Forgejo read:package PAT for code.j4k.dev. + NPM_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} AXRECIPE_API_KEY: ${{ secrets.AXRECIPE_API_KEY }} code: @@ -38,5 +40,5 @@ jobs: recipes: '[{"recipe":"pr-review-code-smart","name":"smart draw 1"},{"recipe":"pr-review-code-smart","name":"smart draw 2"}]' pr_number: ${{ github.event.pull_request.number || inputs.pr_number }} secrets: - NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} AXRECIPE_API_KEY: ${{ secrets.AXRECIPE_API_KEY }} diff --git a/.github/workflows/release-npm.yml b/.github/workflows/release-npm.yml index 8bff940..140e63a 100644 --- a/.github/workflows/release-npm.yml +++ b/.github/workflows/release-npm.yml @@ -46,27 +46,27 @@ jobs: - name: Verify install secret env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} run: | set -eu if [ -z "${NODE_AUTH_TOKEN:-}" ]; then - echo "::error::Missing required install secret NPM_TOKEN; set it in the repo or org Actions secrets." + echo "::error::Missing required install secret FORGEJO_NPM_TOKEN; set it in the repo Actions secrets." exit 1 fi - name: Configure registry auth (install) - run: echo "//npm.j4k.dev/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc + run: echo "//code.j4k.dev/api/packages/j4k/npm/:_authToken=${NODE_AUTH_TOKEN}" > ~/.npmrc env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + NODE_AUTH_TOKEN: ${{ secrets.FORGEJO_NPM_TOKEN }} - name: Install dependencies - run: pnpm install --frozen-lockfile + # Lifecycle scripts must not run while the FORGEJO_NPM_TOKEN read:package PAT is in ~/.npmrc — a non-expiring PAT that reads the whole private @j4k tree; prepack still builds at publish time. + run: pnpm install --frozen-lockfile --ignore-scripts - name: Configure public npm registry (publish) run: echo "registry=https://registry.npmjs.org/" >> ~/.npmrc - name: Release - id: release env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: pnpm exec semantic-release diff --git a/.gitignore b/.gitignore index 10a7e19..e0d4db9 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ dist .yarn/build-state.yml .yarn/install-state.gz .pnp.* +.claude/worktrees/ diff --git a/knip.json b/knip.json index 0ebd5e5..6fd95fc 100644 --- a/knip.json +++ b/knip.json @@ -1,5 +1,5 @@ { "$schema": "https://unpkg.com/knip@6/schema.json", - "entry": ["src/cli/main.ts", "types/ts-reset.d.ts"], + "entry": ["src/cli/main.ts", "types/ts-reset.d.ts", "types/css-modules.d.ts"], "project": ["src/**/*.ts", "types/**/*.d.ts"] } diff --git a/oxlint.config.ts b/oxlint.config.ts index 5b0e1f1..19c8115 100644 --- a/oxlint.config.ts +++ b/oxlint.config.ts @@ -1,3 +1,3 @@ -import { compose, node, vitest } from "oxlint-config-j4k"; +import { compose, node, vitest } from "@j4k/oxlint-config"; export default compose(node, vitest); diff --git a/package.json b/package.json index a0691ff..ca3f125 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "knip": "knip", "lint": "oxlint --deny-warnings --report-unused-disable-directives .", "prepack": "pnpm run rebuild", - "prepare": "git config core.hooksPath .githooks", + "prepare": "if git rev-parse --is-inside-work-tree >/dev/null 2>&1; then git config core.hooksPath .githooks; fi", "rebuild": "pnpm run clean && pnpm run build", "start": "node bin/sync-rules", "test": "vitest run", @@ -54,6 +54,7 @@ "zod": "^4.3.6" }, "devDependencies": { + "@j4k/oxlint-config": "^2.11.0", "@total-typescript/ts-reset": "^0.6.1", "@types/node": "^25.6.0", "@typescript/native-preview": "beta", @@ -61,10 +62,9 @@ "fta-check": "^1.5.2", "fta-cli": "^3.0.0", "knip": "^6.6.3", - "oxfmt": "^0.46.0", - "oxlint": "^1.61.0", - "oxlint-config-j4k": "^2.3.0", - "oxlint-tsgolint": "^0.22.0", + "oxfmt": "^0.57.0", + "oxlint": "^1.72.0", + "oxlint-tsgolint": "^0.23.0", "semantic-release": "^25.0.3", "vitest": "^4.1.5" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7f92ba6..59560fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -27,6 +27,9 @@ importers: specifier: ^4.3.6 version: 4.3.6 devDependencies: + '@j4k/oxlint-config': + specifier: ^2.11.0 + version: 2.11.0 '@total-typescript/ts-reset': specifier: ^0.6.1 version: 0.6.1 @@ -49,17 +52,14 @@ importers: specifier: ^6.6.3 version: 6.6.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) oxfmt: - specifier: ^0.46.0 - version: 0.46.0 + specifier: ^0.57.0 + version: 0.57.0 oxlint: - specifier: ^1.61.0 - version: 1.61.0(oxlint-tsgolint@0.22.0) - oxlint-config-j4k: - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^1.72.0 + version: 1.73.0(oxlint-tsgolint@0.23.0) oxlint-tsgolint: - specifier: ^0.22.0 - version: 0.22.0 + specifier: ^0.23.0 + version: 0.23.0 semantic-release: specifier: ^25.0.3 version: 25.0.3(typescript@6.0.2) @@ -280,6 +280,9 @@ packages: cpu: [x64] os: [win32] + '@j4k/oxlint-config@2.11.0': + resolution: {integrity: sha512-dmpGo73YMo/GhN44BymIsuj07NbsNoTM7O44NyjtgnuILfQL/L0j+R1RJOSozNShAvk6o/SpOWUHHb8iBUUipw==, tarball: https://code.j4k.dev/api/packages/j4k/npm/%40j4k%2Foxlint-config/-/2.11.0/oxlint-config-2.11.0.tgz} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -594,276 +597,276 @@ packages: cpu: [x64] os: [win32] - '@oxfmt/binding-android-arm-eabi@0.46.0': - resolution: {integrity: sha512-b1doV4WRcJU+BESSlCvCjV+5CEr/T6h0frArAdV26Nir+gGNFNaylvDiiMPfF1pxeV0txZEs38ojzJaxBYg+ng==} + '@oxfmt/binding-android-arm-eabi@0.57.0': + resolution: {integrity: sha512-qVBsEO+KugOsCmUHcO8iqNnqc65p7PCKpCs8M66mPZ+Ri+CWbcpoQOEJBg2OTu03+0qu++NK1jj6IzvQVs0Sig==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.46.0': - resolution: {integrity: sha512-v6+HhjsoV3GO0u2u9jLSAZrvWfTraDxKofUIQ7/ktS7tzS+epVsxdHmeM+XxuNcAY/nWxxU1Sg4JcGTNRXraBA==} + '@oxfmt/binding-android-arm64@0.57.0': + resolution: {integrity: sha512-mp6PibWbao3aizijcheOeHQaYEhcUAt8pwLniYbtLfHxL/psFF0BykAwCj+s3c6qIpa8yN8keZICWrqtZ70w8g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.46.0': - resolution: {integrity: sha512-3eeooJGrqGIlI5MyryDZsAcKXSmKIgAD4yYtfRrRJzXZ0UTFZtiSveIur56YPrGMYZwT4XyVhHsMqrNwr1XeFA==} + '@oxfmt/binding-darwin-arm64@0.57.0': + resolution: {integrity: sha512-T+0stuCBqmUVY+aMIvrgXhzGhHO3sD5tNiiEcYqgSdPsnukskQqn2u5qOVD0sv1l7RLdFS5Z/f5Wi9Ktyjr3Eg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.46.0': - resolution: {integrity: sha512-QG8BDM0CXWbu84k2SKmCqfEddPQPFiBicwtYnLqHRWZZl57HbtOLRMac/KTq2NO4AEc4ICCBpFxJIV9zcqYfkQ==} + '@oxfmt/binding-darwin-x64@0.57.0': + resolution: {integrity: sha512-O+3JbqWs/mCI2oi4xfhRO2IVPFJNDDEBV8Odo+ZpmsUOeKJfjXoNH7nDmBEQcDgK7NfjDIyE7kRgYSZcTLDO0A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.46.0': - resolution: {integrity: sha512-9DdCqS/n2ncu/Chazvt3cpgAjAmIGQDz7hFKSrNItMApyV/Ja9mz3hD4JakIE3nS8PW9smEbPWnb389QLBY4nw==} + '@oxfmt/binding-freebsd-x64@0.57.0': + resolution: {integrity: sha512-pxwhxVC+JkLX9twOQ/8C/vbuOQcMZyKIDmiRDZfO7yITuVcIdZCiLRqqf4QOxb2+8FWrRXzQpm+1DBKcMpHSSQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.46.0': - resolution: {integrity: sha512-Dgs7VeE2jT0LHMhw6tPEt0xQYe54kBqHEovmWsv4FVQlegCOvlIJNx0S8n4vj8WUtpT+Z6BD2HhKJPLglLxvZg==} + '@oxfmt/binding-linux-arm-gnueabihf@0.57.0': + resolution: {integrity: sha512-pxBU4zH2imB/MDBfth2rOMeVxXUMjRQLCazagwLARIFH3hVlxZJBlM4nSnHXaIHJK4/qezoFCIORN6AY8Mra4A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.46.0': - resolution: {integrity: sha512-Zxn3adhTH13JKnU4xXJj8FeEfF680XjXh3gSShKl57HCMBRde2tUJTgogV/1MSHA80PJEVrDa7r66TLVq3Ia7Q==} + '@oxfmt/binding-linux-arm-musleabihf@0.57.0': + resolution: {integrity: sha512-JAprOzt8tycYou36ZgEw14DlRHTiN8qdtKANdV3VZIRIvTI/lh/cX13c9pJ/EnDk2GT3FASH7KvCgQ2AufAifQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.46.0': - resolution: {integrity: sha512-+TWipjrgVM8D7aIdDD0tlr3teLTTvQTn7QTE5BpT10H1Fj82gfdn9X6nn2sDgx/MepuSCfSnzFNJq2paLL0OiA==} + '@oxfmt/binding-linux-arm64-gnu@0.57.0': + resolution: {integrity: sha512-ajtjaxSaj9xl4BW7REt+Cef/ttzbAq00Bq4z7JUDZEfgFXdwSjH8K9bF+IcIJzZB9lKqMfQ4eHuSFOvvlvtqOg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.46.0': - resolution: {integrity: sha512-aAUPBWJ1lGwwnxZUEDLJ94+Iy6MuwJwPxUgO4sCA5mEEyDk7b+cDQ+JpX1VR150Zoyd+D49gsrUzpUK5h587Eg==} + '@oxfmt/binding-linux-arm64-musl@0.57.0': + resolution: {integrity: sha512-p4Y/+RYk9Bk5WO+zHSUXAClRmZ2fbJCejMuCAsU2HhyME4jqf6Ftt/mJYEwIah1wGCBDYOB7wEGV1x5bCEZ6hA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.46.0': - resolution: {integrity: sha512-ufBCJukyFX/UDrokP/r6BGDoTInnsDs7bxyzKAgMiZlt2Qu8GPJSJ6Zm6whIiJzKk0naxA8ilwmbO1LMw6Htxw==} + '@oxfmt/binding-linux-ppc64-gnu@0.57.0': + resolution: {integrity: sha512-By6tRALAZsno0F4zedmtG+wdMvJiJmJoXM4d3+A9zHE4HRXLqXITwRH8mgrlcXc5yJM2g2W3riRPwTYdgemZLQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.46.0': - resolution: {integrity: sha512-eqtlC2YmPqjun76R1gVfGLuKWx7NuEnLEAudZ7n6ipSKbCZTqIKSs1b5Y8K/JHZsRpLkeSmAAjig5HOIg8fQzQ==} + '@oxfmt/binding-linux-riscv64-gnu@0.57.0': + resolution: {integrity: sha512-skYeG+RgvyzspqVEBsEprL90OYYZfoVNqB3HcCNR6QDJyXKOzfDRT3zncnHmUaFluIlBHuY23mU1b5WGgR98hA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.46.0': - resolution: {integrity: sha512-yccVOO2nMXkQLGgy0He3EQEwKD7NF0zEk+/OWmroznkqXyJdN6bfK0LtNnr6/14Bh3FjpYq7bP33l/VloCnxpA==} + '@oxfmt/binding-linux-riscv64-musl@0.57.0': + resolution: {integrity: sha512-FFgACrZOXAXUh5KQh2mt1CDOVOZmn+QzHP71wM9QobNwyQvoFfyAeefVUltW83g3sm7LTiH3yfFqLLVUpA5ZFQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.46.0': - resolution: {integrity: sha512-aAf7fG23OQCey6VRPj9IeCraoYtpgtx0ZyJ1CXkPyT1wjzBE7c3xtuxHe/AdHaJfVVb/SXpSk8Gl1LzyQupSqw==} + '@oxfmt/binding-linux-s390x-gnu@0.57.0': + resolution: {integrity: sha512-Nm/BAOfQeFiiKd502mZn/GAVKJwtd0RdCg17G3Wz/WSOIQmDi3+7/SZH4BHn1Ye5KvTVH3ua8WvfwLLycNIuvA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.46.0': - resolution: {integrity: sha512-q0JPsTMyJNjYrBvYFDz4WbVsafNZaPCZv4RnFypRotLqpKROtBZcEaXQW4eb9YmvLU3NckVemLJnzkSZSdmOxw==} + '@oxfmt/binding-linux-x64-gnu@0.57.0': + resolution: {integrity: sha512-BiSy5Ku3mQqyxS6YIqAJgd403wEUWvI7kerfzPxc2l/txZVmZM0pSj7oDM+4bGBExowxOi7o73jEam1W0EDTZg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.46.0': - resolution: {integrity: sha512-7LsLY9Cw57GPkhSR+duI3mt9baRczK/DtHYSldQ4BEU92da9igBQNl4z7Vq5U9NNPsh1FmpKvv1q9WDtiUQR1A==} + '@oxfmt/binding-linux-x64-musl@0.57.0': + resolution: {integrity: sha512-BCRkJiotz5s9afLYD2LuMvzAoDYx9H17E/YbDyu4xK7l4zHDPeny9ErSXL//i/nJyaOwRk08x4b8cgJC00+JDg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.46.0': - resolution: {integrity: sha512-lHiBOz8Duaku7JtRNLlps3j++eOaICPZSd8FCVmTDM4DFOPT71Bjn7g6iar1z7StXlKRweUKxWUs4sA+zWGDXg==} + '@oxfmt/binding-openharmony-arm64@0.57.0': + resolution: {integrity: sha512-4Oaxe1qrGgXfpCJ1C/ERJ2iCtV2rN1R79ga9fsfyVHfSQRu/hVW780u2KDqZWFZ/iGTHODJji0JemxqFZ63eIQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.46.0': - resolution: {integrity: sha512-/5ktYUliP89RhgC37DBH1x20U5zPSZMy3cMEcO0j3793rbHP9MWsknBwQB6eozRzWmYrh0IFM/p20EbPvDlYlg==} + '@oxfmt/binding-win32-arm64-msvc@0.57.0': + resolution: {integrity: sha512-MYLAsDnhdNsSGheLYhWgbk0vfIrlS84iQYun/y21fX6u0jj8iBtYtbpZMdiqYeuf8U12eVPUjVY2xE2NrCfJ0g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.46.0': - resolution: {integrity: sha512-3WTnoiuIr8XvV0DIY7SN+1uJSwKf4sPpcbHfobcRT9JutGcLaef/miyBB87jxd3aqH+mS0+G5lsgHuXLUwjjpQ==} + '@oxfmt/binding-win32-ia32-msvc@0.57.0': + resolution: {integrity: sha512-PBwdzZALJY/jcCx2E6is0yu+cuVXeySTDmwuseD+9j0mHqlRNxwlKgsyRTBed/woPeqfVfuXfWjoq4Cx2Zt3Eg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.46.0': - resolution: {integrity: sha512-IXxiQpkYnOwNfP23vzwSfhdpxJzyiPTY7eTn6dn3DsriKddESzM8i6kfq9R7CD/PUJwCvQT22NgtygBeug3KoA==} + '@oxfmt/binding-win32-x64-msvc@0.57.0': + resolution: {integrity: sha512-bQJdH9i4RRfw55jm7+8/xS7GzHLLTbHx4huhrrDxQJaJtbSDbsyOnODvP1ftT7EG0KFKAYO2S+q6AcioXODx8w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] - '@oxlint-tsgolint/darwin-arm64@0.22.0': - resolution: {integrity: sha512-/exgXceakHbQrzaHTtKOe7MuDATaWMCCWpsCDQCZKeYhLGXzComipTrCYnHzAXrdnNBb5r5K+RRf5A6ormrhMA==} + '@oxlint-tsgolint/darwin-arm64@0.23.0': + resolution: {integrity: sha512-gOs9PVr2wEg4ox9z0aJo+RKhhImW86YL5N6yav8BK/rgPsIrwN/igSZ+pbRr723NFvUNKde9fgMhRA6JrXAOZw==} cpu: [arm64] os: [darwin] - '@oxlint-tsgolint/darwin-x64@0.22.0': - resolution: {integrity: sha512-xFGdIahlmUbK+/MpZ5y08D0ewMGLDbd2Vki5wxVFYg50lSrtgPAtdDl+kqKZLNaFu0zpMar8n9wv1le05sL/jw==} + '@oxlint-tsgolint/darwin-x64@0.23.0': + resolution: {integrity: sha512-kjJ8B+7n4tB9VJdxS5A9GdJt6/bYpzbu4lXp2uO1S3sRmCB5gDEABlGoiePNApRWaW+xqL4b4xgiE727jSLhuA==} cpu: [x64] os: [darwin] - '@oxlint-tsgolint/linux-arm64@0.22.0': - resolution: {integrity: sha512-53RvC9f77eUo+V1dfQNwGVnsIfPJFMibRR0ee128EUpYNDOZe/ojmCfuXJeU7cY91V7r7fZSm42KPJocXUX8og==} + '@oxlint-tsgolint/linux-arm64@0.23.0': + resolution: {integrity: sha512-6dCZuKNu135seMXilkRk9SpCx6i1XgmiipYGalLij5WVRX6ZYS8c4xI7preN/zv9fCXhsQclTIMDu2Y/cytTjw==} cpu: [arm64] os: [linux] - '@oxlint-tsgolint/linux-x64@0.22.0': - resolution: {integrity: sha512-evZcJAZ9hjNyuN69RnXwbt+U2pAOcYt+yvqukgugiCkRm4iBZ0R0CvpY1tgfG2XcGUhEPh8dljO+nPZTEVGpCQ==} + '@oxlint-tsgolint/linux-x64@0.23.0': + resolution: {integrity: sha512-3bdilnyA7kmSTjK27rvjIjSxL5SIg3wt7vwNiRkouWB83ytssyKnuGvxSYJxgMEmFpSutzaBzcCUM2jDtPGcgA==} cpu: [x64] os: [linux] - '@oxlint-tsgolint/win32-arm64@0.22.0': - resolution: {integrity: sha512-7jTO+k1mr5BxRAI2fxc1NRcE3MAbHNZ0Vef9SD1yAR6d1E6qEv5D/D7yuHpQpw6AO3qoecSVo2Jzr+JirN61+w==} + '@oxlint-tsgolint/win32-arm64@0.23.0': + resolution: {integrity: sha512-j+OEp44SVYiQ+ZD+uttsX7u6L9SvmbbQ77SO1pSFCcJlsVMeCk8qZsjhKfGKuT/jIA+ipOJMVs/+pqUfObBWNw==} cpu: [arm64] os: [win32] - '@oxlint-tsgolint/win32-x64@0.22.0': - resolution: {integrity: sha512-7lbl9XFcqO+scsynxMzTQdl0XUe6sBUCyY/oGWvCB+JmV4U+70vzSyZJdTEzzxtkZiNnUVFFh9RJLmoiQSne+w==} + '@oxlint-tsgolint/win32-x64@0.23.0': + resolution: {integrity: sha512-5MyjFuqf+g8OUPJBSGWHJtmoWnzFJYyOg4To9WMQshZYEWig/vtu7JtJ03VWnzHv9LJkAUeApY0gVCOywFR/iQ==} cpu: [x64] os: [win32] - '@oxlint/binding-android-arm-eabi@1.61.0': - resolution: {integrity: sha512-6eZBPgiigK5txqoVgRqxbaxiom4lM8AP8CyKPPvpzKnQ3iFRFOIDc+0AapF+qsUSwjOzr5SGk4SxQDpQhkSJMQ==} + '@oxlint/binding-android-arm-eabi@1.73.0': + resolution: {integrity: sha512-HZQRN/UMBu+Ut+/9MiAChkbP4qZqrNOWBcNI45vOT40GVhbGR0JgHB87L48D4iAqFQIdVmeQYtV9RF89AjTKkg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxlint/binding-android-arm64@1.61.0': - resolution: {integrity: sha512-CkwLR69MUnyv5wjzebvbbtTSUwqLxM35CXE79bHqDIK+NtKmPEUpStTcLQRZMCo4MP0qRT6TXIQVpK0ZVScnMA==} + '@oxlint/binding-android-arm64@1.73.0': + resolution: {integrity: sha512-Gp+KJRylv2aW7thRpG5p1KTxZq4ZJFbWowrKzufNq9d3ssl3r3JviYV45/+p+7CN1Nv0zDd1e8Ex0b/HUDq4TQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxlint/binding-darwin-arm64@1.61.0': - resolution: {integrity: sha512-8JbefTkbmvqkqWjmQrHke+MdpgT2UghhD/ktM4FOQSpGeCgbMToJEKdl9zwhr/YWTl92i4QI1KiTwVExpcUN8A==} + '@oxlint/binding-darwin-arm64@1.73.0': + resolution: {integrity: sha512-3de96NdtXhxERMjIz7wsp2HYMY6pMQycGxFWac2mFecAx6VeARF/IqFb1QIaqiCRIdfzBwzTed+pCTCoiS+CYA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxlint/binding-darwin-x64@1.61.0': - resolution: {integrity: sha512-uWpoxDT47hTnDLcdEh5jVbso8rlTTu5o0zuqa9J8E0JAKmIWn7kGFEIB03Pycn2hd2vKxybPGLhjURy/9We5FQ==} + '@oxlint/binding-darwin-x64@1.73.0': + resolution: {integrity: sha512-5zx/uPW32TiaOeVY1dQ/H5iOf0K1HOdFKOJhLqGl4o63+i1fpzoqqu/mKtd7OFgFjNCdhlyTGgjVkQTZm1ELcg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxlint/binding-freebsd-x64@1.61.0': - resolution: {integrity: sha512-K/o4hEyW7flfMel0iBVznmMBt7VIMHGdjADocHKpK1DUF9erpWnJ+BSSWd2W0c8K3mPtpph+CuHzRU6CI3l9jQ==} + '@oxlint/binding-freebsd-x64@1.73.0': + resolution: {integrity: sha512-qNe4gKHaGnLuZJ8toUg90JAa0S2vTVvDw+0bRi3q1avXZXDT4u5mMeECf3nD4HYrbdn1O7dXqWut4onY/yx/Xg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxlint/binding-linux-arm-gnueabihf@1.61.0': - resolution: {integrity: sha512-P6040ZkcyweJ0Po9yEFqJCdvZnf3VNCGs1SIHgXDf8AAQNC6ID/heXQs9iSgo2FH7gKaKq32VWc59XZwL34C5Q==} + '@oxlint/binding-linux-arm-gnueabihf@1.73.0': + resolution: {integrity: sha512-cCehYh5hTbfShm/fxTD6wwrGUWIpvX+N5OxmAMhFhDeTGXvw+BeNj889tpxsFQ9ZLatQ6wImuY8tsKLZ+FMz7w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm-musleabihf@1.61.0': - resolution: {integrity: sha512-bwxrGCzTZkuB+THv2TQ1aTkVEfv5oz8sl+0XZZCpoYzErJD8OhPQOTA0ENPd1zJz8QsVdSzSrS2umKtPq4/JXg==} + '@oxlint/binding-linux-arm-musleabihf@1.73.0': + resolution: {integrity: sha512-d5j5GDU/2dMgjVhw7TQT9ITrsIr1Y02KEXKyVGIXUkD+KiaxE9TP65FS2ZdgTBemQvoRL+gSBdbrIm3cQIeacg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxlint/binding-linux-arm64-gnu@1.61.0': - resolution: {integrity: sha512-vkhb9/wKguMkLlrm3FoJW/Xmdv31GgYAE+x8lxxQ+7HeOxXUySI0q36a3NTVIuQUdLzxCI1zzMGsk1o37FOe3w==} + '@oxlint/binding-linux-arm64-gnu@1.73.0': + resolution: {integrity: sha512-Eyf1SrP3+yR1DI3OJgOY2Pvrr9dWP9TK37xPaDYycwTtlGlI45erJAVIfH5/m/xosDt6BupJYEFi47bvbTuuyw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-arm64-musl@1.61.0': - resolution: {integrity: sha512-bl1dQh8LnVqsj6oOQAcxwbuOmNJkwc4p6o//HTBZhNTzJy21TLDwAviMqUFNUxDHkPGpmdKTSN4tWTjLryP8xg==} + '@oxlint/binding-linux-arm64-musl@1.73.0': + resolution: {integrity: sha512-IlT/OJApEDKaMmCooHuncgJZbbCe7T5QIWmTZBEtYscWvzPQuuEinVcid6kwQRVQOUdb7PUCz4jQHnaYXdfJXw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxlint/binding-linux-ppc64-gnu@1.61.0': - resolution: {integrity: sha512-QoOX6KB2IiEpyOj/HKqaxi+NQHPnOgNgnr22n9N4ANJCzXkUlj1UmeAbFb4PpqdlHIzvGDM5xZ0OKtcLq9RhiQ==} + '@oxlint/binding-linux-ppc64-gnu@1.73.0': + resolution: {integrity: sha512-L+JYcb/vdg5fmcH08V6o0YYLU28cTH1SPNulwJdvK9NK49aXSkYy6oNpKBmddArVOXYqNepriDGiZ04G54kh1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-gnu@1.61.0': - resolution: {integrity: sha512-1TGcTerjY6p152wCof3oKElccq3xHljS/Mucp04gV/4ATpP6nO7YNnp7opEg6SHkv2a57/b4b8Ndm9znJ1/qAw==} + '@oxlint/binding-linux-riscv64-gnu@1.73.0': + resolution: {integrity: sha512-Qtk0g3bKV6OwWjIm7R8kQN1uOZRKQt/MODK2a8QfkwhTpXBD53ozx5XLVWLGDQAVyp2otLW4D2wB98XfAfMPGA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-riscv64-musl@1.61.0': - resolution: {integrity: sha512-65wXEmZIrX2ADwC8i/qFL4EWLSbeuBpAm3suuX1vu4IQkKd+wLT/HU/BOl84kp91u2SxPkPDyQgu4yrqp8vwVA==} + '@oxlint/binding-linux-riscv64-musl@1.73.0': + resolution: {integrity: sha512-wX0NQKZVxltkAOVmzFcpOaMpdaUvsq1Eqpx9tkAfl71UdkTlSo1R4AdAnGccR1Fm2+TzFgZ22CyyGuZ41RDr/A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxlint/binding-linux-s390x-gnu@1.61.0': - resolution: {integrity: sha512-TVvhgMvor7Qa6COeXxCJ7ENOM+lcAOGsQ0iUdPSCv2hxb9qSHLQ4XF1h50S6RE1gBOJ0WV3rNukg4JJJP1LWRA==} + '@oxlint/binding-linux-s390x-gnu@1.73.0': + resolution: {integrity: sha512-vPe7UGBMWyiLTtnqS4xxgMQFSFGmtQwhwCxuiw6lXygaO6bVt0D8dFVg8Xv05eaiN3ybC0HXXHUAohFMFvqoCQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-gnu@1.61.0': - resolution: {integrity: sha512-SjpS5uYuFoDnDdZPwZE59ndF95AsY47R5MliuneTWR1pDm2CxGJaYXbKULI71t5TVfLQUWmrHEGRL9xvuq6dnA==} + '@oxlint/binding-linux-x64-gnu@1.73.0': + resolution: {integrity: sha512-2CwIWr9cemFC/CbRBWZvuk5mffz6ObmfFkfcC/9rTQ7f+icNhYr2kOjf9Rt8lLvugvkdGDOmkoVoFFHh6ClCTw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxlint/binding-linux-x64-musl@1.61.0': - resolution: {integrity: sha512-gGfAeGD4sNJGILZbc/yKcIimO9wQnPMoYp9swAaKeEtwsSQAbU+rsdQze5SBtIP6j0QDzeYd4XSSUCRCF+LIeQ==} + '@oxlint/binding-linux-x64-musl@1.73.0': + resolution: {integrity: sha512-nDadfJgg7NBBxG0N560wOe7LLX5QiYp6qBaI7viuk5EUORFBktU/NfV0MbTqU3gTqQDCh4VyxKdo5VADxk9w8Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxlint/binding-openharmony-arm64@1.61.0': - resolution: {integrity: sha512-OlVT0LrG/ct33EVtWRyR+B/othwmDWeRxfi13wUdPeb3lAT5TgTcFDcfLfarZtzB4W1nWF/zICMgYdkggX2WmQ==} + '@oxlint/binding-openharmony-arm64@1.73.0': + resolution: {integrity: sha512-wGjJC+NLH9xP+IKGn9RDW94ojJR/wPbg5WCnQjj/oReaOtCQthr8ws1zICe77JFmo4ouUdeTHHZL/ESGiF6Pmw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxlint/binding-win32-arm64-msvc@1.61.0': - resolution: {integrity: sha512-vI//NZPJk6DToiovPtaiwD4iQ7kO1r5ReWQD0sOOyKRtP3E2f6jxin4uvwi3OvDzHA2EFfd7DcZl5dtkQh7g1w==} + '@oxlint/binding-win32-arm64-msvc@1.73.0': + resolution: {integrity: sha512-I7X47GPGljw225YUQ5SbC/rb1Kkdrd0yQf0x+hYxeKS6DpfjMbo9ccQPQ6LNY6BoJQ1sHhgDUGuMn5Vg5gHT6w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxlint/binding-win32-ia32-msvc@1.61.0': - resolution: {integrity: sha512-0ySj4/4zd2XjePs3XAQq7IigIstN4LPQZgCyigX5/ERMLjdWAJfnxcTsrtxZxuij8guJW8foXuHmhGxW0H4dDA==} + '@oxlint/binding-win32-ia32-msvc@1.73.0': + resolution: {integrity: sha512-5lWj+3h+74Fm1jYOO9qkJA4xkAlZA099DkXppuXsk7UpnpZLttsefrZU469vChGaG6hcSqrkKXQOvMTZtbjeNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxlint/binding-win32-x64-msvc@1.61.0': - resolution: {integrity: sha512-0xgSiyeqDLDZxXoe9CVJrOx3TUVsfyoOY7cNi03JbItNcC9WCZqrSNdrAbHONxhSPaVh/lzfnDcON1RqSUMhHw==} + '@oxlint/binding-win32-x64-msvc@1.73.0': + resolution: {integrity: sha512-WaNRvh4f6zY9CvUQk2YoA1O90ieWrIklI84+HXFr9Isjz9CSESrdqo/RtIYt4Dll/cAchqGDMehfaZd0vqEFZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -880,141 +883,141 @@ packages: resolution: {integrity: sha512-h104Kh26rR8tm+a3Qkc5S4VLYint3FE48as7+/5oCEcKR2idC/pF1G6AhIXKI+eHPJa/3J9i5z0Al47IeGHPkA==} engines: {node: '>=12'} - '@rollup/rollup-android-arm-eabi@4.60.1': - resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==} + '@rollup/rollup-android-arm-eabi@4.62.2': + resolution: {integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.60.1': - resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==} + '@rollup/rollup-android-arm64@4.62.2': + resolution: {integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.60.1': - resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==} + '@rollup/rollup-darwin-arm64@4.62.2': + resolution: {integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.60.1': - resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==} + '@rollup/rollup-darwin-x64@4.62.2': + resolution: {integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.60.1': - resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==} + '@rollup/rollup-freebsd-arm64@4.62.2': + resolution: {integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.60.1': - resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==} + '@rollup/rollup-freebsd-x64@4.62.2': + resolution: {integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': - resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==} + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': + resolution: {integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==} cpu: [arm] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm-musleabihf@4.60.1': - resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==} + '@rollup/rollup-linux-arm-musleabihf@4.62.2': + resolution: {integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==} cpu: [arm] os: [linux] libc: [musl] - '@rollup/rollup-linux-arm64-gnu@4.60.1': - resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==} + '@rollup/rollup-linux-arm64-gnu@4.62.2': + resolution: {integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==} cpu: [arm64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-arm64-musl@4.60.1': - resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==} + '@rollup/rollup-linux-arm64-musl@4.62.2': + resolution: {integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==} cpu: [arm64] os: [linux] libc: [musl] - '@rollup/rollup-linux-loong64-gnu@4.60.1': - resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==} + '@rollup/rollup-linux-loong64-gnu@4.62.2': + resolution: {integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==} cpu: [loong64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-loong64-musl@4.60.1': - resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==} + '@rollup/rollup-linux-loong64-musl@4.62.2': + resolution: {integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==} cpu: [loong64] os: [linux] libc: [musl] - '@rollup/rollup-linux-ppc64-gnu@4.60.1': - resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==} + '@rollup/rollup-linux-ppc64-gnu@4.62.2': + resolution: {integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==} cpu: [ppc64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-ppc64-musl@4.60.1': - resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==} + '@rollup/rollup-linux-ppc64-musl@4.62.2': + resolution: {integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==} cpu: [ppc64] os: [linux] libc: [musl] - '@rollup/rollup-linux-riscv64-gnu@4.60.1': - resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==} + '@rollup/rollup-linux-riscv64-gnu@4.62.2': + resolution: {integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==} cpu: [riscv64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-riscv64-musl@4.60.1': - resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==} + '@rollup/rollup-linux-riscv64-musl@4.62.2': + resolution: {integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==} cpu: [riscv64] os: [linux] libc: [musl] - '@rollup/rollup-linux-s390x-gnu@4.60.1': - resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==} + '@rollup/rollup-linux-s390x-gnu@4.62.2': + resolution: {integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==} cpu: [s390x] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-gnu@4.60.1': - resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==} + '@rollup/rollup-linux-x64-gnu@4.62.2': + resolution: {integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==} cpu: [x64] os: [linux] libc: [glibc] - '@rollup/rollup-linux-x64-musl@4.60.1': - resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==} + '@rollup/rollup-linux-x64-musl@4.62.2': + resolution: {integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==} cpu: [x64] os: [linux] libc: [musl] - '@rollup/rollup-openbsd-x64@4.60.1': - resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==} + '@rollup/rollup-openbsd-x64@4.62.2': + resolution: {integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==} cpu: [x64] os: [openbsd] - '@rollup/rollup-openharmony-arm64@4.60.1': - resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==} + '@rollup/rollup-openharmony-arm64@4.62.2': + resolution: {integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.60.1': - resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==} + '@rollup/rollup-win32-arm64-msvc@4.62.2': + resolution: {integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.60.1': - resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==} + '@rollup/rollup-win32-ia32-msvc@4.62.2': + resolution: {integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.60.1': - resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==} + '@rollup/rollup-win32-x64-gnu@4.62.2': + resolution: {integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.60.1': - resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==} + '@rollup/rollup-win32-x64-msvc@4.62.2': + resolution: {integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==} cpu: [x64] os: [win32] @@ -1076,8 +1079,8 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/estree@1.0.9': + resolution: {integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==} '@types/node@25.6.0': resolution: {integrity: sha512-+qIYRKdNYJwY3vRCZMdJbPLJAtGjQBudzZzdzwQYkEPQd+PJGixUL5QfvCLDaULoLv+RhT3LDkwEfKaAkgSmNQ==} @@ -1868,8 +1871,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + nanoid@3.3.15: + resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -1992,28 +1995,35 @@ packages: oxc-resolver@11.19.1: resolution: {integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==} - oxfmt@0.46.0: - resolution: {integrity: sha512-CopwJOwPAjZ9p76fCvz+mSOJTw9/NY3cSksZK3VO/bUQ8UoEcketNgUuYS0UB3p+R9XnXe7wGGXUmyFxc7QxJA==} + oxfmt@0.57.0: + resolution: {integrity: sha512-ZB7Bi+rGDSqmVIo9jwcLyFgjxXvQhDdU+jx+ZrVy6VRiVXK2+CHc4hO3J4dUQjHe7V0ymHB+MDuv5z+NhK07HA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + peerDependencies: + svelte: ^5.0.0 + vite-plus: '*' + peerDependenciesMeta: + svelte: + optional: true + vite-plus: + optional: true - oxlint-config-j4k@2.3.0: - resolution: {integrity: sha512-v9BP28NdbYNh/++bZDbb9XtoeT6FFlYh7wSjkT7yLgIN2bSF77BGH4qgSLE5x6zuGl5vRfBmUnhlDnZJxcyRBw==} - engines: {node: '>=22.19.0'} - - oxlint-tsgolint@0.22.0: - resolution: {integrity: sha512-ku4MecLmCQIj1ScCtzNAqTuyl0BJQ02B36fJT+c5XQihHpYSFak+FC3GYO5fPyYk4oDwi0w0S7hTvrpNzuZhig==} + oxlint-tsgolint@0.23.0: + resolution: {integrity: sha512-3mBv3CoPbh8dFbzfDGIWa2ytZjn2v+3EX4aKRXjIhsoGFzG8GCjfRirz3rwZf1wYbZzsNLTSgpw8VjQuWdp/jA==} hasBin: true - oxlint@1.61.0: - resolution: {integrity: sha512-ZC0ALuhDZ6ivOFG+sy0D0pEDN49EvsId98zVlmYdkcXHsEM14m/qTNUEsUpiFiCVbpIxYtVBmmLE87nsbUHohQ==} + oxlint@1.73.0: + resolution: {integrity: sha512-u91G9TJzU6yqKWNZUYprQB07W7YvntZXaRxQ6CkoytepYhLWUXWsr1M8zUJ34VatNPuUAr3Z8GH+O2A331CluQ==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - oxlint-tsgolint: '>=0.18.0' + oxlint-tsgolint: '>=0.24.0' + vite-plus: '*' peerDependenciesMeta: oxlint-tsgolint: optional: true + vite-plus: + optional: true p-each-series@3.0.0: resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} @@ -2110,8 +2120,8 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.4: - resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + picomatch@4.0.5: + resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==} engines: {node: '>=12'} pify@3.0.0: @@ -2122,8 +2132,8 @@ packages: resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} engines: {node: '>=4'} - postcss@8.5.10: - resolution: {integrity: sha512-pMMHxBOZKFU6HgAZ4eyGnwXF/EvPGGqUr0MnZ5+99485wwW41kW91A4LOGxSHhgugZmSChL5AlElNdwlNgcnLQ==} + postcss@8.5.16: + resolution: {integrity: sha512-vuwillviilfKZsg0VGj5R/YwwcHx4SLsIOI/7K6mQkWx+l5cUHTjj5g0AasTBcyXsbfTgrwsUNmVUb5xVwyPwg==} engines: {node: ^10 || ^12 || >=14} pretty-ms@9.3.0: @@ -2189,8 +2199,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.60.1: - resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==} + rollup@4.62.2: + resolution: {integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2374,8 +2384,8 @@ packages: resolution: {integrity: sha512-VKS/ZaQhhkKFMANmAOhhXVoIfBXblQxGX1myCQ2faQrfmobMftXeJPcZGp0gS07ocvGJWDLZGyOZDadDBqYIJg==} engines: {node: '>=18'} - tinyglobby@0.2.16: - resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + tinyglobby@0.2.17: + resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==} engines: {node: '>=12.0.0'} tinypool@2.1.0: @@ -2771,6 +2781,8 @@ snapshots: '@esbuild/win32-x64@0.27.7': optional: true + '@j4k/oxlint-config@2.11.0': {} + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/sourcemap-codec@1.5.5': {} @@ -2990,136 +3002,136 @@ snapshots: '@oxc-resolver/binding-win32-x64-msvc@11.19.1': optional: true - '@oxfmt/binding-android-arm-eabi@0.46.0': + '@oxfmt/binding-android-arm-eabi@0.57.0': optional: true - '@oxfmt/binding-android-arm64@0.46.0': + '@oxfmt/binding-android-arm64@0.57.0': optional: true - '@oxfmt/binding-darwin-arm64@0.46.0': + '@oxfmt/binding-darwin-arm64@0.57.0': optional: true - '@oxfmt/binding-darwin-x64@0.46.0': + '@oxfmt/binding-darwin-x64@0.57.0': optional: true - '@oxfmt/binding-freebsd-x64@0.46.0': + '@oxfmt/binding-freebsd-x64@0.57.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.46.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.57.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.46.0': + '@oxfmt/binding-linux-arm-musleabihf@0.57.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.46.0': + '@oxfmt/binding-linux-arm64-gnu@0.57.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.46.0': + '@oxfmt/binding-linux-arm64-musl@0.57.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.46.0': + '@oxfmt/binding-linux-ppc64-gnu@0.57.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.46.0': + '@oxfmt/binding-linux-riscv64-gnu@0.57.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.46.0': + '@oxfmt/binding-linux-riscv64-musl@0.57.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.46.0': + '@oxfmt/binding-linux-s390x-gnu@0.57.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.46.0': + '@oxfmt/binding-linux-x64-gnu@0.57.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.46.0': + '@oxfmt/binding-linux-x64-musl@0.57.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.46.0': + '@oxfmt/binding-openharmony-arm64@0.57.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.46.0': + '@oxfmt/binding-win32-arm64-msvc@0.57.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.46.0': + '@oxfmt/binding-win32-ia32-msvc@0.57.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.46.0': + '@oxfmt/binding-win32-x64-msvc@0.57.0': optional: true - '@oxlint-tsgolint/darwin-arm64@0.22.0': + '@oxlint-tsgolint/darwin-arm64@0.23.0': optional: true - '@oxlint-tsgolint/darwin-x64@0.22.0': + '@oxlint-tsgolint/darwin-x64@0.23.0': optional: true - '@oxlint-tsgolint/linux-arm64@0.22.0': + '@oxlint-tsgolint/linux-arm64@0.23.0': optional: true - '@oxlint-tsgolint/linux-x64@0.22.0': + '@oxlint-tsgolint/linux-x64@0.23.0': optional: true - '@oxlint-tsgolint/win32-arm64@0.22.0': + '@oxlint-tsgolint/win32-arm64@0.23.0': optional: true - '@oxlint-tsgolint/win32-x64@0.22.0': + '@oxlint-tsgolint/win32-x64@0.23.0': optional: true - '@oxlint/binding-android-arm-eabi@1.61.0': + '@oxlint/binding-android-arm-eabi@1.73.0': optional: true - '@oxlint/binding-android-arm64@1.61.0': + '@oxlint/binding-android-arm64@1.73.0': optional: true - '@oxlint/binding-darwin-arm64@1.61.0': + '@oxlint/binding-darwin-arm64@1.73.0': optional: true - '@oxlint/binding-darwin-x64@1.61.0': + '@oxlint/binding-darwin-x64@1.73.0': optional: true - '@oxlint/binding-freebsd-x64@1.61.0': + '@oxlint/binding-freebsd-x64@1.73.0': optional: true - '@oxlint/binding-linux-arm-gnueabihf@1.61.0': + '@oxlint/binding-linux-arm-gnueabihf@1.73.0': optional: true - '@oxlint/binding-linux-arm-musleabihf@1.61.0': + '@oxlint/binding-linux-arm-musleabihf@1.73.0': optional: true - '@oxlint/binding-linux-arm64-gnu@1.61.0': + '@oxlint/binding-linux-arm64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-arm64-musl@1.61.0': + '@oxlint/binding-linux-arm64-musl@1.73.0': optional: true - '@oxlint/binding-linux-ppc64-gnu@1.61.0': + '@oxlint/binding-linux-ppc64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-riscv64-gnu@1.61.0': + '@oxlint/binding-linux-riscv64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-riscv64-musl@1.61.0': + '@oxlint/binding-linux-riscv64-musl@1.73.0': optional: true - '@oxlint/binding-linux-s390x-gnu@1.61.0': + '@oxlint/binding-linux-s390x-gnu@1.73.0': optional: true - '@oxlint/binding-linux-x64-gnu@1.61.0': + '@oxlint/binding-linux-x64-gnu@1.73.0': optional: true - '@oxlint/binding-linux-x64-musl@1.61.0': + '@oxlint/binding-linux-x64-musl@1.73.0': optional: true - '@oxlint/binding-openharmony-arm64@1.61.0': + '@oxlint/binding-openharmony-arm64@1.73.0': optional: true - '@oxlint/binding-win32-arm64-msvc@1.61.0': + '@oxlint/binding-win32-arm64-msvc@1.73.0': optional: true - '@oxlint/binding-win32-ia32-msvc@1.61.0': + '@oxlint/binding-win32-ia32-msvc@1.73.0': optional: true - '@oxlint/binding-win32-x64-msvc@1.61.0': + '@oxlint/binding-win32-x64-msvc@1.73.0': optional: true '@pnpm/config.env-replace@1.1.0': {} @@ -3134,79 +3146,79 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/rollup-android-arm-eabi@4.60.1': + '@rollup/rollup-android-arm-eabi@4.62.2': optional: true - '@rollup/rollup-android-arm64@4.60.1': + '@rollup/rollup-android-arm64@4.62.2': optional: true - '@rollup/rollup-darwin-arm64@4.60.1': + '@rollup/rollup-darwin-arm64@4.62.2': optional: true - '@rollup/rollup-darwin-x64@4.60.1': + '@rollup/rollup-darwin-x64@4.62.2': optional: true - '@rollup/rollup-freebsd-arm64@4.60.1': + '@rollup/rollup-freebsd-arm64@4.62.2': optional: true - '@rollup/rollup-freebsd-x64@4.60.1': + '@rollup/rollup-freebsd-x64@4.62.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.60.1': + '@rollup/rollup-linux-arm-gnueabihf@4.62.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.60.1': + '@rollup/rollup-linux-arm-musleabihf@4.62.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.60.1': + '@rollup/rollup-linux-arm64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.60.1': + '@rollup/rollup-linux-arm64-musl@4.62.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.60.1': + '@rollup/rollup-linux-loong64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-loong64-musl@4.60.1': + '@rollup/rollup-linux-loong64-musl@4.62.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.60.1': + '@rollup/rollup-linux-ppc64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-ppc64-musl@4.60.1': + '@rollup/rollup-linux-ppc64-musl@4.62.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.60.1': + '@rollup/rollup-linux-riscv64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.60.1': + '@rollup/rollup-linux-riscv64-musl@4.62.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.60.1': + '@rollup/rollup-linux-s390x-gnu@4.62.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.60.1': + '@rollup/rollup-linux-x64-gnu@4.62.2': optional: true - '@rollup/rollup-linux-x64-musl@4.60.1': + '@rollup/rollup-linux-x64-musl@4.62.2': optional: true - '@rollup/rollup-openbsd-x64@4.60.1': + '@rollup/rollup-openbsd-x64@4.62.2': optional: true - '@rollup/rollup-openharmony-arm64@4.60.1': + '@rollup/rollup-openharmony-arm64@4.62.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.60.1': + '@rollup/rollup-win32-arm64-msvc@4.62.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.60.1': + '@rollup/rollup-win32-ia32-msvc@4.62.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.60.1': + '@rollup/rollup-win32-x64-gnu@4.62.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.60.1': + '@rollup/rollup-win32-x64-msvc@4.62.2': optional: true '@sec-ant/readable-stream@0.4.1': {} @@ -3244,7 +3256,7 @@ snapshots: mime: 4.1.0 p-filter: 4.1.0 semantic-release: 25.0.3(typescript@6.0.2) - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 undici: 7.25.0 url-join: 5.0.0 transitivePeerDependencies: @@ -3307,7 +3319,7 @@ snapshots: '@types/deep-eql@4.0.2': {} - '@types/estree@1.0.8': {} + '@types/estree@1.0.9': {} '@types/node@25.6.0': dependencies: @@ -3686,7 +3698,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 execa@8.0.1: dependencies: @@ -3739,9 +3751,9 @@ snapshots: dependencies: walk-up-path: 4.0.0 - fdir@6.5.0(picomatch@4.0.4): + fdir@6.5.0(picomatch@4.0.5): optionalDependencies: - picomatch: 4.0.4 + picomatch: 4.0.5 figures@2.0.0: dependencies: @@ -3994,17 +4006,17 @@ snapshots: knip@6.6.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2): dependencies: - fdir: 6.5.0(picomatch@4.0.4) + fdir: 6.5.0(picomatch@4.0.5) formatly: 0.3.0 get-tsconfig: 4.14.0 jiti: 2.6.1 minimist: 1.2.8 oxc-parser: 0.127.0 oxc-resolver: 11.19.1(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2) - picomatch: 4.0.4 + picomatch: 4.0.5 smol-toml: 1.6.1 strip-json-comments: 5.0.3 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 unbash: 3.0.0 yaml: 2.8.3 zod: 4.3.6 @@ -4102,7 +4114,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.11: {} + nanoid@3.3.15: {} neo-async@2.6.2: {} @@ -4199,63 +4211,61 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' - oxfmt@0.46.0: + oxfmt@0.57.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.46.0 - '@oxfmt/binding-android-arm64': 0.46.0 - '@oxfmt/binding-darwin-arm64': 0.46.0 - '@oxfmt/binding-darwin-x64': 0.46.0 - '@oxfmt/binding-freebsd-x64': 0.46.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.46.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.46.0 - '@oxfmt/binding-linux-arm64-gnu': 0.46.0 - '@oxfmt/binding-linux-arm64-musl': 0.46.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.46.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.46.0 - '@oxfmt/binding-linux-riscv64-musl': 0.46.0 - '@oxfmt/binding-linux-s390x-gnu': 0.46.0 - '@oxfmt/binding-linux-x64-gnu': 0.46.0 - '@oxfmt/binding-linux-x64-musl': 0.46.0 - '@oxfmt/binding-openharmony-arm64': 0.46.0 - '@oxfmt/binding-win32-arm64-msvc': 0.46.0 - '@oxfmt/binding-win32-ia32-msvc': 0.46.0 - '@oxfmt/binding-win32-x64-msvc': 0.46.0 - - oxlint-config-j4k@2.3.0: {} - - oxlint-tsgolint@0.22.0: + '@oxfmt/binding-android-arm-eabi': 0.57.0 + '@oxfmt/binding-android-arm64': 0.57.0 + '@oxfmt/binding-darwin-arm64': 0.57.0 + '@oxfmt/binding-darwin-x64': 0.57.0 + '@oxfmt/binding-freebsd-x64': 0.57.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.57.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.57.0 + '@oxfmt/binding-linux-arm64-gnu': 0.57.0 + '@oxfmt/binding-linux-arm64-musl': 0.57.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.57.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.57.0 + '@oxfmt/binding-linux-riscv64-musl': 0.57.0 + '@oxfmt/binding-linux-s390x-gnu': 0.57.0 + '@oxfmt/binding-linux-x64-gnu': 0.57.0 + '@oxfmt/binding-linux-x64-musl': 0.57.0 + '@oxfmt/binding-openharmony-arm64': 0.57.0 + '@oxfmt/binding-win32-arm64-msvc': 0.57.0 + '@oxfmt/binding-win32-ia32-msvc': 0.57.0 + '@oxfmt/binding-win32-x64-msvc': 0.57.0 + + oxlint-tsgolint@0.23.0: optionalDependencies: - '@oxlint-tsgolint/darwin-arm64': 0.22.0 - '@oxlint-tsgolint/darwin-x64': 0.22.0 - '@oxlint-tsgolint/linux-arm64': 0.22.0 - '@oxlint-tsgolint/linux-x64': 0.22.0 - '@oxlint-tsgolint/win32-arm64': 0.22.0 - '@oxlint-tsgolint/win32-x64': 0.22.0 - - oxlint@1.61.0(oxlint-tsgolint@0.22.0): + '@oxlint-tsgolint/darwin-arm64': 0.23.0 + '@oxlint-tsgolint/darwin-x64': 0.23.0 + '@oxlint-tsgolint/linux-arm64': 0.23.0 + '@oxlint-tsgolint/linux-x64': 0.23.0 + '@oxlint-tsgolint/win32-arm64': 0.23.0 + '@oxlint-tsgolint/win32-x64': 0.23.0 + + oxlint@1.73.0(oxlint-tsgolint@0.23.0): optionalDependencies: - '@oxlint/binding-android-arm-eabi': 1.61.0 - '@oxlint/binding-android-arm64': 1.61.0 - '@oxlint/binding-darwin-arm64': 1.61.0 - '@oxlint/binding-darwin-x64': 1.61.0 - '@oxlint/binding-freebsd-x64': 1.61.0 - '@oxlint/binding-linux-arm-gnueabihf': 1.61.0 - '@oxlint/binding-linux-arm-musleabihf': 1.61.0 - '@oxlint/binding-linux-arm64-gnu': 1.61.0 - '@oxlint/binding-linux-arm64-musl': 1.61.0 - '@oxlint/binding-linux-ppc64-gnu': 1.61.0 - '@oxlint/binding-linux-riscv64-gnu': 1.61.0 - '@oxlint/binding-linux-riscv64-musl': 1.61.0 - '@oxlint/binding-linux-s390x-gnu': 1.61.0 - '@oxlint/binding-linux-x64-gnu': 1.61.0 - '@oxlint/binding-linux-x64-musl': 1.61.0 - '@oxlint/binding-openharmony-arm64': 1.61.0 - '@oxlint/binding-win32-arm64-msvc': 1.61.0 - '@oxlint/binding-win32-ia32-msvc': 1.61.0 - '@oxlint/binding-win32-x64-msvc': 1.61.0 - oxlint-tsgolint: 0.22.0 + '@oxlint/binding-android-arm-eabi': 1.73.0 + '@oxlint/binding-android-arm64': 1.73.0 + '@oxlint/binding-darwin-arm64': 1.73.0 + '@oxlint/binding-darwin-x64': 1.73.0 + '@oxlint/binding-freebsd-x64': 1.73.0 + '@oxlint/binding-linux-arm-gnueabihf': 1.73.0 + '@oxlint/binding-linux-arm-musleabihf': 1.73.0 + '@oxlint/binding-linux-arm64-gnu': 1.73.0 + '@oxlint/binding-linux-arm64-musl': 1.73.0 + '@oxlint/binding-linux-ppc64-gnu': 1.73.0 + '@oxlint/binding-linux-riscv64-gnu': 1.73.0 + '@oxlint/binding-linux-riscv64-musl': 1.73.0 + '@oxlint/binding-linux-s390x-gnu': 1.73.0 + '@oxlint/binding-linux-x64-gnu': 1.73.0 + '@oxlint/binding-linux-x64-musl': 1.73.0 + '@oxlint/binding-openharmony-arm64': 1.73.0 + '@oxlint/binding-win32-arm64-msvc': 1.73.0 + '@oxlint/binding-win32-ia32-msvc': 1.73.0 + '@oxlint/binding-win32-x64-msvc': 1.73.0 + oxlint-tsgolint: 0.23.0 p-each-series@3.0.0: {} @@ -4331,7 +4341,7 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.4: {} + picomatch@4.0.5: {} pify@3.0.0: {} @@ -4340,9 +4350,9 @@ snapshots: find-up: 2.1.0 load-json-file: 4.0.0 - postcss@8.5.10: + postcss@8.5.16: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.15 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -4417,35 +4427,35 @@ snapshots: reusify@1.1.0: {} - rollup@4.60.1: + rollup@4.62.2: dependencies: - '@types/estree': 1.0.8 + '@types/estree': 1.0.9 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.60.1 - '@rollup/rollup-android-arm64': 4.60.1 - '@rollup/rollup-darwin-arm64': 4.60.1 - '@rollup/rollup-darwin-x64': 4.60.1 - '@rollup/rollup-freebsd-arm64': 4.60.1 - '@rollup/rollup-freebsd-x64': 4.60.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.60.1 - '@rollup/rollup-linux-arm-musleabihf': 4.60.1 - '@rollup/rollup-linux-arm64-gnu': 4.60.1 - '@rollup/rollup-linux-arm64-musl': 4.60.1 - '@rollup/rollup-linux-loong64-gnu': 4.60.1 - '@rollup/rollup-linux-loong64-musl': 4.60.1 - '@rollup/rollup-linux-ppc64-gnu': 4.60.1 - '@rollup/rollup-linux-ppc64-musl': 4.60.1 - '@rollup/rollup-linux-riscv64-gnu': 4.60.1 - '@rollup/rollup-linux-riscv64-musl': 4.60.1 - '@rollup/rollup-linux-s390x-gnu': 4.60.1 - '@rollup/rollup-linux-x64-gnu': 4.60.1 - '@rollup/rollup-linux-x64-musl': 4.60.1 - '@rollup/rollup-openbsd-x64': 4.60.1 - '@rollup/rollup-openharmony-arm64': 4.60.1 - '@rollup/rollup-win32-arm64-msvc': 4.60.1 - '@rollup/rollup-win32-ia32-msvc': 4.60.1 - '@rollup/rollup-win32-x64-gnu': 4.60.1 - '@rollup/rollup-win32-x64-msvc': 4.60.1 + '@rollup/rollup-android-arm-eabi': 4.62.2 + '@rollup/rollup-android-arm64': 4.62.2 + '@rollup/rollup-darwin-arm64': 4.62.2 + '@rollup/rollup-darwin-x64': 4.62.2 + '@rollup/rollup-freebsd-arm64': 4.62.2 + '@rollup/rollup-freebsd-x64': 4.62.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.62.2 + '@rollup/rollup-linux-arm-musleabihf': 4.62.2 + '@rollup/rollup-linux-arm64-gnu': 4.62.2 + '@rollup/rollup-linux-arm64-musl': 4.62.2 + '@rollup/rollup-linux-loong64-gnu': 4.62.2 + '@rollup/rollup-linux-loong64-musl': 4.62.2 + '@rollup/rollup-linux-ppc64-gnu': 4.62.2 + '@rollup/rollup-linux-ppc64-musl': 4.62.2 + '@rollup/rollup-linux-riscv64-gnu': 4.62.2 + '@rollup/rollup-linux-riscv64-musl': 4.62.2 + '@rollup/rollup-linux-s390x-gnu': 4.62.2 + '@rollup/rollup-linux-x64-gnu': 4.62.2 + '@rollup/rollup-linux-x64-musl': 4.62.2 + '@rollup/rollup-openbsd-x64': 4.62.2 + '@rollup/rollup-openharmony-arm64': 4.62.2 + '@rollup/rollup-win32-arm64-msvc': 4.62.2 + '@rollup/rollup-win32-ia32-msvc': 4.62.2 + '@rollup/rollup-win32-x64-gnu': 4.62.2 + '@rollup/rollup-win32-x64-msvc': 4.62.2 fsevents: 2.3.3 run-parallel@1.2.0: @@ -4640,10 +4650,10 @@ snapshots: tinyexec@1.1.1: {} - tinyglobby@0.2.16: + tinyglobby@0.2.17: dependencies: - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 tinypool@2.1.0: {} @@ -4714,11 +4724,11 @@ snapshots: vite@7.3.1(@types/node@25.6.0)(jiti@2.6.1)(yaml@2.8.3): dependencies: esbuild: 0.27.7 - fdir: 6.5.0(picomatch@4.0.4) - picomatch: 4.0.4 - postcss: 8.5.10 - rollup: 4.60.1 - tinyglobby: 0.2.16 + fdir: 6.5.0(picomatch@4.0.5) + picomatch: 4.0.5 + postcss: 8.5.16 + rollup: 4.62.2 + tinyglobby: 0.2.17 optionalDependencies: '@types/node': 25.6.0 fsevents: 2.3.3 @@ -4739,11 +4749,11 @@ snapshots: magic-string: 0.30.21 obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.4 + picomatch: 4.0.5 std-env: 4.1.0 tinybench: 2.9.0 tinyexec: 1.1.1 - tinyglobby: 0.2.16 + tinyglobby: 0.2.17 tinyrainbow: 3.1.0 vite: 7.3.1(@types/node@25.6.0)(jiti@2.6.1)(yaml@2.8.3) why-is-node-running: 2.3.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c813e2e..91629bf 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,4 +2,8 @@ allowBuilds: esbuild: true enableGlobalVirtualStore: true registries: - default: https://npm.j4k.dev/ + default: https://registry.npmjs.org/ + "@j4k": https://code.j4k.dev/api/packages/j4k/npm/ +minimumReleaseAgeIgnoreMissingTime: false +minimumReleaseAgeExclude: + - "@j4k/*" diff --git a/src/cli/collect-pattern-warnings.ts b/src/cli/collect-pattern-warnings.ts index 048cd2d..2413892 100644 --- a/src/cli/collect-pattern-warnings.ts +++ b/src/cli/collect-pattern-warnings.ts @@ -3,7 +3,7 @@ export interface PatternWarning { patterns: string[]; } -const GLOBAL_OVERRIDE_PATTERN = /^globalOverrides\.([^:]+): (.+)$/u; +const GLOBAL_OVERRIDE_PATTERN = /^globalOverrides\.(?[^:]+): (?.+)$/u; function addPatternWarning(warnings: PatternWarning[], source: string, pattern: string): void { const existing = warnings.find((warning) => warning.source === source); @@ -25,8 +25,10 @@ export function collectGlobalPatternWarnings(unmatchedPatterns: string[]): Patte const warnings: PatternWarning[] = []; for (const pattern of unmatchedPatterns) { const match = GLOBAL_OVERRIDE_PATTERN.exec(pattern); - if (match?.[1] && match[2]) { - addPatternWarning(warnings, `globalOverrides.${match[1]}`, match[2]); + const harness = match?.groups?.harness; + const overridePattern = match?.groups?.pattern; + if (harness && overridePattern) { + addPatternWarning(warnings, `globalOverrides.${harness}`, overridePattern); continue; } addPatternWarning(warnings, "global", pattern); diff --git a/src/cli/main.test.ts b/src/cli/main.test.ts index a143165..ab68c88 100644 --- a/src/cli/main.test.ts +++ b/src/cli/main.test.ts @@ -389,7 +389,7 @@ describe("cli/main", () => { const errorSpy = vi.spyOn(console, "error").mockImplementation(() => {}); const code = await main(["node", "sync-rules", "unknown"]); expect(code).toBe(1); - expect(errorSpy).toHaveBeenCalled(); + expect(errorSpy).toHaveBeenCalledWith(expect.any(String)); errorSpy.mockRestore(); }); diff --git a/src/config/config.test.ts b/src/config/config.test.ts index 5f46501..7896ad4 100644 --- a/src/config/config.test.ts +++ b/src/config/config.test.ts @@ -37,7 +37,7 @@ describe("config", () => { const projects = config.projects ?? []; // normalizePath will expand ~ to full home directory expect(projects[0]?.path).toMatch(/\/Developer\/project$/u); - expect(projects[0]?.rules).toEqual(["python.md"]); + expect(projects[0]?.rules).toStrictEqual(["python.md"]); }); it("parses multiple projects", () => { @@ -58,7 +58,7 @@ describe("config", () => { const config = parseConfig(json); expect(config.projects).toHaveLength(2); const projects = config.projects ?? []; - expect(projects[1]?.rules).toEqual(["frontend/**/*.md"]); + expect(projects[1]?.rules).toStrictEqual(["frontend/**/*.md"]); }); it("accepts positive and negative POSIX globs in 'rules'", () => { @@ -74,7 +74,7 @@ describe("config", () => { const config = parseConfig(json); const projects = config.projects ?? []; - expect(projects[0]?.rules).toEqual(["**/*.md", "frontend/**", "!test/**"]); + expect(projects[0]?.rules).toStrictEqual(["**/*.md", "frontend/**", "!test/**"]); }); it("applies DEFAULT_RULES_SOURCE when rulesSource is omitted", () => { @@ -87,7 +87,7 @@ describe("config", () => { expect(config.projects).toHaveLength(1); const projects = config.projects ?? []; expect(projects[0]?.path).toMatch(/\//u); - expect(projects[0]?.rules).toEqual(["test.md"]); + expect(projects[0]?.rules).toStrictEqual(["test.md"]); }); it("accepts config with only global (no projects)", () => { @@ -96,7 +96,7 @@ describe("config", () => { global: ["global-rules/*.md"], }); const config = parseConfig(json); - expect(config.global).toEqual(["global-rules/*.md"]); + expect(config.global).toStrictEqual(["global-rules/*.md"]); expect(config.projects).toBeUndefined(); }); @@ -108,7 +108,7 @@ describe("config", () => { }, }); const config = parseConfig(json); - expect(config.globalOverrides).toEqual({ + expect(config.globalOverrides).toStrictEqual({ claude: ["claude-specific/*.md"], }); expect(config.projects).toBeUndefined(); @@ -126,8 +126,8 @@ describe("config", () => { projects: [{ path: "./app", rules: ["**/*.md"] }], }); const config = parseConfig(json); - expect(config.global).toEqual(["shared/*.md"]); - expect(config.globalOverrides).toEqual({ + expect(config.global).toStrictEqual(["shared/*.md"]); + expect(config.globalOverrides).toStrictEqual({ gemini: ["gemini/*.md"], codex: ["codex/*.md"], }); @@ -146,7 +146,7 @@ describe("config", () => { }, }); const config = parseConfig(json); - expect(Object.keys(config.globalOverrides ?? {})).toEqual([ + expect(Object.keys(config.globalOverrides ?? {})).toStrictEqual([ "claude", "gemini", "opencode", @@ -320,7 +320,7 @@ describe("config", () => { const result = findProjectForPath("/home/user/projects/api", mockConfig); expect(result).toBeDefined(); expect(result?.path).toBe("/home/user/projects/api"); - expect(result?.rules).toEqual(["**/*.md"]); + expect(result?.rules).toStrictEqual(["**/*.md"]); }); it("should find parent project for nested path", () => { @@ -437,7 +437,7 @@ describe("config", () => { } as never); await expect(loadConfig("/custom/config.json")).rejects.toThrow(ConfigNotFoundError); - expect(vi.mocked(fs.stat).mock.calls).toHaveLength(1); + expect(vi.mocked(fs.stat)).toHaveBeenCalledTimes(1); }); it("should throw ConfigParseError for invalid JSON", async () => { diff --git a/src/config/loader.createSampleConfig.test.ts b/src/config/loader.createSampleConfig.test.ts index 9f929ac..c1b1b82 100644 --- a/src/config/loader.createSampleConfig.test.ts +++ b/src/config/loader.createSampleConfig.test.ts @@ -23,13 +23,16 @@ describe("createSampleConfig", () => { flag: "wx", }); const content = vi.mocked(fs.writeFile).mock.calls[0]?.[1] as string; - expect(content).toContain('"rulesSource"'); - expect(content).toContain('"global-rules/*.md"'); - expect(content).toContain('"globalOverrides"'); - expect(content).toContain('"claude"'); - expect(content).toContain('"codex"'); - expect(content).toContain('"copilot"'); - expect(content).toContain('"projects"'); + expect(JSON.parse(content)).toStrictEqual({ + rulesSource: "/path/to/rules", + global: ["global-rules/*.md"], + globalOverrides: { + claude: ["claude-specific/*.md"], + codex: ["codex-specific/*.md"], + copilot: ["copilot-specific/*.md"], + }, + projects: [{ path: "/path/to/project", rules: ["**/*.md"] }], + }); }); it("overwrites file when force=true", async () => { diff --git a/src/core/execution.test.ts b/src/core/execution.test.ts index e9ef2a7..b58350e 100644 --- a/src/core/execution.test.ts +++ b/src/core/execution.test.ts @@ -19,7 +19,7 @@ describe("executeActions - algorithm tests", () => { it("returns immediately when there are no actions", async () => { const result = await executeActions([], { dryRun: false }); - expect(result).toEqual({ written: [], skipped: [] }); + expect(result).toStrictEqual({ written: [], skipped: [] }); }); describe("dry-run mode", () => { @@ -31,7 +31,7 @@ describe("executeActions - algorithm tests", () => { }); expect(result.written).toContain("/test/file.txt"); - expect(result.skipped).toEqual([]); + expect(result.skipped).toStrictEqual([]); expect(fsPromises.stat).not.toHaveBeenCalled(); expect(fsPromises.writeFile).not.toHaveBeenCalled(); @@ -57,7 +57,7 @@ describe("executeActions - algorithm tests", () => { await expect(executeActions(actions, { dryRun: false })).rejects.toThrow(Error); - expect(vi.mocked(fsPromises.writeFile).mock.calls).toHaveLength(1); + expect(vi.mocked(fsPromises.writeFile)).toHaveBeenCalledTimes(1); }); }); @@ -72,8 +72,8 @@ describe("executeActions - algorithm tests", () => { dryRun: false, }); - expect(result.written).toEqual(["/test/file1.txt", "/test/file2.txt"]); - expect(result.skipped).toEqual([]); + expect(result.written).toStrictEqual(["/test/file1.txt", "/test/file2.txt"]); + expect(result.skipped).toStrictEqual([]); }); }); @@ -88,8 +88,10 @@ describe("executeActions - algorithm tests", () => { const result = await executeActions(actions, { dryRun: false }); - expect(result.written).toEqual([]); - expect(result.skipped).toEqual([{ path: "/nonexistent/file.txt", reason: "parent_missing" }]); + expect(result.written).toStrictEqual([]); + expect(result.skipped).toStrictEqual([ + { path: "/nonexistent/file.txt", reason: "parent_missing" }, + ]); expect(fsPromises.writeFile).not.toHaveBeenCalled(); }); @@ -102,8 +104,8 @@ describe("executeActions - algorithm tests", () => { const result = await executeActions(actions, { dryRun: false }); - expect(result.written).toEqual([]); - expect(result.skipped).toEqual([ + expect(result.written).toStrictEqual([]); + expect(result.skipped).toStrictEqual([ { path: "/not-a-dir/file.txt", reason: "parent_not_directory" }, ]); expect(fsPromises.writeFile).not.toHaveBeenCalled(); @@ -114,10 +116,10 @@ describe("executeActions - algorithm tests", () => { const result = await executeActions(actions, { dryRun: false }); - expect(result.written).toEqual(["/existing/file.txt"]); - expect(result.skipped).toEqual([]); + expect(result.written).toStrictEqual(["/existing/file.txt"]); + expect(result.skipped).toStrictEqual([]); expect(fsPromises.stat).toHaveBeenCalledWith("/existing"); - expect(fsPromises.writeFile).toHaveBeenCalled(); + expect(fsPromises.writeFile).toHaveBeenCalledWith(expect.any(String), "Hello", "utf8"); }); }); }); diff --git a/src/core/execution.ts b/src/core/execution.ts index ce41b6a..3bee5b7 100644 --- a/src/core/execution.ts +++ b/src/core/execution.ts @@ -3,6 +3,7 @@ import path from "node:path"; import { randomUUID } from "node:crypto"; import { normalizePath } from "../utils/paths.js"; import { SyncError, ensureError, isNodeError } from "../utils/errors.js"; + export interface RunFlags { dryRun: boolean; } diff --git a/src/core/sync-global.test.ts b/src/core/sync-global.test.ts index f0f0e49..967d58f 100644 --- a/src/core/sync-global.test.ts +++ b/src/core/sync-global.test.ts @@ -31,7 +31,7 @@ describe("sync-global", () => { rulesSource: "/rules", }, ); - expect(result.written).toEqual([]); + expect(result.written).toStrictEqual([]); }); it("returns no writes when no rules match", async () => { @@ -46,9 +46,13 @@ describe("sync-global", () => { global: ["global-rules/*.md"], }, ); - expect(filesystemModule.loadRules).toHaveBeenCalled(); - expect(result.written).toEqual([]); - expect(result.unmatchedPatterns).toEqual(["global-rules/*.md"]); + expect(filesystemModule.loadRules).toHaveBeenCalledWith( + "/rules", + ["global-rules/*.md"], + undefined, + ); + expect(result.written).toStrictEqual([]); + expect(result.unmatchedPatterns).toStrictEqual(["global-rules/*.md"]); }); it("writes combined content to all global targets", async () => { @@ -70,13 +74,15 @@ describe("sync-global", () => { }, ); - expect(vi.mocked(executionModule.executeActions).mock.calls).toHaveLength(1); + expect(vi.mocked(executionModule.executeActions)).toHaveBeenCalledTimes(1); const callArguments = vi.mocked(executionModule.executeActions).mock.calls[0]; const actionsArgument: WriteAction[] = callArguments?.[0] ?? []; const paths = actionsArgument.map((action) => action.path); - expect(paths.some((p) => p.endsWith("/.claude/CLAUDE.md"))).toBe(true); - expect(paths.some((p) => p.endsWith("/.codex/AGENTS.md"))).toBe(true); - expect(paths.some((p) => p.endsWith("/.copilot/copilot-instructions.md"))).toBe(true); + expect({ + claude: paths.some((p) => p.endsWith("/.claude/CLAUDE.md")), + codex: paths.some((p) => p.endsWith("/.codex/AGENTS.md")), + copilot: paths.some((p) => p.endsWith("/.copilot/copilot-instructions.md")), + }).toStrictEqual({ claude: true, codex: true, copilot: true }); expect(actionsArgument.every((action) => action.content === "# G1\nA\n\n# G2\nB")).toBe(true); expect(result.written).toHaveLength(2); }); @@ -117,7 +123,7 @@ describe("sync-global", () => { }, ); - expect(vi.mocked(executionModule.executeActions).mock.calls).toHaveLength(1); + expect(vi.mocked(executionModule.executeActions)).toHaveBeenCalledTimes(1); const actionsArgument: WriteAction[] = vi.mocked(executionModule.executeActions).mock.calls[0]?.[0] ?? []; @@ -155,7 +161,7 @@ describe("sync-global", () => { }, ); - expect(vi.mocked(executionModule.executeActions).mock.calls).toHaveLength(1); + expect(vi.mocked(executionModule.executeActions)).toHaveBeenCalledTimes(1); const actionsArgument: WriteAction[] = vi.mocked(executionModule.executeActions).mock.calls[0]?.[0] ?? []; @@ -230,7 +236,7 @@ describe("sync-global", () => { }, ); - expect(vi.mocked(executionModule.executeActions).mock.calls).toHaveLength(1); + expect(vi.mocked(executionModule.executeActions)).toHaveBeenCalledTimes(1); }); it("reports unmatched override patterns", async () => { @@ -272,7 +278,7 @@ describe("sync-global", () => { ); // No writes when all rules are empty - expect(result.written).toEqual([]); + expect(result.written).toStrictEqual([]); }); }); }); diff --git a/src/core/sync.test.ts b/src/core/sync.test.ts index b542b88..5b0afe2 100644 --- a/src/core/sync.test.ts +++ b/src/core/sync.test.ts @@ -56,12 +56,13 @@ describe("sync", () => { ); expect(filesystemModule.loadRules).toHaveBeenCalledWith(expect.any(String), ["**/*.md"]); - expect(vi.mocked(executionModule.executeActions).mock.calls).toHaveLength(1); + expect(vi.mocked(executionModule.executeActions)).toHaveBeenCalledTimes(1); const callArguments = vi.mocked(executionModule.executeActions).mock.calls[0]; const actionsArgument: WriteAction[] = callArguments?.[0] ?? []; const paths = actionsArgument.map((action) => action.path); - expect(paths).toContain("/home/user/project/AGENTS.md"); - expect(paths).toContain("/home/user/project/CLAUDE.md"); + expect(paths).toStrictEqual( + expect.arrayContaining(["/home/user/project/AGENTS.md", "/home/user/project/CLAUDE.md"]), + ); const agents = actionsArgument.find((action) => action.path.endsWith("AGENTS.md")); expect(agents?.content).toBe("# Rule 1\nContent\n\n# Rule 2\nContent"); const claude = actionsArgument.find((action) => action.path.endsWith("CLAUDE.md")); @@ -84,7 +85,7 @@ describe("sync", () => { { rulesSource: "/path/to/rules", projects: [] }, ); - expect(vi.mocked(executionModule.executeActions).mock.calls).toHaveLength(1); + expect(vi.mocked(executionModule.executeActions)).toHaveBeenCalledTimes(1); const callArguments = vi.mocked(executionModule.executeActions).mock.calls[0]; const actionsArgument: WriteAction[] = callArguments?.[0] ?? []; const claude = actionsArgument.find((action) => action.path.endsWith("CLAUDE.md")); @@ -107,7 +108,7 @@ describe("sync", () => { { rulesSource: "/path/to/rules", projects: [] }, ); - expect(vi.mocked(executionModule.executeActions).mock.calls).toHaveLength(1); + expect(vi.mocked(executionModule.executeActions)).toHaveBeenCalledTimes(1); const callArguments = vi.mocked(executionModule.executeActions).mock.calls[0]; const actionsArgument: WriteAction[] = callArguments?.[0] ?? []; const paths = actionsArgument.map((action) => action.path); @@ -140,7 +141,7 @@ describe("sync", () => { const secondCallArguments = vi.mocked(executionModule.executeActions).mock.calls[1]; const secondActions: WriteAction[] = secondCallArguments?.[0] ?? []; const paths = secondActions.map((action) => action.path); - expect(paths).toEqual(["/home/user/project/CLAUDE.md"]); + expect(paths).toStrictEqual(["/home/user/project/CLAUDE.md"]); const [claude] = secondActions; expect(claude?.content).toBe("@AGENTS.md"); }); diff --git a/src/utils/errors.test.ts b/src/utils/errors.test.ts index bad66ac..56a3b84 100644 --- a/src/utils/errors.test.ts +++ b/src/utils/errors.test.ts @@ -7,8 +7,8 @@ import { ensureError, } from "./errors.js"; -describe("SyncError class", () => { - it("SyncError sets name/message and optionally stores details and cause", () => { +describe("syncError class", () => { + it("syncError sets name/message and optionally stores details and cause", () => { const cases = [ { title: "basic error with message only", @@ -42,17 +42,16 @@ describe("SyncError class", () => { for (const c of cases) { const error = new SyncError(c.message, c.details, c.cause); - expect(error).toBeInstanceOf(Error); expect(error).toBeInstanceOf(SyncError); expect(error.name).toBe("SyncError"); expect(error.message).toBe(c.message); - expect(error.details).toEqual(c.expectedDetails); + expect(error.details).toStrictEqual(c.expectedDetails); expect(error.cause).toBe(c.cause); } }); }); -describe("ConfigNotFoundError", () => { +describe("configNotFoundError", () => { const cases = [ { title: "missing non-default config", @@ -70,20 +69,20 @@ describe("ConfigNotFoundError", () => { }, ] as const; - for (const c of cases) { - it(`should create error for ${c.title}`, () => { - const error = new ConfigNotFoundError(c.path, c.isDefault); - expect(error.name).toBe("ConfigNotFoundError"); - expect(error.path).toBe(c.path); - expect(error.isDefault).toBe(c.isDefault); - expect(error.message).toContain(c.message); - expect(error.message).toContain("Try 'sync-rules --help' for details."); - expect(error.message).toContain(c.hintContains); + it.each(cases)("should create error for $title", (c) => { + const error = new ConfigNotFoundError(c.path, c.isDefault); + expect({ name: error.name, path: error.path, isDefault: error.isDefault }).toStrictEqual({ + name: "ConfigNotFoundError", + path: c.path, + isDefault: c.isDefault, }); - } + expect(error.message).toContain(c.message); + expect(error.message).toContain("Try 'sync-rules --help' for details."); + expect(error.message).toContain(c.hintContains); + }); }); -describe("ConfigParseError", () => { +describe("configParseError", () => { const cases = [ { title: "parse failure without original error", @@ -99,21 +98,25 @@ describe("ConfigParseError", () => { }, ] as const; - for (const c of cases) { - it(`should create error for ${c.title}`, () => { - const error = new ConfigParseError(c.path, c.original); - expect(error).toBeInstanceOf(Error); - expect(error.name).toBe("ConfigParseError"); - expect(error.path).toBe(c.path); - expect(error.originalError).toBe(c.original); - expect(error.message).toContain(c.expectedMessage); - expect(error.message).toContain("Fix the JSON and glob patterns"); - expect(error.message).toContain("Try 'sync-rules --help' for schema and examples."); + it.each(cases)("should create error for $title", (c) => { + const error = new ConfigParseError(c.path, c.original); + expect(error).toBeInstanceOf(Error); + expect({ + name: error.name, + path: error.path, + originalError: error.originalError, + }).toStrictEqual({ + name: "ConfigParseError", + path: c.path, + originalError: c.original, }); - } + expect(error.message).toContain(c.expectedMessage); + expect(error.message).toContain("Fix the JSON and glob patterns"); + expect(error.message).toContain("Try 'sync-rules --help' for schema and examples."); + }); }); -describe("SpawnError", () => { +describe("spawnError", () => { const cases = [ { title: "command not found (ENOENT)", @@ -158,18 +161,25 @@ describe("SpawnError", () => { }, ] as const; - for (const c of cases) { - it(`should create error: ${c.title}`, () => { - const error = new SpawnError(c.input.command, c.input.code, c.input.exitCode, c.input.signal); - expect(error).toBeInstanceOf(Error); - expect(error.name).toBe("SpawnError"); - expect(error.command).toBe(c.input.command); - expect(error.code).toBe(c.input.code); - expect(error.exitCode).toBe(c.input.exitCode); - expect(error.signal).toBe(c.input.signal); - expect(error.message).toBe(c.expectedMessage); + it.each(cases)("should create error: $title", (c) => { + const error = new SpawnError(c.input.command, c.input.code, c.input.exitCode, c.input.signal); + expect(error).toBeInstanceOf(Error); + expect({ + name: error.name, + command: error.command, + code: error.code, + exitCode: error.exitCode, + signal: error.signal, + message: error.message, + }).toStrictEqual({ + name: "SpawnError", + command: c.input.command, + code: c.input.code, + exitCode: c.input.exitCode, + signal: c.input.signal, + message: c.expectedMessage, }); - } + }); it("preserves cause on SpawnError for error chaining", () => { const cause = new Error("Original error"); diff --git a/tests/integration/execution.integration.test.ts b/tests/integration/execution.integration.test.ts index 6e96a9c..80a4390 100644 --- a/tests/integration/execution.integration.test.ts +++ b/tests/integration/execution.integration.test.ts @@ -32,8 +32,8 @@ describe("executeActions - integration tests", () => { const result = await executeActions(actions, { dryRun: false }); - expect(result.skipped).toEqual([{ path: nestedPath, reason: "parent_missing" }]); - expect(result.written).toEqual([]); + expect(result.skipped).toStrictEqual([{ path: nestedPath, reason: "parent_missing" }]); + expect(result.written).toStrictEqual([]); }); it("should overwrite existing files", async () => { diff --git a/tests/integration/rules-fs.integration.test.ts b/tests/integration/rules-fs.integration.test.ts index 0502c0a..ca6668c 100644 --- a/tests/integration/rules-fs.integration.test.ts +++ b/tests/integration/rules-fs.integration.test.ts @@ -52,7 +52,7 @@ describe("filesystem operations", () => { const patterns = ["**/*.md"]; const result = await globRulePaths(temporaryDirectory, patterns); - expect(result.paths).toEqual([ + expect(result.paths).toStrictEqual([ "backend/node.md", "deep/nested/deep.md", "frontend/react.md", @@ -61,7 +61,7 @@ describe("filesystem operations", () => { "python.md", "test/test-rule.md", ]); - expect(result.unmatchedPatterns).toEqual([]); + expect(result.unmatchedPatterns).toStrictEqual([]); }); // Exact name matching covered by wildcard and exclusion tests @@ -70,7 +70,7 @@ describe("filesystem operations", () => { const patterns = ["**/*.md", "!test/**"]; const result = await globRulePaths(temporaryDirectory, patterns); - expect(result.paths).toEqual([ + expect(result.paths).toStrictEqual([ "backend/node.md", "deep/nested/deep.md", "frontend/react.md", @@ -78,7 +78,7 @@ describe("filesystem operations", () => { "javascript.md", "python.md", ]); - expect(result.unmatchedPatterns).toEqual([]); + expect(result.unmatchedPatterns).toStrictEqual([]); }); it("reports unmatched patterns", async () => { @@ -86,7 +86,7 @@ describe("filesystem operations", () => { const result = await globRulePaths(temporaryDirectory, patterns); // Should still return matches from the first pattern - expect(result.paths).toEqual([ + expect(result.paths).toStrictEqual([ "backend/node.md", "deep/nested/deep.md", "frontend/react.md", @@ -96,7 +96,7 @@ describe("filesystem operations", () => { "test/test-rule.md", ]); // Should report the patterns that matched nothing - expect(result.unmatchedPatterns).toEqual(["also-missing/**", "nonexistent/*.md"]); + expect(result.unmatchedPatterns).toStrictEqual(["also-missing/**", "nonexistent/*.md"]); }); // Empty pattern test removed - config validation requires positive globs @@ -110,8 +110,8 @@ describe("filesystem operations", () => { await writeFile(path.join(temporaryDirectory, "sub", "c.txt"), "nope"); const result = await loadRules(temporaryDirectory, ["**/*.md", "!sub/**"]); - expect(result.rules).toEqual([{ path: "a.md", content: "# A" }]); - expect(result.unmatchedPatterns).toEqual([]); + expect(result.rules).toStrictEqual([{ path: "a.md", content: "# A" }]); + expect(result.unmatchedPatterns).toStrictEqual([]); }); }); diff --git a/types/css-modules.d.ts b/types/css-modules.d.ts new file mode 100644 index 0000000..fbc38f9 --- /dev/null +++ b/types/css-modules.d.ts @@ -0,0 +1,18 @@ +// Under tsgo build mode the strict base type-checks CSS side-effect imports +// (`import "./styles.css"`), which fail with TS2882 unless an ambient `*.css` +// module is in scope. This shim supplies them for every solution-root repo — +// Next.js apps, but also Vite/React and Tailwind repos that side-effect-import +// CSS. Next.js also ships its own copies (next/types/global.d.ts) via a generated +// `next-env.d.ts`; the overlap is harmless (`skipLibCheck` is on and both +// declarations are type-compatible) and this shim keeps the gate green even +// before `next typegen` runs. +// +// The typed `*.module.css` must come first: tsgo ranks pattern modules by prefix +// length only, both prefixes are empty, so the first-declared wins the tie. A +// leading bare `*.css` would shadow `*.module.css` and collapse every module-CSS +// import to `any` (verified against tsgo 7.0.2). +declare module "*.module.css" { + const classes: Readonly>; + export default classes; +} +declare module "*.css";