Files
thptqg/web/svelte.config.js
T
tiennm99 3fd137a233 refactor(web): rebuild the frontend on SvelteKit, TypeScript and Tailwind
The app was a single-entry React SPA: one index.html that the assembler
copied to every dataset path, with a hand-rolled router resolving the
dataset from window.location and the title patched in at runtime because
one file had to serve every route.

SvelteKit prerenders a real page per route instead. The entry generator
in routes/[dataset]/+page.ts reads the same datasets.json the assembler
does, so the set of pages and the set of databases cannot drift apart,
and each dataset page ships its own <title> and description.

Everything framework-free moved across unchanged in behaviour and became
typed: the admission blocks, subject list, query classifier and SQL
presets. `Student` now mirrors the 22-column table, so a mistyped column
name fails the build rather than rendering blank.

Tailwind replaces the stylesheet. Theme tokens are CSS variables, which
keeps dark mode a single block of overrides rather than a `dark:` variant
on every class. The score tiers stay hand-written CSS: the class is
chosen at runtime from a score, and no utility generator can see that.

Adds the tests the frontend never had, over the three modules where a
silent wrong answer is possible — most importantly that toAscii here
folds exactly as ToAscii does in the parser, which is what makes
accent-insensitive search find anything.

The assembler stops copying index.html per dataset and checks that the
build prerendered each one instead. The database presence, raw-artifact
and idempotence guards are untouched.

Verified: 25 tests, ESLint and svelte-check clean, and a full
`assemble site` producing /thptqg/, /thptqg/2016/, /thptqg/2017/ and
404.html with absolute asset URLs. Not verified in a browser — this
machine has none.
2026-08-14 11:38:29 +07:00

26 lines
977 B
JavaScript

import adapter from "@sveltejs/adapter-static";
import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
/**
* Every route is prerendered to a real HTML file, so GitHub Pages serves static
* documents and no SPA 404-fallback is needed — a fallback would rewrite the URL
* and break the ?q= deep links.
*
* `paths.relative: false` keeps every asset URL absolute (/thptqg/_app/...), so
* the copy of index.html that serves as 404.html resolves its assets from any
* depth — GitHub Pages answers /thptqg/anything/at/all/ with that one file.
*
* `files.assets` points outside this workspace because the assembler stages the
* gzipped databases there (assembler/internal/databases).
*
* @type {import('@sveltejs/kit').Config}
*/
export default {
preprocess: vitePreprocess(),
kit: {
adapter: adapter({ pages: "dist", assets: "dist", strict: true }),
paths: { base: "/thptqg", relative: false },
files: { assets: "../.build/public" },
},
};