diff --git a/.changeset/fields-jest-dom-self-declared.md b/.changeset/fields-jest-dom-self-declared.md new file mode 100644 index 0000000000..1b25f48b6c --- /dev/null +++ b/.changeset/fields-jest-dom-self-declared.md @@ -0,0 +1,9 @@ +--- +--- + +Test-only change in `@object-ui/fields`: the fifteen test files that use +`@testing-library/jest-dom` matchers now import jest-dom themselves instead of +relying on a sibling test file's bare import to register the matcher types +program-wide (objectui#8722). No published behaviour changes — `files` ships +`dist` only, and no artifact derived from a `.test.` file reaches it (measured, +with a control: 0 test-derived files in `dist`, 80 `.d.ts` present). diff --git a/packages/fields/src/__tests__/field-carrier-sdui.test.tsx b/packages/fields/src/__tests__/field-carrier-sdui.test.tsx index 079cf0476f..60cc416ea4 100644 --- a/packages/fields/src/__tests__/field-carrier-sdui.test.tsx +++ b/packages/fields/src/__tests__/field-carrier-sdui.test.tsx @@ -38,6 +38,7 @@ import React, { Suspense } from 'react'; import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { render, screen, cleanup } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { ComponentRegistry } from '@object-ui/core'; import { SchemaRenderer } from '@object-ui/react'; diff --git a/packages/fields/src/__tests__/widget-props-contract.test.tsx b/packages/fields/src/__tests__/widget-props-contract.test.tsx index 07fcfdb98a..88a1754e62 100644 --- a/packages/fields/src/__tests__/widget-props-contract.test.tsx +++ b/packages/fields/src/__tests__/widget-props-contract.test.tsx @@ -30,6 +30,7 @@ import { describe, it, expect } from 'vitest'; import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { TextField } from '../widgets/TextField'; import { BooleanField } from '../widgets/BooleanField'; diff --git a/packages/fields/src/complex-widgets.test.tsx b/packages/fields/src/complex-widgets.test.tsx index d1b7f9e1e5..fc7fcdd73e 100644 --- a/packages/fields/src/complex-widgets.test.tsx +++ b/packages/fields/src/complex-widgets.test.tsx @@ -1,4 +1,5 @@ import { render, screen, fireEvent, waitFor, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import { LookupField } from './widgets/LookupField'; import { ActionProvider } from '@object-ui/react'; diff --git a/packages/fields/src/datetime-widgets.test.tsx b/packages/fields/src/datetime-widgets.test.tsx index a8fb9a8057..cb2ebcd2ea 100644 --- a/packages/fields/src/datetime-widgets.test.tsx +++ b/packages/fields/src/datetime-widgets.test.tsx @@ -1,5 +1,6 @@ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi } from 'vitest'; import { DateField } from './widgets/DateField'; import { DateTimeField } from './widgets/DateTimeField'; diff --git a/packages/fields/src/widgets/ImageLightbox.test.tsx b/packages/fields/src/widgets/ImageLightbox.test.tsx index e459388600..336257388e 100644 --- a/packages/fields/src/widgets/ImageLightbox.test.tsx +++ b/packages/fields/src/widgets/ImageLightbox.test.tsx @@ -1,4 +1,5 @@ import { render, screen, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect } from 'vitest'; import { I18nProvider } from '@object-ui/i18n'; import { ImageLightbox, type ImageLightboxProps } from './ImageLightbox'; diff --git a/packages/fields/src/widgets/LookupField.dependsOn.test.tsx b/packages/fields/src/widgets/LookupField.dependsOn.test.tsx index 9e2388b21a..659dfa11c8 100644 --- a/packages/fields/src/widgets/LookupField.dependsOn.test.tsx +++ b/packages/fields/src/widgets/LookupField.dependsOn.test.tsx @@ -24,6 +24,7 @@ */ import { render, screen, fireEvent, waitFor, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import { LookupField } from './LookupField'; import { RecordPickerDialog } from './RecordPickerDialog'; diff --git a/packages/fields/src/widgets/LookupField.dependsOnDeclared-6153.test.tsx b/packages/fields/src/widgets/LookupField.dependsOnDeclared-6153.test.tsx index 91816cbccc..f2120b1f01 100644 --- a/packages/fields/src/widgets/LookupField.dependsOnDeclared-6153.test.tsx +++ b/packages/fields/src/widgets/LookupField.dependsOnDeclared-6153.test.tsx @@ -16,6 +16,7 @@ */ import { render, screen, fireEvent, waitFor, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import type { LookupFieldMetadata } from '@object-ui/types'; import { LookupField } from './LookupField'; diff --git a/packages/fields/src/widgets/LookupField.dependsOnRetired-7357.test.tsx b/packages/fields/src/widgets/LookupField.dependsOnRetired-7357.test.tsx index 5842b058bc..e5eb4cefa7 100644 --- a/packages/fields/src/widgets/LookupField.dependsOnRetired-7357.test.tsx +++ b/packages/fields/src/widgets/LookupField.dependsOnRetired-7357.test.tsx @@ -31,6 +31,7 @@ */ import { render, screen, fireEvent, waitFor, act, cleanup } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { LookupField } from './LookupField'; import { SelectField } from './SelectField'; diff --git a/packages/fields/src/widgets/LookupField.gateHintLabel.test.tsx b/packages/fields/src/widgets/LookupField.gateHintLabel.test.tsx index aba7996135..07ac24f50b 100644 --- a/packages/fields/src/widgets/LookupField.gateHintLabel.test.tsx +++ b/packages/fields/src/widgets/LookupField.gateHintLabel.test.tsx @@ -29,6 +29,7 @@ */ import { render, screen, cleanup } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest'; import { LookupField } from './LookupField'; diff --git a/packages/fields/src/widgets/LookupField.optionDescription.test.tsx b/packages/fields/src/widgets/LookupField.optionDescription.test.tsx index 51593164b9..4f46592e00 100644 --- a/packages/fields/src/widgets/LookupField.optionDescription.test.tsx +++ b/packages/fields/src/widgets/LookupField.optionDescription.test.tsx @@ -20,6 +20,7 @@ import * as React from 'react'; import { describe, it, expect, vi, afterEach } from 'vitest'; import { render, screen, fireEvent, cleanup, waitFor, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; import type { LookupFieldMetadata } from '@object-ui/types'; import { LookupField } from './LookupField'; diff --git a/packages/fields/src/widgets/LookupField.pickerAgreement.test.tsx b/packages/fields/src/widgets/LookupField.pickerAgreement.test.tsx index a4d1b37b26..47dd56dcff 100644 --- a/packages/fields/src/widgets/LookupField.pickerAgreement.test.tsx +++ b/packages/fields/src/widgets/LookupField.pickerAgreement.test.tsx @@ -45,6 +45,7 @@ import * as React from 'react'; import { describe, it, expect, vi, afterEach } from 'vitest'; import { render, screen, cleanup, waitFor, act, fireEvent } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { SchemaRendererContext } from '@object-ui/react'; import { LookupField } from './LookupField'; import { RecordPickerDialog } from './RecordPickerDialog'; diff --git a/packages/fields/src/widgets/LookupField.recentsFilters.test.tsx b/packages/fields/src/widgets/LookupField.recentsFilters.test.tsx index 63baf67835..77d989283b 100644 --- a/packages/fields/src/widgets/LookupField.recentsFilters.test.tsx +++ b/packages/fields/src/widgets/LookupField.recentsFilters.test.tsx @@ -43,6 +43,7 @@ */ import { render, screen, fireEvent, waitFor, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi, beforeEach } from 'vitest'; import { LookupField } from './LookupField'; import { PeoplePicker } from './PeoplePicker'; diff --git a/packages/fields/src/widgets/RecordPickerDialog.filterOptions.test.tsx b/packages/fields/src/widgets/RecordPickerDialog.filterOptions.test.tsx index 7b7929fb32..7ee4d6667a 100644 --- a/packages/fields/src/widgets/RecordPickerDialog.filterOptions.test.tsx +++ b/packages/fields/src/widgets/RecordPickerDialog.filterOptions.test.tsx @@ -48,6 +48,7 @@ import React from 'react'; import { render, screen, fireEvent, waitFor, act } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi, beforeAll } from 'vitest'; import { I18nProvider } from '@object-ui/i18n'; import { RecordPickerDialog } from './RecordPickerDialog'; diff --git a/packages/fields/src/widgets/RecordPickerDialog.selectLabel.test.tsx b/packages/fields/src/widgets/RecordPickerDialog.selectLabel.test.tsx index 0eee90632b..eefcd7fe49 100644 --- a/packages/fields/src/widgets/RecordPickerDialog.selectLabel.test.tsx +++ b/packages/fields/src/widgets/RecordPickerDialog.selectLabel.test.tsx @@ -23,6 +23,7 @@ */ import { render, screen, waitFor } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { describe, it, expect, vi } from 'vitest'; import { RecordPickerDialog } from './RecordPickerDialog'; import { getCellRenderer } from '../index'; diff --git a/packages/fields/src/widgets/optionWidgets.unconfiguredOptions.test.tsx b/packages/fields/src/widgets/optionWidgets.unconfiguredOptions.test.tsx index b21690ea91..0eb6da23be 100644 --- a/packages/fields/src/widgets/optionWidgets.unconfiguredOptions.test.tsx +++ b/packages/fields/src/widgets/optionWidgets.unconfiguredOptions.test.tsx @@ -38,6 +38,7 @@ import { describe, it, expect, vi } from 'vitest'; import React from 'react'; import { render, screen } from '@testing-library/react'; +import '@testing-library/jest-dom'; import { SelectField } from './SelectField'; import { MultiSelectField } from './MultiSelectField'; import { CheckboxesField } from './CheckboxesField'; diff --git a/packages/fields/tsconfig.test.json b/packages/fields/tsconfig.test.json index 383c6c6bf4..2f19f19665 100644 --- a/packages/fields/tsconfig.test.json +++ b/packages/fields/tsconfig.test.json @@ -36,10 +36,30 @@ // program does not name it either — so leaving it unset is what reproduces // the exact program these tests were checked by until now, which is the // property objectui#4006 had to preserve while moving the coverage. - // Measured: no test file here uses `global`, and the seven suites that use - // `@testing-library/jest-dom` matchers `import '@testing-library/jest-dom'` - // explicitly, so its global augmentation reaches the whole program through - // that import (plugin-list's lesson). + // Re-measured here on this program's own resolved file list (objectui#8722 + // round 2) — `tsc -p tsconfig.test.json --listFiles`, never a glob, because + // these tests sit at four different depths and any single glob reads a + // partial population. Of its 161 test files: + // + // - None uses the Node `global` object, and one could not slip in + // unnoticed: injecting `global.setTimeout` into a test file here is + // TS2304, against an unmutated exit 0. That is what keeps `types` unset + // safe on the Node axis, and it is the claim this paragraph rests on. + // - Every one of the 92 files that call `@testing-library/jest-dom` + // matchers now carries its own `import '@testing-library/jest-dom';`, + // so no file's matchers are typed only by a DIFFERENT file's import. + // 119 files carry that import in all; the 27 beyond the 92 do not use + // a matcher themselves. + // + // Those counts are a reading taken once, not a live fact. The instrument + // that re-derives them is `pnpm census:tsconfig-test-parity`, and the + // column that must stay 0 for this package is `leaning`. + // + // What the second point does NOT claim is that any single import is + // load-bearing. The augmentation is still PROGRAM-scoped, so removing any + // proper subset of those 119 imports leaves the program green (measured). + // What changed is that every matcher user is now also a supplier, so no + // file here can be reddened by an edit to a file it does not control. // // `paths` drops the root tsconfig's source-tree mappings so `@object-ui/*` // and `@objectstack/spec/*` resolve through each workspace dependency's