No SQL text in the cache logic any more. Statements live in two files, parsed by sqlStatements (`-- name:` sections, as in finquick's brcal/gcbook.js) and imported as text (wrangler Text rule for *.sql): - cache-read.sql: selects only, checked when the module loads - cache-write.sql: schema, the v2 renumbering, etch, drops store.ts turns them into two frozen facets with domain methods: makeReader(sql) runs only the read statements (page, knownTotal, deepestPageSince, pagesThrough); makeWriter(storage) only the write ones (migrate, etch, dropPagesThrough), each change one transaction. The cache migrates in its constructor under blockConcurrencyWhile, as Cloudflare recommends, so readers never meet missing tables; the migration test plants v1 storage and evicts to get a fresh activation. A viewer() facet (PageViewer: stored pages and fill progress, from the reader alone) is added for the public page. Pure refactor: stored state and behavior unchanged. Generated-by: Claude Opus 5.5
16 lines
673 B
TypeScript
16 lines
673 B
TypeScript
import { describe, expect, it } from "vitest";
|
|
import { sqlStatements } from "../src/sql-statements.js";
|
|
|
|
describe("sqlStatements", () => {
|
|
it("splits a .sql file into named statements at each `-- name:` line, dropping the trailing ;", () => {
|
|
const text = "-- first:\nselect 1;\n\n-- second:\nselect *\nfrom t\nwhere a = ?;\n";
|
|
expect(sqlStatements(text)).toEqual({ first: "select 1", second: "select *\nfrom t\nwhere a = ?" });
|
|
});
|
|
|
|
it("keeps a multi-statement entry whole (inner semicolons stay)", () => {
|
|
expect(sqlStatements("-- both:\nupdate a set x = 1;\nupdate b set y = 2;\n")).toEqual({
|
|
both: "update a set x = 1;\nupdate b set y = 2",
|
|
});
|
|
});
|
|
});
|