diff --git a/.gitignore b/.gitignore index 75c8139bd9b..810f8852690 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,5 @@ TODOs.md *.log .idea .eslintcache +dts-build/packages +*.tsbuildinfo diff --git a/package.json b/package.json index 7aef6ced254..befa8188be9 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "node scripts/dev.mjs", "build": "node scripts/build.mjs", + "build-dts": "tsc -p tsconfig.build.json && rollup -c rollup.dts.config.mjs", "size": "run-s size-global size-baseline", "size-global": "node scripts/build.mjs vue runtime-dom -f global -p", "size-baseline": "node scripts/build.mjs runtime-dom runtime-core reactivity shared -f esm-bundler && cd packages/size-check && vite build && node brotli", @@ -15,8 +16,8 @@ "test": "vitest", "test-unit": "vitest -c vitest.unit.config.ts", "test-e2e": "node scripts/build.mjs vue -f global -d && vitest -c vitest.e2e.config.ts", - "test-dts": "node scripts/build.mjs shared reactivity runtime-core runtime-dom -dt -f esm-bundler && npm run test-dts-only", - "test-dts-only": "tsc -p ./test-dts/tsconfig.json && tsc -p ./test-dts/tsconfig.build.json", + "test-dts": "run-s build-dts test-dts-only", + "test-dts-only": "tsc -p ./test-dts/tsconfig.build.json", "test-coverage": "vitest -c vitest.unit.config.ts --coverage", "release": "node scripts/release.mjs", "changelog": "conventional-changelog -p angular -i CHANGELOG.md -s", @@ -57,7 +58,7 @@ "@babel/parser": "^7.20.15", "@babel/types": "^7.20.7", "@esbuild-plugins/node-modules-polyfill": "^0.1.4", - "@microsoft/api-extractor": "~7.20.0", + "@microsoft/api-extractor": "~7.34.2", "@rollup/plugin-alias": "^4.0.3", "@rollup/plugin-commonjs": "^23.0.2", "@rollup/plugin-json": "^5.0.1", @@ -92,6 +93,7 @@ "pug": "^3.0.1", "puppeteer": "^19.2.2", "rollup": "~3.10.0", + "rollup-plugin-dts": "^5.1.1", "rollup-plugin-esbuild": "^5.0.0", "rollup-plugin-node-builtins": "^2.1.2", "rollup-plugin-node-globals": "^1.4.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 78a878323f7..f3adc1b9b1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,7 @@ importers: '@babel/parser': ^7.20.15 '@babel/types': ^7.20.7 '@esbuild-plugins/node-modules-polyfill': ^0.1.4 - '@microsoft/api-extractor': ~7.20.0 + '@microsoft/api-extractor': ~7.34.2 '@rollup/plugin-alias': ^4.0.3 '@rollup/plugin-commonjs': ^23.0.2 '@rollup/plugin-json': ^5.0.1 @@ -42,6 +42,7 @@ importers: pug: ^3.0.1 puppeteer: ^19.2.2 rollup: ~3.10.0 + rollup-plugin-dts: ^5.1.1 rollup-plugin-esbuild: ^5.0.0 rollup-plugin-node-builtins: ^2.1.2 rollup-plugin-node-globals: ^1.4.0 @@ -60,7 +61,7 @@ importers: '@babel/parser': 7.20.15 '@babel/types': 7.20.7 '@esbuild-plugins/node-modules-polyfill': 0.1.4_esbuild@0.17.5 - '@microsoft/api-extractor': 7.20.1 + '@microsoft/api-extractor': 7.34.2_@types+node@16.18.11 '@rollup/plugin-alias': 4.0.3_rollup@3.10.1 '@rollup/plugin-commonjs': 23.0.7_rollup@3.10.1 '@rollup/plugin-json': 5.0.2_rollup@3.10.1 @@ -95,6 +96,7 @@ importers: pug: 3.0.2 puppeteer: 19.6.3 rollup: 3.10.1 + rollup-plugin-dts: 5.1.1_3md6k4iljipbt7fzll35epzd3m rollup-plugin-esbuild: 5.0.0_vnogblvxo6egyqdp3slxc3bipy rollup-plugin-node-builtins: 2.1.2 rollup-plugin-node-globals: 1.4.0 @@ -1000,43 +1002,47 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@microsoft/api-extractor-model/7.16.0: - resolution: {integrity: sha512-0FOrbNIny8mzBrzQnSIkEjAXk0JMSnPmWYxt3ZDTPVg9S8xIPzB6lfgTg9+Mimu0RKCpGKBpd+v2WcR5vGzyUQ==} + /@microsoft/api-extractor-model/7.26.2_@types+node@16.18.11: + resolution: {integrity: sha512-V9tTHbYTNelTrNDXBzeDlszq29nQcjJdP6s27QJiATbqSRjEbKTeztlSVsCRHL2Wkkv5IN5jT4xkYjnFFPbK0A==} dependencies: - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.45.1 + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.55.0_@types+node@16.18.11 + transitivePeerDependencies: + - '@types/node' dev: true - /@microsoft/api-extractor/7.20.1: - resolution: {integrity: sha512-T7cqcK+JpvHGOj7cD2ZCCWS7Xgru1uOqZwrV/FSUdyKVs5fopZcbBSuetwD/akst3O7Ypryg3UOLP54S/vnVmA==} + /@microsoft/api-extractor/7.34.2_@types+node@16.18.11: + resolution: {integrity: sha512-oREyUU7p3JgjrqapJxEHe83gA1SXOWgaA4XCiY9PvsiLkgGHtn2ibTRgw9GCI/4kZzcb+OQv5waUDxsnQSKfwQ==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.16.0 - '@microsoft/tsdoc': 0.13.2 - '@microsoft/tsdoc-config': 0.15.2 - '@rushstack/node-core-library': 3.45.1 - '@rushstack/rig-package': 0.3.8 - '@rushstack/ts-command-line': 4.10.7 + '@microsoft/api-extractor-model': 7.26.2_@types+node@16.18.11 + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.55.0_@types+node@16.18.11 + '@rushstack/rig-package': 0.3.17 + '@rushstack/ts-command-line': 4.13.1 colors: 1.2.5 lodash: 4.17.21 - resolve: 1.17.0 + resolve: 1.22.1 semver: 7.3.8 source-map: 0.6.1 - typescript: 4.5.5 + typescript: 4.8.4 + transitivePeerDependencies: + - '@types/node' dev: true - /@microsoft/tsdoc-config/0.15.2: - resolution: {integrity: sha512-mK19b2wJHSdNf8znXSMYVShAHktVr/ib0Ck2FA3lsVBSEhSI/TfXT7DJQkAYgcztTuwazGcg58ZjYdk0hTCVrA==} + /@microsoft/tsdoc-config/0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} dependencies: - '@microsoft/tsdoc': 0.13.2 + '@microsoft/tsdoc': 0.14.2 ajv: 6.12.6 jju: 1.4.0 resolve: 1.19.0 dev: true - /@microsoft/tsdoc/0.13.2: - resolution: {integrity: sha512-WrHvO8PDL8wd8T2+zBGKrMwVL5IyzR3ryWUsl0PXgEV0QHup4mTLi0QcATefGI6Gx9Anu7vthPyyyLpY0EpiQg==} + /@microsoft/tsdoc/0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true /@nodelib/fs.scandir/2.1.5: @@ -1179,29 +1185,33 @@ packages: rollup: 3.10.1 dev: true - /@rushstack/node-core-library/3.45.1: - resolution: {integrity: sha512-BwdssTNe007DNjDBxJgInHg8ePytIPyT0La7ZZSQZF9+rSkT42AygXPGvbGsyFfEntjr4X37zZSJI7yGzL16cQ==} + /@rushstack/node-core-library/3.55.0_@types+node@16.18.11: + resolution: {integrity: sha512-6lSel8w3DeGaD/JCKw64wfezEBijlCQlMwBoYg9Ci5VPy+dZ+FpBkIBrY8mi3Ge4xNzr4gyTbQ5XEt0QP1Kv/w==} + peerDependencies: + '@types/node': ^14.18.36 + peerDependenciesMeta: + '@types/node': + optional: true dependencies: - '@types/node': 12.20.24 + '@types/node': 16.18.11 colors: 1.2.5 fs-extra: 7.0.1 import-lazy: 4.0.0 jju: 1.4.0 - resolve: 1.17.0 + resolve: 1.22.1 semver: 7.3.8 - timsort: 0.3.0 z-schema: 5.0.5 dev: true - /@rushstack/rig-package/0.3.8: - resolution: {integrity: sha512-MDWg1xovea99PWloSiYMjFcCLsrdjFtYt6aOyHNs5ojn5mxrzR6U9F83hvbQjTWnKPMvZtr0vcek+4n+OQOp3Q==} + /@rushstack/rig-package/0.3.17: + resolution: {integrity: sha512-nxvAGeIMnHl1LlZSQmacgcRV4y1EYtgcDIrw6KkeVjudOMonlxO482PhDj3LVZEp6L7emSf6YSO2s5JkHlwfZA==} dependencies: resolve: 1.17.0 strip-json-comments: 3.1.1 dev: true - /@rushstack/ts-command-line/4.10.7: - resolution: {integrity: sha512-CjS+DfNXUSO5Ab2wD1GBGtUTnB02OglRWGqfaTcac9Jn45V5MeUOsq/wA8wEeS5Y/3TZ2P1k+IWdVDiuOFP9Og==} + /@rushstack/ts-command-line/4.13.1: + resolution: {integrity: sha512-UTQMRyy/jH1IS2U+6pyzyn9xQ2iMcoUKkTcZUzOP/aaMiKlWLwCTDiBVwhw/M1crDx6apF9CwyjuWO9r1SBdJQ==} dependencies: '@types/argparse': 1.0.38 argparse: 1.0.10 @@ -1252,10 +1262,6 @@ packages: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true - /@types/node/12.20.24: - resolution: {integrity: sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ==} - dev: true - /@types/node/16.18.11: resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} dev: true @@ -5435,6 +5441,20 @@ packages: inherits: 2.0.4 dev: true + /rollup-plugin-dts/5.1.1_3md6k4iljipbt7fzll35epzd3m: + resolution: {integrity: sha512-zpgo52XmnLg8w4k3MScinFHZK1+ro6r7uVe34fJ0Ee8AM45FvgvTuvfWWaRgIpA4pQ1BHJuu2ospncZhkcJVeA==} + engines: {node: '>=v14'} + peerDependencies: + rollup: ^3.0.0 + typescript: ^4.1 + dependencies: + magic-string: 0.27.0 + rollup: 3.10.1 + typescript: 4.9.5 + optionalDependencies: + '@babel/code-frame': 7.18.6 + dev: true + /rollup-plugin-esbuild/5.0.0_vnogblvxo6egyqdp3slxc3bipy: resolution: {integrity: sha512-1cRIOHAPh8WQgdQQyyvFdeOdxuiyk+zB5zJ5+YOwrZP4cJ0MT3Fs48pQxrZeyZHcn+klFherytILVfE4aYrneg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} @@ -6047,10 +6067,6 @@ packages: readable-stream: 3.6.0 dev: true - /timsort/0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} - dev: true - /tinybench/2.3.1: resolution: {integrity: sha512-hGYWYBMPr7p4g5IarQE7XhlyWveh1EKhy4wUBS1LrHXCKYgvz+4/jCqgmJqZxxldesn05vccrtME2RLLZNW7iA==} dev: true @@ -6188,8 +6204,8 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typescript/4.5.5: - resolution: {integrity: sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==} + /typescript/4.8.4: + resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==} engines: {node: '>=4.2.0'} hasBin: true dev: true diff --git a/rollup.dts.config.mjs b/rollup.dts.config.mjs new file mode 100644 index 00000000000..b245ed210d6 --- /dev/null +++ b/rollup.dts.config.mjs @@ -0,0 +1,53 @@ +// @ts-check +import { existsSync, readdirSync, readFileSync } from 'fs' +import dts from 'rollup-plugin-dts' + +if (!existsSync('temp/packages')) { + console.warn( + 'no temp dts files found. run `tsc -p tsconfig.build.json` first.' + ) + process.exit(1) +} + +export default readdirSync('temp/packages').map(pkg => { + return { + input: `./temp/packages/${pkg}/src/index.d.ts`, + output: { + file: `packages/${pkg}/dist/${pkg}.d.ts`, + format: 'es' + }, + plugins: [dts(), patchTypes(pkg)], + onwarn(warning, warn) { + // during dts rollup, everything is externalized by default + if ( + warning.code === 'UNRESOLVED_IMPORT' && + !warning.exporter.startsWith('.') + ) { + return + } + warn(warning) + } + } +}) + +/** + * @returns {import('rollup').Plugin} + */ +function patchTypes(pkg) { + return { + name: 'patch-types', + renderChunk(code) { + // 1. TODO remove entries marked with @private + // 2. append pkg specific types + const additionalTypeDir = `packages/${pkg}/types` + if (existsSync(additionalTypeDir)) { + code += + '\n' + + readdirSync(additionalTypeDir) + .map(file => readFileSync(`${additionalTypeDir}/${file}`, 'utf-8')) + .join('\n') + } + return code + } + } +} diff --git a/scripts/aliases.mjs b/scripts/aliases.mjs index 0d3c20d7e4b..4cbdf10b256 100644 --- a/scripts/aliases.mjs +++ b/scripts/aliases.mjs @@ -1,11 +1,14 @@ // @ts-check // these aliases are shared between vitest and rollup -import { readdirSync } from 'node:fs' +import { readdirSync, statSync } from 'node:fs' import path from 'node:path' import { fileURLToPath } from 'node:url' const resolveEntryForPkg = p => - path.resolve(fileURLToPath(import.meta.url), `../../packages/${p}/src/index.ts`) + path.resolve( + fileURLToPath(import.meta.url), + `../../packages/${p}/src/index.ts` + ) const dirs = readdirSync(new URL('../packages', import.meta.url)) @@ -15,9 +18,21 @@ const entries = { 'vue/server-renderer': resolveEntryForPkg('server-renderer'), '@vue/compat': resolveEntryForPkg('vue-compat') } + +const nonSrcPackages = [ + 'sfc-playground', + 'size-check', + 'template-explorer' +] + for (const dir of dirs) { const key = `@vue/${dir}` - if (dir !== 'vue' && !(key in entries)) { + if ( + dir !== 'vue' && + !nonSrcPackages.includes(dir) && + !(key in entries) && + statSync(new URL(`../packages/${dir}`, import.meta.url)).isDirectory() + ) { entries[key] = resolveEntryForPkg(dir) } } diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000000..8e93e992f6d --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,15 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true + }, + "exclude": [ + "packages/*/__tests__", + "packages/runtime-test", + "packages/template-explorer", + "packages/sfc-playground", + "packages/size-check", + "test-dts" + ] +} diff --git a/tsconfig.json b/tsconfig.json index 36b360eba85..2a3f429d8ad 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "baseUrl": ".", - "outDir": "dist", + "outDir": "temp", "sourceMap": false, "target": "es2016", "newLine": "LF",