From 777b2dbaeca483a44c5dfc4173220d39e75a061e Mon Sep 17 00:00:00 2001 From: tiennm99 Date: Sun, 10 May 2026 00:36:39 +0700 Subject: [PATCH] refactor: drop dead code left over from Cloudflare era - Remove vietnamese-number.js + test: build-time Python script (generate-audio.py) is the sole spec for pre-baked MP3s; runtime no longer reads the JS module. - Remove resetMaster() export: only ever called from tests; inline the two-line body at test sites. - Update Python docstring to drop the JS-mirror reference. - Rewrite stale "CF Pages root" comment in svelte.config.js. --- web/scripts/generate-audio.py | 2 +- web/src/lib/master-store.svelte.js | 5 -- web/src/lib/master-store.test.js | 15 ++---- web/src/lib/vietnamese-number.js | 42 ---------------- web/src/lib/vietnamese-number.test.js | 70 --------------------------- web/svelte.config.js | 2 +- 6 files changed, 6 insertions(+), 130 deletions(-) delete mode 100644 web/src/lib/vietnamese-number.js delete mode 100644 web/src/lib/vietnamese-number.test.js diff --git a/web/scripts/generate-audio.py b/web/scripts/generate-audio.py index 3ccee6c..1131ea7 100755 --- a/web/scripts/generate-audio.py +++ b/web/scripts/generate-audio.py @@ -23,7 +23,7 @@ ONES = [ def number_to_vietnamese(n: int) -> str: - """Mirror of src/lib/vietnamese-number.js for build-time use.""" + """Canonical Vietnamese number speller for build-time audio generation.""" if n < 10: return ONES[n] if n == 10: diff --git a/web/src/lib/master-store.svelte.js b/web/src/lib/master-store.svelte.js index 6155993..d3af66a 100644 --- a/web/src/lib/master-store.svelte.js +++ b/web/src/lib/master-store.svelte.js @@ -91,8 +91,3 @@ export function drawNext() { return next; } -/** Wipe everything — used by tests and when leaving a game permanently. */ -export function resetMaster() { - masterState.called = []; - masterState.remaining = []; -} diff --git a/web/src/lib/master-store.test.js b/web/src/lib/master-store.test.js index 19278ad..765fac3 100644 --- a/web/src/lib/master-store.test.js +++ b/web/src/lib/master-store.test.js @@ -5,14 +5,14 @@ import { drawNext, loadMaster, masterState, - resetMaster, saveMaster, startNewGame, } from "./master-store.svelte.js"; beforeEach(() => { localStorage.clear(); - resetMaster(); + masterState.called = []; + masterState.remaining = []; }); describe("master-store", () => { @@ -48,14 +48,6 @@ describe("master-store", () => { expect(masterState.remaining).toEqual([]); }); - it("resetMaster clears both arrays", () => { - startNewGame(); - drawNext(); - resetMaster(); - expect(masterState.called).toEqual([]); - expect(masterState.remaining).toEqual([]); - }); - it("save + load round-trip preserves state", () => { startNewGame(); drawNext(); @@ -63,7 +55,8 @@ describe("master-store", () => { const calledBefore = [...masterState.called]; const remainingBefore = [...masterState.remaining]; saveMaster(); - resetMaster(); + masterState.called = []; + masterState.remaining = []; expect(masterState.called).toEqual([]); loadMaster(); expect(masterState.called).toEqual(calledBefore); diff --git a/web/src/lib/vietnamese-number.js b/web/src/lib/vietnamese-number.js deleted file mode 100644 index 1eb465f..0000000 --- a/web/src/lib/vietnamese-number.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Vietnamese number-words for lô tô calls. Pure, no DOM, no I/O. - * @module lib/vietnamese-number - */ - -const ONES = [ - "không", - "một", - "hai", - "ba", - "bốn", - "năm", - "sáu", - "bảy", - "tám", - "chín", -]; - -/** - * Convert an integer 0..90 to its spoken Vietnamese form, honoring the - * tonal exceptions that show up in lô tô (15 = "mười lăm", 21 = "hai mươi - * mốt", 25 = "hai mươi lăm", etc.). Out-of-range values fall back to a - * plain `String(n)` so the caller never has to guard against undefined. - * @param {number} n - * @returns {string} - */ -export function numberToVietnamese(n) { - if (!Number.isInteger(n) || n < 0 || n > 90) return String(n); - if (n < 10) return ONES[n]; - if (n === 10) return "mười"; - if (n < 20) { - const u = n - 10; - return u === 5 ? "mười lăm" : `mười ${ONES[u]}`; - } - const t = Math.floor(n / 10); - const u = n % 10; - const tens = `${ONES[t]} mươi`; - if (u === 0) return tens; - if (u === 1) return `${tens} mốt`; - if (u === 5) return `${tens} lăm`; - return `${tens} ${ONES[u]}`; -} diff --git a/web/src/lib/vietnamese-number.test.js b/web/src/lib/vietnamese-number.test.js deleted file mode 100644 index f4df274..0000000 --- a/web/src/lib/vietnamese-number.test.js +++ /dev/null @@ -1,70 +0,0 @@ -import { describe, expect, it } from "vitest"; -import { numberToVietnamese } from "./vietnamese-number.js"; - -describe("numberToVietnamese — units 0..9", () => { - it.each([ - [0, "không"], - [1, "một"], - [2, "hai"], - [3, "ba"], - [4, "bốn"], - [5, "năm"], - [6, "sáu"], - [7, "bảy"], - [8, "tám"], - [9, "chín"], - ])("%i → %s", (n, expected) => { - expect(numberToVietnamese(n)).toBe(expected); - }); -}); - -describe("numberToVietnamese — teens 10..19 (mười …, with mười lăm exception)", () => { - it.each([ - [10, "mười"], - [11, "mười một"], - [12, "mười hai"], - [13, "mười ba"], - [14, "mười bốn"], - [15, "mười lăm"], - [16, "mười sáu"], - [17, "mười bảy"], - [18, "mười tám"], - [19, "mười chín"], - ])("%i → %s", (n, expected) => { - expect(numberToVietnamese(n)).toBe(expected); - }); -}); - -describe("numberToVietnamese — 20..90 (mốt and lăm exceptions, ten-only forms)", () => { - it.each([ - [20, "hai mươi"], - [21, "hai mươi mốt"], - [22, "hai mươi hai"], - [25, "hai mươi lăm"], - [29, "hai mươi chín"], - [30, "ba mươi"], - [31, "ba mươi mốt"], - [40, "bốn mươi"], - [45, "bốn mươi lăm"], - [55, "năm mươi lăm"], - [61, "sáu mươi mốt"], - [70, "bảy mươi"], - [81, "tám mươi mốt"], - [85, "tám mươi lăm"], - [90, "chín mươi"], - ])("%i → %s", (n, expected) => { - expect(numberToVietnamese(n)).toBe(expected); - }); -}); - -describe("numberToVietnamese — out of range falls back to String(n)", () => { - it.each([ - [-1, "-1"], - [91, "91"], - [100, "100"], - [0.5, "0.5"], - [Number.NaN, "NaN"], - ])("%p → %p", (n, expected) => { - expect(numberToVietnamese(/** @type {number} */ (n))).toBe(expected); - }); -}); diff --git a/web/svelte.config.js b/web/svelte.config.js index c94c11f..44fe2c0 100644 --- a/web/svelte.config.js +++ b/web/svelte.config.js @@ -13,7 +13,7 @@ const env = loadEnv(process.env.NODE_ENV ?? "development", process.cwd(), ""); // 1. NEXT_BASE_PATH — explicit override (escape hatch) // 2. codeserver dev → /absproxy/{port} // 3. BUILD_PROFILE=gh → /loto -// 4. default (CF Pages root, local dev) → "" +// 4. default (local dev / generic static host) → "" function resolveBase() { if (process.env.NEXT_BASE_PATH != null) return process.env.NEXT_BASE_PATH; if (isCodeserver) {