Skip to content

fix(types,components): FieldValidationRules.pattern.value is RegExp-only; unrecognized rule names shout (#5099) - #5187

Merged
os-steve merged 2 commits into
mainfrom
claude/issue-5099-validation-rules-contract
Aug 18, 2026
Merged

fix(types,components): FieldValidationRules.pattern.value is RegExp-only; unrecognized rule names shout (#5099)#5187
os-steve merged 2 commits into
mainfrom
claude/issue-5099-validation-rules-contract

Conversation

@os-steve

Copy link
Copy Markdown
Collaborator

Fixes #5099

Implements the maintainer ruling of 2026-08-18 (comment-5322881617, verbatim 「同意」), all three limbs:

1. A — the declaration narrows (producer-side strict)

FieldValidationRules.pattern.value is now RegExp — no longer string | RegExp (packages/types/src/form.ts). react-hook-form's field validator applies pattern only when value instanceof RegExp (re-derived from the installed 7.85.0 bundle, see below), so a string here type-checked for years and then validated nothing, silently. A hand-written string pattern is now a compile-time error. string survives only on the metadata route's field declaration (FieldSchema.pattern), which buildValidationRules in @object-ui/fields compiles — that route is untouched (read-only reference in this PR).

In-repo callers turning red: zero. Repo-wide sweep (turbo type-check, 81/81 tasks) found no caller authoring a string pattern; the docs example (content/docs/plugins/plugin-form.mdx) and packages/types/examples/login-form.ts already pass RegExp literals.

2. B's error half — unrecognized rule names shout

At the single read point's field list, the renderer now reports rule names react-hook-form does not run (console.error, house style of the #3090 vocabulary diagnostic: the message doubles as the fix instruction). A misspelled minlength, an invented email, and the numeric keys left by spreading an array into validation (the #5075 group-1 shape) all shout instead of vanishing.

The recognized set lives in packages/components/src/renderers/form/validationRuleKeys.ts and is pinned against the installed react-hook-form bundle, not prose: rhf-recognized-rule-keys.test.ts re-derives the validator's fixed ._f destructure (ref, refs, required, maxLength, minLength, min, max, pattern, validate, name, valueAsNumber, mount in 7.85.0) from dist/index.cjs.js at test time with shape-based (minifier-safe) regexes, subtracts the descriptor internals, and requires exact set equality — a react-hook-form bump that changes the set turns the test red instead of silently rotting the diagnostic. The instanceof RegExp gate (the premise of limb 1) is pinned in the same file.

3. B's normalization half — NOT implemented, and pinned that way

No new RegExp(...) was added at the read point: the ruling explicitly rejected compiling strings there as consumer tolerance that would harden the ambiguous declaration into contract (AGENTS.md #0.1). This is pinned by test in both directions — unrecognized-validation-rules.test.tsx asserts a smuggled string pattern reaches react-hook-form uncompiled and validates nothing (submit passes), so if someone "helpfully" adds the normalization later, the suite goes red.

Breaking change vs. the no-major gate — the deliberate reconciliation

This narrows a published type, and scripts/check-changeset-no-major.mjs forbids major. These do not conflict: this repo's version policy (AGENTS.md §版本号策略) reserves major exclusively for tracking @objectstack majors ("major 相同即兼容") and directs objectui's own breaking changes to ship as minor with the breaking semantics stated plainly in the body — which is also what the ruling ordered. The changeset (.changeset/field-validation-rules-pattern-regexp-5099.md) declares minor for @object-ui/types + @object-ui/components and states the breaking semantics up front: string patterns stop compiling, and red is the fix — every such caller was running zero validations already, so the error converts silent non-validation into explicit failure at authoring time.

Verification (all at 0b27ef102)

  • New tests: 3 files, 9 tests passed (type pin, bundle pin, diagnostic behavior).
  • Blast radius: pnpm exec vitest run packages/components/src/renderers/form/ packages/types/ — 80 files, 683 tests passed.
  • pnpm --filter @object-ui/types type-check and ...components type-check green; full consumer radius turbo run type-check 81/81 green (every package is downstream of @object-ui/types, so the full run covers the whole radius).
  • Lint (types, components) 3/3; check-changeset-presence / check-changeset-fixed / check-changeset-no-major / check:control-bytes / check:doc-types / check:phantom-deps / check:self-import green; check:doc-snippets green after a full workspace build (doc snippets compile against the narrowed built types).
  • Reverse verifications, from the committed state:
    1. Cross-package .d.ts probe: a temp components file with a string pattern → tsc red with Type 'string' is not assignable to type 'RegExp' → probe deleted. Proves consumers read the rebuilt declaration, not a cache.
    2. Type ablation: restored form.ts from origin/main → types tsc -p tsconfig.test.json red (3 errors incl. TS2578: Unused '@ts-expect-error') → restored. This leg's reader is tsc over src (relative import), no dist in the path.
    3. Diagnostic ablation: restored form.tsx from origin/main → the two reporting tests red, the other three green as expected (they pin behavior identical on main: silence for recognized rules, RegExp path validating, strings not compiled), bundle-pin test unaffected → restored. Reader is vitest over src via relative imports, no dist in the path.

Out of scope, filed

#5186FormFieldSchema.validation's zod mirror (FieldConstraintsSchema) contradicts FieldValidationRules in both directions (rejects the TS-legal object shape, accepts a flat shape the renderer never reads). Adjacent surface, measured evidence in the issue; not touched here.


Generated by Claude Code

…e names shout (#5099)

Maintainer ruling 2026-08-18 (A + B's error half; B's normalization half
rejected):

- FieldValidationRules.pattern.value narrows from `string | RegExp` to
  `RegExp` on the hand-written surface. react-hook-form applies `pattern`
  only when `value instanceof RegExp`, so a string here type-checked and
  then validated NOTHING, silently. Strings stay legal on the metadata
  route (FieldSchema.pattern), which buildValidationRules compiles.
- The form renderer's single read point now reports validation rule names
  react-hook-form does not run (dev-time console.error): misspelled
  `minlength`, invented `email`, numeric keys from spreading an array.
  Recognized set pinned against the INSTALLED react-hook-form bundle
  (rhf-recognized-rule-keys.test.ts re-derives it from dist/index.cjs.js).
- Deliberately NOT compiling string patterns at the read point — the
  ruling rejected that consumer tolerance (AGENTS.md #0.1); a test pins
  the rejection in both directions.

BREAKING for hand-written string patterns; declared `minor` per this
repo's version-alignment policy (majors track @objectstack, enforced by
check-changeset-no-major.mjs), with the breaking semantics stated in the
changeset body.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 25.3 KB 350 KB
Entry file index-CeLHe5YP.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.79KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
auth (index.js) 2.71KB 1.22KB
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.02KB 0.88KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 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.65KB 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) 502.99KB 112.49KB
core (index.js) 4.11KB 1.62KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 159.03KB 44.08KB
fields (index.js) 234.25KB 58.48KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 39.16KB 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.74KB
mobile (index.js) 1.50KB 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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.35KB 3.31KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.81KB 0.83KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.62KB 12.83KB
plugin-charts (index.js) 64.75KB 18.37KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 127.85KB 32.73KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 241.46KB 60.56KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 123.77KB 30.07KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 198.05KB 53.21KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.39KB 27.03KB
plugin-map (index.js) 20.02KB 6.58KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.97KB 11.33KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 83.81KB 20.49KB
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.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 31.55KB 10.70KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.28KB 0.68KB
react (schema-input.js) 1.45KB 0.83KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (index.js) 4.77KB 2.16KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 6.92KB 2.40KB
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) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 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-retry.js) 4.32KB 2.02KB
types (index.js) 3.05KB 1.52KB
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 (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
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

…e it

PM patch round on PR #5187, two blocking changes:

- Dev-only: the ruling's second limb says dev-time error; a customer's
  production console is not the audience. Same gate as basic/div.tsx /
  basic/span.tsx (warnDeprecatedOnce), including its order property:
  the production check returns BEFORE the seen-set is marked, so a
  production render never suppresses the later dev notice.
- Once per field + rule-set: rawFields is a caller-owned prop, so a
  schema-driven caller rebuilding the array per render re-ran the
  effect every render and repeated the notice forever (objectui#3965
  measured what that costs). Module-level Set memo keyed by field name
  + sorted offending keys, the warnOnTopLevelStyleUrl shape from
  plugin-map/ObjectMap.tsx.

Message text, recognized-set extraction, bundle pin and type narrowing
unchanged. Both new behaviors pinned by tests, gate order included.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Main entry (gzip) 25.3 KB 350 KB
Entry file index-UAodToeq.js
Status PASS

📦 Bundle Size Report

Package Size Gzipped
app-shell (index.js) 9.56KB 3.59KB
app-shell (runtime-config.js) 7.42KB 2.32KB
app-shell (types.js) 0.01KB 0.04KB
app-shell (urlParams.js) 8.92KB 3.41KB
auth (AuthContext.js) 0.31KB 0.24KB
auth (AuthGuard.js) 1.17KB 0.53KB
auth (AuthProvider.js) 25.13KB 5.40KB
auth (AuthShell.js) 3.49KB 1.40KB
auth (ForgotPasswordForm.js) 12.21KB 3.45KB
auth (LoginForm.js) 18.13KB 5.39KB
auth (PreviewBanner.js) 0.90KB 0.50KB
auth (RegisterForm.js) 6.64KB 2.21KB
auth (SocialSignInButtons.js) 9.60KB 3.89KB
auth (UserMenu.js) 3.40KB 1.22KB
auth (auth-gate-events.js) 1.29KB 0.66KB
auth (authStyles.js) 5.04KB 1.72KB
auth (createAuthClient.js) 40.21KB 10.79KB
auth (createAuthenticatedFetch.js) 6.34KB 2.43KB
auth (index.js) 2.71KB 1.22KB
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.02KB 0.88KB
auth (useIsWorkspaceAdmin.js) 1.61KB 0.85KB
collaboration (CommentThread.js) 26.07KB 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.65KB 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) 503.18KB 112.56KB
core (index.js) 4.11KB 1.62KB
create-plugin (index.js) 10.08KB 3.26KB
data-objectstack (index.js) 159.03KB 44.08KB
fields (index.js) 237.74KB 59.60KB
i18n (LocalizationContext.js) 1.76KB 0.96KB
i18n (currency.js) 1.22KB 0.64KB
i18n (i18n.js) 4.28KB 1.75KB
i18n (index.js) 3.35KB 1.38KB
i18n (pickLocalized.js) 3.69KB 1.73KB
i18n (provider.js) 23.12KB 7.62KB
i18n (useDisplayLocale.js) 2.84KB 1.45KB
i18n (useObjectLabel.js) 27.59KB 6.63KB
i18n (useSafeTranslation.js) 7.77KB 3.13KB
layout (index.js) 39.16KB 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.74KB
mobile (index.js) 1.50KB 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.71KB 0.42KB
mobile (useResponsiveConfig.js) 1.36KB 0.63KB
mobile (useSpecGesture.js) 4.32KB 1.64KB
mobile (useTouchTarget.js) 1.01KB 0.54KB
permissions (MePermissionsProvider.js) 9.35KB 3.31KB
permissions (PermissionContext.js) 0.31KB 0.25KB
permissions (PermissionGuard.js) 0.89KB 0.45KB
permissions (PermissionProvider.js) 4.42KB 1.42KB
permissions (evaluator.js) 5.12KB 1.74KB
permissions (index.js) 0.91KB 0.41KB
permissions (store.js) 0.91KB 0.42KB
permissions (useFieldPermissions.js) 1.28KB 0.52KB
permissions (usePermissions.js) 1.81KB 0.83KB
plugin-ai (index.js) 15.75KB 3.80KB
plugin-calendar (index.js) 46.62KB 12.83KB
plugin-charts (index.js) 64.75KB 18.37KB
plugin-chatbot (index.js) 181.21KB 43.14KB
plugin-dashboard (index.js) 127.85KB 32.73KB
plugin-designer (index.js) 212.39KB 42.83KB
plugin-detail (index.js) 241.46KB 60.56KB
plugin-editor (index.js) 2.46KB 1.10KB
plugin-form (index.js) 123.77KB 30.07KB
plugin-gantt (index.js) 164.10KB 39.87KB
plugin-grid (index.js) 198.05KB 53.21KB
plugin-kanban (index.js) 52.72KB 14.54KB
plugin-list (index.js) 111.39KB 27.03KB
plugin-map (index.js) 20.02KB 6.58KB
plugin-markdown (index.js) 13.72KB 4.69KB
plugin-report (index.js) 41.97KB 11.33KB
plugin-timeline (index.js) 26.68KB 7.66KB
plugin-tree (index.js) 8.50KB 2.88KB
plugin-view (index.js) 83.81KB 20.49KB
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.44KB 0.22KB
providers (types.js) 0.01KB 0.04KB
react-runtime (index.js) 5.62KB 2.34KB
react (LazyPluginLoader.js) 3.77KB 1.33KB
react (SchemaRenderer.js) 31.55KB 10.70KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 1.28KB 0.68KB
react (schema-input.js) 1.45KB 0.83KB
react (spec-input.js) 0.20KB 0.18KB
sdui-parser (codegen.js) 5.41KB 2.34KB
sdui-parser (index.js) 4.77KB 2.16KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (parse.js) 10.76KB 3.17KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.29KB 0.24KB
sdui-parser (validate.js) 6.92KB 2.40KB
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) 0.20KB 0.18KB
types (crud.js) 0.20KB 0.18KB
types (dashboard-filter-alias.js) 6.23KB 2.74KB
types (data-display.js) 0.20KB 0.18KB
types (data-protocol.js) 0.20KB 0.19KB
types (data.js) 0.20KB 0.18KB
types (designer.js) 1.87KB 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-retry.js) 4.32KB 2.02KB
types (index.js) 3.05KB 1.52KB
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 (system-fields.js) 3.33KB 1.54KB
types (theme.js) 0.20KB 0.18KB
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

@os-steve
os-steve marked this pull request as ready for review August 18, 2026 10:52
@os-steve
os-steve added this pull request to the merge queue Aug 18, 2026
Merged via the queue into main with commit a2a9747 Aug 18, 2026
22 checks passed
@os-steve
os-steve deleted the claude/issue-5099-validation-rules-contract branch August 18, 2026 10:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

2 participants