diff --git a/docs/release-workflow.md b/docs/release-workflow.md index 06ccc471b0..68a0dc05d2 100644 --- a/docs/release-workflow.md +++ b/docs/release-workflow.md @@ -94,6 +94,14 @@ flowchart LR #2959 bumped an `apps/docs` dependency and cut 1.0.4. - A **`workflow_dispatch` run always publishes.** That is the escape hatch when a docs-only change has to go out as a release anyway. +- **Tests and stories stay out of `dist/types`.** Every release build shares + `publishedDtsOptions` from `packages/core`, whose `exclude` keeps + `*.stories.*`, `*.test.*`, `src/tests/**` and `e2e/**` out of the declaration + emit; before that, 196 of `@mittwald/flow-remote-react-components@1.1.10`'s + 799 tarball entries were `dist/types/tests/**`, and no `exports` path reached + them. A story's helper still ships (`Button/stories/lib.tsx`), because + `dev/createDocPropertiesJson.ts` parses every `.tsx` under `src/` and ignores + only `*.stories.tsx`. - **The build runs after the version bump.** Both publish workflows version first, then `pnpm build`, then publish. Some bundles bake their own version in at build time (vite `define` over `package.json` — `remote-react-components`' diff --git a/packages/components/vite.build.config.ts b/packages/components/vite.build.config.ts index 1cbb54e97e..b2b4f9488d 100644 --- a/packages/components/vite.build.config.ts +++ b/packages/components/vite.build.config.ts @@ -5,7 +5,7 @@ import { defineConfig, mergeConfig } from "vite"; import { flowComponentsLayerPlugin } from "./dev/vite/flowComponentsLayerPlugin.ts"; import { layerOrderPlugin } from "./dev/vite/layerOrderPlugin.ts"; import { stylesheetVariantsPlugin } from "./dev/vite/stylesheetVariantsPlugin.ts"; -import { preserveUseClientBanner } from "../core"; +import { preserveUseClientBanner, publishedDtsOptions } from "../core"; export default mergeConfig( baseConfig, @@ -65,10 +65,7 @@ export default mergeConfig( externalizeDeps({ except: ["@mittwald/flow-design-tokens/**/*", "@mittwald/flow-core"], }), - dts({ - include: ["src"], - outDirs: "dist/types", - }), + dts(publishedDtsOptions), ], }), ); diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index c59cec4d27..b48e6d4b3e 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -1,2 +1,3 @@ export * from "./preserveUseClientBanner"; +export * from "./publishedDtsOptions"; export * from "./vitestBrowserTestConfig"; diff --git a/packages/core/src/publishedDtsOptions.ts b/packages/core/src/publishedDtsOptions.ts new file mode 100644 index 0000000000..6cf1c2e2cc --- /dev/null +++ b/packages/core/src/publishedDtsOptions.ts @@ -0,0 +1,37 @@ +/** + * The `unplugin-dts` options every package's release build shares. + * + * `include: ["src"]` alone emits declarations for ALL of `src` — stories and + * tests with it. Those are dead files: no `exports` path reaches them, nothing + * imports them, and they made up 196 of the 799 entries in + * `@mittwald/flow-remote-react-components@1.1.10` (#3023). `exclude` keeps them + * out, which also lets the release-relevance guard skip a test-only change + * honestly instead of arguing about tarball membership + * (`.github/scripts/release-relevance-lib.mjs`). + * + * The globs match story and test FILES, not the directories around them. A + * helper beside a story stays: `dev/createDocPropertiesJson.ts` parses every + * `.tsx` under `src/` and ignores only `*.stories.tsx`, so + * `components/Button/stories/lib.tsx` really does contribute to the published + * `dist/assets/doc-properties.json` — five of its entries. Keep this list and + * the guard's denylist in step; they answer the same question. + * + * The globs cannot move into the shared tsconfig preset instead: its `exclude` + * governs `tsc --noEmit` too, and dropping tests from `test:compile` would stop + * type-checking the largest surface in the repository. + * + * `exclude` REPLACES the tsconfig's own list rather than extending it, so + * `node_modules` and `dist` are repeated here. + */ +export const publishedDtsOptions = { + include: ["src"], + exclude: [ + "node_modules/**", + "dist/**", + "**/tests/**", + "**/e2e/**", + "**/*.stories.*", + "**/*.test.*", + ], + outDirs: "dist/types", +}; diff --git a/packages/ext-bridge/package.json b/packages/ext-bridge/package.json index 23e19feb31..b3792baffd 100644 --- a/packages/ext-bridge/package.json +++ b/packages/ext-bridge/package.json @@ -47,6 +47,7 @@ "zod": "^4.4.3" }, "devDependencies": { + "@mittwald/flow-core": "workspace:*", "@mittwald/typescript-config": "workspace:*", "@types/node": "^25.9.3", "@types/react": "^19.2", diff --git a/packages/ext-bridge/vite.build.config.ts b/packages/ext-bridge/vite.build.config.ts index ffa65ab709..ff9aa7d523 100644 --- a/packages/ext-bridge/vite.build.config.ts +++ b/packages/ext-bridge/vite.build.config.ts @@ -3,6 +3,7 @@ import { defineConfig, mergeConfig } from "vite"; import dts from "unplugin-dts/vite"; import { externalizeDeps } from "vite-plugin-externalize-deps"; import baseConfig from "./vite.config"; +import { publishedDtsOptions } from "../core"; export default mergeConfig( baseConfig, @@ -10,10 +11,7 @@ export default mergeConfig( plugins: [ preserveDirectives(), externalizeDeps(), - dts({ - include: ["src"], - outDirs: "dist/types", - }), + dts(publishedDtsOptions), ], build: { minify: false, diff --git a/packages/mstudio-ext-react-components/vite.build.config.ts b/packages/mstudio-ext-react-components/vite.build.config.ts index d86dc90e70..ec87f74541 100644 --- a/packages/mstudio-ext-react-components/vite.build.config.ts +++ b/packages/mstudio-ext-react-components/vite.build.config.ts @@ -1,7 +1,7 @@ import preserveDirectives from "rollup-preserve-directives"; import { defineConfig, mergeConfig } from "vite"; import dts from "unplugin-dts/vite"; -import { preserveUseClientBanner } from "../core"; +import { preserveUseClientBanner, publishedDtsOptions } from "../core"; import { externalizeDeps } from "vite-plugin-externalize-deps"; import baseConfig from "./vite.config"; @@ -32,10 +32,7 @@ export default mergeConfig( plugins: [ preserveDirectives(), externalizeDeps(), - dts({ - include: ["src"], - outDirs: "dist/types", - }), + dts(publishedDtsOptions), ], }), ); diff --git a/packages/react-tunnel/vite.build.config.ts b/packages/react-tunnel/vite.build.config.ts index ea9fa480b7..5eaf9ba7f0 100644 --- a/packages/react-tunnel/vite.build.config.ts +++ b/packages/react-tunnel/vite.build.config.ts @@ -1,18 +1,12 @@ import { defineConfig, mergeConfig } from "vite"; -import { preserveUseClientBanner } from "../core"; +import { preserveUseClientBanner, publishedDtsOptions } from "../core"; import dts from "unplugin-dts/vite"; import baseConfig from "./vite.config"; import { externalizeDeps } from "vite-plugin-externalize-deps"; export default defineConfig( mergeConfig(baseConfig, { - plugins: [ - externalizeDeps(), - dts({ - include: ["src"], - outDirs: "dist/types", - }), - ], + plugins: [externalizeDeps(), dts(publishedDtsOptions)], build: { emptyOutDir: false, lib: { diff --git a/packages/remote-core/package.json b/packages/remote-core/package.json index 807048d678..35e64e26cc 100644 --- a/packages/remote-core/package.json +++ b/packages/remote-core/package.json @@ -36,6 +36,7 @@ }, "devDependencies": { "@mittwald/ext-bridge": "workspace:*", + "@mittwald/flow-core": "workspace:*", "@mittwald/flow-react-components": "workspace:*", "@mittwald/typescript-config": "workspace:*", "@types/node": "^25.9.3", diff --git a/packages/remote-core/vite.build.config.ts b/packages/remote-core/vite.build.config.ts index faefd8cad9..6bc9c90bfd 100644 --- a/packages/remote-core/vite.build.config.ts +++ b/packages/remote-core/vite.build.config.ts @@ -3,6 +3,7 @@ import { defineConfig, mergeConfig } from "vite"; import dts from "unplugin-dts/vite"; import { externalizeDeps } from "vite-plugin-externalize-deps"; import baseConfig from "./vite.config"; +import { publishedDtsOptions } from "../core"; export default mergeConfig( baseConfig, @@ -12,10 +13,7 @@ export default mergeConfig( externalizeDeps({ except: ["@quilted/threads"], }), - dts({ - include: ["src"], - outDirs: "dist/types", - }), + dts(publishedDtsOptions), ], build: { diff --git a/packages/remote-elements/package.json b/packages/remote-elements/package.json index c0eea77c67..d2376d045b 100644 --- a/packages/remote-elements/package.json +++ b/packages/remote-elements/package.json @@ -32,6 +32,7 @@ "type-fest": "^5.7.0" }, "devDependencies": { + "@mittwald/flow-core": "workspace:*", "@mittwald/flow-react-components": "workspace:*", "@mittwald/typescript-config": "workspace:*", "@types/node": "^25.9.3", diff --git a/packages/remote-elements/vite.build.config.ts b/packages/remote-elements/vite.build.config.ts index 4f30a09ac9..9b9c19bbff 100644 --- a/packages/remote-elements/vite.build.config.ts +++ b/packages/remote-elements/vite.build.config.ts @@ -3,6 +3,7 @@ import { defineConfig, mergeConfig } from "vite"; import dts from "unplugin-dts/vite"; import { externalizeDeps } from "vite-plugin-externalize-deps"; import baseConfig from "./vite.config"; +import { publishedDtsOptions } from "../core"; export default mergeConfig( baseConfig, @@ -10,10 +11,7 @@ export default mergeConfig( plugins: [ preserveDirectives(), externalizeDeps(), - dts({ - include: ["src"], - outDirs: "dist/types", - }), + dts(publishedDtsOptions), ], build: { minify: false, diff --git a/packages/remote-react-components/vite.build.config.ts b/packages/remote-react-components/vite.build.config.ts index 1cff480ee2..937cdb768f 100644 --- a/packages/remote-react-components/vite.build.config.ts +++ b/packages/remote-react-components/vite.build.config.ts @@ -1,6 +1,6 @@ import preserveDirectives from "rollup-preserve-directives"; import { mergeConfig } from "vite"; -import { preserveUseClientBanner } from "../core"; +import { preserveUseClientBanner, publishedDtsOptions } from "../core"; import dts from "unplugin-dts/vite"; import { externalizeDeps } from "vite-plugin-externalize-deps"; import baseConfig from "./vite.config"; @@ -29,12 +29,5 @@ export default mergeConfig(baseConfig, { }, }, }, - plugins: [ - preserveDirectives(), - externalizeDeps(), - dts({ - include: ["src"], - outDirs: "dist/types", - }), - ], + plugins: [preserveDirectives(), externalizeDeps(), dts(publishedDtsOptions)], }); diff --git a/packages/remote-react-renderer/vite.build.config.ts b/packages/remote-react-renderer/vite.build.config.ts index 7c84dc8947..dcd6d4193e 100644 --- a/packages/remote-react-renderer/vite.build.config.ts +++ b/packages/remote-react-renderer/vite.build.config.ts @@ -1,6 +1,6 @@ import preserveDirectives from "rollup-preserve-directives"; import { defineConfig, mergeConfig } from "vite"; -import { preserveUseClientBanner } from "../core"; +import { preserveUseClientBanner, publishedDtsOptions } from "../core"; import dts from "unplugin-dts/vite"; import { externalizeDeps } from "vite-plugin-externalize-deps"; import baseConfig from "./vite.config"; @@ -13,10 +13,7 @@ export default mergeConfig( externalizeDeps({ except: [/^@mittwald\/remote-dom-react(?:\/.+)?$/], }), - dts({ - include: ["src"], - outDirs: "dist/types", - }), + dts(publishedDtsOptions), ], build: { minify: false, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f79974859e..65c3b9e29a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -852,6 +852,9 @@ importers: specifier: ^4.4.3 version: 4.4.3 devDependencies: + '@mittwald/flow-core': + specifier: workspace:* + version: link:../core '@mittwald/typescript-config': specifier: workspace:* version: link:../typescript-config @@ -1100,6 +1103,9 @@ importers: '@mittwald/ext-bridge': specifier: workspace:* version: link:../ext-bridge + '@mittwald/flow-core': + specifier: workspace:* + version: link:../core '@mittwald/flow-react-components': specifier: workspace:* version: link:../components @@ -1146,6 +1152,9 @@ importers: specifier: ^5.7.0 version: 5.8.0 devDependencies: + '@mittwald/flow-core': + specifier: workspace:* + version: link:../core '@mittwald/flow-react-components': specifier: workspace:* version: link:../components