Skip to content

feat(types): declare RichtextFieldMetadata for the widget's third registry key - #8373

Draft
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-7083-richtext-field-metadata
Draft

feat(types): declare RichtextFieldMetadata for the widget's third registry key#8373
claude[bot] wants to merge 3 commits into
mainfrom
claude/issue-7083-richtext-field-metadata

Conversation

@claude

@claude claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Fixes #7083

Executes the maintainer's ruling of 2026-09-07 (director seat, decision batch #71, comment 5565745438): the three registry keys one widget serves each get an exported metadata type. RichtextFieldMetadata is added to @object-ui/types, joins the FieldMetadata union, and the deliberate as unknown as MarkdownFieldMetadata in packages/fields/src/widgets/__tests__/RichTextField.rows.test.tsx:50 — with its comment at :48 — is gone.

What was missing

markdown, html and richtext are one widget (#5498). Two of the three carried an exported metadata type; richtext carried none, so the runtime served it happily by structure while an author could not write its metadata under an annotation at all. The state was neither a member nor a recorded alias — a silent gap whose only evidence was a cast in this repo's own pin test. That asymmetry is why the gap had to be rediscovered to be seen, and #7083 is itself that rediscovery.

So the comment goes with the cast, and the surrounding docblock in that file is re-pointed: the next reader should not be able to find the gap again.

The read set was DERIVED, not copied

The ruling's load-bearing sentence is "do not copy 'probably the same'". Every key was read off packages/fields/src/widgets/RichTextField.tsx on the richtext path (that file is read-only in this change and is unmodified):

key read site in RichTextField.tsx where it is declared
type :176 resolveRichTextFieldType reads field.type and strips a field: prefix; called at :245 narrowed to 'richtext' on the new member
rows :291 `richField?.rows
mobile_fullscreen :299 Boolean(richField?.mobile_fullscreen) already on BaseFieldMetadata:89
placeholder :319 `richField?.placeholder
label :339 passed to FullscreenFieldEditor already on BaseFieldMetadata:31

The readonly branch (:280) hands field whole to the RICH_TEXT_CELL_RENDERERS entry for the type; both renderers in richTextDisplay.tsx destructure value only, so the display half contributes no metadata key. type is also the only thing that differs between the three keys at runtime — it selects the display pipeline (richtext reads through the HTML renderer, #5452) and the format label. Nothing else in the widget branches on it.

The diff against the two siblings, and the one key that needed a decision

MarkdownFieldMetadata and HtmlFieldMetadata are byte-identical to each other apart from their type literal: type + max_length?: number + rows?: number over BaseFieldMetadata. So the cross-check produced exactly one open question — max_length, the one key on the siblings that RichTextField does not read.

It is declared on the new member, and on a measurement rather than on the siblings having it. Against the installed @objectstack/spec 17.3.0, FieldSchema answers identically for all three of the field types this widget serves:

payload markdown html richtext
control (no ceiling key) accepted accepted accepted
rows: 4 accepted accepted accepted
maxLength: 50 (the spec's own spelling) accepted accepted accepted
max_length: 50 (objectui legacy spelling) refused by name refused by name refused by name

Omitting it would have left richtext the one key of the three whose ceiling cannot be authored under an annotation — a fresh instance of the very asymmetry the member exists to end. That measurement is pinned in the new test file so the member's docblock cannot rot into a false canonical claim (the #7014 failure mode).

The pin has two halves, and both are non-vacuous

packages/fields/src/widgets/__tests__/richtext-field-metadata-7083.test.tsx:

  • compiles — the literal is annotated, never as, so TypeScript's excess-property check judges every key, and it is assigned to FieldMetadata to pin the union membership the ruling granted plus the narrowing on type. Measured, not assumed, that this leg actually runs: packages/fields's type-check script is tsc --noEmit && tsc -p tsconfig.test.json, and tsc -p tsconfig.test.json --listFiles names both this file and RichTextField.rows.test.tsx. On the pre-change tree the file does not compile at all — there is no member to annotate against — which is what makes this leg real rather than decorative. A pin proving only the render would still have passed with the cast in place, i.e. in the state this card ends.
  • rendersrows, placeholder, mobile_fullscreen and label are each asserted at the DOM, against a control fixture with all the optional keys absent at once, so a green reads "the widget consumed the declared key" and never "the default happened to match".

Scope

Additive only. Nothing is removed or narrowed; richtext metadata previously written through a cast keeps compiling; RichTextField itself is untouched — it already served all three keys, and this change only gives the third one a face. Full downstream sweep: turbo run type-check --filter='...@object-ui/types'77/77 tasks green, so widening the FieldMetadata union breaks no consumer.

packages/fields changes are test-only, so the changeset grades @object-ui/types minor and nothing else.

Verification

Exit codes captured before any pipe; each verdict read from the gate's own printed line.

gate exit verdict line
turbo run build --filter='@object-ui/fields^...' 0 Tasks: 9 successful, 9 total
type-check (types + fields) 0 Tasks: 12 successful, 12 total
type-check --filter='...@object-ui/types' (downstream sweep) 0 Tasks: 77 successful, 77 total
vitest run packages/types/ 0 Test Files 141 passed (141) · Tests 2695 passed (2695)
vitest run packages/fields/ 0 Test Files 138 passed (138) · Tests 2352 passed (2352)
lint (types + fields) 0 Tasks: 3 successful, 3 total · 0 errors; the new file contributes 0 diagnostics
lint:coverage 0
type-check:coverage 0
changeset:check 0
check:control-bytes 0
check:self-import 0
check:phantom-deps 0
check:spec-symbols 0
check:spec-floors 0
check:designer-field-key-parity 0
check:element-data-source-declaration 0
check:sdui-registration-pins 0 All 16 registration(s) a sideEffects array promises are present in the built console (518 chunks weighed…)
check:handler-key-reads 0
check:doc-fences 0
check:doc-types 0
check:doc-snippets 0 Semantic phase: 632 of 632 block(s) judged, 0 failed
check:readme-exports 0 OK … 532 of them self-imports judged (532 real, 0 wrong-path, 0 fabricated) … 0 unbuilt
check:doc-example-readers 0
check:unreferenced-sources 0
check:comment-mask-corpus 0
check:vi-mock-specifiers 0
check:side-effects-array 0
check:esm-specifiers 0

Beyond the gates, a control-byte self-scan over the five touched paths (grep -naP over the C0 range plus DEL) found none.

Every gate the dispatch named is measured; none is left declared-to-CI. Three of them (check:readme-exports, check:doc-snippets, check:sdui-registration-pins) have environment preconditions — built artifacts — and each was rebuilt until its precondition held rather than accepted at its first exit code.

Two of those readings were false on the first attempt and are reported as re-measured, not as first answers. check:readme-exports first exited 1 naming 8 unjudged self-imports in packages/cli and packages/plugin-ai — both simply unbuilt in this worktree, neither touched by this diff — and check:doc-snippets first exited 1 on packages/plugin-chatbot/README.md:371, which is a stale dist: sibling #8341 landed that README in main between this branch's base and the merge below, while the built artifact it compiles against predated it. Rebuilding each package and re-running is what produced the zeroes above; neither red was about this change, and neither was accepted as a reading until the artifact under it was current.

验收备注

Observations found while deriving. Neither is filed as a card; both are recorded here rather than fixed, because the dispatch's file surface makes RichTextField.tsx read-only and the second one is another card's declared surface.

  1. RichTextField.tsx:283-289 now carries a stale claim. Its comment says "the third key, richtext, has no union member of its own and structurally matches the same three optional reads below". After this PR that sentence is false, and it sits exactly where the next reader would look — the same rediscovery loop the ruling asked to close by removing the test's comment. It is a two-line prose correction inside a file this dispatch declared READ ONLY, so it is deliberately not touched here. Recommend folding it into whichever change next opens that file, or a one-line follow-up.
  2. The rows docblocks on MarkdownFieldMetadata and HtmlFieldMetadata still describe the @objectstack/spec 17.2.0 boundary (where rows was refused by name); at 17.3.0 it is admitted. That prose is already When the @objectstack/spec pin moves to 17.3: PR #7510 / #7520's comment "repairs" become FALSE — rows and options[].description are now declared keys #7635's declared surface — recorded in packages/types/src/__tests__/select-option-spec-extension-7014.test.ts — so this PR states the 17.3.0 reading for richtext only and does not correct the neighbours, to avoid the two halves being repaired twice or, worse, once.

Review

Clause-② applies (a new published type-face member), so needs:contract-review is hung on this PR as well as on the card. This PR stays draft, is not enqueued and has no auto-merge armed; parking green is the intended end state until a CONTRACT_REVIEW_TIER reviewer clears both carriers. Neither carrier is cleared by this seat.

Authored by the domain:spec @ objectui execution seat, session https://claude.ai/code/session_01QtGhnU3WnnWyiWeYQhw2aX — kept in prose as a code span because a PATCH to this body downgrades a link-form attribution footer and drops the session reference.


🤖 Generated with Claude Code

https://claude.ai/code/session_01QtGhnU3WnnWyiWeYQhw2aX


Generated by Claude Code

…istry key

`markdown`, `html` and `richtext` are one widget (objectui#5498). Two of the
three carried an exported metadata type; `richtext` carried none, so the
runtime served it by structure while an author could not write its metadata
under an annotation at all. The only way to write one was
`as unknown as MarkdownFieldMetadata` — a deliberate cast in this repo's own
pin test that was the gap's sole evidence.

`RichtextFieldMetadata` is now exported from `@object-ui/types` and joins the
`FieldMetadata` union, so a richtext field's metadata is a typed literal and
narrows out of the union on `type`. The cast and its comment are gone, and the
surrounding docblock is re-pointed so the gap cannot be rediscovered.

The member's shape was derived from what `RichTextField` reads on the
`richtext` path, not copied from the two siblings: `type`, `rows`,
`placeholder`, `mobile_fullscreen` and `label` (the last three already sit on
`BaseFieldMetadata`), with the readonly branch's cell renderers contributing
no metadata key. `max_length` is declared on the measurement that `richtext`
is symmetric with `markdown`/`html` at the `@objectstack/spec` 17.3.0
authoring boundary, not on the siblings having it.

Additive only: nothing is removed or narrowed, `RichTextField` is unchanged,
and metadata previously written through a cast keeps compiling.

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

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3472.2 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-AHEZfBfj.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) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
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) 498.55KB 114.03KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 189.15KB 52.56KB
fields (index.js) 243.15KB 61.40KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
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.99KB 0.87KB
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 (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
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) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 193.79KB 46.09KB
plugin-dashboard (index.js) 131.48KB 34.45KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 248.65KB 63.91KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.58KB 56.63KB
plugin-kanban (index.js) 55.38KB 15.72KB
plugin-list (index.js) 113.38KB 27.73KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.46KB 20.80KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
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 (expression.js) 0.20KB 0.18KB
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.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
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 (select-option.js) 0.20KB 0.19KB
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) 8.11KB 3.32KB
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

…ew union member

Comment only — no behaviour, no read site, no signature changes.

The paragraph above `richField` said "the third key, `richtext`, has no union
member of its own". This branch is what makes that false, so the correction
belongs to this diff rather than to a follow-up: the ruling's stated reason for
deleting the pin test's comment was that the gap must not stay rediscoverable,
and the same sentence sat four lines from where a reader of the widget looks.

The cast itself is unchanged and stays correct. It names two of the three
members because it never had to discriminate: every key this widget consumes
off the carrier is declared on all three, so the two named already admit each
read below. The comment now says that outright instead of implying the third
key is undeclarable.

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

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 50 chunks) 3472.4 KB 3512.7 KB
Main entry chunk (gzip) 143.9 KB 350 KB
Entry file index-BqSg3AyZ.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) 15.67KB 5.75KB
app-shell (runtime-config.js) 20.68KB 7.36KB
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) 498.55KB 114.03KB
core (index.js) 7.48KB 2.96KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 189.15KB 52.56KB
fields (index.js) 243.15KB 61.40KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (builtinAggregateLabels.js) 0.86KB 0.49KB
i18n (currency.js) 1.22KB 0.64KB
i18n (fallbackInterpolation.js) 6.25KB 2.77KB
i18n (i18n.js) 6.57KB 2.76KB
i18n (index.js) 3.65KB 1.47KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 26.89KB 9.04KB
i18n (useDisplayLocale.js) 2.85KB 1.45KB
i18n (useObjectLabel.js) 34.34KB 9.17KB
i18n (useSafeTranslation.js) 5.60KB 2.33KB
layout (index.js) 38.84KB 10.94KB
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.99KB 0.87KB
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 (useSpecGesture.js) 4.39KB 1.66KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 11.71KB 4.29KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 6.24KB 2.16KB
permissions (discardProofCache.js) 1.04KB 0.55KB
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) 4.83KB 2.27KB
plugin-ai (index.js) 15.16KB 3.68KB
plugin-calendar (index.js) 49.00KB 13.91KB
plugin-charts (index.js) 71.39KB 19.92KB
plugin-chatbot (index.js) 194.49KB 46.33KB
plugin-dashboard (index.js) 131.48KB 34.45KB
plugin-designer (index.js) 213.21KB 43.63KB
plugin-detail (index.js) 248.66KB 63.92KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 131.01KB 32.32KB
plugin-gantt (index.js) 167.16KB 40.99KB
plugin-grid (index.js) 208.58KB 56.63KB
plugin-kanban (index.js) 55.38KB 15.72KB
plugin-list (index.js) 113.38KB 27.73KB
plugin-map (index.js) 20.49KB 6.83KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.92KB
plugin-timeline (index.js) 30.10KB 8.74KB
plugin-tree (index.js) 9.33KB 3.25KB
plugin-view (index.js) 84.46KB 20.80KB
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) 81.07KB 26.86KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 2.32KB 1.24KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 6.58KB 2.74KB
sdui-parser (dashboard-widget-options.js) 3.08KB 1.30KB
sdui-parser (index.js) 5.55KB 2.45KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 20.57KB 5.88KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 13.64KB 4.59KB
types (ai.js) 0.20KB 0.17KB
types (api-types.js) 0.20KB 0.18KB
types (app.js) 2.87KB 1.00KB
types (base.js) 0.20KB 0.18KB
types (blocks.js) 0.20KB 0.18KB
types (complex.js) 2.93KB 1.49KB
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 (expression.js) 0.20KB 0.18KB
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.74KB 2.25KB
types (layout.js) 0.20KB 0.18KB
types (managed-by.js) 0.19KB 0.18KB
types (mobile.js) 4.73KB 2.28KB
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 (select-option.js) 0.20KB 0.19KB
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) 8.11KB 3.32KB
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] richtext registry key 在 @object-ui/types 无 FieldMetadata union 成员(markdown/html 有)——结构上被服务但不可声明

1 participant