Skip to content

Upgrade ObjectQL dependencies to 3.0.1 - #93

Merged
huangyiirene merged 2 commits into
mainfrom
copilot/upgrade-objectql-to-latest
Jan 17, 2026
Merged

huangyiirene merged 2 commits into
mainfrom
copilot/upgrade-objectql-to-latest

Conversation

Copilot AI commented Jan 17, 2026 •

Copy link
Copy Markdown
Contributor

Upgrades @objectql/sdk and @objectql/types from 1.9.1 to 3.0.1 to align with latest ObjectQL releases.

Changes

  • packages/data-objectql: Updated @objectql/sdk and @objectql/types to ^3.0.1
  • packages/plugin-object: Updated @objectql/sdk and @objectql/types to ^3.0.1

Compatibility

The 3.0.1 release maintains API compatibility with 1.9.1. No code changes required - all existing ObjectQL data source and plugin functionality continues working unchanged.

Original prompt

objectql升级到最新版


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

@vercel

vercel Bot commented Jan 17, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Review Updated (UTC)
objectui-docs Error Error Jan 17, 2026 8:15am

Co-authored-by: huangyiirene <7665279+huangyiirene@users.noreply.github.com>
Copilot AI changed the title [WIP] Upgrade objectql to latest version Upgrade ObjectQL dependencies to 3.0.1 Jan 17, 2026
Copilot AI requested a review from huangyiirene January 17, 2026 08:20
@github-actions

Copy link
Copy Markdown
Contributor

📦 Bundle Size Report

Package Size Gzipped
components (index.js) 1494.76KB 349.01KB
core (index.js) 0.27KB 0.14KB
data-objectql (ObjectQLDataSource.js) 12.31KB 2.87KB
data-objectql (hooks.js) 5.43KB 1.32KB
data-objectql (index.js) 0.42KB 0.26KB
designer (index.js) 1.27KB 0.40KB
plugin-charts (AdvancedChartImpl-LUnT2ZAf.js) 74.89KB 15.82KB
plugin-charts (BarChart-CRc8MAtI.js) 551.60KB 127.51KB
plugin-charts (ChartImpl-DiqV9Evl.js) 3.17KB 1.10KB
plugin-charts (index-BcjHuFVN.js) 24.05KB 7.06KB
plugin-charts (index.js) 0.21KB 0.16KB
plugin-editor (MonacoImpl-BSiaJCGx.js) 18.15KB 5.59KB
plugin-editor (index-Bx39x2XN.js) 21.72KB 6.53KB
plugin-editor (index.js) 0.19KB 0.15KB
plugin-kanban (KanbanImpl-mGLdSHcd.js) 76.50KB 20.46KB
plugin-kanban (index-i_5clVsp.js) 23.51KB 6.90KB
plugin-kanban (index.js) 0.18KB 0.15KB
plugin-markdown (MarkdownImpl-Dp8rFxgw.js) 256.79KB 64.50KB
plugin-markdown (index-DDihmVdn.js) 21.25KB 6.37KB
plugin-markdown (index.js) 0.19KB 0.15KB
react (SchemaRenderer.js) 1.25KB 0.62KB
react (index.js) 0.13KB 0.11KB
react (index.test.js) 0.14KB 0.14KB
types (api-types.js) 0.24KB 0.19KB
types (app.js) 0.19KB 0.17KB
types (base.js) 0.24KB 0.19KB
types (complex.js) 0.17KB 0.16KB
types (crud.js) 0.24KB 0.20KB
types (data-display.js) 0.19KB 0.17KB
types (data.js) 0.23KB 0.18KB
types (disclosure.js) 0.18KB 0.17KB
types (feedback.js) 0.18KB 0.16KB
types (form.js) 0.17KB 0.16KB
types (index.js) 1.46KB 0.74KB
types (layout.js) 0.23KB 0.18KB
types (navigation.js) 0.17KB 0.16KB
types (objectql.js) 0.26KB 0.21KB
types (overlay.js) 0.18KB 0.16KB
types (registry.js) 0.01KB 0.04KB

Size Limits

  • ✅ Core packages should be < 50KB gzipped
  • ✅ Component packages should be < 100KB gzipped
  • ⚠️ Plugin packages should be < 150KB gzipped

@github-actions

Copy link
Copy Markdown
Contributor

✅ All checks passed!

  • ✅ Type check passed
  • ✅ Tests passed
  • ✅ Lint check completed

@huangyiirene
huangyiirene marked this pull request as ready for review January 17, 2026 08:32
@huangyiirene
huangyiirene merged commit 56b1e69 into main Jan 17, 2026
11 of 13 checks passed
os-sales pushed a commit that referenced this pull request Sep 8, 2026
…chatbot arm

Implements decision batch #93 (objectui#8344 comment 5585333656), items F2, F3,
F5 and the stale-text half of items 8/9. Changeset text is NOT yet updated in
this commit; its three false "by ruling" attributions are the next push.

F3 — the tree-shake leak. `base.zod.ts` now imports `AnyComponentSchema` and
reads that binding INSIDE `SchemaNodeSchema`'s `z.lazy` getter. The option-array
write, `defineNodeComponentUnion` and its identity assertion are gone with it.
`"sideEffects": false` stays true and untouched: this module performs no
load-time write at all now. Measured, not assumed — this repo's own Vite/rollup
lib build, an entry importing ONLY `CardSchema`:

  before this commit  370,652 raw / 113,887 gzip, no fill, nested off-spec
                      node ACCEPTED — the redirect silently inert
  after               1,147,266 raw / 342,193 gzip, nested off-spec node
                      REFUSED — the union is retained because the binding is read

A graph that never evaluates the barrel now throws `ReferenceError: Cannot
access 'BaseSchema' before initialization` at import instead of quietly
answering as `main`. That is the ruled behaviour, and its cost is paid here: 102
`packages/types` test files entered at a category module and now carry a
barrel-first import. Whole unit project after the fix: 989 files, 16,837 tests,
0 failures.

F2 — the chatbot widening, eliminated rather than declared. The arm the getter
installs is `AnyComponentSchema.superRefine(...)`, which checks a nested
`chatbot` node's `body` against `BaseSchemaCore.shape.body`. The root mirror is
untouched, so a root `chatbot` with a record `body` still parses and the same
node one slot down does not. Both directions pinned, plus a non-vacuity leg and
a leg asserting the refusal names `body`. The discrimination objectui#8498 added
survives the wrapper (`propValues` intact), so a nested refusal still costs one
arm.

F5 — depth on the redirected path: 276 / 3,626 / 8,404 / 14,610 / 22,244 chars
at depths 0-4, all refused, none throwing. New pins cover depths 0-4 through
`safeValidateSchema`, a linear-growth ceiling at depth 4, and a legal-leaf
control.

Items 8/9 — `any-component-union-fanout.test.ts`'s rationale said a nested
document is "simply ACCEPTED"; corrected in place. The pin's identity-leg
comment and header now describe THIS head. The objectui#7918 row returns to
`TDZ_BOUND`: the getter builds the node union per call again, so
`getter() === getter()` is FALSE, and `unstableLazyExports` reads 8 again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
os-sales pushed a commit that referenced this pull request Sep 8, 2026
…ere never ruled

Batch #93 refused the routes the previous revision described, so the changeset
described a PR that does not exist. Corrected, not softened:

- the widening fact said "Declared here rather than eliminated, by ruling". No
  ruling said that; #93 ordered it eliminated. It now records the nested refusal
  and the untouched root, and points the root question at objectui#8572.
- the `TDZ_BOUND -> MEMOISED` fact is gone: that byproduct belonged to the
  option-array spelling and the row is `TDZ_BOUND` again.
- the bundle caveat said the fix was "a maintainer-floor authorisation,
  deliberately not taken here" and "Until objectui#8577 is ruled". Both false
  against #93: the ruled route needs no manifest change and no census-floor
  edit, and it ships in this PR. The section now states the wiring, the measured
  before/after, and both byte costs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
os-sales pushed a commit that referenced this pull request Sep 8, 2026
… consumer

⛔ The `Build Docs` failure on 2ac5381 is THIS BRANCH'S CODE, not the changeset
text: `ReferenceError: Cannot access 'BaseSchema' before initialization` out of
`packages/types/dist/zod/app.zod.js`, prerendering `/docs/guide/schema-catalog`
through `plugin-view`. Reproduced locally in one line — with the binding in
place, importing `dist/zod/app.zod.js` throws; without it, it loads clean.

Mechanism, measured rather than reasoned: making `base.zod.ts` import the barrel
gives the cycle an edge that is only safe when the barrel is evaluated FIRST.
Node honours that if the entry is `./zod`; a bundler is free to order the cycle
category-module-first, and the site's build does. ⇒ the ruled F3 spelling is
sound for a module graph and unsound for a bundle, which is the opposite of the
property it was chosen for. My own docblock claim that "consumers cannot hit
that" was falsified by CI, and the 102-file barrel-first hygiene could not have
helped: the failing consumer already imports the barrel.

This commit therefore restores the wiring CI was last green on (`d375037a8`) and
KEEPS batch #93's F2 in the spelling the reviewer originally wrote it in: the
slot-0 write installs `union.superRefine(...)`, so a nested `chatbot` node with
a record `body` is refused while the published root mirror is untouched. The
identity assertion now checks the WRAPPER it installed, and the pin says why a
`toBe(AnyComponentSchema)` assertion would go green if the narrowing were
dropped. The 102 barrel-first imports are reverted with the binding that needed
them; the objectui#7918 row is `MEMOISED` again, matching this wiring.

⇒ F2 and F5 ship; F3 does NOT, and the changeset now states the gap, the CI
evidence and all four measured candidates instead of claiming a fix.

Green on this tree: build 0, type-check 0 (all three projects), packages/types
148 files / 2,824 tests / 0 failed, the four changeset gates 0, and the
category-first import that CI choked on now loads clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE
akarma-synetal pushed a commit to akarma-synetal/objectui that referenced this pull request Sep 9, 2026
…objectstack-ai#8344) (objectstack-ai#8501)

* feat(types)!: redirect the node recursion point at AnyComponentSchema (objectstack-ai#8344)

Every child slot is `z.union([SchemaNodeSchema, z.array(SchemaNodeSchema)])`, and
`SchemaNodeSchema`'s component arm was `BaseSchemaCore` — the ~21 base keys and
nothing type-specific — so per-type enforcement was ROOT-ONLY at every depth, for
every component type. That is objectui#7869, measured there: an off-spec `size` on
a nested `icon` node was accepted while the same node alone was refused.

The arm is now `AnyComponentSchema`. ⛔ Nothing here is `.strict()`; no declaration
is repaired. Measured over the catalog + docs corpora on c90395b (554 node
documents): 45 refused before, 54 after — the nine documents the card enumerates,
each pre-existing debt this surfaces rather than creates.

Two mechanical constraints, both measured rather than assumed:

  - `AnyComponentSchema` is built in `index.zod.ts` from all 13 category modules
    while 14 modules import `base.zod.ts`, so the arm cannot be an import: `z.lazy`
    defers evaluation, not the module graph, and the import deadlocks on
    `BaseSchema`'s TDZ when the graph is entered at `base.zod.js`.
  - It is a written `z.union` OPTION SLOT and not a `z.lazy` holder, because
    `z.lazy` memoises: a holder lets whichever module graph parses first decide the
    accept set for the whole process. `z.union` re-reads its options every parse, so
    the fill is live and no first parse can freeze the pre-fill answer in.

`complex.zod.ts#DashboardWidgetSchema.component` names `BaseSchema` explicitly now.
It is the one slot where the redirect would reverse a standing ruling: `metric-card`
is objectui's CLOSED widget-slot component extension (objectstack#8593), admitted
there and deliberately not an arm of `AnyComponentSchema`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* fix(types): record the DashboardWidgetSchema.component drift the objectstack-ai#8344 carve-out creates

The parity ledger is a TYPE MAP over the mirrors, so the `complex.zod.ts` change
in ae99480 moved a drift row INSIDE zod-mirror-parity.test.ts without editing it:
`DashboardWidgetSchema.component` names `BaseSchema` where TS declares `SchemaNode`,
so the five primitive arms are newly narrower-than-declared.

Re-derived from the tree with the compiler API, not copied: `DriftOf` for the pair
resolves to 'component' | 'options'. The header figure moves with it, 64 -> 65 keys
across an unchanged 42 entries, derived by an AST count of the interface.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* docs(types): declare the chatbot widening, the bundle caveat and the memoisation

Three accept/reject facts and one caveat the changeset owed a reader:

- `DashboardWidgetSchema.component` narrows (a primitive in that slot was
  accepted and is refused now);
- `SchemaNodeSchema` moves TDZ_BOUND -> MEMOISED;
- `ChatbotSchema.body` is a record and therefore WIDER than the base arm, so a
  nested chatbot node carrying one is refused before and accepted now. Measured
  with a corpus-valid seed at two child slots, against both the narrowing and a
  legal-node control;
- the `sideEffects: false` bundle caveat: a bundler that drops the barrel body
  leaves the redirect inert, measured on this repo's own Vite/rollup lib build.

The pin's header claimed `getter() === getter()` is FALSE for the exported
wrapper. Measured on the built face, that holds on `main` and NOT at this head:
the redirect made this const MEMOISED, and the `fill is LIVE` leg works because
of it. The header now states both readings and why the wrapper is still the
handle the pin uses.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* docs(changeset): point the chatbot widening at its follow-up, and state the bundle caveat as measured

The widening declaration now names objectui#8572, the card filed for the
narrowing decision, so the declaration reads as "declared, follow-up filed"
rather than as an accepted permanent state.

The bundle caveat is restated from what was actually measured this round. Three
candidate fixes were tried on disk and none of them is a manifest edit this
change may make on its own:

- narrowing `sideEffects` to an array is not a legal declaration for this
  package. `scripts/check-side-effects-array.mjs` requires an array to name
  every ENTRY FORM (12 missing on a one-element array);
  `scripts/__tests__/side-effects-declaration-consistency.test.ts` refuses a
  named entry that has no load-time effect. This package's entry forms are pure,
  so the two rules have no common solution here. Both readings taken from the
  gates themselves.
- a bare top-level call in the barrel is dropped too: `"sideEffects": false` is
  a package-level promise that no in-module spelling overrides. Measured with
  the statement on disk and in `dist`: the probe entry still ACCEPTED the nested
  off-spec node.
- removing the field closes the leak at +16,078 gzipped bytes on the console
  `framework` chunk — which now FITS, since the ceiling raise landed — but it
  drops the workspace census from 5 packages to 4 and fails that same pin's
  population floor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* docs(changeset): name the two follow-up cards the bundle caveat leaves open

The caveat now points at objectui#8577 (the leak and the manifest decision,
carrying every measured figure and the maintainer-floor census edit the closing
route needs) and objectui#8578 (the classifier that scores this package zero
load-time registrations because it counts top-level call statements and cannot
see an effect inside a `const` initializer).

Changeset text only. No source, no manifest, no test moved.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* feat(types)!: bind the component union in the getter, and narrow the chatbot arm

Implements decision batch objectstack-ai#93 (objectui#8344 comment 5585333656), items F2, F3,
F5 and the stale-text half of items 8/9. Changeset text is NOT yet updated in
this commit; its three false "by ruling" attributions are the next push.

F3 — the tree-shake leak. `base.zod.ts` now imports `AnyComponentSchema` and
reads that binding INSIDE `SchemaNodeSchema`'s `z.lazy` getter. The option-array
write, `defineNodeComponentUnion` and its identity assertion are gone with it.
`"sideEffects": false` stays true and untouched: this module performs no
load-time write at all now. Measured, not assumed — this repo's own Vite/rollup
lib build, an entry importing ONLY `CardSchema`:

  before this commit  370,652 raw / 113,887 gzip, no fill, nested off-spec
                      node ACCEPTED — the redirect silently inert
  after               1,147,266 raw / 342,193 gzip, nested off-spec node
                      REFUSED — the union is retained because the binding is read

A graph that never evaluates the barrel now throws `ReferenceError: Cannot
access 'BaseSchema' before initialization` at import instead of quietly
answering as `main`. That is the ruled behaviour, and its cost is paid here: 102
`packages/types` test files entered at a category module and now carry a
barrel-first import. Whole unit project after the fix: 989 files, 16,837 tests,
0 failures.

F2 — the chatbot widening, eliminated rather than declared. The arm the getter
installs is `AnyComponentSchema.superRefine(...)`, which checks a nested
`chatbot` node's `body` against `BaseSchemaCore.shape.body`. The root mirror is
untouched, so a root `chatbot` with a record `body` still parses and the same
node one slot down does not. Both directions pinned, plus a non-vacuity leg and
a leg asserting the refusal names `body`. The discrimination objectui#8498 added
survives the wrapper (`propValues` intact), so a nested refusal still costs one
arm.

F5 — depth on the redirected path: 276 / 3,626 / 8,404 / 14,610 / 22,244 chars
at depths 0-4, all refused, none throwing. New pins cover depths 0-4 through
`safeValidateSchema`, a linear-growth ceiling at depth 4, and a legal-leaf
control.

Items 8/9 — `any-component-union-fanout.test.ts`'s rationale said a nested
document is "simply ACCEPTED"; corrected in place. The pin's identity-leg
comment and header now describe THIS head. The objectui#7918 row returns to
`TDZ_BOUND`: the getter builds the node union per call again, so
`getter() === getter()` is FALSE, and `unstableLazyExports` reads 8 again.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* docs(changeset): state what ships, and drop three attributions that were never ruled

Batch objectstack-ai#93 refused the routes the previous revision described, so the changeset
described a PR that does not exist. Corrected, not softened:

- the widening fact said "Declared here rather than eliminated, by ruling". No
  ruling said that; objectstack-ai#93 ordered it eliminated. It now records the nested refusal
  and the untouched root, and points the root question at objectui#8572.
- the `TDZ_BOUND -> MEMOISED` fact is gone: that byproduct belonged to the
  option-array spelling and the row is `TDZ_BOUND` again.
- the bundle caveat said the fix was "a maintainer-floor authorisation,
  deliberately not taken here" and "Until objectui#8577 is ruled". Both false
  against objectstack-ai#93: the ruled route needs no manifest change and no census-floor
  edit, and it ships in this PR. The section now states the wiring, the measured
  before/after, and both byte costs.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* fix(types): revert the F3 import binding — CI proved it breaks a real consumer

⛔ The `Build Docs` failure on 2ac5381 is THIS BRANCH'S CODE, not the changeset
text: `ReferenceError: Cannot access 'BaseSchema' before initialization` out of
`packages/types/dist/zod/app.zod.js`, prerendering `/docs/guide/schema-catalog`
through `plugin-view`. Reproduced locally in one line — with the binding in
place, importing `dist/zod/app.zod.js` throws; without it, it loads clean.

Mechanism, measured rather than reasoned: making `base.zod.ts` import the barrel
gives the cycle an edge that is only safe when the barrel is evaluated FIRST.
Node honours that if the entry is `./zod`; a bundler is free to order the cycle
category-module-first, and the site's build does. ⇒ the ruled F3 spelling is
sound for a module graph and unsound for a bundle, which is the opposite of the
property it was chosen for. My own docblock claim that "consumers cannot hit
that" was falsified by CI, and the 102-file barrel-first hygiene could not have
helped: the failing consumer already imports the barrel.

This commit therefore restores the wiring CI was last green on (`d375037a8`) and
KEEPS batch objectstack-ai#93's F2 in the spelling the reviewer originally wrote it in: the
slot-0 write installs `union.superRefine(...)`, so a nested `chatbot` node with
a record `body` is refused while the published root mirror is untouched. The
identity assertion now checks the WRAPPER it installed, and the pin says why a
`toBe(AnyComponentSchema)` assertion would go green if the narrowing were
dropped. The 102 barrel-first imports are reverted with the binding that needed
them; the objectui#7918 row is `MEMOISED` again, matching this wiring.

⇒ F2 and F5 ship; F3 does NOT, and the changeset now states the gap, the CI
evidence and all four measured candidates instead of claiming a fix.

Green on this tree: build 0, type-check 0 (all three projects), packages/types
148 files / 2,824 tests / 0 failed, the four changeset gates 0, and the
category-first import that CI choked on now loads clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CZY49skxUBYyJcdnTcYPrE

* docs(types): declare the tree-shake gap as shipped, cite one measurement, point at objectui#8598

Implements decision batch objectstack-ai#98 on objectui#8344 (comment 5587037055), Finding 3
of the contract review of `ca2037680` (PR objectstack-ai#8501 comment 5587000173).

The byte pair `base.zod.ts` quoted (369,733 / 1,144,999) and the pair the
changeset quoted (370,652 / 1,149,749) were the same measurement taken on two
heads. Both texts now cite ONE measurement, taken on this head with a named
instrument: a Vite 8.2.1 lib build of the published `dist/zod` face, `es`,
esbuild-minified, `zod` 4.4.3 and `@objectstack/spec` external, each entry
built alone and read in a fresh Node process —

  barrel, CardSchema + AnyComponentSchema   750,542 / 206,815  REFUSED   fill present
  barrel, CardSchema only                   212,567 /  61,025  ACCEPTED  fill absent
  deep-link entry at layout.zod.js          212,563 /  61,030  ACCEPTED  fill absent

Minified so that editing this very docblock cannot move the figure it carries.

The stale "its disposition is a ruling in flight" sentence is gone: the ruling
is in. The gap ships DECLARED, the declaration names who is exposed (an
external consumer whose bundler honours `sideEffects: false` and never reads
`AnyComponentSchema` keeps the pre-redirect accept set for NESTED nodes;
root-level enforcement and every union-reading graph get the new set), and the
changeset's leak paragraph points at objectui#8598 — the `./zod` face built as
one module — as the card that closes it. No source outside comments moved.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TezFG8ZMrNH6n5VTNpPpdH

---------

Co-authored-by: Claude <noreply@anthropic.com>

This branch had an error being deployed

1 failed deployment
Preview — 462dbb9e Deployed Jan 17, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants