From 5b21983ad09b1ec55fddf0a9c04f4f1c03de13e3 Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 10:22:27 -0400 Subject: [PATCH 01/12] Replace rollup-plugin-dts with dts-bundle-generator for type bundling Uses a two-pass approach to avoid DOM lib vs @types/node conflicts: - Pass 1: TypeScript API emits .d.ts for all workspace files without DOM lib - Pass 2: dts-bundle-generator bundles against emitted .d.ts files with DOM lib, skipping its own compilation pass (allFilesAreDeclarations shortcut) Includes a Yarn patch for dts-bundle-generator to add a missing null check in TypesUsageEvaluator when getImportExportReferencedSymbol returns undefined (triggered by postcss.d.mts exporting from ./postcss.js in bundler mode). Co-Authored-By: Claude Sonnet 4.6 --- ...erator-npm-9.5.1-0927b6826f-8abddebcaa.zip | Bin 0 -> 49031 bytes ...-generator-patch-fdc30fb73d-41c445decf.zip | Bin 0 -> 49039 bytes ...in-dts-npm-6.1.1-f13d240779-8a66833a5a.zip | Bin 52420 -> 0 bytes ...undle-generator-npm-9.5.1-0927b6826f.patch | 14 ++ package.json | 4 +- .../published/esbuild-plugin/package.json | 2 +- packages/published/rollup-plugin/package.json | 2 +- packages/published/rspack-plugin/package.json | 2 +- packages/published/vite-plugin/package.json | 2 +- .../published/webpack-plugin/package.json | 2 +- packages/tools/src/rollupConfig.mjs | 208 ++++++++++++++++-- yarn.lock | 54 +++-- 12 files changed, 243 insertions(+), 47 deletions(-) create mode 100644 .yarn/cache/dts-bundle-generator-npm-9.5.1-0927b6826f-8abddebcaa.zip create mode 100644 .yarn/cache/dts-bundle-generator-patch-fdc30fb73d-41c445decf.zip delete mode 100644 .yarn/cache/rollup-plugin-dts-npm-6.1.1-f13d240779-8a66833a5a.zip create mode 100644 .yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch diff --git a/.yarn/cache/dts-bundle-generator-npm-9.5.1-0927b6826f-8abddebcaa.zip b/.yarn/cache/dts-bundle-generator-npm-9.5.1-0927b6826f-8abddebcaa.zip new file mode 100644 index 0000000000000000000000000000000000000000..5b1c093146e97bfb0dfa8bb4b56103fb9659939a GIT binary patch literal 49031 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ɡTi()}~*O^ByUgV!3 zyc++szvf!O%EN(C6Oa9o-pzn3S7too zd~`Rp#O{(_50uC}dz8j=+Eey!mkPA5)!AsC)Q%ep*I!3+7+$ zOI+9$=U?v2&L`lib>-E4p_m%i$~nyP>1sE?E(A788IhBStNI5p*k>7S3ALza-bC(A zYl%v=7uu~rf=4w-+SxP|DGtC3kTI|!gNP;hKTu*qrpXr&OMJ@=8cNP)R5`|S~Pqj%FuA>`#*@N&POhk5D5(GQ$>kf8N#D?N&+cL1|P_P;itXzmsxERVIOgc#nM zmCQ~MxkUs2s~UDHF7+XLG)gf^PGG`94N@8@9dR-bHq_)V6-YDaGFD%R9U&ie9nwxuV1NfaA>DI`|Kd}Ker`?X`vv*j ziBCa{WBaoW`&|C_1Hfp?BkIO43hAYE2wWP9Q!_mR@89*y%NCEpO-yh!F$>M4XJtG> z9q%8Jhs~sA1-OvUA06#15M3X(ZmvE#ZQ`q7VQ5DUg7v5fP~a{K6`z?pC;#ETXd>48 z<{CK-x15V<@2}${d$Ka~N}J@Zi@vp&>8v3s6`WYY4xz5ZI3GWYR*h9V=j!eOwsu=d z+IHbkyPkx|BP24BIG6ZzpILOv8B2XroI-KET8=wOsPz9L%K&qABmmX0pm4_U-QYg3 zUemv7+NtJ}UpU3Nwo4T~-e5PXJ*X<(3q18}|Me3C#uKRQ>vJ|Q@M}`z>x-{!<~5}C z>jm@cUx4F3s`maKf&9OHl<;pK{k;g;PkTShLDw2uBtN~@3(~(jW%9q+%k?pTdno@H z43!iU6p~gD`f2tL3vWkA`WLgu{8X=T*8g{m)xgx=;k5(JpVRj9ST8=pFV|850BAh? zsYU(MZmy5*?;HJ(1+kg^PtHFbJnc`&>)&I3uU7?--#qxA38_Dg{~W}@G;`U`YrNU{ zb;8B}Vm#Mp=)X6vZ(^u#PHkYSYiwn0?_jELPi<&tXKnX~)Ywn%KMjiUFWh5(%-6TS zIjFyg6aB~8f&XU8@bG#i8NCAl5d90_^-B8x1N=F-Kfm~?Ep;9A|4(l+;8U80H@DFqKRyO_@uleI| z59H@9^cNBNpA+`;^uLv8|HY|S|835H3bwz+yp>q|h0!+oZOqT%{FC6~Ti{#S!C$~; z)87XEFCv6*S#OogezCSKf1CAJ&+rdAW^b8qRh51*TWo)u`9B&_(T=J{oP#{Rdh z|2$o9gnHhx-YV1lVhK9_HtWy*#-BPhZxL@L8-5`oKK(Z0=WzaTiGLArc*}aLA@GZ3 z;{IQ={!>xlE$(fV`!5``=WpZwx0?62u(zcpzhKm1zYY62kAEvPc}se`sr-wSmhn5J zziu(Vwf%Ni^p|b6tlzQyKYOHa4Zn>r{xU4|^>+;aYt8l_%d0=)jc-YBqX551Q02cv c`p=kvtOV$*J{tf4&g+jJ6aWBR^&jv453Jt%M*si- literal 0 HcmV?d00001 diff --git a/.yarn/cache/dts-bundle-generator-patch-fdc30fb73d-41c445decf.zip b/.yarn/cache/dts-bundle-generator-patch-fdc30fb73d-41c445decf.zip new file mode 100644 index 0000000000000000000000000000000000000000..6d29801d538c499f585c20b2d3b263cf212b1e56 GIT binary patch literal 49039 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 G_5T2Eum`;W literal 0 HcmV?d00001 diff --git a/.yarn/cache/rollup-plugin-dts-npm-6.1.1-f13d240779-8a66833a5a.zip b/.yarn/cache/rollup-plugin-dts-npm-6.1.1-f13d240779-8a66833a5a.zip deleted file mode 100644 index e0b9629c348bfded51fbb1dedeaf55e3e7cbc4d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52420 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 diff --git a/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch b/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch new file mode 100644 index 000000000..1140fdcfb --- /dev/null +++ b/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch @@ -0,0 +1,14 @@ +diff --git a/dist/types-usage-evaluator.js b/dist/types-usage-evaluator.js +index a09f141f087b152c34ad9c88e66ed516f8294865..b3eb7f6a799992fe6c15b7caaa17a7eecde24478 100644 +--- a/dist/types-usage-evaluator.js ++++ b/dist/types-usage-evaluator.js +@@ -111,6 +111,9 @@ class TypesUsageEvaluator { + if (ts.isExportDeclaration(node) && node.exportClause !== undefined && ts.isNamedExports(node.exportClause)) { + for (const exportElement of node.exportClause.elements) { + const exportElementSymbol = (0, typescript_1.getImportExportReferencedSymbol)(exportElement, this.typeChecker); ++ if (exportElementSymbol === undefined) { ++ continue; ++ } + // i.e. `import * as NS from './local-module'` + const namespaceImportForElement = (0, typescript_1.getDeclarationsForSymbol)(exportElementSymbol).find(ts.isNamespaceImport); + if (namespaceImportForElement !== undefined) { diff --git a/package.json b/package.json index 6497df222..1e62189d9 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,9 @@ "typescript": "5.4.3" }, "resolutions": { - "rollup": "4.45.1" + "rollup": "4.45.1", + "dts-bundle-generator/typescript": "5.4.3", + "dts-bundle-generator@npm:9.5.1": "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch" }, "packageManager": "yarn@4.10.3" } diff --git a/packages/published/esbuild-plugin/package.json b/packages/published/esbuild-plugin/package.json index 4bf9b407b..b5b242621 100644 --- a/packages/published/esbuild-plugin/package.json +++ b/packages/published/esbuild-plugin/package.json @@ -78,9 +78,9 @@ "@rollup/plugin-terser": "0.4.4", "@types/babel__core": "^7", "@types/babel__preset-env": "^7", + "dts-bundle-generator": "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch", "esbuild": "0.25.8", "rollup": "4.45.1", - "rollup-plugin-dts": "6.1.1", "rollup-plugin-esbuild": "6.1.1", "typescript": "5.4.3" }, diff --git a/packages/published/rollup-plugin/package.json b/packages/published/rollup-plugin/package.json index f261576b7..02cf23f7f 100644 --- a/packages/published/rollup-plugin/package.json +++ b/packages/published/rollup-plugin/package.json @@ -81,9 +81,9 @@ "@rollup/plugin-terser": "0.4.4", "@types/babel__core": "^7", "@types/babel__preset-env": "^7", + "dts-bundle-generator": "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch", "esbuild": "0.25.8", "rollup": "4.45.1", - "rollup-plugin-dts": "6.1.1", "rollup-plugin-esbuild": "6.1.1", "typescript": "5.4.3" }, diff --git a/packages/published/rspack-plugin/package.json b/packages/published/rspack-plugin/package.json index 1af8042c8..f71b19195 100644 --- a/packages/published/rspack-plugin/package.json +++ b/packages/published/rspack-plugin/package.json @@ -78,9 +78,9 @@ "@rollup/plugin-terser": "0.4.4", "@types/babel__core": "^7", "@types/babel__preset-env": "^7", + "dts-bundle-generator": "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch", "esbuild": "0.25.8", "rollup": "4.45.1", - "rollup-plugin-dts": "6.1.1", "rollup-plugin-esbuild": "6.1.1", "typescript": "5.4.3" }, diff --git a/packages/published/vite-plugin/package.json b/packages/published/vite-plugin/package.json index dd89e55c2..dcd54ba28 100644 --- a/packages/published/vite-plugin/package.json +++ b/packages/published/vite-plugin/package.json @@ -78,9 +78,9 @@ "@rollup/plugin-terser": "0.4.4", "@types/babel__core": "^7", "@types/babel__preset-env": "^7", + "dts-bundle-generator": "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch", "esbuild": "0.25.8", "rollup": "4.45.1", - "rollup-plugin-dts": "6.1.1", "rollup-plugin-esbuild": "6.1.1", "typescript": "5.4.3" }, diff --git a/packages/published/webpack-plugin/package.json b/packages/published/webpack-plugin/package.json index c3991ed35..e2402381b 100644 --- a/packages/published/webpack-plugin/package.json +++ b/packages/published/webpack-plugin/package.json @@ -78,9 +78,9 @@ "@rollup/plugin-terser": "0.4.4", "@types/babel__core": "^7", "@types/babel__preset-env": "^7", + "dts-bundle-generator": "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch", "esbuild": "0.25.8", "rollup": "4.45.1", - "rollup-plugin-dts": "6.1.1", "rollup-plugin-esbuild": "6.1.1", "typescript": "5.4.3" }, diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index 4de141171..aa2f429f6 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -16,7 +16,6 @@ import fs from 'fs'; import { glob } from 'glob'; import modulePackage from 'module'; import path from 'path'; -import dts from 'rollup-plugin-dts'; import esbuild from 'rollup-plugin-esbuild'; const CWD = process.env.PROJECT_CWD || process.cwd(); @@ -195,6 +194,192 @@ const getOutput = (packageJson, overrides = {}, options) => { }; }; +/** + * Builds a `paths` mapping for workspace @dd/* packages, pointing to their TypeScript + * source files. This makes TypeScript treat them as project files rather than external + * libraries, so their declarations get emitted in the compilation pass. + * @returns {Record} + */ +const buildDdPaths = () => { + const ddDir = path.join(CWD, 'node_modules/@dd'); + if (!fs.existsSync(ddDir)) { + return {}; + } + /** @type {Record} */ + const paths = {}; + for (const name of fs.readdirSync(ddDir)) { + let realPath; + try { + realPath = fs.realpathSync(path.join(ddDir, name)); + } catch { + continue; + } + const pkgJsonPath = path.join(realPath, 'package.json'); + if (!fs.existsSync(pkgJsonPath)) { + continue; + } + let pkgExports; + try { + pkgExports = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')).exports; + } catch { + continue; + } + if (!pkgExports) { + continue; + } + const relPath = path.relative(CWD, realPath).replace(/\\/g, '/'); + const packageName = `@dd/${name}`; + // Map the main export: "." -> "./src/index.ts" + if (typeof pkgExports['.'] === 'string') { + paths[packageName] = [`${relPath}/${pkgExports['.'].slice(2)}`]; + } + // Map the wildcard export: "./*" -> "./src/*.ts" becomes "@dd/name/*" -> ["rel/src/*"] + if (typeof pkgExports['./*'] === 'string') { + const srcWildcard = pkgExports['./*'] + .replace('./src/', `${relPath}/src/`) + .replace('*.ts', '*'); + paths[`${packageName}/*`] = [srcWildcard]; + } + } + return paths; +}; + +/** + * Converts a source-file paths map to the equivalent .d.ts paths map rooted in outDir. + * Used to redirect dts-bundle-generator to pre-emitted declarations. + * @param {string} outDir + * @param {Record} srcPaths + * @returns {Record} + */ +const buildDtsPaths = (outDir, srcPaths) => { + /** @type {Record} */ + const result = {}; + const rel = path.relative(CWD, outDir).replace(/\\/g, '/'); + for (const [key, values] of Object.entries(srcPaths)) { + result[key] = values.map((v) => { + const dtsV = v.endsWith('.ts') ? v.replace(/\.ts$/, '.d.ts') : v; + return `${rel}/${dtsV}`; + }); + } + return result; +}; + +/** + * Returns a rollup plugin that generates a bundled .d.ts using dts-bundle-generator. + * + * Two-pass approach to avoid DOM lib vs @types/node conflicts: + * Pass 1 — TypeScript API emits .d.ts for all workspace files WITHOUT DOM lib. + * No conflicts because workspace code is Node.js-only. + * Pass 2 — dts-bundle-generator runs against the emitted .d.ts files WITH DOM lib. + * Because all inputs are already .d.ts, dts-bundle-generator skips its own + * compilation pass (compile-dts.js line 143) and goes straight to the + * TypesUsageEvaluator, which needs DOM lib to resolve Window / EventTarget / + * XMLHttpRequest etc. referenced in @datadog/browser-* declarations. + * + * @param {PackageJson} packageJson + * @returns {Plugin} + */ +const getDtsBundlePlugin = (packageJson) => { + let generated = false; + return { + name: 'dts-bundle-generator', + async closeBundle() { + if (generated) { + return; + } + generated = true; + + const { generateDtsBundle } = await import('dts-bundle-generator'); + const { default: ts } = await import('typescript'); + + const safeName = packageJson.name.replace(/[^a-zA-Z0-9]/g, '-'); + const tempDtsDir = path.join(CWD, `dts-tmp-${safeName}`); + const tempEmitConfigPath = path.join(CWD, `tsconfig.dts-emit-${safeName}.json`); + const tempBundleConfigPath = path.join(CWD, `tsconfig.dts-${safeName}.json`); + + const ddSrcPaths = buildDdPaths(); + + // Pass 1: emit .d.ts for all workspace files reachable from the entry, + // using the root tsconfig (lib: es2022, no DOM) so there are no conflicts. + fs.writeFileSync( + tempEmitConfigPath, + JSON.stringify({ + extends: './tsconfig.json', + compilerOptions: { + noEmit: false, + declaration: true, + emitDeclarationOnly: true, + outDir: `./dts-tmp-${safeName}`, + paths: ddSrcPaths, + }, + }), + ); + + const configFile = ts.readConfigFile(tempEmitConfigPath, ts.sys.readFile); + const parsedConfig = ts.parseJsonConfigFileContent( + configFile.config, + ts.sys, + CWD, + {}, + tempEmitConfigPath, + ); + const emitHost = ts.createCompilerHost(parsedConfig.options); + const emitProgram = ts.createProgram( + [path.resolve('src/index.ts')], + parsedConfig.options, + emitHost, + ); + emitProgram.emit(undefined, undefined, undefined, true); + + // Pass 2: run dts-bundle-generator against the emitted .d.ts files. + // DOM lib is needed for browser SDK types (Window, EventTarget, XMLHttpRequest …). + // Because the entry is now a .d.ts file, dts-bundle-generator's + // getDeclarationFiles detects allFilesAreDeclarations and skips its first + // compilation pass — so DOM vs Node.js type conflicts never arise. + const ddDtsPaths = buildDtsPaths(tempDtsDir, ddSrcPaths); + + const entryRelPath = path.relative(CWD, path.resolve('src/index.ts')); + const entryDtsPath = path.join(tempDtsDir, entryRelPath.replace(/\.ts$/, '.d.ts')); + + fs.writeFileSync( + tempBundleConfigPath, + JSON.stringify({ + extends: './tsconfig.json', + compilerOptions: { + lib: ['es2022', 'dom'], + paths: ddDtsPaths, + }, + }), + ); + + try { + const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); + const [result] = generateDtsBundle( + [ + { + filePath: entryDtsPath, + output: { noBanner: true }, + }, + ], + { preferredConfigPath: tempBundleConfigPath }, + ); + + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + fs.writeFileSync(outputPath, result); + } finally { + for (const p of [tempEmitConfigPath, tempBundleConfigPath]) { + if (fs.existsSync(p)) { + fs.unlinkSync(p); + } + } + if (fs.existsSync(tempDtsDir)) { + fs.rmSync(tempDtsDir, { recursive: true, force: true }); + } + } + }, + }; +}; + /** * @param {any | null} ddPlugin * @param {PackageJson} packageJson @@ -263,10 +448,11 @@ export const getDefaultBuildConfigs = async (packageJson, options) => { // Plugins to use. const mainBundlePlugins = [esbuild()]; - const dtsBundlePlugins = [dts()]; if (ddPlugin) { mainBundlePlugins.push(ddPlugin(getPluginConfig(bundlerName, packageJson.name, true))); - dtsBundlePlugins.push(ddPlugin(getPluginConfig(bundlerName, `dts:${packageJson.name}`))); + } + if (!isBasicBuild && !process.env.NO_TYPES) { + mainBundlePlugins.push(getDtsBundlePlugin(packageJson)); } // Sub builds. @@ -285,19 +471,5 @@ export const getDefaultBuildConfigs = async (packageJson, options) => { output: mainBundleOutputs, }); - const configs = [mainBundleConfig, ...subBuilds]; - - // Bundle type definitions. - if (!isBasicBuild && !process.env.NO_TYPES) { - configs.push( - // FIXME: This build is sloooow. - bundle(packageJson, { - plugins: dtsBundlePlugins, - output: { - dir: 'dist/src', - }, - }), - ); - } - return configs; + return [mainBundleConfig, ...subBuilds]; }; diff --git a/yarn.lock b/yarn.lock index bdf6628b2..9277eaa34 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1699,6 +1699,7 @@ __metadata: "@types/babel__preset-env": "npm:^7" async-retry: "npm:1.3.3" chalk: "npm:2.3.1" + dts-bundle-generator: "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch" esbuild: "npm:0.25.8" eslint-scope: "npm:7.2.2" glob: "npm:11.1.0" @@ -1708,7 +1709,6 @@ __metadata: p-queue: "npm:6.6.2" pretty-bytes: "npm:5.6.0" rollup: "npm:4.45.1" - rollup-plugin-dts: "npm:6.1.1" rollup-plugin-esbuild: "npm:6.1.1" simple-git: "npm:3.36.0" typescript: "npm:5.4.3" @@ -1759,6 +1759,7 @@ __metadata: "@types/babel__preset-env": "npm:^7" async-retry: "npm:1.3.3" chalk: "npm:2.3.1" + dts-bundle-generator: "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch" esbuild: "npm:0.25.8" eslint-scope: "npm:7.2.2" glob: "npm:11.1.0" @@ -1768,7 +1769,6 @@ __metadata: p-queue: "npm:6.6.2" pretty-bytes: "npm:5.6.0" rollup: "npm:4.45.1" - rollup-plugin-dts: "npm:6.1.1" rollup-plugin-esbuild: "npm:6.1.1" simple-git: "npm:3.36.0" typescript: "npm:5.4.3" @@ -1812,6 +1812,7 @@ __metadata: "@types/babel__preset-env": "npm:^7" async-retry: "npm:1.3.3" chalk: "npm:2.3.1" + dts-bundle-generator: "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch" esbuild: "npm:0.25.8" eslint-scope: "npm:7.2.2" glob: "npm:11.1.0" @@ -1821,7 +1822,6 @@ __metadata: p-queue: "npm:6.6.2" pretty-bytes: "npm:5.6.0" rollup: "npm:4.45.1" - rollup-plugin-dts: "npm:6.1.1" rollup-plugin-esbuild: "npm:6.1.1" simple-git: "npm:3.36.0" typescript: "npm:5.4.3" @@ -1865,6 +1865,7 @@ __metadata: "@types/babel__preset-env": "npm:^7" async-retry: "npm:1.3.3" chalk: "npm:2.3.1" + dts-bundle-generator: "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch" esbuild: "npm:0.25.8" eslint-scope: "npm:7.2.2" glob: "npm:11.1.0" @@ -1874,7 +1875,6 @@ __metadata: p-queue: "npm:6.6.2" pretty-bytes: "npm:5.6.0" rollup: "npm:4.45.1" - rollup-plugin-dts: "npm:6.1.1" rollup-plugin-esbuild: "npm:6.1.1" simple-git: "npm:3.36.0" typescript: "npm:5.4.3" @@ -1918,6 +1918,7 @@ __metadata: "@types/babel__preset-env": "npm:^7" async-retry: "npm:1.3.3" chalk: "npm:2.3.1" + dts-bundle-generator: "patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch" esbuild: "npm:0.25.8" eslint-scope: "npm:7.2.2" glob: "npm:11.1.0" @@ -1927,7 +1928,6 @@ __metadata: p-queue: "npm:6.6.2" pretty-bytes: "npm:5.6.0" rollup: "npm:4.45.1" - rollup-plugin-dts: "npm:6.1.1" rollup-plugin-esbuild: "npm:6.1.1" simple-git: "npm:3.36.0" typescript: "npm:5.4.3" @@ -5956,6 +5956,30 @@ __metadata: languageName: node linkType: hard +"dts-bundle-generator@npm:9.5.1": + version: 9.5.1 + resolution: "dts-bundle-generator@npm:9.5.1" + dependencies: + typescript: "npm:>=5.0.2" + yargs: "npm:^17.6.0" + bin: + dts-bundle-generator: dist/bin/dts-bundle-generator.js + checksum: 10/8abddebcaab0d542afcb62971526beb5ea09f977b92cb06723e6046bde7d2bc9513c8508b937f62d7a46b28827b26fda4c31ed85fe2902e01685741f823a50eb + languageName: node + linkType: hard + +"dts-bundle-generator@patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch": + version: 9.5.1 + resolution: "dts-bundle-generator@patch:dts-bundle-generator@npm%3A9.5.1#~/.yarn/patches/dts-bundle-generator-npm-9.5.1-0927b6826f.patch::version=9.5.1&hash=e63d7e" + dependencies: + typescript: "npm:>=5.0.2" + yargs: "npm:^17.6.0" + bin: + dts-bundle-generator: dist/bin/dts-bundle-generator.js + checksum: 10/41c445decf3c4e083526e89bf0c6729cc12d6e2823ca79eade3ae9c0106813408b3fa5a3add226cd5323d287a71faf3b2a2ab9a841b1f76fcc5abfb3514d74e6 + languageName: node + linkType: hard + "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -8773,7 +8797,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:0.30.21, magic-string@npm:^0.30.10, magic-string@npm:^0.30.3": +"magic-string@npm:0.30.21, magic-string@npm:^0.30.3": version: 0.30.21 resolution: "magic-string@npm:0.30.21" dependencies: @@ -9889,22 +9913,6 @@ __metadata: languageName: node linkType: hard -"rollup-plugin-dts@npm:6.1.1": - version: 6.1.1 - resolution: "rollup-plugin-dts@npm:6.1.1" - dependencies: - "@babel/code-frame": "npm:^7.24.2" - magic-string: "npm:^0.30.10" - peerDependencies: - rollup: ^3.29.4 || ^4 - typescript: ^4.5 || ^5.0 - dependenciesMeta: - "@babel/code-frame": - optional: true - checksum: 10/8a66833a5af32f77d9bbc746339097d4af2382e5160f7629d85dcecb4efad12cbfebd37c79147fa688f073c333d71f53135e08a225a3fc3e9a3b3f92c46b2381 - languageName: node - linkType: hard - "rollup-plugin-esbuild@npm:6.1.1": version: 6.1.1 resolution: "rollup-plugin-esbuild@npm:6.1.1" @@ -11467,7 +11475,7 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^17.7.2": +"yargs@npm:^17.6.0, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" dependencies: From 880dcce342faf2c3ce05c5ff4eeb264c120989b9 Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 14:45:58 -0400 Subject: [PATCH 02/12] Clean RUM Browser SDK types --- packages/plugins/rum/package.json | 1 + packages/plugins/rum/src/browserSdkTypes.ts | 5 +++++ packages/plugins/rum/src/index.ts | 3 ++- packages/plugins/rum/src/types.ts | 8 +------- yarn.lock | 1 + 5 files changed, 10 insertions(+), 8 deletions(-) create mode 100644 packages/plugins/rum/src/browserSdkTypes.ts diff --git a/packages/plugins/rum/package.json b/packages/plugins/rum/package.json index 15beca2e9..ef0bbc0d9 100644 --- a/packages/plugins/rum/package.json +++ b/packages/plugins/rum/package.json @@ -40,6 +40,7 @@ }, "devDependencies": { "@datadog/browser-rum": "6.26.0", + "@datadog/browser-rum-core": "6.26.0", "typescript": "5.4.3" } } diff --git a/packages/plugins/rum/src/browserSdkTypes.ts b/packages/plugins/rum/src/browserSdkTypes.ts new file mode 100644 index 000000000..298bf2f80 --- /dev/null +++ b/packages/plugins/rum/src/browserSdkTypes.ts @@ -0,0 +1,5 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +export type { RumPublicApi, RumInitConfiguration } from '@datadog/browser-rum-core'; diff --git a/packages/plugins/rum/src/index.ts b/packages/plugins/rum/src/index.ts index 0bf029795..5803130aa 100644 --- a/packages/plugins/rum/src/index.ts +++ b/packages/plugins/rum/src/index.ts @@ -6,11 +6,12 @@ import type { PluginOptions, GetPlugins } from '@dd/core/types'; import { InjectPosition } from '@dd/core/types'; import path from 'path'; +import type { RumInitConfiguration, RumPublicApi } from './browserSdkTypes'; import { CONFIG_KEY, PLUGIN_NAME } from './constants'; import { getSourceCodeContextSnippet } from './getSourceCodeContextSnippet'; import { getPrivacyPlugin } from './privacy'; import { getInjectionValue } from './sdk'; -import type { RumOptions, RumOptionsWithSdk, RumPublicApi, RumInitConfiguration } from './types'; +import type { RumOptions, RumOptionsWithSdk } from './types'; import { validateOptions } from './validate'; export { CONFIG_KEY, PLUGIN_NAME }; diff --git a/packages/plugins/rum/src/types.ts b/packages/plugins/rum/src/types.ts index 1a8e6bfd6..75d8dca75 100644 --- a/packages/plugins/rum/src/types.ts +++ b/packages/plugins/rum/src/types.ts @@ -2,12 +2,9 @@ // This product includes software developed at Datadog (https://www.datadoghq.com/). // Copyright 2019-Present Datadog, Inc. -import type { - datadogRum, - RumInitConfiguration as ExpRumInitConfiguration, -} from '@datadog/browser-rum'; import type { Assign } from '@dd/core/types'; +import type { RumInitConfiguration } from './browserSdkTypes'; import type { PrivacyOptions, PrivacyOptionsWithDefaults } from './privacy/types'; export type SourceCodeContextOptions = { @@ -22,9 +19,6 @@ export type RumOptions = { sourceCodeContext?: SourceCodeContextOptions; }; -export type RumPublicApi = typeof datadogRum; -export type RumInitConfiguration = ExpRumInitConfiguration; - export type SDKOptions = Assign< RumInitConfiguration, { diff --git a/yarn.lock b/yarn.lock index 9277eaa34..9be4e5c3f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2170,6 +2170,7 @@ __metadata: resolution: "@dd/rum-plugin@workspace:packages/plugins/rum" dependencies: "@datadog/browser-rum": "npm:6.26.0" + "@datadog/browser-rum-core": "npm:6.26.0" "@datadog/js-instrumentation-wasm": "npm:1.0.8" "@dd/core": "workspace:*" chalk: "npm:2.3.1" From d9244f831c0043ef93168eb2f358dcb66f4c413a Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 14:48:14 -0400 Subject: [PATCH 03/12] Move dts bundle artifacts to tmpdir and configure libraries - Emit temp .d.ts files and tsconfigs to os.tmpdir() to avoid cluttering CWD - Symlink project node_modules into the temp dir so TypeScript can resolve external packages from emitted files - Use absolute paths for tsconfig extends since the temp configs live outside the project - Configure inlinedLibraries (@datadog/browser-rum-core, @datadog/browser-core) vs importedLibraries (peer/runtime deps) for dts-bundle-generator - Update LICENSES-3rdparty.csv to swap rollup-plugin-dts for dts-bundle-generator --- LICENSES-3rdparty.csv | 2 +- packages/tools/src/rollupConfig.mjs | 30 +++++++++++++++++++++++------ 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/LICENSES-3rdparty.csv b/LICENSES-3rdparty.csv index bf8d6bdf0..14663b876 100644 --- a/LICENSES-3rdparty.csv +++ b/LICENSES-3rdparty.csv @@ -373,6 +373,7 @@ diff,npm,BSD-3-Clause,(https://www.npmjs.com/package/diff) diff-sequences,npm,MIT,(https://www.npmjs.com/package/diff-sequences) dir-glob,npm,MIT,Kevin Mårtensson (github.com/kevva) doctrine,npm,Apache-2.0,(https://github.com/eslint/doctrine) +dts-bundle-generator,patch,MIT,Evgeniy Timokhov (https://github.com/timocov/dts-bundle-generator) eastasianwidth,npm,MIT,Masaki Komagata (https://www.npmjs.com/package/eastasianwidth) ecc-jsbn,npm,MIT,Jeremie Miller (https://github.com/quartzjer/ecc-jsbn) ejs,npm,Apache-2.0,Matthew Eernisse (https://github.com/mde/ejs) @@ -696,7 +697,6 @@ retry,npm,MIT,Tim Koschützki (https://github.com/tim-kos/node-retry) reusify,npm,MIT,Matteo Collina (https://github.com/mcollina/reusify#readme) rimraf,npm,ISC,Isaac Z. Schlueter (http://blog.izs.me/) rollup,npm,MIT,Rich Harris (https://rollupjs.org/) -rollup-plugin-dts,virtual,LGPL-3.0-only,Arpad Borsos (https://github.com/Swatinem/rollup-plugin-dts#readme) rollup-plugin-esbuild,virtual,MIT,EGOIST (https://www.npmjs.com/package/rollup-plugin-esbuild) rollup-plugin-import-css,virtual,MIT,Jacob Leeson (https://github.com/jleeson/rollup-plugin-import-css#readme) run-parallel,npm,MIT,Feross Aboukhadijeh (https://github.com/feross/run-parallel) diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index aa2f429f6..1e093ae48 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -15,6 +15,7 @@ import cp from 'child_process'; import fs from 'fs'; import { glob } from 'glob'; import modulePackage from 'module'; +import os from 'os'; import path from 'path'; import esbuild from 'rollup-plugin-esbuild'; @@ -293,23 +294,31 @@ const getDtsBundlePlugin = (packageJson) => { const { default: ts } = await import('typescript'); const safeName = packageJson.name.replace(/[^a-zA-Z0-9]/g, '-'); - const tempDtsDir = path.join(CWD, `dts-tmp-${safeName}`); - const tempEmitConfigPath = path.join(CWD, `tsconfig.dts-emit-${safeName}.json`); - const tempBundleConfigPath = path.join(CWD, `tsconfig.dts-${safeName}.json`); + const tempDtsDir = path.join(os.tmpdir(), `dts-tmp-${safeName}`); + const tempEmitConfigPath = path.join(os.tmpdir(), `tsconfig.dts-emit-${safeName}.json`); + const tempBundleConfigPath = path.join(os.tmpdir(), `tsconfig.dts-${safeName}.json`); const ddSrcPaths = buildDdPaths(); + // Symlink the project's node_modules so TypeScript can resolve external packages + // (unplugin, webpack, etc.) from files emitted into the temp dir. + fs.mkdirSync(tempDtsDir, { recursive: true }); + const tempNodeModulesLink = path.join(tempDtsDir, 'node_modules'); + if (!fs.existsSync(tempNodeModulesLink)) { + fs.symlinkSync(path.join(CWD, 'node_modules'), tempNodeModulesLink); + } + // Pass 1: emit .d.ts for all workspace files reachable from the entry, // using the root tsconfig (lib: es2022, no DOM) so there are no conflicts. fs.writeFileSync( tempEmitConfigPath, JSON.stringify({ - extends: './tsconfig.json', + extends: path.join(CWD, 'tsconfig.json'), compilerOptions: { noEmit: false, declaration: true, emitDeclarationOnly: true, - outDir: `./dts-tmp-${safeName}`, + outDir: tempDtsDir, paths: ddSrcPaths, }, }), @@ -344,7 +353,7 @@ const getDtsBundlePlugin = (packageJson) => { fs.writeFileSync( tempBundleConfigPath, JSON.stringify({ - extends: './tsconfig.json', + extends: path.join(CWD, 'tsconfig.json'), compilerOptions: { lib: ['es2022', 'dom'], paths: ddDtsPaths, @@ -354,11 +363,20 @@ const getDtsBundlePlugin = (packageJson) => { try { const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); + const inlinedLibraries = ['@datadog/browser-rum-core', '@datadog/browser-core']; + const importedLibraries = [ + ...Object.keys(packageJson.peerDependencies || {}), + ...Object.keys(packageJson.dependencies || {}), + ].filter((name) => !inlinedLibraries.includes(name)); const [result] = generateDtsBundle( [ { filePath: entryDtsPath, output: { noBanner: true }, + libraries: { + inlinedLibraries, + importedLibraries, + }, }, ], { preferredConfigPath: tempBundleConfigPath }, From 62f0ec24a233a386719348d1aa53f8c5e8c6cf60 Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 15:37:45 -0400 Subject: [PATCH 04/12] Simplify dts bundle plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Emit temp files inside the project (`.dts-tmp-/`) so TypeScript finds node_modules by walking up — drops the symlink hack. - Hoist `dts-bundle-generator` and `typescript` to top-level imports. - Drop the `generated` flag; Rollup calls `closeBundle` once per bundle. - Wrap the whole mkdir → emit → bundle flow in `try/finally` so an error mid-build doesn't leak temp dirs. - Co-locate both tsconfigs inside the temp dir, single cleanup target. Co-Authored-By: Claude Opus 4.7 (1M context) --- .gitignore | 1 + packages/tools/src/rollupConfig.mjs | 100 +++++++++++----------------- 2 files changed, 40 insertions(+), 61 deletions(-) diff --git a/.gitignore b/.gitignore index ed993498c..0934134d2 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ yarn-error.log node_modules/ dist/ dist-basic/ +.dts-tmp-*/ .vitrine/* !.vitrine/project.json diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index 1e093ae48..b54769eb2 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -12,12 +12,13 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import terser from '@rollup/plugin-terser'; import chalk from 'chalk'; import cp from 'child_process'; +import { generateDtsBundle } from 'dts-bundle-generator'; import fs from 'fs'; import { glob } from 'glob'; import modulePackage from 'module'; -import os from 'os'; import path from 'path'; import esbuild from 'rollup-plugin-esbuild'; +import ts from 'typescript'; const CWD = process.env.PROJECT_CWD || process.cwd(); const ROLLUP_PLUGIN_PATH = 'rollup-plugin/dist-basic/src'; @@ -280,36 +281,22 @@ const buildDtsPaths = (outDir, srcPaths) => { * @param {PackageJson} packageJson * @returns {Plugin} */ -const getDtsBundlePlugin = (packageJson) => { - let generated = false; - return { - name: 'dts-bundle-generator', - async closeBundle() { - if (generated) { - return; - } - generated = true; - - const { generateDtsBundle } = await import('dts-bundle-generator'); - const { default: ts } = await import('typescript'); - - const safeName = packageJson.name.replace(/[^a-zA-Z0-9]/g, '-'); - const tempDtsDir = path.join(os.tmpdir(), `dts-tmp-${safeName}`); - const tempEmitConfigPath = path.join(os.tmpdir(), `tsconfig.dts-emit-${safeName}.json`); - const tempBundleConfigPath = path.join(os.tmpdir(), `tsconfig.dts-${safeName}.json`); - +const getDtsBundlePlugin = (packageJson) => ({ + name: 'dts-bundle-generator', + async closeBundle() { + const safeName = packageJson.name.replace(/[^a-zA-Z0-9]/g, '-'); + const tempDtsDir = path.join(CWD, `.dts-tmp-${safeName}`); + const tempEmitConfigPath = path.join(tempDtsDir, 'tsconfig.emit.json'); + const tempBundleConfigPath = path.join(tempDtsDir, 'tsconfig.bundle.json'); + + fs.mkdirSync(tempDtsDir, { recursive: true }); + try { const ddSrcPaths = buildDdPaths(); - // Symlink the project's node_modules so TypeScript can resolve external packages - // (unplugin, webpack, etc.) from files emitted into the temp dir. - fs.mkdirSync(tempDtsDir, { recursive: true }); - const tempNodeModulesLink = path.join(tempDtsDir, 'node_modules'); - if (!fs.existsSync(tempNodeModulesLink)) { - fs.symlinkSync(path.join(CWD, 'node_modules'), tempNodeModulesLink); - } - // Pass 1: emit .d.ts for all workspace files reachable from the entry, // using the root tsconfig (lib: es2022, no DOM) so there are no conflicts. + // Sitting inside the project tree means TypeScript resolves external + // packages (unplugin, webpack, …) by walking up to /node_modules. fs.writeFileSync( tempEmitConfigPath, JSON.stringify({ @@ -361,42 +348,33 @@ const getDtsBundlePlugin = (packageJson) => { }), ); - try { - const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); - const inlinedLibraries = ['@datadog/browser-rum-core', '@datadog/browser-core']; - const importedLibraries = [ - ...Object.keys(packageJson.peerDependencies || {}), - ...Object.keys(packageJson.dependencies || {}), - ].filter((name) => !inlinedLibraries.includes(name)); - const [result] = generateDtsBundle( - [ - { - filePath: entryDtsPath, - output: { noBanner: true }, - libraries: { - inlinedLibraries, - importedLibraries, - }, + const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); + const inlinedLibraries = ['@datadog/browser-rum-core', '@datadog/browser-core']; + const importedLibraries = [ + ...Object.keys(packageJson.peerDependencies || {}), + ...Object.keys(packageJson.dependencies || {}), + ].filter((name) => !inlinedLibraries.includes(name)); + const [result] = generateDtsBundle( + [ + { + filePath: entryDtsPath, + output: { noBanner: true }, + libraries: { + inlinedLibraries, + importedLibraries, }, - ], - { preferredConfigPath: tempBundleConfigPath }, - ); + }, + ], + { preferredConfigPath: tempBundleConfigPath }, + ); - fs.mkdirSync(path.dirname(outputPath), { recursive: true }); - fs.writeFileSync(outputPath, result); - } finally { - for (const p of [tempEmitConfigPath, tempBundleConfigPath]) { - if (fs.existsSync(p)) { - fs.unlinkSync(p); - } - } - if (fs.existsSync(tempDtsDir)) { - fs.rmSync(tempDtsDir, { recursive: true, force: true }); - } - } - }, - }; -}; + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + fs.writeFileSync(outputPath, result); + } finally { + fs.rmSync(tempDtsDir, { recursive: true, force: true }); + } + }, +}); /** * @param {any | null} ddPlugin From 44ab2c3fc00c3d8693b2a38c4f85f610a6b05f1c Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 15:54:16 -0400 Subject: [PATCH 05/12] Trim dts bundle plugin MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Skip pass 1's tsconfig file write — feed the parsed root config to `ts.parseJsonConfigFileContent` directly and merge overrides in the `createProgram` call. - Drop redundant `emitOnlyDtsFiles=true` (already implied by `emitDeclarationOnly`) and the explicit `createCompilerHost` (`createProgram` builds its own). - Hoist `entrySrcPath` / `entryDtsPath` and drop `|| {}` defensives on `peerDependencies`/`dependencies` since the typedef declares them. - Tighten the doc block and inline notes. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/tools/src/rollupConfig.mjs | 99 ++++++++++++----------------- 1 file changed, 39 insertions(+), 60 deletions(-) diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index b54769eb2..c11dccb34 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -270,13 +270,15 @@ const buildDtsPaths = (outDir, srcPaths) => { * Returns a rollup plugin that generates a bundled .d.ts using dts-bundle-generator. * * Two-pass approach to avoid DOM lib vs @types/node conflicts: - * Pass 1 — TypeScript API emits .d.ts for all workspace files WITHOUT DOM lib. - * No conflicts because workspace code is Node.js-only. - * Pass 2 — dts-bundle-generator runs against the emitted .d.ts files WITH DOM lib. - * Because all inputs are already .d.ts, dts-bundle-generator skips its own - * compilation pass (compile-dts.js line 143) and goes straight to the - * TypesUsageEvaluator, which needs DOM lib to resolve Window / EventTarget / - * XMLHttpRequest etc. referenced in @datadog/browser-* declarations. + * Pass 1 — TypeScript emits .d.ts for workspace files without DOM lib (no conflicts + * because workspace code is Node.js-only). + * Pass 2 — dts-bundle-generator runs against the emitted .d.ts with DOM lib enabled. + * Because every reachable file is a .d.ts (entry + @dd/* redirected via + * `paths`), it hits the `allFilesAreDeclarations` shortcut in + * compile-dts.js and skips its own compilation — so DOM vs Node.js type + * conflicts never arise. DOM lib is still needed at this stage so the + * TypesUsageEvaluator can resolve Window / EventTarget / XMLHttpRequest + * etc. referenced in @datadog/browser-* declarations. * * @param {PackageJson} packageJson * @returns {Plugin} @@ -286,88 +288,65 @@ const getDtsBundlePlugin = (packageJson) => ({ async closeBundle() { const safeName = packageJson.name.replace(/[^a-zA-Z0-9]/g, '-'); const tempDtsDir = path.join(CWD, `.dts-tmp-${safeName}`); - const tempEmitConfigPath = path.join(tempDtsDir, 'tsconfig.emit.json'); const tempBundleConfigPath = path.join(tempDtsDir, 'tsconfig.bundle.json'); + const entrySrcPath = path.resolve('src/index.ts'); + const entryDtsPath = path.join( + tempDtsDir, + path.relative(CWD, entrySrcPath).replace(/\.ts$/, '.d.ts'), + ); fs.mkdirSync(tempDtsDir, { recursive: true }); try { + // `paths` maps @dd/* to .ts sources for pass 1 (so emit lands them + // under tempDtsDir) and to the emitted .d.ts for pass 2 (so every + // reachable file is a declaration). const ddSrcPaths = buildDdPaths(); - // Pass 1: emit .d.ts for all workspace files reachable from the entry, - // using the root tsconfig (lib: es2022, no DOM) so there are no conflicts. - // Sitting inside the project tree means TypeScript resolves external - // packages (unplugin, webpack, …) by walking up to /node_modules. - fs.writeFileSync( - tempEmitConfigPath, - JSON.stringify({ - extends: path.join(CWD, 'tsconfig.json'), - compilerOptions: { - noEmit: false, - declaration: true, - emitDeclarationOnly: true, - outDir: tempDtsDir, - paths: ddSrcPaths, - }, - }), - ); - - const configFile = ts.readConfigFile(tempEmitConfigPath, ts.sys.readFile); - const parsedConfig = ts.parseJsonConfigFileContent( - configFile.config, - ts.sys, - CWD, - {}, - tempEmitConfigPath, - ); - const emitHost = ts.createCompilerHost(parsedConfig.options); - const emitProgram = ts.createProgram( - [path.resolve('src/index.ts')], - parsedConfig.options, - emitHost, - ); - emitProgram.emit(undefined, undefined, undefined, true); - - // Pass 2: run dts-bundle-generator against the emitted .d.ts files. - // DOM lib is needed for browser SDK types (Window, EventTarget, XMLHttpRequest …). - // Because the entry is now a .d.ts file, dts-bundle-generator's - // getDeclarationFiles detects allFilesAreDeclarations and skips its first - // compilation pass — so DOM vs Node.js type conflicts never arise. - const ddDtsPaths = buildDtsPaths(tempDtsDir, ddSrcPaths); - - const entryRelPath = path.relative(CWD, path.resolve('src/index.ts')); - const entryDtsPath = path.join(tempDtsDir, entryRelPath.replace(/\.ts$/, '.d.ts')); - + // Pass 1 — emit. + const rootConfig = ts.readConfigFile( + path.join(CWD, 'tsconfig.json'), + ts.sys.readFile, + ).config; + const parsedConfig = ts.parseJsonConfigFileContent(rootConfig, ts.sys, CWD); + ts.createProgram([entrySrcPath], { + ...parsedConfig.options, + noEmit: false, + declaration: true, + emitDeclarationOnly: true, + outDir: tempDtsDir, + paths: ddSrcPaths, + }).emit(); + + // Pass 2 — bundle. dts-bundle-generator requires a real tsconfig path, + // so this one stays on disk. fs.writeFileSync( tempBundleConfigPath, JSON.stringify({ extends: path.join(CWD, 'tsconfig.json'), compilerOptions: { lib: ['es2022', 'dom'], - paths: ddDtsPaths, + paths: buildDtsPaths(tempDtsDir, ddSrcPaths), }, }), ); - const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); const inlinedLibraries = ['@datadog/browser-rum-core', '@datadog/browser-core']; const importedLibraries = [ - ...Object.keys(packageJson.peerDependencies || {}), - ...Object.keys(packageJson.dependencies || {}), + ...Object.keys(packageJson.peerDependencies), + ...Object.keys(packageJson.dependencies), ].filter((name) => !inlinedLibraries.includes(name)); const [result] = generateDtsBundle( [ { filePath: entryDtsPath, output: { noBanner: true }, - libraries: { - inlinedLibraries, - importedLibraries, - }, + libraries: { inlinedLibraries, importedLibraries }, }, ], { preferredConfigPath: tempBundleConfigPath }, ); + const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); fs.mkdirSync(path.dirname(outputPath), { recursive: true }); fs.writeFileSync(outputPath, result); } finally { From 20d39ea3a453353904743625262509c9a47042bc Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 16:01:37 -0400 Subject: [PATCH 06/12] Stop exporting inlined internal types MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dts-bundle-generator's default `exportReferencedTypes: true` was preserving the `export` modifier on every type it inlined from `@datadog/browser-rum-core` / `@datadog/browser-core`, leaking ~280 internal types (Site, BufferedObservable, Encoder, TraceContextInjection, …) as part of our public API. Setting it to `false` keeps the documented surface (`VitePluginOptions`, `datadogVitePlugin`, `*Types`, `helpers`) exported and demotes everything else to `declare`, so structural lookups like `RumTypes['RumInitConfiguration']` still work but `import { Site } from '@datadog/vite-plugin'` no longer compiles. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/tools/src/rollupConfig.mjs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index c11dccb34..1855f2315 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -339,7 +339,10 @@ const getDtsBundlePlugin = (packageJson) => ({ [ { filePath: entryDtsPath, - output: { noBanner: true }, + // `exportReferencedTypes: false` keeps internal types from + // `@datadog/browser-*` as `declare` rather than `export`, + // so they don't pollute our public API surface. + output: { noBanner: true, exportReferencedTypes: false }, libraries: { inlinedLibraries, importedLibraries }, }, ], From c88b966d5373831b05b5bf996dfa8e6693266a8d Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 16:42:14 -0400 Subject: [PATCH 07/12] Declare workspace paths in root tsconfig Move the @dd/* `paths` map from a runtime `buildDdPaths()` fs walk in the rollup config to a declarative block in the root tsconfig.json. Both dts passes already extend the root config, so pass 1 inherits the paths and pass 2 reads them off the parsed root config to compute the .d.ts variant. - Drops ~42 lines of node_modules-walking logic. - Makes the workspace structure visible at a glance. - Aligns paths with what tsc / typecheck already see. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/tools/src/rollupConfig.mjs | 69 ++++------------------------- tsconfig.json | 36 +++++++++++++++ 2 files changed, 45 insertions(+), 60 deletions(-) diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index 1855f2315..17840d90c 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -197,58 +197,9 @@ const getOutput = (packageJson, overrides = {}, options) => { }; /** - * Builds a `paths` mapping for workspace @dd/* packages, pointing to their TypeScript - * source files. This makes TypeScript treat them as project files rather than external - * libraries, so their declarations get emitted in the compilation pass. - * @returns {Record} - */ -const buildDdPaths = () => { - const ddDir = path.join(CWD, 'node_modules/@dd'); - if (!fs.existsSync(ddDir)) { - return {}; - } - /** @type {Record} */ - const paths = {}; - for (const name of fs.readdirSync(ddDir)) { - let realPath; - try { - realPath = fs.realpathSync(path.join(ddDir, name)); - } catch { - continue; - } - const pkgJsonPath = path.join(realPath, 'package.json'); - if (!fs.existsSync(pkgJsonPath)) { - continue; - } - let pkgExports; - try { - pkgExports = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8')).exports; - } catch { - continue; - } - if (!pkgExports) { - continue; - } - const relPath = path.relative(CWD, realPath).replace(/\\/g, '/'); - const packageName = `@dd/${name}`; - // Map the main export: "." -> "./src/index.ts" - if (typeof pkgExports['.'] === 'string') { - paths[packageName] = [`${relPath}/${pkgExports['.'].slice(2)}`]; - } - // Map the wildcard export: "./*" -> "./src/*.ts" becomes "@dd/name/*" -> ["rel/src/*"] - if (typeof pkgExports['./*'] === 'string') { - const srcWildcard = pkgExports['./*'] - .replace('./src/', `${relPath}/src/`) - .replace('*.ts', '*'); - paths[`${packageName}/*`] = [srcWildcard]; - } - } - return paths; -}; - -/** - * Converts a source-file paths map to the equivalent .d.ts paths map rooted in outDir. - * Used to redirect dts-bundle-generator to pre-emitted declarations. + * Converts the root tsconfig's @dd/* `paths` (pointing at .ts sources) to the + * equivalent .d.ts paths rooted in outDir. Used to redirect dts-bundle-generator + * to the declarations pre-emitted by pass 1. * @param {string} outDir * @param {Record} srcPaths * @returns {Record} @@ -297,24 +248,22 @@ const getDtsBundlePlugin = (packageJson) => ({ fs.mkdirSync(tempDtsDir, { recursive: true }); try { - // `paths` maps @dd/* to .ts sources for pass 1 (so emit lands them - // under tempDtsDir) and to the emitted .d.ts for pass 2 (so every - // reachable file is a declaration). - const ddSrcPaths = buildDdPaths(); - - // Pass 1 — emit. + // Workspace @dd/* paths live in the root tsconfig — both passes + // extend it. Pass 1 inherits them as-is; pass 2 rewrites them to + // point at the .d.ts files emitted by pass 1. const rootConfig = ts.readConfigFile( path.join(CWD, 'tsconfig.json'), ts.sys.readFile, ).config; const parsedConfig = ts.parseJsonConfigFileContent(rootConfig, ts.sys, CWD); + + // Pass 1 — emit. ts.createProgram([entrySrcPath], { ...parsedConfig.options, noEmit: false, declaration: true, emitDeclarationOnly: true, outDir: tempDtsDir, - paths: ddSrcPaths, }).emit(); // Pass 2 — bundle. dts-bundle-generator requires a real tsconfig path, @@ -325,7 +274,7 @@ const getDtsBundlePlugin = (packageJson) => ({ extends: path.join(CWD, 'tsconfig.json'), compilerOptions: { lib: ['es2022', 'dom'], - paths: buildDtsPaths(tempDtsDir, ddSrcPaths), + paths: buildDtsPaths(tempDtsDir, rootConfig.compilerOptions.paths), }, }), ); diff --git a/tsconfig.json b/tsconfig.json index 23417659a..6ea9682ca 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,42 @@ "moduleResolution": "bundler", "noEmit": true, "noImplicitAny": true, + "paths": { + "@dd/apps-plugin": ["packages/plugins/apps/src/index.ts"], + "@dd/apps-plugin/*": ["packages/plugins/apps/src/*"], + "@dd/assets/*": ["packages/assets/src/*"], + "@dd/core/*": ["packages/core/src/*"], + "@dd/error-tracking-plugin": ["packages/plugins/error-tracking/src/index.ts"], + "@dd/error-tracking-plugin/*": ["packages/plugins/error-tracking/src/*"], + "@dd/factory": ["packages/factory/src/index.ts"], + "@dd/factory/*": ["packages/factory/src/*"], + "@dd/internal-analytics-plugin": ["packages/plugins/analytics/src/index.ts"], + "@dd/internal-analytics-plugin/*": ["packages/plugins/analytics/src/*"], + "@dd/internal-async-queue-plugin": ["packages/plugins/async-queue/src/index.ts"], + "@dd/internal-async-queue-plugin/*": ["packages/plugins/async-queue/src/*"], + "@dd/internal-build-report-plugin": ["packages/plugins/build-report/src/index.ts"], + "@dd/internal-build-report-plugin/*": ["packages/plugins/build-report/src/*"], + "@dd/internal-bundler-report-plugin": ["packages/plugins/bundler-report/src/index.ts"], + "@dd/internal-bundler-report-plugin/*": ["packages/plugins/bundler-report/src/*"], + "@dd/internal-custom-hooks-plugin": ["packages/plugins/custom-hooks/src/index.ts"], + "@dd/internal-custom-hooks-plugin/*": ["packages/plugins/custom-hooks/src/*"], + "@dd/internal-git-plugin": ["packages/plugins/git/src/index.ts"], + "@dd/internal-git-plugin/*": ["packages/plugins/git/src/*"], + "@dd/internal-injection-plugin": ["packages/plugins/injection/src/index.ts"], + "@dd/internal-injection-plugin/*": ["packages/plugins/injection/src/*"], + "@dd/internal-true-end-plugin": ["packages/plugins/true-end/src/index.ts"], + "@dd/internal-true-end-plugin/*": ["packages/plugins/true-end/src/*"], + "@dd/live-debugger-plugin": ["packages/plugins/live-debugger/src/index.ts"], + "@dd/live-debugger-plugin/*": ["packages/plugins/live-debugger/src/*"], + "@dd/metrics-plugin": ["packages/plugins/metrics/src/index.ts"], + "@dd/metrics-plugin/*": ["packages/plugins/metrics/src/*"], + "@dd/output-plugin": ["packages/plugins/output/src/index.ts"], + "@dd/output-plugin/*": ["packages/plugins/output/src/*"], + "@dd/rum-plugin": ["packages/plugins/rum/src/index.ts"], + "@dd/rum-plugin/*": ["packages/plugins/rum/src/*"], + "@dd/tests/*": ["packages/tests/src/*"], + "@dd/tools/*": ["packages/tools/src/*"] + }, "resolveJsonModule": true, "rootDir": "./", "skipLibCheck": true, From b0b262b6dc22e03a6b0b9c7e2587152658853b8f Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 16:48:07 -0400 Subject: [PATCH 08/12] Add integrity check for tsconfig @dd/* paths MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Derives the expected @dd/* `paths` map from each workspace's package.json `exports` and reconciles it with the root tsconfig.json. The check is idempotent — if the existing paths match, the file is not rewritten — and auto-fixes when a workspace is added/renamed/removed. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../tools/src/commands/integrity/index.ts | 3 + .../tools/src/commands/integrity/tsconfig.ts | 55 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 packages/tools/src/commands/integrity/tsconfig.ts diff --git a/packages/tools/src/commands/integrity/index.ts b/packages/tools/src/commands/integrity/index.ts index 69e0083ef..eeda26687 100644 --- a/packages/tools/src/commands/integrity/index.ts +++ b/packages/tools/src/commands/integrity/index.ts @@ -26,6 +26,7 @@ class Integrity extends Command { const { updateDependencies } = await import('./dependencies'); const { updateFiles } = await import('./files'); const { updateReadmes, injectTocsInAllReadmes, verifyLinks } = await import('./readme'); + const { updateTsconfigPaths } = await import('./tsconfig'); const { getWorkspaces } = await import('@dd/tools/helpers'); const workspaces = await getWorkspaces(); @@ -51,6 +52,8 @@ class Integrity extends Command { errors.push(...(await verifyLinks())); // Update the files that need to be updated. errors.push(...(await updateFiles(plugins))); + // Sync @dd/* paths in the root tsconfig with each workspace's package.json exports. + updateTsconfigPaths(workspaces); // Run auto-fixes to ensure the code is correct. errors.push(...(await runAutoFixes())); diff --git a/packages/tools/src/commands/integrity/tsconfig.ts b/packages/tools/src/commands/integrity/tsconfig.ts new file mode 100644 index 000000000..8945cfd42 --- /dev/null +++ b/packages/tools/src/commands/integrity/tsconfig.ts @@ -0,0 +1,55 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +import { outputJsonSync, readJsonSync } from '@dd/core/helpers/fs'; +import { ROOT } from '@dd/tools/constants'; +import { green } from '@dd/tools/helpers'; +import type { Workspace } from '@dd/tools/types'; +import path from 'path'; + +type PackageExports = Record>; + +const buildExpectedPaths = (workspaces: Workspace[]): Record => { + const paths: Record = {}; + for (const workspace of workspaces) { + if (!workspace.name.startsWith('@dd/')) { + continue; + } + const pkg = readJsonSync(path.resolve(ROOT, workspace.location, 'package.json')); + const pkgExports: PackageExports | undefined = pkg.exports; + if (!pkgExports) { + continue; + } + const location = workspace.location.replace(/\\/g, '/'); + const mainExport = pkgExports['.']; + if (typeof mainExport === 'string') { + paths[workspace.name] = [`${location}/${mainExport.replace(/^\.\//, '')}`]; + } + const wildcardExport = pkgExports['./*']; + if (typeof wildcardExport === 'string') { + const target = wildcardExport.replace(/^\.\//, '').replace(/\*\.ts$/, '*'); + paths[`${workspace.name}/*`] = [`${location}/${target}`]; + } + } + return paths; +}; + +const sortObject = (obj: Record): Record => { + return Object.fromEntries(Object.entries(obj).sort(([a], [b]) => a.localeCompare(b))); +}; + +export const updateTsconfigPaths = (workspaces: Workspace[]) => { + const tsconfigPath = path.resolve(ROOT, 'tsconfig.json'); + const tsconfig = readJsonSync(tsconfigPath); + const expected = sortObject(buildExpectedPaths(workspaces)); + const current = tsconfig.compilerOptions?.paths ?? {}; + + if (JSON.stringify(sortObject(current)) === JSON.stringify(expected)) { + return; + } + + console.log(` Update ${green('@dd/*')} paths in ${green('tsconfig.json')}.`); + tsconfig.compilerOptions = { ...tsconfig.compilerOptions, paths: expected }; + outputJsonSync(tsconfigPath, tsconfig); +}; From 07573598bfe64799cd6daa93ead535460ff753c3 Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 16:51:56 -0400 Subject: [PATCH 09/12] Enforce sort order in tsconfig paths check MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Compare the existing paths block as-is — any out-of-order entry triggers a rewrite so the on-disk file is always alphabetically sorted. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/tools/src/commands/integrity/tsconfig.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/tools/src/commands/integrity/tsconfig.ts b/packages/tools/src/commands/integrity/tsconfig.ts index 8945cfd42..73fcc017b 100644 --- a/packages/tools/src/commands/integrity/tsconfig.ts +++ b/packages/tools/src/commands/integrity/tsconfig.ts @@ -45,7 +45,7 @@ export const updateTsconfigPaths = (workspaces: Workspace[]) => { const expected = sortObject(buildExpectedPaths(workspaces)); const current = tsconfig.compilerOptions?.paths ?? {}; - if (JSON.stringify(sortObject(current)) === JSON.stringify(expected)) { + if (JSON.stringify(current) === JSON.stringify(expected)) { return; } From d7dea8c549495705b1e50fab5a453b43ba350bd4 Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 17:34:07 -0400 Subject: [PATCH 10/12] Move plugin build config under buildPlugin - `toBuild` is now nested under each plugin's `buildPlugin` block, alongside the existing `hideFromRootReadme`. - New `buildPlugin.inlinedLibraries` field lets plugins declare which npm packages should be inlined into the bundled .d.ts. - `getDtsBundlePlugin` collects the union of `inlinedLibraries` from every plugin manifest at build time, replacing the hardcoded list in the rollup config. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/plugins/apps/package.json | 16 +++++++------- packages/plugins/rum/package.json | 28 ++++++++++++++----------- packages/tools/src/rollupConfig.mjs | 27 ++++++++++++++++++++---- packages/tools/src/rollupConfig.test.ts | 7 ++++--- 4 files changed, 51 insertions(+), 27 deletions(-) diff --git a/packages/plugins/apps/package.json b/packages/plugins/apps/package.json index 978bf8414..a09626633 100644 --- a/packages/plugins/apps/package.json +++ b/packages/plugins/apps/package.json @@ -12,14 +12,14 @@ "directory": "packages/plugins/apps" }, "buildPlugin": { - "hideFromRootReadme": true - }, - "toBuild": { - "apps-runtime": { - "entry": "./src/built/apps-runtime.ts", - "format": [ - "esm" - ] + "hideFromRootReadme": true, + "toBuild": { + "apps-runtime": { + "entry": "./src/built/apps-runtime.ts", + "format": [ + "esm" + ] + } } }, "exports": { diff --git a/packages/plugins/rum/package.json b/packages/plugins/rum/package.json index ef0bbc0d9..21937f9f8 100644 --- a/packages/plugins/rum/package.json +++ b/packages/plugins/rum/package.json @@ -12,18 +12,22 @@ "directory": "packages/plugins/rum" }, "buildPlugin": { - "hideFromRootReadme": true - }, - "toBuild": { - "rum-browser-sdk": { - "entry": "./src/built/rum-browser-sdk.ts" - }, - "privacy-helpers": { - "format": [ - "cjs", - "esm" - ], - "entry": "./src/built/privacy-helpers.ts" + "hideFromRootReadme": true, + "inlinedLibraries": [ + "@datadog/browser-core", + "@datadog/browser-rum-core" + ], + "toBuild": { + "rum-browser-sdk": { + "entry": "./src/built/rum-browser-sdk.ts" + }, + "privacy-helpers": { + "format": [ + "cjs", + "esm" + ], + "entry": "./src/built/privacy-helpers.ts" + } } }, "exports": { diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index 17840d90c..e6d370deb 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -196,6 +196,24 @@ const getOutput = (packageJson, overrides = {}, options) => { }; }; +/** + * Walks every plugin's package.json and returns the union of declared + * `buildPlugin.inlinedLibraries` — packages whose types should be inlined into + * the bundled .d.ts rather than left as imports (e.g. browser-SDK types that + * aren't real runtime deps of the published packages). + * @returns {string[]} + */ +const collectInlinedLibraries = () => { + const libs = new Set(); + for (const pkg of glob.sync('packages/plugins/*/package.json', { cwd: CWD })) { + const content = JSON.parse(fs.readFileSync(path.resolve(CWD, pkg), 'utf-8')); + for (const name of content.buildPlugin?.inlinedLibraries ?? []) { + libs.add(name); + } + } + return [...libs]; +}; + /** * Converts the root tsconfig's @dd/* `paths` (pointing at .ts sources) to the * equivalent .d.ts paths rooted in outDir. Used to redirect dts-bundle-generator @@ -279,7 +297,7 @@ const getDtsBundlePlugin = (packageJson) => ({ }), ); - const inlinedLibraries = ['@datadog/browser-rum-core', '@datadog/browser-core']; + const inlinedLibraries = collectInlinedLibraries(); const importedLibraries = [ ...Object.keys(packageJson.peerDependencies), ...Object.keys(packageJson.dependencies), @@ -323,16 +341,17 @@ export const getSubBuilds = async (ddPlugin, packageJson, options) => { with: { type: 'json' }, }); - if (!content.toBuild) { + const toBuild = content.buildPlugin?.toBuild; + if (!toBuild) { continue; } console.log( - `Will also build ${chalk.green.bold(content.name)} additional files: ${chalk.green.bold(Object.keys(content.toBuild).join(', '))}`, + `Will also build ${chalk.green.bold(content.name)} additional files: ${chalk.green.bold(Object.keys(toBuild).join(', '))}`, ); subBuilds.push( - ...Object.entries(content.toBuild).map(([name, config]) => { + ...Object.entries(toBuild).map(([name, config]) => { const outputs = (config.format ?? ['cjs']).map((format) => getOutput( packageJson, diff --git a/packages/tools/src/rollupConfig.test.ts b/packages/tools/src/rollupConfig.test.ts index 6fd7287c5..50e1ba03c 100644 --- a/packages/tools/src/rollupConfig.test.ts +++ b/packages/tools/src/rollupConfig.test.ts @@ -129,13 +129,14 @@ const getBuiltFiles = () => { for (const pkg of pkgs) { const content = require(path.resolve(ROOT, pkg)); - if (!content.toBuild) { + const toBuild = content.buildPlugin?.toBuild; + if (!toBuild) { continue; } builtFiles.push( - ...Object.keys(content.toBuild).flatMap((f) => - (content.toBuild[f].format ?? ['cjs']).map((format: string) => + ...Object.keys(toBuild).flatMap((f) => + (toBuild[f].format ?? ['cjs']).map((format: string) => format === 'cjs' ? `${f}.js` : `${f}.mjs`, ), ), From 8bdf01cad2a6bc6dd42a8abeb54ec2ac68a7c5dc Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 17:36:38 -0400 Subject: [PATCH 11/12] Fix typing --- packages/tools/src/rollupConfig.mjs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index e6d370deb..c6b8de550 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -352,16 +352,21 @@ export const getSubBuilds = async (ddPlugin, packageJson, options) => { subBuilds.push( ...Object.entries(toBuild).map(([name, config]) => { - const outputs = (config.format ?? ['cjs']).map((format) => - getOutput( - packageJson, - { - format, - sourcemap: false, - plugins: [terser({ mangle: true })], - }, - options, - ), + const outputs = (config.format ?? ['cjs']).map( + /** + * @param {'esm' | 'cjs'} format + * @returns {OutputOptions} + */ + (format) => + getOutput( + packageJson, + { + format, + sourcemap: false, + plugins: [terser({ mangle: true })], + }, + options, + ), ); const plugins = [esbuild()]; if (ddPlugin) { From a49c8fcf4b53df1b005e101fc84fec96a3e709c2 Mon Sep 17 00:00:00 2001 From: Yoann Moinet Date: Fri, 15 May 2026 17:45:51 -0400 Subject: [PATCH 12/12] Extract dts bundle plugin to its own module Move `getDtsBundlePlugin` and its `collectInlinedLibraries` / `buildDtsPaths` helpers from `rollupConfig.mjs` into a sibling `dtsBundlePlugin.mjs`. `rollupConfig.mjs` now just imports the plugin factory; the dts-specific deps (`dts-bundle-generator`, `typescript`) only load on the consumer side. Co-Authored-By: Claude Opus 4.7 (1M context) --- packages/tools/src/dtsBundlePlugin.mjs | 152 +++++++++++++++++++++++++ packages/tools/src/rollupConfig.mjs | 134 +--------------------- 2 files changed, 154 insertions(+), 132 deletions(-) create mode 100644 packages/tools/src/dtsBundlePlugin.mjs diff --git a/packages/tools/src/dtsBundlePlugin.mjs b/packages/tools/src/dtsBundlePlugin.mjs new file mode 100644 index 000000000..a13b36fb8 --- /dev/null +++ b/packages/tools/src/dtsBundlePlugin.mjs @@ -0,0 +1,152 @@ +// Unless explicitly stated otherwise all files in this repository are licensed under the MIT License. +// This product includes software developed at Datadog (https://www.datadoghq.com/). +// Copyright 2019-Present Datadog, Inc. + +// @ts-check + +import { generateDtsBundle } from 'dts-bundle-generator'; +import fs from 'fs'; +import { glob } from 'glob'; +import path from 'path'; +import ts from 'typescript'; + +const CWD = process.env.PROJECT_CWD || process.cwd(); + +/** + * @typedef {{ + * main: string; + * name: string; + * peerDependencies: Record; + * dependencies: Record + * }} PackageJson + * @typedef {import('rollup').Plugin} Plugin + */ + +/** + * Walks every plugin's package.json and returns the union of declared + * `buildPlugin.inlinedLibraries` — packages whose types should be inlined into + * the bundled .d.ts rather than left as imports (e.g. browser-SDK types that + * aren't real runtime deps of the published packages). + * @returns {string[]} + */ +const collectInlinedLibraries = () => { + const libs = new Set(); + for (const pkg of glob.sync('packages/plugins/*/package.json', { cwd: CWD })) { + const content = JSON.parse(fs.readFileSync(path.resolve(CWD, pkg), 'utf-8')); + for (const name of content.buildPlugin?.inlinedLibraries ?? []) { + libs.add(name); + } + } + return [...libs]; +}; + +/** + * Converts the root tsconfig's @dd/* `paths` (pointing at .ts sources) to the + * equivalent .d.ts paths rooted in outDir. Used to redirect dts-bundle-generator + * to the declarations pre-emitted by pass 1. + * @param {string} outDir + * @param {Record} srcPaths + * @returns {Record} + */ +const buildDtsPaths = (outDir, srcPaths) => { + /** @type {Record} */ + const result = {}; + const rel = path.relative(CWD, outDir).replace(/\\/g, '/'); + for (const [key, values] of Object.entries(srcPaths)) { + result[key] = values.map((v) => { + const dtsV = v.endsWith('.ts') ? v.replace(/\.ts$/, '.d.ts') : v; + return `${rel}/${dtsV}`; + }); + } + return result; +}; + +/** + * Returns a rollup plugin that generates a bundled .d.ts using dts-bundle-generator. + * + * Two-pass approach to avoid DOM lib vs @types/node conflicts: + * Pass 1 — TypeScript emits .d.ts for workspace files without DOM lib (no conflicts + * because workspace code is Node.js-only). + * Pass 2 — dts-bundle-generator runs against the emitted .d.ts with DOM lib enabled. + * Because every reachable file is a .d.ts (entry + @dd/* redirected via + * `paths`), it hits the `allFilesAreDeclarations` shortcut in + * compile-dts.js and skips its own compilation — so DOM vs Node.js type + * conflicts never arise. DOM lib is still needed at this stage so the + * TypesUsageEvaluator can resolve Window / EventTarget / XMLHttpRequest + * etc. referenced in @datadog/browser-* declarations. + * + * @param {PackageJson} packageJson + * @returns {Plugin} + */ +export const getDtsBundlePlugin = (packageJson) => ({ + name: 'dts-bundle-generator', + async closeBundle() { + const safeName = packageJson.name.replace(/[^a-zA-Z0-9]/g, '-'); + const tempDtsDir = path.join(CWD, `.dts-tmp-${safeName}`); + const tempBundleConfigPath = path.join(tempDtsDir, 'tsconfig.bundle.json'); + const entrySrcPath = path.resolve('src/index.ts'); + const entryDtsPath = path.join( + tempDtsDir, + path.relative(CWD, entrySrcPath).replace(/\.ts$/, '.d.ts'), + ); + + fs.mkdirSync(tempDtsDir, { recursive: true }); + try { + // Workspace @dd/* paths live in the root tsconfig — both passes + // extend it. Pass 1 inherits them as-is; pass 2 rewrites them to + // point at the .d.ts files emitted by pass 1. + const rootConfig = ts.readConfigFile( + path.join(CWD, 'tsconfig.json'), + ts.sys.readFile, + ).config; + const parsedConfig = ts.parseJsonConfigFileContent(rootConfig, ts.sys, CWD); + + // Pass 1 — emit. + ts.createProgram([entrySrcPath], { + ...parsedConfig.options, + noEmit: false, + declaration: true, + emitDeclarationOnly: true, + outDir: tempDtsDir, + }).emit(); + + // Pass 2 — bundle. dts-bundle-generator requires a real tsconfig path, + // so this one stays on disk. + fs.writeFileSync( + tempBundleConfigPath, + JSON.stringify({ + extends: path.join(CWD, 'tsconfig.json'), + compilerOptions: { + lib: ['es2022', 'dom'], + paths: buildDtsPaths(tempDtsDir, rootConfig.compilerOptions.paths), + }, + }), + ); + + const inlinedLibraries = collectInlinedLibraries(); + const importedLibraries = [ + ...Object.keys(packageJson.peerDependencies), + ...Object.keys(packageJson.dependencies), + ].filter((name) => !inlinedLibraries.includes(name)); + const [result] = generateDtsBundle( + [ + { + filePath: entryDtsPath, + // `exportReferencedTypes: false` keeps internal types from + // `@datadog/browser-*` as `declare` rather than `export`, + // so they don't pollute our public API surface. + output: { noBanner: true, exportReferencedTypes: false }, + libraries: { inlinedLibraries, importedLibraries }, + }, + ], + { preferredConfigPath: tempBundleConfigPath }, + ); + + const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); + fs.mkdirSync(path.dirname(outputPath), { recursive: true }); + fs.writeFileSync(outputPath, result); + } finally { + fs.rmSync(tempDtsDir, { recursive: true, force: true }); + } + }, +}); diff --git a/packages/tools/src/rollupConfig.mjs b/packages/tools/src/rollupConfig.mjs index c6b8de550..719642e7d 100644 --- a/packages/tools/src/rollupConfig.mjs +++ b/packages/tools/src/rollupConfig.mjs @@ -12,13 +12,13 @@ import { nodeResolve } from '@rollup/plugin-node-resolve'; import terser from '@rollup/plugin-terser'; import chalk from 'chalk'; import cp from 'child_process'; -import { generateDtsBundle } from 'dts-bundle-generator'; import fs from 'fs'; import { glob } from 'glob'; import modulePackage from 'module'; import path from 'path'; import esbuild from 'rollup-plugin-esbuild'; -import ts from 'typescript'; + +import { getDtsBundlePlugin } from './dtsBundlePlugin.mjs'; const CWD = process.env.PROJECT_CWD || process.cwd(); const ROLLUP_PLUGIN_PATH = 'rollup-plugin/dist-basic/src'; @@ -34,7 +34,6 @@ const BUNDLER_NAME_RX = /^@datadog\/(.+)-plugin$/g; * }} PackageJson * @typedef {{ basic?: boolean }} BuildOptions * @typedef {import('rollup').InputPluginOption} InputPluginOption - * @typedef {import('rollup').Plugin} Plugin * @typedef {import('@dd/core/types').Options} PluginOptions * @typedef {import('@dd/core/types').Assign< * import('rollup').RollupOptions, @@ -196,135 +195,6 @@ const getOutput = (packageJson, overrides = {}, options) => { }; }; -/** - * Walks every plugin's package.json and returns the union of declared - * `buildPlugin.inlinedLibraries` — packages whose types should be inlined into - * the bundled .d.ts rather than left as imports (e.g. browser-SDK types that - * aren't real runtime deps of the published packages). - * @returns {string[]} - */ -const collectInlinedLibraries = () => { - const libs = new Set(); - for (const pkg of glob.sync('packages/plugins/*/package.json', { cwd: CWD })) { - const content = JSON.parse(fs.readFileSync(path.resolve(CWD, pkg), 'utf-8')); - for (const name of content.buildPlugin?.inlinedLibraries ?? []) { - libs.add(name); - } - } - return [...libs]; -}; - -/** - * Converts the root tsconfig's @dd/* `paths` (pointing at .ts sources) to the - * equivalent .d.ts paths rooted in outDir. Used to redirect dts-bundle-generator - * to the declarations pre-emitted by pass 1. - * @param {string} outDir - * @param {Record} srcPaths - * @returns {Record} - */ -const buildDtsPaths = (outDir, srcPaths) => { - /** @type {Record} */ - const result = {}; - const rel = path.relative(CWD, outDir).replace(/\\/g, '/'); - for (const [key, values] of Object.entries(srcPaths)) { - result[key] = values.map((v) => { - const dtsV = v.endsWith('.ts') ? v.replace(/\.ts$/, '.d.ts') : v; - return `${rel}/${dtsV}`; - }); - } - return result; -}; - -/** - * Returns a rollup plugin that generates a bundled .d.ts using dts-bundle-generator. - * - * Two-pass approach to avoid DOM lib vs @types/node conflicts: - * Pass 1 — TypeScript emits .d.ts for workspace files without DOM lib (no conflicts - * because workspace code is Node.js-only). - * Pass 2 — dts-bundle-generator runs against the emitted .d.ts with DOM lib enabled. - * Because every reachable file is a .d.ts (entry + @dd/* redirected via - * `paths`), it hits the `allFilesAreDeclarations` shortcut in - * compile-dts.js and skips its own compilation — so DOM vs Node.js type - * conflicts never arise. DOM lib is still needed at this stage so the - * TypesUsageEvaluator can resolve Window / EventTarget / XMLHttpRequest - * etc. referenced in @datadog/browser-* declarations. - * - * @param {PackageJson} packageJson - * @returns {Plugin} - */ -const getDtsBundlePlugin = (packageJson) => ({ - name: 'dts-bundle-generator', - async closeBundle() { - const safeName = packageJson.name.replace(/[^a-zA-Z0-9]/g, '-'); - const tempDtsDir = path.join(CWD, `.dts-tmp-${safeName}`); - const tempBundleConfigPath = path.join(tempDtsDir, 'tsconfig.bundle.json'); - const entrySrcPath = path.resolve('src/index.ts'); - const entryDtsPath = path.join( - tempDtsDir, - path.relative(CWD, entrySrcPath).replace(/\.ts$/, '.d.ts'), - ); - - fs.mkdirSync(tempDtsDir, { recursive: true }); - try { - // Workspace @dd/* paths live in the root tsconfig — both passes - // extend it. Pass 1 inherits them as-is; pass 2 rewrites them to - // point at the .d.ts files emitted by pass 1. - const rootConfig = ts.readConfigFile( - path.join(CWD, 'tsconfig.json'), - ts.sys.readFile, - ).config; - const parsedConfig = ts.parseJsonConfigFileContent(rootConfig, ts.sys, CWD); - - // Pass 1 — emit. - ts.createProgram([entrySrcPath], { - ...parsedConfig.options, - noEmit: false, - declaration: true, - emitDeclarationOnly: true, - outDir: tempDtsDir, - }).emit(); - - // Pass 2 — bundle. dts-bundle-generator requires a real tsconfig path, - // so this one stays on disk. - fs.writeFileSync( - tempBundleConfigPath, - JSON.stringify({ - extends: path.join(CWD, 'tsconfig.json'), - compilerOptions: { - lib: ['es2022', 'dom'], - paths: buildDtsPaths(tempDtsDir, rootConfig.compilerOptions.paths), - }, - }), - ); - - const inlinedLibraries = collectInlinedLibraries(); - const importedLibraries = [ - ...Object.keys(packageJson.peerDependencies), - ...Object.keys(packageJson.dependencies), - ].filter((name) => !inlinedLibraries.includes(name)); - const [result] = generateDtsBundle( - [ - { - filePath: entryDtsPath, - // `exportReferencedTypes: false` keeps internal types from - // `@datadog/browser-*` as `declare` rather than `export`, - // so they don't pollute our public API surface. - output: { noBanner: true, exportReferencedTypes: false }, - libraries: { inlinedLibraries, importedLibraries }, - }, - ], - { preferredConfigPath: tempBundleConfigPath }, - ); - - const outputPath = path.resolve(path.dirname(packageJson.main), 'index.d.ts'); - fs.mkdirSync(path.dirname(outputPath), { recursive: true }); - fs.writeFileSync(outputPath, result); - } finally { - fs.rmSync(tempDtsDir, { recursive: true, force: true }); - } - }, -}); - /** * @param {any | null} ddPlugin * @param {PackageJson} packageJson