From 91db478fe9d8a015359827f4d089b28ac9ceccfc Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Sun, 29 Dec 2024 22:32:59 +0800 Subject: [PATCH 01/19] fix: applying 1-width at odd location --- logic/section.ts | 2 +- tests/board.test.ts | 9 +++++++-- tests/section.test.ts | 23 ++++++++++++++--------- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/logic/section.ts b/logic/section.ts index d935dc3..f2463ff 100644 --- a/logic/section.ts +++ b/logic/section.ts @@ -44,7 +44,7 @@ export function applyChange(change: BoardChange, section: SectionData) { if (change.ch) { const chWidth = getCharacterWidth(change.ch); - const xCharacterOffset = xInSection % 2; + const xCharacterOffset = xInSection % chWidth; const offsetAdjustedXInSection = xInSection - xCharacterOffset; section.ch[yInSection][offsetAdjustedXInSection] = change.ch; section.width[yInSection][offsetAdjustedXInSection] = chWidth; diff --git a/tests/board.test.ts b/tests/board.test.ts index ecedc47..7e15725 100644 --- a/tests/board.test.ts +++ b/tests/board.test.ts @@ -51,11 +51,13 @@ Deno.test("board", async (t) => { applyChangeOnBoard({ x: 4, y: 0, ch: "B" }, board); applyChangeOnBoard({ x: 0, y: 3, ch: "C" }, board); applyChangeOnBoard({ x: 4, y: 3, ch: "D" }, board); + applyChangeOnBoard({ x: 5, y: 3, ch: "E" }, board); assertEquals(board.sections[0][0].ch[0][0], "A"); assertEquals(board.sections[0][1].ch[0][0], "B"); assertEquals(board.sections[1][0].ch[0][0], "C"); assertEquals(board.sections[1][1].ch[0][0], "D"); + assertEquals(board.sections[1][1].ch[0][1], "E"); applyChangeOnBoard({ x: 0, y: 1, ch: "你" }, board); applyChangeOnBoard({ x: 4, y: 2, ch: "好" }, board); @@ -65,7 +67,10 @@ Deno.test("board", async (t) => { assertEquals(board.sections[0][0].ch[1][0], "你"); assertEquals(board.sections[0][1].ch[2][0], "好"); assertEquals(board.sections[1][0].ch[1][0], "嗎"); - assertEquals(board.sections[1][1].ch[2][0], "嘛"); + assertEquals(board.sections[1][1].ch[2], ["嘛", "E", " ", " "]); + + applyChangeOnBoard({ x: 5, y: 4, ch: "啊" }, board); + assertEquals(board.sections[1][1].ch[2], ["啊", "E", " ", " "]); }); await t.step("getSectionOnBoard: existing section", () => { @@ -74,7 +79,7 @@ Deno.test("board", async (t) => { const section = getSectionOnBoard({ sx: 1, sy: 1 }, board, { readOnly: true, }); - assertEquals(section.ch[0][0], "嘛"); + assertEquals(section.ch[0][0], "啊"); assertEquals(section.color[0][0], "F"); assertEquals(section.bgColor[0][0], "0"); assertEquals(section.width[0][0], 2); diff --git a/tests/section.test.ts b/tests/section.test.ts index 8a5a139..07999f7 100644 --- a/tests/section.test.ts +++ b/tests/section.test.ts @@ -90,27 +90,32 @@ Deno.test("section", async (t) => { assert(section); applyChange({ x: 0, y: 0, ch: "t" }, section); - assertEquals(section.ch[0][0], "t"); - assertEquals(section.ch[0][1], " "); - assertEquals(section.width[0][0], 1); + assertEquals(section.ch[0], ["t", " ", " ", " "]); + assertEquals(section.width[0], [1, 1, 1, 1]); + }); + + await t.step("applyChange 1-width at odd position", () => { + assert(section); + + applyChange({ x: 1, y: 0, ch: "t" }, section); + assertEquals(section.ch[0], ["t", "t", " ", " "]); + assertEquals(section.width[0], [1, 1, 1, 1]); }); await t.step("applyChange 2-width at a correct position", () => { assert(section); applyChange({ x: 0, y: 0, ch: "あ" }, section); - assertEquals(section.ch[0][0], "あ"); - assertEquals(section.ch[0][1], " "); - assertEquals(section.width[0][0], 2); + assertEquals(section.ch[0], ["あ", "t", " ", " "]); + assertEquals(section.width[0], [2, 1, 1, 1]); }); await t.step("applyChange 2-width at an alternate position", () => { assert(section); applyChange({ x: 1, y: 0, ch: "あ" }, section); - assertEquals(section.ch[0][0], "あ"); - assertEquals(section.ch[0][1], " "); - assertEquals(section.width[0][0], 2); + assertEquals(section.ch[0], ["あ", "t", " ", " "]); + assertEquals(section.width[0], [2, 1, 1, 1]); }); await t.step("applyChange incorrect section", () => { From 587e0558e90dfaca571f1df2ba1759d84f041b02 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Sun, 29 Dec 2024 22:43:36 +0800 Subject: [PATCH 02/19] fix: 0.3.1 --- deno.json | 2 +- logic/board.ts | 8 ++++---- tests/board.test.ts | 4 ++-- tests/checkFullBoard.ts | 5 +++++ 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/deno.json b/deno.json index 14c2394..95d1901 100644 --- a/deno.json +++ b/deno.json @@ -1,6 +1,6 @@ { "name": "@textplace/core", - "version": "0.3.0", + "version": "0.3.1", "exports": "./mod.ts", "imports": { "@deno/dnt": "jsr:@deno/dnt@^0.41.3" diff --git a/logic/board.ts b/logic/board.ts index 9dcb312..0436cdc 100644 --- a/logic/board.ts +++ b/logic/board.ts @@ -106,9 +106,9 @@ export function renderFullBoard(data: BoardData): FullBoard { return { w: lineLength, h: totalLineCount, - ch: ([] as string[]).concat(...chLines).flat(), - color: ([] as string[]).concat(...colorLines).flat(), - bg_color: ([] as string[]).concat(...bgColorLines).flat(), - width: ([] as number[]).concat(...widthLines).flat(), + ch: chLines.flat(), + color: colorLines.flat(), + bg_color: bgColorLines.flat(), + width: widthLines.flat(), }; } diff --git a/tests/board.test.ts b/tests/board.test.ts index 7e15725..886a2f4 100644 --- a/tests/board.test.ts +++ b/tests/board.test.ts @@ -119,7 +119,7 @@ Deno.test("board", async (t) => { await t.step("on-demand creation: only changed sections are saved", () => { assert(board); - assertEquals(board.sections.length, 2); - assertEquals(board.sections[0].length, 2); + assertEquals(board.sections[2], undefined); + assertEquals(board.sections[0][2], undefined); }); }); diff --git a/tests/checkFullBoard.ts b/tests/checkFullBoard.ts index 9984249..9484c40 100644 --- a/tests/checkFullBoard.ts +++ b/tests/checkFullBoard.ts @@ -47,6 +47,11 @@ export function checkFullBoard(board: FullBoard) { console.error("width: ", widthLine); }; + if (typeof cCh !== "string") { + printSituation(); + throw new Error("cCh is not string"); + } + if (!isValidColor(cCo) || !isValidColor(cBg)) { printSituation(); throw new Error("cCo or cBg is not valid"); From 46a647441bbc95eb97f737e90fb62874429699d7 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Sun, 29 Dec 2024 23:13:00 +0800 Subject: [PATCH 03/19] fix: fill with reference --- logic/section.ts | 16 ++++++++-------- tests/board.test.ts | 11 +++++------ tests/section.test.ts | 1 + 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/logic/section.ts b/logic/section.ts index f2463ff..32256a6 100644 --- a/logic/section.ts +++ b/logic/section.ts @@ -16,17 +16,17 @@ export function createSection( const offsetX = sx * boardConfig.sectionWidth; const offsetY = sy * boardConfig.sectionHeight; - const ch: string[][] = Array(boardConfig.sectionHeight).fill( - Array(boardConfig.sectionWidth).fill(boardConfig.defaultCh), + const ch: string[][] = Array(boardConfig.sectionHeight).fill([]).map(() => + Array(boardConfig.sectionWidth).fill(boardConfig.defaultCh) ); - const color: string[][] = Array(boardConfig.sectionHeight).fill( - Array(boardConfig.sectionWidth).fill(boardConfig.defaultColor), + const color: string[][] = Array(boardConfig.sectionHeight).fill([]).map(() => + Array(boardConfig.sectionWidth).fill(boardConfig.defaultColor) ); - const bgColor: string[][] = Array(boardConfig.sectionHeight).fill( - Array(boardConfig.sectionWidth).fill(boardConfig.defaultBgColor), + const bgColor: string[][] = Array(boardConfig.sectionHeight).fill([]).map( + () => Array(boardConfig.sectionWidth).fill(boardConfig.defaultBgColor) ); - const width: number[][] = Array(boardConfig.sectionHeight).fill( - Array(boardConfig.sectionWidth).fill(boardConfig.defaultWidth), + const width: number[][] = Array(boardConfig.sectionHeight).fill([]).map(() => + Array(boardConfig.sectionWidth).fill(boardConfig.defaultWidth) ); return { offsetX, offsetY, ch, color, bgColor, width }; diff --git a/tests/board.test.ts b/tests/board.test.ts index 886a2f4..735bf32 100644 --- a/tests/board.test.ts +++ b/tests/board.test.ts @@ -56,8 +56,7 @@ Deno.test("board", async (t) => { assertEquals(board.sections[0][0].ch[0][0], "A"); assertEquals(board.sections[0][1].ch[0][0], "B"); assertEquals(board.sections[1][0].ch[0][0], "C"); - assertEquals(board.sections[1][1].ch[0][0], "D"); - assertEquals(board.sections[1][1].ch[0][1], "E"); + assertEquals(board.sections[1][1].ch[0], ["D", "E", " ", " "]); applyChangeOnBoard({ x: 0, y: 1, ch: "你" }, board); applyChangeOnBoard({ x: 4, y: 2, ch: "好" }, board); @@ -67,10 +66,10 @@ Deno.test("board", async (t) => { assertEquals(board.sections[0][0].ch[1][0], "你"); assertEquals(board.sections[0][1].ch[2][0], "好"); assertEquals(board.sections[1][0].ch[1][0], "嗎"); - assertEquals(board.sections[1][1].ch[2], ["嘛", "E", " ", " "]); + assertEquals(board.sections[1][1].ch[1], ["嘛", " ", " ", " "]); applyChangeOnBoard({ x: 5, y: 4, ch: "啊" }, board); - assertEquals(board.sections[1][1].ch[2], ["啊", "E", " ", " "]); + assertEquals(board.sections[1][1].ch[1], ["啊", " ", " ", " "]); }); await t.step("getSectionOnBoard: existing section", () => { @@ -79,10 +78,10 @@ Deno.test("board", async (t) => { const section = getSectionOnBoard({ sx: 1, sy: 1 }, board, { readOnly: true, }); - assertEquals(section.ch[0][0], "啊"); + assertEquals(section.ch[0], ["D", "E", " ", " "]); assertEquals(section.color[0][0], "F"); assertEquals(section.bgColor[0][0], "0"); - assertEquals(section.width[0][0], 2); + assertEquals(section.width[0], [1, 1, 1, 1]); }); await t.step("getSectionOnBoard: non-existing row", () => { diff --git a/tests/section.test.ts b/tests/section.test.ts index 07999f7..a70da5b 100644 --- a/tests/section.test.ts +++ b/tests/section.test.ts @@ -91,6 +91,7 @@ Deno.test("section", async (t) => { applyChange({ x: 0, y: 0, ch: "t" }, section); assertEquals(section.ch[0], ["t", " ", " ", " "]); + assertEquals(section.ch[1], [" ", " ", " ", " "]); assertEquals(section.width[0], [1, 1, 1, 1]); }); From 645b7202222cf277f19c83c486cb5ec87d63c2f7 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Sun, 29 Dec 2024 23:13:14 +0800 Subject: [PATCH 04/19] chore: add test watch mode to zed command --- .zed/tasks.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.zed/tasks.json b/.zed/tasks.json index 4868825..34420e6 100644 --- a/.zed/tasks.json +++ b/.zed/tasks.json @@ -1,9 +1,10 @@ -// Static tasks configuration. -// -// Example: [ { "label": "Test", "command": "deno test" + }, + { + "label": "Test - Watch", + "command": "deno test --watch" } ] From 97ad480ad8dc24cc5e33a1a041d3a2d161cadcfd Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Sun, 29 Dec 2024 23:13:27 +0800 Subject: [PATCH 05/19] 0.3.2 --- deno.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deno.json b/deno.json index 95d1901..948c947 100644 --- a/deno.json +++ b/deno.json @@ -1,6 +1,6 @@ { "name": "@textplace/core", - "version": "0.3.1", + "version": "0.3.2", "exports": "./mod.ts", "imports": { "@deno/dnt": "jsr:@deno/dnt@^0.41.3" From 8940f26f179e68759de56b05abbcad505972793e Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Sun, 29 Dec 2024 23:14:43 +0800 Subject: [PATCH 06/19] fix: format --- logic/section.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/logic/section.ts b/logic/section.ts index 32256a6..c3f976c 100644 --- a/logic/section.ts +++ b/logic/section.ts @@ -23,7 +23,7 @@ export function createSection( Array(boardConfig.sectionWidth).fill(boardConfig.defaultColor) ); const bgColor: string[][] = Array(boardConfig.sectionHeight).fill([]).map( - () => Array(boardConfig.sectionWidth).fill(boardConfig.defaultBgColor) + () => Array(boardConfig.sectionWidth).fill(boardConfig.defaultBgColor), ); const width: number[][] = Array(boardConfig.sectionHeight).fill([]).map(() => Array(boardConfig.sectionWidth).fill(boardConfig.defaultWidth) From 4dd8121ebb60c023465199d565557699cf70fea6 Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Tue, 28 Jan 2025 14:31:14 +0800 Subject: [PATCH 07/19] feat: support any unicode grapheme clusters. --- deno.json | 5 +++-- deno.lock | 7 ++++++- logic/character.ts | 13 +++---------- tests/character.test.ts | 6 ++---- 4 files changed, 14 insertions(+), 17 deletions(-) diff --git a/deno.json b/deno.json index 948c947..2ac2e2b 100644 --- a/deno.json +++ b/deno.json @@ -1,8 +1,9 @@ { "name": "@textplace/core", - "version": "0.3.2", + "version": "0.4.0", "exports": "./mod.ts", "imports": { - "@deno/dnt": "jsr:@deno/dnt@^0.41.3" + "@deno/dnt": "jsr:@deno/dnt@^0.41.3", + "@std/cli": "jsr:@std/cli@^1.0.11" } } diff --git a/deno.lock b/deno.lock index 491b9f0..afae4c4 100644 --- a/deno.lock +++ b/deno.lock @@ -7,6 +7,7 @@ "jsr:@std/assert@0.223": "0.223.0", "jsr:@std/assert@0.226": "0.226.0", "jsr:@std/bytes@0.223": "0.223.0", + "jsr:@std/cli@^1.0.11": "1.0.11", "jsr:@std/fmt@0.223": "0.223.0", "jsr:@std/fmt@1": "1.0.3", "jsr:@std/fs@0.223": "0.223.0", @@ -54,6 +55,9 @@ "@std/bytes@0.223.0": { "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" }, + "@std/cli@1.0.11": { + "integrity": "ec219619fdcd31bcf0d8e53bee1e2706ec9a02f70255365a094f69755dadd340" + }, "@std/fmt@0.223.0": { "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" }, @@ -151,7 +155,8 @@ }, "workspace": { "dependencies": [ - "jsr:@deno/dnt@~0.41.3" + "jsr:@deno/dnt@~0.41.3", + "jsr:@std/cli@^1.0.11" ] } } diff --git a/logic/character.ts b/logic/character.ts index d1b9f69..074001d 100644 --- a/logic/character.ts +++ b/logic/character.ts @@ -1,7 +1,6 @@ +import { unicodeWidth } from "@std/cli/unicode-width"; + const segmenter = new Intl.Segmenter("en", { granularity: "grapheme" }); -const cjkRegex = - /[\p{Unified_Ideograph}\u30A0-\u30FF\u3040-\u309F\u31F0-\u31FF]/u; -const printableASCIIRegex = /^[\x20-\x7E]$/; export function getCharacterWidth(ch: string): number { const segments = [...segmenter.segment(ch)]; @@ -11,11 +10,5 @@ export function getCharacterWidth(ch: string): number { ); } - const matchesASCII = ch.match(printableASCIIRegex); - const matchesCJK = ch.match(cjkRegex); - - if (!matchesASCII && !matchesCJK) throw new Error(`Invalid character: ${ch}`); - - // TODO: Support Emojis. - return matchesCJK ? 2 : 1; + return unicodeWidth(ch); } diff --git a/tests/character.test.ts b/tests/character.test.ts index 886d7ad..d1330f9 100644 --- a/tests/character.test.ts +++ b/tests/character.test.ts @@ -26,14 +26,12 @@ Deno.test("getCharacterWidth CJK", () => { assertEquals(getCharacterWidth("グ"), 2); assertEquals(getCharacterWidth("ソ"), 2); - assertThrows(() => getCharacterWidth("?")); - assertThrows(() => getCharacterWidth("!")); + assertEquals(getCharacterWidth("?"), 2); + assertEquals(getCharacterWidth("!"), 2); assertThrows(() => getCharacterWidth("你好")); assertThrows(() => getCharacterWidth("ヨスガノ")); }); Deno.test("getCharacterWidth previously faulty cases", () => { assertEquals(getCharacterWidth("𤲶"), 2); - - assertThrows(() => getCharacterWidth("𤲶"[0])); }); From 7923680e80d395ab1bdae7019348cdf932dd69ce Mon Sep 17 00:00:00 2001 From: Shibo Lyu Date: Tue, 28 Jan 2025 17:21:59 +0800 Subject: [PATCH 08/19] fix: dirty fix for char width --- deno.json | 2 +- logic/character.ts | 3 ++- tests/character.test.ts | 6 ++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/deno.json b/deno.json index 2ac2e2b..ffdf2b3 100644 --- a/deno.json +++ b/deno.json @@ -1,6 +1,6 @@ { "name": "@textplace/core", - "version": "0.4.0", + "version": "0.4.1", "exports": "./mod.ts", "imports": { "@deno/dnt": "jsr:@deno/dnt@^0.41.3", diff --git a/logic/character.ts b/logic/character.ts index 074001d..2d58dac 100644 --- a/logic/character.ts +++ b/logic/character.ts @@ -10,5 +10,6 @@ export function getCharacterWidth(ch: string): number { ); } - return unicodeWidth(ch); + // TODO: Properly fix this. + return Math.min(unicodeWidth(ch), 2); } diff --git a/tests/character.test.ts b/tests/character.test.ts index d1330f9..c8e3a65 100644 --- a/tests/character.test.ts +++ b/tests/character.test.ts @@ -32,6 +32,12 @@ Deno.test("getCharacterWidth CJK", () => { assertThrows(() => getCharacterWidth("ヨスガノ")); }); +Deno.test("getCharacterWidth Emoji", () => { + assertEquals(getCharacterWidth("👋"), 2); + assertEquals(getCharacterWidth("🌲️"), 2); + assertEquals(getCharacterWidth("👨‍👩‍👧‍👦"), 2); +}); + Deno.test("getCharacterWidth previously faulty cases", () => { assertEquals(getCharacterWidth("𤲶"), 2); }); From 32534084df354696a5f8b6ef0b54fcc041b0dd38 Mon Sep 17 00:00:00 2001 From: laosb Date: Sat, 29 Nov 2025 19:11:49 +0800 Subject: [PATCH 09/19] refactor: Migrate project from Deno to pnpm/Node Replace Deno configs and workflows with pnpm/Node tooling Add package.json, jsr.json, build.config.ts and pnpm-lock.yaml Remove deno.json, deno.lock, Deno build scripts and workflow Move source files into src/ and update imports and tests to vitest Add Test CI workflow and adapt publish jobs for pnpm/node Update editor settings, tasks, .gitignore and bump LICENSE year --- .github/workflows/deno.yml | 41 - .github/workflows/publish_jsr.yml | 2 +- .github/workflows/publish_npm.yml | 16 +- .github/workflows/test.yml | 32 + .gitignore | 3 +- .zed/settings.json | 21 +- .zed/tasks.json | 6 +- LICENSE | 2 +- build.config.ts | 5 + deno.json | 9 - deno.lock | 162 --- jsr.json | 6 + package.json | 34 + pnpm-lock.yaml | 1905 +++++++++++++++++++++++++++++ scripts/build_npm.ts | 36 - {logic => src/logic}/board.ts | 0 {logic => src/logic}/character.ts | 0 {logic => src/logic}/section.ts | 0 mod.ts => src/mod.ts | 0 {types => src/types}/board.ts | 0 {types => src/types}/change.ts | 0 {types => src/types}/section.ts | 0 tests/board.test.ts | 131 +- tests/character.test.ts | 59 +- tests/checkFullBoard.ts | 4 +- tests/section.test.ts | 88 +- 26 files changed, 2132 insertions(+), 430 deletions(-) delete mode 100644 .github/workflows/deno.yml create mode 100644 .github/workflows/test.yml create mode 100644 build.config.ts delete mode 100644 deno.json delete mode 100644 deno.lock create mode 100644 jsr.json create mode 100644 package.json create mode 100644 pnpm-lock.yaml delete mode 100644 scripts/build_npm.ts rename {logic => src/logic}/board.ts (100%) rename {logic => src/logic}/character.ts (100%) rename {logic => src/logic}/section.ts (100%) rename mod.ts => src/mod.ts (100%) rename {types => src/types}/board.ts (100%) rename {types => src/types}/change.ts (100%) rename {types => src/types}/section.ts (100%) diff --git a/.github/workflows/deno.yml b/.github/workflows/deno.yml deleted file mode 100644 index f0998d8..0000000 --- a/.github/workflows/deno.yml +++ /dev/null @@ -1,41 +0,0 @@ -# This workflow uses actions that are not certified by GitHub. -# They are provided by a third-party and are governed by -# separate terms of service, privacy policy, and support -# documentation. - -# This workflow will install Deno then run `deno lint` and `deno test`. -# For more information see: https://github.com/denoland/setup-deno - -name: Deno - -on: - push: - branches: ["main"] - pull_request: - branches: ["main"] - -permissions: - contents: read - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Setup repo - uses: actions/checkout@v4 - - - name: Setup Deno - uses: denoland/setup-deno@v2 - with: - deno-version: v2.x - - # Uncomment this step to verify the use of 'deno fmt' on each commit. - - name: Verify formatting - run: deno fmt --check - - - name: Run linter - run: deno lint - - - name: Run tests - run: deno test -A diff --git a/.github/workflows/publish_jsr.yml b/.github/workflows/publish_jsr.yml index 0ee3654..2480461 100644 --- a/.github/workflows/publish_jsr.yml +++ b/.github/workflows/publish_jsr.yml @@ -1,7 +1,7 @@ name: Publish on JSR on: workflow_run: - workflows: ["Deno"] + workflows: ["Test"] types: [completed] branches: - "main" diff --git a/.github/workflows/publish_npm.yml b/.github/workflows/publish_npm.yml index 6d8c23b..5b8de40 100644 --- a/.github/workflows/publish_npm.yml +++ b/.github/workflows/publish_npm.yml @@ -9,18 +9,18 @@ jobs: contents: read id-token: write steps: - - uses: actions/checkout@v4 - - name: Setup Deno - uses: denoland/setup-deno@v2 + - uses: pnpm/action-setup@v4 with: - deno-version: v2.x + run_install: false # Setup .npmrc file to publish to npm - uses: actions/setup-node@v4 with: - node-version: "22.x" + node-version: "24.x" + cache: "pnpm" registry-url: "https://registry.npmjs.org" - - run: deno run -A scripts/build_npm.ts - - run: cd npm && npm ci - - run: cd npm && npm publish --provenance --access public + - run: pnpm install + - run: pnpm build + - run: pnpm test + - run: pnpm publish --provenance --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..8600ce4 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,32 @@ +name: Test + +on: + push: + branches: ["main"] + pull_request: + branches: ["main"] + +permissions: + contents: read + +jobs: + test: + runs-on: ubuntu-latest + + steps: + - name: Setup repo + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + run_install: false + - uses: actions/setup-node@v4 + with: + node-version: "24.x" + cache: "pnpm" + + - name: Install dependencies + run: pnpm install + + - name: Run tests + run: pnpm test diff --git a/.gitignore b/.gitignore index bad76e5..8d67a86 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ -npm .DS_Store +node_modules +dist diff --git a/.zed/settings.json b/.zed/settings.json index 14b3761..017a870 100644 --- a/.zed/settings.json +++ b/.zed/settings.json @@ -3,25 +3,6 @@ // For a full list of overridable settings, and general information on folder-specific settings, // see the documentation: https://zed.dev/docs/configuring-zed#folder-specific-settings { - "languages": { - "TypeScript": { - "language_servers": ["deno", "!typescript-language-server", "!eslint"], - "formatter": { - "external": { - "command": "deno", - "arguments": ["fmt", "-"] - } - } - }, - "TSX": { - "language_servers": ["deno", "!typescript-language-server", "!eslint"], - "formatter": { - "external": { - "command": "deno", - "arguments": ["fmt", "-"] - } - } - } - }, + "formatter": "prettier", "format_on_save": "on" } diff --git a/.zed/tasks.json b/.zed/tasks.json index 34420e6..0698fbd 100644 --- a/.zed/tasks.json +++ b/.zed/tasks.json @@ -1,10 +1,6 @@ [ { "label": "Test", - "command": "deno test" - }, - { - "label": "Test - Watch", - "command": "deno test --watch" + "command": "pnpm test" } ] diff --git a/LICENSE b/LICENSE index 80f95df..538e18d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,5 +1,5 @@ The MIT License (MIT) -Copyright © 2024 Shibo Lyu +Copyright © 2025 Shibo Lyu Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: diff --git a/build.config.ts b/build.config.ts new file mode 100644 index 0000000..2b9dc6f --- /dev/null +++ b/build.config.ts @@ -0,0 +1,5 @@ +import { defineBuildConfig } from "obuild/config"; + +export default defineBuildConfig({ + entries: ["mod.ts"], +}); diff --git a/deno.json b/deno.json deleted file mode 100644 index ffdf2b3..0000000 --- a/deno.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@textplace/core", - "version": "0.4.1", - "exports": "./mod.ts", - "imports": { - "@deno/dnt": "jsr:@deno/dnt@^0.41.3", - "@std/cli": "jsr:@std/cli@^1.0.11" - } -} diff --git a/deno.lock b/deno.lock deleted file mode 100644 index afae4c4..0000000 --- a/deno.lock +++ /dev/null @@ -1,162 +0,0 @@ -{ - "version": "4", - "specifiers": { - "jsr:@david/code-block-writer@^13.0.2": "13.0.3", - "jsr:@deno/cache-dir@~0.10.3": "0.10.3", - "jsr:@deno/dnt@~0.41.3": "0.41.3", - "jsr:@std/assert@0.223": "0.223.0", - "jsr:@std/assert@0.226": "0.226.0", - "jsr:@std/bytes@0.223": "0.223.0", - "jsr:@std/cli@^1.0.11": "1.0.11", - "jsr:@std/fmt@0.223": "0.223.0", - "jsr:@std/fmt@1": "1.0.3", - "jsr:@std/fs@0.223": "0.223.0", - "jsr:@std/fs@1": "1.0.6", - "jsr:@std/fs@~0.229.3": "0.229.3", - "jsr:@std/io@0.223": "0.223.0", - "jsr:@std/path@0.223": "0.223.0", - "jsr:@std/path@1": "1.0.8", - "jsr:@std/path@1.0.0-rc.1": "1.0.0-rc.1", - "jsr:@std/path@^1.0.8": "1.0.8", - "jsr:@std/path@~0.225.2": "0.225.2", - "jsr:@ts-morph/bootstrap@0.24": "0.24.0", - "jsr:@ts-morph/common@0.24": "0.24.0" - }, - "jsr": { - "@david/code-block-writer@13.0.3": { - "integrity": "f98c77d320f5957899a61bfb7a9bead7c6d83ad1515daee92dbacc861e13bb7f" - }, - "@deno/cache-dir@0.10.3": { - "integrity": "eb022f84ecc49c91d9d98131c6e6b118ff63a29e343624d058646b9d50404776", - "dependencies": [ - "jsr:@std/fmt@0.223", - "jsr:@std/fs@0.223", - "jsr:@std/io", - "jsr:@std/path@0.223" - ] - }, - "@deno/dnt@0.41.3": { - "integrity": "b2ef2c8a5111eef86cb5bfcae103d6a2938e8e649e2461634a7befb7fc59d6d2", - "dependencies": [ - "jsr:@david/code-block-writer", - "jsr:@deno/cache-dir", - "jsr:@std/fmt@1", - "jsr:@std/fs@1", - "jsr:@std/path@1", - "jsr:@ts-morph/bootstrap" - ] - }, - "@std/assert@0.223.0": { - "integrity": "eb8d6d879d76e1cc431205bd346ed4d88dc051c6366365b1af47034b0670be24" - }, - "@std/assert@0.226.0": { - "integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3" - }, - "@std/bytes@0.223.0": { - "integrity": "84b75052cd8680942c397c2631318772b295019098f40aac5c36cead4cba51a8" - }, - "@std/cli@1.0.11": { - "integrity": "ec219619fdcd31bcf0d8e53bee1e2706ec9a02f70255365a094f69755dadd340" - }, - "@std/fmt@0.223.0": { - "integrity": "6deb37794127dfc7d7bded2586b9fc6f5d50e62a8134846608baf71ffc1a5208" - }, - "@std/fmt@1.0.3": { - "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" - }, - "@std/fs@0.223.0": { - "integrity": "3b4b0550b2c524cbaaa5a9170c90e96cbb7354e837ad1bdaf15fc9df1ae9c31c" - }, - "@std/fs@0.229.3": { - "integrity": "783bca21f24da92e04c3893c9e79653227ab016c48e96b3078377ebd5222e6eb", - "dependencies": [ - "jsr:@std/path@1.0.0-rc.1" - ] - }, - "@std/fs@1.0.6": { - "integrity": "42b56e1e41b75583a21d5a37f6a6a27de9f510bcd36c0c85791d685ca0b85fa2", - "dependencies": [ - "jsr:@std/path@^1.0.8" - ] - }, - "@std/io@0.223.0": { - "integrity": "2d8c3c2ab3a515619b90da2c6ff5ea7b75a94383259ef4d02116b228393f84f1", - "dependencies": [ - "jsr:@std/assert@0.223", - "jsr:@std/bytes" - ] - }, - "@std/path@0.223.0": { - "integrity": "593963402d7e6597f5a6e620931661053572c982fc014000459edc1f93cc3989", - "dependencies": [ - "jsr:@std/assert@0.223" - ] - }, - "@std/path@0.225.2": { - "integrity": "0f2db41d36b50ef048dcb0399aac720a5348638dd3cb5bf80685bf2a745aa506", - "dependencies": [ - "jsr:@std/assert@0.226" - ] - }, - "@std/path@1.0.0-rc.1": { - "integrity": "b8c00ae2f19106a6bb7cbf1ab9be52aa70de1605daeb2dbdc4f87a7cbaf10ff6" - }, - "@std/path@1.0.8": { - "integrity": "548fa456bb6a04d3c1a1e7477986b6cffbce95102d0bb447c67c4ee70e0364be" - }, - "@ts-morph/bootstrap@0.24.0": { - "integrity": "a826a2ef7fa8a7c3f1042df2c034d20744d94da2ee32bf29275bcd4dffd3c060", - "dependencies": [ - "jsr:@ts-morph/common" - ] - }, - "@ts-morph/common@0.24.0": { - "integrity": "12b625b8e562446ba658cdbe9ad77774b4bd96b992ae8bd34c60dbf24d06c1f3", - "dependencies": [ - "jsr:@std/fs@~0.229.3", - "jsr:@std/path@~0.225.2" - ] - } - }, - "remote": { - "https://deno.land/std@0.224.0/assert/_constants.ts": "a271e8ef5a573f1df8e822a6eb9d09df064ad66a4390f21b3e31f820a38e0975", - "https://deno.land/std@0.224.0/assert/assert.ts": "09d30564c09de846855b7b071e62b5974b001bb72a4b797958fe0660e7849834", - "https://deno.land/std@0.224.0/assert/assert_almost_equals.ts": "9e416114322012c9a21fa68e187637ce2d7df25bcbdbfd957cd639e65d3cf293", - "https://deno.land/std@0.224.0/assert/assert_array_includes.ts": "14c5094471bc8e4a7895fc6aa5a184300d8a1879606574cb1cd715ef36a4a3c7", - "https://deno.land/std@0.224.0/assert/assert_equals.ts": "3bbca947d85b9d374a108687b1a8ba3785a7850436b5a8930d81f34a32cb8c74", - "https://deno.land/std@0.224.0/assert/assert_exists.ts": "43420cf7f956748ae6ed1230646567b3593cb7a36c5a5327269279c870c5ddfd", - "https://deno.land/std@0.224.0/assert/assert_false.ts": "3e9be8e33275db00d952e9acb0cd29481a44fa0a4af6d37239ff58d79e8edeff", - "https://deno.land/std@0.224.0/assert/assert_greater.ts": "5e57b201fd51b64ced36c828e3dfd773412c1a6120c1a5a99066c9b261974e46", - "https://deno.land/std@0.224.0/assert/assert_greater_or_equal.ts": "9870030f997a08361b6f63400273c2fb1856f5db86c0c3852aab2a002e425c5b", - "https://deno.land/std@0.224.0/assert/assert_instance_of.ts": "e22343c1fdcacfaea8f37784ad782683ec1cf599ae9b1b618954e9c22f376f2c", - "https://deno.land/std@0.224.0/assert/assert_is_error.ts": "f856b3bc978a7aa6a601f3fec6603491ab6255118afa6baa84b04426dd3cc491", - "https://deno.land/std@0.224.0/assert/assert_less.ts": "60b61e13a1982865a72726a5fa86c24fad7eb27c3c08b13883fb68882b307f68", - "https://deno.land/std@0.224.0/assert/assert_less_or_equal.ts": "d2c84e17faba4afe085e6c9123a63395accf4f9e00150db899c46e67420e0ec3", - "https://deno.land/std@0.224.0/assert/assert_match.ts": "ace1710dd3b2811c391946954234b5da910c5665aed817943d086d4d4871a8b7", - "https://deno.land/std@0.224.0/assert/assert_not_equals.ts": "78d45dd46133d76ce624b2c6c09392f6110f0df9b73f911d20208a68dee2ef29", - "https://deno.land/std@0.224.0/assert/assert_not_instance_of.ts": "3434a669b4d20cdcc5359779301a0588f941ffdc2ad68803c31eabdb4890cf7a", - "https://deno.land/std@0.224.0/assert/assert_not_match.ts": "df30417240aa2d35b1ea44df7e541991348a063d9ee823430e0b58079a72242a", - "https://deno.land/std@0.224.0/assert/assert_not_strict_equals.ts": "37f73880bd672709373d6dc2c5f148691119bed161f3020fff3548a0496f71b8", - "https://deno.land/std@0.224.0/assert/assert_object_match.ts": "411450fd194fdaabc0089ae68f916b545a49d7b7e6d0026e84a54c9e7eed2693", - "https://deno.land/std@0.224.0/assert/assert_rejects.ts": "4bee1d6d565a5b623146a14668da8f9eb1f026a4f338bbf92b37e43e0aa53c31", - "https://deno.land/std@0.224.0/assert/assert_strict_equals.ts": "b4f45f0fd2e54d9029171876bd0b42dd9ed0efd8f853ab92a3f50127acfa54f5", - "https://deno.land/std@0.224.0/assert/assert_string_includes.ts": "496b9ecad84deab72c8718735373feb6cdaa071eb91a98206f6f3cb4285e71b8", - "https://deno.land/std@0.224.0/assert/assert_throws.ts": "c6508b2879d465898dab2798009299867e67c570d7d34c90a2d235e4553906eb", - "https://deno.land/std@0.224.0/assert/assertion_error.ts": "ba8752bd27ebc51f723702fac2f54d3e94447598f54264a6653d6413738a8917", - "https://deno.land/std@0.224.0/assert/equal.ts": "bddf07bb5fc718e10bb72d5dc2c36c1ce5a8bdd3b647069b6319e07af181ac47", - "https://deno.land/std@0.224.0/assert/fail.ts": "0eba674ffb47dff083f02ced76d5130460bff1a9a68c6514ebe0cdea4abadb68", - "https://deno.land/std@0.224.0/assert/mod.ts": "48b8cb8a619ea0b7958ad7ee9376500fe902284bb36f0e32c598c3dc34cbd6f3", - "https://deno.land/std@0.224.0/assert/unimplemented.ts": "8c55a5793e9147b4f1ef68cd66496b7d5ba7a9e7ca30c6da070c1a58da723d73", - "https://deno.land/std@0.224.0/assert/unreachable.ts": "5ae3dbf63ef988615b93eb08d395dda771c96546565f9e521ed86f6510c29e19", - "https://deno.land/std@0.224.0/fmt/colors.ts": "508563c0659dd7198ba4bbf87e97f654af3c34eb56ba790260f252ad8012e1c5", - "https://deno.land/std@0.224.0/internal/diff.ts": "6234a4b493ebe65dc67a18a0eb97ef683626a1166a1906232ce186ae9f65f4e6", - "https://deno.land/std@0.224.0/internal/format.ts": "0a98ee226fd3d43450245b1844b47003419d34d210fa989900861c79820d21c2", - "https://deno.land/std@0.224.0/internal/mod.ts": "534125398c8e7426183e12dc255bb635d94e06d0f93c60a297723abe69d3b22e" - }, - "workspace": { - "dependencies": [ - "jsr:@deno/dnt@~0.41.3", - "jsr:@std/cli@^1.0.11" - ] - } -} diff --git a/jsr.json b/jsr.json new file mode 100644 index 0000000..ab18bfe --- /dev/null +++ b/jsr.json @@ -0,0 +1,6 @@ +{ + "name": "@textplace/core", + "version": "0.5.0", + "exports": "./src/mod.ts", + "include": ["src/**/*.ts", "LICENSE", "README.md"] +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..4f6fe91 --- /dev/null +++ b/package.json @@ -0,0 +1,34 @@ +{ + "name": "@textplace/core", + "version": "0.5.0", + "description": "The core logic of TextPlace.", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TextPlace/CoreTextPlace" + }, + "bugs": { + "url": "https://github.com/TextPlace/CoreTextPlace/issues" + }, + "scripts": { + "test": "vitest", + "build": "obuild" + }, + "files": [ + "dist" + ], + "exports": { + ".": { + "types": "./dist/mod.d.ts", + "import": "./dist/mod.mjs" + } + }, + "dependencies": { + "@std/cli": "jsr:^1.0.24" + }, + "devDependencies": { + "obuild": "^0.4.3", + "prettier": "^3.7.2", + "vitest": "^4.0.14" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..78622f7 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1905 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@std/cli': + specifier: jsr:^1.0.24 + version: '@jsr/std__cli@1.0.24' + devDependencies: + obuild: + specifier: ^0.4.3 + version: 0.4.3 + prettier: + specifier: ^3.7.2 + version: 3.7.2 + vitest: + specifier: ^4.0.14 + version: 4.0.14(jiti@2.6.1) + +packages: + + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} + engines: {node: '>=6.9.0'} + + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@jsr/std__cli@1.0.24': + resolution: {integrity: sha512-lGBHY8KwqhSR3oh2Hk9U7Sy9v76/KZx0OOkiIVTMr8GW2yMrvhJUVTdteNxvKEYT1eKZKWPZl+3WWpC/9oPBeQ==, tarball: https://npm.jsr.io/~/11/@jsr/std__cli/1.0.24.tgz} + + '@jsr/std__internal@1.0.12': + resolution: {integrity: sha512-6xReMW9p+paJgqoFRpOE2nogJFvzPfaLHLIlyADYjKMUcwDyjKZxryIbgcU+gxiTygn8yCjld1HoI0ET4/iZeA==, tarball: https://npm.jsr.io/~/11/@jsr/std__internal/1.0.12.tgz} + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + + '@oxc-minify/binding-android-arm64@0.99.0': + resolution: {integrity: sha512-pzXEtLKLRoledVGdrJIl0aRR9EWW9Xfs3F6PVvua005NUF93YI6ml6SB50cEIgSmTmqh7rEOZiobjv3Sn5S0vg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-minify/binding-darwin-arm64@0.99.0': + resolution: {integrity: sha512-xVlwgJ9Q8IMEF3Zm0IGYKzuOaRORlcm9Qps98CR2Yki5fEvk7X7J09lrYQ6CFuTW7lNBubXSBNSatpM2NXJGsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-minify/binding-darwin-x64@0.99.0': + resolution: {integrity: sha512-1S1+7PAI+mCyXgjjdY08d5ekhfIUZp7XlEG6qzu6076wlXBf7bTj/eoDsWOstHjNNkBODY/qb2AAWGJC9UJ0GQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-minify/binding-freebsd-x64@0.99.0': + resolution: {integrity: sha512-TuNglAPZv/Pdha5xaWB+TgNmZsjnUH+KftP+jgsNRF644179mcrIhBk/UK8weaeG4/FtJCJMOUWUJ4fUUg/AdQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-minify/binding-linux-arm-gnueabihf@0.99.0': + resolution: {integrity: sha512-OAI2jCLq9a1RVTYSZ9w67rNu2tBDrHkvE62IogyJAU0t3ehAOTimplMV05ppyvNhA1XqvIrG6+t3vuk3pMxyjg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm-musleabihf@0.99.0': + resolution: {integrity: sha512-S9lv9UwuN7z7TAnagcNefqflkQCKhjRX31g0VMOtQ4Qog4r/45BadAYOEDN7LQnTdW83OV8UKG/RdnW9KoUS/Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-minify/binding-linux-arm64-gnu@0.99.0': + resolution: {integrity: sha512-9giyUXQTiZWEbOrHVnih5uM1ILDEtyOgXuC2t/tdg2hFa5s1NqP1BQfYSCCf9/RfZZIAHl9CTMgZGuk3gUJziQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-minify/binding-linux-arm64-musl@0.99.0': + resolution: {integrity: sha512-9xSudEk6YxTtmiUdSLQYJuIo+gui440/pvn0yNu+UoQb1BcZC+rFyDFYYJX5sn34sVaC4WIcUfZHmaoBmQMGlQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-minify/binding-linux-riscv64-gnu@0.99.0': + resolution: {integrity: sha512-tf2jApnCbZ6w8GeVGFjjsdymluG0iQ1rFnf1R5rH0jjjKkNaRs/0kVERVhcNSOlc++BWw9kGOc6+y0f7xMo4bQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-minify/binding-linux-s390x-gnu@0.99.0': + resolution: {integrity: sha512-tJmWcbm5aHBuRWSHxFoFqAibRNzdSj5doWFA4/turVrcjfSMFbiW3aXBzVSXCg6UHabupKee7IknJr4XFU/osA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-minify/binding-linux-x64-gnu@0.99.0': + resolution: {integrity: sha512-2Iq4piS+6i96mTvvvGwhPa2BVfys7ChV2r7Do7lciZSniXwwhQNJ/6yvqsp3hgaVvXhPYfbn9dEGRb1T1wZ5ww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-minify/binding-linux-x64-musl@0.99.0': + resolution: {integrity: sha512-9+PGJxGVfMj5bT+nH70kHu6cFcXkOXBFMxGEpi8IS537/t44fBy87gpPwhJcMd+P0K65bC6dnOHDgtPja7z2Ww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-minify/binding-wasm32-wasi@0.99.0': + resolution: {integrity: sha512-JNhisxctWSXAk78NdPvf+ecrBfnmTOpkVjdW+iZXYPBlzA5Yv4anrbIBBkwRf/3ITsGE9Xaw02/WZTDDU4fVlQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-minify/binding-win32-arm64-msvc@0.99.0': + resolution: {integrity: sha512-Gghv/PBLjlxvqcau4PcX0n7oGYJfdYCG5LkI/y5QEBKGPNwH8oDlhUZIfynHr0WF1wMSqDC5xogiOnDQgugolA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-minify/binding-win32-x64-msvc@0.99.0': + resolution: {integrity: sha512-WD7XK/0vspDXXfbHPz7xSJGzQ1TS8fQdB8DJaq+lmntRvMrdnceMgCDwfve1cZHDELyHu7ZVXqMQunkVmapd2g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-parser/binding-android-arm64@0.99.0': + resolution: {integrity: sha512-V4jhmKXgQQdRnm73F+r3ZY4pUEsijQeSraFeaCGng7abSNJGs76X6l82wHnmjLGFAeY00LWtjcELs7ZmbJ9+lA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-parser/binding-darwin-arm64@0.99.0': + resolution: {integrity: sha512-Rp41nf9zD5FyLZciS9l1GfK8PhYqrD5kEGxyTOA2esTLeAy37rZxetG2E3xteEolAkeb2WDkVrlxPtibeAncMg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-parser/binding-darwin-x64@0.99.0': + resolution: {integrity: sha512-WVonp40fPPxo5Gs0POTI57iEFv485TvNKOHMwZRhigwZRhZY2accEAkYIhei9eswF4HN5B44Wybkz7Gd1Qr/5Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-parser/binding-freebsd-x64@0.99.0': + resolution: {integrity: sha512-H30bjOOttPmG54gAqu6+HzbLEzuNOYO2jZYrIq4At+NtLJwvNhXz28Hf5iEAFZIH/4hMpLkM4VN7uc+5UlNW3Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-parser/binding-linux-arm-gnueabihf@0.99.0': + resolution: {integrity: sha512-0Z/Th0SYqzSRDPs6tk5lQdW0i73UCupnim3dgq2oW0//UdLonV/5wIZCArfKGC7w9y4h8TxgXpgtIyD1kKzzlQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm-musleabihf@0.99.0': + resolution: {integrity: sha512-xo0wqNd5bpbzQVNpAIFbHk1xa+SaS/FGBABCd942SRTnrpxl6GeDj/s1BFaGcTl8MlwlKVMwOcyKrw/2Kdfquw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-parser/binding-linux-arm64-gnu@0.99.0': + resolution: {integrity: sha512-u26I6LKoLTPTd4Fcpr0aoAtjnGf5/ulMllo+QUiBhupgbVCAlaj4RyXH/mvcjcsl2bVBv9E/gYJZz2JjxQWXBA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-arm64-musl@0.99.0': + resolution: {integrity: sha512-qhftDo2D37SqCEl3ZTa367NqWSZNb1Ddp34CTmShLKFrnKdNiUn55RdokLnHtf1AL5ssaQlYDwBECX7XiBWOhw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-parser/binding-linux-riscv64-gnu@0.99.0': + resolution: {integrity: sha512-zxn/xkf519f12FKkpL5XwJipsylfSSnm36h6c1zBDTz4fbIDMGyIhHfWfwM7uUmHo9Aqw1pLxFpY39Etv398+Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-parser/binding-linux-s390x-gnu@0.99.0': + resolution: {integrity: sha512-Y1eSDKDS5E4IVC7Oxw+NbYAKRmJPMJTIjW+9xOWwteDHkFqpocKe0USxog+Q1uhzalD9M0p9eXWEWdGQCMDBMQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-parser/binding-linux-x64-gnu@0.99.0': + resolution: {integrity: sha512-YVJMfk5cFWB8i2/nIrbk6n15bFkMHqWnMIWkVx7r2KwpTxHyFMfu2IpeVKo1ITDSmt5nBrGdLHD36QRlu2nDLg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-linux-x64-musl@0.99.0': + resolution: {integrity: sha512-2+SDPrie5f90A1b9EirtVggOgsqtsYU5raZwkDYKyS1uvJzjqHCDhG/f4TwQxHmIc5YkczdQfwvN91lwmjsKYQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-parser/binding-wasm32-wasi@0.99.0': + resolution: {integrity: sha512-DKA4j0QerUWSMADziLM5sAyM7V53Fj95CV9SjP77bPfEfT7MnvFKnneaRMqPK1cpzjAGiQF52OBUIKyk0dwOQA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-parser/binding-win32-arm64-msvc@0.99.0': + resolution: {integrity: sha512-EaB3AvsxqdNUhh9FOoAxRZ2L4PCRwDlDb//QXItwyOJrX7XS+uGK9B1KEUV4FZ/7rDhHsWieLt5e07wl2Ti5AQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-parser/binding-win32-x64-msvc@0.99.0': + resolution: {integrity: sha512-sJN1Q8h7ggFOyDn0zsHaXbP/MklAVUvhrbq0LA46Qum686P3SZQHjbATqJn9yaVEvaSKXCshgl0vQ1gWkGgpcQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@oxc-project/types@0.98.0': + resolution: {integrity: sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==} + + '@oxc-project/types@0.99.0': + resolution: {integrity: sha512-LLDEhXB7g1m5J+woRSgfKsFPS3LhR9xRhTeIoEBm5WrkwMxn6eZ0Ld0c0K5eHB57ChZX6I3uSmmLjZ8pcjlRcw==} + + '@oxc-transform/binding-android-arm64@0.99.0': + resolution: {integrity: sha512-4hD7MV7ij3HWCFFk47KcnD85idUhkkSNphxkt3r+jgkMV2OfyrGWdVV7Clo2s58g54OtMG1w4ptzxMVHfJdQKg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@oxc-transform/binding-darwin-arm64@0.99.0': + resolution: {integrity: sha512-drx+TT+irDfPx1j9dKOYuFmjla5pkJXhPjtyTV0qFo+XQLw3FID9Vpxhd/GCWR1PmD8/kbiWG1YvBwbDJRFbMg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@oxc-transform/binding-darwin-x64@0.99.0': + resolution: {integrity: sha512-aIElmWT0VWnn9RWWLhwj+BuS09QqTmUQ0UfPHOh7DgLo2bO8WbZfu2i+G9E9JkCZY2jQ6JRfkoyoOn42yY9YvQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@oxc-transform/binding-freebsd-x64@0.99.0': + resolution: {integrity: sha512-RMc62brOr30ha9sH/pOddrYOp8H+LkwdANdOUfW0zzKfQNkwiRJzpN5UCo7n9C8XMrVLLmoHhvjaWg1TPGeqsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@oxc-transform/binding-linux-arm-gnueabihf@0.99.0': + resolution: {integrity: sha512-Np9Hr2rFtE0TqmNghqE0CkxD6w9eTP+VY5q8XqytY4kDajyEqZHzdlrbX4R0V+p61zn88VHvGT3DfWQTwLBG9A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm-musleabihf@0.99.0': + resolution: {integrity: sha512-eXCssXVXQQYUStPahIrYJBBMWllm6nQERqucNu8T5o1Yqu9SzkvndzuWDYoBtz95KpY7mqqcPt/zubY4Wv3RiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@oxc-transform/binding-linux-arm64-gnu@0.99.0': + resolution: {integrity: sha512-kYPUsytdIkEjuG1XdDLxTRsJoomVA1xLCEiTRKt1Td1oSvY95gKFzvT0IaFxuVKxFF8douquUXChSeBDTKPl0w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-arm64-musl@0.99.0': + resolution: {integrity: sha512-RcG6mnQ/WgO0uEqxJGpmhPdeGipopEeMFgylqfz5uwscRwmiwKISUJd0XHPDP0IrWUo2frgtBIVq5aFcj9t/Ng==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@oxc-transform/binding-linux-riscv64-gnu@0.99.0': + resolution: {integrity: sha512-GLzZ/gY7qZoT1AUZm/KJqzEUtoWsHooXt+3gjDkw1GGL42OiWtS77YTrVzirWb1kHG2jmCQU1wt+zpn7NjtJwQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [riscv64] + os: [linux] + + '@oxc-transform/binding-linux-s390x-gnu@0.99.0': + resolution: {integrity: sha512-ymQ9f5Z76v9R0QtecJH3tL/n/QBY3TeRi6Z9lTW4UKdv+gfRB87fKHkd0Rrmwe0MqupdCXhAVLe7fWV8DkCDXw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + + '@oxc-transform/binding-linux-x64-gnu@0.99.0': + resolution: {integrity: sha512-oF6MxCAmQBkgrgRJGlUtpYwUwAq9cOmTJ7hh9Ol27fyGM4NUGOPH2sjrUenlCJ3p3huYwkzUtg+WRqXoiyrc6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-linux-x64-musl@0.99.0': + resolution: {integrity: sha512-PYcG6x/2IEWEETXPIDJANNTjFu2LCivHFPue2wnQaPtPuakJbjMdHyGHdxC4MV3V3Xtp7YUjhzS/x+VmiSaDJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@oxc-transform/binding-wasm32-wasi@0.99.0': + resolution: {integrity: sha512-NoaFl5gqm9rXq6dcG6O6XNvn/4tyRjuqWuMRnuMqJ0F7Zo/+qfdsXwwo+VuUCmDMxSVUz0DTMJVJIAVyZoBkQA==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@oxc-transform/binding-win32-arm64-msvc@0.99.0': + resolution: {integrity: sha512-/XtVvl7sLC2vct7AgvAzBq4g8gnkWToU9fZhbbiY1Pj5mGRGhXhNW0jbugHIWW8VopEqeOv9nwkY9Gt2f8fPVw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@oxc-transform/binding-win32-x64-msvc@0.99.0': + resolution: {integrity: sha512-77wESR0e8M+I2RR2KY769JJtRUzQfPs7AMtli6VoDa9cNP/T6HOd8MThjhLqK/CpppuhqaqC2xHAw52Lsg2mDw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/binding-android-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.51': + resolution: {integrity: sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': + resolution: {integrity: sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': + resolution: {integrity: sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': + resolution: {integrity: sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0-beta.51': + resolution: {integrity: sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==} + + '@rollup/rollup-android-arm-eabi@4.53.3': + resolution: {integrity: sha512-mRSi+4cBjrRLoaal2PnqH82Wqyb+d3HsPUN/W+WslCXsZsyHa9ZeQQX/pQsZaVIWDkPcpV6jJ+3KLbTbgnwv8w==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.53.3': + resolution: {integrity: sha512-CbDGaMpdE9sh7sCmTrTUyllhrg65t6SwhjlMJsLr+J8YjFuPmCEjbBSx4Z/e4SmDyH3aB5hGaJUP2ltV/vcs4w==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.53.3': + resolution: {integrity: sha512-Nr7SlQeqIBpOV6BHHGZgYBuSdanCXuw09hon14MGOLGmXAFYjx1wNvquVPmpZnl0tLjg25dEdr4IQ6GgyToCUA==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.53.3': + resolution: {integrity: sha512-DZ8N4CSNfl965CmPktJ8oBnfYr3F8dTTNBQkRlffnUarJ2ohudQD17sZBa097J8xhQ26AwhHJ5mvUyQW8ddTsQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.53.3': + resolution: {integrity: sha512-yMTrCrK92aGyi7GuDNtGn2sNW+Gdb4vErx4t3Gv/Tr+1zRb8ax4z8GWVRfr3Jw8zJWvpGHNpss3vVlbF58DZ4w==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.53.3': + resolution: {integrity: sha512-lMfF8X7QhdQzseM6XaX0vbno2m3hlyZFhwcndRMw8fbAGUGL3WFMBdK0hbUBIUYcEcMhVLr1SIamDeuLBnXS+Q==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + resolution: {integrity: sha512-k9oD15soC/Ln6d2Wv/JOFPzZXIAIFLp6B+i14KhxAfnq76ajt0EhYc5YPeX6W1xJkAdItcVT+JhKl1QZh44/qw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + resolution: {integrity: sha512-vTNlKq+N6CK/8UktsrFuc+/7NlEYVxgaEgRXVUVK258Z5ymho29skzW1sutgYjqNnquGwVUObAaxae8rZ6YMhg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + resolution: {integrity: sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.53.3': + resolution: {integrity: sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + resolution: {integrity: sha512-JiuKcp2teLJwQ7vkJ95EwESWkNRFJD7TQgYmCnrPtlu50b4XvT5MOmurWNrCj3IFdyjBQ5p9vnrX4JM6I8OE7g==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + resolution: {integrity: sha512-EoGSa8nd6d3T7zLuqdojxC20oBfNT8nexBbB/rkxgKj5T5vhpAQKKnD+h3UkoMuTyXkP5jTjK/ccNRmQrPNDuw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + resolution: {integrity: sha512-4s+Wped2IHXHPnAEbIB0YWBv7SDohqxobiiPA1FIWZpX+w9o2i4LezzH/NkFUl8LRci/8udci6cLq+jJQlh+0g==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + resolution: {integrity: sha512-68k2g7+0vs2u9CxDt5ktXTngsxOQkSEV/xBbwlqYcUrAVh6P9EgMZvFsnHy4SEiUl46Xf0IObWVbMvPrr2gw8A==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + resolution: {integrity: sha512-VYsFMpULAz87ZW6BVYw3I6sWesGpsP9OPcyKe8ofdg9LHxSbRMd7zrVrr5xi/3kMZtpWL/wC+UIJWJYVX5uTKg==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.53.3': + resolution: {integrity: sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.53.3': + resolution: {integrity: sha512-eoROhjcc6HbZCJr+tvVT8X4fW3/5g/WkGvvmwz/88sDtSJzO7r/blvoBDgISDiCjDRZmHpwud7h+6Q9JxFwq1Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openharmony-arm64@4.53.3': + resolution: {integrity: sha512-OueLAWgrNSPGAdUdIjSWXw+u/02BRTcnfw9PN41D2vq/JSEPnJnVuBgw18VkN8wcd4fjUs+jFHVM4t9+kBSNLw==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + resolution: {integrity: sha512-GOFuKpsxR/whszbF/bzydebLiXIHSgsEUp6M0JI8dWvi+fFa1TD6YQa4aSZHtpmh2/uAlj/Dy+nmby3TJ3pkTw==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + resolution: {integrity: sha512-iah+THLcBJdpfZ1TstDFbKNznlzoxa8fmnFYK4V67HvmuNYkVdAywJSoteUszvBQ9/HqN2+9AZghbajMsFT+oA==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.53.3': + resolution: {integrity: sha512-J9QDiOIZlZLdcot5NXEepDkstocktoVjkaKUtqzgzpt2yWjGlbYiKyp05rWwk4nypbYUNoFAztEgixoLaSETkg==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.53.3': + resolution: {integrity: sha512-UhTd8u31dXadv0MopwGgNOBpUVROFKWVQgAg5N1ESyCz8AuBcMqm4AuTjrwgQKGDfoFuz02EuMRHQIw/frmYKQ==} + cpu: [x64] + os: [win32] + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + + '@types/chai@5.2.3': + resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} + + '@types/deep-eql@4.0.2': + resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@vitest/expect@4.0.14': + resolution: {integrity: sha512-RHk63V3zvRiYOWAV0rGEBRO820ce17hz7cI2kDmEdfQsBjT2luEKB5tCOc91u1oSQoUOZkSv3ZyzkdkSLD7lKw==} + + '@vitest/mocker@4.0.14': + resolution: {integrity: sha512-RzS5NujlCzeRPF1MK7MXLiEFpkIXeMdQ+rN3Kk3tDI9j0mtbr7Nmuq67tpkOJQpgyClbOltCXMjLZicJHsH5Cg==} + peerDependencies: + msw: ^2.4.9 + vite: ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@4.0.14': + resolution: {integrity: sha512-SOYPgujB6TITcJxgd3wmsLl+wZv+fy3av2PpiPpsWPZ6J1ySUYfScfpIt2Yv56ShJXR2MOA6q2KjKHN4EpdyRQ==} + + '@vitest/runner@4.0.14': + resolution: {integrity: sha512-BsAIk3FAqxICqREbX8SetIteT8PiaUL/tgJjmhxJhCsigmzzH8xeadtp7LRnTpCVzvf0ib9BgAfKJHuhNllKLw==} + + '@vitest/snapshot@4.0.14': + resolution: {integrity: sha512-aQVBfT1PMzDSA16Y3Fp45a0q8nKexx6N5Amw3MX55BeTeZpoC08fGqEZqVmPcqN0ueZsuUQ9rriPMhZ3Mu19Ag==} + + '@vitest/spy@4.0.14': + resolution: {integrity: sha512-JmAZT1UtZooO0tpY3GRyiC/8W7dCs05UOq9rfsUUgEZEdq+DuHLmWhPsrTt0TiW7WYeL/hXpaE07AZ2RCk44hg==} + + '@vitest/utils@4.0.14': + resolution: {integrity: sha512-hLqXZKAWNg8pI+SQXyXxWCTOpA3MvsqcbVeNgSi8x/CSN2wi26dSzn1wrOhmCmFjEvN9p8/kLFRHa6PI8jHazw==} + + assertion-error@2.0.1: + resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} + engines: {node: '>=12'} + + ast-kit@2.2.0: + resolution: {integrity: sha512-m1Q/RaVOnTp9JxPX+F+Zn7IcLYMzM8kZofDImfsKZd8MbR+ikdOzTeztStWqfrqIxZnYWryyI9ePm3NGjnZgGw==} + engines: {node: '>=20.19.0'} + + birpc@2.8.0: + resolution: {integrity: sha512-Bz2a4qD/5GRhiHSwj30c/8kC8QGj12nNDwz3D4ErQ4Xhy35dsSDvF+RA/tWpjyU0pdGtSDiEk6B5fBGE1qNVhw==} + + c12@3.3.2: + resolution: {integrity: sha512-QkikB2X5voO1okL3QsES0N690Sn/K9WokXqUsDQsWy5SnYb+psYQFGA10iy1bZHj3fjISKsI67Q90gruvWWM3A==} + peerDependencies: + magicast: '*' + peerDependenciesMeta: + magicast: + optional: true + + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} + engines: {node: '>=18'} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + citty@0.1.6: + resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} + + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + + defu@6.1.4: + resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + + destr@2.0.5: + resolution: {integrity: sha512-ugFTXCtDZunbzasqBxrK93Ik/DRYsO6S/fedkWEMKqt04xZ4csmnmwGDBAb07QWNaGMAmnTIemsYZCksjATwsA==} + + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + + dts-resolver@2.1.3: + resolution: {integrity: sha512-bihc7jPC90VrosXNzK0LTE2cuLP6jr0Ro8jk+kMugHReJVLIpHz/xadeq3MhuwyO4TD4OA3L1Q8pBBFRc08Tsw==} + engines: {node: '>=20.19.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + + es-module-lexer@1.7.0: + resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + expect-type@1.2.2: + resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} + engines: {node: '>=12.0.0'} + + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} + + giget@2.0.0: + resolution: {integrity: sha512-L5bGsVkxJbJgdnwyuheIunkGatUF/zssUoxxjACCseZYAVbaqdh9Tsmmlkl8vYan09H7sbvKt4pS8GqKLBrEzA==} + hasBin: true + + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + node-fetch-native@1.6.7: + resolution: {integrity: sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==} + + nypm@0.6.2: + resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + + obug@2.1.1: + resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==} + + obuild@0.4.3: + resolution: {integrity: sha512-EjbeMT01VlLMabLM1C/En4EtXzzBx1FrV1VaM7JckWlqMw1DyoSS8tGgsSMHjqol5AAG8qOmw5EyaS6ZRu9g1Q==} + hasBin: true + + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} + + oxc-minify@0.99.0: + resolution: {integrity: sha512-eQ8iDj1eFeiw258iiSRfRJARbVgLjweyh81ykt8fTjX0JQLwU8ASYpAzymD/HaIqSsiOas8cGd3EElwKPL3GCQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-parser@0.99.0: + resolution: {integrity: sha512-MpS1lbd2vR0NZn1v0drpgu7RUFu3x9Rd0kxExObZc2+F+DIrV0BOMval/RO3BYGwssIOerII6iS8EbbpCCZQpQ==} + engines: {node: ^20.19.0 || >=22.12.0} + + oxc-transform@0.99.0: + resolution: {integrity: sha512-50VC9deilv1i4IDKTvbxRduzi8ZtB+rmFow0PO0P2a/OavP963FEIAQGA4AFBvgl3hD+MXB4uUgz055Qj0sd3w==} + engines: {node: ^20.19.0 || >=22.12.0} + + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} + + perfect-debounce@2.0.0: + resolution: {integrity: sha512-fkEH/OBiKrqqI/yIgjR92lMfs2K8105zt/VT6+7eTjNwisrsh47CeIED9z58zI7DfKdH3uHAn25ziRZn3kgAow==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + prettier@3.7.2: + resolution: {integrity: sha512-n3HV2J6QhItCXndGa3oMWvWFAgN1ibnS7R9mt6iokScBOC0Ul9/iZORmU2IWUMcyAQaMPjTlY3uT34TqocUxMA==} + engines: {node: '>=14'} + hasBin: true + + pretty-bytes@7.1.0: + resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} + engines: {node: '>=20'} + + rc9@2.1.2: + resolution: {integrity: sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + rolldown-plugin-dts@0.18.1: + resolution: {integrity: sha512-uIgNMix6OI+6bSkw0nw6O+G/ydPRCWKwvvcEyL6gWkVkSFVGWWO23DX4ZYVOqC7w5u2c8uPY9Q74U0QCKvegFA==} + engines: {node: '>=20.19.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.51 + typescript: ^5.0.0 + vue-tsc: ~3.1.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.51: + resolution: {integrity: sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + rollup@4.53.3: + resolution: {integrity: sha512-w8GmOxZfBmKknvdXU1sdM9NHcoQejwF/4mNgj2JuEEdRaHwwF12K7e9eXn1nLZ07ad+du76mkVsyeb2rKGllsA==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + std-env@3.10.0: + resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} + + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + + tinyexec@1.0.2: + resolution: {integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg==} + engines: {node: '>=18'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tinyrainbow@3.0.3: + resolution: {integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==} + engines: {node: '>=14.0.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + vite@7.2.4: + resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + 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 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vitest@4.0.14: + resolution: {integrity: sha512-d9B2J9Cm9dN9+6nxMnnNJKJCtcyKfnHj15N6YNJfaFHRLua/d3sRKU9RuKmO9mB0XdFtUizlxfz/VPbd3OxGhw==} + engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0} + hasBin: true + 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.14 + '@vitest/browser-preview': 4.0.14 + '@vitest/browser-webdriverio': 4.0.14 + '@vitest/ui': 4.0.14 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@opentelemetry/api': + optional: true + '@types/node': + optional: true + '@vitest/browser-playwright': + optional: true + '@vitest/browser-preview': + optional: true + '@vitest/browser-webdriverio': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + why-is-node-running@2.3.0: + resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} + engines: {node: '>=8'} + hasBin: true + +snapshots: + + '@babel/generator@7.28.5': + dependencies: + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.5': + dependencies: + '@babel/types': 7.28.5 + + '@babel/types@7.28.5': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@esbuild/aix-ppc64@0.25.12': + optional: true + + '@esbuild/android-arm64@0.25.12': + optional: true + + '@esbuild/android-arm@0.25.12': + optional: true + + '@esbuild/android-x64@0.25.12': + optional: true + + '@esbuild/darwin-arm64@0.25.12': + optional: true + + '@esbuild/darwin-x64@0.25.12': + optional: true + + '@esbuild/freebsd-arm64@0.25.12': + optional: true + + '@esbuild/freebsd-x64@0.25.12': + optional: true + + '@esbuild/linux-arm64@0.25.12': + optional: true + + '@esbuild/linux-arm@0.25.12': + optional: true + + '@esbuild/linux-ia32@0.25.12': + optional: true + + '@esbuild/linux-loong64@0.25.12': + optional: true + + '@esbuild/linux-mips64el@0.25.12': + optional: true + + '@esbuild/linux-ppc64@0.25.12': + optional: true + + '@esbuild/linux-riscv64@0.25.12': + optional: true + + '@esbuild/linux-s390x@0.25.12': + optional: true + + '@esbuild/linux-x64@0.25.12': + optional: true + + '@esbuild/netbsd-arm64@0.25.12': + optional: true + + '@esbuild/netbsd-x64@0.25.12': + optional: true + + '@esbuild/openbsd-arm64@0.25.12': + optional: true + + '@esbuild/openbsd-x64@0.25.12': + optional: true + + '@esbuild/openharmony-arm64@0.25.12': + optional: true + + '@esbuild/sunos-x64@0.25.12': + optional: true + + '@esbuild/win32-arm64@0.25.12': + optional: true + + '@esbuild/win32-ia32@0.25.12': + optional: true + + '@esbuild/win32-x64@0.25.12': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@jsr/std__cli@1.0.24': + dependencies: + '@jsr/std__internal': 1.0.12 + + '@jsr/std__internal@1.0.12': {} + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + + '@oxc-minify/binding-android-arm64@0.99.0': + optional: true + + '@oxc-minify/binding-darwin-arm64@0.99.0': + optional: true + + '@oxc-minify/binding-darwin-x64@0.99.0': + optional: true + + '@oxc-minify/binding-freebsd-x64@0.99.0': + optional: true + + '@oxc-minify/binding-linux-arm-gnueabihf@0.99.0': + optional: true + + '@oxc-minify/binding-linux-arm-musleabihf@0.99.0': + optional: true + + '@oxc-minify/binding-linux-arm64-gnu@0.99.0': + optional: true + + '@oxc-minify/binding-linux-arm64-musl@0.99.0': + optional: true + + '@oxc-minify/binding-linux-riscv64-gnu@0.99.0': + optional: true + + '@oxc-minify/binding-linux-s390x-gnu@0.99.0': + optional: true + + '@oxc-minify/binding-linux-x64-gnu@0.99.0': + optional: true + + '@oxc-minify/binding-linux-x64-musl@0.99.0': + optional: true + + '@oxc-minify/binding-wasm32-wasi@0.99.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-minify/binding-win32-arm64-msvc@0.99.0': + optional: true + + '@oxc-minify/binding-win32-x64-msvc@0.99.0': + optional: true + + '@oxc-parser/binding-android-arm64@0.99.0': + optional: true + + '@oxc-parser/binding-darwin-arm64@0.99.0': + optional: true + + '@oxc-parser/binding-darwin-x64@0.99.0': + optional: true + + '@oxc-parser/binding-freebsd-x64@0.99.0': + optional: true + + '@oxc-parser/binding-linux-arm-gnueabihf@0.99.0': + optional: true + + '@oxc-parser/binding-linux-arm-musleabihf@0.99.0': + optional: true + + '@oxc-parser/binding-linux-arm64-gnu@0.99.0': + optional: true + + '@oxc-parser/binding-linux-arm64-musl@0.99.0': + optional: true + + '@oxc-parser/binding-linux-riscv64-gnu@0.99.0': + optional: true + + '@oxc-parser/binding-linux-s390x-gnu@0.99.0': + optional: true + + '@oxc-parser/binding-linux-x64-gnu@0.99.0': + optional: true + + '@oxc-parser/binding-linux-x64-musl@0.99.0': + optional: true + + '@oxc-parser/binding-wasm32-wasi@0.99.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-parser/binding-win32-arm64-msvc@0.99.0': + optional: true + + '@oxc-parser/binding-win32-x64-msvc@0.99.0': + optional: true + + '@oxc-project/types@0.98.0': {} + + '@oxc-project/types@0.99.0': {} + + '@oxc-transform/binding-android-arm64@0.99.0': + optional: true + + '@oxc-transform/binding-darwin-arm64@0.99.0': + optional: true + + '@oxc-transform/binding-darwin-x64@0.99.0': + optional: true + + '@oxc-transform/binding-freebsd-x64@0.99.0': + optional: true + + '@oxc-transform/binding-linux-arm-gnueabihf@0.99.0': + optional: true + + '@oxc-transform/binding-linux-arm-musleabihf@0.99.0': + optional: true + + '@oxc-transform/binding-linux-arm64-gnu@0.99.0': + optional: true + + '@oxc-transform/binding-linux-arm64-musl@0.99.0': + optional: true + + '@oxc-transform/binding-linux-riscv64-gnu@0.99.0': + optional: true + + '@oxc-transform/binding-linux-s390x-gnu@0.99.0': + optional: true + + '@oxc-transform/binding-linux-x64-gnu@0.99.0': + optional: true + + '@oxc-transform/binding-linux-x64-musl@0.99.0': + optional: true + + '@oxc-transform/binding-wasm32-wasi@0.99.0': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@oxc-transform/binding-win32-arm64-msvc@0.99.0': + optional: true + + '@oxc-transform/binding-win32-x64-msvc@0.99.0': + optional: true + + '@rolldown/binding-android-arm64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': + optional: true + + '@rolldown/pluginutils@1.0.0-beta.51': {} + + '@rollup/rollup-android-arm-eabi@4.53.3': + optional: true + + '@rollup/rollup-android-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-arm64@4.53.3': + optional: true + + '@rollup/rollup-darwin-x64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-arm64@4.53.3': + optional: true + + '@rollup/rollup-freebsd-x64@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.53.3': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-linux-x64-musl@4.53.3': + optional: true + + '@rollup/rollup-openharmony-arm64@4.53.3': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.53.3': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.53.3': + optional: true + + '@standard-schema/spec@1.0.0': {} + + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/chai@5.2.3': + dependencies: + '@types/deep-eql': 4.0.2 + assertion-error: 2.0.1 + + '@types/deep-eql@4.0.2': {} + + '@types/estree@1.0.8': {} + + '@vitest/expect@4.0.14': + dependencies: + '@standard-schema/spec': 1.0.0 + '@types/chai': 5.2.3 + '@vitest/spy': 4.0.14 + '@vitest/utils': 4.0.14 + chai: 6.2.1 + tinyrainbow: 3.0.3 + + '@vitest/mocker@4.0.14(vite@7.2.4(jiti@2.6.1))': + dependencies: + '@vitest/spy': 4.0.14 + estree-walker: 3.0.3 + magic-string: 0.30.21 + optionalDependencies: + vite: 7.2.4(jiti@2.6.1) + + '@vitest/pretty-format@4.0.14': + dependencies: + tinyrainbow: 3.0.3 + + '@vitest/runner@4.0.14': + dependencies: + '@vitest/utils': 4.0.14 + pathe: 2.0.3 + + '@vitest/snapshot@4.0.14': + dependencies: + '@vitest/pretty-format': 4.0.14 + magic-string: 0.30.21 + pathe: 2.0.3 + + '@vitest/spy@4.0.14': {} + + '@vitest/utils@4.0.14': + dependencies: + '@vitest/pretty-format': 4.0.14 + tinyrainbow: 3.0.3 + + assertion-error@2.0.1: {} + + ast-kit@2.2.0: + dependencies: + '@babel/parser': 7.28.5 + pathe: 2.0.3 + + birpc@2.8.0: {} + + c12@3.3.2: + dependencies: + chokidar: 4.0.3 + confbox: 0.2.2 + defu: 6.1.4 + dotenv: 17.2.3 + exsolve: 1.0.8 + giget: 2.0.0 + jiti: 2.6.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + rc9: 2.1.2 + + chai@6.2.1: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + citty@0.1.6: + dependencies: + consola: 3.4.2 + + confbox@0.2.2: {} + + consola@3.4.2: {} + + defu@6.1.4: {} + + destr@2.0.5: {} + + dotenv@17.2.3: {} + + dts-resolver@2.1.3: {} + + es-module-lexer@1.7.0: {} + + esbuild@0.25.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.8 + + expect-type@1.2.2: {} + + exsolve@1.0.8: {} + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fsevents@2.3.3: + optional: true + + get-tsconfig@4.13.0: + dependencies: + resolve-pkg-maps: 1.0.0 + + giget@2.0.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + defu: 6.1.4 + node-fetch-native: 1.6.7 + nypm: 0.6.2 + pathe: 2.0.3 + + jiti@2.6.1: {} + + jsesc@3.1.0: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + nanoid@3.3.11: {} + + node-fetch-native@1.6.7: {} + + nypm@0.6.2: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 1.0.2 + + obug@2.1.1: {} + + obuild@0.4.3: + dependencies: + c12: 3.3.2 + consola: 3.4.2 + defu: 6.1.4 + exsolve: 1.0.8 + magic-string: 0.30.21 + oxc-minify: 0.99.0 + oxc-parser: 0.99.0 + oxc-transform: 0.99.0 + pathe: 2.0.3 + pretty-bytes: 7.1.0 + rolldown: 1.0.0-beta.51 + rolldown-plugin-dts: 0.18.1(rolldown@1.0.0-beta.51) + tinyglobby: 0.2.15 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - magicast + - oxc-resolver + - typescript + - vue-tsc + + ohash@2.0.11: {} + + oxc-minify@0.99.0: + optionalDependencies: + '@oxc-minify/binding-android-arm64': 0.99.0 + '@oxc-minify/binding-darwin-arm64': 0.99.0 + '@oxc-minify/binding-darwin-x64': 0.99.0 + '@oxc-minify/binding-freebsd-x64': 0.99.0 + '@oxc-minify/binding-linux-arm-gnueabihf': 0.99.0 + '@oxc-minify/binding-linux-arm-musleabihf': 0.99.0 + '@oxc-minify/binding-linux-arm64-gnu': 0.99.0 + '@oxc-minify/binding-linux-arm64-musl': 0.99.0 + '@oxc-minify/binding-linux-riscv64-gnu': 0.99.0 + '@oxc-minify/binding-linux-s390x-gnu': 0.99.0 + '@oxc-minify/binding-linux-x64-gnu': 0.99.0 + '@oxc-minify/binding-linux-x64-musl': 0.99.0 + '@oxc-minify/binding-wasm32-wasi': 0.99.0 + '@oxc-minify/binding-win32-arm64-msvc': 0.99.0 + '@oxc-minify/binding-win32-x64-msvc': 0.99.0 + + oxc-parser@0.99.0: + dependencies: + '@oxc-project/types': 0.99.0 + optionalDependencies: + '@oxc-parser/binding-android-arm64': 0.99.0 + '@oxc-parser/binding-darwin-arm64': 0.99.0 + '@oxc-parser/binding-darwin-x64': 0.99.0 + '@oxc-parser/binding-freebsd-x64': 0.99.0 + '@oxc-parser/binding-linux-arm-gnueabihf': 0.99.0 + '@oxc-parser/binding-linux-arm-musleabihf': 0.99.0 + '@oxc-parser/binding-linux-arm64-gnu': 0.99.0 + '@oxc-parser/binding-linux-arm64-musl': 0.99.0 + '@oxc-parser/binding-linux-riscv64-gnu': 0.99.0 + '@oxc-parser/binding-linux-s390x-gnu': 0.99.0 + '@oxc-parser/binding-linux-x64-gnu': 0.99.0 + '@oxc-parser/binding-linux-x64-musl': 0.99.0 + '@oxc-parser/binding-wasm32-wasi': 0.99.0 + '@oxc-parser/binding-win32-arm64-msvc': 0.99.0 + '@oxc-parser/binding-win32-x64-msvc': 0.99.0 + + oxc-transform@0.99.0: + optionalDependencies: + '@oxc-transform/binding-android-arm64': 0.99.0 + '@oxc-transform/binding-darwin-arm64': 0.99.0 + '@oxc-transform/binding-darwin-x64': 0.99.0 + '@oxc-transform/binding-freebsd-x64': 0.99.0 + '@oxc-transform/binding-linux-arm-gnueabihf': 0.99.0 + '@oxc-transform/binding-linux-arm-musleabihf': 0.99.0 + '@oxc-transform/binding-linux-arm64-gnu': 0.99.0 + '@oxc-transform/binding-linux-arm64-musl': 0.99.0 + '@oxc-transform/binding-linux-riscv64-gnu': 0.99.0 + '@oxc-transform/binding-linux-s390x-gnu': 0.99.0 + '@oxc-transform/binding-linux-x64-gnu': 0.99.0 + '@oxc-transform/binding-linux-x64-musl': 0.99.0 + '@oxc-transform/binding-wasm32-wasi': 0.99.0 + '@oxc-transform/binding-win32-arm64-msvc': 0.99.0 + '@oxc-transform/binding-win32-x64-msvc': 0.99.0 + + pathe@2.0.3: {} + + perfect-debounce@2.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + prettier@3.7.2: {} + + pretty-bytes@7.1.0: {} + + rc9@2.1.2: + dependencies: + defu: 6.1.4 + destr: 2.0.5 + + readdirp@4.1.2: {} + + resolve-pkg-maps@1.0.0: {} + + rolldown-plugin-dts@0.18.1(rolldown@1.0.0-beta.51): + dependencies: + '@babel/generator': 7.28.5 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 + ast-kit: 2.2.0 + birpc: 2.8.0 + dts-resolver: 2.1.3 + get-tsconfig: 4.13.0 + magic-string: 0.30.21 + obug: 2.1.1 + rolldown: 1.0.0-beta.51 + transitivePeerDependencies: + - oxc-resolver + + rolldown@1.0.0-beta.51: + dependencies: + '@oxc-project/types': 0.98.0 + '@rolldown/pluginutils': 1.0.0-beta.51 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-x64': 1.0.0-beta.51 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.51 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.51 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.51 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.51 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.51 + + rollup@4.53.3: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.53.3 + '@rollup/rollup-android-arm64': 4.53.3 + '@rollup/rollup-darwin-arm64': 4.53.3 + '@rollup/rollup-darwin-x64': 4.53.3 + '@rollup/rollup-freebsd-arm64': 4.53.3 + '@rollup/rollup-freebsd-x64': 4.53.3 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.3 + '@rollup/rollup-linux-arm-musleabihf': 4.53.3 + '@rollup/rollup-linux-arm64-gnu': 4.53.3 + '@rollup/rollup-linux-arm64-musl': 4.53.3 + '@rollup/rollup-linux-loong64-gnu': 4.53.3 + '@rollup/rollup-linux-ppc64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-gnu': 4.53.3 + '@rollup/rollup-linux-riscv64-musl': 4.53.3 + '@rollup/rollup-linux-s390x-gnu': 4.53.3 + '@rollup/rollup-linux-x64-gnu': 4.53.3 + '@rollup/rollup-linux-x64-musl': 4.53.3 + '@rollup/rollup-openharmony-arm64': 4.53.3 + '@rollup/rollup-win32-arm64-msvc': 4.53.3 + '@rollup/rollup-win32-ia32-msvc': 4.53.3 + '@rollup/rollup-win32-x64-gnu': 4.53.3 + '@rollup/rollup-win32-x64-msvc': 4.53.3 + fsevents: 2.3.3 + + siginfo@2.0.0: {} + + source-map-js@1.2.1: {} + + stackback@0.0.2: {} + + std-env@3.10.0: {} + + tinybench@2.9.0: {} + + tinyexec@0.3.2: {} + + tinyexec@1.0.2: {} + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tinyrainbow@3.0.3: {} + + tslib@2.8.1: + optional: true + + vite@7.2.4(jiti@2.6.1): + dependencies: + esbuild: 0.25.12 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.53.3 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + jiti: 2.6.1 + + vitest@4.0.14(jiti@2.6.1): + dependencies: + '@vitest/expect': 4.0.14 + '@vitest/mocker': 4.0.14(vite@7.2.4(jiti@2.6.1)) + '@vitest/pretty-format': 4.0.14 + '@vitest/runner': 4.0.14 + '@vitest/snapshot': 4.0.14 + '@vitest/spy': 4.0.14 + '@vitest/utils': 4.0.14 + 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: 0.3.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 7.2.4(jiti@2.6.1) + why-is-node-running: 2.3.0 + transitivePeerDependencies: + - jiti + - less + - lightningcss + - msw + - sass + - sass-embedded + - stylus + - sugarss + - terser + - tsx + - yaml + + why-is-node-running@2.3.0: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 diff --git a/scripts/build_npm.ts b/scripts/build_npm.ts deleted file mode 100644 index bcf6721..0000000 --- a/scripts/build_npm.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { build, emptyDir } from "@deno/dnt"; - -import denoJson from "../deno.json" with { type: "json" }; - -await emptyDir("./npm"); - -await build({ - entryPoints: ["./mod.ts"], - outDir: "./npm", - shims: { - // see JS docs for overview and more options - deno: true, - }, - compilerOptions: { - lib: ["ES2022"], - }, - package: { - // package.json properties - name: "@textplace/core", - version: denoJson.version, - description: "The core logic of TextPlace.", - license: "MIT", - repository: { - type: "git", - url: "https://github.com/TextPlace/CoreTextPlace", - }, - bugs: { - url: "https://github.com/TextPlace/CoreTextPlace/issues", - }, - }, - postBuild() { - // steps to run after building and before running the tests - Deno.copyFileSync("LICENSE", "npm/LICENSE"); - Deno.copyFileSync("README.md", "npm/README.md"); - }, -}); diff --git a/logic/board.ts b/src/logic/board.ts similarity index 100% rename from logic/board.ts rename to src/logic/board.ts diff --git a/logic/character.ts b/src/logic/character.ts similarity index 100% rename from logic/character.ts rename to src/logic/character.ts diff --git a/logic/section.ts b/src/logic/section.ts similarity index 100% rename from logic/section.ts rename to src/logic/section.ts diff --git a/mod.ts b/src/mod.ts similarity index 100% rename from mod.ts rename to src/mod.ts diff --git a/types/board.ts b/src/types/board.ts similarity index 100% rename from types/board.ts rename to src/types/board.ts diff --git a/types/change.ts b/src/types/change.ts similarity index 100% rename from types/change.ts rename to src/types/change.ts diff --git a/types/section.ts b/src/types/section.ts similarity index 100% rename from types/section.ts rename to src/types/section.ts diff --git a/tests/board.test.ts b/tests/board.test.ts index 735bf32..268a513 100644 --- a/tests/board.test.ts +++ b/tests/board.test.ts @@ -1,22 +1,19 @@ -import { - assert, - assertEquals, -} from "https://deno.land/std@0.224.0/assert/mod.ts"; +import { describe, it, expect } from "vitest"; import { createBoard, getSectionOnBoard, renderFullBoard, } from "../logic/board.ts"; -import type { BoardData } from "../types/board.ts"; +import type { BoardData } from "../src/types/board.ts"; import { checkFullBoard } from "./checkFullBoard.ts"; -import { locateSection } from "../logic/board.ts"; -import { applyChangeOnBoard } from "../logic/board.ts"; +import { locateSection } from "../src/logic/board.ts"; +import { applyChangeOnBoard } from "../src/logic/board.ts"; -Deno.test("board", async (t) => { +describe("board", () => { let board: BoardData | undefined; - await t.step("createBoard", () => { + it("createBoard", () => { board = createBoard({ xSections: 3, ySections: 3, @@ -29,96 +26,96 @@ Deno.test("board", async (t) => { }); // Sections are created on demand. - assertEquals(board.sections.length, 0); + expect(board.sections.length).toBe(0); }); - await t.step("locateSection", () => { - assert(board); + it("locateSection", () => { + expect(board).toBeDefined(); - const { sx, sy } = locateSection({ x: 0, y: 0 }, board.config); - assertEquals(sx, 0); - assertEquals(sy, 0); + const { sx, sy } = locateSection({ x: 0, y: 0 }, board!.config); + expect(sx).toBe(0); + expect(sy).toBe(0); - const { sx: sx2, sy: sy2 } = locateSection({ x: 4, y: 0 }, board.config); - assertEquals(sx2, 1); - assertEquals(sy2, 0); + const { sx: sx2, sy: sy2 } = locateSection({ x: 4, y: 0 }, board!.config); + expect(sx2).toBe(1); + expect(sy2).toBe(0); }); - await t.step("applyChangeOnBoard", () => { - assert(board); + it("applyChangeOnBoard", () => { + expect(board).toBeDefined(); - applyChangeOnBoard({ x: 0, y: 0, ch: "A" }, board); - applyChangeOnBoard({ x: 4, y: 0, ch: "B" }, board); - applyChangeOnBoard({ x: 0, y: 3, ch: "C" }, board); - applyChangeOnBoard({ x: 4, y: 3, ch: "D" }, board); - applyChangeOnBoard({ x: 5, y: 3, ch: "E" }, board); + applyChangeOnBoard({ x: 0, y: 0, ch: "A" }, board!); + applyChangeOnBoard({ x: 4, y: 0, ch: "B" }, board!); + applyChangeOnBoard({ x: 0, y: 3, ch: "C" }, board!); + applyChangeOnBoard({ x: 4, y: 3, ch: "D" }, board!); + applyChangeOnBoard({ x: 5, y: 3, ch: "E" }, board!); - assertEquals(board.sections[0][0].ch[0][0], "A"); - assertEquals(board.sections[0][1].ch[0][0], "B"); - assertEquals(board.sections[1][0].ch[0][0], "C"); - assertEquals(board.sections[1][1].ch[0], ["D", "E", " ", " "]); + expect(board!.sections[0][0].ch[0][0]).toBe("A"); + expect(board!.sections[0][1].ch[0][0]).toBe("B"); + expect(board!.sections[1][0].ch[0][0]).toBe("C"); + expect(board!.sections[1][1].ch[0]).toEqual(["D", "E", " ", " "]); - applyChangeOnBoard({ x: 0, y: 1, ch: "你" }, board); - applyChangeOnBoard({ x: 4, y: 2, ch: "好" }, board); - applyChangeOnBoard({ x: 0, y: 4, ch: "嗎" }, board); - applyChangeOnBoard({ x: 4, y: 4, ch: "嘛" }, board); + applyChangeOnBoard({ x: 0, y: 1, ch: "你" }, board!); + applyChangeOnBoard({ x: 4, y: 2, ch: "好" }, board!); + applyChangeOnBoard({ x: 0, y: 4, ch: "嗎" }, board!); + applyChangeOnBoard({ x: 4, y: 4, ch: "嘛" }, board!); - assertEquals(board.sections[0][0].ch[1][0], "你"); - assertEquals(board.sections[0][1].ch[2][0], "好"); - assertEquals(board.sections[1][0].ch[1][0], "嗎"); - assertEquals(board.sections[1][1].ch[1], ["嘛", " ", " ", " "]); + expect(board!.sections[0][0].ch[1][0]).toBe("你"); + expect(board!.sections[0][1].ch[2][0]).toBe("好"); + expect(board!.sections[1][0].ch[1][0]).toBe("嗎"); + expect(board!.sections[1][1].ch[1]).toEqual(["嘛", " ", " ", " "]); - applyChangeOnBoard({ x: 5, y: 4, ch: "啊" }, board); - assertEquals(board.sections[1][1].ch[1], ["啊", " ", " ", " "]); + applyChangeOnBoard({ x: 5, y: 4, ch: "啊" }, board!); + expect(board!.sections[1][1].ch[1]).toEqual(["啊", " ", " ", " "]); }); - await t.step("getSectionOnBoard: existing section", () => { - assert(board); + it("getSectionOnBoard: existing section", () => { + expect(board).toBeDefined(); - const section = getSectionOnBoard({ sx: 1, sy: 1 }, board, { + const section = getSectionOnBoard({ sx: 1, sy: 1 }, board!, { readOnly: true, }); - assertEquals(section.ch[0], ["D", "E", " ", " "]); - assertEquals(section.color[0][0], "F"); - assertEquals(section.bgColor[0][0], "0"); - assertEquals(section.width[0], [1, 1, 1, 1]); + expect(section.ch[0]).toEqual(["D", "E", " ", " "]); + expect(section.color[0][0]).toBe("F"); + expect(section.bgColor[0][0]).toBe("0"); + expect(section.width[0]).toEqual([1, 1, 1, 1]); }); - await t.step("getSectionOnBoard: non-existing row", () => { - assert(board); + it("getSectionOnBoard: non-existing row", () => { + expect(board).toBeDefined(); - const section = getSectionOnBoard({ sx: 1, sy: 2 }, board, { + const section = getSectionOnBoard({ sx: 1, sy: 2 }, board!, { readOnly: true, }); - assertEquals(section.ch[0][0], " "); - assertEquals(section.color[0][0], "F"); - assertEquals(section.bgColor[0][0], "0"); - assertEquals(section.width[0][0], 1); + expect(section.ch[0][0]).toBe(" "); + expect(section.color[0][0]).toBe("F"); + expect(section.bgColor[0][0]).toBe("0"); + expect(section.width[0][0]).toBe(1); }); - await t.step("getSectionOnBoard: non-existing section", () => { - assert(board); + it("getSectionOnBoard: non-existing section", () => { + expect(board).toBeDefined(); - const section = getSectionOnBoard({ sx: 2, sy: 1 }, board, { + const section = getSectionOnBoard({ sx: 2, sy: 1 }, board!, { readOnly: true, }); - assertEquals(section.ch[0][0], " "); - assertEquals(section.color[0][0], "F"); - assertEquals(section.bgColor[0][0], "0"); - assertEquals(section.width[0][0], 1); + expect(section.ch[0][0]).toBe(" "); + expect(section.color[0][0]).toBe("F"); + expect(section.bgColor[0][0]).toBe("0"); + expect(section.width[0][0]).toBe(1); }); - await t.step("renderFullBoard", () => { - assert(board); + it("renderFullBoard", () => { + expect(board).toBeDefined(); - const rendered = renderFullBoard(board); + const rendered = renderFullBoard(board!); checkFullBoard(rendered); }); - await t.step("on-demand creation: only changed sections are saved", () => { - assert(board); + it("on-demand creation: only changed sections are saved", () => { + expect(board).toBeDefined(); - assertEquals(board.sections[2], undefined); - assertEquals(board.sections[0][2], undefined); + expect(board!.sections[2]).toBeUndefined(); + expect(board!.sections[0][2]).toBeUndefined(); }); }); diff --git a/tests/character.test.ts b/tests/character.test.ts index c8e3a65..1a8c493 100644 --- a/tests/character.test.ts +++ b/tests/character.test.ts @@ -1,43 +1,40 @@ -import { - assertEquals, - assertThrows, -} from "https://deno.land/std@0.224.0/assert/mod.ts"; +import { it, expect } from "vitest"; -import { getCharacterWidth } from "../mod.ts"; +import { getCharacterWidth } from "../src/mod.ts"; -Deno.test("getCharacterWidth ASCII", () => { - assertEquals(getCharacterWidth("a"), 1); - assertEquals(getCharacterWidth("A"), 1); - assertEquals(getCharacterWidth("1"), 1); - assertEquals(getCharacterWidth("@"), 1); - assertEquals(getCharacterWidth(" "), 1); +it("getCharacterWidth ASCII", () => { + expect(getCharacterWidth("a")).toBe(1); + expect(getCharacterWidth("A")).toBe(1); + expect(getCharacterWidth("1")).toBe(1); + expect(getCharacterWidth("@")).toBe(1); + expect(getCharacterWidth(" ")).toBe(1); - assertThrows(() => getCharacterWidth("")); - assertThrows(() => getCharacterWidth("ab")); + expect(() => getCharacterWidth("")).toThrow(); + expect(() => getCharacterWidth("ab")).toThrow(); }); -Deno.test("getCharacterWidth CJK", () => { - assertEquals(getCharacterWidth("你"), 2); - assertEquals(getCharacterWidth("好"), 2); - assertEquals(getCharacterWidth("吗"), 2); +it("getCharacterWidth CJK", () => { + expect(getCharacterWidth("你")).toBe(2); + expect(getCharacterWidth("好")).toBe(2); + expect(getCharacterWidth("吗")).toBe(2); - assertEquals(getCharacterWidth("ガ"), 2); - assertEquals(getCharacterWidth("ギ"), 2); - assertEquals(getCharacterWidth("グ"), 2); - assertEquals(getCharacterWidth("ソ"), 2); + expect(getCharacterWidth("ガ")).toBe(2); + expect(getCharacterWidth("ギ")).toBe(2); + expect(getCharacterWidth("グ")).toBe(2); + expect(getCharacterWidth("ソ")).toBe(2); - assertEquals(getCharacterWidth("?"), 2); - assertEquals(getCharacterWidth("!"), 2); - assertThrows(() => getCharacterWidth("你好")); - assertThrows(() => getCharacterWidth("ヨスガノ")); + expect(getCharacterWidth("?")).toBe(2); + expect(getCharacterWidth("!")).toBe(2); + expect(() => getCharacterWidth("你好")).toThrow(); + expect(() => getCharacterWidth("ヨスガノ")).toThrow(); }); -Deno.test("getCharacterWidth Emoji", () => { - assertEquals(getCharacterWidth("👋"), 2); - assertEquals(getCharacterWidth("🌲️"), 2); - assertEquals(getCharacterWidth("👨‍👩‍👧‍👦"), 2); +it("getCharacterWidth Emoji", () => { + expect(getCharacterWidth("👋")).toBe(2); + expect(getCharacterWidth("🌲️")).toBe(2); + expect(getCharacterWidth("👨‍👩‍👧‍👦")).toBe(2); }); -Deno.test("getCharacterWidth previously faulty cases", () => { - assertEquals(getCharacterWidth("𤲶"), 2); +it("getCharacterWidth previously faulty cases", () => { + expect(getCharacterWidth("𤲶")).toBe(2); }); diff --git a/tests/checkFullBoard.ts b/tests/checkFullBoard.ts index 9484c40..954eceb 100644 --- a/tests/checkFullBoard.ts +++ b/tests/checkFullBoard.ts @@ -1,5 +1,5 @@ -import { getCharacterWidth } from "../logic/character.ts"; -import type { FullBoard } from "../types/board.ts"; +import { getCharacterWidth } from "../src/logic/character.ts"; +import type { FullBoard } from "../src/types/board.ts"; function isCorrectWidth(cWd: number, cCh: string): boolean { return getCharacterWidth(cCh) === cWd; diff --git a/tests/section.test.ts b/tests/section.test.ts index a70da5b..3240c0d 100644 --- a/tests/section.test.ts +++ b/tests/section.test.ts @@ -1,17 +1,13 @@ -import { - assert, - assertEquals, - assertThrows, -} from "https://deno.land/std@0.224.0/assert/mod.ts"; +import { describe, it, expect } from "vitest"; -import { applyChange, createSection } from "../logic/section.ts"; -import type { SectionData } from "../types/section.ts"; +import { applyChange, createSection } from "../src/logic/section.ts"; +import type { SectionData } from "../src/types/section.ts"; -Deno.test("section", async (t) => { +describe("section", () => { let section: SectionData | undefined; - await t.step("createSection non-lcm", () => { - assertThrows(() => { + it("createSection non-lcm", () => { + expect(() => { createSection( { sx: 0, sy: 0 }, { @@ -25,10 +21,10 @@ Deno.test("section", async (t) => { defaultWidth: 1, }, ); - }); + }).toThrow(); }); - await t.step("createSection non-origin section", () => { + it("createSection non-origin section", () => { section = createSection( { sx: 1, sy: 1 }, { @@ -43,11 +39,11 @@ Deno.test("section", async (t) => { }, ); - assertEquals(section.offsetX, 4); - assertEquals(section.offsetY, 3); + expect(section.offsetX).toBe(4); + expect(section.offsetY).toBe(3); }); - await t.step("createSection", () => { + it("createSection", () => { section = createSection( { sx: 0, sy: 0 }, { @@ -62,8 +58,8 @@ Deno.test("section", async (t) => { }, ); - assertEquals(section.offsetX, 0); - assertEquals(section.offsetY, 0); + expect(section.offsetX).toBe(0); + expect(section.offsetY).toBe(0); function assertSectionContent( content: T[][], @@ -71,11 +67,11 @@ Deno.test("section", async (t) => { columnCount: number, value: T, ) { - assertEquals(content.length, rowCount); + expect(content.length).toBe(rowCount); for (const row of content) { - assertEquals(row.length, columnCount); + expect(row.length).toBe(columnCount); for (const item of row) { - assertEquals(item, value); + expect(item).toBe(value); } } } @@ -86,44 +82,44 @@ Deno.test("section", async (t) => { assertSectionContent(section.width, 3, 4, 1); }); - await t.step("applyChange 1-width", () => { - assert(section); + it("applyChange 1-width", () => { + expect(section).toBeDefined(); - applyChange({ x: 0, y: 0, ch: "t" }, section); - assertEquals(section.ch[0], ["t", " ", " ", " "]); - assertEquals(section.ch[1], [" ", " ", " ", " "]); - assertEquals(section.width[0], [1, 1, 1, 1]); + applyChange({ x: 0, y: 0, ch: "t" }, section!); + expect(section!.ch[0]).toEqual(["t", " ", " ", " "]); + expect(section!.ch[1]).toEqual([" ", " ", " ", " "]); + expect(section!.width[0]).toEqual([1, 1, 1, 1]); }); - await t.step("applyChange 1-width at odd position", () => { - assert(section); + it("applyChange 1-width at odd position", () => { + expect(section).toBeDefined(); - applyChange({ x: 1, y: 0, ch: "t" }, section); - assertEquals(section.ch[0], ["t", "t", " ", " "]); - assertEquals(section.width[0], [1, 1, 1, 1]); + applyChange({ x: 1, y: 0, ch: "t" }, section!); + expect(section!.ch[0]).toEqual(["t", "t", " ", " "]); + expect(section!.width[0]).toEqual([1, 1, 1, 1]); }); - await t.step("applyChange 2-width at a correct position", () => { - assert(section); + it("applyChange 2-width at a correct position", () => { + expect(section).toBeDefined(); - applyChange({ x: 0, y: 0, ch: "あ" }, section); - assertEquals(section.ch[0], ["あ", "t", " ", " "]); - assertEquals(section.width[0], [2, 1, 1, 1]); + applyChange({ x: 0, y: 0, ch: "あ" }, section!); + expect(section!.ch[0]).toEqual(["あ", "t", " ", " "]); + expect(section!.width[0]).toEqual([2, 1, 1, 1]); }); - await t.step("applyChange 2-width at an alternate position", () => { - assert(section); + it("applyChange 2-width at an alternate position", () => { + expect(section).toBeDefined(); - applyChange({ x: 1, y: 0, ch: "あ" }, section); - assertEquals(section.ch[0], ["あ", "t", " ", " "]); - assertEquals(section.width[0], [2, 1, 1, 1]); + applyChange({ x: 1, y: 0, ch: "あ" }, section!); + expect(section!.ch[0]).toEqual(["あ", "t", " ", " "]); + expect(section!.width[0]).toEqual([2, 1, 1, 1]); }); - await t.step("applyChange incorrect section", () => { - assertThrows(() => { - assert(section); + it("applyChange incorrect section", () => { + expect(section).toBeDefined(); - applyChange({ x: 6, y: 3, ch: "あ" }, section); - }); + expect(() => { + applyChange({ x: 6, y: 3, ch: "あ" }, section!); + }).toThrow(); }); }); From 4bcbd865d3886f392fef03c980560682f6ac31b4 Mon Sep 17 00:00:00 2001 From: laosb Date: Sat, 29 Nov 2025 19:12:52 +0800 Subject: [PATCH 10/19] chore: Add packageManager field to package.json --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f6fe91..b260c4e 100644 --- a/package.json +++ b/package.json @@ -30,5 +30,6 @@ "obuild": "^0.4.3", "prettier": "^3.7.2", "vitest": "^4.0.14" - } + }, + "packageManager": "pnpm@10.23.0" } From bf976a8ceb368ca559caa9dad0b773b3278bd5e3 Mon Sep 17 00:00:00 2001 From: laosb Date: Sat, 29 Nov 2025 19:15:06 +0800 Subject: [PATCH 11/19] chore: Add TypeScript devDependency and update build entry --- build.config.ts | 2 +- package.json | 1 + pnpm-lock.yaml | 20 ++++++++++++++++---- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/build.config.ts b/build.config.ts index 2b9dc6f..fe36e73 100644 --- a/build.config.ts +++ b/build.config.ts @@ -1,5 +1,5 @@ import { defineBuildConfig } from "obuild/config"; export default defineBuildConfig({ - entries: ["mod.ts"], + entries: ["src/mod.ts"], }); diff --git a/package.json b/package.json index b260c4e..79c371d 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "devDependencies": { "obuild": "^0.4.3", "prettier": "^3.7.2", + "typescript": "^5.9.3", "vitest": "^4.0.14" }, "packageManager": "pnpm@10.23.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78622f7..a0941fa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,10 +14,13 @@ importers: devDependencies: obuild: specifier: ^0.4.3 - version: 0.4.3 + version: 0.4.3(typescript@5.9.3) prettier: specifier: ^3.7.2 version: 3.7.2 + typescript: + specifier: ^5.9.3 + version: 5.9.3 vitest: specifier: ^4.0.14 version: 4.0.14(jiti@2.6.1) @@ -989,6 +992,11 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + vite@7.2.4: resolution: {integrity: sha512-NL8jTlbo0Tn4dUEXEsUg8KeyG/Lkmc4Fnzb8JXN/Ykm9G4HNImjtABMJgkQoVjOBN/j2WAwDTRytdqJbZsah7w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1651,7 +1659,7 @@ snapshots: obug@2.1.1: {} - obuild@0.4.3: + obuild@0.4.3(typescript@5.9.3): dependencies: c12: 3.3.2 consola: 3.4.2 @@ -1664,7 +1672,7 @@ snapshots: pathe: 2.0.3 pretty-bytes: 7.1.0 rolldown: 1.0.0-beta.51 - rolldown-plugin-dts: 0.18.1(rolldown@1.0.0-beta.51) + rolldown-plugin-dts: 0.18.1(rolldown@1.0.0-beta.51)(typescript@5.9.3) tinyglobby: 0.2.15 transitivePeerDependencies: - '@ts-macro/tsc' @@ -1765,7 +1773,7 @@ snapshots: resolve-pkg-maps@1.0.0: {} - rolldown-plugin-dts@0.18.1(rolldown@1.0.0-beta.51): + rolldown-plugin-dts@0.18.1(rolldown@1.0.0-beta.51)(typescript@5.9.3): dependencies: '@babel/generator': 7.28.5 '@babel/parser': 7.28.5 @@ -1777,6 +1785,8 @@ snapshots: magic-string: 0.30.21 obug: 2.1.1 rolldown: 1.0.0-beta.51 + optionalDependencies: + typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver @@ -1852,6 +1862,8 @@ snapshots: tslib@2.8.1: optional: true + typescript@5.9.3: {} + vite@7.2.4(jiti@2.6.1): dependencies: esbuild: 0.25.12 From 5d862c0bf7c39f44f003dd486f7fca2c653d44f7 Mon Sep 17 00:00:00 2001 From: laosb Date: Sat, 29 Nov 2025 19:16:54 +0800 Subject: [PATCH 12/19] fix: Require workflow_run success for publish job --- .github/workflows/publish_jsr.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/publish_jsr.yml b/.github/workflows/publish_jsr.yml index 2480461..3da8364 100644 --- a/.github/workflows/publish_jsr.yml +++ b/.github/workflows/publish_jsr.yml @@ -9,6 +9,7 @@ on: jobs: publish: runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} permissions: contents: read From 6ae18c15b7c66f21331c5adbf5047108cf7b8ac3 Mon Sep 17 00:00:00 2001 From: laosb Date: Sat, 29 Nov 2025 19:19:17 +0800 Subject: [PATCH 13/19] fix: Use pnpm and Node 24 for JSR publish --- .github/workflows/publish_jsr.yml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/.github/workflows/publish_jsr.yml b/.github/workflows/publish_jsr.yml index 3da8364..0b1d2e9 100644 --- a/.github/workflows/publish_jsr.yml +++ b/.github/workflows/publish_jsr.yml @@ -18,5 +18,19 @@ jobs: steps: - uses: actions/checkout@v4 - - name: Publish package - run: npx jsr publish + - name: Setup repo + uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + with: + run_install: false + - uses: actions/setup-node@v4 + with: + node-version: "24.x" + cache: "pnpm" + + - name: Install dependencies + run: pnpm install + + - name: Publish to JSR + run: pnpm dlx jsr publish From 34e710f0361ba525fc65e48b24cae77ae26ae91a Mon Sep 17 00:00:00 2001 From: laosb Date: Sat, 29 Nov 2025 19:20:20 +0800 Subject: [PATCH 14/19] fix: Update test import to src/logic/board.ts --- tests/board.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/board.test.ts b/tests/board.test.ts index 268a513..cacbc2f 100644 --- a/tests/board.test.ts +++ b/tests/board.test.ts @@ -4,7 +4,7 @@ import { createBoard, getSectionOnBoard, renderFullBoard, -} from "../logic/board.ts"; +} from "../src/logic/board.ts"; import type { BoardData } from "../src/types/board.ts"; import { checkFullBoard } from "./checkFullBoard.ts"; import { locateSection } from "../src/logic/board.ts"; From b51545ab39722e07181493590245dcdd757a58dd Mon Sep 17 00:00:00 2001 From: laosb Date: Sun, 30 Nov 2025 10:28:57 +0800 Subject: [PATCH 15/19] fix: Strip JSR deps before publishing and add deno.json JSR itself does not accept 'jsr:' dependencies in package.json, remove them in the publish workflow before publishing. Add $schema to jsr.json. --- .github/workflows/publish_jsr.yml | 16 ++++++++++++++++ deno.json | 5 +++++ jsr.json | 1 + 3 files changed, 22 insertions(+) create mode 100644 deno.json diff --git a/.github/workflows/publish_jsr.yml b/.github/workflows/publish_jsr.yml index 0b1d2e9..3510919 100644 --- a/.github/workflows/publish_jsr.yml +++ b/.github/workflows/publish_jsr.yml @@ -32,5 +32,21 @@ jobs: - name: Install dependencies run: pnpm install + # This step removes JSR dependencies from package.json before publishing, + # Because apparently now while major npm compatible package managers + # support JSR dependencies in package.json, JSR itself does not. + - name: Remove JSR deps from package.json + run: | + node -e " + const fs = require('fs'); + const pkg = JSON.parse(fs.readFileSync('package.json', 'utf-8')); + for (const dep in pkg.dependencies ?? {}) { + if (pkg.dependencies[dep].startsWith('jsr:')) { + delete pkg.dependencies[dep]; + } + } + fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2)); + " + - name: Publish to JSR run: pnpm dlx jsr publish diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..32f3350 --- /dev/null +++ b/deno.json @@ -0,0 +1,5 @@ +{ + "imports": { + "@std/cli": "jsr:@std/cli@1" + } +} diff --git a/jsr.json b/jsr.json index ab18bfe..9961e03 100644 --- a/jsr.json +++ b/jsr.json @@ -1,4 +1,5 @@ { + "$schema": "https://jsr.io/schema/config-file.v1.json", "name": "@textplace/core", "version": "0.5.0", "exports": "./src/mod.ts", From 78898cc90be915831fcc7f9f0b46dcc3a58d32db Mon Sep 17 00:00:00 2001 From: laosb Date: Sun, 30 Nov 2025 10:31:58 +0800 Subject: [PATCH 16/19] fix: Consolidate package metadata into deno.json --- deno.json | 6 ++++++ jsr.json | 7 ------- 2 files changed, 6 insertions(+), 7 deletions(-) delete mode 100644 jsr.json diff --git a/deno.json b/deno.json index 32f3350..cede114 100644 --- a/deno.json +++ b/deno.json @@ -1,5 +1,11 @@ { + "name": "@textplace/core", + "version": "0.5.0", + "exports": "./src/mod.ts", "imports": { "@std/cli": "jsr:@std/cli@1" + }, + "publish": { + "include": ["src/**/*.ts", "LICENSE", "README.md"] } } diff --git a/jsr.json b/jsr.json deleted file mode 100644 index 9961e03..0000000 --- a/jsr.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "$schema": "https://jsr.io/schema/config-file.v1.json", - "name": "@textplace/core", - "version": "0.5.0", - "exports": "./src/mod.ts", - "include": ["src/**/*.ts", "LICENSE", "README.md"] -} From cfe0fb1514fb6ff76d9d8646f6915e67dc1c359a Mon Sep 17 00:00:00 2001 From: laosb Date: Sun, 30 Nov 2025 10:33:38 +0800 Subject: [PATCH 17/19] fix: Use --allow-dirty for jsr publish Allow publishing when package.json is modified earlier in the workflow --- .github/workflows/publish_jsr.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish_jsr.yml b/.github/workflows/publish_jsr.yml index 3510919..3925558 100644 --- a/.github/workflows/publish_jsr.yml +++ b/.github/workflows/publish_jsr.yml @@ -49,4 +49,5 @@ jobs: " - name: Publish to JSR - run: pnpm dlx jsr publish + # Have to use --allow-dirty because we modified package.json in the previous step + run: pnpm dlx jsr publish --allow-dirty From 0c901f0144a028ff4c03faa6c1d5b8ebad53e5de Mon Sep 17 00:00:00 2001 From: laosb Date: Sun, 30 Nov 2025 10:37:44 +0800 Subject: [PATCH 18/19] fix: Add repository checkout to publish NPM workflow --- .github/workflows/publish_npm.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/publish_npm.yml b/.github/workflows/publish_npm.yml index 5b8de40..b2642ee 100644 --- a/.github/workflows/publish_npm.yml +++ b/.github/workflows/publish_npm.yml @@ -9,6 +9,8 @@ jobs: contents: read id-token: write steps: + - name: Setup repo + uses: actions/checkout@v4 - uses: pnpm/action-setup@v4 with: run_install: false From 9d114182cf48b10956edb23dd96937320e063733 Mon Sep 17 00:00:00 2001 From: laosb Date: Sun, 30 Nov 2025 10:47:02 +0800 Subject: [PATCH 19/19] fix: Add --no-git-checks to pnpm publish step --- .github/workflows/publish_npm.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish_npm.yml b/.github/workflows/publish_npm.yml index b2642ee..1101e8c 100644 --- a/.github/workflows/publish_npm.yml +++ b/.github/workflows/publish_npm.yml @@ -23,6 +23,7 @@ jobs: - run: pnpm install - run: pnpm build - run: pnpm test - - run: pnpm publish --provenance --access public + # --no-git-checks because of https://github.com/pnpm/pnpm/issues/5894. + - run: pnpm publish --provenance --access public --no-git-checks env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}