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.
This commit is contained in:
tiennm99 committed 2026-05-10 00:36:39 +07:00
1 parent 8fc3ec6ebd
commit 777b2dbaec
6 files changed
+6 -130

No files matched your search

+1 -1
View File
@@ -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:
-5
View File
@@ -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 = [];
}
+4 -11
View File
@@ -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);
-42
View File
@@ -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]}`;
}
-70
View File
@@ -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);
});
});
+1 -1
View File
@@ -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) {