github emdash-cms/emdash emdash@0.26.0

latest releases: create-emdash@0.26.0, @emdash-cms/gutenberg-to-portable-text@0.26.0
6 hours ago

Minor Changes

  • #1659 facdcfc Thanks @ttmx! - Adds content scheduling hooks for plugins to react when entries are scheduled or unscheduled.

  • #1695 5dea403 Thanks @ascorbic! - Updates EmDashHead JSON-LD rendering for Astro CSP compatibility.

    Sites using <EmDashHead /> do not need to change anything. JSON-LD structured data is still rendered automatically, but EmDash now registers the generated script hashes with Astro's CSP runtime API so strict CSP can allow them.

    This also adds renderPageMetadata(metadata, { includeJsonLd: false }) for advanced integrations that render metadata manually and want to handle JSON-LD script tags themselves. The default remains unchanged: calling renderPageMetadata(metadata) still includes JSON-LD script tags in the returned HTML string.

Patch Changes

  • #1661 f44a277 Thanks @greymoth-jp! - The editor footer now counts CJK (Chinese, Japanese, Korean) characters in its word count and reading-time estimate. Because these scripts have no spaces between words, the footer previously counted a whole paragraph as a single word and showed "1 min read" for long CJK drafts, even though the published page reported the correct reading time. The footer now matches the published reading time for CJK content; English and other space-delimited text is unchanged.

  • #1561 971c627 Thanks @marcusbellamyshaw-cell! - Fixes datetime fields becoming unsavable through the admin editor (#1368). A datetime-local input (or a seed) produces a naive value such as 2026-06-04T18:30:00 with no Z suffix or timezone offset, which the field validator rejected — and because the editor re-sends every field on autosave, an entry holding such a value could no longer be saved. Datetime fields now accept naive values (with or without seconds), values with a Z suffix or an explicit offset, and date-only values, while still rejecting non-dates.

  • #1560 e5b95e1 Thanks @marcusbellamyshaw-cell! - Fixes a cryptic build failure when a configured plugin has no resolvable entrypoint (#1416). Passing an inline definePlugin({...}) result directly to plugins: [] previously failed deep in the bundler with an unhelpful "failed to resolve import" error. The build now fails fast with a clear message that names the offending plugin and explains that plugins: [] entries must resolve to a file or package entrypoint — move the plugin into its own module and reference it from there.

  • #1603 13b87b7 Thanks @Vallhalen! - Fixes silent null entries on wide-schema collections under Cloudflare D1. The content loader's single-query LEFT JOIN _emdash_seo added 5 alias columns to every result set, which pushed collections with ~95+ flat user fields past D1's per-query column limit (~100). The query failed with D1_ERROR: too many columns in result set, the error was wrapped as a generic Failed to load entry, and the call site surfaced null. SEO is now folded into a single aggregated JSON column (mirroring how byline and taxonomy hydration already work), keeping the result-set width bounded regardless of how wide the collection schema gets while preserving the single round trip.

  • #1542 8f7604d Thanks @marcusbellamyshaw-cell! - Fixes a crash that returned HTTP 500 on every route on Cloudflare Workers when native plugins are registered with definePlugin (Cannot access 'SIMPLE_ID' before initialization). Plugin registration is now safe regardless of bundle ordering.

  • #1554 3d80be5 Thanks @marcusbellamyshaw-cell! - Fixes collection where taxonomy filters matching nothing when filtering a non-default locale by its localized term slug. Term slugs now resolve in the active query locale (#1480).

  • #1674 d1116ae Thanks @khoinguyenpham04! - Adds the internal media usage index foundation for upcoming usage-aware media workflows. This creates the usage index schema during migrations but does not change Media Library behavior yet.

  • #1399 192741f Thanks @scottbuscemi! - Cut per-render D1 round trips on public pages by caching taxonomy definitions across the worker isolate, and harden the runtime/DB singletons against bundler module duplication.

    Every public render that hydrates entry terms read SELECT * FROM _emdash_taxonomy_defs (via getTaxonomyDefsgetCollectionTaxonomyNames), which only had per-request caching. On Cloudflare D1, where the worker colo is often far from the database primary, each query is a ~40ms cross-region round trip, so this fired on every warm request for no benefit — taxonomy definitions change extremely rarely (created via the admin API or a seed; there is no edit/delete-def path). They're now cached per-isolate behind a globalThis Symbol holder (the same two-tier pattern as settings/index.ts and the byline field-defs cache), keyed by resolved locale and invalidated in-memory by every def write (handleTaxonomyCreate, seed application). Invalidation is in-memory rather than a persisted version probe on purpose: a per-request version read would merely replace the query being removed, yielding no net saving on warm isolates. Isolated databases (playground / DO preview) bypass the cache.

    Separately, the cached runtime instance, the DB-instance cache, and the in-flight DB-init promise (astro/middleware.ts, emdash-runtime.ts) were plain module-scoped variables. Under Vite SSR chunk duplication those can become multiple independent copies, letting cold-start migrations and bootstrap reads re-run on requests that should have hit the warm cache. They now live on globalThis behind Symbol keys, matching the existing SETUP_VERIFIED_KEY / request-context / request-cache singletons.

    No schema changes, no public API changes, fully backwards compatible.

  • #1692 737da19 Thanks @MA2153! - Restores the missing idx_taxonomies_parent index on taxonomies(parent_id), which was silently dropped by the i18n table rebuild in an earlier version. Installs upgrade automatically; hierarchical (parent/child) taxonomy lookups are indexed again.

  • #1696 5299d38 Thanks @ascorbic! - Fixes i18n collection sitemaps so untranslated entries include self hreflang and x-default alternates.

  • Updated dependencies [dc32673, fe832ce]:

    • @emdash-cms/admin@0.26.0
    • @emdash-cms/auth@0.26.0
    • @emdash-cms/gutenberg-to-portable-text@0.26.0

Don't miss a new emdash release

NewReleases is sending notifications on new releases.