Skip to content

v6.6.0

Choose a tag to compare

@58bits 58bits released this 20 Sep 12:24
· 72 commits to develop since this release

Highlights

  • @byline/cli — The starter templates now follow the reference application's block conventions. Two changes land together. The example photo block's layout option was renamed from display to position, matching the reference application and letting a block serializer be copied between the two without edits; the schema, the public renderer and the docs seed all carried the old name, and the seed in particular was writing display: 'wide', which a scaffolded app would have read back as position: undefined and silently rendered with the default layout. Separately, render-blocks.tsx is no longer a switch but a _type-keyed registry whose BlockRegistry mapped type requires an entry for every member of the PopulatedContentBlock union — adding a block to a collection's content field without writing a renderer is now a compile error in the scaffolded app rather than a hole in a rendered page. The runtime unsupported-block report is kept, because compile-time exhaustiveness cannot cover a document written by a different deployment. The overlay type WithPopulatedPhotoBlockContent was renamed WithPopulatedBlockContent and generalised to PopulateBlockRelations, one arm per relational block, since the old name stopped being accurate the moment a second relational block appeared. These templates are copied once at byline init, so an existing application is untouched; only newly scaffolded apps differ.

Bug Fixes

  • @byline/cli — byline setup no longer rejects an application that is simply not on the newest release. The supported dependency range was derived from the CLI's own exact version, so a 6.5.0 CLI computed >=6.5.0 <7.0.0-0 and refused an application declaring ^6.4.0 — a perfectly valid Byline 6 install — with "core @byline/* packages are missing or declare an incompatible range". Because npx @byline/cli always fetches the newest CLI, this affected every application that was even one release behind, and each publish silently ratcheted the floor up to itself. Acceptance now spans the whole major line (>=6.0.0 <7.0.0-0), which is the unit the @byline/* packages release in lockstep within. Installing and accepting are deliberately different ranges: a fresh install still pins ^<cli version>, since there is no reason to scaffold onto anything but the current release. Note that the check still reads the range declared in package.json rather than the resolved install, so an unbounded range such as >=6.0.0 remains rejected for admitting the next major.

  • @byline/cli — The database login prompt no longer reads as a Byline admin role. During byline setup the prompt said Application role on PostgreSQL, which collides with Byline's own first-class admin roles — byline_admin_roles, the roles screen and the admin.roles.* abilities — so it read as naming a permission role inside the CMS rather than a database login. Nothing in the prompt said it was a database login, that the running application connects as it, or that it is created when absent. It now states all three, and the adjacent password prompt was reworded from "application user" to "database login" so the two consecutive questions are plainly about one subject.

Chores

  • monorepo — Playwright and the dormant end-to-end suite were removed: apps/webapp/e2e, playwright.config.ts, the test:e2e scripts, the @playwright/test dependency, the Knip globs and the .gitignore entries. The suite was not referenced by CI and not part of the workflow, but its artefacts kept reading as live coverage. Browser verification is by hand against a running dev server; docs/13-testing.md now documents that, and the hand-written manual scripts (which were never Playwright) moved to apps/webapp/tests/manual/. The route-level checks on sitemap.xml, the .md representations and llms.txt went with the specs — the serialization format those expose is still unit-pinned in @byline/core and @byline/richtext-lexical, and the Accept: text/markdown negotiation rule in the webapp's own tests, but locale prefixing, caching headers and the redirect itself are now unpinned.
  • reference application — The example application gained self-hosted video as a worked example: a videos collection carrying both an encoded video file and a required poster image, a videoBlock with an optional lower-resolution mobile source, and a videoEmbedBlock for YouTube and Vimeo with a live thumbnail preview in the admin URL field. The poster's variant set deliberately includes a WebP poster alongside the AVIF variants, because <video poster> takes a single URL and cannot negotiate format — an AVIF-only poster renders as nothing below Safari 16.4. A shared styles/blocks/ layer adds block rhythm, media caption styling and editorial full-bleed for full-width blocks. None of this ships in a package; it is reference material for applications building the same thing.

All other @byline/* packages bumped to 6.6.0 in lockstep with no behavioural changes this cycle.