release: v0.14.0

Fourteen commits since v0.13.0. See CHANGELOG.md for the full list.

Two additions: `npm run doctor`, which runs the config doctor from a terminal — including inside the shipped image — and exits with the worst finding, so it can gate a deployment script; and a Playwright spec that loads all fourteen admin routes against a production build.

One change, invisible on screen: the admin panel got a form-field layer (#533).

Five fixes: grid.gap on both axes (#513), the dashboard status badge (#539), the journal editor's unsaved-changes guard (#538), essay paragraph markup (#537), and aria-pressed on the panel's switches and pickers.
This commit is contained in:
Ralksta
2026-08-30 15:11:25 +02:00
committed by GitHub
parent a813433891
commit e99d3f2f1b
59 changed files with 8652 additions and 6676 deletions

26
scripts/doctor.mjs Normal file
View File

@@ -0,0 +1,26 @@
/**
* Entry point for `npm run doctor` — see scripts/doctor.mts for the doctor
* itself, and for why it is TypeScript run by node's own type stripping (#521).
*
* This launcher is plain JavaScript so that it parses on every Node version.
* Type stripping arrived in Node 22.18; older runtimes fail on the `.mts` file
* with an ERR_UNKNOWN_FILE_EXTENSION stack trace, which is not an answer to
* give someone whose site is already down. The version is checked here, before
* the import that would throw.
*/
const [major, minor] = process.versions.node.split('.').map(Number);
if (major < 22 || (major === 22 && minor < 18)) {
process.stderr.write(
`\nThe config doctor needs Node 22.18 or newer (this is ${process.versions.node}).\n` +
`It runs TypeScript directly, which older versions cannot do.\n\n` +
`The same checks are in the admin panel: /admin → the status badge → Diagnostics.\n` +
`The shipped Docker image already has a new enough Node:\n` +
` docker compose exec folio npm run doctor\n\n`,
);
process.exit(3);
}
const { main } = await import('./doctor.mts');
process.exitCode = await main();