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
This commit is contained in:
Shibo Lyu 2025-11-29 19:11:49 +08:00
parent 7923680e80
commit 32534084df
26 changed files with 2132 additions and 430 deletions

View file

@ -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();
});
});