Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion .changeset/pre.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"@nextlyhq/blocks-engine": "0.0.2-alpha.39",
"@nextlyhq/plugin-seo": "0.0.2-alpha.41",
"@nextlyhq/blocks-react": "0.0.2-alpha.51",
"@nextlyhq/builder": "0.0.2-alpha.55"
"@nextlyhq/builder": "0.0.2-alpha.55",
"@nextlyhq/module-specifiers": "0.0.2-alpha.56"
},
"changesets": [
"activity-log-survives-user-deletion",
Expand All @@ -40,6 +41,7 @@
"admin-post-commit-warning-toast",
"admin-provider-form-descriptors",
"admin-publish-button-gating",
"admin-rounded-geist-default",
"admin-shadcn-standards-p3",
"admin-shortcut-migration",
"admin-theming-readiness",
Expand Down Expand Up @@ -92,8 +94,11 @@
"blocks-react-typecheck",
"branding-colors-paint",
"brave-apples-wear",
"breakpoint-dialog",
"breakpoints-move-to-builder",
"builder-custom-css-permission",
"builder-ddl-system-columns",
"builder-frame-geometry",
"builder-package",
"builder-text-column-width",
"cache-revalidation-core",
Expand All @@ -106,6 +111,7 @@
"collection-hooks-registration",
"collection-schema-lock",
"color-hex",
"color-picker",
"colour-conversions-for-an-editing-surface",
"column-width-follows-the-builder",
"companion-schema-tx",
Expand Down Expand Up @@ -152,7 +158,9 @@
"email-provider-definitions",
"email-provider-form-reconciliation",
"email-provider-secret-required",
"email-recipient-erasure",
"endpoint-gated-outbox-recording",
"engines-match-supported-range",
"entity-delete-teardown",
"entry-validation-and-table-naming-fixes",
"event-outcome-field",
Expand All @@ -177,6 +185,7 @@
"field-group-settlement-verification",
"field-group-storage-name-resolution",
"field-group-transports-provision",
"field-group-type-entry-point",
"field-group-typegen",
"field-groups-admin",
"field-groups-config-api",
Expand All @@ -201,6 +210,7 @@
"form-submissions-server",
"form-submissions-view",
"forms-main-nav",
"frame-content-origin-padding",
"hook-error-propagation",
"host-fetch-policy",
"i18n-companion-apply-and-registration",
Expand All @@ -217,6 +227,7 @@
"json-shape-guard",
"junction-storage-is-a-relationship-feature",
"list-items-cap",
"list-shell-pagination",
"localization-migration-intent",
"localized-slug-revalidation",
"localized-target-read-predicates",
Expand All @@ -229,7 +240,9 @@
"media-i18n-companion-followups",
"media-upload-queue",
"migrate-baseline",
"migration-dry-run-and-backup-gate",
"migration-primary-keys",
"migration-reports-rewritten-nodes",
"multilingual-singles-components",
"mysql-boot-schema-sync",
"mysql-timestamp-default-lockstep",
Expand Down Expand Up @@ -266,10 +279,13 @@
"plugin-field-type-validate-options",
"plugin-field-type-validate",
"plugin-field-types-in-pickers",
"plugin-foundation-helpers-and-catalogue",
"plugin-metadata-single-source",
"plugin-page-deep-link",
"plugin-seo-sitemap",
"plugin-surface-and-schema-batch",
"plugin-write-mutation-envelope",
"plugins-sidebar-item-navigates",
"polymorphic-relationship-expansion",
"polymorphic-relationship-json",
"post-commit-hook-warnings",
Expand Down Expand Up @@ -301,6 +317,7 @@
"related-row-read-context",
"related-row-reshape-hardening",
"related-row-status",
"related-trust-predicate",
"rename-carries-its-type",
"renderer-hardening",
"renderer-style-timing",
Expand All @@ -320,10 +337,13 @@
"schema-drift-boot-warning",
"schema-p0-codex-followup",
"schema-p0-enforcement",
"scope-migration-drawless-recheck",
"security-dependency-bumps",
"seed-dev-diagnostics",
"server-safe-artifact-gate",
"shared-host-matcher",
"shortcut-repeat-re-decides",
"shortcuts-ignore-non-keyboard-events",
"side-effect-hook-returns",
"sidebar-inset-landmark",
"single-create-schema-change",
Expand All @@ -332,6 +352,7 @@
"single-schema-into-service",
"single-table-ddl-dialect",
"single-write-response-related-access",
"single-write-upload-bound",
"singles-authorization-hardening",
"singles-components-schema-lock",
"singles-custom-read-constraints",
Expand All @@ -342,6 +363,8 @@
"sqlite-pk-nullability",
"sqlite-system-timestamp-defaults",
"ssrf-ip-pinning",
"storage-format-literal-gate",
"storage-key-write-canonicalises",
"style-catalog-followups",
"style-compiler-followups",
"style-compiler",
Expand All @@ -359,6 +382,7 @@
"tidy-moons-argue",
"tidy-moons-repeat",
"tidy-moons-visit",
"tidy-pugs-shave",
"tier0-build-metadata",
"tier0-content-enforcement",
"tier0-routing-delivery",
Expand Down
130 changes: 130 additions & 0 deletions packages/adapter-drizzle/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,135 @@
# @nextlyhq/adapter-drizzle

## 0.0.2-alpha.57

### Patch Changes

- [#714](https://github.com/nextlyhq/nextly/pull/714) [`5673fff`](https://github.com/nextlyhq/nextly/commit/5673fffb7f3f43b26985bb075550d3bd1ee4f4eb) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - The admin now ships with rounded corners and the Geist typeface. Corner radius comes from a single `--radius` knob, so changing that one declaration re-rounds the whole panel, and a plugin built against the published Tailwind preset re-rounds with it.

- [#699](https://github.com/nextlyhq/nextly/pull/699) [`6936078`](https://github.com/nextlyhq/nextly/commit/6936078db4533fc7fdde0650903debe13000747f) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Add an experimental BreakpointDialog to @nextlyhq/ui, with the validation behind it. The style compiler discards a breakpoint it cannot use rather than raising, so a bad definition is lost silently and surfaces later as stale styles; the dialog refuses to save any set that would lose one.

- [#728](https://github.com/nextlyhq/nextly/pull/728) [`38e5e6b`](https://github.com/nextlyhq/nextly/commit/38e5e6b6c6b58222b727c675a4a03d98d1a58c8e) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - move the breakpoint editor into the builder, where its rules can be derived

`lib/breakpoints.ts` and `breakpoint-dialog.tsx` restated the style compiler's
breakpoint drop rules because `@nextlyhq/ui` is the block-agnostic layer and
cannot depend on `@nextlyhq/blocks-engine`. Two implementations of one rule
agree the day they are written and drift silently after.

They now live in `@nextlyhq/builder`, which already depends on the engine and
imports `MAX_BREAKPOINTS_PER_AXIS` and the breakpoint types from it rather than
mirroring them.

**Breaking, and deliberate:** the `@nextlyhq/ui/breakpoints` subpath is removed,
along with `BreakpointDialog` and the breakpoint types from the root barrel.
Nothing in this repository imported them, and every affected export was
`@experimental`.

- [#683](https://github.com/nextlyhq/nextly/pull/683) [`5bfac2f`](https://github.com/nextlyhq/nextly/commit/5bfac2feea1c56af92b4d74364cda15f9a5c511f) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Add the builder's host-canvas coordinate mapping: one module converts between the canvas frame and the host page, including the scaled border inset that places the frame's content origin. A sibling test scans for cross-frame rectangle reads elsewhere in the package, recognising a bounded set of spellings; it narrows the paths taken by accident rather than enforcing single ownership.

- [#717](https://github.com/nextlyhq/nextly/pull/717) [`5a05e7b`](https://github.com/nextlyhq/nextly/commit/5a05e7bf97b45c5003fff51a56a7b442137140c9) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Add an experimental ColorPicker to @nextlyhq/ui, with the pointer-to-colour geometry behind it on the server-safe @nextlyhq/ui/color entry. The picker knows nothing about design tokens: a swatch carries an opaque value it hands back untouched, so a host storing a token reference keeps it rather than receiving the colour that token happened to resolve to.

- [#713](https://github.com/nextlyhq/nextly/pull/713) [`dbd95b3`](https://github.com/nextlyhq/nextly/commit/dbd95b3603f1efc4ec8480c9cdd7f50b5977d02d) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Erase a recipient from the email delivery log.

Deleting a user left their delivery rows behind carrying a keyed hash of their
address, which an install holds the key for, so the table went on answering
"was this person written to, and when" for an account that no longer exists.
`eraseRecipientDeliveries` overwrites that hash with a value no address can
produce, keeping the row, its status and its timing so aggregate questions
still have an answer. `deleteUser` calls it inside its existing transaction, so
a failed erasure takes the deletion with it rather than leaving the two out of
step.

The erasure takes an ADDRESS rather than a user id, because most recipients
never had an account: a password reset to an address that never registered, a
CC, a BCC added by a `beforeSend` filter. Those people can ask to be erased too
and no account deletion will ever fire for them, so it is callable directly.

`EmailDeliveryRecord.recipientHash` is now `string | null`, where null means
erased.

- [#734](https://github.com/nextlyhq/nextly/pull/734) [`193d5ec`](https://github.com/nextlyhq/nextly/commit/193d5ecdda826cce47832026299242fefd5bfa29) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Advertise the Node range this project actually supports. Every package declared
`>=20.0.0` while the repository requires `^20.19.0 || ^22.12.0 || >=24.0.0`, so
installs on 20.6-20.18 or on 23.x succeeded without warning and failed later at
runtime. Release preflight now derives the expected range from the root manifest
and rejects a package that disagrees, so the two cannot drift apart again.

- [#722](https://github.com/nextlyhq/nextly/pull/722) [`696281d`](https://github.com/nextlyhq/nextly/commit/696281d123832fb1a4a39e4aaf7d27ed085e35a6) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Field group instances now report their stored type through `nextly/field-group-type`, a new entry point that reads whichever spelling a document carries and writes the current one. The admin editor uses it, so content saved before and after the storage rename stays readable and selectable in both.

- [#700](https://github.com/nextlyhq/nextly/pull/700) [`cf04a67`](https://github.com/nextlyhq/nextly/commit/cf04a678a0922d8261b34e93d47819cfa83e46ba) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Correct the frame content origin to include the iframe's padding, and measure that inset in one place.

An iframe's nested viewport begins at the content box, so padding displaces it exactly as a border does. Callers built the inset from `clientLeft`/`clientTop`, which report the border alone, so every frame-local point mapped toward the border by the scaled padding. `frameInsetOf` is now exported as the single reader, and both the README recipe and the `FrameGeometry` documentation name it instead of restating arithmetic three call sites had already got wrong.

- [#689](https://github.com/nextlyhq/nextly/pull/689) [`213a860`](https://github.com/nextlyhq/nextly/commit/213a8602d3225f4343976b71d9702a7b9a4161b1) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Admin list pages now attach their pagination to the table it belongs to, instead of leaving it floating a row below the table on some pages and attached on others. Applies to users, plugins, roles and webhook endpoints.

- [#725](https://github.com/nextlyhq/nextly/pull/725) [`73885c6`](https://github.com/nextlyhq/nextly/commit/73885c682f74612fef4fe62122dcacee33267d14) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - The field-group storage migration can now report what it would rename without changing any content or recording that a run happened, and refuses to run for real unless the caller states that a restorable backup exists. A preview still claims the migration lock, so it needs a role that can write to Nextly's own lock table.

- [#719](https://github.com/nextlyhq/nextly/pull/719) [`f61172e`](https://github.com/nextlyhq/nextly/commit/f61172e816caca32009f61c4c16183e8bd546a35) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - A stylesheet stored for a page is no longer reused when a block migration has
since turned one of its nodes into one that renders nothing. The rules compiled
for that node, and any image the rules fetched, were still being served for
markup no visitor receives.

- [#730](https://github.com/nextlyhq/nextly/pull/730) [`6683ef3`](https://github.com/nextlyhq/nextly/commit/6683ef387595684355bba1e02c128f76df5624d6) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Plugin icons now resolve through one shared rule, so the same plugin shows the same icon everywhere in the admin, and a plugin can ship its own logo image instead of naming a built-in glyph.

The SEO plugin now describes itself in the plugins list instead of showing a bare package name.

A styling fixture used only by the end-to-end suite no longer appears as an installed plugin, and no longer injects a showcase section into the Posts collection list, in a normal development server.

- [#740](https://github.com/nextlyhq/nextly/pull/740) [`db7122d`](https://github.com/nextlyhq/nextly/commit/db7122d484e841a087827babcaff402c0711da0c) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - `@nextlyhq/plugin-sdk` now exports `pluginAdminSlug`, `PLUGIN_CATEGORIES` and `isPluginCategory` (experimental), so a plugin author can derive a plugin's admin slug and check a category against the vocabulary `definePlugin` accepts, rather than reimplementing either. They are also on `nextly` and `nextly/config` for host apps.

The admin uses those exports instead of its own copies. It previously derived a plugin's URL slug with its own implementation of core's algorithm, so a plugin page could be linked at one slug and routed at another the moment either side changed, and it kept its own list of valid categories, so it could reject a category `definePlugin` accepts.

Nothing changes in the admin UI. The plugin directory that consumes these is not built yet; this is the groundwork it needs.

- [#727](https://github.com/nextlyhq/nextly/pull/727) [`53fca3e`](https://github.com/nextlyhq/nextly/commit/53fca3e4fa89ec7c6f116f25f4b01263f6e6995d) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - On desktop, the Plugins item in the admin sidebar now opens the plugins page when you click it, instead of only expanding the sub-sidebar and leaving you to find the page yourself. On mobile it still opens the panel, as every sidebar section with a panel does, and Installed Plugins is the first entry inside it. The item also stays visible when no plugins are installed, so a new project can reach the plugins page at all.

Users who can read a plugin's collections but cannot manage settings keep the sub-sidebar, since the plugins page itself is settings-guarded.

The secondary sidebar now closes when the category it is showing stops being one of the sidebar's destinations, so a slow or failing permissions load no longer leaves an empty panel open beside the page.

- [#671](https://github.com/nextlyhq/nextly/pull/671) [`75054a8`](https://github.com/nextlyhq/nextly/commit/75054a806e40cf66a30dfc4d75159cd104b1836d) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Relationship expansion can now be told WHICH collections a trusted read may
reach, judged per expansion target.

`overrideAccess` says the caller is trusted. It said nothing about the
collection a relationship points at — which the caller never named and may not
serve to the same audience — so a trusted read spread that trust into every
target it populated. A caller serving one fixed audience can now state its
trusted set, and anything outside it is read as that audience would read it.

Absent the new option nothing changes, so the Direct API keeps its semantics: a
caller that has already decided who is asking is not narrowed by a default it
never chose.

- [#724](https://github.com/nextlyhq/nextly/pull/724) [`35ff30a`](https://github.com/nextlyhq/nextly/commit/35ff30a7ed36f7c498aaed68d8dfbbaa95d14547) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - A page whose stylesheet is reused now keeps it when a block migration turns a
condition-gated node into one that renders nothing. Those nodes never had rules
in the shared sheet, so withholding it cost every other block on the page its
styling.

- [#673](https://github.com/nextlyhq/nextly/pull/673) [`67082d1`](https://github.com/nextlyhq/nextly/commit/67082d1004fb7d00a63c3d18b83dbf22f9e28ec0) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Check the built server-safe entry points against what the build recorded, and stop publishing the
bundler metafiles those checks read.

The gate reads two records the build already wrote — the module specifiers surviving in each
artifact and every chunk reachable from it, and the bundler's own metafile of what it inlined. A
bundled dependency leaves no import to find, so the text alone cannot answer what an artifact
reaches. The metafiles are build inputs to that check rather than something a consumer needs, so
they are excluded from the published files.

- [#702](https://github.com/nextlyhq/nextly/pull/702) [`8011731`](https://github.com/nextlyhq/nextly/commit/8011731fb441fbdccdd29d5d262804c1cb078041) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - fix(ui): ignore a dispatched event that is not a keystroke

The shortcut manager listens on `document`, so every event dispatched anywhere on
the page reaches it — including synthetic ones from code outside the application.
A password manager typing into a credential field dispatches a `keydown` carrying
no `key`, and the manager spread it as a string, crashing the page with
`TypeError: key is not iterable`. It now ignores an event it cannot read as a
keystroke, and leaves it propagating to whichever listener does understand it.

- [#697](https://github.com/nextlyhq/nextly/pull/697) [`ca1cc48`](https://github.com/nextlyhq/nextly/commit/ca1cc48e76701d8f12ec8f525da24241635d5744) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Carry a trusted write's bound into a Single's upload expansion. A Single holding uploads and no relationship field returned whole media rows in its write response, because the bound reached only the relationship expansion beside it, which returns early for such a document.

- [#705](https://github.com/nextlyhq/nextly/pull/705) [`ecefaa2`](https://github.com/nextlyhq/nextly/commit/ecefaa23244212cfe5ca617797f1fab54372e9cf) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - A field group instance now reports its type whichever spelling the stored document uses, so content written before and after the storage rename both read. A `where` filter on the type keeps working under either spelling, and version snapshots keep recording the type of components nested inside a dynamic zone. Reading that type is one shared call rather than a key spelled out at each site, which is what keeps the rename a change in a single place.

- [#716](https://github.com/nextlyhq/nextly/pull/716) [`cf48bd7`](https://github.com/nextlyhq/nextly/commit/cf48bd72cda0d605de50b3eb70b4115a5f1c15e8) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - A version snapshot now records each field group instance under one spelling of its type key. An entry captured before the storage rename, restored, and captured again previously kept its old key alongside the new one, so the snapshot announced the same instance's type twice.

- [#731](https://github.com/nextlyhq/nextly/pull/731) [`298d41e`](https://github.com/nextlyhq/nextly/commit/298d41ee1efa2e800fa7ebc755d065930e5cf629) Thanks [@mobeenabdullah](https://github.com/mobeenabdullah)! - Page builder inspector: keep the open panel tab in sync when the selected block changes type, so the inspector no longer shows a tab the block does not have.

## 0.0.2-alpha.56

### Patch Changes
Expand Down
Loading
Loading