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
2 changes: 1 addition & 1 deletion .changeset/12030-console-bundles-spec-18.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,4 @@
"@object-ui/runner": minor
---

The console and the runner bundles are built against `@objectstack/*` 18.0.0-next.0 (objectui#12030). In both, the `@objectstack/*` ranges are `devDependencies`, but each package is an app build whose published `dist` bundles them, together with the `@object-ui/*` packages it compiles from source. So the shipped console and runner now carry the 18 prerelease line and the `@object-ui/*` changes that follow it.
The console and the runner bundles are built against `@objectstack/*` 18.0.0-next.0 (objectui#12030), and 18.0.0-next.1 since objectui#12370. In both, the `@objectstack/*` ranges are `devDependencies`, but each package is an app build whose published `dist` bundles them, together with the `@object-ui/*` packages it compiles from source. So the shipped console and runner now carry the 18 prerelease line and the `@object-ui/*` changes that follow it.
4 changes: 2 additions & 2 deletions .changeset/12030-objectstack-next-18.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,9 @@

Depend on the `@objectstack/*` 18 prerelease line (objectui#12030).

Every `@objectstack/*` range these packages declare in `dependencies` or `peerDependencies` moves from `^17.x` to `^18.0.0-next.0`, the `next` prerelease of `@objectstack/*` 18.
Every `@objectstack/*` range these packages declare in `dependencies` or `peerDependencies` moves from `^17.x` to `^18.0.0-next.0`, the `next` prerelease of `@objectstack/*` 18 (raised to `^18.0.0-next.1` by objectui#12370 before release).

**Breaking for consumers:** an install that resolves `@objectstack/spec` (or `@objectstack/client`, `@objectstack/formula`, `@objectstack/lint`) 17.x no longer satisfies these ranges. A consumer must move its own `@objectstack/*` packages to the 18 line, starting with `18.0.0-next.0`, at the same time as it takes this release.
**Breaking for consumers:** an install that resolves `@objectstack/spec` (or `@objectstack/client`, `@objectstack/formula`, `@objectstack/lint`) 17.x no longer satisfies these ranges. A consumer must move its own `@objectstack/*` packages to the 18 line, starting with `18.0.0-next.1` (objectui#12370), at the same time as it takes this release.

**objectui's own surface moves with it:**

Expand Down
38 changes: 38 additions & 0 deletions .changeset/12370-spec-next-1.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
---
"@object-ui/app-shell": minor
"@object-ui/auth": minor
"@object-ui/cli": minor
"@object-ui/components": minor
"@object-ui/core": minor
"@object-ui/data-objectstack": minor
"@object-ui/fields": minor
"@object-ui/layout": minor
"@object-ui/permissions": minor
"@object-ui/plugin-chatbot": minor
"@object-ui/plugin-dashboard": minor
"@object-ui/plugin-designer": minor
"@object-ui/plugin-detail": minor
"@object-ui/plugin-form": minor
"@object-ui/plugin-gantt": minor
"@object-ui/plugin-grid": minor
"@object-ui/plugin-list": minor
"@object-ui/plugin-timeline": minor
"@object-ui/plugin-tree": minor
"@object-ui/plugin-view": minor
"@object-ui/react": minor
"@object-ui/types": minor
"@object-ui/console": minor
"@object-ui/runner": minor
---

Depend on `@objectstack/*` `18.0.0-next.1` (objectui#12370).

Every `@objectstack/*` range these packages declare moves from `^18.0.0-next.0` to `^18.0.0-next.1`; the console and the runner bundle `18.0.0-next.1`. A consumer moves its own `@objectstack/*` packages to `18.0.0-next.1` with this release.

**Accept sets that narrow with it.** `@object-ui/types` validates page action rows and view data bindings through the spec's own rows, so its faces (`safeValidateSchema` and `StrictAnyComponentSchema`) now refuse what `18.0.0-next.1` refuses. Each was accepted on `18.0.0-next.0`:

- `onSuccess` on an `action:button` / `action:icon` row, or an `action:group` / `action:menu` member, whose executor is the `url`, `navigation`, `modal`, `flow` or `form` built-in, or that has no executor at all. Write the hop on an `api` or `script` action (or a host handler name), or drop it.
- `onSuccess` beside `operation: 'update'`, and an `onSuccess` block carrying a key outside `{ navigate, openIn }`.
- `actionType: 'navigation'` on a row (and `type: 'navigation'` on a container member): write `'url'`.
- A `url` executor's `target` that is not openable, judged on the executor the runner runs, including a row whose `name` selects it.
- A view `data` binding with `provider: 'api'`: bind the object or static rows; an API call is the page element's binding.
4 changes: 2 additions & 2 deletions QUICK_REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -126,9 +126,9 @@ behind (objectui#5394 — that had happened once per release, three times).

- **Version:** 17.7.0 (the version every `@object-ui/*` manifest carries — they are one
`fixed` group in `.changeset/config.json`, so a release moves all of them together)
- **Spec:** `@objectstack/spec` ^18.0.0-next.0 (declared by the root `package.json` and by
- **Spec:** `@objectstack/spec` ^18.0.0-next.1 (declared by the root `package.json` and by
`apps/console/package.json`)
- **Client:** `@objectstack/client` ^18.0.0-next.0 (declared by `apps/console/package.json`
- **Client:** `@objectstack/client` ^18.0.0-next.1 (declared by `apps/console/package.json`
and `packages/data-objectstack/package.json`)
- **Node.js:** ≥ 22.13 (see root `engines.node`)
- **pnpm:** ≥ 10 (the workspace pins `pnpm@10.31.0` via `packageManager`)
Expand Down
6 changes: 3 additions & 3 deletions apps/console/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,9 @@
"@object-ui/react": "workspace:*",
"@object-ui/test-support": "workspace:*",
"@object-ui/types": "workspace:*",
"@objectstack/client": "^18.0.0-next.0",
"@objectstack/lint": "^18.0.0-next.0",
"@objectstack/spec": "^18.0.0-next.0",
"@objectstack/client": "^18.0.0-next.1",
"@objectstack/lint": "^18.0.0-next.1",
"@objectstack/spec": "^18.0.0-next.1",
"@tailwindcss/postcss": "^4.3.3",
"@tailwindcss/typography": "^0.5.20",
"@testing-library/jest-dom": "^7.0.1",
Expand Down
13 changes: 10 additions & 3 deletions apps/console/src/__tests__/registry-inputs-spec-parity.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1507,6 +1507,13 @@ const UNPUBLISHED_EXEMPTIONS: Record<string, string> = {
// entire justification for this exemption — it always was sufficient alone.
'record:reference_rail.entries':
'An array of {objectName, relationshipField, title, limit, displayField} objects; `inputs` is a flat scalar carrier and cannot express it. Newly judged rather than newly missing — @objectstack/spec 17.1.0 added record:reference_rail to ComponentPropsMap, and the registration (the reference_rail register call in plugin-detail/src/index.tsx) has always published only `hideEmpty` — the 17.1.0 pin, objectui#5328. The flat-carrier shape limit is the entire reason: the `icon` divergence that once also blocked an entries editor was settled by Option B (maintainer 2026-08-22, objectui#5494).',
// objectui#12370 (the 18.0.0-next.1 bump): objectstack#23205 declares `parentDataSource` on
// `record:related_list`, the parent record bound by a query of its own, for objectui#12294. The
// spec's own description opens "[PLANNED — not yet rendered]", and no renderer here reads it
// (`git grep parentDataSource -- packages` finds no read site), so publishing it now would
// advertise configuration the platform drops. objectui#12294 owns wiring and declaring it.
'record:related_list.parentDataSource':
'Declared by @objectstack/spec 18.0.0-next.1 (objectstack#23205) as PLANNED, not yet rendered: the parent record of a related list bound by its own query. No renderer here reads it yet; objectui#12294 wires the record blocks to their bound row and declares it on the registration.',

/*
* ⚠️ THE 17.5.0 BOOKINGS — objectui#11111 decision 3 = B (record 5902351047).
Expand Down Expand Up @@ -2940,11 +2947,11 @@ const MEMBER_PINS: Record<string, MemberPin> = {
},
'object-grid.data': {
file: 'packages/plugin-grid/src/__tests__/gridDataInputContract.test.ts',
pins: 'The `object` arm is `ViewDataSchema` discriminated on `provider`: each of the four providers parses, none of them is an array, the declaration is one shape across both registered tags so the alias cannot drift, and it is pinned at compile time too (objectui#5090).',
pins: 'The `object` arm is `ViewDataSchema` discriminated on `provider`: each of the three providers parses and the retired `api` one is refused (spec 18.0.0-next.1, objectui#12370), none of them is an array, the declaration is one shape across both registered tags so the alias cannot drift, and it is pinned at compile time too (objectui#5090).',
},
'object-grid.conditionalFormatting': {
file: 'packages/plugin-grid/src/__tests__/gridRowDecorationMembers-8071.test.tsx',
pins: 'The members read inside ONE formatting rule, asserted on the `style` attribute of the `<tr>` the grid paints. THREE alternative predicate members with a PRECEDENCE between them — one rule carrying `condition`, `expression` and the native `field`/`operator`/`value` triple, each naming a DIFFERENT row, is decided by `condition`; drop it and `expression` decides; drop that and the triple does — so a renderer reading any two of them as equivalent is red in a specific direction rather than merely unpinned. FOUR style members, and the sharp one is a RENAME: `backgroundColor` and `borderColor` keep their authored names on the way to the DOM while `textColor` is read as the CSS `color`, so keeping the authored spelling hands React a key it silently drops — same rules, same background, the text colour gone with nothing thrown. `style` is pinned as the BASE the three colour members override rather than replace (a non-colour member of it survives alongside the override). Two rule-list facts complete it: FIRST-MATCH-WINS with no merge (the second matching rule\'s own `textColor` never lands) and a rule carrying NO predicate member is SKIPPED rather than read as always-true, with the rule after it still deciding. ⚠️ Since objectui#11533 the AUTHORED member is ONE dialect, `{ condition, style }`: `expression`, the native triple and the three top-level colour members are refused by name on `ObjectGridSchema` and the list view (`packages/types/src/__tests__/grid-list-view-conditional-formatting-11533.test.ts`), so the rows that write them pin STORED-rule reads, which the resolver keeps as compatibility arms; a last block pins the two facts side by side — the stored native rule refused at authoring and painted at render, with its respelling painting the same row. The registration is an `array` arm; the installed spec row (18.0.0-next.0, re-measured by objectui#12030) takes the list view\'s own `{ condition, style }` rule and refuses the native members and any other key, so the spec fixes the AUTHORED shape and the read site is the rest of the member contract, the stored-rule compatibility arms included (objectui#8071 slice 12).',
pins: 'The members read inside ONE formatting rule, asserted on the `style` attribute of the `<tr>` the grid paints. THREE alternative predicate members with a PRECEDENCE between them — one rule carrying `condition`, `expression` and the native `field`/`operator`/`value` triple, each naming a DIFFERENT row, is decided by `condition`; drop it and `expression` decides; drop that and the triple does — so a renderer reading any two of them as equivalent is red in a specific direction rather than merely unpinned. FOUR style members, and the sharp one is a RENAME: `backgroundColor` and `borderColor` keep their authored names on the way to the DOM while `textColor` is read as the CSS `color`, so keeping the authored spelling hands React a key it silently drops — same rules, same background, the text colour gone with nothing thrown. `style` is pinned as the BASE the three colour members override rather than replace (a non-colour member of it survives alongside the override). Two rule-list facts complete it: FIRST-MATCH-WINS with no merge (the second matching rule\'s own `textColor` never lands) and a rule carrying NO predicate member is SKIPPED rather than read as always-true, with the rule after it still deciding. ⚠️ Since objectui#11533 the AUTHORED member is ONE dialect, `{ condition, style }`: `expression`, the native triple and the three top-level colour members are refused by name on `ObjectGridSchema` and the list view (`packages/types/src/__tests__/grid-list-view-conditional-formatting-11533.test.ts`), so the rows that write them pin STORED-rule reads, which the resolver keeps as compatibility arms; a last block pins the two facts side by side — the stored native rule refused at authoring and painted at render, with its respelling painting the same row. The registration is an `array` arm; the installed spec row (18.0.0-next.1, re-measured by objectui#12030, objectui#12370) takes the list view\'s own `{ condition, style }` rule and refuses the native members and any other key, so the spec fixes the AUTHORED shape and the read site is the rest of the member contract, the stored-rule compatibility arms included (objectui#8071 slice 12).',
},
'object-grid.operations': {
file: 'packages/plugin-grid/src/__tests__/gridOperationsMembers-8071.test.tsx',
Expand Down Expand Up @@ -3020,7 +3027,7 @@ const MEMBER_PINS: Record<string, MemberPin> = {
},
'object-kanban.conditionalFormatting': {
file: 'packages/plugin-kanban/src/__tests__/ObjectKanban.structuredMembersReachTheirSinks-8313.test.tsx',
pins: 'Members are card STYLE RULES in ONE dialect since objectui#11522, the spec list view\'s `{ condition, style }`, and it reaches the sink: a rule colours the matching card and only it, a second rule aimed at the other card does the same, and the whole `style` map arrives, with the sibling card in the same render as the live non-matching control so a green cannot come from two unstyled cards agreeing. The retired native `{ field, operator, value }` and flat-colour dialects are refused by name on the types side (`packages/types/src/__tests__/kanban-conditional-formatting.test.ts`); these rows are their respellings, painting the same cards. ⛔ NOT an identity pin and not a wire pin: `ObjectKanban.tsx` never names this key at all (measured zero, against nine for `cardFields` in the same file) — it rides the `{ ...schema }` spread into `KanbanRenderer`, which forwards it to `KanbanImpl`\'s `getCardStyles`. That makes the pin load-bearing in a way the others are not: an edit replacing that spread with an explicit key list drops the key silently and nothing else in the repo would notice. The installed spec row (18.0.0-next.0, re-measured by objectui#12030) takes the list view\'s own `{ condition, style }` rule, so the spec fixes the authored shape and the read site is the rest of the member contract (objectui#8313).',
pins: 'Members are card STYLE RULES in ONE dialect since objectui#11522, the spec list view\'s `{ condition, style }`, and it reaches the sink: a rule colours the matching card and only it, a second rule aimed at the other card does the same, and the whole `style` map arrives, with the sibling card in the same render as the live non-matching control so a green cannot come from two unstyled cards agreeing. The retired native `{ field, operator, value }` and flat-colour dialects are refused by name on the types side (`packages/types/src/__tests__/kanban-conditional-formatting.test.ts`); these rows are their respellings, painting the same cards. ⛔ NOT an identity pin and not a wire pin: `ObjectKanban.tsx` never names this key at all (measured zero, against nine for `cardFields` in the same file) — it rides the `{ ...schema }` spread into `KanbanRenderer`, which forwards it to `KanbanImpl`\'s `getCardStyles`. That makes the pin load-bearing in a way the others are not: an edit replacing that spread with an explicit key list drops the key silently and nothing else in the repo would notice. The installed spec row (18.0.0-next.1, re-measured by objectui#12030, objectui#12370) takes the list view\'s own `{ condition, style }` rule, so the spec fixes the authored shape and the read site is the rest of the member contract (objectui#8313).',
},
'object-kanban.data': {
file: 'packages/plugin-kanban/src/__tests__/ObjectKanban.structuredMembersReachTheirSinks-8313.test.tsx',
Expand Down
2 changes: 1 addition & 1 deletion apps/site/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
"@object-ui/plugin-view": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@objectstack/spec": "^18.0.0-next.0",
"@objectstack/spec": "^18.0.0-next.1",
"fumadocs-core": "16.15.4",
"fumadocs-mdx": "15.2.3",
"fumadocs-ui": "16.15.4",
Expand Down
2 changes: 1 addition & 1 deletion e2e/live/ci/backend.env
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
#
# This file declares exactly ONE @objectstack pin, and that is the whole
# design: the commit is derived from it, see below.
OBJECTSTACK_VERSION=18.0.0-next.0
OBJECTSTACK_VERSION=18.0.0-next.1

# There is deliberately no OBJECTSTACK_REF key here. The objectstack-ai/objectstack
# commit the showcase app metadata is sparse-checked-out from is DERIVED at
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@
"@changesets/cli": "^3.0.0",
"@eslint/js": "^10.0.1",
"@object-ui/test-support": "workspace:*",
"@objectstack/spec": "^18.0.0-next.0",
"@objectstack/spec": "^18.0.0-next.1",
"@playwright/test": "^1.62.1",
"@testing-library/dom": "^10.4.1",
"@testing-library/jest-dom": "^7.0.1",
Expand Down
6 changes: 3 additions & 3 deletions packages/app-shell/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -89,9 +89,9 @@
"@object-ui/providers": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@objectstack/formula": "^18.0.0-next.0",
"@objectstack/lint": "^18.0.0-next.0",
"@objectstack/spec": "^18.0.0-next.0",
"@objectstack/formula": "^18.0.0-next.1",
"@objectstack/lint": "^18.0.0-next.1",
"@objectstack/spec": "^18.0.0-next.1",
"@sentry/react": "^10.70.0",
"jsonc-parser": "^3.3.1",
"lucide-react": "^1.43.0",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -428,7 +428,7 @@ function loadRowCanon(): Promise<RowCanonModule | null> {
* not re-derived — and the engine's own message ships with it.
*
* ⚠️ The reason is NOT that the engine's message refuses a `record.<root>`
* rewrite. Measured against the installed 18.0.0-next.0 (objectui#12030), it mostly PRESCRIBES one: the
* rewrite. Measured against the installed 18.0.0-next.1 (objectui#12030, objectui#12370), it mostly PRESCRIBES one: the
* `current_user` text CONTAINS "To gate on record state, rewrite the predicate
* against `record`." — one of the three remedies it offers, and NOT where it
* ends (measured: `includes` true, `endsWith` false; every covered slot's text
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,7 @@ describe('boolean: a declared defaultValue seeds the control (objectui#8451, arm
// ⇒ `screen.waitForInput` is the offline undeclared boolean that sentence
// says does not exist — and it is undeclared CORRECTLY, so ⛔ do not read
// this as an objectui#9277-class omission waiting to be declared. Measured
// on the installed `@objectstack/spec` (18.0.0-next.0, objectui#12030): `waitForInput` is typed
// on the installed `@objectstack/spec` (18.0.0-next.1, objectui#12030, objectui#12370): `waitForInput` is typed
// `z.boolean().optional()` with no `.default(...)`, so an omitted key
// materialises nothing and there is no spec answer for a declaration to
// mirror. Declaring one here would invent a default the runtime does not
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

/**
* objectui#10948 — what the designer's live `FlowSchema` pass says about a node
* the author has ADDED but not yet configured, on the installed spec (18.0.0-next.0).
* the author has ADDED but not yet configured, on the installed spec (18.0.0-next.1).
*
* Spec 17.5.0 carries objectstack#20316 (a node config key its executor
* contract requires, left out, and a decision branch with no `label`, are
Expand Down
2 changes: 1 addition & 1 deletion packages/auth/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@
"react": "^18.0.0 || ^19.0.0"
},
"dependencies": {
"@objectstack/spec": "^18.0.0-next.0",
"@objectstack/spec": "^18.0.0-next.1",
"better-auth": "^1.7.2"
},
"devDependencies": {
Expand Down
2 changes: 1 addition & 1 deletion packages/cli/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@
"@object-ui/components": "workspace:*",
"@object-ui/react": "workspace:*",
"@object-ui/types": "workspace:*",
"@objectstack/spec": "^18.0.0-next.0",
"@objectstack/spec": "^18.0.0-next.1",
"@tailwindcss/postcss": "^4.3.3",
"@types/glob": "^9.0.0",
"@vitejs/plugin-react": "^6.0.5",
Expand Down
2 changes: 1 addition & 1 deletion packages/collaboration/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
"@object-ui/types": "workspace:*"
},
"devDependencies": {
"@objectstack/spec": "^18.0.0-next.0",
"@objectstack/spec": "^18.0.0-next.1",
"@types/react": "19.2.18",
"react": "19.2.8",
"typescript": "^6.0.3",
Expand Down
Loading
Loading