Skip to content

fix(devx): pin tsBuildInfoFile outside the published dist in every composite package - #9328

Merged
baozhoutao merged 2 commits into
mainfrom
claude/9189-tsbuildinfo-outside-published-dist
Sep 13, 2026
Merged

fix(devx): pin tsBuildInfoFile outside the published dist in every composite package#9328
baozhoutao merged 2 commits into
mainfrom
claude/9189-tsbuildinfo-outside-published-dist

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #9189

The defect

composite implies incremental, so every composite project writes a *.tsbuildinfo. Where it lands is derived, not declared: with an outDir and no rootDir, TypeScript puts the record at outDir/CONFIGNAME.tsbuildinfo — inside dist, which files: ["dist", ...] publishes whole. pnpm check:published-dist refuses a record there (objectui#7003), so the gate's verdict came to depend on when it ran: green before anything invoked tsc, red after, on a byte-identical tree.

That is the card's sharpest sentence and triage promoted it to the basis of the ruling: ordering decides the verdict, and nothing announces it.

Two premises measured FALSE — please read this before judging the diff size

Both rulings are implemented as written. But the reasons given for them did not survive measurement, and one of them changes what the fix has to be.

1. The population is 18, not 2 — and the discriminator is rootDir, not the build tool.

The card and triage both explain the two visible packages as "the two whose build is vite build rather than tsc, leaving dist otherwise free of tsc output", with the others hidden by "coincidental masking". Measured with TypeScript's own getTsBuildInfoEmitOutputFilePath at c64975e9f: 18 of this repository's 32 incremental projects derived their record into dist. The 12 correct ones are correct because they carry rootDir: "src", which rebases the derived path back out of outDir. Nothing is masking anything — the other 16 simply had not been type-checked in that tree.

Reproduced directly: running tsc --noEmit in @object-ui/plugin-charts, a package the card never mentions, reds the same gate.

@object-ui/components     [tooling-in-published-output]  packages/components/dist/tsconfig.tsbuildinfo
@object-ui/plugin-charts  [tooling-in-published-output]  packages/plugin-charts/dist/tsconfig.tsbuildinfo

This strengthens the scope ruling rather than weakening it. packages/components/tsconfig.json states in its own comment that rootDir was removed there for an unrelated reason — and that removal is exactly what moved its record into the published directory. So the 12 "already correct" packages are one unrelated edit away from joining the 18. Pinning all 30 is what makes the location a decision instead of a side effect.

2. The shared base tsconfig cannot carry this setting.

The ruling preferred a shared base if one exists. Package tsconfigs extend the root tsconfig.json, so I measured it: TypeScript resolves a relative tsBuildInfoFile against the config that declares it, not the one that inherits it. One line in the root config collapses all 30 packages onto a single repo-root tsconfig.tsbuildinfo — every package overwriting every other package's incremental record.

packages/app-shell/tsconfig.json   -> tsconfig.tsbuildinfo
packages/auth/tsconfig.json        -> tsconfig.tsbuildinfo
packages/components/tsconfig.json  -> tsconfig.tsbuildinfo     (all 30 identical)

So the ruling's stated fallback — "one line per package is an acceptable landing" — is not a shortcut here; it is the only spelling that gives each package its own record. (tsconfig.base.json exists but no package tsconfig extends it, which is worth knowing separately.)

What changed

  • 30 packages/*/tsconfig.json"tsBuildInfoFile": "./tsconfig.tsbuildinfo", one line plus the shared note. For the 12 that already landed there via rootDir, this is a no-op in effect and pure explicitness; their derived paths are byte-identical before and after.
  • 2 clean scripts (data-objectstack, plugin-designer) — now rm -rf dist tsconfig.tsbuildinfo, matching the five packages that already spell it that way. Without this, moving the record out of dist would leave rm -rf dist deleting the outputs while keeping the record that says they exist — the objectui#6703 desync, re-opened by this very change.
  • 1 pin testscripts/__tests__/tsbuildinfo-outside-published-dist-9189.test.ts. It asks TypeScript where each record goes rather than grepping for the option, because a presence-grep would pass on a value still pointing into dist and red on a project that is correct via rootDir. BUILD_OUTPUT_DIRS is imported from the gate rather than re-spelled.
  • 1 changeset, empty frontmatter — nothing published moves. tsconfig.json is not in any package's files list, and check-changeset-presence.mjs independently reports 0 of them published source.

Not a tsconfig refactor: no other option moved, no config was restructured. This belongs to objectui#7212's population and does not attempt to solve it.

The card's probe, run in order, exit codes captured before any pipe

# BEFORE the fix
rm -f packages/components/dist/tsconfig.tsbuildinfo
pnpm run check:published-dist                        EXIT=0   green
pnpm --filter @object-ui/components exec tsc --noEmit -p tsconfig.json
pnpm run check:published-dist                        EXIT=1   RED  <- reproduced

# AFTER the fix
rm -f packages/components/dist/tsconfig.tsbuildinfo
pnpm run check:published-dist                        EXIT=0   green
pnpm exec turbo run type-check                       EXIT=0   all 81 tasks, all 30 packages
pnpm run check:published-dist                        EXIT=0   STILL GREEN

The post-fix run is deliberately stronger than the card's: instead of type-checking one package, it type-checks every package, then asks the gate. Records inside any dist afterwards: 0.

The tarball is unchanged. 6013 tarball file(s), 5857 of them build output, 0 tooling artifact(s) on the pre-fix green run and identically on the post-fix green run; the red run in between differed by exactly the two records (6015 / 5859 / 2).

Control — preserved

@object-ui/core, @object-ui/react and @object-ui/fields carry no record in dist today and sprout nothing new:

package before after a full repo type-check
@object-ui/core packages/core/tsconfig.tsbuildinfo packages/core/tsconfig.tsbuildinfo (unchanged)
@object-ui/react packages/react/tsconfig.tsbuildinfo packages/react/tsconfig.tsbuildinfo (unchanged)
@object-ui/fields none none — its tsconfig.json is not composite at all

New location, confirmed by re-running the gate

Every record now lands at packages/PKG/tsconfig.tsbuildinfo. The proof is the gate, not the path: the post-fix run above was made with all 31 records present on disk and reported 0 tooling artifact(s) in build output and no src-tier line — that second channel is how this gate reports a build record shipping from outside a build output directory, so its silence is the positive statement that the new home ships nowhere.

Not committable at its new home

git check-ignore --verbose on all 31 records on disk: 31 of 31 ignored, by .gitignore:36:*.tsbuildinfo. Positive control: git check-ignore packages/components/tsconfig.json exits 1, so the check can distinguish. git status --porcelain shows 0 records.

A pre-existing tree carries a stale record at the old path; measured, the next vite build empties dist and takes it, so there is no migration step.

Ablation — the pin test can fail

Removing the pin from packages/plugin-detail/tsconfig.json on disk (mutation proved landed: occurrences 1 to 0, blob 7bfdd4e2 to 4c56da45) turns it red naming the right file, and restoring via git checkout HEAD -- ... returns the blob to 7bfdd4e2 with git diff HEAD empty:

AssertionError: expected [ Array(1) ] to deeply equal []
+ [ "packages/plugin-detail/tsconfig.json -> packages/plugin-detail/dist/tsconfig.tsbuildinfo" ]

Gates run, with exit codes

command exit note
pnpm exec turbo run build 0 43/43 tasks
pnpm exec turbo run type-check 0 81/81 tasks — every package whose tsconfig moved
pnpm run type-check:scripts 0 the separate scripts/ project; --listFiles confirms the new test is in its program
pnpm run check:published-dist 0 the card's gate, after a full type-check
pnpm run check:published-tsconfig-exclude 0
pnpm run check:dist-completeness 0 12 complete, 2 type-check-only
pnpm run check:control-bytes 0
pnpm run check:test-path-roots 0
pnpm run check:new-line-citations 0
pnpm run check:self-import 0
pnpm run check:phantom-deps 0
check-changeset-presence / -no-major / check:changeset-claims 0
check-governed-queue-guard --test NOT GOVERNED, 34 paths checked
pnpm exec vitest run scripts/ 0 151 files, 4489 tests
pnpm exec vitest run (5 affected packages) 0 714 files, 9463 tests
pnpm exec eslint --no-inline-config (34 changed files) 0 eslint's own verdict: 1 file linted, 33 it ignores; no type-aware linting is configured, so the diff cannot move any untouched file's result

Repo-wide pnpm test and pnpm lint are declared to CI.

🤖 Generated with Claude Code

https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr


Generated by Claude Code

…mposite package

`composite` implies `incremental`, so every composite project writes a
`*.tsbuildinfo`. Where it lands is DERIVED, not declared: with an `outDir` and
no `rootDir`, TypeScript puts the record at `outDir/<configname>.tsbuildinfo` —
inside `dist`, which `files: ["dist", …]` publishes whole. `check:published-dist`
refuses a record there (objectui#7003), so its verdict came to depend on WHEN it
ran: green before anything invoked `tsc`, red after, on a byte-identical tree.

Measured at c64975e with TypeScript's own `getTsBuildInfoEmitOutputFilePath`:
18 of this repository's 32 incremental projects derived their record into `dist`,
not the 2 the report named. The discriminator is `rootDir`, not the build tool —
the 12 correct ones carry `rootDir: "src"`, which rebases the derived path back
out of `outDir`, and `packages/components/tsconfig.json` records in its own
comment that `rootDir` was removed there for an unrelated reason.

Every composite package now pins the record to its own package root, so the
location is a decision rather than a side effect of an unrelated option. A
shared setting in the base config was measured and rejected: TypeScript resolves
a relative `tsBuildInfoFile` against the config that DECLARES it, so one line in
`tsconfig.json` collapses all 30 packages onto a single repo-root record.

`clean` in `data-objectstack` and `plugin-designer` now removes the relocated
record too, matching the five packages that already spell it that way — without
it, `rm -rf dist` would leave a record describing files that no longer exist
(objectui#6703).

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3116.3 KB 3134.8 KB
Main entry chunk (gzip) 144.4 KB 350 KB
Entry file index-Dnp7foTL.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) 16.69KB 6.21KB
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) 11.08KB 4.58KB
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) 502.06KB 115.19KB
core (index.js) 8.52KB 3.41KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 211.58KB 58.68KB
fields (index.js) 247.91KB 62.51KB
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) 8.87KB 3.64KB
i18n (index.js) 5.21KB 2.26KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 32.15KB 10.49KB
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.95KB
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) 13.52KB 4.88KB
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) 8.39KB 3.10KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 49.04KB 13.93KB
plugin-charts (index.js) 71.52KB 19.98KB
plugin-chatbot (index.js) 195.35KB 46.52KB
plugin-dashboard (index.js) 131.24KB 34.61KB
plugin-designer (index.js) 215.95KB 44.33KB
plugin-detail (index.js) 253.51KB 65.88KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.79KB 34.19KB
plugin-gantt (index.js) 166.95KB 41.04KB
plugin-grid (index.js) 211.60KB 57.48KB
plugin-kanban (index.js) 46.00KB 14.30KB
plugin-list (index.js) 112.59KB 27.66KB
plugin-map (index.js) 20.43KB 6.81KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 9.55KB 3.32KB
plugin-view (index.js) 84.43KB 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) 94.03KB 31.02KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
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.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
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 (strict-authoring-face.js) 14.27KB 5.47KB
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

Base merge only, to clear `mergeable_state: behind`. No conflict: objectui#9320
/ #9321 / #9322 touch no tsconfig and no file this branch changes.

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

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

Metric Value Budget
Eager closure (gzip, 52 chunks) 3116.3 KB 3134.8 KB
Main entry chunk (gzip) 144.4 KB 350 KB
Entry file index-Dnp7foTL.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) 16.69KB 6.21KB
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) 11.08KB 4.58KB
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) 502.06KB 115.19KB
core (index.js) 8.52KB 3.41KB
create-plugin (index.js) 27.94KB 9.51KB
data-objectstack (index.js) 211.58KB 58.68KB
fields (index.js) 247.91KB 62.51KB
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) 8.87KB 3.64KB
i18n (index.js) 5.21KB 2.26KB
i18n (pickLocalized.js) 7.62KB 3.26KB
i18n (provider.js) 32.15KB 10.49KB
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.95KB
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) 13.52KB 4.88KB
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) 8.39KB 3.10KB
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) 14.81KB 3.63KB
plugin-calendar (index.js) 49.04KB 13.93KB
plugin-charts (index.js) 71.52KB 19.98KB
plugin-chatbot (index.js) 195.35KB 46.52KB
plugin-dashboard (index.js) 131.24KB 34.61KB
plugin-designer (index.js) 215.95KB 44.33KB
plugin-detail (index.js) 253.51KB 65.88KB
plugin-editor (index.js) 2.23KB 1.05KB
plugin-form (index.js) 136.79KB 34.19KB
plugin-gantt (index.js) 166.95KB 41.04KB
plugin-grid (index.js) 211.60KB 57.48KB
plugin-kanban (index.js) 46.00KB 14.30KB
plugin-list (index.js) 112.59KB 27.66KB
plugin-map (index.js) 20.43KB 6.81KB
plugin-markdown (index.js) 13.88KB 4.80KB
plugin-report (index.js) 43.42KB 11.93KB
plugin-timeline (index.js) 30.07KB 8.74KB
plugin-tree (index.js) 9.55KB 3.32KB
plugin-view (index.js) 84.43KB 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) 94.03KB 31.02KB
react (data-invalidation.js) 5.05KB 2.08KB
react (index.js) 4.63KB 2.18KB
react (schema-input.js) 4.25KB 2.04KB
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.66KB 2.50KB
sdui-parser (input-type.js) 2.84KB 1.40KB
sdui-parser (kanban-quick-add.js) 3.89KB 1.87KB
sdui-parser (parse.js) 25.28KB 7.80KB
sdui-parser (provenance.js) 3.66KB 1.82KB
sdui-parser (types.js) 0.28KB 0.23KB
sdui-parser (validate.js) 14.82KB 4.99KB
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 (strict-authoring-face.js) 14.27KB 5.47KB
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

@baozhoutao
baozhoutao marked this pull request as ready for review September 13, 2026 02:19
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 13, 2026
Merged via the queue into main with commit b2bb813 Sep 13, 2026
38 checks passed
@baozhoutao
baozhoutao deleted the claude/9189-tsbuildinfo-outside-published-dist branch September 13, 2026 02:37
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment