From 3943d735b0f0494a264a857ab45baae7475ee203 Mon Sep 17 00:00:00 2001 From: ocavue Date: Thu, 31 Aug 2023 23:52:56 +0800 Subject: [PATCH 01/13] feat: add experimental dts rollup using @microsoft/api-extractor --- docs/README.md | 2 + package.json | 1 + pnpm-lock.yaml | 242 +++++++++++++++++++++++++- src/api-extractor.ts | 150 ++++++++++++++++ src/cli-main.ts | 1 + src/exports.ts | 118 +++++++++++++ src/index.ts | 28 +++ src/options.ts | 11 ++ src/rollup.ts | 44 +---- src/tsc.ts | 208 ++++++++++++++++++++++ src/utils.ts | 78 ++++++++- test/__snapshots__/index.test.ts.snap | 235 +++++++++++++++++++++++++ test/index.test.ts | 172 +++++++++++++++++- 13 files changed, 1230 insertions(+), 60 deletions(-) create mode 100644 src/api-extractor.ts create mode 100644 src/exports.ts create mode 100644 src/tsc.ts diff --git a/docs/README.md b/docs/README.md index 9641ef0c..ebbd77df 100644 --- a/docs/README.md +++ b/docs/README.md @@ -193,6 +193,8 @@ If you have multiple entry files, each entry will get a corresponding `.d.ts` fi Note that `--dts` does not resolve external (aka in `node_modules`) types used in the `.d.ts` file, if that's somehow a requirement, try the experimental `--dts-resolve` flag instead. +Since tsup version 7.3.0, you can also use `--experimental-dts` flag to generate declaration files. This flag use [@microsoft/api-extractor](https://www.npmjs.com/package/@microsoft/api-extractor) to generate declaration files, which is more reliable than the previous `--dts` flag. It's still experimental and we are looking for feedbacks. + #### Emit declaration file only The `--dts-only` flag is the equivalent of the `emitDeclarationOnly` option in `tsc`. Using this flag will only emit the declaration file, without the JavaScript files. diff --git a/package.json b/package.json index bb4e8db3..f21ef050 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "build-fast": "npm run build -- --no-dts" }, "dependencies": { + "@microsoft/api-extractor": "^7.36.4", "bundle-require": "^4.0.0", "cac": "^6.7.12", "chokidar": "^3.5.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8b008fb2..7e83b5b1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,6 +5,9 @@ settings: excludeLinksFromLockfile: false dependencies: + '@microsoft/api-extractor': + specifier: ^7.36.4 + version: 7.36.4(@types/node@14.18.12) bundle-require: specifier: ^4.0.0 version: 4.0.0(esbuild@0.18.2) @@ -374,6 +377,49 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@microsoft/api-extractor-model@7.27.6(@types/node@14.18.12): + resolution: {integrity: sha512-eiCnlayyum1f7fS2nA9pfIod5VCNR1G+Tq84V/ijDrKrOFVa598BLw145nCsGDMoFenV6ajNi2PR5WCwpAxW6Q==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.7(@types/node@14.18.12) + transitivePeerDependencies: + - '@types/node' + dev: false + + /@microsoft/api-extractor@7.36.4(@types/node@14.18.12): + resolution: {integrity: sha512-21UECq8C/8CpHT23yiqTBQ10egKUacIpxkPyYR7hdswo/M5yTWdBvbq+77YC9uPKQJOUfOD1FImBQ1DzpsdeQQ==} + hasBin: true + dependencies: + '@microsoft/api-extractor-model': 7.27.6(@types/node@14.18.12) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@rushstack/node-core-library': 3.59.7(@types/node@14.18.12) + '@rushstack/rig-package': 0.4.1 + '@rushstack/ts-command-line': 4.15.2 + colors: 1.2.5 + lodash: 4.17.21 + resolve: 1.22.1 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@types/node' + dev: false + + /@microsoft/tsdoc-config@0.16.2: + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + dev: false + + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: false + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -420,6 +466,40 @@ packages: rollup: 3.8.1 dev: true + /@rushstack/node-core-library@3.59.7(@types/node@14.18.12): + resolution: {integrity: sha512-ln1Drq0h+Hwa1JVA65x5mlSgUrBa1uHL+V89FqVWQgXd1vVIMhrtqtWGQrhTnFHxru5ppX+FY39VWELF/FjQCw==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 14.18.12 + colors: 1.2.5 + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.1 + semver: 7.5.4 + z-schema: 5.0.5 + dev: false + + /@rushstack/rig-package@0.4.1: + resolution: {integrity: sha512-AGRwpqlXNSp9LhUSz4HKI9xCluqQDt/obsQFdv/NYIekF3pTTPzc+HbQsIsjVjYnJ3DcmxOREVMhvrMEjpiq6g==} + dependencies: + resolve: 1.22.1 + strip-json-comments: 3.1.1 + dev: false + + /@rushstack/ts-command-line@4.15.2: + resolution: {integrity: sha512-5+C2uoJY8b+odcZD6coEe2XNC4ZjGB4vCMESbqW/8DHRWC/qIHfANdmN9F1wz/lAgxz72i7xRoVtPY2j7e4gpQ==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: false + /@swc/core-android-arm-eabi@1.2.218: resolution: {integrity: sha512-Q/uLCh262t3xxNzhCz+ZW9t+g2nWd0gZZO4jMYFWJs7ilKVNsBfRtfnNGGACHzkVuWLNDIWtAS2PSNodl7VUHQ==} engines: {node: '>=10'} @@ -562,6 +642,10 @@ packages: '@swc/core-win32-x64-msvc': 1.2.218 dev: true + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + dev: false + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -602,7 +686,6 @@ packages: /@types/node@14.18.12: resolution: {integrity: sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==} - dev: true /@types/pug@2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} @@ -661,6 +744,15 @@ packages: hasBin: true dev: true + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: false + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -699,6 +791,12 @@ packages: normalize-path: 3.0.0 picomatch: 2.3.0 + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -818,6 +916,11 @@ packages: resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==} dev: true + /colors@1.2.5: + resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} + engines: {node: '>=0.1.90'} + dev: false + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -826,6 +929,13 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + /commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + requiresBuild: true + dev: false + optional: true + /concat-map@0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} @@ -1161,6 +1271,10 @@ packages: signal-exit: 3.0.6 strip-final-newline: 2.0.0 + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + /fast-glob@3.2.7: resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} engines: {node: '>=8'} @@ -1171,6 +1285,10 @@ packages: merge2: 1.4.1 micromatch: 4.0.4 + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: false + /fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: @@ -1196,6 +1314,15 @@ packages: universalify: 2.0.0 dev: true + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.8 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + /fs.realpath@1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} @@ -1208,7 +1335,6 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} - dev: true /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} @@ -1247,7 +1373,6 @@ packages: /graceful-fs@4.2.8: resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} - dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -1260,7 +1385,6 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 - dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -1274,6 +1398,11 @@ packages: resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} dev: true + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + dev: false + /inflight@1.0.6: resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} dependencies: @@ -1299,7 +1428,6 @@ packages: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 - dev: true /is-extglob@2.1.1: resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} @@ -1327,6 +1455,10 @@ packages: /isexe@2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: false + /joycon@3.0.1: resolution: {integrity: sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==} engines: {node: '>=10'} @@ -1336,6 +1468,10 @@ packages: dev: true optional: true + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: false + /json5@1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -1347,6 +1483,12 @@ packages: resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} dev: true + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.8 + dev: false + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -1371,9 +1513,21 @@ packages: engines: {node: '>=14'} dev: true + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + /lodash.sortby@4.7.0: resolution: {integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + /loupe@2.3.1: resolution: {integrity: sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==} dependencies: @@ -1386,6 +1540,13 @@ packages: get-func-name: 2.0.0 dev: true + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} dependencies: @@ -1525,7 +1686,6 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -1643,6 +1803,13 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} + /resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + dependencies: + is-core-module: 2.9.0 + path-parse: 1.0.7 + dev: false + /resolve@1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: @@ -1657,7 +1824,6 @@ packages: is-core-module: 2.9.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 - dev: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -1733,6 +1899,14 @@ packages: source-map-js: 1.0.2 dev: true + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1786,7 +1960,6 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - dev: true /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -1799,6 +1972,10 @@ packages: deprecated: Please use @jridgewell/sourcemap-codec instead dev: true + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -1807,6 +1984,11 @@ packages: resolution: {integrity: sha512-uUZI65yrV2Qva5gqE0+A7uVAvO40iPo6jGhs7s8keRfHCmtg+uB2X6EiLGCI9IgL1J17xGhvoOqSz79lzICPTA==} dev: true + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: false + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} @@ -1839,6 +2021,11 @@ packages: min-indent: 1.0.1 dev: true + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: false + /strip-json-comments@4.0.0: resolution: {integrity: sha512-LzWcbfMbAsEDTRmhjWIioe8GcDRl0fa35YMXFoJKDdiD/quGFmjJjdgPjFJJNwCMaLyQqFIDqCdHD2V4HfLgYA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -1873,7 +2060,6 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - dev: true /svelte-preprocess@5.0.3(postcss-load-config@4.0.1)(postcss@8.4.12)(sass@1.62.1)(svelte@3.46.4)(typescript@5.0.2): resolution: {integrity: sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==} @@ -2050,15 +2236,37 @@ packages: hasBin: true dev: true + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: false + /ufo@1.0.1: resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==} dev: true + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} dev: true + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.1.1 + dev: false + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: false + /vite-node@0.28.4(sass@1.62.1)(terser@5.16.0): resolution: {integrity: sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==} engines: {node: '>=v14.16.0'} @@ -2196,6 +2404,10 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} @@ -2204,3 +2416,15 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} dev: true + + /z-schema@5.0.5: + resolution: {integrity: sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==} + engines: {node: '>=8.0.0'} + hasBin: true + dependencies: + lodash.get: 4.4.2 + lodash.isequal: 4.5.0 + validator: 13.11.0 + optionalDependencies: + commander: 9.5.0 + dev: false diff --git a/src/api-extractor.ts b/src/api-extractor.ts new file mode 100644 index 00000000..cdbbf85a --- /dev/null +++ b/src/api-extractor.ts @@ -0,0 +1,150 @@ +import { + Extractor, + ExtractorConfig, + ExtractorResult, + IConfigFile, + IExtractorConfigPrepareOptions, +} from '@microsoft/api-extractor' +import path from 'path' +import { handleError } from './errors' +import { + formatAggregationExports, + formatDistributionExports, + type ExportDeclaration, +} from './exports' +import { createLogger } from './log' +import { Format, NormalizedOptions } from './options' +import { + defaultOutExtension, + ensureTempDeclarationDir, + toAbsolutePath, + toObjectEntry, + trimDtsExtension, + writeFileSync, +} from './utils' +import { loadPkg } from './load' + +const logger = createLogger() + +function rollupDtsFile( + inputFilePath: string, + outputFilePath: string, + tsconfigFilePath: string +) { + let cwd = process.cwd() + let packageJsonFullPath = path.join(cwd, 'package.json') + let configObject: IConfigFile = { + mainEntryPointFilePath: inputFilePath, + apiReport: { + enabled: false, + + // `reportFileName` is not been used. It's just to fit the requirement of API Extractor. + reportFileName: 'tsup-report.api.md', + }, + docModel: { enabled: false }, + dtsRollup: { + enabled: true, + untrimmedFilePath: outputFilePath, + }, + tsdocMetadata: { enabled: false }, + compiler: { + tsconfigFilePath: tsconfigFilePath, + }, + projectFolder: cwd, + } + const prepareOptions: IExtractorConfigPrepareOptions = { + configObject, + configObjectFullPath: undefined, + packageJsonFullPath, + } + const extractorConfig: ExtractorConfig = + ExtractorConfig.prepare(prepareOptions) + + // Invoke API Extractor + const extractorResult: ExtractorResult = Extractor.invoke(extractorConfig, { + // Equivalent to the "--local" command-line parameter + localBuild: true, + + // Equivalent to the "--verbose" command-line parameter + showVerboseMessages: true, + }) + + if (!extractorResult.succeeded) { + throw new Error( + `API Extractor completed with ${extractorResult.errorCount} errors and ${extractorResult.warningCount} warnings when processing ${inputFilePath}` + ) + } +} + +async function rollupDtsFiles( + options: NormalizedOptions, + exports: ExportDeclaration[], + format: Format +) { + const dtsOptions = options.experimentalDts || {} + dtsOptions.entry = dtsOptions.entry || options.entry + + if (Array.isArray(dtsOptions.entry) && dtsOptions.entry.length > 1) { + dtsOptions.entry = toObjectEntry(dtsOptions.entry) + } + + let declarationDir = ensureTempDeclarationDir() + let outDir = options.outDir || 'dist' + let pkg = await loadPkg(process.cwd()) + let dtsExtension = defaultOutExtension({ format, pkgType: pkg.type }).dts + + let dtsInputFilePath = path.join( + declarationDir, + '_tsup-dts-aggregation' + dtsExtension + ) + let dtsOutputFilePath = path.join(outDir, '_tsup-dts-rollup' + dtsExtension) + + writeFileSync( + dtsInputFilePath, + formatAggregationExports(exports, declarationDir) + ) + + rollupDtsFile( + dtsInputFilePath, + dtsOutputFilePath, + options.tsconfig || 'tsconfig.json' + ) + + for (let [out, sourceFileName] of Object.entries(dtsOptions.entry)) { + sourceFileName = toAbsolutePath(sourceFileName) + const outFileName = path.join(outDir, out + dtsExtension) + + const declarations = exports.filter( + (declaration) => declaration.sourceFileName === sourceFileName + ) + + writeFileSync( + outFileName, + formatDistributionExports(declarations, outFileName, dtsOutputFilePath) + ) + } +} + +export async function runDtsRollup( + options: NormalizedOptions, + exports?: ExportDeclaration[] +) { + try { + const start = Date.now() + const getDuration = () => { + return `${Math.floor(Date.now() - start)}ms` + } + logger.info('dts', 'Build start') + + if (!exports) { + throw new Error('Unexpected internal error: dts exports is not define') + } + for (const format of options.format) { + await rollupDtsFiles(options, exports, format) + } + logger.success('dts', `⚡️ Build success in ${getDuration()}`) + } catch (error) { + handleError(error) + logger.error('dts', 'Build error') + } +} diff --git a/src/cli-main.ts b/src/cli-main.ts index b3338b6c..790723e1 100644 --- a/src/cli-main.ts +++ b/src/cli-main.ts @@ -38,6 +38,7 @@ export async function main(options: Options = {}) { .option('--dts [entry]', 'Generate declaration file') .option('--dts-resolve', 'Resolve externals types used for d.ts files') .option('--dts-only', 'Emit declaration files only') + .option('--experimental-dts [entry]', 'Generate declaration file (experimental)') .option( '--sourcemap [inline]', 'Generate external sourcemap, or inline source: --sourcemap inline' diff --git a/src/exports.ts b/src/exports.ts new file mode 100644 index 00000000..f9790c43 --- /dev/null +++ b/src/exports.ts @@ -0,0 +1,118 @@ +import path from 'path' +import { slash, trimDtsExtension, truthy } from './utils' + +export type ExportDeclaration = ModuleExport | NamedExport + +interface ModuleExport { + kind: 'module' + sourceFileName: string + destFileName: string + moduleName: string + isTypeOnly: boolean +} + +interface NamedExport { + kind: 'named' + sourceFileName: string + destFileName: string + alias: string + name: string + isTypeOnly: boolean +} + +export function formatAggregationExports( + exports: ExportDeclaration[], + declarationDirPath: string +): string { + const lines = exports + .map((declaration) => + formatAggregationExport(declaration, declarationDirPath) + ) + .filter(truthy) + + if (lines.length === 0) { + lines.push('export {};') + } + + return lines.join('\n') + '\n' +} + +function formatAggregationExport( + declaration: ExportDeclaration, + declarationDirPath: string +): string { + let dest = trimDtsExtension( + './' + + path.posix.normalize( + slash(path.relative(declarationDirPath, declaration.destFileName)) + ) + ) + + if (declaration.kind === 'module') { + // No implemeted + return '' + } else if (declaration.kind === 'named') { + return [ + 'export', + declaration.isTypeOnly ? 'type' : '', + '{', + declaration.name, + declaration.name === declaration.alias ? '' : `as ${declaration.alias}`, + '} from', + `'${dest}';`, + ] + .filter(truthy) + .join(' ') + } else { + throw new Error('Unknown declaration') + } +} + +export function formatDistributionExports( + exports: ExportDeclaration[], + fromFilePath: string, + toFilePath: string +) { + let importPath = trimDtsExtension( + path.posix.relative( + path.posix.dirname(path.posix.normalize(slash(fromFilePath))), + path.posix.normalize(slash(toFilePath)) + ) + ) + if (!importPath.match(/^\.+\//)) { + importPath = './' + importPath + } + + const lines = exports + .map((declaration) => formatDistributionExport(declaration, importPath)) + .filter(truthy) + + if (lines.length === 0) { + lines.push('export {};') + } + + return lines.join('\n') + '\n' +} + +function formatDistributionExport( + declaration: ExportDeclaration, + dest: string +): string { + if (declaration.kind === 'named') { + return [ + 'export', + declaration.isTypeOnly ? 'type' : '', + '{', + declaration.alias, + declaration.name === declaration.alias ? '' : `as ${declaration.name}`, + '} from', + `'${dest}';`, + ] + .filter(truthy) + .join(' ') + } + if (declaration.kind === 'module') { + return `export * from '${declaration.moduleName}';` + } + return '' +} diff --git a/src/index.ts b/src/index.ts index 0eecc990..891b9d0a 100644 --- a/src/index.ts +++ b/src/index.ts @@ -21,6 +21,8 @@ import { sizeReporter } from './plugins/size-reporter' import { treeShakingPlugin } from './plugins/tree-shaking' import { copyPublicDir, isInPublicDir } from './lib/public-dir' import { terserPlugin } from './plugins/terser' +import { runTypeScriptCompiler } from './tsc' +import { runDtsRollup } from './api-extractor' import { cjsInterop } from './plugins/cjs-interop' export type { Format, Options, NormalizedOptions } @@ -52,6 +54,7 @@ const normalizeOptions = async ( ...optionsFromConfigFile, ...optionsOverride, } + const options: Partial = { outDir: 'dist', ..._options, @@ -67,6 +70,14 @@ const normalizeOptions = async ( : typeof _options.dts === 'string' ? { entry: _options.dts } : _options.dts, + experimentalDts: + typeof _options.experimentalDts === 'boolean' + ? _options.experimentalDts + ? {} + : undefined + : typeof _options.experimentalDts === 'string' + ? { entry: _options.experimentalDts } + : _options.experimentalDts, } setSilent(options.silent) @@ -112,6 +123,12 @@ const normalizeOptions = async ( ...(options.dts.compilerOptions || {}), } } + if (options.experimentalDts) { + options.experimentalDts.compilerOptions = { + ...(tsconfig.data.compilerOptions || {}), + ...(options.experimentalDts.compilerOptions || {}), + } + } if (!options.target) { options.target = tsconfig.data?.compilerOptions?.target?.toLowerCase() } @@ -157,6 +174,17 @@ export async function build(_options: Options) { } const dtsTask = async () => { + if (options.dts && options.experimentalDts) { + throw new Error( + "You can't use both `dts` and `experimentalDts` at the same time" + ) + } + + if (options.experimentalDts) { + const exports = runTypeScriptCompiler(options) + await runDtsRollup(options, exports) + } + if (options.dts) { await new Promise((resolve, reject) => { const worker = new Worker(path.join(__dirname, './rollup.js')) diff --git a/src/options.ts b/src/options.ts index 884dfa44..57434400 100644 --- a/src/options.ts +++ b/src/options.ts @@ -39,6 +39,15 @@ export type DtsConfig = { compilerOptions?: any } +export type ExperimentalDtsConfig = { + entry?: InputOption + /** + * Overrides `compilerOptions` + * This option takes higher priority than `compilerOptions` in tsconfig.json + */ + compilerOptions?: any +} + export type BannerOrFooter = | { js?: string @@ -126,6 +135,7 @@ export type Options = { [k: string]: string } dts?: boolean | string | DtsConfig + experimentalDts?: boolean | string | ExperimentalDtsConfig sourcemap?: boolean | 'inline' /** Always bundle modules matching given patterns */ noExternal?: (string | RegExp)[] @@ -237,6 +247,7 @@ export type NormalizedOptions = Omit< 'dts' | 'format' > & { dts?: DtsConfig + experimentalDts?: ExperimentalDtsConfig tsconfigResolvePaths: Record tsconfigDecoratorMetadata?: boolean format: Format[] diff --git a/src/rollup.ts b/src/rollup.ts index 28672fb2..21d64abe 100644 --- a/src/rollup.ts +++ b/src/rollup.ts @@ -5,7 +5,7 @@ import ts from 'typescript' import hashbangPlugin from 'rollup-plugin-hashbang' import jsonPlugin from '@rollup/plugin-json' import { handleError } from './errors' -import { defaultOutExtension, removeFiles } from './utils' +import { defaultOutExtension, removeFiles, toObjectEntry } from './utils' import { TsResolveOptions, tsResolvePlugin } from './rollup/ts-resolve' import { createLogger, setSilent } from './log' import { getProductionDeps, loadPkg } from './load' @@ -35,48 +35,6 @@ type RollupConfig = { outputConfig: OutputOptions[] } -const findLowestCommonAncestor = (filepaths: string[]) => { - if (filepaths.length <= 1) return '' - const [first, ...rest] = filepaths - let ancestor = first.split('/') - for (const filepath of rest) { - const directories = filepath.split('/', ancestor.length) - let index = 0 - for (const directory of directories) { - if (directory === ancestor[index]) { - index += 1 - } else { - ancestor = ancestor.slice(0, index) - break - } - } - ancestor = ancestor.slice(0, index) - } - - return ancestor.length <= 1 && ancestor[0] === '' - ? '/' + ancestor[0] - : ancestor.join('/') -} - -// Make sure the Rollup entry is an object -// We use the base path (without extension) as the entry name -// To make declaration files work with multiple entrypoints -// See #316 -const toObjectEntry = (entry: string[]) => { - entry = entry.map((e) => e.replace(/\\/g, '/')) - const ancestor = findLowestCommonAncestor(entry) - return entry.reduce((result, item) => { - const key = item - .replace(ancestor, '') - .replace(/^\//, '') - .replace(/\.[a-z]+$/, '') - return { - ...result, - [key]: item, - } - }, {}) -} - const getRollupConfig = async ( options: NormalizedOptions ): Promise => { diff --git a/src/tsc.ts b/src/tsc.ts new file mode 100644 index 00000000..8ef939c6 --- /dev/null +++ b/src/tsc.ts @@ -0,0 +1,208 @@ +import ts from 'typescript' +import { handleError } from './errors' +import { ExportDeclaration } from './exports' +import { createLogger } from './log' +import { Entry, ExperimentalDtsConfig, NormalizedOptions } from './options' +import { ensureTempDeclarationDir, toAbsolutePath } from './utils' + +const logger = createLogger() + +class AliasPool { + private seen = new Set() + + assign(name: string): string { + let suffix = 0 + let alias = name === 'default' ? 'default_alias' : name + + while (this.seen.has(alias)) { + alias = `${name}_alias_${++suffix}` + if (suffix >= 1000) { + throw new Error( + 'Alias generation exceeded limit. Possible infinite loop detected.' + ) + } + } + + this.seen.add(alias) + return alias + } +} + +/** + * Get all export declarations from root files. + */ +function getExports( + program: ts.Program, + fileMapping: Map +): ExportDeclaration[] { + let checker = program.getTypeChecker() + let aliasPool = new AliasPool() + let assignAlias = aliasPool.assign.bind(aliasPool) + + function extractExports(sourceFileName: string): ExportDeclaration[] { + const cwd = program.getCurrentDirectory() + sourceFileName = toAbsolutePath(sourceFileName, cwd) + + const sourceFile = program.getSourceFile(sourceFileName) + if (!sourceFile) { + return [] + } + + const destFileName = fileMapping.get(sourceFileName) + if (!destFileName) { + return [] + } + + const moduleSymbol = checker.getSymbolAtLocation(sourceFile) + if (!moduleSymbol) { + return [] + } + + const exports: ExportDeclaration[] = [] + + const exportSymbols = checker.getExportsOfModule(moduleSymbol) + exportSymbols.forEach((symbol) => { + const name = symbol.getName() + exports.push({ + kind: 'named', + sourceFileName, + destFileName, + name, + alias: assignAlias(name), + isTypeOnly: false, + }) + }) + + return exports + } + + return program.getRootFileNames().flatMap(extractExports) +} + +/** + * Use TypeScript compiler to emit declaration files. + * + * @returns The mapping from source TS file paths to output declaration file paths + */ +function emitDtsFiles(program: ts.Program, host: ts.CompilerHost) { + let fileMapping = new Map() + + let writeFile: ts.WriteFileCallback = ( + fileName, + text, + writeByteOrderMark, + onError, + sourceFiles, + data + ) => { + const sourceFile = sourceFiles?.[0] + let sourceFileName = sourceFile?.fileName + + if (sourceFileName && !fileName.endsWith('.map')) { + const cwd = program.getCurrentDirectory() + fileMapping.set( + toAbsolutePath(sourceFileName, cwd), + toAbsolutePath(fileName, cwd) + ) + } + + return host.writeFile( + fileName, + text, + writeByteOrderMark, + onError, + sourceFiles, + data + ) + } + + let emitResult = program.emit(undefined, writeFile, undefined, true) + + let diagnostics = ts + .getPreEmitDiagnostics(program) + .concat(emitResult.diagnostics) + + let diagnosticMessages: string[] = [] + + diagnostics.forEach((diagnostic) => { + if (diagnostic.file) { + let { line, character } = ts.getLineAndCharacterOfPosition( + diagnostic.file, + diagnostic.start! + ) + let message = ts.flattenDiagnosticMessageText( + diagnostic.messageText, + '\n' + ) + diagnosticMessages.push( + `${diagnostic.file.fileName} (${line + 1},${character + 1}): ${message}` + ) + } else { + let message = ts.flattenDiagnosticMessageText( + diagnostic.messageText, + '\n' + ) + diagnosticMessages.push(message) + } + }) + + let diagnosticMessage = diagnosticMessages.join('\n') + if (diagnosticMessage) { + logger.error( + 'TSC', + 'Failed to emit declaration files.\n\n' + diagnosticMessage + ) + throw new Error('TypeScript compilation failed') + } + + return fileMapping +} + +const parseCompilerOptions = ( + compilerOptions: ts.CompilerOptions +): ts.CompilerOptions => { + const parsed = ts.parseJsonConfigFileContent( + { compilerOptions }, + ts.sys, + './' + ) + return parsed.options +} + +function emit(entry: Entry, dts?: ExperimentalDtsConfig) { + let declarationDir = ensureTempDeclarationDir() + + let fileNames: string[] = Array.isArray(entry) ? entry : Object.values(entry) + + let options: ts.CompilerOptions = parseCompilerOptions({ + ...dts?.compilerOptions, + + // Enable declaration emit and disable javascript emit + noEmit: false, + declaration: true, + declarationMap: true, + declarationDir: declarationDir, + emitDeclarationOnly: true, + }) + let host: ts.CompilerHost = ts.createCompilerHost(options) + let program: ts.Program = ts.createProgram(fileNames, options, host) + + let fileMapping = emitDtsFiles(program, host) + return getExports(program, fileMapping) +} + +export function runTypeScriptCompiler(options: NormalizedOptions) { + try { + const start = Date.now() + const getDuration = () => { + return `${Math.floor(Date.now() - start)}ms` + } + logger.info('tsc', 'Build start') + const exports = emit(options.entry, options.experimentalDts) + logger.success('tsc', `⚡️ Build success in ${getDuration()}`) + return exports + } catch (error) { + handleError(error) + logger.error('tsc', 'Build error') + } +} diff --git a/src/utils.ts b/src/utils.ts index ad1202b3..105bf0e7 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -3,6 +3,7 @@ import glob from 'globby' import resolveFrom from 'resolve-from' import strip from 'strip-json-comments' import { Format } from './options' +import path from 'path' export type MaybePromise = T | Promise @@ -137,7 +138,7 @@ export function defaultOutExtension({ }: { format: Format pkgType?: string -}): { js: string, dts: string } { +}): { js: string; dts: string } { let jsExtension = '.js' let dtsExtension = '.d.ts' const isModule = pkgType === 'module' @@ -157,3 +158,78 @@ export function defaultOutExtension({ dts: dtsExtension, } } + +export function ensureTempDeclarationDir(): string { + const cwd = process.cwd() + const dirPath = path.join(cwd, '.tsup', 'declaration') + + if (fs.existsSync(dirPath)) { + return dirPath + } + + fs.mkdirSync(dirPath, { recursive: true }) + + const gitIgnorePath = path.join(cwd, '.tsup', '.gitignore') + writeFileSync(gitIgnorePath, '**/*\n') + + return dirPath +} + +// Make sure the entry is an object +// We use the base path (without extension) as the entry name +// To make declaration files work with multiple entrypoints +// See #316 +export const toObjectEntry = (entry: string[]) => { + entry = entry.map((e) => e.replace(/\\/g, '/')) + const ancestor = findLowestCommonAncestor(entry) + return entry.reduce((result, item) => { + const key = item + .replace(ancestor, '') + .replace(/^\//, '') + .replace(/\.[a-z]+$/, '') + return { + ...result, + [key]: item, + } + }, {} as Record) +} + +const findLowestCommonAncestor = (filepaths: string[]) => { + if (filepaths.length <= 1) return '' + const [first, ...rest] = filepaths + let ancestor = first.split('/') + for (const filepath of rest) { + const directories = filepath.split('/', ancestor.length) + let index = 0 + for (const directory of directories) { + if (directory === ancestor[index]) { + index += 1 + } else { + ancestor = ancestor.slice(0, index) + break + } + } + ancestor = ancestor.slice(0, index) + } + + return ancestor.length <= 1 && ancestor[0] === '' + ? '/' + ancestor[0] + : ancestor.join('/') +} + +export function toAbsolutePath(p: string, cwd?: string): string { + if (path.isAbsolute(p)) { + return p + } + + return slash(path.normalize(path.join(cwd || process.cwd(), p))) +} + +export function trimDtsExtension(fileName: string) { + return fileName.replace(/\.d\.(ts|mts|cts)x?$/, '') +} + +export function writeFileSync(filePath: string, content: string) { + fs.mkdirSync(path.dirname(filePath), { recursive: true }) + fs.writeFileSync(filePath, content) +} diff --git a/test/__snapshots__/index.test.ts.snap b/test/__snapshots__/index.test.ts.snap index 8ec15c03..b760da11 100644 --- a/test/__snapshots__/index.test.ts.snap +++ b/test/__snapshots__/index.test.ts.snap @@ -180,6 +180,241 @@ export { stuff }; " `; +exports[`should emit declaration files with experimentalDts 1`] = ` +" +////////////////////////////////////////////////////////////////////// +// dist/_tsup-dts-rollup.d.mts +////////////////////////////////////////////////////////////////////// + +import { renderToNodeStream } from 'react-dom/server'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { renderToStaticNodeStream } from 'react-dom/server'; +import { renderToString } from 'react-dom/server'; +import * as ServerThirdPartyNamespace from 'react-dom'; +import { version } from 'react-dom/server'; + +declare interface ClientRenderOptions { + document: boolean; +} +export { ClientRenderOptions } +export { ClientRenderOptions as ClientRenderOptions_alias_1 } + +export declare function default_alias(options: ServerRenderOptions): void; + +declare function render(options: ClientRenderOptions): string; +export { render } +export { render as render_alias_1 } + +/** + * Comment for server render function + */ +export declare function render_alias_2(options: ServerRenderOptions): string; + +export { renderToNodeStream } + +export { renderToStaticMarkup } + +export { renderToStaticNodeStream } + +export { renderToString } + +export declare class ServerClass { +} + +declare const serverConstant = 1; +export { serverConstant } +export { serverConstant as serverConstantAlias } + +export declare interface ServerRenderOptions { + /** + * Comment for ServerRenderOptions.stream + * + * @public + * + * @my_custom_tag + */ + stream: boolean; +} + +export { ServerThirdPartyNamespace } + +declare function sharedFunction(value: T): T | null; +export { sharedFunction } +export { sharedFunction as sharedFunction_alias_1 } +export { sharedFunction as sharedFunction_alias_2 } + +declare type sharedType = { + shared: boolean; +}; +export { sharedType } +export { sharedType as sharedType_alias_1 } +export { sharedType as sharedType_alias_2 } + +export declare const VERSION: \\"0.0.0\\"; + +export { version } + +export { } + + +////////////////////////////////////////////////////////////////////// +// dist/_tsup-dts-rollup.d.ts +////////////////////////////////////////////////////////////////////// + +import { renderToNodeStream } from 'react-dom/server'; +import { renderToStaticMarkup } from 'react-dom/server'; +import { renderToStaticNodeStream } from 'react-dom/server'; +import { renderToString } from 'react-dom/server'; +import * as ServerThirdPartyNamespace from 'react-dom'; +import { version } from 'react-dom/server'; + +declare interface ClientRenderOptions { + document: boolean; +} +export { ClientRenderOptions } +export { ClientRenderOptions as ClientRenderOptions_alias_1 } + +export declare function default_alias(options: ServerRenderOptions): void; + +declare function render(options: ClientRenderOptions): string; +export { render } +export { render as render_alias_1 } + +/** + * Comment for server render function + */ +export declare function render_alias_2(options: ServerRenderOptions): string; + +export { renderToNodeStream } + +export { renderToStaticMarkup } + +export { renderToStaticNodeStream } + +export { renderToString } + +export declare class ServerClass { +} + +declare const serverConstant = 1; +export { serverConstant } +export { serverConstant as serverConstantAlias } + +export declare interface ServerRenderOptions { + /** + * Comment for ServerRenderOptions.stream + * + * @public + * + * @my_custom_tag + */ + stream: boolean; +} + +export { ServerThirdPartyNamespace } + +declare function sharedFunction(value: T): T | null; +export { sharedFunction } +export { sharedFunction as sharedFunction_alias_1 } +export { sharedFunction as sharedFunction_alias_2 } + +declare type sharedType = { + shared: boolean; +}; +export { sharedType } +export { sharedType as sharedType_alias_1 } +export { sharedType as sharedType_alias_2 } + +export declare const VERSION: \\"0.0.0\\"; + +export { version } + +export { } + + +////////////////////////////////////////////////////////////////////// +// dist/index.d.mts +////////////////////////////////////////////////////////////////////// + +export { VERSION } from './_tsup-dts-rollup'; +export { render } from './_tsup-dts-rollup'; +export { ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction } from './_tsup-dts-rollup'; +export { sharedType } from './_tsup-dts-rollup'; + + +////////////////////////////////////////////////////////////////////// +// dist/index.d.ts +////////////////////////////////////////////////////////////////////// + +export { VERSION } from './_tsup-dts-rollup'; +export { render } from './_tsup-dts-rollup'; +export { ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction } from './_tsup-dts-rollup'; +export { sharedType } from './_tsup-dts-rollup'; + + +////////////////////////////////////////////////////////////////////// +// dist/my-lib-client.d.mts +////////////////////////////////////////////////////////////////////// + +export { render_alias_1 as render } from './_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; + + +////////////////////////////////////////////////////////////////////// +// dist/my-lib-client.d.ts +////////////////////////////////////////////////////////////////////// + +export { render_alias_1 as render } from './_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; + + +////////////////////////////////////////////////////////////////////// +// dist/server/index.d.mts +////////////////////////////////////////////////////////////////////// + +export { render_alias_2 as render } from '../_tsup-dts-rollup'; +export { default_alias as default } from '../_tsup-dts-rollup'; +export { ServerRenderOptions } from '../_tsup-dts-rollup'; +export { serverConstant } from '../_tsup-dts-rollup'; +export { serverConstantAlias } from '../_tsup-dts-rollup'; +export { ServerClass } from '../_tsup-dts-rollup'; +export { ServerThirdPartyNamespace } from '../_tsup-dts-rollup'; +export { sharedFunction_alias_2 as sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType_alias_2 as sharedType } from '../_tsup-dts-rollup'; +export { renderToString } from '../_tsup-dts-rollup'; +export { renderToNodeStream } from '../_tsup-dts-rollup'; +export { renderToStaticMarkup } from '../_tsup-dts-rollup'; +export { renderToStaticNodeStream } from '../_tsup-dts-rollup'; +export { version } from '../_tsup-dts-rollup'; + + +////////////////////////////////////////////////////////////////////// +// dist/server/index.d.ts +////////////////////////////////////////////////////////////////////// + +export { render_alias_2 as render } from '../_tsup-dts-rollup'; +export { default_alias as default } from '../_tsup-dts-rollup'; +export { ServerRenderOptions } from '../_tsup-dts-rollup'; +export { serverConstant } from '../_tsup-dts-rollup'; +export { serverConstantAlias } from '../_tsup-dts-rollup'; +export { ServerClass } from '../_tsup-dts-rollup'; +export { ServerThirdPartyNamespace } from '../_tsup-dts-rollup'; +export { sharedFunction_alias_2 as sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType_alias_2 as sharedType } from '../_tsup-dts-rollup'; +export { renderToString } from '../_tsup-dts-rollup'; +export { renderToNodeStream } from '../_tsup-dts-rollup'; +export { renderToStaticMarkup } from '../_tsup-dts-rollup'; +export { renderToStaticNodeStream } from '../_tsup-dts-rollup'; +export { version } from '../_tsup-dts-rollup'; +" +`; + exports[`simple 1`] = ` "\\"use strict\\"; var __defProp = Object.defineProperty; diff --git a/test/index.test.ts b/test/index.test.ts index df2c19d7..80061a48 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -5,7 +5,7 @@ import fs from 'fs-extra' import glob from 'globby' import waitForExpect from 'wait-for-expect' import { fileURLToPath } from 'url' -import { debouncePromise } from '../src/utils' +import { debouncePromise, slash } from '../src/utils' const __dirname = path.dirname(fileURLToPath(import.meta.url)) @@ -1345,9 +1345,14 @@ test('should emit a declaration file per format', async () => { format: ['esm', 'cjs'], dts: true }`, - }); - expect(outFiles).toEqual(['input.d.mts', 'input.d.ts', 'input.js', 'input.mjs']) -}); + }) + expect(outFiles).toEqual([ + 'input.d.mts', + 'input.d.ts', + 'input.js', + 'input.mjs', + ]) +}) test('should emit a declaration file per format (type: module)', async () => { const { outFiles } = await run(getTestName(), { @@ -1361,6 +1366,159 @@ test('should emit a declaration file per format (type: module)', async () => { format: ['esm', 'cjs'], dts: true }`, - }); - expect(outFiles).toEqual(['input.cjs', 'input.d.cts', 'input.d.ts', 'input.js']) -}); + }) + expect(outFiles).toEqual([ + 'input.cjs', + 'input.d.cts', + 'input.d.ts', + 'input.js', + ]) +}) + +test('should emit declaration files with experimentalDts', async () => { + const files = { + 'package.json': ` + { + "name": "tsup-playground", + "private": true, + "version": "0.0.0", + "main": "dist/index.js", + "module": "dist/index.mjs", + "types": "dist/index.d.ts", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "require": "./dist/index.js", + "import": "./dist/index.mjs", + "default": "./dist/index.js" + }, + "./client": { + "types": "./dist/my-lib-client.d.ts", + "require": "./dist/my-lib-client.js", + "import": "./dist/my-lib-client.mjs", + "default": "./dist/my-lib-client.js" + }, + "./server": { + "types": "./dist/server/index.d.ts", + "require": "./dist/server/index.js", + "import": "./dist/server/index.mjs", + "default": "./dist/server/index.js" + } + } + } + `, + 'tsconfig.json': ` + { + "compilerOptions": { + "target": "ES2020", + "skipLibCheck": true, + "noEmit": true + }, + "include": ["./src"] + } + `, + 'tsup.config.ts': ` + export default { + name: 'tsup', + target: 'es2022', + format: [ + 'esm', + 'cjs' + ], + entry: { + index: './src/index.ts', + 'my-lib-client': './src/client.ts', + 'server/index': './src/server.ts', + }, + } + `, + 'src/shared.ts': ` + export function sharedFunction(value: T): T | null { + return value || null + } + + type sharedType = { + shared: boolean + } + + export type { sharedType } + `, + 'src/server.ts': ` + export * from './shared' + + /** + * Comment for server render function + */ + export function render(options: ServerRenderOptions): string { + return JSON.stringify(options) + } + + export interface ServerRenderOptions { + /** + * Comment for ServerRenderOptions.stream + * + * @public + * + * @my_custom_tag + */ + stream: boolean + } + + export const serverConstant = 1 + + export { serverConstant as serverConstantAlias } + + export class ServerClass {}; + + export default function serverDefaultExport(options: ServerRenderOptions): void {}; + + // Export a third party module as a namespace + import * as ServerThirdPartyNamespace from 'react-dom'; + export { ServerThirdPartyNamespace } + + // Export a third party module + export * from 'react-dom/server'; + + `, + 'src/client.ts': ` + export * from './shared' + + export function render(options: ClientRenderOptions): string { + return JSON.stringify(options) + } + + export interface ClientRenderOptions { + document: boolean + } + `, + 'src/index.ts': ` + export * from './client' + + export const VERSION = '0.0.0' as const + `, + } + const { outFiles, getFileContent } = await run(getTestName(), files, { + entry: [], + flags: ['--experimental-dts'], + }) + const snapshots: string[] = [] + await Promise.all( + outFiles + .filter((outFile) => outFile.includes('.d.')) + .map(async (outFile) => { + const filePath = path.join('dist', outFile) + const content = await getFileContent(filePath) + snapshots.push( + [ + '', + '/'.repeat(70), + `// ${path.posix.normalize(slash(filePath))}`, + '/'.repeat(70), + '', + content, + ].join('\n') + ) + }) + ) + expect(snapshots.sort().join('\n')).toMatchSnapshot() +}) From 04cf1c521b744e8eadb313093095553be9d483aa Mon Sep 17 00:00:00 2001 From: ocavue Date: Sun, 3 Sep 2023 18:35:15 +0800 Subject: [PATCH 02/13] Make typescript compiler to read all included files --- src/api-extractor.ts | 15 +++-------- src/index.ts | 29 ++++++++++++++++----- src/options.ts | 13 +++++++--- src/tsc.ts | 28 ++++++++++++++++----- src/utils.ts | 12 ++++++--- test/__snapshots__/index.test.ts.snap | 36 +++++++++++++++------------ 6 files changed, 87 insertions(+), 46 deletions(-) diff --git a/src/api-extractor.ts b/src/api-extractor.ts index cdbbf85a..abf45d6f 100644 --- a/src/api-extractor.ts +++ b/src/api-extractor.ts @@ -12,17 +12,15 @@ import { formatDistributionExports, type ExportDeclaration, } from './exports' +import { loadPkg } from './load' import { createLogger } from './log' import { Format, NormalizedOptions } from './options' import { defaultOutExtension, ensureTempDeclarationDir, toAbsolutePath, - toObjectEntry, - trimDtsExtension, writeFileSync, } from './utils' -import { loadPkg } from './load' const logger = createLogger() @@ -81,13 +79,6 @@ async function rollupDtsFiles( exports: ExportDeclaration[], format: Format ) { - const dtsOptions = options.experimentalDts || {} - dtsOptions.entry = dtsOptions.entry || options.entry - - if (Array.isArray(dtsOptions.entry) && dtsOptions.entry.length > 1) { - dtsOptions.entry = toObjectEntry(dtsOptions.entry) - } - let declarationDir = ensureTempDeclarationDir() let outDir = options.outDir || 'dist' let pkg = await loadPkg(process.cwd()) @@ -110,7 +101,9 @@ async function rollupDtsFiles( options.tsconfig || 'tsconfig.json' ) - for (let [out, sourceFileName] of Object.entries(dtsOptions.entry)) { + for (let [out, sourceFileName] of Object.entries( + options.experimentalDts!.entry + )) { sourceFileName = toAbsolutePath(sourceFileName) const outFileName = path.join(outDir, out + dtsExtension) diff --git a/src/index.ts b/src/index.ts index 891b9d0a..dab3c9b2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,7 +1,13 @@ import path from 'path' import fs from 'fs' import { Worker } from 'worker_threads' -import { removeFiles, debouncePromise, slash, MaybePromise } from './utils' +import { + removeFiles, + debouncePromise, + slash, + MaybePromise, + toObjectEntry, +} from './utils' import { getAllDepsHash, loadTsupConfig } from './load' import glob from 'globby' import { loadTsConfig } from 'bundle-require' @@ -70,14 +76,20 @@ const normalizeOptions = async ( : typeof _options.dts === 'string' ? { entry: _options.dts } : _options.dts, - experimentalDts: - typeof _options.experimentalDts === 'boolean' + experimentalDts: _options.experimentalDts + ? typeof _options.experimentalDts === 'boolean' ? _options.experimentalDts - ? {} + ? { entry: {} } : undefined : typeof _options.experimentalDts === 'string' - ? { entry: _options.experimentalDts } - : _options.experimentalDts, + ? { + entry: toObjectEntry(_options.experimentalDts), + } + : { + ..._options.experimentalDts, + entry: toObjectEntry(_options.experimentalDts.entry || {}), + } + : undefined, } setSilent(options.silent) @@ -128,6 +140,11 @@ const normalizeOptions = async ( ...(tsconfig.data.compilerOptions || {}), ...(options.experimentalDts.compilerOptions || {}), } + options.experimentalDts.entry = toObjectEntry( + Object.keys(options.experimentalDts.entry).length > 0 + ? options.experimentalDts.entry + : options.entry + ) } if (!options.target) { options.target = tsconfig.data?.compilerOptions?.target?.toLowerCase() diff --git a/src/options.ts b/src/options.ts index 57434400..0921abda 100644 --- a/src/options.ts +++ b/src/options.ts @@ -1,9 +1,9 @@ import type { BuildOptions, Plugin as EsbuildPlugin, Loader } from 'esbuild' import type { InputOption } from 'rollup' +import type { MinifyOptions } from 'terser' import { MarkRequired } from 'ts-essentials' import type { Plugin } from './plugin' import type { TreeshakingStrategy } from './plugins/tree-shaking' -import type { MinifyOptions } from 'terser' export type KILL_SIGNAL = 'SIGKILL' | 'SIGTERM' @@ -149,7 +149,7 @@ export type Options = { /** * Code splitting * Default to `true` for ESM, `false` for CJS. - * + * * You can set it to `true` explicitly, and may want to disable code splitting sometimes: [`#255`](https://github.com/egoist/tsup/issues/255) */ splitting?: boolean @@ -242,12 +242,17 @@ export type Options = { cjsInterop?: boolean } +export interface NormalizedExperimentalDtsConfig { + entry: { [entryAlias: string]: string } + compilerOptions?: any +} + export type NormalizedOptions = Omit< MarkRequired, - 'dts' | 'format' + 'dts' | 'experimentalDts' | 'format' > & { dts?: DtsConfig - experimentalDts?: ExperimentalDtsConfig + experimentalDts?: NormalizedExperimentalDtsConfig tsconfigResolvePaths: Record tsconfigDecoratorMetadata?: boolean format: Format[] diff --git a/src/tsc.ts b/src/tsc.ts index 8ef939c6..ec9a5776 100644 --- a/src/tsc.ts +++ b/src/tsc.ts @@ -1,8 +1,9 @@ +import { loadTsConfig } from 'bundle-require' import ts from 'typescript' import { handleError } from './errors' import { ExportDeclaration } from './exports' import { createLogger } from './log' -import { Entry, ExperimentalDtsConfig, NormalizedOptions } from './options' +import { NormalizedOptions } from './options' import { ensureTempDeclarationDir, toAbsolutePath } from './utils' const logger = createLogger() @@ -169,13 +170,23 @@ const parseCompilerOptions = ( return parsed.options } -function emit(entry: Entry, dts?: ExperimentalDtsConfig) { +function emit(compilerOptions?: any, tsconfig?: string) { + let cwd = process.cwd() + let rawTsconfig = loadTsConfig(cwd, tsconfig) + if (!rawTsconfig) { + throw new Error(`Unable to find ${tsconfig || 'tsconfig.json'} in ${cwd}`) + } + let declarationDir = ensureTempDeclarationDir() - let fileNames: string[] = Array.isArray(entry) ? entry : Object.values(entry) + let parsedTsconfig = ts.parseJsonConfigFileContent( + rawTsconfig.data, + ts.sys, + cwd + ) let options: ts.CompilerOptions = parseCompilerOptions({ - ...dts?.compilerOptions, + ...compilerOptions, // Enable declaration emit and disable javascript emit noEmit: false, @@ -185,7 +196,11 @@ function emit(entry: Entry, dts?: ExperimentalDtsConfig) { emitDeclarationOnly: true, }) let host: ts.CompilerHost = ts.createCompilerHost(options) - let program: ts.Program = ts.createProgram(fileNames, options, host) + let program: ts.Program = ts.createProgram( + parsedTsconfig.fileNames, + options, + host + ) let fileMapping = emitDtsFiles(program, host) return getExports(program, fileMapping) @@ -198,7 +213,8 @@ export function runTypeScriptCompiler(options: NormalizedOptions) { return `${Math.floor(Date.now() - start)}ms` } logger.info('tsc', 'Build start') - const exports = emit(options.entry, options.experimentalDts) + const dtsOptions = options.experimentalDts! + const exports = emit(dtsOptions.compilerOptions, options.tsconfig) logger.success('tsc', `⚡️ Build success in ${getDuration()}`) return exports } catch (error) { diff --git a/src/utils.ts b/src/utils.ts index 105bf0e7..27deeb12 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,9 +1,9 @@ import fs from 'fs' import glob from 'globby' +import path from 'path' import resolveFrom from 'resolve-from' import strip from 'strip-json-comments' -import { Format } from './options' -import path from 'path' +import { Entry, Format } from './options' export type MaybePromise = T | Promise @@ -179,7 +179,13 @@ export function ensureTempDeclarationDir(): string { // We use the base path (without extension) as the entry name // To make declaration files work with multiple entrypoints // See #316 -export const toObjectEntry = (entry: string[]) => { +export const toObjectEntry = (entry: string | Entry) => { + if (typeof entry === 'string') { + entry = [entry] + } + if (!Array.isArray(entry)) { + return entry + } entry = entry.map((e) => e.replace(/\\/g, '/')) const ancestor = findLowestCommonAncestor(entry) return entry.reduce((result, item) => { diff --git a/test/__snapshots__/index.test.ts.snap b/test/__snapshots__/index.test.ts.snap index b760da11..bd009ca6 100644 --- a/test/__snapshots__/index.test.ts.snap +++ b/test/__snapshots__/index.test.ts.snap @@ -242,6 +242,7 @@ declare function sharedFunction(value: T): T | null; export { sharedFunction } export { sharedFunction as sharedFunction_alias_1 } export { sharedFunction as sharedFunction_alias_2 } +export { sharedFunction as sharedFunction_alias_3 } declare type sharedType = { shared: boolean; @@ -249,6 +250,7 @@ declare type sharedType = { export { sharedType } export { sharedType as sharedType_alias_1 } export { sharedType as sharedType_alias_2 } +export { sharedType as sharedType_alias_3 } export declare const VERSION: \\"0.0.0\\"; @@ -317,6 +319,7 @@ declare function sharedFunction(value: T): T | null; export { sharedFunction } export { sharedFunction as sharedFunction_alias_1 } export { sharedFunction as sharedFunction_alias_2 } +export { sharedFunction as sharedFunction_alias_3 } declare type sharedType = { shared: boolean; @@ -324,6 +327,7 @@ declare type sharedType = { export { sharedType } export { sharedType as sharedType_alias_1 } export { sharedType as sharedType_alias_2 } +export { sharedType as sharedType_alias_3 } export declare const VERSION: \\"0.0.0\\"; @@ -337,10 +341,10 @@ export { } ////////////////////////////////////////////////////////////////////// export { VERSION } from './_tsup-dts-rollup'; -export { render } from './_tsup-dts-rollup'; -export { ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction } from './_tsup-dts-rollup'; -export { sharedType } from './_tsup-dts-rollup'; +export { render_alias_1 as render } from './_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -348,30 +352,30 @@ export { sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// export { VERSION } from './_tsup-dts-rollup'; -export { render } from './_tsup-dts-rollup'; -export { ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction } from './_tsup-dts-rollup'; -export { sharedType } from './_tsup-dts-rollup'; +export { render_alias_1 as render } from './_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// // dist/my-lib-client.d.mts ////////////////////////////////////////////////////////////////////// -export { render_alias_1 as render } from './_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; +export { render } from './_tsup-dts-rollup'; +export { ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction } from './_tsup-dts-rollup'; +export { sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// // dist/my-lib-client.d.ts ////////////////////////////////////////////////////////////////////// -export { render_alias_1 as render } from './_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; +export { render } from './_tsup-dts-rollup'; +export { ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction } from './_tsup-dts-rollup'; +export { sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// From 106aae8c52cff0b2e81b5daf9688ec7e44ef7c5b Mon Sep 17 00:00:00 2001 From: ocavue Date: Tue, 19 Sep 2023 19:24:06 +0800 Subject: [PATCH 03/13] Make @microsoft/api-extractor as a peerDep --- docs/README.md | 14 +++++- package.json | 6 ++- pnpm-lock.yaml | 113 ++++++++++++++++++++++++++----------------------- 3 files changed, 78 insertions(+), 55 deletions(-) diff --git a/docs/README.md b/docs/README.md index ebbd77df..b3c07ba6 100644 --- a/docs/README.md +++ b/docs/README.md @@ -193,11 +193,19 @@ If you have multiple entry files, each entry will get a corresponding `.d.ts` fi Note that `--dts` does not resolve external (aka in `node_modules`) types used in the `.d.ts` file, if that's somehow a requirement, try the experimental `--dts-resolve` flag instead. -Since tsup version 7.3.0, you can also use `--experimental-dts` flag to generate declaration files. This flag use [@microsoft/api-extractor](https://www.npmjs.com/package/@microsoft/api-extractor) to generate declaration files, which is more reliable than the previous `--dts` flag. It's still experimental and we are looking for feedbacks. +Since tsup version 7.3.0, you can also use `--experimental-dts` flag to generate declaration files. This flag use [@microsoft/api-extractor](https://www.npmjs.com/package/@microsoft/api-extractor) to generate declaration files, which is more reliable than the previous `--dts` flag. It's still experimental and we are looking for feedbacks. + +To use `--experimental-dts`, you would need to install `@microsoft/api-extractor`, as it's a peer dependency if tsup: + +```bash +npm i @microsoft/api-extractor -D +# Or Yarn +yarn add @microsoft/api-extractor --dev +``` #### Emit declaration file only -The `--dts-only` flag is the equivalent of the `emitDeclarationOnly` option in `tsc`. Using this flag will only emit the declaration file, without the JavaScript files. +The `--dts-only` flag is the equivalent of the `emitDeclarationOnly` option in `tsc`. Using this flag will only emit the declaration file, without the JavaScript files. #### Generate TypeScript declaration maps (.d.ts.map) @@ -502,6 +510,8 @@ esbuild has [experimental CSS support](https://esbuild.github.io/content-types/# To use PostCSS, you need to install PostCSS: ```bash +npm i postcss -D +# Or Yarn yarn add postcss --dev ``` diff --git a/package.json b/package.json index 18564c70..cfd6b283 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "build-fast": "npm run build -- --no-dts" }, "dependencies": { - "@microsoft/api-extractor": "^7.36.4", "bundle-require": "^4.0.0", "cac": "^6.7.12", "chokidar": "^3.5.1", @@ -45,6 +44,7 @@ "tree-kill": "^1.2.2" }, "devDependencies": { + "@microsoft/api-extractor": "^7.37.0", "@rollup/plugin-json": "5.0.1", "@swc/core": "1.2.218", "@types/debug": "4.1.7", @@ -76,6 +76,7 @@ }, "peerDependencies": { "@swc/core": "^1", + "@microsoft/api-extractor": "^7.36.0", "postcss": "^8.4.12", "typescript": ">=4.1.0" }, @@ -88,6 +89,9 @@ }, "@swc/core": { "optional": true + }, + "@microsoft/api-extractor": { + "optional": true } }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 00be740e..0d7a1b9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,9 +5,6 @@ settings: excludeLinksFromLockfile: false dependencies: - '@microsoft/api-extractor': - specifier: ^7.36.4 - version: 7.36.4(@types/node@14.18.12) bundle-require: specifier: ^4.0.0 version: 4.0.0(esbuild@0.19.2) @@ -52,6 +49,9 @@ dependencies: version: 1.2.2 devDependencies: + '@microsoft/api-extractor': + specifier: ^7.37.0 + version: 7.37.0(@types/node@14.18.12) '@rollup/plugin-json': specifier: 5.0.1 version: 5.0.1(rollup@3.8.1) @@ -597,26 +597,26 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@microsoft/api-extractor-model@7.27.6(@types/node@14.18.12): - resolution: {integrity: sha512-eiCnlayyum1f7fS2nA9pfIod5VCNR1G+Tq84V/ijDrKrOFVa598BLw145nCsGDMoFenV6ajNi2PR5WCwpAxW6Q==} + /@microsoft/api-extractor-model@7.28.0(@types/node@14.18.12): + resolution: {integrity: sha512-QIMtUVm1tqiKG+M6ciFgRShcDoovyltaeg+CbyOnyr7SMrp6gg0ojK5/nToMqR9kAvsTS4QVgW4Twl50EoAjcw==} dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.59.7(@types/node@14.18.12) + '@rushstack/node-core-library': 3.60.0(@types/node@14.18.12) transitivePeerDependencies: - '@types/node' - dev: false + dev: true - /@microsoft/api-extractor@7.36.4(@types/node@14.18.12): - resolution: {integrity: sha512-21UECq8C/8CpHT23yiqTBQ10egKUacIpxkPyYR7hdswo/M5yTWdBvbq+77YC9uPKQJOUfOD1FImBQ1DzpsdeQQ==} + /@microsoft/api-extractor@7.37.0(@types/node@14.18.12): + resolution: {integrity: sha512-df/wffWpDhYRw7kzdxeHGsCpim+dC8aFiZlsJb4uFvVPWhBZpDzOhQxSUTFx3Df1ORY+/JjuPR3fDE9Hq+PHzQ==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.27.6(@types/node@14.18.12) + '@microsoft/api-extractor-model': 7.28.0(@types/node@14.18.12) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.59.7(@types/node@14.18.12) - '@rushstack/rig-package': 0.4.1 - '@rushstack/ts-command-line': 4.15.2 + '@rushstack/node-core-library': 3.60.0(@types/node@14.18.12) + '@rushstack/rig-package': 0.5.0 + '@rushstack/ts-command-line': 4.16.0 colors: 1.2.5 lodash: 4.17.21 resolve: 1.22.1 @@ -625,7 +625,7 @@ packages: typescript: 5.0.4 transitivePeerDependencies: - '@types/node' - dev: false + dev: true /@microsoft/tsdoc-config@0.16.2: resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} @@ -634,11 +634,11 @@ packages: ajv: 6.12.6 jju: 1.4.0 resolve: 1.19.0 - dev: false + dev: true /@microsoft/tsdoc@0.14.2: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - dev: false + dev: true /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -686,8 +686,8 @@ packages: rollup: 3.8.1 dev: true - /@rushstack/node-core-library@3.59.7(@types/node@14.18.12): - resolution: {integrity: sha512-ln1Drq0h+Hwa1JVA65x5mlSgUrBa1uHL+V89FqVWQgXd1vVIMhrtqtWGQrhTnFHxru5ppX+FY39VWELF/FjQCw==} + /@rushstack/node-core-library@3.60.0(@types/node@14.18.12): + resolution: {integrity: sha512-PcyrqhILvzU+65wMFybQ2VeGNnU5JzhDq2OvUi3j6jPUxyllM7b2hrRUwCuVaYboewYzIbpzXFzgxe2K7ii1nw==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -702,23 +702,23 @@ packages: resolve: 1.22.1 semver: 7.5.4 z-schema: 5.0.5 - dev: false + dev: true - /@rushstack/rig-package@0.4.1: - resolution: {integrity: sha512-AGRwpqlXNSp9LhUSz4HKI9xCluqQDt/obsQFdv/NYIekF3pTTPzc+HbQsIsjVjYnJ3DcmxOREVMhvrMEjpiq6g==} + /@rushstack/rig-package@0.5.0: + resolution: {integrity: sha512-bGnOW4DWHOePDiABKy6qyqYJl9i7fKn4bRucExRVt5QzyPxuVHMl8CMmCabtoNSpXzgG3qymWOrMoa/W2PpJrw==} dependencies: resolve: 1.22.1 strip-json-comments: 3.1.1 - dev: false + dev: true - /@rushstack/ts-command-line@4.15.2: - resolution: {integrity: sha512-5+C2uoJY8b+odcZD6coEe2XNC4ZjGB4vCMESbqW/8DHRWC/qIHfANdmN9F1wz/lAgxz72i7xRoVtPY2j7e4gpQ==} + /@rushstack/ts-command-line@4.16.0: + resolution: {integrity: sha512-WJKhdR9ThK9Iy7t78O3at7I3X4Ssp5RRZay/IQa8NywqkFy/DQbT3iLouodMMdUwLZD9n8n++xLubVd3dkmpkg==} dependencies: '@types/argparse': 1.0.38 argparse: 1.0.10 colors: 1.2.5 string-argv: 0.3.2 - dev: false + dev: true /@swc/core-android-arm-eabi@1.2.218: resolution: {integrity: sha512-Q/uLCh262t3xxNzhCz+ZW9t+g2nWd0gZZO4jMYFWJs7ilKVNsBfRtfnNGGACHzkVuWLNDIWtAS2PSNodl7VUHQ==} @@ -864,7 +864,7 @@ packages: /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - dev: false + dev: true /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} @@ -906,6 +906,7 @@ packages: /@types/node@14.18.12: resolution: {integrity: sha512-q4jlIR71hUpWTnGhXWcakgkZeHa3CCjcQcnuzU8M891BAWA2jHiziiWEPEkdS5pFsz7H9HJiy8BrK7tBRNrY7A==} + dev: true /@types/pug@2.0.6: resolution: {integrity: sha512-SnHmG9wN1UVmagJOnyo/qkk0Z7gejYxOYYmaAwr5u2yFYfsupN3sg10kyzN8Hep/2zbHxCnsumxOoRIRMBwKCg==} @@ -971,7 +972,7 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: false + dev: true /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -1015,7 +1016,7 @@ packages: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} dependencies: sprintf-js: 1.0.3 - dev: false + dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -1150,7 +1151,7 @@ packages: /colors@1.2.5: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} engines: {node: '>=0.1.90'} - dev: false + dev: true /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -1164,7 +1165,7 @@ packages: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} requiresBuild: true - dev: false + dev: true optional: true /concat-map@0.0.1: @@ -1535,7 +1536,7 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: false + dev: true /fast-glob@3.2.7: resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} @@ -1549,7 +1550,7 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: false + dev: true /fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} @@ -1583,7 +1584,7 @@ packages: graceful-fs: 4.2.8 jsonfile: 4.0.0 universalify: 0.1.2 - dev: false + dev: true /fs.realpath@1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} @@ -1597,6 +1598,7 @@ packages: /function-bind@1.1.1: resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + dev: true /get-func-name@2.0.0: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} @@ -1635,6 +1637,7 @@ packages: /graceful-fs@4.2.8: resolution: {integrity: sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==} + dev: true /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} @@ -1647,6 +1650,7 @@ packages: engines: {node: '>= 0.4.0'} dependencies: function-bind: 1.1.1 + dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -1663,7 +1667,7 @@ packages: /import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - dev: false + dev: true /inflight@1.0.6: resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} @@ -1690,6 +1694,7 @@ packages: resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==} dependencies: has: 1.0.3 + dev: true /is-extglob@2.1.1: resolution: {integrity: sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=} @@ -1719,7 +1724,7 @@ packages: /jju@1.4.0: resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} - dev: false + dev: true /joycon@3.0.1: resolution: {integrity: sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==} @@ -1732,7 +1737,7 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: false + dev: true /json5@1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} @@ -1749,7 +1754,7 @@ packages: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} optionalDependencies: graceful-fs: 4.2.8 - dev: false + dev: true /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} @@ -1777,18 +1782,18 @@ packages: /lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} - dev: false + dev: true /lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: false + dev: true /lodash.sortby@4.7.0: resolution: {integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=} /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: false + dev: true /loupe@2.3.1: resolution: {integrity: sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==} @@ -1807,7 +1812,7 @@ packages: engines: {node: '>=10'} dependencies: yallist: 4.0.0 - dev: false + dev: true /magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -1948,6 +1953,7 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -2070,7 +2076,7 @@ packages: dependencies: is-core-module: 2.9.0 path-parse: 1.0.7 - dev: false + dev: true /resolve@1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} @@ -2086,6 +2092,7 @@ packages: is-core-module: 2.9.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + dev: true /reusify@1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} @@ -2167,7 +2174,7 @@ packages: hasBin: true dependencies: lru-cache: 6.0.0 - dev: false + dev: true /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} @@ -2222,6 +2229,7 @@ packages: /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + dev: true /source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} @@ -2236,7 +2244,7 @@ packages: /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - dev: false + dev: true /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} @@ -2249,7 +2257,7 @@ packages: /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - dev: false + dev: true /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} @@ -2286,7 +2294,7 @@ packages: /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - dev: false + dev: true /strip-json-comments@4.0.0: resolution: {integrity: sha512-LzWcbfMbAsEDTRmhjWIioe8GcDRl0fa35YMXFoJKDdiD/quGFmjJjdgPjFJJNwCMaLyQqFIDqCdHD2V4HfLgYA==} @@ -2322,6 +2330,7 @@ packages: /supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + dev: true /svelte-preprocess@5.0.3(postcss-load-config@4.0.1)(postcss@8.4.12)(sass@1.62.1)(svelte@3.46.4)(typescript@5.0.2): resolution: {integrity: sha512-GrHF1rusdJVbOZOwgPWtpqmaexkydznKzy5qIC2FabgpFyKN57bjMUUUqPRfbBXK5igiEWn1uO/DXsa2vJ5VHA==} @@ -2502,7 +2511,7 @@ packages: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} engines: {node: '>=12.20'} hasBin: true - dev: false + dev: true /ufo@1.0.1: resolution: {integrity: sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==} @@ -2511,7 +2520,7 @@ packages: /universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - dev: false + dev: true /universalify@2.0.0: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} @@ -2522,12 +2531,12 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.1.1 - dev: false + dev: true /validator@13.11.0: resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} engines: {node: '>= 0.10'} - dev: false + dev: true /vite-node@0.28.4(sass@1.62.1)(terser@5.16.0): resolution: {integrity: sha512-KM0Q0uSG/xHHKOJvVHc5xDBabgt0l70y7/lWTR7Q0pR5/MrYxadT+y32cJOE65FfjGmJgxpVEEY+69btJgcXOQ==} @@ -2668,7 +2677,7 @@ packages: /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - dev: false + dev: true /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} @@ -2689,4 +2698,4 @@ packages: validator: 13.11.0 optionalDependencies: commander: 9.5.0 - dev: false + dev: true From 7105ba60765aedc45d507c564b2644e76a05fb0c Mon Sep 17 00:00:00 2001 From: ocavue Date: Tue, 19 Sep 2023 19:31:10 +0800 Subject: [PATCH 04/13] Use dynamic import to load api-extractor --- src/api-extractor.ts | 6 +++--- src/index.ts | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/api-extractor.ts b/src/api-extractor.ts index abf45d6f..e6696c56 100644 --- a/src/api-extractor.ts +++ b/src/api-extractor.ts @@ -1,9 +1,9 @@ import { Extractor, ExtractorConfig, - ExtractorResult, - IConfigFile, - IExtractorConfigPrepareOptions, + type ExtractorResult, + type IConfigFile, + type IExtractorConfigPrepareOptions, } from '@microsoft/api-extractor' import path from 'path' import { handleError } from './errors' diff --git a/src/index.ts b/src/index.ts index dab3c9b2..73ce3196 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,7 +28,6 @@ import { treeShakingPlugin } from './plugins/tree-shaking' import { copyPublicDir, isInPublicDir } from './lib/public-dir' import { terserPlugin } from './plugins/terser' import { runTypeScriptCompiler } from './tsc' -import { runDtsRollup } from './api-extractor' import { cjsInterop } from './plugins/cjs-interop' export type { Format, Options, NormalizedOptions } @@ -198,6 +197,8 @@ export async function build(_options: Options) { } if (options.experimentalDts) { + const { runDtsRollup } = await import('./api-extractor') + const exports = runTypeScriptCompiler(options) await runDtsRollup(options, exports) } From 2bf312358c47c9aa4ca6444fa4858287ace71d43 Mon Sep 17 00:00:00 2001 From: ocavue Date: Tue, 19 Sep 2023 19:49:15 +0800 Subject: [PATCH 05/13] Use localRequire to load @microsoft/api-extractor --- src/api-extractor.ts | 23 +++++++++++++++-------- src/esbuild/postcss.ts | 7 +++---- src/index.ts | 3 +-- src/utils.ts | 11 ++++++++--- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/api-extractor.ts b/src/api-extractor.ts index e6696c56..f1ceda83 100644 --- a/src/api-extractor.ts +++ b/src/api-extractor.ts @@ -1,9 +1,7 @@ -import { - Extractor, - ExtractorConfig, - type ExtractorResult, - type IConfigFile, - type IExtractorConfigPrepareOptions, +import type { + ExtractorResult, + IConfigFile, + IExtractorConfigPrepareOptions, } from '@microsoft/api-extractor' import path from 'path' import { handleError } from './errors' @@ -18,6 +16,7 @@ import { Format, NormalizedOptions } from './options' import { defaultOutExtension, ensureTempDeclarationDir, + getApiExtractor, toAbsolutePath, writeFileSync, } from './utils' @@ -55,8 +54,16 @@ function rollupDtsFile( configObjectFullPath: undefined, packageJsonFullPath, } - const extractorConfig: ExtractorConfig = - ExtractorConfig.prepare(prepareOptions) + + const imported = getApiExtractor() + if (!imported) { + throw new Error( + `@microsoft/api-extractor is not installed. Please install it first.` + ) + } + const { ExtractorConfig, Extractor } = imported + + const extractorConfig = ExtractorConfig.prepare(prepareOptions) // Invoke API Extractor const extractorResult: ExtractorResult = Extractor.invoke(extractorConfig, { diff --git a/src/esbuild/postcss.ts b/src/esbuild/postcss.ts index 3c2075bc..df9286e1 100644 --- a/src/esbuild/postcss.ts +++ b/src/esbuild/postcss.ts @@ -1,8 +1,7 @@ -import fs from 'fs' -import path from 'path' import { Loader, Plugin, transform } from 'esbuild' -import { getPostcss } from '../utils' +import fs from 'fs' import type { Result } from 'postcss-load-config' +import { getPostcss } from '../utils' export const postcssPlugin = ({ css, @@ -104,7 +103,7 @@ export const postcssPlugin = ({ } // Transform CSS - const result = await postcss + const result = postcss ?.default(plugins) .process(contents, { ...options, from: args.path }) diff --git a/src/index.ts b/src/index.ts index 73ce3196..dab3c9b2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -28,6 +28,7 @@ import { treeShakingPlugin } from './plugins/tree-shaking' import { copyPublicDir, isInPublicDir } from './lib/public-dir' import { terserPlugin } from './plugins/terser' import { runTypeScriptCompiler } from './tsc' +import { runDtsRollup } from './api-extractor' import { cjsInterop } from './plugins/cjs-interop' export type { Format, Options, NormalizedOptions } @@ -197,8 +198,6 @@ export async function build(_options: Options) { } if (options.experimentalDts) { - const { runDtsRollup } = await import('./api-extractor') - const exports = runTypeScriptCompiler(options) await runDtsRollup(options, exports) } diff --git a/src/utils.ts b/src/utils.ts index 27deeb12..cc7f6b7c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -45,9 +45,14 @@ export function isExternal( return false } -export function getPostcss(): null | typeof import('postcss') { - const p = resolveFrom.silent(process.cwd(), 'postcss') - return p && require(p) +export function getPostcss(): null | Awaited { + return localRequire('postcss') +} + +export function getApiExtractor(): null | Awaited< + typeof import('@microsoft/api-extractor') +> { + return localRequire('@microsoft/api-extractor') } export function localRequire(moduleName: string) { From 1298f284a2ec7f9430474cecdfc1b039c73cd671 Mon Sep 17 00:00:00 2001 From: ocavue Date: Tue, 19 Sep 2023 19:51:22 +0800 Subject: [PATCH 06/13] Correct typo --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index b3c07ba6..7bc1ce50 100644 --- a/docs/README.md +++ b/docs/README.md @@ -195,7 +195,7 @@ Note that `--dts` does not resolve external (aka in `node_modules`) types used i Since tsup version 7.3.0, you can also use `--experimental-dts` flag to generate declaration files. This flag use [@microsoft/api-extractor](https://www.npmjs.com/package/@microsoft/api-extractor) to generate declaration files, which is more reliable than the previous `--dts` flag. It's still experimental and we are looking for feedbacks. -To use `--experimental-dts`, you would need to install `@microsoft/api-extractor`, as it's a peer dependency if tsup: +To use `--experimental-dts`, you would need to install `@microsoft/api-extractor`, as it's a peer dependency of tsup: ```bash npm i @microsoft/api-extractor -D @@ -205,7 +205,7 @@ yarn add @microsoft/api-extractor --dev #### Emit declaration file only -The `--dts-only` flag is the equivalent of the `emitDeclarationOnly` option in `tsc`. Using this flag will only emit the declaration file, without the JavaScript files. +The `--dts-only` flag is the equivalent of the `emitDeclarationOnly` option in `tsc`. Using this flag will only emit the declaration file, without the JavaScript files. #### Generate TypeScript declaration maps (.d.ts.map) From 900ffe64b3447ba85b95632a60170be685c3af45 Mon Sep 17 00:00:00 2001 From: ocavue Date: Tue, 19 Sep 2023 20:17:11 +0800 Subject: [PATCH 07/13] Add workaround for the .d.mts support --- src/api-extractor.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/api-extractor.ts b/src/api-extractor.ts index f1ceda83..dd107d76 100644 --- a/src/api-extractor.ts +++ b/src/api-extractor.ts @@ -91,6 +91,13 @@ async function rollupDtsFiles( let pkg = await loadPkg(process.cwd()) let dtsExtension = defaultOutExtension({ format, pkgType: pkg.type }).dts + // @microsoft/api-extractor doesn't support `.d.mts` and `.d.cts` yet. So we + // replace the extension here as a temporary workaround. + // + // See the issue for more details: + // https://github.com/microsoft/rushstack/pull/4196 + dtsExtension = dtsExtension.replace(/\.d\.mts$/, '.dmts.d.ts').replace('\.d\.cts', '.dcts.d.ts') + let dtsInputFilePath = path.join( declarationDir, '_tsup-dts-aggregation' + dtsExtension From 9158e34e067a1e9a538d7d04950d48fdc8b85e59 Mon Sep 17 00:00:00 2001 From: ocavue Date: Tue, 19 Sep 2023 20:23:41 +0800 Subject: [PATCH 08/13] Only replace the extension for entrypoint --- src/api-extractor.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/api-extractor.ts b/src/api-extractor.ts index dd107d76..eff20cb1 100644 --- a/src/api-extractor.ts +++ b/src/api-extractor.ts @@ -91,17 +91,17 @@ async function rollupDtsFiles( let pkg = await loadPkg(process.cwd()) let dtsExtension = defaultOutExtension({ format, pkgType: pkg.type }).dts - // @microsoft/api-extractor doesn't support `.d.mts` and `.d.cts` yet. So we - // replace the extension here as a temporary workaround. - // - // See the issue for more details: - // https://github.com/microsoft/rushstack/pull/4196 - dtsExtension = dtsExtension.replace(/\.d\.mts$/, '.dmts.d.ts').replace('\.d\.cts', '.dcts.d.ts') - let dtsInputFilePath = path.join( declarationDir, '_tsup-dts-aggregation' + dtsExtension ) + // @microsoft/api-extractor doesn't support `.d.mts` and `.d.cts` file as a + // entrypoint yet. So we replace the extension here as a temporary workaround. + // + // See the issue for more details: + // https://github.com/microsoft/rushstack/pull/4196 + dtsInputFilePath = dtsInputFilePath.replace(/\.d\.mts$/, '.dmts.d.ts').replace('\.d\.cts$', '.dcts.d.ts') + let dtsOutputFilePath = path.join(outDir, '_tsup-dts-rollup' + dtsExtension) writeFileSync( From d7876a68cab4cb4ab8894f0112104c288857e8c2 Mon Sep 17 00:00:00 2001 From: ocavue Date: Thu, 5 Oct 2023 22:23:30 +0900 Subject: [PATCH 09/13] bug fix --- src/api-extractor.ts | 10 ++++------ src/tsc.ts | 38 ++++++++++++++++---------------------- 2 files changed, 20 insertions(+), 28 deletions(-) diff --git a/src/api-extractor.ts b/src/api-extractor.ts index eff20cb1..d1121d0f 100644 --- a/src/api-extractor.ts +++ b/src/api-extractor.ts @@ -100,7 +100,9 @@ async function rollupDtsFiles( // // See the issue for more details: // https://github.com/microsoft/rushstack/pull/4196 - dtsInputFilePath = dtsInputFilePath.replace(/\.d\.mts$/, '.dmts.d.ts').replace('\.d\.cts$', '.dcts.d.ts') + dtsInputFilePath = dtsInputFilePath + .replace(/\.d\.mts$/, '.dmts.d.ts') + .replace(/\.d\.cts$/, '.dcts.d.ts') let dtsOutputFilePath = path.join(outDir, '_tsup-dts-rollup' + dtsExtension) @@ -121,13 +123,9 @@ async function rollupDtsFiles( sourceFileName = toAbsolutePath(sourceFileName) const outFileName = path.join(outDir, out + dtsExtension) - const declarations = exports.filter( - (declaration) => declaration.sourceFileName === sourceFileName - ) - writeFileSync( outFileName, - formatDistributionExports(declarations, outFileName, dtsOutputFilePath) + formatDistributionExports(exports, outFileName, dtsOutputFilePath) ) } } diff --git a/src/tsc.ts b/src/tsc.ts index ec9a5776..9094dd76 100644 --- a/src/tsc.ts +++ b/src/tsc.ts @@ -5,6 +5,7 @@ import { ExportDeclaration } from './exports' import { createLogger } from './log' import { NormalizedOptions } from './options' import { ensureTempDeclarationDir, toAbsolutePath } from './utils' +import { dirname } from 'path' const logger = createLogger() @@ -159,17 +160,6 @@ function emitDtsFiles(program: ts.Program, host: ts.CompilerHost) { return fileMapping } -const parseCompilerOptions = ( - compilerOptions: ts.CompilerOptions -): ts.CompilerOptions => { - const parsed = ts.parseJsonConfigFileContent( - { compilerOptions }, - ts.sys, - './' - ) - return parsed.options -} - function emit(compilerOptions?: any, tsconfig?: string) { let cwd = process.cwd() let rawTsconfig = loadTsConfig(cwd, tsconfig) @@ -180,21 +170,25 @@ function emit(compilerOptions?: any, tsconfig?: string) { let declarationDir = ensureTempDeclarationDir() let parsedTsconfig = ts.parseJsonConfigFileContent( - rawTsconfig.data, + { + ...rawTsconfig.data, + compilerOptions: { + ...rawTsconfig.data?.compilerOptions, + + // Enable declaration emit and disable javascript emit + noEmit: false, + declaration: true, + declarationMap: true, + declarationDir: declarationDir, + emitDeclarationOnly: true, + }, + }, ts.sys, - cwd + tsconfig ? dirname(tsconfig) : './' ) - let options: ts.CompilerOptions = parseCompilerOptions({ - ...compilerOptions, + let options: ts.CompilerOptions = parsedTsconfig.options - // Enable declaration emit and disable javascript emit - noEmit: false, - declaration: true, - declarationMap: true, - declarationDir: declarationDir, - emitDeclarationOnly: true, - }) let host: ts.CompilerHost = ts.createCompilerHost(options) let program: ts.Program = ts.createProgram( parsedTsconfig.fileNames, From 24b240f7e8112bc1d23de2d489f57184eb8929ed Mon Sep 17 00:00:00 2001 From: ocavue Date: Thu, 5 Oct 2023 22:27:29 +0900 Subject: [PATCH 10/13] Add more test case --- test/__snapshots__/index.test.ts.snap | 104 ++++++++++++++++++++++++++ test/index.test.ts | 1 + 2 files changed, 105 insertions(+) diff --git a/test/__snapshots__/index.test.ts.snap b/test/__snapshots__/index.test.ts.snap index bd009ca6..c6fd7358 100644 --- a/test/__snapshots__/index.test.ts.snap +++ b/test/__snapshots__/index.test.ts.snap @@ -340,22 +340,62 @@ export { } // dist/index.d.mts ////////////////////////////////////////////////////////////////////// +export { render } from './_tsup-dts-rollup'; +export { ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction } from './_tsup-dts-rollup'; +export { sharedType } from './_tsup-dts-rollup'; export { VERSION } from './_tsup-dts-rollup'; export { render_alias_1 as render } from './_tsup-dts-rollup'; export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; +export { render_alias_2 as render } from './_tsup-dts-rollup'; +export { default_alias as default } from './_tsup-dts-rollup'; +export { ServerRenderOptions } from './_tsup-dts-rollup'; +export { serverConstant } from './_tsup-dts-rollup'; +export { serverConstantAlias } from './_tsup-dts-rollup'; +export { ServerClass } from './_tsup-dts-rollup'; +export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; +export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; +export { renderToString } from './_tsup-dts-rollup'; +export { renderToNodeStream } from './_tsup-dts-rollup'; +export { renderToStaticMarkup } from './_tsup-dts-rollup'; +export { renderToStaticNodeStream } from './_tsup-dts-rollup'; +export { version } from './_tsup-dts-rollup'; +export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// // dist/index.d.ts ////////////////////////////////////////////////////////////////////// +export { render } from './_tsup-dts-rollup'; +export { ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction } from './_tsup-dts-rollup'; +export { sharedType } from './_tsup-dts-rollup'; export { VERSION } from './_tsup-dts-rollup'; export { render_alias_1 as render } from './_tsup-dts-rollup'; export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; +export { render_alias_2 as render } from './_tsup-dts-rollup'; +export { default_alias as default } from './_tsup-dts-rollup'; +export { ServerRenderOptions } from './_tsup-dts-rollup'; +export { serverConstant } from './_tsup-dts-rollup'; +export { serverConstantAlias } from './_tsup-dts-rollup'; +export { ServerClass } from './_tsup-dts-rollup'; +export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; +export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; +export { renderToString } from './_tsup-dts-rollup'; +export { renderToNodeStream } from './_tsup-dts-rollup'; +export { renderToStaticMarkup } from './_tsup-dts-rollup'; +export { renderToStaticNodeStream } from './_tsup-dts-rollup'; +export { version } from './_tsup-dts-rollup'; +export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -366,6 +406,27 @@ export { render } from './_tsup-dts-rollup'; export { ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction } from './_tsup-dts-rollup'; export { sharedType } from './_tsup-dts-rollup'; +export { VERSION } from './_tsup-dts-rollup'; +export { render_alias_1 as render } from './_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; +export { render_alias_2 as render } from './_tsup-dts-rollup'; +export { default_alias as default } from './_tsup-dts-rollup'; +export { ServerRenderOptions } from './_tsup-dts-rollup'; +export { serverConstant } from './_tsup-dts-rollup'; +export { serverConstantAlias } from './_tsup-dts-rollup'; +export { ServerClass } from './_tsup-dts-rollup'; +export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; +export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; +export { renderToString } from './_tsup-dts-rollup'; +export { renderToNodeStream } from './_tsup-dts-rollup'; +export { renderToStaticMarkup } from './_tsup-dts-rollup'; +export { renderToStaticNodeStream } from './_tsup-dts-rollup'; +export { version } from './_tsup-dts-rollup'; +export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -376,12 +437,42 @@ export { render } from './_tsup-dts-rollup'; export { ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction } from './_tsup-dts-rollup'; export { sharedType } from './_tsup-dts-rollup'; +export { VERSION } from './_tsup-dts-rollup'; +export { render_alias_1 as render } from './_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; +export { render_alias_2 as render } from './_tsup-dts-rollup'; +export { default_alias as default } from './_tsup-dts-rollup'; +export { ServerRenderOptions } from './_tsup-dts-rollup'; +export { serverConstant } from './_tsup-dts-rollup'; +export { serverConstantAlias } from './_tsup-dts-rollup'; +export { ServerClass } from './_tsup-dts-rollup'; +export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; +export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; +export { renderToString } from './_tsup-dts-rollup'; +export { renderToNodeStream } from './_tsup-dts-rollup'; +export { renderToStaticMarkup } from './_tsup-dts-rollup'; +export { renderToStaticNodeStream } from './_tsup-dts-rollup'; +export { version } from './_tsup-dts-rollup'; +export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; +export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// // dist/server/index.d.mts ////////////////////////////////////////////////////////////////////// +export { render } from '../_tsup-dts-rollup'; +export { ClientRenderOptions } from '../_tsup-dts-rollup'; +export { sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType } from '../_tsup-dts-rollup'; +export { VERSION } from '../_tsup-dts-rollup'; +export { render_alias_1 as render } from '../_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from '../_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from '../_tsup-dts-rollup'; export { render_alias_2 as render } from '../_tsup-dts-rollup'; export { default_alias as default } from '../_tsup-dts-rollup'; export { ServerRenderOptions } from '../_tsup-dts-rollup'; @@ -396,12 +487,23 @@ export { renderToNodeStream } from '../_tsup-dts-rollup'; export { renderToStaticMarkup } from '../_tsup-dts-rollup'; export { renderToStaticNodeStream } from '../_tsup-dts-rollup'; export { version } from '../_tsup-dts-rollup'; +export { sharedFunction_alias_3 as sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType_alias_3 as sharedType } from '../_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// // dist/server/index.d.ts ////////////////////////////////////////////////////////////////////// +export { render } from '../_tsup-dts-rollup'; +export { ClientRenderOptions } from '../_tsup-dts-rollup'; +export { sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType } from '../_tsup-dts-rollup'; +export { VERSION } from '../_tsup-dts-rollup'; +export { render_alias_1 as render } from '../_tsup-dts-rollup'; +export { ClientRenderOptions_alias_1 as ClientRenderOptions } from '../_tsup-dts-rollup'; +export { sharedFunction_alias_1 as sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType_alias_1 as sharedType } from '../_tsup-dts-rollup'; export { render_alias_2 as render } from '../_tsup-dts-rollup'; export { default_alias as default } from '../_tsup-dts-rollup'; export { ServerRenderOptions } from '../_tsup-dts-rollup'; @@ -416,6 +518,8 @@ export { renderToNodeStream } from '../_tsup-dts-rollup'; export { renderToStaticMarkup } from '../_tsup-dts-rollup'; export { renderToStaticNodeStream } from '../_tsup-dts-rollup'; export { version } from '../_tsup-dts-rollup'; +export { sharedFunction_alias_3 as sharedFunction } from '../_tsup-dts-rollup'; +export { sharedType_alias_3 as sharedType } from '../_tsup-dts-rollup'; " `; diff --git a/test/index.test.ts b/test/index.test.ts index 80061a48..d4b42e94 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -1493,6 +1493,7 @@ test('should emit declaration files with experimentalDts', async () => { `, 'src/index.ts': ` export * from './client' + export * from './shared' export const VERSION = '0.0.0' as const `, From e30c7836091f174066f205149f5cd415bf2089f5 Mon Sep 17 00:00:00 2001 From: ocavue Date: Thu, 5 Oct 2023 22:37:40 +0900 Subject: [PATCH 11/13] Fix multiple exports --- src/exports.ts | 25 ++++++++++++- test/__snapshots__/index.test.ts.snap | 54 --------------------------- 2 files changed, 23 insertions(+), 56 deletions(-) diff --git a/src/exports.ts b/src/exports.ts index f9790c43..d265effe 100644 --- a/src/exports.ts +++ b/src/exports.ts @@ -82,8 +82,30 @@ export function formatDistributionExports( if (!importPath.match(/^\.+\//)) { importPath = './' + importPath } + + let seen = { + named: new Set(), + module: new Set(), + } const lines = exports + .filter((declaration) => { + if (declaration.kind === 'module') { + if (seen.module.has(declaration.moduleName)) { + return false + } + seen.module.add(declaration.moduleName) + return true + } else if (declaration.kind === 'named') { + if (seen.named.has(declaration.name)) { + return false + } + seen.named.add(declaration.name) + return true + } else { + return false + } + }) .map((declaration) => formatDistributionExport(declaration, importPath)) .filter(truthy) @@ -110,8 +132,7 @@ function formatDistributionExport( ] .filter(truthy) .join(' ') - } - if (declaration.kind === 'module') { + } else if (declaration.kind === 'module') { return `export * from '${declaration.moduleName}';` } return '' diff --git a/test/__snapshots__/index.test.ts.snap b/test/__snapshots__/index.test.ts.snap index c6fd7358..619f10c5 100644 --- a/test/__snapshots__/index.test.ts.snap +++ b/test/__snapshots__/index.test.ts.snap @@ -345,26 +345,17 @@ export { ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction } from './_tsup-dts-rollup'; export { sharedType } from './_tsup-dts-rollup'; export { VERSION } from './_tsup-dts-rollup'; -export { render_alias_1 as render } from './_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; -export { render_alias_2 as render } from './_tsup-dts-rollup'; export { default_alias as default } from './_tsup-dts-rollup'; export { ServerRenderOptions } from './_tsup-dts-rollup'; export { serverConstant } from './_tsup-dts-rollup'; export { serverConstantAlias } from './_tsup-dts-rollup'; export { ServerClass } from './_tsup-dts-rollup'; export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; -export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; export { renderToString } from './_tsup-dts-rollup'; export { renderToNodeStream } from './_tsup-dts-rollup'; export { renderToStaticMarkup } from './_tsup-dts-rollup'; export { renderToStaticNodeStream } from './_tsup-dts-rollup'; export { version } from './_tsup-dts-rollup'; -export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -376,26 +367,17 @@ export { ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction } from './_tsup-dts-rollup'; export { sharedType } from './_tsup-dts-rollup'; export { VERSION } from './_tsup-dts-rollup'; -export { render_alias_1 as render } from './_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; -export { render_alias_2 as render } from './_tsup-dts-rollup'; export { default_alias as default } from './_tsup-dts-rollup'; export { ServerRenderOptions } from './_tsup-dts-rollup'; export { serverConstant } from './_tsup-dts-rollup'; export { serverConstantAlias } from './_tsup-dts-rollup'; export { ServerClass } from './_tsup-dts-rollup'; export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; -export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; export { renderToString } from './_tsup-dts-rollup'; export { renderToNodeStream } from './_tsup-dts-rollup'; export { renderToStaticMarkup } from './_tsup-dts-rollup'; export { renderToStaticNodeStream } from './_tsup-dts-rollup'; export { version } from './_tsup-dts-rollup'; -export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -407,26 +389,17 @@ export { ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction } from './_tsup-dts-rollup'; export { sharedType } from './_tsup-dts-rollup'; export { VERSION } from './_tsup-dts-rollup'; -export { render_alias_1 as render } from './_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; -export { render_alias_2 as render } from './_tsup-dts-rollup'; export { default_alias as default } from './_tsup-dts-rollup'; export { ServerRenderOptions } from './_tsup-dts-rollup'; export { serverConstant } from './_tsup-dts-rollup'; export { serverConstantAlias } from './_tsup-dts-rollup'; export { ServerClass } from './_tsup-dts-rollup'; export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; -export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; export { renderToString } from './_tsup-dts-rollup'; export { renderToNodeStream } from './_tsup-dts-rollup'; export { renderToStaticMarkup } from './_tsup-dts-rollup'; export { renderToStaticNodeStream } from './_tsup-dts-rollup'; export { version } from './_tsup-dts-rollup'; -export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -438,26 +411,17 @@ export { ClientRenderOptions } from './_tsup-dts-rollup'; export { sharedFunction } from './_tsup-dts-rollup'; export { sharedType } from './_tsup-dts-rollup'; export { VERSION } from './_tsup-dts-rollup'; -export { render_alias_1 as render } from './_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from './_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from './_tsup-dts-rollup'; -export { render_alias_2 as render } from './_tsup-dts-rollup'; export { default_alias as default } from './_tsup-dts-rollup'; export { ServerRenderOptions } from './_tsup-dts-rollup'; export { serverConstant } from './_tsup-dts-rollup'; export { serverConstantAlias } from './_tsup-dts-rollup'; export { ServerClass } from './_tsup-dts-rollup'; export { ServerThirdPartyNamespace } from './_tsup-dts-rollup'; -export { sharedFunction_alias_2 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_2 as sharedType } from './_tsup-dts-rollup'; export { renderToString } from './_tsup-dts-rollup'; export { renderToNodeStream } from './_tsup-dts-rollup'; export { renderToStaticMarkup } from './_tsup-dts-rollup'; export { renderToStaticNodeStream } from './_tsup-dts-rollup'; export { version } from './_tsup-dts-rollup'; -export { sharedFunction_alias_3 as sharedFunction } from './_tsup-dts-rollup'; -export { sharedType_alias_3 as sharedType } from './_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -469,26 +433,17 @@ export { ClientRenderOptions } from '../_tsup-dts-rollup'; export { sharedFunction } from '../_tsup-dts-rollup'; export { sharedType } from '../_tsup-dts-rollup'; export { VERSION } from '../_tsup-dts-rollup'; -export { render_alias_1 as render } from '../_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from '../_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from '../_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from '../_tsup-dts-rollup'; -export { render_alias_2 as render } from '../_tsup-dts-rollup'; export { default_alias as default } from '../_tsup-dts-rollup'; export { ServerRenderOptions } from '../_tsup-dts-rollup'; export { serverConstant } from '../_tsup-dts-rollup'; export { serverConstantAlias } from '../_tsup-dts-rollup'; export { ServerClass } from '../_tsup-dts-rollup'; export { ServerThirdPartyNamespace } from '../_tsup-dts-rollup'; -export { sharedFunction_alias_2 as sharedFunction } from '../_tsup-dts-rollup'; -export { sharedType_alias_2 as sharedType } from '../_tsup-dts-rollup'; export { renderToString } from '../_tsup-dts-rollup'; export { renderToNodeStream } from '../_tsup-dts-rollup'; export { renderToStaticMarkup } from '../_tsup-dts-rollup'; export { renderToStaticNodeStream } from '../_tsup-dts-rollup'; export { version } from '../_tsup-dts-rollup'; -export { sharedFunction_alias_3 as sharedFunction } from '../_tsup-dts-rollup'; -export { sharedType_alias_3 as sharedType } from '../_tsup-dts-rollup'; ////////////////////////////////////////////////////////////////////// @@ -500,26 +455,17 @@ export { ClientRenderOptions } from '../_tsup-dts-rollup'; export { sharedFunction } from '../_tsup-dts-rollup'; export { sharedType } from '../_tsup-dts-rollup'; export { VERSION } from '../_tsup-dts-rollup'; -export { render_alias_1 as render } from '../_tsup-dts-rollup'; -export { ClientRenderOptions_alias_1 as ClientRenderOptions } from '../_tsup-dts-rollup'; -export { sharedFunction_alias_1 as sharedFunction } from '../_tsup-dts-rollup'; -export { sharedType_alias_1 as sharedType } from '../_tsup-dts-rollup'; -export { render_alias_2 as render } from '../_tsup-dts-rollup'; export { default_alias as default } from '../_tsup-dts-rollup'; export { ServerRenderOptions } from '../_tsup-dts-rollup'; export { serverConstant } from '../_tsup-dts-rollup'; export { serverConstantAlias } from '../_tsup-dts-rollup'; export { ServerClass } from '../_tsup-dts-rollup'; export { ServerThirdPartyNamespace } from '../_tsup-dts-rollup'; -export { sharedFunction_alias_2 as sharedFunction } from '../_tsup-dts-rollup'; -export { sharedType_alias_2 as sharedType } from '../_tsup-dts-rollup'; export { renderToString } from '../_tsup-dts-rollup'; export { renderToNodeStream } from '../_tsup-dts-rollup'; export { renderToStaticMarkup } from '../_tsup-dts-rollup'; export { renderToStaticNodeStream } from '../_tsup-dts-rollup'; export { version } from '../_tsup-dts-rollup'; -export { sharedFunction_alias_3 as sharedFunction } from '../_tsup-dts-rollup'; -export { sharedType_alias_3 as sharedType } from '../_tsup-dts-rollup'; " `; From 44191bb56e5362bc7a2974812371553c91972f15 Mon Sep 17 00:00:00 2001 From: ocavue Date: Fri, 17 Nov 2023 20:24:10 +0800 Subject: [PATCH 12/13] docs: update version number to 7.4.0 --- docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index 7bc1ce50..69324005 100644 --- a/docs/README.md +++ b/docs/README.md @@ -193,7 +193,7 @@ If you have multiple entry files, each entry will get a corresponding `.d.ts` fi Note that `--dts` does not resolve external (aka in `node_modules`) types used in the `.d.ts` file, if that's somehow a requirement, try the experimental `--dts-resolve` flag instead. -Since tsup version 7.3.0, you can also use `--experimental-dts` flag to generate declaration files. This flag use [@microsoft/api-extractor](https://www.npmjs.com/package/@microsoft/api-extractor) to generate declaration files, which is more reliable than the previous `--dts` flag. It's still experimental and we are looking for feedbacks. +Since tsup version 7.4.0, you can also use `--experimental-dts` flag to generate declaration files. This flag use [@microsoft/api-extractor](https://www.npmjs.com/package/@microsoft/api-extractor) to generate declaration files, which is more reliable than the previous `--dts` flag. It's still experimental and we are looking for feedbacks. To use `--experimental-dts`, you would need to install `@microsoft/api-extractor`, as it's a peer dependency of tsup: From d2c562cf72f98f104b6082d12a725fffea01b786 Mon Sep 17 00:00:00 2001 From: ocavue Date: Fri, 17 Nov 2023 20:25:28 +0800 Subject: [PATCH 13/13] chore: update @microsoft/api-extractor --- package.json | 2 +- pnpm-lock.yaml | 34 +++++++++++++++++----------------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index e924c2f8..74a4b347 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "tree-kill": "^1.2.2" }, "devDependencies": { - "@microsoft/api-extractor": "^7.37.0", + "@microsoft/api-extractor": "^7.38.3", "@rollup/plugin-json": "6.0.1", "@swc/core": "1.2.218", "@types/debug": "4.1.7", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4b3d58b2..8748bc96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,8 +50,8 @@ dependencies: devDependencies: '@microsoft/api-extractor': - specifier: ^7.37.0 - version: 7.37.0(@types/node@14.18.12) + specifier: ^7.38.3 + version: 7.38.3(@types/node@14.18.12) '@rollup/plugin-json': specifier: 6.0.1 version: 6.0.1(rollup@4.0.2) @@ -599,26 +599,26 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true - /@microsoft/api-extractor-model@7.28.0(@types/node@14.18.12): - resolution: {integrity: sha512-QIMtUVm1tqiKG+M6ciFgRShcDoovyltaeg+CbyOnyr7SMrp6gg0ojK5/nToMqR9kAvsTS4QVgW4Twl50EoAjcw==} + /@microsoft/api-extractor-model@7.28.2(@types/node@14.18.12): + resolution: {integrity: sha512-vkojrM2fo3q4n4oPh4uUZdjJ2DxQ2+RnDQL/xhTWSRUNPF6P4QyrvY357HBxbnltKcYu+nNNolVqc6TIGQ73Ig==} dependencies: '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.60.0(@types/node@14.18.12) + '@rushstack/node-core-library': 3.61.0(@types/node@14.18.12) transitivePeerDependencies: - '@types/node' dev: true - /@microsoft/api-extractor@7.37.0(@types/node@14.18.12): - resolution: {integrity: sha512-df/wffWpDhYRw7kzdxeHGsCpim+dC8aFiZlsJb4uFvVPWhBZpDzOhQxSUTFx3Df1ORY+/JjuPR3fDE9Hq+PHzQ==} + /@microsoft/api-extractor@7.38.3(@types/node@14.18.12): + resolution: {integrity: sha512-xt9iYyC5f39281j77JTA9C3ISJpW1XWkCcnw+2vM78CPnro6KhPfwQdPDfwS5JCPNuq0grm8cMdPUOPvrchDWw==} hasBin: true dependencies: - '@microsoft/api-extractor-model': 7.28.0(@types/node@14.18.12) + '@microsoft/api-extractor-model': 7.28.2(@types/node@14.18.12) '@microsoft/tsdoc': 0.14.2 '@microsoft/tsdoc-config': 0.16.2 - '@rushstack/node-core-library': 3.60.0(@types/node@14.18.12) - '@rushstack/rig-package': 0.5.0 - '@rushstack/ts-command-line': 4.16.0 + '@rushstack/node-core-library': 3.61.0(@types/node@14.18.12) + '@rushstack/rig-package': 0.5.1 + '@rushstack/ts-command-line': 4.17.1 colors: 1.2.5 lodash: 4.17.21 resolve: 1.22.1 @@ -772,8 +772,8 @@ packages: requiresBuild: true optional: true - /@rushstack/node-core-library@3.60.0(@types/node@14.18.12): - resolution: {integrity: sha512-PcyrqhILvzU+65wMFybQ2VeGNnU5JzhDq2OvUi3j6jPUxyllM7b2hrRUwCuVaYboewYzIbpzXFzgxe2K7ii1nw==} + /@rushstack/node-core-library@3.61.0(@types/node@14.18.12): + resolution: {integrity: sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==} peerDependencies: '@types/node': '*' peerDependenciesMeta: @@ -790,15 +790,15 @@ packages: z-schema: 5.0.5 dev: true - /@rushstack/rig-package@0.5.0: - resolution: {integrity: sha512-bGnOW4DWHOePDiABKy6qyqYJl9i7fKn4bRucExRVt5QzyPxuVHMl8CMmCabtoNSpXzgG3qymWOrMoa/W2PpJrw==} + /@rushstack/rig-package@0.5.1: + resolution: {integrity: sha512-pXRYSe29TjRw7rqxD4WS3HN/sRSbfr+tJs4a9uuaSIBAITbUggygdhuG0VrO0EO+QqH91GhYMN4S6KRtOEmGVA==} dependencies: resolve: 1.22.1 strip-json-comments: 3.1.1 dev: true - /@rushstack/ts-command-line@4.16.0: - resolution: {integrity: sha512-WJKhdR9ThK9Iy7t78O3at7I3X4Ssp5RRZay/IQa8NywqkFy/DQbT3iLouodMMdUwLZD9n8n++xLubVd3dkmpkg==} + /@rushstack/ts-command-line@4.17.1: + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} dependencies: '@types/argparse': 1.0.38 argparse: 1.0.10