From fee7826ebbc26a8fb12891c291609eee45fb427f Mon Sep 17 00:00:00 2001 From: Claude Date: Sun, 6 Sep 2026 20:13:59 +0000 Subject: [PATCH] test(vi-mock): inherit the real @object-ui/plugin-grid surface in 25 vi.mock factories Sweeps objectui#6892's seventh specifier. All 25 judged call sites on `@object-ui/plugin-grid` were frozen -- 21 under packages/plugin-view, 4 under packages/plugin-designer -- and each now obtains the real barrel through `importOriginal` and spreads it FIRST, keeping its hand-written overrides after. The specifier joins COVERED_SPECIFIERS in the same commit, so the guard holds it at zero from here. Two syntactic shapes: 21 object-literal arrows (15 of them byte-identical on one line) and 4 designer sites that delegated the whole factory to a shared manual mock module, which now spread the real barrel first and the manual mock second. STEP 0 walked the 560-module, 1421-statement graph reachable from the barrel and returned PROCEED on the CLASS of the effect: 114 namespaced module-scope ComponentRegistry.register calls plus three registration idioms in packages/fields (registerFieldRenderer, setCellRendererResolver, registerAllFields), all Map.set or a module-level let; zero timers, globals, storage, fetch or connections. Importing the real barrel under happy-dom registers 375 keys and emits zero console.warn and zero console.error. The pin's neighbour fixture named this specifier while it was uncovered, so the sweep turned its frozen factory into a genuine finding. It now names a specifier no package publishes, which keeps the case about the scope resolver rather than about the covered set's current membership. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01FhBNJcLRZLe8M87VcUgpKr --- .../vi-mock-inherit-slice7-plugin-grid.md | 6 ++ .../DashboardEditor.rootTitleRetired.test.tsx | 5 +- ...eldDesigner.formulaControlRetired.test.tsx | 5 +- .../src/__tests__/ObjectManager.test.tsx | 5 +- .../bareKeysNoProviderFallback.test.tsx | 5 +- .../ObjectView.calendarBinding-7029.test.tsx | 5 +- .../ObjectView.canonicalTableKeys.test.tsx | 3 +- .../ObjectView.contractEnvelope-6726.test.tsx | 5 +- .../ObjectView.contractEnvelope-6840.test.tsx | 5 +- ...ew.dataSourceContextFallback-7842.test.tsx | 3 +- .../ObjectView.expandFls-7429.test.tsx | 5 +- .../__tests__/ObjectView.expandGate.test.tsx | 5 +- .../ObjectView.filterSources.test.tsx | 5 +- .../ObjectView.formTitleI18n.test.tsx | 3 +- ...tView.formTitleNoProviderFallback.test.tsx | 3 +- .../ObjectView.ganttBinding-7070.test.tsx | 5 +- .../ObjectView.hostOnlyViewTypes.test.tsx | 5 +- ...tView.kanbanConditionalFormatting.test.tsx | 5 +- .../__tests__/ObjectView.mapFlatten.test.tsx | 5 +- .../ObjectView.refreshSignal.test.tsx | 5 +- .../ObjectView.rowColorRelay-7218.test.tsx | 5 +- .../__tests__/ObjectView.sortSink.test.tsx | 5 +- ...ObjectView.tableColumnsForwarding.test.tsx | 3 +- .../src/__tests__/ObjectView.test.tsx | 3 +- .../ObjectView.timelineBinding-7070.test.tsx | 5 +- .../ObjectView.viewIdentityDeps.test.tsx | 5 +- .../__tests__/check-vi-mock-inherit.test.ts | 11 ++- scripts/check-vi-mock-inherit.mjs | 91 +++++++++++++++++-- 28 files changed, 189 insertions(+), 32 deletions(-) create mode 100644 .changeset/vi-mock-inherit-slice7-plugin-grid.md diff --git a/.changeset/vi-mock-inherit-slice7-plugin-grid.md b/.changeset/vi-mock-inherit-slice7-plugin-grid.md new file mode 100644 index 0000000000..2551942772 --- /dev/null +++ b/.changeset/vi-mock-inherit-slice7-plugin-grid.md @@ -0,0 +1,6 @@ +--- +--- + +Test-only change: the 25 `vi.mock` factories that hand-listed `@object-ui/plugin-grid`'s +exports now inherit the real barrel's export surface, and the specifier joins the +`check-vi-mock-inherit` guard's covered set. No published behaviour changes. diff --git a/packages/plugin-designer/src/__tests__/DashboardEditor.rootTitleRetired.test.tsx b/packages/plugin-designer/src/__tests__/DashboardEditor.rootTitleRetired.test.tsx index c323a10250..2a3b84e7f5 100644 --- a/packages/plugin-designer/src/__tests__/DashboardEditor.rootTitleRetired.test.tsx +++ b/packages/plugin-designer/src/__tests__/DashboardEditor.rootTitleRetired.test.tsx @@ -32,7 +32,10 @@ import { render, screen, fireEvent, cleanup, within } from '@testing-library/rea import type { DashboardComponentSchema } from '@object-ui/types'; import { DashboardEditor } from '../DashboardEditor'; -vi.mock('@object-ui/plugin-grid', () => import('./__mocks__/plugin-grid')); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ...(await import('./__mocks__/plugin-grid')), +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ...(await import('./__mocks__/plugin-form')), diff --git a/packages/plugin-designer/src/__tests__/FieldDesigner.formulaControlRetired.test.tsx b/packages/plugin-designer/src/__tests__/FieldDesigner.formulaControlRetired.test.tsx index cfa1decb51..c2fb509b99 100644 --- a/packages/plugin-designer/src/__tests__/FieldDesigner.formulaControlRetired.test.tsx +++ b/packages/plugin-designer/src/__tests__/FieldDesigner.formulaControlRetired.test.tsx @@ -55,7 +55,10 @@ import { render, screen, fireEvent, waitFor, cleanup } from '@testing-library/re import type { DesignerFieldDefinition } from '@object-ui/types'; import { FieldDesigner } from '../FieldDesigner'; -vi.mock('@object-ui/plugin-grid', () => import('./__mocks__/plugin-grid')); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ...(await import('./__mocks__/plugin-grid')), +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ...(await import('./__mocks__/plugin-form')), diff --git a/packages/plugin-designer/src/__tests__/ObjectManager.test.tsx b/packages/plugin-designer/src/__tests__/ObjectManager.test.tsx index fc088de414..c3fa941a7c 100644 --- a/packages/plugin-designer/src/__tests__/ObjectManager.test.tsx +++ b/packages/plugin-designer/src/__tests__/ObjectManager.test.tsx @@ -12,7 +12,10 @@ import { ObjectManager } from '../ObjectManager'; import type { ObjectDefinition } from '@object-ui/types'; // Mock standard components — tested separately in their own packages -vi.mock('@object-ui/plugin-grid', () => import('./__mocks__/plugin-grid')); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ...(await import('./__mocks__/plugin-grid')), +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ...(await import('./__mocks__/plugin-form')), diff --git a/packages/plugin-designer/src/__tests__/bareKeysNoProviderFallback.test.tsx b/packages/plugin-designer/src/__tests__/bareKeysNoProviderFallback.test.tsx index d223c16590..57fe4cbb7c 100644 --- a/packages/plugin-designer/src/__tests__/bareKeysNoProviderFallback.test.tsx +++ b/packages/plugin-designer/src/__tests__/bareKeysNoProviderFallback.test.tsx @@ -52,7 +52,10 @@ import type { DashboardComponentSchema, ObjectDefinition } from '@object-ui/type import { DashboardEditor } from '../DashboardEditor'; import { ObjectManager } from '../ObjectManager'; -vi.mock('@object-ui/plugin-grid', () => import('./__mocks__/plugin-grid')); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ...(await import('./__mocks__/plugin-grid')), +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ...(await import('./__mocks__/plugin-form')), diff --git a/packages/plugin-view/src/__tests__/ObjectView.calendarBinding-7029.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.calendarBinding-7029.test.tsx index 3191613f52..633c65aecc 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.calendarBinding-7029.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.calendarBinding-7029.test.tsx @@ -51,7 +51,10 @@ vi.mock('@object-ui/react', async (importOriginal) => { notifyDataChanged: () => {}, }; }); -vi.mock('@object-ui/plugin-grid', () => ({ ObjectGrid: () =>
})); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ObjectGrid: () =>
, +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ObjectForm: () =>
, diff --git a/packages/plugin-view/src/__tests__/ObjectView.canonicalTableKeys.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.canonicalTableKeys.test.tsx index a7172db6ee..f80db0a0a5 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.canonicalTableKeys.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.canonicalTableKeys.test.tsx @@ -68,7 +68,8 @@ vi.mock('@object-ui/react', async (importOriginal) => { * it was handed. What reaches this object IS the forwarding whitelist. */ const gridSchemas: any[] = []; -vi.mock('@object-ui/plugin-grid', () => ({ +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), ObjectGrid: ({ schema }: any) => { gridSchemas.push(schema); return
; diff --git a/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6726.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6726.test.tsx index 0c5b42dbc3..58951dc192 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6726.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6726.test.tsx @@ -60,7 +60,10 @@ vi.mock('@object-ui/react', async (importOriginal) => { notifyDataChanged: () => {}, }; }); -vi.mock('@object-ui/plugin-grid', () => ({ ObjectGrid: () =>
})); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ObjectGrid: () =>
, +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ObjectForm: () =>
, diff --git a/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6840.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6840.test.tsx index 66ea15c2bc..da5d6d4a6f 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6840.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.contractEnvelope-6840.test.tsx @@ -89,7 +89,10 @@ vi.mock('@object-ui/react', async (importOriginal) => { notifyDataChanged: () => {}, }; }); -vi.mock('@object-ui/plugin-grid', () => ({ ObjectGrid: () =>
})); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ObjectGrid: () =>
, +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ObjectForm: () =>
, diff --git a/packages/plugin-view/src/__tests__/ObjectView.dataSourceContextFallback-7842.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.dataSourceContextFallback-7842.test.tsx index 533dcec7cd..50d77ad909 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.dataSourceContextFallback-7842.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.dataSourceContextFallback-7842.test.tsx @@ -70,7 +70,8 @@ vi.mock('@object-ui/react', async (importOriginal) => ({ ), })); -vi.mock('@object-ui/plugin-grid', () => ({ +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), ObjectGrid: ({ schema }: { schema?: { objectName?: string } }) => (
), diff --git a/packages/plugin-view/src/__tests__/ObjectView.expandFls-7429.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.expandFls-7429.test.tsx index 31c612b698..9716e43063 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.expandFls-7429.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.expandFls-7429.test.tsx @@ -105,7 +105,10 @@ vi.mock('@object-ui/react', async (importOriginal) => { notifyDataChanged: () => {}, }; }); -vi.mock('@object-ui/plugin-grid', () => ({ ObjectGrid: () =>
})); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ObjectGrid: () =>
, +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ObjectForm: () =>
, diff --git a/packages/plugin-view/src/__tests__/ObjectView.expandGate.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.expandGate.test.tsx index ea13a9920e..2557d0613e 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.expandGate.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.expandGate.test.tsx @@ -101,7 +101,10 @@ vi.mock('@object-ui/react', async (importOriginal) => { notifyDataChanged: () => {}, }; }); -vi.mock('@object-ui/plugin-grid', () => ({ ObjectGrid: () =>
})); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ObjectGrid: () =>
, +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ObjectForm: () =>
, diff --git a/packages/plugin-view/src/__tests__/ObjectView.filterSources.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.filterSources.test.tsx index 91fc69b000..5bc6b69540 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.filterSources.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.filterSources.test.tsx @@ -46,7 +46,10 @@ vi.mock('@object-ui/react', async (importOriginal) => { notifyDataChanged: () => {}, }; }); -vi.mock('@object-ui/plugin-grid', () => ({ ObjectGrid: () =>
})); +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), + ObjectGrid: () =>
, +})); vi.mock('@object-ui/plugin-form', async (importOriginal) => ({ ...(await importOriginal>()), ObjectForm: () =>
, diff --git a/packages/plugin-view/src/__tests__/ObjectView.formTitleI18n.test.tsx b/packages/plugin-view/src/__tests__/ObjectView.formTitleI18n.test.tsx index c93ec2f7a9..b154e0d8db 100644 --- a/packages/plugin-view/src/__tests__/ObjectView.formTitleI18n.test.tsx +++ b/packages/plugin-view/src/__tests__/ObjectView.formTitleI18n.test.tsx @@ -86,7 +86,8 @@ vi.mock('@object-ui/react', async (importOriginal) => { // Grid stub exposing the two row affordances this test drives: a row click // (-> formMode 'view') and the row edit action (-> formMode 'edit'). -vi.mock('@object-ui/plugin-grid', () => ({ +vi.mock('@object-ui/plugin-grid', async (importOriginal) => ({ + ...(await importOriginal>()), ObjectGrid: ({ schema, onRowClick, onEdit }: any) => (