emdash@1.0.1
Patch Changes
-
#3515
d274172Thanks @ascorbic! - Releases EmDash 1.0. This release includes breaking changes, such as removing APIs deprecated during 0.x. Before upgrading from 0.42, read the upgrade guide, which lists each change and how to migrate.From this release, breaking changes ship only in a new major version.
-
#3531
f6674faThanks @danielmlr! - Fixes recreating a deleted collection failing withCollection "…" already exists(COLLECTION_EXISTS) on sites with media usage tracking turned on, which new sites turn on automatically. Creating a collection through the admin, the API, MCP or a seed now finishes the deleted collection's media usage cleanup first, so sites already stuck in this state can recreate the collection after upgrading.Each create attempt does a bounded amount of that cleanup. If it can't finish, for example because the deleted collection referenced media from many entries, the error says the collection is being deleted, and the next attempt continues where the last one stopped. If the cleanup has failed, the error says so and includes the deleted collection's ID in
details.deletedCollectionId. Both errors keep theCOLLECTION_EXISTScode. Send that ID as{ "collectionId": "…" }toPOST /_emdash/api/admin/media-usage/collection-deletions/retry, which requires theschema:managepermission and, for API tokens, theadminscope, then create the collection again. -
#3537
02c2ad3Thanks @akapug! - Fixes the WordPress media URL rewrite matching a URL map key that carries a query string by its base URL. A key such as an attachment's?attachment_id=7shortlink also matched the home page, so the rewrite pointed links to the home page at that file. Such a key now matches that URL only, and inside a text field only where the URL ends with it. -
#3518
bc54886Thanks @ascorbic! - Moves the subpaths that only EmDash itself loads underemdash/internal/, and the D1 and Hyperdrive migration executors under@emdash-cms/cloudflare/internal/. These paths are not public API: their exports can change or be removed in any release.Sites that use
emdash()inastro.config.mjsneed no changes. The integration, the database, cache and media adapter helpers, and the first-party Cloudflare, workerd sandbox and plugin-test packages all load the new paths automatically.The following subpaths are removed:
Removed subpath Now loaded from emdash/routes/*emdash/internal/routes/*emdash/middleware/authemdash/internal/middleware/authemdash/middleware/redirectemdash/internal/middleware/redirectemdash/middleware/request-contextemdash/internal/middleware/request-contextemdash/middleware/setupemdash/internal/middleware/setupemdash/middleware/media-usage-write-fenceemdash/internal/middleware/media-usage-write-fenceemdash/image-endpointemdash/internal/image-endpointemdash/media/local-runtimeemdash/internal/media/local-runtimeemdash/object-cache/memoryemdash/internal/object-cache/memoryemdash/db/sqlite-migrationsemdash/internal/db/sqlite-migrationsemdash/db/libsql-migrationsemdash/internal/db/libsql-migrationsemdash/db/postgres-migrationsemdash/internal/db/postgres-migrationsemdash/database/migration-lockemdash/internal/database/migration-lockemdash/database/pg-migration-lockemdash/internal/database/pg-migration-lockemdash/plugins/hostemdash/internal/plugins/hostemdash/plugins/http-wireemdash/internal/plugins/http-wireemdash/plugins/adapt-sandbox-entryemdash/internal/plugins/adapt-sandbox-entryemdash/plugin-test-runtimeemdash/internal/plugin-test-runtimeemdash/testing/registryemdash/internal/testing/registry@emdash-cms/cloudflare/db/d1-migrations@emdash-cms/cloudflare/internal/db/d1-migrations@emdash-cms/cloudflare/db/hyperdrive-migrations@emdash-cms/cloudflare/internal/db/hyperdrive-migrationsWhat should I do?
If your project or package imports one of the removed subpaths directly, replace the import with a public entrypoint:
- To configure a database, object cache or media provider, use
sqlite(),libsql()orpostgres()fromemdash/db,memoryCache()fromemdash/astro, orlocalMedia()fromemdash/media, instead of writing their entrypoints by hand. - To test a plugin, use
@emdash-cms/plugin-testinstead ofemdash/plugin-test-runtime. - To run your own middleware before EmDash's, set the
middleware.outeroption ofemdash(). The internal auth, setup, redirect and request-context middleware have no public replacement.
Rebuild after upgrading.
emdash migraterejects a migration manifest written by an earlier EmDash version. - To configure a database, object cache or media provider, use
-
#3519
0b4be2cThanks @ascorbic! - Removes the deprecatedCommentsandCommentFormexports fromemdash/ui. Sites that still import either component fromemdash/uifail to build after upgrading.Import them from
emdash/ui/commentsinstead:- import { Comments, CommentForm } from "emdash/ui"; + import { Comments, CommentForm } from "emdash/ui/comments";
The components themselves are unchanged. Importing them from
emdash/ui/commentsalso keeps comment styles off pages that don't render comments. -
#3519
0b4be2cThanks @ascorbic! - Removes the deprecatedemdash devandemdash auth secretCLI commands. Scripts that still call either command now exit withUnknown command.- Replace
emdash devwith the site's own dev script, such aspnpm dev, or runastro devdirectly. The site then uses its configured database adapter instead of a local./data.db, whichemdash devcreated and migrated even on D1 sites. Theurlkey underemdashinpackage.jsonwas only read byemdash dev --typesand can be deleted. To generate types from a remote instance, runemdash types --url <site-url>, or setEMDASH_URL. - Remove
emdash auth secretfrom scripts. New installations don't needEMDASH_AUTH_SECRET. Existing installations should keep the value they already have, since EmDash still reads it to keep commenter-IP hashes stable. To encrypt plugin secrets at rest, generateEMDASH_ENCRYPTION_KEYwithemdash secrets generate.
- Replace
-
#3519
0b4be2cThanks @ascorbic! - Removes the deprecatedexperimental.registryintegration option. Sites that still set it now fail at startup with an error pointing to the top-levelregistryoption, including sites that already setregistryalongside it. The value is not silently ignored, because that would drop the configured aggregator and release-age policy.Move the value unchanged. The top-level option accepts the same URL string or configuration object:
emdash({ - experimental: { - registry: { - aggregatorUrl: "https://registry.example.com", - policy: { minimumReleaseAge: "48h" }, - }, - }, + registry: { + aggregatorUrl: "https://registry.example.com", + policy: { minimumReleaseAge: "48h" }, + }, });The
experimentaloption is also removed from theEmDashConfigtype, because it has no remaining settings. An emptyexperimental: {}block is still ignored at runtime, but TypeScript configs should delete it. Registry configuration errors in the admin now always name the top-levelregistry.*setting. -
#3322
1cdca21Thanks @danielmlr! - FixesrouteCtx.uibeing undefined for the declared Block Kit pages and dashboard widgets of plugins registered inplugins: []. They now receive the administrator's locale, text direction, and surface, as sandboxed plugins do, so a plugin can localize its Block Kit text in both install modes. -
#3519
0b4be2cThanks @ascorbic! - Adds a startup warning when an installed or configured plugin declares deprecated capability names such asread:content,network:fetchorpage:inject. The warning appears once per plugin and lists each current replacement, for exampleread:content → content:read. The deprecated names keep working throughout 1.x. If a plugin you use triggers the warning, update it, or ask its author to publish a version that uses the current names.aiSearch()from@emdash-cms/cloudflarenow declarescontent:read, so it no longer triggers the warning. -
Updated dependencies [
6f2ef26,c66b49b,9e297d6,d274172,a3609fb,618591e,0b4be2c]:- @emdash-cms/admin@1.0.1
- @emdash-cms/auth@1.0.1
- @emdash-cms/blocks@1.0.1
- @emdash-cms/gutenberg-to-portable-text@1.0.1