Skip to content

fix(nav): 导航侧最后 4 处生产端直发规范 metadata 路由,不再绕已废弃的 component/metadata 别名 (#3660) - #3668

Merged
yinlianghui merged 2 commits into
mainfrom
claude/issue-3660-nav-alias-producers
Aug 7, 2026
Merged

fix(nav): 导航侧最后 4 处生产端直发规范 metadata 路由,不再绕已废弃的 component/metadata 别名 (#3660)#3668
yinlianghui merged 2 commits into
mainfrom
claude/issue-3660-nav-alias-producers

Conversation

@yinlianghui

@yinlianghuiyinlianghui commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Fixes#3660
Fixes#3666

前置复核(先证实,再动手)

派发单要求实测 PR #3658(修 #3639)已落 main —— 本 PR 的"单跳"断言依赖它的落地形态。已证实:

7883c0250 fix(console): host redirects emit the canonical metadata routes, not the deprecated alias (#3639) (#3658)

issue 正文的 4 个行号在 origin/main(dae1ac41e)上逐条命中,前提成立。规范落点按 LegacyMetadataRedirect(packages/app-shell/src/console/AppContent.tsx:963-982)的翻译逻辑推出,并实测确认两条规范路由在两个分支都已声明:零应用分支 :639/:641,有应用分支 :752-758(嵌套 metadata + index/:type)。

改了什么(4 处前后对照)

#位置改前(两跳)改后(一跳)
1apps/console/.../SystemHubPage.tsx "Metadata" 卡片${basePath}/component/metadata/directorymetadata${basePath}/metadata
2apps/console/.../SystemHubPage.tsx "Datasources" 卡片${basePath}/component/metadata/resource?type=datasourcemetadata/datasource${basePath}/metadata/datasource
3packages/app-shell/src/layout/AppSidebar.tsxsys-datasources/apps/setup/component/metadata/resource?type=datasource → 同上/apps/setup/metadata/datasource
4packages/app-shell/src/layout/UnifiedSidebar.tsxsys-datasources同 3同 3

落点与旧的两跳逐字节等价,这是对齐 LegacyMetadataRedirect 得到的,不是巧合:

  • directory 臂构造 ${appBase}/metadata + search + hash;resource 臂构造 ${appBase}/metadata/${encodeURIComponent(type)} + path 尾巴 + hash。
  • 4 处生产端都没带 query/hash(除了别名自己消费掉的 ?type=),且 datasourceencodeURIComponent 是自身,所以旧链路落的就是现在这两个 URL。
  • 这一等价性专门写了一条 MEASUREMENT 用例钉住,免得下一个读者以为是没测。

别名路由声明(console/AppContent.tsx 两个分支各 2 条)⛔ 一行未动 —— 书签/外链仍需要它(与 #3639 裁决第 3 条一致)。

钉翻转(派发单第 2 条)

packages/app-shell/src/layout/__tests__/systemNavSettingsTarget.test.tsxADMINISTRATION_ENTRIES 钉住了 Datasources 的旧形态。照 #3609 的纪律替换而非并存:该行改写为新的 DATASOURCES_TARGET 常量,旧拼法不保留,文件头补了一节说明为什么翻转。仓库钉的是修复,不是同时钉 bug 和修复。

顺带补上一个此前无人钉的半边:AppSidebarUnifiedSidebar 各持一份 sys-datasources 字面量,而只有 UnifiedSidebar 的进了 ADMINISTRATION_ENTRIESAppSidebar 那份可以退回别名而全仓测试仍绿。现已在同文件的 AppSidebar 用例里补断言。

生产端枚举(派发单第 5 条)

全仓 grep component/metadata 后按类别分:

类别位置处置
生产端上表 4 处✅ 全改,无第 5 处
路由声明(接收)console/AppContent.tsx:659-660:788-789不动(裁决 3)
测试钉/stubAppContent.noAppComponentRoutes / pseudoRouteSegments / legacyRedirects / 本 PR 新增不动
注释componentRegistry.ts:28ResourceRouter.tsx:63不动(与本单无关)
changeset 历史.changeset/*.md 三份不动(历史记录)
构建产物packages/app-shell/dist/非源码

本 PR 之后,仓内已无任何生产端生成 component/metadata URL。

#3666 并入说明(PM 裁决 A,范围扩至三处)

第二个提交 bd04651ee 修掉本分支第一个提交自己制造的三段失效 docblock —— 它们都以现在时断言"setup 左导航 Datasources 指向别名",而第一个提交刚把两个 sidebar 改成直指规范拼法。

#位置改前(#3668 首个提交后为假)改后
1views/metadata-admin/datasource/register.ts:11-14「The setup left-nav "Datasources" item still points at the older …/component/metadata/resource?type=datasource spelling. That is a legacy alias…」「The setup left-nav "Datasources" item names that engine route directly (objectui#3660). The older alias spellings AppContent still declares are redirects onto it rather than routes of their own — kept so bookmarks and external links keep resolving — but no navigation in this repo is routed through them any more.」
2views/metadata-admin/datasource/DatasourceResourcePage.tsx:8-12Two legacy spellings still arrive here…: the setup left-nav "Datasources" item points at…/component/metadata/resource?type=datasource…,and the console host forwards …/system/metadata/datasource「The setup left-nav "Datasources" item names that engine route directly (objectui#3660). Two legacy spellings still arrive here as well…: the console host forwards …/system/metadata/datasource…,and the older aliases AppContent declares for bookmarks and external links are rewritten by LegacyMetadataRedirect.」
3console/AppContent.tsx:649-658「Declaring them here is what makes the zero-app console's own fallback navigation work: sys-datasourcespoints straight at…/component/metadata/resource?type=datasource…。Kept as a mirror rather than re-pointed navigation because…」「…is what stopped the zero-app console rendering a blank screen: the fallback navigation then aimed sys-datasources at an alias…。#3610 mirrored the routes rather than re-point that navigation, because inventing a zero-app-only spelling would have given the alias a second canonical destination. #3660 re-pointed it anyway — at the shared metadata/:type routes above, so no second spelling was created — which leaves these two serving bookmarks and external links, the arrivals that can never be re-pointed.」

三点交代:

  1. 措辞遵 docs(scripts): 按真实机制改写两处 Lychee 门禁描述,并删掉 judgeHref 重复注释 (#3587) (#3648) #3656 的规矩:没有一处写成「不再指向 …/component/metadata/resource?type=datasource」这种把失真特征词原样种回注释的正面否认句 —— 那会让 grep 停在原来的命中数上,正是改写要清掉的东西。全部改成正面陈述。可证伪的测量:该字面量在这三个文件中的出现数 3 → 0(git grep6ca05d476 计 3,现 0 hits)。
  2. console/AppContent.tsx 是纯注释改动 —— PM 解除的 ⛔ 仅限注释,故两条别名路由声明及该文件其余每一行代码一字未动(见该文件 diff:改动全部落在 {/* ... */} 块内)。
  3. console: 零应用下 sys-objects / sys-datasources 落到 /apps/setup/component/... 渲染空白屏——无-activeApp 分支既无 component/* 路由也无 catch-all #3610 的历史是延伸而非抹去:console: 零应用下 sys-objects / sys-datasources 落到 /apps/setup/component/... 渲染空白屏——无-activeApp 分支既无 component/* 路由也无 catch-all #3610 当初拒绝改导航,理由是"零应用专用拼法会给别名造出第二个规范落点";导航仍有 4 处生产端在生成已废弃的 component/metadata 别名(SystemHub 两张卡片 + 两个 sidebar),各多绕一跳 #3660 改的是两个分支共享metadata/:type,没有造出第二个拼法 —— 所以那条理由今天依然成立,注释如实保留了它。

测试

新增两个文件,都用 PR #3658ChainRecorder 手法 —— 记录路由每一次停靠位置,断言针对整条链而非只有终点。只看终点无法区分一跳与两跳(都以 metadata/datasource 收尾),而一跳与否恰是本单的全部内容。

  • apps/console/src/pages/system/__tests__/SystemHubPage.metadataCards.test.tsx(4 例)—— 挂载真实的SystemHubPage,真点卡片,不转抄 href 列表(转抄正是别名拼法能活这么久的原因)。
  • packages/app-shell/src/layout/__tests__/systemNavDatasourcesHop.test.tsx(3 例)—— 从真实 sidebar 渲染里读出 href,再喂进同时声明规范路由与别名路由的探针表。两个 sidebar 各驱动一次。
Test Files 2 passed (2) — 新增两文件
Tests 7 passed (7)

一处方法论交代:别名镜像的承重范围

systemNavDatasourcesHop.test.tsx 里的 AliasResourceRedirectLegacyMetadataRedirect resource 臂的镜像。该文件断言的绿,不依赖这个镜像是否忠实 —— 绿的判据是 chain 等于 [规范 URL],当且仅当 sidebar 的 URL 直接命中规范路由时成立。镜像只决定失败长什么样:有它,回退任一字面量会得到"两条目、第一条是别名"的链,即那一跳被直接打印出来而非仅被暗示。真别名路由自身的行为另有真路由表的钉(AppContent.noAppComponentRoutes.test.tsx)。这一点写进了文件头,没有含糊过去。

逆向验证(先预测,后运行)

预测:只回退 4 处生产端字面量(注释与测试不动),读取生产端 URL 的断言转红且 diff 打印别名;但三条刻意设置的 CONTROL 必须保持绿 —— 它们都不读被改的生产端。预测具体分布:hub 套件 3/4 红、hop 套件 2/3 红、钉套件 2/3 红,合计 7 红 3 绿

实跑结果与预测完全一致:

 × AppSidebar: the no-active-app fallback cluster heads at the system hub
× UnifiedSidebar: /home renders the Administration cluster as a GROUP, with all nine entries reachable (objectui#3609)
× the "Metadata" card reaches the metadata directory in ONE hop
× the "Datasources" card reaches metadata/datasource in ONE hop
× MEASUREMENT: both endpoints are byte-identical to what the alias hop produced
× AppSidebar: the zero-app fallback cluster arrives with NO redirect
× UnifiedSidebar: the /home Administration cluster arrives with NO redirect
Test Files 3 failed (3)
Tests 7 failed | 3 passed (10)

每条 diff 都直接打印别名:

- "/apps/setup/metadata",
+ "/apps/setup/component/metadata/directory",
- "/apps/setup/metadata/datasource",
+ "/apps/setup/component/metadata/resource?type=datasource",

保持绿的 3 条正是三条 CONTROL:Applications 卡片(未改的兄弟项)、"别名仍可解析且仍要付那一跳"、非管理员看不到 Administration 集群。方向无反转。

其余门禁

首个提交(4 处生产端 + 测试 + changeset):

pnpm vitest run --project "@object-ui/console" → 25 files / 223 tests passed
pnpm vitest run packages/app-shell → 294 files / 2584 passed, 1 skipped
pnpm --filter @object-ui/console --filter @object-ui/app-shell type-check → Done / Done
pnpm --filter @object-ui/console lint → 0 errors(190 条既有 warning)
pnpm --filter @object-ui/app-shell lint → 0 errors(2205 条既有 warning)
node scripts/check-control-bytes.mjs → OK(3666 个文本文件)

第二个提交(bd04651ee,纯注释)复跑:

pnpm --filter @object-ui/app-shell type-check → Done(JSX 注释块改写不破坏解析)
pnpm vitest run packages/app-shell/src/{console,layout}/__tests__ + views/metadata-admin
→ 148 files / 1321 passed, 1 skipped
node scripts/check-control-bytes.mjs → OK(3669 个文本文件)
grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f]' 三个改动文件 → 无命中

两个 lint 的 warning 数与 PR #3658 报告的基线逐字相同,本 PR 未新增。新 worktree 已先跑依赖构建(pnpm --filter '@object-ui/app-shell^...' build 等)再跑测试,避免 AGENTS.md §9 陈旧产物陷阱的镜像。

changeset

写了,patch@object-ui/console@object-ui/app-shell 都在 39 包 fixed 组内,ignore 只有 @object-ui/example-*@object-ui/site,故需要。用户可见变化:导航直达,少一跳。第二个提交纯注释,不另加 changeset。


🤖 Generated with Claude Code

https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt

… the deprecated alias (#3660)
The System hub's "Metadata" and "Datasources" cards, and the `sys-datasources`
entry in both AppSidebar and UnifiedSidebar, aimed at
`component/metadata/{directory,resource?type=datasource}`. app-shell declares
those spellings as legacy aliases whose route element is
`LegacyMetadataRedirect` — a bare Navigate onto `metadata` and
`metadata/datasource`. Each click paid a redundant hop plus a re-render.
All four now name the destination directly. Endpoints are byte-identical to
what the alias hop computed; only the intermediate hop is gone. The alias
routes are untouched and stay reachable for bookmarks and external links.
Completes #3639, which fixed the console host's two redirects and enumerated
these four as the remainder.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@vercel

vercelBot commented Aug 7, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectuiIgnoredIgnoredAug 7, 2026 6:26pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.1 KB350 KB
Entry fileindex-C0OumOdD.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.66KB3.13KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)480.72KB105.64KB
core (index.js)2.96KB1.13KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)137.51KB35.11KB
fields (index.js)230.87KB56.83KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)26.14KB6.07KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.53KB10.71KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.98KB12.37KB
plugin-charts (index.js)61.04KB17.31KB
plugin-chatbot (index.js)180.09KB42.72KB
plugin-dashboard (index.js)115.50KB29.96KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)232.79KB57.42KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)112.10KB27.10KB
plugin-gantt (index.js)162.55KB39.57KB
plugin-grid (index.js)186.61KB49.34KB
plugin-kanban (index.js)48.30KB13.28KB
plugin-list (index.js)105.12KB25.48KB
plugin-map (index.js)16.81KB5.24KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)25.76KB7.33KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)19.28KB6.38KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.02KB0.55KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

The two sidebars' `sys-datasources` entry now names the canonical
`…/metadata/datasource` route, so three comments claiming the setup left-nav
points at the legacy alias became false as of the previous commit.
Rewritten as positive statements of what is true now. Per #3656, none of them
re-plants the alias URL in a denial sentence — a comment that says "no longer
points at X" keeps a grep for X returning the very hit the rewrite was meant
to clear.
`console/AppContent.tsx` is a comment-only change: the two alias route
declarations, and every other line of code, are untouched. Its #3610 history
is preserved and extended rather than replaced — #3610 declined to re-point
the navigation because a zero-app-only spelling would have given the alias a
second canonical destination, and #3660 re-pointed it at the shared route, so
that reasoning still holds.
Fixes#3666
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GTRjn8xBqp75dk7kFupVRt
@github-actions

Copy link
Copy Markdown
Contributor

✅ Console Performance Budget

MetricValueBudget
Main entry (gzip)28.1 KB350 KB
Entry fileindex-C0OumOdD.js
StatusPASS

📦 Bundle Size Report

PackageSizeGzipped
app-shell (index.js)8.66KB3.13KB
app-shell (runtime-config.js)7.42KB2.32KB
app-shell (types.js)0.01KB0.04KB
app-shell (urlParams.js)7.57KB2.97KB
auth (AuthContext.js)0.31KB0.24KB
auth (AuthGuard.js)1.17KB0.53KB
auth (AuthProvider.js)22.10KB4.37KB
auth (AuthShell.js)3.49KB1.40KB
auth (ForgotPasswordForm.js)12.21KB3.45KB
auth (LoginForm.js)18.13KB5.39KB
auth (PreviewBanner.js)0.90KB0.50KB
auth (RegisterForm.js)6.64KB2.21KB
auth (SocialSignInButtons.js)9.60KB3.89KB
auth (UserMenu.js)3.40KB1.22KB
auth (auth-gate-events.js)1.29KB0.66KB
auth (authStyles.js)5.04KB1.72KB
auth (createAuthClient.js)35.76KB9.11KB
auth (createAuthenticatedFetch.js)4.37KB1.69KB
auth (index.js)2.35KB1.07KB
auth (org-roles.js)6.66KB2.78KB
auth (phone-identifier.js)1.11KB0.66KB
auth (types.js)0.59KB0.35KB
auth (useAuth.js)4.91KB0.87KB
auth (useIsWorkspaceAdmin.js)1.61KB0.85KB
collaboration (CommentThread.js)26.07KB7.56KB
collaboration (LiveCursors.js)3.17KB1.27KB
collaboration (PresenceAvatars.js)6.49KB2.64KB
collaboration (PresenceProvider.js)2.79KB1.13KB
collaboration (index.js)1.65KB0.73KB
collaboration (useCollaborationTranslation.js)6.05KB2.52KB
collaboration (useCommentSearch.js)1.98KB0.88KB
collaboration (useConflictResolution.js)7.75KB1.86KB
collaboration (useMentionNotifications.js)1.81KB0.68KB
collaboration (usePresence.js)6.33KB1.84KB
collaboration (useRealtimeSubscription.js)7.91KB2.01KB
components (index.js)480.72KB105.64KB
core (index.js)2.96KB1.13KB
create-plugin (index.js)9.28KB2.98KB
data-objectstack (index.js)137.51KB35.11KB
fields (index.js)230.87KB56.83KB
i18n (LocalizationContext.js)1.76KB0.96KB
i18n (currency.js)1.22KB0.64KB
i18n (i18n.js)4.32KB1.77KB
i18n (index.js)2.65KB1.06KB
i18n (pickLocalized.js)1.70KB0.83KB
i18n (provider.js)9.48KB3.27KB
i18n (useObjectLabel.js)26.14KB6.07KB
i18n (useSafeTranslation.js)4.52KB1.96KB
layout (index.js)38.53KB10.71KB
mobile (MobileProvider.js)0.92KB0.49KB
mobile (ResponsiveContainer.js)0.94KB0.38KB
mobile (breakpoints.js)1.51KB0.70KB
mobile (createOfflineDataSource.js)5.61KB1.74KB
mobile (index.js)1.50KB0.62KB
mobile (offlineQueue.js)3.91KB1.35KB
mobile (pwa.js)0.97KB0.49KB
mobile (serviceWorker.js)1.48KB0.62KB
mobile (serviceWorkerSource.js)3.41KB1.48KB
mobile (useBreakpoint.js)1.54KB0.65KB
mobile (useGesture.js)6.96KB1.98KB
mobile (useOfflineSync.js)1.99KB0.72KB
mobile (usePullToRefresh.js)2.53KB0.85KB
mobile (useResponsive.js)0.71KB0.42KB
mobile (useResponsiveConfig.js)1.36KB0.63KB
mobile (useSpecGesture.js)4.32KB1.64KB
mobile (useTouchTarget.js)1.01KB0.54KB
permissions (MePermissionsProvider.js)8.75KB3.06KB
permissions (PermissionContext.js)0.31KB0.25KB
permissions (PermissionGuard.js)0.89KB0.45KB
permissions (PermissionProvider.js)3.67KB1.12KB
permissions (evaluator.js)4.41KB1.44KB
permissions (index.js)0.91KB0.41KB
permissions (store.js)0.91KB0.42KB
permissions (useFieldPermissions.js)1.28KB0.52KB
permissions (usePermissions.js)1.55KB0.71KB
plugin-ai (index.js)15.71KB3.79KB
plugin-calendar (index.js)44.98KB12.37KB
plugin-charts (index.js)61.04KB17.31KB
plugin-chatbot (index.js)180.09KB42.72KB
plugin-dashboard (index.js)115.50KB29.96KB
plugin-designer (index.js)210.51KB42.51KB
plugin-detail (index.js)232.79KB57.42KB
plugin-editor (index.js)2.46KB1.10KB
plugin-form (index.js)112.10KB27.10KB
plugin-gantt (index.js)162.55KB39.57KB
plugin-grid (index.js)186.61KB49.34KB
plugin-kanban (index.js)48.30KB13.28KB
plugin-list (index.js)105.12KB25.48KB
plugin-map (index.js)16.81KB5.24KB
plugin-markdown (index.js)13.72KB4.69KB
plugin-report (index.js)40.58KB10.58KB
plugin-timeline (index.js)25.76KB7.33KB
plugin-tree (index.js)8.50KB2.88KB
plugin-view (index.js)84.03KB20.55KB
providers (DataSourceProvider.js)0.75KB0.39KB
providers (MetadataProvider.js)1.37KB0.59KB
providers (ThemeProvider.js)1.90KB0.85KB
providers (UploadProvider.js)11.71KB3.53KB
providers (index.js)0.44KB0.22KB
providers (types.js)0.01KB0.04KB
react-runtime (index.js)5.67KB2.37KB
react (LazyPluginLoader.js)3.77KB1.33KB
react (SchemaRenderer.js)19.28KB6.38KB
react (data-invalidation.js)5.05KB2.08KB
react (index.js)1.02KB0.55KB
react (spec-input.js)0.20KB0.18KB
sdui-parser (codegen.js)4.09KB1.74KB
sdui-parser (index.js)4.47KB2.03KB
sdui-parser (parse.js)10.04KB2.82KB
sdui-parser (types.js)0.29KB0.24KB
sdui-parser (validate.js)4.69KB1.48KB
types (ai.js)0.20KB0.17KB
types (api-types.js)0.20KB0.18KB
types (app.js)2.87KB0.99KB
types (base.js)0.20KB0.18KB
types (blocks.js)0.20KB0.18KB
types (complex.js)0.20KB0.18KB
types (crud.js)0.20KB0.18KB
types (data-display.js)0.20KB0.18KB
types (data-protocol.js)0.20KB0.19KB
types (data.js)0.20KB0.18KB
types (designer.js)1.87KB0.85KB
types (disclosure.js)0.20KB0.18KB
types (error-code.js)1.54KB0.88KB
types (feedback.js)0.20KB0.18KB
types (field-types.js)0.20KB0.18KB
types (form.js)0.20KB0.18KB
types (http-retry.js)4.32KB2.02KB
types (index.js)2.71KB1.34KB
types (layout.js)0.20KB0.18KB
types (managed-by.js)0.19KB0.18KB
types (mobile.js)2.59KB1.31KB
types (navigation.js)0.20KB0.18KB
types (objectql.js)0.20KB0.18KB
types (overlay.js)0.20KB0.18KB
types (permissions.js)0.20KB0.18KB
types (plugin-scope.js)0.20KB0.18KB
types (record-components.js)0.20KB0.19KB
types (record-semantics.js)1.28KB0.67KB
types (registry.js)0.20KB0.18KB
types (reports.js)0.20KB0.18KB
types (spec-report.js)5.05KB1.93KB
types (system-fields.js)3.33KB1.54KB
types (theme.js)0.20KB0.18KB
types (ui-action.js)3.40KB1.71KB
types (views.js)0.20KB0.18KB
types (widget.js)0.20KB0.18KB

Size Limits

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

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

2 participants

@yinlianghui@claude