Repository navigation
Commit 7d9682f
test(plugin-view): fold six more ObjectView pins over stand-in child renderers onto the shared harness (#30900)
<!-- claude-projects-attribution: {"github_login":"os-tesla"} -->
_Requested by **Tesla** · [project
thread](https://claude.ai/code/project/chan_01AXsQkLFKRdQCqQ3RTr6Jao?thread=cmsg_01AXsQkLFKRdQCqQ3RTr6JaoPC4ctRn1a3NwUssAZhqxBe)_
Part of #29469
Clause-②: no
Metadata-protocol: none
## 维护者速读
- **改了什么**:视图组件 `ObjectView`(`plugin-view` 包)再有 6
个单卡测试文件并入上一片(#30872)建好的共享测试文件 `ObjectView.harness.test.tsx`,每个原文件变成一个顶层
`describe`,断言和标题一字未改;另有 3 个测试文件里点名这些文件的注释改成点名对应的块。
- **为什么改**:#29469 第三族 ObjectView 的第二片,也是这一族最后一个 PR(席位修订 2:每族最多两个
PR)。本地同机实测,这 6 个文件的 CPU 从约 36 秒降到并入后约 8 秒;没有并入的 ObjectView
测试(`plugin-view` 39 个、`app-shell` 87 个)按共享的 setup 列在正文末尾。
-
**风险与回滚**:只动测试文件,不改源码、门禁、CI,不发布任何东西;块之间串状态的风险用探针在原顺序和三种乱序下排除。`formTitleNoProviderFallback`
和 `createGrant-12082` 依赖 `ui/vitest.setup.i18n-global.ts` 每个测试后复原
react-i18next 全局实例:临时关掉那一步,这两块 7 个测试变红,恢复后全绿。回滚 = revert 本 PR。
- **先看**:`ObjectView.formTitleNoProviderFallback`
一块的文档注释(原来写着"必须单独成文件",现在说明为什么可以同文件),再看
`ObjectView.formTitleI18n.test.tsx` 改过的那段注释。
- **两分钟验证**:在 `ui/` 下跑 `pnpm exec vitest run
packages/plugin-view/src/__tests__/ObjectView.harness.test.tsx`,应见 1
个文件、119 个测试全过。
- **需要你做的**:无,席位落地。
- **席位意见**:ui 席 2 对照 head `f5053769` 的 diff 复核:10 个文件,6 个 ObjectView
单卡文件并入已有的 plugin-view 共享文件,另 3 个文件只改指向被并文件的注释(其一在 plugin-form,超出认领面但仅 1
行注释);断言与标题一字未改(`it(` 61=61、`expect(` 113=113),乱序三种种子全过;2,867 行未过 3,000
行线;CI 全绿,纯测试改动无发布面,不欠契约复审。未并入的 39 个 plugin-view 文件与 87 个 app-shell
文件已在正文列明。同意落地。
## What changes
Slice 3b, the second and last `ObjectView*` PR of the shared-setup
rollout (ruling 6583487846 on #29469; seat amendment 2, 6672694520: at
most two PRs per family). Six more pins in
`ui/packages/plugin-view/src/__tests__/` that render the real
`ObjectView` over the three-mock trio join
`ObjectView.harness.test.tsx`, which slice 3a (#30872) created:
- The three clean trio pins left after 3a: `tableColumnsForwarding`,
`strayGroupByLane-9242` and `canonicalTableKeys`. Then the three
smallest trio pins that pass every census check except that another file
names them: `createGrant-12082`, `calendarBinding-7029` and
`formTitleNoProviderFallback`.
- Each former file is a top-level `describe` named after its file stem,
with its docblock above it, appended after the nine 3a blocks. Its first
lines are `restoreAfterBlock()` and a `beforeEach` that installs its
three stand-ins, each copied verbatim from that file's mock factory;
everything else is moved verbatim, re-indented by two spaces. A
module-level `beforeEach` / `afterEach` of a former file is now the
block's own hook. The 6 files are deleted. The harness goes from 9 to 15
top-level `describe` blocks. No 3a block, and no line of the header, the
mocks or `restoreAfterBlock()`, changed.
- The import list gains one line: `MePermissionsProvider` and the type
`MePermissionsAuthenticatedResponse` from `@object-ui/permissions`,
which `createGrant-12082` used.
- **`formTitleNoProviderFallback` said it had to be its own file.** Its
docblock explained that a mounted `I18nProvider` installs
react-i18next's global instance and that this survives `cleanup()`, so a
provider-less render later in the same file would assert nothing. That
no longer holds: `ui/vitest.setup.i18n-global.ts` (objectui#4514) puts
back the pointer the file inherited after every test. The section is
rewritten to say so, and keeps the rule not to mount a provider in that
block. Measured both ways: the block runs after
`ObjectView.formLabelsI18nLabel-10993`, which mounts a zh provider, and
passes in declaration order and under three shuffled orders; with the
reset's `setI18n` call disabled for one throwaway run, 7 tests go red
(the 4 of `formTitleNoProviderFallback` and 3 of `createGrant-12082`,
whose `New` button label resolves through the same global), and the
other 112 stay green. The probe below also reads `getI18n()` as
`undefined` at every block's start.
**Comments that named a folded file** (amendment 2: test files are
updated, source files stay):
-
`ui/packages/plugin-view/src/__tests__/ObjectView.formTitleI18n.test.tsx`
named `ObjectView.formTitleNoProviderFallback.test.tsx` and why it lived
elsewhere; it now names the block and the setup file.
-
`ui/packages/plugin-view/src/__tests__/ObjectView.ganttBinding-7070.test.tsx`
named `ObjectView.calendarBinding-7029` as its sibling next door; it now
names the block.
- `ui/packages/plugin-form/src/affordanceGrantMap-12082.test.tsx` named
`ObjectView.createGrant-12082.test.tsx` as the opener's runtime pin; it
now names the block.
The two `ui/packages/app-shell/src/views/` files that name
`ObjectView.calendarBinding-7029` (`ObjectView.galleryBinding-7547`,
`ObjectView.ganttBinding-7070`) mean app-shell's own
`ObjectView.calendarBinding-7029.test.tsx`, which stays, so they are
unchanged. `git grep` of each of the 6 stems over `ui`, `scripts`,
`packages`, `content`, `apps` and `.github` finds no other hit outside
`CHANGELOG.md` history.
Test files only: no source file, no changeset (`skip-changeset`).
`@object-ui/plugin-view` and `@object-ui/plugin-form` build from their
entries with `vite build`, and no entry imports a test file.
## Tests
### Former file → describe (no title or assertion dropped)
TypeScript AST walk of each former file at `8b9cc712` (the `main` this
was cut from, where they still exist) against the `describe` of the same
name in the harness at this PR's head. An `it` is a call to `it` /
`test` (an `it.each(...)(...)` counts once); titles are the `describe >
it` paths under the block, compared as sorted lists.
| former file | it before | it after | expect( before | expect( after |
titles identical |
|---|--:|--:|--:|--:|:-:|
| `ObjectView.tableColumnsForwarding.test.tsx` | 14 | 14 | 21 | 21 | yes
|
| `ObjectView.strayGroupByLane-9242.test.tsx` | 9 | 9 | 21 | 21 | yes |
| `ObjectView.canonicalTableKeys.test.tsx` | 27 | 27 | 47 | 47 | yes |
| `ObjectView.createGrant-12082.test.tsx` | 4 | 4 | 4 | 4 | yes |
| `ObjectView.calendarBinding-7029.test.tsx` | 3 | 3 | 13 | 13 | yes |
| `ObjectView.formTitleNoProviderFallback.test.tsx` | 4 | 4 | 7 | 7 |
yes |
| **total** | 61 | 61 | 113 | 113 | yes |
The whole harness: 47 `it` / 97 `expect(` at `8b9cc712`, 108 / 210 at
this head (47 + 61, 97 + 113); no statement outside the blocks holds an
`it` or `expect(`. The 108 `it` calls run as 119 tests (`it.each` rows),
55 of them the 3a blocks.
The diff adds one import line and appends after the last 3a block
(`ObjectView.filterSources`); it removes no line of the harness.
### CPU before and after (local A/B, one machine)
**CI after: NOT MEASURED**: the per-file timings reporter (#29517)
uploads on `main`'s full-battery runs only. Its first after-reading is
the first full-battery `main` run after this merges.
Local A/B on one 4-vCPU container, under `os-verify-lock` (shared-box
seconds), same command both legs, from `ui/`: `pnpm exec vitest run
packages/plugin-view/src/__tests__/ObjectView. --maxWorkers=2` (every
`ObjectView.*` file in that directory, `ObjectView.test.tsx` included),
with a throwaway reporter summing each module's `diagnostic()`. Fixed =
environment + prepare + setup + collect (import). The "before" leg
writes the 6 files and the harness from `8b9cc712` into the branch's
tree, so both legs run the same 40 other files; run order before, after,
before, after.
| | files | tests passed | fixed CPU | test CPU | total CPU | wall |
|---|--:|--:|--:|--:|--:|--:|
| ObjectView family in plugin-view, before (run 1 / 2) | 47 | 507 |
220.5 / 225.8 s | 26.3 / 26.5 s | 246.8 / 252.3 s | 128.8 / 131.8 s |
| ObjectView family in plugin-view, after (run 1 / 2) | 41 | 507 | 222.1
/ 194.2 s | 29.9 / 25.9 s | 252.0 / 220.1 s | 131.7 / 114.7 s |
| the 6 + the harness, before (run 1 / 2) | 7 | 119 | 32.8 / 32.3 s |
3.1 / 3.0 s | 35.9 / 35.3 s | |
| the harness, after (run 1 / 2) | 1 | 119 | 6.3 / 5.2 s | 2.8 / 2.5 s |
9.1 / 7.6 s | |
The 6 files took 29.2 / 29.0 s of CPU on their own; the harness grew
from 6.7 / 6.3 s to 9.1 / 7.6 s to hold them, so the fold saves about 27
s of CPU (−76 % for those seven files together). The family read 249.6 s
before and 236.0 s after on average (−5.4 %), and wall 130.3 s to 123.2
s; the two after runs differ by 31.9 s, so that family figure is a
reading inside this box's run-to-run spread, not a measured saving; the
per-file figures above are the measurement. Across both slices the nine
3a files and these six, 15 files and 2,802 lines, now load the module
graph once.
## Acceptance notes
- **Why these 6, and not the whole ask.** The seat's 3b order named the
3 clean pins, the trio pins another test file names, and the app-shell
`ObjectView` pins in a second harness. Measured at `8b9cc712`, that is
about 14,000 changed lines: the 3 clean pins are 1,081 lines, the
named-by trio pins about 3,300 more, and the app-shell pins 25,358 lines
over 20 different mock-module sets. The dev reported that to the seat
before writing anything, and the seat agreed (09:06Z) to the 3 clean
pins plus the smallest named-by trio pins that fit the 3,000-line bar.
1,485 lines moved make 2,867 changed lines; the next smallest eligible
pin (`ObjectView.rowColorRelay-7218`, 175 lines) would take it past
3,000.
- **This is ObjectView's last PR under amendment 2,** so every
`ObjectView.*` pin left unfolded is listed below by the setup it shares,
from this head's tree. Whether to fold further is a new card the seat
files (amendment 2). Two of the rows are not candidates at all:
`contractEnvelope-6726` is named by path in
`ui/scripts/check-vi-mock-inherit.mjs`, a ledger outside `__tests__`, so
it stays a file of its own; `galleryBlockNested-12053` registers its
tests from a `for` loop over its routes at collection time.
- **The app-shell pins are another family.** They test the Console's
`ObjectView` in `@object-ui/app-shell`, a different component from
`@object-ui/plugin-view`'s, and none of them uses the trio. Their
largest dom clusters share a base of `./MetadataInspector`,
`./RecordDetailView`, `@object-ui/auth`, `@object-ui/collaboration` and
`@object-ui/permissions` mocks but differ in the rest of the set (and,
file by file, in the overridden keys), so a fold there needs its own
harness in `app-shell` and its own census; the seat judges whether that
is a separate card. 12 dom files there mock nothing (2,548 lines), the
natural first cluster for such a harness; 12 more mock nothing but are
`.test.ts` files in the `unit` project, which is not isolated per file,
so folding them saves nothing.
- `formTitleNoProviderFallback` and `createGrant-12082` fold cleanly
only because the `ui/` setup resets react-i18next's global after every
test (the reverse run above is the evidence); a later change to
`ui/vitest.setup.i18n-global.ts` is the thing that would undo it, and
the rewritten docblock says so.
- The harness header and the moved docblocks name the former files'
issue numbers in prose, as the 3a blocks do; no new citation line is
added outside moved text.
### ObjectView pins left unfolded in `@object-ui/plugin-view` at this
head: 39 files, 9,677 lines
`ObjectView.test.tsx` is the component's main suite, not a per-issue
pin, and is not counted. "The trio" is the harness's three mocks
(`@object-ui/react` with `SchemaRenderer`, `SchemaRendererContext`,
`subscribeDataChanges` and `notifyDataChanged` replaced;
`@object-ui/plugin-grid` with `ObjectGrid`; `@object-ui/plugin-form`
with `ObjectForm`). A file sits under the first row it fails, top to
bottom. Names drop the `ObjectView.` prefix and `.test.tsx`.
| shared setup | files (lines) | lines |
|---|---|--:|
| the trio and passes every check, but another file names it, so a fold
also edits that file: the next fold's first candidates |
`namedViewProtocolKeys-8980` (694; named by `plugin-view.mdx`,
`view-overlay-options-bag.test.ts`, `README.md`),
`specShapedNamedView-8254` (379; named by `ObjectView.tsx`),
`mapFlatten` (347; named by `ListView.mapFlatten.test.tsx`,
`CHANGELOG.md`, `ObjectMap.filterConfig.test.tsx`,
`ObjectMap.topLevelStyle.test.tsx`,
`index.bareMapKeyRetired-10393.test.tsx`, `ObjectView.tsx`,
`CHANGELOG.md`), `calendarAliasRefused-8355` (305; named by
`CHANGELOG.md`, `CHANGELOG.md`, `CHANGELOG.md`, `CHANGELOG.md`,
`ObjectView.harness.test.tsx`, `CHANGELOG.md`), `formTitleI18n` (272;
named by `ObjectView.harness.test.tsx`), `kanbanConditionalFormatting`
(226; named by `CHANGELOG.md`), `contractEnvelope-6840` (191; named by
`ObjectView.tsx`), `ganttBinding-7070` (191; named by
`ObjectView.galleryBinding-7547.test.tsx`,
`ObjectView.harness.test.tsx`), `rowColorRelay-7218` (175; named by
`CHANGELOG.md`, `ObjectView.fieldOrderRelay-7516.test.tsx`) | 2780 |
| the trio, but named by path in a ledger outside `__tests__`
(`check-vi-mock-inherit.mjs`): stays a file of its own |
`contractEnvelope-6726` (161) | 161 |
| the trio, but its body registers tests from a loop at collection time
| `galleryBlockNested-12053` (160) | 160 |
| the trio, plus `vi.spyOn`, `vi.stubGlobal`, `vi.useFakeTimers` or
`vi.stubEnv` | `expandGate` (355), `sortSink` (303),
`namedViewContextTokens-10506` (301), `legacyChartRetired-6152` (159) |
1118 |
| the trio, plus a `vi.hoisted` or `globalThis` slot of its own |
`viewIdentityDeps` (348) | 348 |
| the trio modules, but `@object-ui/react` keeps its real
`SchemaRendererContext` or data-change bus | `refreshInPlace-10035`
(285), `dataSourceContextFallback-7842` (220) | 505 |
| mocks `@object-ui/plugin-form` + `@object-ui/plugin-grid`, not the
trio | `tableSlotRelay-10976` (280), `routeTwoNamedGridMembers-10885`
(264), `pageSurfaceFallback-11015` (224), `drawerDirection-11775` (193),
`splitPopoverCreate-10975` (148), `namedViewNavigation-10885` (145),
`gridOperationsWithoutRead-6152` (95) | 1349 |
| mocks `@object-ui/plugin-form`, not the trio |
`gridFilterHandoff-11880` (319), `namedViewInlineEdit-10885` (129),
`tableEditable-10976` (121), `tableTitleI18nLabel-10993` (114) | 683 |
| mocks `@object-ui/permissions`, not the trio | `gridDelete-10383`
(401) | 401 |
| mocks `@object-ui/plugin-grid`, not the trio | `fetchAllowList-10982`
(278) | 278 |
| mocks `../ViewSwitcher` + `@object-ui/plugin-form` +
`@object-ui/plugin-grid` + `@object-ui/react`, not the trio |
`hostOnlyViewTypes` (243) | 243 |
| mocks `@object-ui/permissions` + `@object-ui/plugin-form` +
`@object-ui/plugin-grid` + `@object-ui/react`, not the trio |
`expandFls-7429` (232) | 232 |
| mocks `@object-ui/plugin-grid` + `@object-ui/react`, not the trio |
`namedViewSpecRecord-7928` (138) | 138 |
| mocks `@object-ui/react`, not the trio | `recordIdFilterToken-7297`
(100) | 100 |
| no `vi.mock` (renders the real children), a setup of its own |
`modifierClickNewTab-9806` (493), `namedViewSortArity` (312),
`busReread-10887` (232) | 1037 |
| `.test.ts` in the `unit` project, which is not isolated per file, so a
fold saves nothing | `treeViewConfigDeclared-8253.test.ts` (144) | 144 |
| **total** | 39 files | 9677 |
### ObjectView pins in `@object-ui/app-shell`
(`ui/packages/app-shell/src/views/`), another family: 87 files, 25,358
lines
Grouped by the set of modules each file passes to `vi.mock`. Names drop
the `ObjectView.` prefix and `.test.tsx`.
| shared setup (`vi.mock` modules) | files (lines) | lines |
|---|---|--:|
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-list` + `@object-ui/plugin-view` + `sonner` |
`createPredicates` (434), `objectBoundActions-7234` (392),
`chartRelay-7823` (355), `titleFieldConvergence` (350),
`viewRowDeclaredReads-11013` (338), `rowColorRelay-7218` (304),
`servedViewLabel-11295` (302), `labelLessViewTab-12774` (291),
`importPredicates` (290), `viewDescriptionRelay-7199` (288),
`fieldOrderRelay-7516` (257), `mobileFabListClearance-13134` (232) |
3833 |
| nothing | `setDefaultViewIdentity` (467), `defaultViewIdentity` (337),
`kanbanLane-8193` (230), `kanbanGroupByRetired-8213` (219),
`galleryBinding-7547` (206), `overlayFilterRecovery` (201),
`defaultColumns` (187), `ganttBinding-7070` (182),
`calendarBinding-7029` (174), `viewOverrides` (139),
`consoleProps.types` (124), `timelineBinding` (82) | 2548 |
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` + `sonner` |
`listUrlState-11860` (746), `personalViews-29635` (678),
`refreshInPlace-10035` (400), `ufViewSwitch-11992` (294),
`hostRerenderRefetch-10046` (281), `externalRefreshSum-10572` (274),
`stableFilterIdentity-7237` (274), `objectDocSwapNoRefetch-27626` (216),
`refreshRereadsViews-13057` (192), `setupListChrome-12606` (147) | 3502
|
| `./MetadataInspector` + `./RecordDetailView` +
`./metadata-admin/useMetadata` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` + `sonner` |
`emptyStateMatchesPage-11687` (321), `recordCountFooter-10636` (279),
`recordOpenDisplay-26681` (261), `createViewRefusal-11578` (249),
`phoneRecordPage-27058` (244), `recordOpenPreference-26677` (200),
`addRecordOpensCreate-13089` (181), `createKanbanView-11581` (173) |
1908 |
| `./MetadataInspector` + `./RecordDetailView` +
`./metadata-admin/useMetadata` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` |
`toolbarScriptSelection-12331` (446), `inviteOutcome-27797` (357),
`inviteFeedback-11817` (354), `headerSelectionGate-27831` (316),
`bulkWiredHeaderDuplicate-12462` (297) | 1770 |
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-list` + `sonner` | `fallbackTabSessionOnly-11643`
(399), `inlineEditSessionOnly-5144` (396), `toolbarWritesCompose-11642`
(368), `densityModeThroughFold-7924` (253),
`recordRelatedNotOnOwnList-11270` (151) | 1567 |
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-view` + `sonner` | `listLinksPlural-11733` (237),
`favoritesEntry-12427` (223), `starredView-27594` (221),
`listCrossObjectHost-12673` (218), `listTitlePlural-11696` (215) | 1114
|
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` |
`titleViewSwitcher-27594` (295), `objectListTitle-27950` (254),
`chartViewTabs-13114` (229) | 778 |
| `./MetadataInspector` + `./RecordDetailView` +
`./metadata-admin/inspectors/ViewVariantInspector` +
`./metadata-admin/useMetadata` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-list` + `@object-ui/plugin-view` + `sonner` |
`userListState-12418` (1045), `viewWriteRefusal-11583` (478) | 1523 |
| `./MetadataInspector` + `./RecordDetailView` +
`./metadata-admin/useMetadata` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-list` + `sonner` | `listPersonalized-28950` (346),
`recordDrawer-27545` (272) | 618 |
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/plugin-list` +
`@object-ui/plugin-view` + `sonner` | `viewRefusal-12112` (243),
`listActionsReadGate-12109` (171) | 414 |
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/plugin-view` + `sonner` |
`managedByBadgeAuthoring-12194` (177), `setupListBadge-13385` (165) |
342 |
| `./MetadataInspector` + `./RecordDetailView` + `./RuntimeDraftBar` +
`./metadata-admin/inspectors/ViewVariantInspector` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-view` + `sonner` | `emptyColumnsNoProjection-10694`
(618) | 618 |
| `../providers/MetadataProvider.js` + `./MetadataInspector` +
`./RecordDetailView` + `@object-ui/auth` + `@object-ui/collaboration` +
`@object-ui/permissions` + `@object-ui/plugin-list` +
`@object-ui/plugin-view` + `@object-ui/react` + `sonner` |
`storedRowParity-10380` (444) | 444 |
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-charts` + `@object-ui/plugin-view` + `sonner` |
`chartConfigForward-7891` (371) | 371 |
| `./MetadataInspector` + `./RecordDetailView` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-grid` + `@object-ui/plugin-list` +
`@object-ui/plugin-view` + `sonner` | `headerFold-12705` (294) | 294 |
| `./MetadataInspector` + `./RecordDetailView` +
`./metadata-admin/useMetadata` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/plugin-charts` + `sonner` | `createChartView-11576` (261) |
261 |
| `./MetadataInspector` + `./RecordDetailView` +
`./metadata-admin/useMetadata` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` +
`@object-ui/react` | `managedEnvironmentUsers-13330` (253) | 253 |
| `./MetadataInspector` + `./RecordDetailView` + `./ViewConfigPanel` +
`./metadata-admin/useMetadata` + `@object-ui/auth` +
`@object-ui/collaboration` + `@object-ui/permissions` + `sonner` |
`viewConfigSaveWiring-10210` (188) | 188 |
| nothing, `.test.ts` in the `unit` project (not isolated per file, so a
fold saves nothing) | `relayRungCensus-7559.test.ts` (861),
`overlayPatchOnly.test.ts` (388), `overlayPairValue.test.ts` (249),
`viewConfigSaveEnvelope-10210.test.ts` (237),
`urlFilterSuffix-9196.test.ts` (221), `unboundAdapterCall.test.ts`
(214), `overrideMasquerade.test.ts` (205), `listRecordHref.test.ts`
(188), `filterParamsKeyEncoding-9287.test.ts` (172),
`flatOverlayColumns-8411.test.ts` (131),
`relayedBlocksParse-6152.test.ts` (81),
`kanbanSummarizeField-11629.test.ts` (65) | 3012 |
| **total** | 87 files, 20 module sets | 25358 |
## Verification
At head `f5053769`, after `pnpm install --frozen-lockfile` and the
closure build from slice 3a (`turbo run build` for `@objectstack/spec`,
`formula`, `lint`, `client`, `metadata-protocol`, then
`--filter='@object-ui/plugin-view^...'` from `ui/`), every run under
`os-verify-lock`:
- `pnpm exec vitest run packages/plugin-view/
packages/plugin-form/src/affordanceGrantMap-12082.test.tsx
--maxWorkers=2` from `ui/` (VERDICT command-exit 0): 66 files, 775
tests, all passed. That is the 65 plugin-view files left after this PR
plus the edited plugin-form file.
- `pnpm run type-check` in `ui/packages/plugin-view` (`tsc --noEmit &&
tsc -p tsconfig.test.json`) and `tsc -p tsconfig.test.json --noEmit` in
`ui/packages/plugin-form`: exit 0, 0 `error TS`.
- `eslint` from the package directories: 0 errors. The harness and the
two edited plugin-view files give 145 warnings (136 + 3 + 6, all
`no-explicit-any`), the same 145 that the slice-3a harness, the 6 former
files and the two edited files give at `8b9cc712`;
`affordanceGrantMap-12082.test.tsx` gives 0 before and after.
- Order: the harness passes 119 / 119 in declaration order and under
`--sequence.shuffle.tests` with `--sequence.seed` 11, 222 and 3333. A
throwaway probe (a copy of the harness whose `restoreAfterBlock()` logs
state at each block's first test: each registry entry's renderer and
meta, the `localStorage` own property and both storage lengths, the
`html` element's `lang` / `dir`, react-i18next's `getI18n()`, the three
slots, `body`, globals added since import) reads every one of the 15
blocks starting from the same state in all four orders. The same probe
with the helper's body removed finds the leaks 3a named (slots carried
into the next block; `lang="zh"` / `dir="ltr"` after
`formLabelsI18nLabel-10993`). The probe copies were deleted.
- i18n reverse run: with `ui/vitest.setup.i18n-global.ts`'s `setI18n`
restore disabled for one run and then checked out again, the harness
gave 7 failed / 112 passed (the 4 `formTitleNoProviderFallback` and 3
`createGrant-12082` tests), as stated in What changes.
- Derived gates (`node scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack`, change set 10 paths against merge base
`8b9cc712`): 26 derived, 26 run with stdin from `/dev/null`, each exit 0
captured before any pipe; `pnpm --dir ui exec vitest run scripts/`
(VERDICT command-exit 0) gave 170 files passed and 2 skipped, 4,979
tests passed and 2 skipped; `node scripts/check-sdui-manifest.mjs` and
its `--self-test` exit 0. `--ran` reconciliation: 26 derived, 26 run, 0
NOT-MEASURED, 0 UNRUN. `pnpm check:new-line-citations` from `ui/`: exit
0, 0 new citations.
- Size: `git diff --shortstat 8b9cc71 HEAD` is 10 files, +1,373 /
−1,494, 2,867 changed lines.
- `main` has moved 3 commits past `8b9cc712`; none touches
`ui/packages/plugin-view`,
`ui/packages/plugin-form/src/affordanceGrantMap-12082.test.tsx`,
`ui/vitest.config.mts` or the `ui/vitest.setup.*` files, so the branch
is not re-merged and the readings above stand for this head.
- Open pull requests: the head trees of all 39 open PRs, compared with
`8b9cc712` at the 10 paths, are equal except 4 (#30595, #30515, #30297,
#28646) whose `affordanceGrantMap-12082.test.tsx` (and, for #28646,
`ObjectView.createGrant-12082.test.tsx`) lack lines `main` added after
they branched; none of those lines is in a hunk this PR changes.
- No ablation of a product behaviour: none changed, and the assertions
moved verbatim.
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(`packages/spec` not touched.)
- [x] 2. Every name I added uses the casing for its kind.
- [x] 3. No formatter ran; `pnpm lint` passes. (`ui/` is linted by its
own config; the lint readings are above.)
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset. (Nothing
publishes: `skip-changeset`.)
- [x] 6. `packages/spec` touched: its generated artifacts are
regenerated and committed. (Not touched.)
- [x] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`.
- [x] 8. Title, body and comments are in English (the maintainer
quick-read is the allowed Chinese section).
<!-- signed: domain:ui#2 · os-tesla · session_01L9qibw7DekEe3wx5f3zphf
-->
Co-authored-by: Claude <noreply@anthropic.com>1 parent 60dac8b commit 7d9682f
10 files changed
Lines changed: 1373 additions & 1494 deletions
File tree
- ui/packages
- plugin-form/src
- plugin-view/src/__tests__
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
578 | 578 | | |
579 | 579 | | |
580 | 580 | | |
581 | | - | |
| 581 | + | |
| 582 | + | |
582 | 583 | | |
583 | 584 | | |
584 | 585 | | |
| |||
This file was deleted.
0 commit comments