Categories were baked into config/<site>.site.json, so adding one meant a rebuild and a redeploy. They are now data: data/sections.json, seeded from the config the first time, and managed in the admin (add, rename, reorder, remove). A category's web address is fixed when it is created because that is what a QR code points at, and a category cannot be removed while it still holds menus. The landing and the top bar were the ugliest parts. The landing was a column of hairlines with tiny meta — a broadsheet, and the paper that makes this app worth looking at was nowhere on it. It is now a shelf: each category is a row whose right edge is a sliver of that menu's first page, bleeding off the screen, with the shelf edge in brass and the name in heavy tight Archivo. The bar was a row of teal pills that would not survive more categories: it now names the menu you are reading and opens a sheet listing the rest, each with its own paper sliver, and the current one is the only teal thing on screen. The sheet is a link to the landing page, so navigating still works without the script. Also fixes the category manager's own layout, which I shipped unstyled, and the markup contract the route tests described.
26 lines
806 B
TypeScript
26 lines
806 B
TypeScript
/**
|
|
* Reports integrity problems in the data directory without changing anything.
|
|
* Fatal problems are what the server refuses to start on.
|
|
*
|
|
* npm run verify
|
|
*/
|
|
|
|
import { hasFatal, validateSite } from '../storage/validate.ts';
|
|
import { SectionStore } from '../storage/sections.ts';
|
|
import { loadCliSite } from './site.ts';
|
|
|
|
const { config, dataDir } = await loadCliSite();
|
|
const sections = new SectionStore({ dataDir, seed: config.sections });
|
|
await sections.load();
|
|
|
|
const problems = await validateSite({ dataDir, sections });
|
|
|
|
if (problems.length === 0) {
|
|
console.log(`ok: ${dataDir}`);
|
|
} else {
|
|
for (const problem of problems) console.log(`${problem.level}: ${problem.message}`);
|
|
console.log(`${problems.length} problem(s) in ${dataDir}`);
|
|
}
|
|
|
|
if (hasFatal(problems)) process.exitCode = 1;
|