Skip to content

fix(types): declare bind on BaseSchema and its zod mirror - #6574

Draft
os-support-ai wants to merge 2 commits into
mainfrom
claude/issue-6357-schema-bind-declaration-census
Draft

fix(types): declare bind on BaseSchema and its zod mirror#6574
os-support-ai wants to merge 2 commits into
mainfrom
claude/issue-6357-schema-bind-declaration-census

Conversation

@os-support-ai

Copy link
Copy Markdown
Collaborator

Fixes #6357.

Gates measured at 01f4e58b3, this branch's head and the tree every number below was read from.


⚠️ Read first — this widens a PUBLISHED BASE TYPE. Draft on purpose.

The triage ruling pre-authorised both branches of the fork and attached handling to this one:

If the census says BaseSchema, that is a widening of a published base type: draft-PR/human-review handling per this repo's convention.

The census says BaseSchema. So this PR stays in draft and waits for a human. No auto-merge, no queue. packages/types/src/base.ts is not on the repo's governed surface (AGENTS.md / CLAUDE.md / .claude/** / docs/adr/**), so that is not what holds it — the ruling is.

The blast radius is stated plainly: BaseSchema is extended by ~111 interfaces and consumed by 42 downstream packages. That sweep is green (below), but it measures this repo only.


The census — mine, independent, and it moved

The dispatch table listed nine useDataScope(schema.bind) reads. All nine reproduce exactly. The census found four more sites it did not list, and two of them change the argument.

Reads — 10

site form
packages/components/src/renderers/data-display/list.tsx:17 useDataScope(schema.bind)
packages/components/src/renderers/data-display/tree-view.tsx:104 useDataScope(schema.bind)
packages/plugin-charts/src/ObjectChart.tsx:267 useDataScope(schema.bind)
packages/plugin-dashboard/src/ObjectDataTable.tsx:350 useDataScope(schema.bind)
packages/plugin-dashboard/src/ObjectPivotTable.tsx:67 useDataScope(schema.bind)
packages/plugin-grid/src/ObjectGrid.tsx:826 useDataScope(schema.bind)
packages/plugin-kanban/src/ObjectKanban.tsx:199 useDataScope(schema.bind)
packages/plugin-list/src/ObjectGallery.tsx:228 useDataScope(schema.bind)
packages/plugin-timeline/src/ObjectTimeline.tsx:142 useDataScope(schema.bind)
packages/plugin-grid/src/index.tsx:105 if (schema?.bind != null) return false;not a hook read. gridNeedsDataSource treats a present bind as one of the escape hatches that makes a missing data-source adapter a legitimate configuration rather than a defect.

Writers / strippers — 2

packages/plugin-dashboard/src/MetricWidget.tsx:273 and MetricCard.tsx:74 destructure bind out so SchemaRenderer's prop spread cannot write bind="data.revenue" onto the DOM (objectui#4357). SchemaRenderer never strips bind itself — it is spread to every component as a React prop, which is why these two have to.

⭐⭐ It was already declared — four times, in two spellings

The card says "declared by no schema shape", and that is exact. But bind was not undeclared:

file spelling
plugin-dashboard/src/ObjectPivotTable.tsx:45 optional string, in a PivotTableSchema & {…} intersection
plugin-dashboard/src/ObjectDataTable.tsx:39 optional string, in a hand-rolled inline schema type
plugin-list/src/ObjectGallery.tsx:20 optional string, in a hand-rolled inline schema type
plugin-dashboard/src/schemaHostProps.ts:65 optional unknown

That is the card's own warning already realised four times over — and schemaHostProps.ts's own header names the hazard: "two copies of one key list is how a list becomes two disagreeing lists."

Only one of the four was a true duplicate of a base member: ObjectPivotTable's, because PivotTableSchema extends BaseSchema. It is removed here. The other three are load-bearing — their containing types never reference BaseSchema, so deleting the member deletes the declaration rather than inheriting it. They are ratcheted, not removed (finding filed).

bind on BaseSchema: 0, against a live control

awk '/^export interface BaseSchema/,/^}/' packages/types/src/base.tsbind 0, visibleWhen 3, 20 declared members. The dispatch's warning about a false zero was real and I avoided the pathspec that caused it — packages/*/src does not glob nested directories; every scan above is grep -rn packages or git grep.


The fork, answered from the census

Authorable, not a runtime slot — and the runtime route is MECHANICALLY closed

RuntimeOnlyDeclared cannot hold bind. zod-mirror-parity.test.ts defines CallbackShapedKey as `on${'A'|…|'Z'}${string}` and pins assertionRuntimeOnlyIsCallbackShapedOnly — a non-callback key filed there is a type error. That header states the reason: without it "the new category is a place to move any inconvenient key to, and the reclassification becomes the waiver it is not."

So PR #6352's onItemClick precedent does not transfer. onItemClick is callback-shaped; bind is a path string. Different route by construction, not by judgement.

Everything else agrees it is authorable — three documents teach it as an authorable key of every node:

  • AGENTS.md §4, this repo's own canonical instruction file: "Every node in the UI tree follows this shape (@object-ui/types)", listing bind as an optional string with the comment data binding path: 'user.address.city';
  • skills/objectui/rules/protocol.md:40, :151 (published, agent-facing): "Every UI component node MUST follow this shape", and "a path string resolved by useDataScope()";
  • content/docs/fields/grid.mdx:190.

useDataScope is (path?: string) and resolves via path.split('.') (packages/react/src/context/SchemaRendererContext.tsx:60), so string is not a choice — it is the resolver's own signature. It is also the spelling three of the four pre-existing local declarations already used.

⇒ authorable ⇒ the zod mirror member is required, and it is here.

BaseSchema, not per-component — and this is a measurement, not a preference

The decisive fact is that per-component declaration buys nothing that BaseSchema does not. BaseSchema carries [key: string]: any on the TS side and is .passthrough() on the zod side, and every reader mirror is BaseSchema.extend(…), which inherits that. So neither half can refuse bind on a non-reader either way. Nine declarations would cost nine copies of one key for exactly zero additional enforcement — and would be, in the card's own words, "the second declaration this class keeps generating."

Supporting evidence:

  • Precedent. BaseSchema.placeholder is declared for every node and documented "for input components" — a cross-cutting authorable key honoured by a subset already lives here.
  • bind is universally DELIVERED. SchemaRenderer spreads it to every component; that is why MetricWidget/MetricCard must strip it. Declaring it on the base states the delivered reality.
  • A mixin was considered and rejected. FlexLayoutProps (layout.ts) is the in-repo mixin precedent, but it would need .extend() on nine mirrors and nine extends on the TS side to buy the same zero enforcement, while contradicting all three documents that teach bind as universal.

Contract-first check: @objectstack/spec does NOT move

Scanned ../objectstack/packages/spec/src for a UI-node bind. Every hit is prose or Function.prototype.binddashboard.zod.ts and view.zod.ts bind a dataset (ADR-0021), a different vocabulary. bind is objectui-local renderer vocabulary. No Blocked-by:, no reach into packages/spec.


What changed

  • packages/types/src/base.tsBaseSchema declares bind as an optional string, with the census, the home argument and the ceiling inline.
  • packages/types/src/zod/base.zod.tsBaseSchemaCore gains bind: z.string().optional(). Not optional housekeeping: the pair base.zod.ts#BaseSchema carries no KnownDrift / UnmirroredDeclared entry, so a TS declaration without this member reddens the parity ratchet by name (demonstrated in the ablation below).
  • packages/types/src/objectql.tsObjectGridSlotKey and ObjectFormSlotKey gain 'bind'. Required, not cosmetic: those unions are hand-written key lists whose whole documented hazard is that "a member that exists on ObjectGridSchema but is missing from ObjectGridSlotKey is simply not configurable through the slot, and nothing says so." object-view-slot-key-lists.test.ts caught this the moment the base member landed — the guard doing precisely its job.
  • packages/types/src/__tests__/object-view-slot-key-lists.test.ts — member counts 61→62 and 67→68. The historical -> 0 measurement table is kept verbatim and annotated rather than rewritten; falsifying a recorded measurement is not a count bump.
  • packages/types/src/__tests__/base-bind-declared.test.ts — new, in the house form (timeline-declared-keys.test.ts / gantt-declared-keys.test.ts). Runtime half, compile-time @ts-expect-error half, a counter-probe against a never-narrowed declaration, an honest ceiling pin asserting that bindTo is still accepted, and a single-declaration scan that ratchets the three remaining non-home declarations with their reasons.
  • packages/plugin-dashboard/src/ObjectPivotTable.tsx — drops its local duplicate.
  • Two stale prose counts (object-view-spec-parity.test.ts, zod-mirror-parity.test.ts) that this diff itself made false: "20 members" → 21. zod-mirror-parity.test.ts's own header warns that its counts rot and get quoted as fact; leaving them would have seeded exactly that.

Declared bounded in-place fix: the ObjectPivotTable line and the two prose counts are not named in the ruling. All three are the same defect class, mechanical, and pinned by evidence — the first is a genuine duplicate of the member this PR declares, the other two are statements this diff falsifies. Same gate family (packages/types + plugin-dashboard), no new verification surface.


What this does NOT do — stated because the pin reads as more otherwise


The narrowing, and why it is safe

It narrows the value, not the key: bind: 42 type-checked and parsed green before this change and is refused by both halves now.

It only refuses what already crashed. useDataScope is (path?: string) and does path.split('.'), so a truthy non-string bind threw a TypeError at render. Every bind authored anywhere in this repo is a string ('customers', 'rows', 'treeNodes', 'items', 'customerNames', 'data.revenue', 'app.settings.users'). The member is optional, so nothing that renders today stops.


Ablation — the pin has teeth, both legs proven on disk

Predicted direction: renaming the declaration makes the TS member fall back to any through the index signature, the wrong-typed assignment starts succeeding, and the now-unused directive fails the build with TS2578 naming the key.

No build leg is needed, and that is proven rather than assumedtsc -p tsconfig.test.json --listFiles: src/base.ts 1 hit, dist/base.d.ts 0 hits, base-bind-declared.test.ts 1 hit (so the @ts-expect-error block is real enforcement, not decoration).

HEAD_BLOB=bf5ca5162e02acded66cd80650bbf5039b147213
BASELINE_TSC_EXIT=0
deleted-text count (expect 0): 0
injected-text count (expect 1): 1
MUT_BLOB=eaa2e136155c99ffe42d6bec988348081b3fe049      # != HEAD blob: mutation landed
ABLATION_TSC_EXIT=2
src/__tests__/base-bind-declared.test.ts(143,5): error TS2578: Unused '@ts-expect-error' directive.
src/__tests__/zod-mirror-parity.test.ts(1203,14): error TS2322: Type '… | "base.zod.ts#BaseSchema" | …' is not assignable to type 'never'.
RESTORED_BLOB=bf5ca5162e02acded66cd80650bbf5039b147213  # byte-identical to the HEAD blob
residual marker count (expect 0): 0
git diff HEAD on target: EMPTY (restore proven)

Predicted instrument fired, and a second independent one did too: the mirror-parity ratchet, because the mutation left the mirror declaring bind while the TS side no longer did. The script carried a trap … EXIT INT TERM with absolute paths; the restore is proven by blob-hash equality and an empty git diff HEAD, not by the trap having run.


Gates — each gate's own verdict line, at 01f4e58b3

gate exit its own verdict line
turbo run build --filter='!@object-ui/site' --concurrency=2 0 Tasks: 43 successful, 43 total
pnpm exec vitest run packages/types/ 0 Test Files 66 passed (66) / Tests 776 passed (776)
pnpm exec vitest run packages/plugin-dashboard/ 0 Test Files 81 passed (81) / Tests 764 passed (764)
@object-ui/types type-check 0 script echoed tsc --noEmit && tsc -p tsconfig.examples.json && tsc -p tsconfig.test.json
@object-ui/plugin-dashboard type-check 0 script echoed tsc --noEmit && tsc -p tsconfig.test.json
downstream consumer sweep --filter '...@object-ui/types' type-check 0 42 packages type-check: Done
eslint packages/types packages/plugin-dashboard 0 239 files, errorCount: 0 (640 pre-existing warnings; lint.yml sets no --max-warnings)
check:control-bytes 0 ✅ check-control-bytes: OK (scanned 5426 tracked text file(s); skipped 85 binary).
check-changeset-presence 0 ✅ 8 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s)
check-changeset-no-major 0 ✅ No changeset declares a 'major' bump.

Sweep direction, declared: --filter '...@object-ui/types' is the prefix form — downstream consumers, which is the direction a base-type narrowing can break. The suffix form would have been upstream dependencies and would have proven nothing.

Sweep sha, declared honestly: the 42-package sweep and the 43-package build were measured at 64bd3934b. The only change between that commit and 01f4e58b3 is inside base-bind-declared.test.ts (git diff 64bd3934b HEAD --stat → 1 file, +12/−5) — no package imports that file, and every ratchet family was re-run at 01f4e58b3 and is in the table above.

Lint scope, declared. Repo-scale turbo run lint was narrowed to the two affected packages. That narrowing is a measurement, not a skip, on three pieces of evidence: ① the population came from eslint's own config resolution, not a guess about which files count; ② the count is from --format json — 239 files, 0 errors; ③ type-aware linting is not enabledeslint.config.js's languageOptions carries only ecmaVersion and globals, with no parserOptions.project / projectService — so no rule's verdict on an untouched file can depend on this diff.


Out-of-scope findings — filed unassigned, not fixed here

  1. data-table accepts bind and silently renders an empty body. Documented and pinned, but carrying no card; searched the 242 open issues and found none.
  2. ObjectDataTableProps.schema and ObjectGalleryProps.schema are hand-rolled inline schema types with no BaseSchema in their ancestry, so every base key is undeclared there and each must hand-copy the ones it needs — which is why both carry their own bind. ObjectGallery's has no index signature either. Adjacent to finding(types): BaseSchema's [key: string]: any leaves every component schema open, so a "declare the surface" fix can never reject a misspelled TOP-LEVEL key #5155 / finding(types): ObjectViewSchema's table and form slots declare ZERO properties — the same Omit-under-index-signature collapse as #6151, in property position #6269 but distinct: those types never reach BaseSchema at all.

Checked and not filed: events as a universally-taught-but-undeclared key is already covered by #6497 (EventableSchema / UIEventMap do declare it).


Generated by Claude Code

claude added 2 commits August 26, 2026 13:10
`bind` was read by ten production sites and declared by no schema shape — it
resolved as `any` through `BaseSchema`'s index signature and rode
`.passthrough()` on the validator, while `AGENTS.md` §4, the published
agent-facing `skills/objectui/rules/protocol.md` and `content/docs/fields/grid.mdx`
all taught it as an authorable key of every node.

The census chose the home rather than guessing it: nine reads go through
`useDataScope(schema.bind)` across eight packages, a tenth is `plugin-grid`'s
`gridNeedsDataSource` predicate, and two more sites destructure the key out of
the DOM prop spread. Per-component declaration was measured and rejected — it
costs nine copies and buys nothing extra, because neither half can refuse the
key on a non-reader either way.

Declaring it narrows the accept set on the VALUE, not the key: `bind: 42`
type-checked and parsed green before and is refused by both halves now. That
only refuses what already crashed, since `useDataScope` is `(path?: string)`
and resolves via `path.split('.')`.

`ObjectGridSlotKey` / `ObjectFormSlotKey` gain the key so the view slots still
ship the full configuration, and the member-count pins that guard exactly that
drift move 61->62 and 67->68. `ObjectPivotTable` drops its local duplicate.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
`git grep` searches TRACKED files, so once the pin was committed its own
literal pattern matched it and the scan reported itself. The pattern is now
assembled from parts and the prose no longer spells it, so the file cannot be
its own hit. Allow-listing it would have been the wrong repair — that puts a
permanent hole in the scan at the path most likely to grow a copy.

Also drops a useless initializer flagged by `no-useless-assignment`.

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

Copy link
Copy Markdown
Collaborator Author

PM review of #6357 — substance ACCEPTED, but ⛔ this PR STAYS DRAFT and is NOT being enqueued.

Triage attached human review to exactly this branch of the fork: "If the census says BaseSchema, that is a widening of a published base type: draft-PR/human-review handling per this repo's convention." The census said BaseSchema. So this seat reviews and hands over; it does not land. Listed for the maintainer in the round report.

I have not requested a named reviewer because I do not have a verified handle for this repo's base-type review, and guessing one would route it wrong. Maintainer: this is the PR that needs your merge.

The census is right, and it found what decides the card

Verified independently on main:

bind was already declared four times locally, in two disagreeing spellingsObjectDataTable.tsx:39, ObjectPivotTable.tsx:45 and ObjectGallery.tsx:20 as bind?: string, and schemaHostProps.ts:65 as bind?: unknown. The card warned about "the second declaration this class keeps generating"; it had already happened four times, and the two spellings had already diverged. That is the strongest possible argument for a single producer-side declaration, and it is measured rather than argued.

The tenth read is realplugin-grid/src/index.tsx:105, if (schema?.bind != null) return false;, a non-hook escape hatch in gridNeedsDataSource. Plus the two DOM-strip destructures at MetricCard.tsx:74 and MetricWidget.tsx:273.

My dispatch-order census missed all four, and I can now name why. My pattern was schema\.bind, whose . is a regex wildcard that cannot span the two characters in schema?.bind. That is the same specific bug that made my objectDef.titleField count read 4-instead-of-5 on #6557 an hour ago — twice in one session, both times because this codebase writes the same read in both spellings. The pattern that answers is schema\??\.bind. Take the ten-site table in my order as a floor, never a population.

The fork was resolved on mechanism, not preference

Both halves are the kind of answer I wanted:

Authorable, because the alternative is mechanically closed. assertionRuntimeOnlyIsCallbackShapedOnly makes a non-callback key filed under RuntimeOnlyDeclared a type error — so PR #6352's onItemClick precedent cannot transfer to bind. That is not a judgement call about which route is nicer; it is a route that does not exist for this key. Three documents teaching bind as authorable (AGENTS.md §4, the published protocol.md, content/docs/fields/grid.mdx) then settle the direction, and authorable ⇒ the zod mirror member, which is in.

BaseSchema, because per-component buys nothing. BaseSchema carries [key: string]: any and is .passthrough(), and every reader mirror is BaseSchema.extend(...) — so neither half can refuse the key on a non-reader either way. Nine copies for zero enforcement. BaseSchema.placeholder is the standing precedent for a cross-cutting key honoured by a subset.

Contract-first cleared: @objectstack/spec declares no UI-node bind — verified, zero hits. No Blocked-by, no reach into packages/spec.

Two things done right that are easy to get wrong

⭐⭐⭐ The self-matching scan was repaired, not allow-listed. The single-declaration scan reported itself once committed, because git grep searches tracked files and the file contains the literal pattern. Assembling the pattern from parts — rather than adding an allow-list entry — is the correct fix, and the reason given is exactly right: an exemption would have "put a permanent hole in the scan at the likeliest path." An allow-list at the one location the next violation would appear is gate weakening wearing a housekeeping label.

⭐⭐ The slot-key guard went red and was obeyed, not silenced. object-view-slot-key-lists.test.ts turned red the moment the base member landed, and the fix was adding bind to ObjectGridSlotKey / ObjectFormSlotKey — not bumping the counts. That is the guard's stated purpose working: a base member missing from a slot key list is not configurable through the slot, and nothing else says so.

The honest characterisation of the risk

This is a narrowing on the value axis: bind: 42 parsed green before and is refused now. The dev's framing is the correct one and I want it on the record for whoever merges — it only refuses what already crashed. useDataScope is (path?: string) and calls path.split('.'), so a non-string bind was already a render-time TypeError. The change is silent-crash → loud-rejection, not working → broken.

The 42-package downstream sweep is green, and the stated limit is honest: it measures this repo only, and out-of-repo consumers writing a non-string bind are unmeasurable from here.

One conflict in my own dispatch order, correctly flagged

The dev noted my order said "push nothing if the census stops you" while the standing dev contract makes the empty-branch push a mandatory first-minute write-route probe. It ran the probe, the census did not stop it, and the two never diverged in practice — but the contradiction is mine and real. Same class as the #6537 order that named one file two ways. When I write a stop-and-report clause, it has to be reconciled with the contract's mandatory probe rather than stated as an absolute.

#6575 and #6576 filed; events checked and correctly not filed as already covered by #6497.

Verdict: substance accepted, held for human merge.


Generated by Claude Code

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3235.1 KB 3266.6 KB
Main entry chunk (gzip) 157.0 KB 350 KB
Entry file index-hBCETSK9.js
Status PASS

The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it.


📦 Bundle Size Report

Package Size Gzipped
app-shell (consoleActionDispatch.js) 0.20KB 0.19KB
app-shell (index.js) 11.71KB 4.46KB
app-shell (runtime-config.js) 18.10KB 6.51KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 10.06KB 3.86KB
auth (ActiveOrganizationStorage.js) 25.05KB 9.16KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 2.07KB 1.00KB
auth (AuthProvider.js) 40.18KB 10.59KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.15KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.65KB 2.22KB
auth (SocialSignInButtons.js) 9.61KB 3.89KB
auth (UserMenu.js) 3.41KB 1.23KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.80KB
auth (createAuthenticatedFetch.js) 8.46KB 3.43KB
auth (index.js) 3.19KB 1.44KB
auth (invitation-status.js) 1.22KB 0.70KB
auth (org-roles.js) 6.66KB 2.78KB
auth (phone-identifier.js) 1.11KB 0.66KB
auth (types.js) 0.59KB 0.35KB
auth (useAuth.js) 5.30KB 1.02KB
auth (useWorkspaceAdminStatus.js) 5.13KB 2.35KB
collaboration (CommentThread.js) 26.08KB 7.56KB
collaboration (LiveCursors.js) 3.17KB 1.27KB
collaboration (PresenceAvatars.js) 6.49KB 2.64KB
collaboration (PresenceProvider.js) 2.79KB 1.13KB
collaboration (index.js) 1.68KB 0.73KB
collaboration (useCollaborationTranslation.js) 6.05KB 2.52KB
collaboration (useCommentSearch.js) 1.98KB 0.88KB
collaboration (useConflictResolution.js) 7.75KB 1.86KB
collaboration (useMentionNotifications.js) 1.81KB 0.68KB
collaboration (usePresence.js) 6.33KB 1.84KB
collaboration (useRealtimeSubscription.js) 7.91KB 2.01KB
components (index.js) 506.01KB 114.64KB
core (index.js) 5.30KB 2.13KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 173.10KB 47.96KB
fields (index.js) 238.89KB 60.02KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.44KB 1.39KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 33.40KB 8.71KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.95KB 10.97KB
mobile (MobileProvider.js) 0.92KB 0.49KB
mobile (ResponsiveContainer.js) 0.94KB 0.38KB
mobile (breakpoints.js) 1.51KB 0.70KB
mobile (createOfflineDataSource.js) 5.61KB 1.75KB
mobile (index.js) 1.55KB 0.62KB
mobile (offlineQueue.js) 3.91KB 1.35KB
mobile (pwa.js) 0.97KB 0.49KB
mobile (serviceWorker.js) 1.48KB 0.62KB
mobile (serviceWorkerSource.js) 3.41KB 1.48KB
mobile (useBreakpoint.js) 1.54KB 0.65KB
mobile (useGesture.js) 6.96KB 1.98KB
mobile (useOfflineSync.js) 1.99KB 0.72KB
mobile (usePullToRefresh.js) 2.53KB 0.85KB
mobile (useResponsive.js) 0.72KB 0.42KB
mobile (useResponsiveConfig.js) 1.37KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.53KB 3.38KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.64KB 1.50KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.93KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.53KB
permissions (usePermissions.js) 1.93KB 0.88KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.91KB 12.92KB
plugin-charts (index.js) 64.66KB 18.32KB
plugin-chatbot (index.js) 188.60KB 44.82KB
plugin-dashboard (index.js) 133.48KB 34.49KB
plugin-designer (index.js) 212.80KB 43.15KB
plugin-detail (index.js) 245.29KB 62.39KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 131.78KB 32.19KB
plugin-gantt (index.js) 165.16KB 40.33KB
plugin-grid (index.js) 201.66KB 54.58KB
plugin-kanban (index.js) 53.16KB 14.65KB
plugin-list (index.js) 112.74KB 27.50KB
plugin-map (index.js) 20.09KB 6.62KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 43.51KB 11.94KB
plugin-timeline (index.js) 26.72KB 7.71KB
plugin-tree (index.js) 9.26KB 3.13KB
plugin-view (index.js) 84.85KB 20.79KB
providers (DataSourceProvider.js) 0.75KB 0.39KB
providers (MetadataProvider.js) 1.37KB 0.59KB
providers (ThemeProvider.js) 1.90KB 0.85KB
providers (UploadProvider.js) 11.66KB 3.50KB
providers (index.js) 0.45KB 0.23KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 4.47KB 1.63KB
react (SchemaRenderer.js) 63.21KB 21.05KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 2.44KB 1.21KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 4.93KB 2.24KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 12.13KB 3.65KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 7.54KB 2.63KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 0.99KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.74KB 1.41KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 3.75KB 1.85KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.85KB 0.85KB
types (disclosure.js) 0.20KB 0.18KB
types (error-code.js) 1.54KB 0.88KB
types (feedback.js) 0.20KB 0.18KB
types (field-types.js) 0.20KB 0.18KB
types (form.js) 0.20KB 0.18KB
types (http-inflight.js) 8.87KB 3.73KB
types (http-retry.js) 4.32KB 2.02KB
types (icon-key-migration.js) 4.26KB 1.63KB
types (index.js) 4.72KB 2.24KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 2.59KB 1.31KB
types (navigation.js) 0.20KB 0.18KB
types (objectql.js) 0.20KB 0.18KB
types (overlay.js) 0.20KB 0.18KB
types (permissions.js) 0.20KB 0.18KB
types (plugin-scope.js) 0.20KB 0.18KB
types (record-components.js) 0.20KB 0.19KB
types (record-semantics.js) 1.28KB 0.67KB
types (registry.js) 0.20KB 0.18KB
types (reports.js) 0.20KB 0.18KB
types (spec-report.js) 5.05KB 1.93KB
types (spec-ui-namespace.js) 0.20KB 0.19KB
types (system-fields.js) 3.33KB 1.54KB
types (theme.js) 6.28KB 2.87KB
types (ui-action.js) 3.40KB 1.71KB
types (views.js) 0.20KB 0.18KB
types (widget.js) 0.20KB 0.18KB

Size Limits

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

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.

[finding] schema.bind is read by data-scope consumers but declared by no schema shape

2 participants