diff --git a/apps/ai-studio/src/components/visualize/copy-result-button.spec.tsx b/apps/ai-studio/src/components/visualize/copy-result-button.spec.tsx index e3837defe..2d60950a7 100644 --- a/apps/ai-studio/src/components/visualize/copy-result-button.spec.tsx +++ b/apps/ai-studio/src/components/visualize/copy-result-button.spec.tsx @@ -9,12 +9,6 @@ vi.mock('../../utils/export-visualization', () => ({ copyResult: vi.fn(), })); -declare global { - // eslint-disable-next-line no-var - var IS_REACT_ACT_ENVIRONMENT: boolean; -} -globalThis.IS_REACT_ACT_ENVIRONMENT = true; - async function click(button: HTMLButtonElement) { await act(async () => { button.dispatchEvent(new MouseEvent('click', { bubbles: true })); diff --git a/apps/ai-studio/types.d.ts b/apps/ai-studio/types.d.ts new file mode 100644 index 000000000..7d5b04108 --- /dev/null +++ b/apps/ai-studio/types.d.ts @@ -0,0 +1,7 @@ +declare global { + // React reads this flag to know the test environment wraps updates in act(); vitest.setup.ts sets it. + // eslint-disable-next-line no-var + var IS_REACT_ACT_ENVIRONMENT: boolean; +} + +export {}; diff --git a/apps/ai-studio/vite.config.mts b/apps/ai-studio/vite.config.mts index d2b9039ac..0741fa4ce 100644 --- a/apps/ai-studio/vite.config.mts +++ b/apps/ai-studio/vite.config.mts @@ -37,6 +37,7 @@ export default defineConfig(() => { test: { globals: true, environment: 'jsdom', + setupFiles: ['./vitest.setup.ts'], }, }; }); diff --git a/apps/ai-studio/vitest.setup.ts b/apps/ai-studio/vitest.setup.ts new file mode 100644 index 000000000..ef46f7b26 --- /dev/null +++ b/apps/ai-studio/vitest.setup.ts @@ -0,0 +1 @@ +globalThis.IS_REACT_ACT_ENVIRONMENT = true; diff --git a/packages/ui/src/components/button/nav-button/nav-button.spec.tsx b/packages/ui/src/components/button/nav-button/nav-button.spec.tsx index 53fc52ac5..bf30dc772 100644 --- a/packages/ui/src/components/button/nav-button/nav-button.spec.tsx +++ b/packages/ui/src/components/button/nav-button/nav-button.spec.tsx @@ -3,8 +3,6 @@ import { type Root, createRoot } from 'react-dom/client'; import { NavButton } from './nav-button'; -(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true; - let container: HTMLDivElement; let root: Root; diff --git a/packages/ui/src/components/menu/menu.spec.tsx b/packages/ui/src/components/menu/menu.spec.tsx index e29892976..e49aa33fc 100644 --- a/packages/ui/src/components/menu/menu.spec.tsx +++ b/packages/ui/src/components/menu/menu.spec.tsx @@ -4,8 +4,6 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { Menu } from './menu'; -(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true; - let container: HTMLDivElement; let root: Root; diff --git a/packages/ui/src/components/node/node-description/node-description.spec.tsx b/packages/ui/src/components/node/node-description/node-description.spec.tsx index 3fea8e0b3..4aac0dd90 100644 --- a/packages/ui/src/components/node/node-description/node-description.spec.tsx +++ b/packages/ui/src/components/node/node-description/node-description.spec.tsx @@ -3,8 +3,6 @@ import { type Root, createRoot } from 'react-dom/client'; import { NodeDescription } from './node-description'; -(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true; - let container: HTMLDivElement; let root: Root; diff --git a/packages/ui/src/components/node/node-panel/node-panel.spec.tsx b/packages/ui/src/components/node/node-panel/node-panel.spec.tsx index 7f68c1b80..17bc14be5 100644 --- a/packages/ui/src/components/node/node-panel/node-panel.spec.tsx +++ b/packages/ui/src/components/node/node-panel/node-panel.spec.tsx @@ -4,8 +4,6 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest'; import { NodePanel } from './node-panel'; -(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true; - let container: HTMLDivElement; let root: Root; diff --git a/packages/ui/src/components/segment-picker/segment-picker.spec.tsx b/packages/ui/src/components/segment-picker/segment-picker.spec.tsx index 0e6235ca2..14e89ea3c 100644 --- a/packages/ui/src/components/segment-picker/segment-picker.spec.tsx +++ b/packages/ui/src/components/segment-picker/segment-picker.spec.tsx @@ -3,8 +3,6 @@ import { type Root, createRoot } from 'react-dom/client'; import { SegmentPicker } from './segment-picker'; -(globalThis as typeof globalThis & { IS_REACT_ACT_ENVIRONMENT: boolean }).IS_REACT_ACT_ENVIRONMENT = true; - let container: HTMLDivElement; let root: Root; diff --git a/packages/ui/src/shared/components/field/field.spec.tsx b/packages/ui/src/shared/components/field/field.spec.tsx index 824aea9d4..dee66e335 100644 --- a/packages/ui/src/shared/components/field/field.spec.tsx +++ b/packages/ui/src/shared/components/field/field.spec.tsx @@ -5,12 +5,6 @@ import { Input } from '../../../components/input/input'; import { TextArea } from '../../../components/text-area/text-area'; import { Field } from './field'; -declare global { - // eslint-disable-next-line no-var - var IS_REACT_ACT_ENVIRONMENT: boolean; -} -globalThis.IS_REACT_ACT_ENVIRONMENT = true; - describe('Field', () => { let container: HTMLDivElement; let root: ReturnType; diff --git a/packages/ui/tsconfig.json b/packages/ui/tsconfig.json index 9660df184..a4c8e8971 100644 --- a/packages/ui/tsconfig.json +++ b/packages/ui/tsconfig.json @@ -8,6 +8,6 @@ "@ui/*": ["./src/*"] } }, - "include": ["src", "types.d.ts"], + "include": ["src", "types.d.ts", "vitest.setup.ts"], "exclude": ["node_modules", "dist"] } diff --git a/packages/ui/types.d.ts b/packages/ui/types.d.ts index 11f02fe2a..918af40f1 100644 --- a/packages/ui/types.d.ts +++ b/packages/ui/types.d.ts @@ -1 +1,9 @@ /// + +declare global { + // React reads this flag to know the test environment wraps updates in act(); vitest.setup.ts sets it. + // eslint-disable-next-line no-var + var IS_REACT_ACT_ENVIRONMENT: boolean; +} + +export {}; diff --git a/packages/ui/vite.config.mts b/packages/ui/vite.config.mts index dbe8f62b5..6f98cf072 100644 --- a/packages/ui/vite.config.mts +++ b/packages/ui/vite.config.mts @@ -136,7 +136,7 @@ export default defineConfig({ libInjectCss(), // A stray *.spec.mts in the ts program stalls this build for 15+ minutes // with no output - keep every spec shape excluded. - dts({ entryRoot: 'src', exclude: ['**/*.spec.{ts,tsx,mts}'] }), + dts({ entryRoot: 'src', exclude: ['**/*.spec.{ts,tsx,mts}', 'vitest.setup.ts'] }), copyTokenStyles(), combineCssBundle(rootDirectory), ...(process.env.BUNDLE_STATS ? bundleStatsPlugins() : []), diff --git a/packages/ui/vitest.config.mts b/packages/ui/vitest.config.mts index 0cb68ba90..212b1d723 100644 --- a/packages/ui/vitest.config.mts +++ b/packages/ui/vitest.config.mts @@ -14,5 +14,6 @@ export default defineConfig({ test: { globals: true, environment: 'jsdom', + setupFiles: ['./vitest.setup.ts'], }, }); diff --git a/packages/ui/vitest.setup.ts b/packages/ui/vitest.setup.ts new file mode 100644 index 000000000..ef46f7b26 --- /dev/null +++ b/packages/ui/vitest.setup.ts @@ -0,0 +1 @@ +globalThis.IS_REACT_ACT_ENVIRONMENT = true;