From 61fc06c6130391847a370a3efc1c6e7677ba6596 Mon Sep 17 00:00:00 2001 From: ocavue Date: Fri, 17 Nov 2023 20:29:07 +0800 Subject: [PATCH 1/7] feat: add experimental dts rollup using @microsoft/api-extractor (#983) --- docs/README.md | 12 ++ package.json | 5 + pnpm-lock.yaml | 260 ++++++++++++++++++++++- src/api-extractor.ts | 155 ++++++++++++++ src/cli-main.ts | 1 + src/esbuild/postcss.ts | 7 +- src/exports.ts | 139 +++++++++++++ src/index.ts | 47 ++++- src/options.ts | 22 +- src/rollup.ts | 44 +--- src/tsc.ts | 218 +++++++++++++++++++ src/utils.ts | 97 ++++++++- test/__snapshots__/index.test.ts.snap | 289 ++++++++++++++++++++++++++ test/index.test.ts | 173 ++++++++++++++- 14 files changed, 1395 insertions(+), 74 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..69324005 100644 --- a/docs/README.md +++ b/docs/README.md @@ -193,6 +193,16 @@ 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.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: + +```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. @@ -500,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 e6d0d279..74a4b347 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "tree-kill": "^1.2.2" }, "devDependencies": { + "@microsoft/api-extractor": "^7.38.3", "@rollup/plugin-json": "6.0.1", "@swc/core": "1.2.218", "@types/debug": "4.1.7", @@ -74,6 +75,7 @@ }, "peerDependencies": { "@swc/core": "^1", + "@microsoft/api-extractor": "^7.36.0", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, @@ -86,6 +88,9 @@ }, "@swc/core": { "optional": true + }, + "@microsoft/api-extractor": { + "optional": true } }, "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bd222eb6..8748bc96 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,6 +49,9 @@ dependencies: version: 1.2.2 devDependencies: + '@microsoft/api-extractor': + 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) @@ -560,7 +563,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/sourcemap-codec': 1.4.14 '@jridgewell/trace-mapping': 0.3.17 dev: true @@ -596,6 +599,49 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@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.61.0(@types/node@14.18.12) + transitivePeerDependencies: + - '@types/node' + dev: true + + /@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.2(@types/node@14.18.12) + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + '@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 + semver: 7.5.4 + source-map: 0.6.1 + typescript: 5.0.4 + transitivePeerDependencies: + - '@types/node' + dev: true + + /@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: true + + /@microsoft/tsdoc@0.14.2: + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + dev: true + /@nodelib/fs.scandir@2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -623,15 +669,15 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.5(rollup@4.0.2) + '@rollup/pluginutils': 5.0.2(rollup@4.0.2) rollup: 4.0.2 dev: true - /@rollup/pluginutils@5.0.5(rollup@4.0.2): - resolution: {integrity: sha512-6aEYR910NyP73oHiJglti74iRyOwgFU4x3meH/H8OJx6Ry0j6cOVZ5X/wTvub7G7Ao6qaHBEaNsV3GLJkSsF+Q==} + /@rollup/pluginutils@5.0.2(rollup@4.0.2): + resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0 peerDependenciesMeta: rollup: optional: true @@ -726,6 +772,40 @@ packages: requiresBuild: true optional: true + /@rushstack/node-core-library@3.61.0(@types/node@14.18.12): + resolution: {integrity: sha512-tdOjdErme+/YOu4gPed3sFS72GhtWCgNV9oDsHDnoLY5oDfwjKUc9Z+JOZZ37uAxcm/OCahDHfuu2ugqrfWAVQ==} + 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: true + + /@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.17.1: + resolution: {integrity: sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg==} + dependencies: + '@types/argparse': 1.0.38 + argparse: 1.0.10 + colors: 1.2.5 + string-argv: 0.3.2 + dev: true + /@swc/core-android-arm-eabi@1.2.218: resolution: {integrity: sha512-Q/uLCh262t3xxNzhCz+ZW9t+g2nWd0gZZO4jMYFWJs7ilKVNsBfRtfnNGGACHzkVuWLNDIWtAS2PSNodl7VUHQ==} engines: {node: '>=10'} @@ -868,6 +948,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: true + /@types/chai-subset@1.3.3: resolution: {integrity: sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==} dependencies: @@ -967,6 +1051,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: true + /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1003,7 +1096,13 @@ packages: engines: {node: '>= 8'} dependencies: normalize-path: 3.0.0 - picomatch: 2.3.1 + picomatch: 2.3.0 + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -1135,6 +1234,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: true + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} dev: true @@ -1143,6 +1247,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: true + optional: true + /concat-map@0.0.1: resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} @@ -1509,6 +1620,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: true + /fast-glob@3.2.7: resolution: {integrity: sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==} engines: {node: '>=8'} @@ -1519,6 +1634,10 @@ packages: merge2: 1.4.1 micromatch: 4.0.4 + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + /fastq@1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} dependencies: @@ -1544,6 +1663,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: true + /fs.realpath@1.0.0: resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=} @@ -1622,6 +1750,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: true + /inflight@1.0.6: resolution: {integrity: sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=} dependencies: @@ -1675,6 +1808,10 @@ packages: /isexe@2.0.0: resolution: {integrity: sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=} + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + dev: true + /joycon@3.0.1: resolution: {integrity: sha512-SJcJNBg32dGgxhPtM0wQqxqV0ax9k/9TaUskGDSJkSFSQOEWWvQ3zzWdGQRIUry2j1zA5+ReH13t0Mf3StuVZA==} engines: {node: '>=10'} @@ -1684,6 +1821,10 @@ packages: dev: true optional: true + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + /json5@1.0.1: resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==} hasBin: true @@ -1695,6 +1836,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: true + /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -1719,9 +1866,21 @@ packages: engines: {node: '>=14'} dev: true + /lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + dev: true + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: true + /lodash.sortby@4.7.0: resolution: {integrity: sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=} + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: true + /loupe@2.3.1: resolution: {integrity: sha512-EN1D3jyVmaX4tnajVlfbREU4axL647hLec1h/PXAb8CPDMJiYitcWF2UeLVNttRqaIqQs4x+mRvXf+d+TlDrCA==} dependencies: @@ -1734,6 +1893,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: true + /magic-string@0.27.0: resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==} engines: {node: '>=12'} @@ -1760,7 +1926,7 @@ packages: engines: {node: '>=8.6'} dependencies: braces: 3.0.2 - picomatch: 2.3.1 + picomatch: 2.3.0 /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} @@ -1884,9 +2050,14 @@ packages: /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + /picomatch@2.3.0: + resolution: {integrity: sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==} + engines: {node: '>=8.6'} + /picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} + dev: true /pirates@4.0.1: resolution: {integrity: sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==} @@ -1974,12 +2145,19 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} dependencies: - picomatch: 2.3.1 + picomatch: 2.3.0 /resolve-from@5.0.0: 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: true + /resolve@1.20.0: resolution: {integrity: sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==} dependencies: @@ -2029,8 +2207,8 @@ packages: fsevents: 2.3.2 dev: true - /rollup@3.8.1: - resolution: {integrity: sha512-4yh9eMW7byOroYcN8DlF9P/2jCpu6txVIHjEqquQVSx7DI0RgyCCN3tjrcy4ra6yVtV336aLBB3v2AarYAxePQ==} + /rollup@3.25.0: + resolution: {integrity: sha512-FnJkNRst2jEZGw7f+v4hFo6UTzpDKrAKcHZWcEfm5/GJQ5CK7wgb4moNLNAe7npKUev7yQn1AY/YbZRIxOv6Qg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -2080,6 +2258,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: true + /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2141,6 +2327,10 @@ packages: dependencies: whatwg-url: 7.1.0 + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + /stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} dev: true @@ -2149,6 +2339,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: true + /string-width@5.1.2: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} @@ -2181,6 +2376,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: true + /strip-json-comments@4.0.0: resolution: {integrity: sha512-LzWcbfMbAsEDTRmhjWIioe8GcDRl0fa35YMXFoJKDdiD/quGFmjJjdgPjFJJNwCMaLyQqFIDqCdHD2V4HfLgYA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2371,7 +2571,7 @@ packages: postcss: 8.4.12 postcss-load-config: 4.0.1(postcss@8.4.12) resolve-from: 5.0.0 - rollup: 3.8.1 + rollup: 3.25.0 source-map: 0.8.0-beta.0 sucrase: 3.20.3 tree-kill: 1.2.2 @@ -2392,15 +2592,37 @@ packages: hasBin: true dev: true + /typescript@5.0.4: + resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} + engines: {node: '>=12.20'} + hasBin: true + dev: true + /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: true + /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: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + dev: true + /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'} @@ -2538,6 +2760,10 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=} + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: true + /yaml@2.3.1: resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} engines: {node: '>= 14'} @@ -2546,3 +2772,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: true diff --git a/src/api-extractor.ts b/src/api-extractor.ts new file mode 100644 index 00000000..d1121d0f --- /dev/null +++ b/src/api-extractor.ts @@ -0,0 +1,155 @@ +import type { + ExtractorResult, + IConfigFile, + IExtractorConfigPrepareOptions, +} from '@microsoft/api-extractor' +import path from 'path' +import { handleError } from './errors' +import { + formatAggregationExports, + formatDistributionExports, + type ExportDeclaration, +} from './exports' +import { loadPkg } from './load' +import { createLogger } from './log' +import { Format, NormalizedOptions } from './options' +import { + defaultOutExtension, + ensureTempDeclarationDir, + getApiExtractor, + toAbsolutePath, + writeFileSync, +} from './utils' + +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 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, { + // 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 +) { + 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 + ) + // @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( + dtsInputFilePath, + formatAggregationExports(exports, declarationDir) + ) + + rollupDtsFile( + dtsInputFilePath, + dtsOutputFilePath, + options.tsconfig || 'tsconfig.json' + ) + + for (let [out, sourceFileName] of Object.entries( + options.experimentalDts!.entry + )) { + sourceFileName = toAbsolutePath(sourceFileName) + const outFileName = path.join(outDir, out + dtsExtension) + + writeFileSync( + outFileName, + formatDistributionExports(exports, 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/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/exports.ts b/src/exports.ts new file mode 100644 index 00000000..d265effe --- /dev/null +++ b/src/exports.ts @@ -0,0 +1,139 @@ +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 + } + + 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) + + 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(' ') + } else if (declaration.kind === 'module') { + return `export * from '${declaration.moduleName}';` + } + return '' +} diff --git a/src/index.ts b/src/index.ts index 0a542f80..247de43e 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' @@ -21,6 +27,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 } @@ -68,6 +76,7 @@ const normalizeOptions = async ( ...optionsFromConfigFile, ...optionsOverride, } + const options: Partial = { outDir: 'dist', ..._options, @@ -83,6 +92,20 @@ const normalizeOptions = async ( : typeof _options.dts === 'string' ? { entry: _options.dts } : _options.dts, + experimentalDts: _options.experimentalDts + ? typeof _options.experimentalDts === 'boolean' + ? _options.experimentalDts + ? { entry: {} } + : undefined + : typeof _options.experimentalDts === 'string' + ? { + entry: toObjectEntry(_options.experimentalDts), + } + : { + ..._options.experimentalDts, + entry: toObjectEntry(_options.experimentalDts.entry || {}), + } + : undefined, } setSilent(options.silent) @@ -128,6 +151,17 @@ const normalizeOptions = async ( ...(options.dts.compilerOptions || {}), } } + if (options.experimentalDts) { + options.experimentalDts.compilerOptions = { + ...(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() } @@ -173,6 +207,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..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' @@ -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)[] @@ -139,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 @@ -232,11 +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?: NormalizedExperimentalDtsConfig tsconfigResolvePaths: Record tsconfigDecoratorMetadata?: boolean format: Format[] diff --git a/src/rollup.ts b/src/rollup.ts index 35fdea1e..8691a388 100644 --- a/src/rollup.ts +++ b/src/rollup.ts @@ -4,7 +4,7 @@ import { NormalizedOptions } from './' import ts from 'typescript' 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' @@ -34,48 +34,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..9094dd76 --- /dev/null +++ b/src/tsc.ts @@ -0,0 +1,218 @@ +import { loadTsConfig } from 'bundle-require' +import ts from 'typescript' +import { handleError } from './errors' +import { ExportDeclaration } from './exports' +import { createLogger } from './log' +import { NormalizedOptions } from './options' +import { ensureTempDeclarationDir, toAbsolutePath } from './utils' +import { dirname } from 'path' + +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 +} + +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 parsedTsconfig = ts.parseJsonConfigFileContent( + { + ...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, + tsconfig ? dirname(tsconfig) : './' + ) + + let options: ts.CompilerOptions = parsedTsconfig.options + + let host: ts.CompilerHost = ts.createCompilerHost(options) + let program: ts.Program = ts.createProgram( + parsedTsconfig.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 dtsOptions = options.experimentalDts! + const exports = emit(dtsOptions.compilerOptions, options.tsconfig) + 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..cc7f6b7c 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -1,8 +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 { Entry, Format } from './options' export type MaybePromise = T | Promise @@ -44,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) { @@ -137,7 +143,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 +163,84 @@ 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) => { + 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) => { + 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 554afdb2..6f0b102d 100644 --- a/test/__snapshots__/index.test.ts.snap +++ b/test/__snapshots__/index.test.ts.snap @@ -180,6 +180,295 @@ 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 } +export { sharedFunction as sharedFunction_alias_3 } + +declare type sharedType = { + shared: boolean; +}; +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\\"; + +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 } +export { sharedFunction as sharedFunction_alias_3 } + +declare type sharedType = { + shared: boolean; +}; +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\\"; + +export { version } + +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 { 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 { 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/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 { 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 { 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/my-lib-client.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 { 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 { 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/my-lib-client.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 { 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 { 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.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 { 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 { 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 } 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 { 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 { 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 fcbc1782..0228d643 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,160 @@ 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 * from './shared' + + 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 080f5b873dfebcc6907f661e7633737bf23e5799 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 Nov 2023 20:46:18 +0800 Subject: [PATCH 2/7] chore(deps-dev): bump @babel/traverse from 7.22.5 to 7.23.2 in /test (#1027) --- test/pnpm-lock.yaml | 172 +++++++++++++++++--------------------------- 1 file changed, 65 insertions(+), 107 deletions(-) diff --git a/test/pnpm-lock.yaml b/test/pnpm-lock.yaml index 6f92cae7..28302a33 100644 --- a/test/pnpm-lock.yaml +++ b/test/pnpm-lock.yaml @@ -46,18 +46,12 @@ packages: '@jridgewell/trace-mapping': 0.3.18 dev: true - /@babel/code-frame@7.18.6: - resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==} + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.18.6 - dev: true - - /@babel/code-frame@7.22.5: - resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.5 + '@babel/highlight': 7.22.20 + chalk: 2.4.2 dev: true /@babel/compat-data@7.22.5: @@ -70,15 +64,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 '@babel/helper-compilation-targets': 7.22.5(@babel/core@7.22.5) '@babel/helper-module-transforms': 7.22.5 '@babel/helpers': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 convert-source-map: 1.9.0 debug: 4.3.4 gensync: 1.0.0-beta.2 @@ -88,11 +82,11 @@ packages: - supports-color dev: true - /@babel/generator@7.22.5: - resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 '@jridgewell/gen-mapping': 0.3.3 '@jridgewell/trace-mapping': 0.3.18 jsesc: 2.5.2 @@ -112,52 +106,52 @@ packages: semver: 6.3.0 dev: true - /@babel/helper-environment-visitor@7.22.5: - resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-function-name@7.22.5: - resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 dev: true /@babel/helper-hoist-variables@7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-module-imports@7.18.6: resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.20.7 + '@babel/types': 7.23.0 dev: true /@babel/helper-module-imports@7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/helper-module-transforms@7.22.5: resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 '@babel/helper-module-imports': 7.22.5 '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color dev: true @@ -171,19 +165,14 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true - /@babel/helper-split-export-declaration@7.22.5: - resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 - dev: true - - /@babel/helper-string-parser@7.19.4: - resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} - engines: {node: '>=6.9.0'} + '@babel/types': 7.23.0 dev: true /@babel/helper-string-parser@7.22.5: @@ -191,13 +180,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.19.1: - resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: true @@ -210,45 +194,28 @@ packages: resolution: {integrity: sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/traverse': 7.22.5 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.2 + '@babel/types': 7.23.0 transitivePeerDependencies: - supports-color dev: true - /@babel/highlight@7.18.6: - resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.19.1 - chalk: 2.4.2 - js-tokens: 4.0.0 - dev: true - - /@babel/highlight@7.22.5: - resolution: {integrity: sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==} + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 dev: true - /@babel/parser@7.16.4: - resolution: {integrity: sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.20.7 - dev: true - - /@babel/parser@7.22.5: - resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.23.0 dev: true /@babel/plugin-syntax-jsx@7.18.6(@babel/core@7.22.5): @@ -275,48 +242,39 @@ packages: regenerator-runtime: 0.13.11 dev: true - /@babel/template@7.22.5: - resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 dev: true - /@babel/traverse@7.22.5: - resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} + /@babel/traverse@7.23.2: + resolution: {integrity: sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.22.5 - '@babel/generator': 7.22.5 - '@babel/helper-environment-visitor': 7.22.5 - '@babel/helper-function-name': 7.22.5 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.5 - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.20.7: - resolution: {integrity: sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.19.4 - '@babel/helper-validator-identifier': 7.19.1 - to-fast-properties: 2.0.0 - dev: true - - /@babel/types@7.22.5: - resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} engines: {node: '>=6.9.0'} dependencies: '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 to-fast-properties: 2.0.0 dev: true @@ -500,7 +458,7 @@ packages: /@vue/compiler-core@3.2.36: resolution: {integrity: sha512-bbyZM5hvBicv0PW3KUfVi+x3ylHnfKG7DOn5wM+f2OztTzTjLEyBb/5yrarIYpmnGitVGbjZqDbODyW4iK8hqw==} dependencies: - '@babel/parser': 7.16.4 + '@babel/parser': 7.23.0 '@vue/shared': 3.2.36 estree-walker: 2.0.2 source-map: 0.6.1 @@ -516,7 +474,7 @@ packages: /@vue/compiler-sfc@3.2.36: resolution: {integrity: sha512-AvGb4bTj4W8uQ4BqaSxo7UwTEqX5utdRSMyHy58OragWlt8nEACQ9mIeQh3K4di4/SX+41+pJrLIY01lHAOFOA==} dependencies: - '@babel/parser': 7.16.4 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.2.36 '@vue/compiler-dom': 3.2.36 '@vue/compiler-ssr': 3.2.36 @@ -542,7 +500,7 @@ packages: /@vue/reactivity-transform@3.2.36: resolution: {integrity: sha512-Jk5o2BhpODC9XTA7o4EL8hSJ4JyrFWErLtClG3NH8wDS7ri9jBDWxI7/549T7JY9uilKsaNM+4pJASLj5dtRwA==} dependencies: - '@babel/parser': 7.16.4 + '@babel/parser': 7.23.0 '@vue/compiler-core': 3.2.36 '@vue/shared': 3.2.36 estree-walker: 2.0.2 @@ -978,7 +936,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.18.6 + '@babel/code-frame': 7.22.13 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -1238,4 +1196,4 @@ packages: /zen-observable@0.8.15: resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} - dev: true \ No newline at end of file + dev: true From b54081fad44342df2f66af65dfc80176e25a93be Mon Sep 17 00:00:00 2001 From: Lars Artmann Date: Fri, 17 Nov 2023 15:35:50 +0100 Subject: [PATCH 3/7] docs: add pnpm to README.md and docs/README.md (#1009) --- README.md | 2 ++ docs/README.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/README.md b/README.md index 50892bb7..7b984cf6 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Install it locally in your project folder: npm i tsup -D # Or Yarn yarn add tsup --dev +# Or pnpm +pnpm add tsup -D ``` You can also install it globally but it's not recommended. diff --git a/docs/README.md b/docs/README.md index 69324005..dba26c35 100644 --- a/docs/README.md +++ b/docs/README.md @@ -28,6 +28,8 @@ Install it locally in your project folder: npm i tsup -D # Or Yarn yarn add tsup --dev +# Or pnpm +pnpm add tsup -D ``` You can also install it globally but it's not recommended. From fc1b13df26c4025cb6b312e0ff13ed97335a1ed9 Mon Sep 17 00:00:00 2001 From: ocavue Date: Fri, 17 Nov 2023 23:23:37 +0800 Subject: [PATCH 4/7] docs: add information about JavaScript API (#1037) --- docs/README.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/README.md b/docs/README.md index dba26c35..f4922f2c 100644 --- a/docs/README.md +++ b/docs/README.md @@ -195,7 +195,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.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. +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: @@ -581,6 +581,22 @@ Use `--publicDir` flag to copy files inside `./public` folder to the output dire You can also specify a custom directory using `--publicDir another-directory`. +### JavaScript API + +If you want to use `tsup` in your Node.js program, you can use the JavaScript API: + +```js +import { build } from 'tsup' + +await build({ + entry: ['src/index.ts'], + sourcemap: true, + dts: true, +}) +``` + +For all available options for the `build` function, please see [the API docs](https://paka.dev/npm/tsup). + ## Troubleshooting ### error: No matching export in "xxx.ts" for import "xxx" From d4e22c5fb9e9a31bb3c1449abe0d8f2d86292c9e Mon Sep 17 00:00:00 2001 From: ocavue Date: Sat, 18 Nov 2023 16:36:54 +0800 Subject: [PATCH 5/7] fix: await postcss for async plugins (#1036) --- src/esbuild/postcss.ts | 2 +- test/__snapshots__/index.test.ts.snap | 5 + test/index.test.ts | 23 ++ test/package.json | 2 + test/pnpm-lock.yaml | 549 ++++++++++++++++++++++++-- 5 files changed, 545 insertions(+), 36 deletions(-) diff --git a/src/esbuild/postcss.ts b/src/esbuild/postcss.ts index df9286e1..14d6cfb2 100644 --- a/src/esbuild/postcss.ts +++ b/src/esbuild/postcss.ts @@ -103,7 +103,7 @@ export const postcssPlugin = ({ } // Transform CSS - const result = postcss + const result = await postcss ?.default(plugins) .process(contents, { ...options, from: args.path }) diff --git a/test/__snapshots__/index.test.ts.snap b/test/__snapshots__/index.test.ts.snap index 6f0b102d..b3dd2ab5 100644 --- a/test/__snapshots__/index.test.ts.snap +++ b/test/__snapshots__/index.test.ts.snap @@ -552,3 +552,8 @@ exports[`support baseUrl and paths in tsconfig.json in --dts-resolve build 1`] = export { foo }; " `; + +exports[`support tailwindcss postcss plugin 1`] = ` +"\\"use strict\\"; +" +`; diff --git a/test/index.test.ts b/test/index.test.ts index 0228d643..db07db34 100644 --- a/test/index.test.ts +++ b/test/index.test.ts @@ -337,6 +337,29 @@ test('import css', async () => { expect(outFiles).toEqual(['input.css', 'input.js']) }) +test('support tailwindcss postcss plugin', async () => { + const { output, outFiles } = await run(getTestName(), { + 'input.ts': ` + import './foo.css' + `, + 'postcss.config.js': ` + module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + } + } + `, + 'foo.css': ` + @tailwind base; + @tailwind components; + @tailwind utilities; + `, + }) + expect(output).toMatchSnapshot() + expect(outFiles).toEqual(['input.css', 'input.js']) +}) + test('import css in --dts', async () => { const { output, outFiles } = await run( getTestName(), diff --git a/test/package.json b/test/package.json index 6279c8b5..08de5ad8 100644 --- a/test/package.json +++ b/test/package.json @@ -4,11 +4,13 @@ "@egoist/path-parser": "1.0.4", "@types/react": "17.0.50", "@types/react-dom": "17.0.17", + "autoprefixer": "10.4.16", "graphql": "^15.3.0", "graphql-tools": "^5.0.0", "react": "17.0.2", "react-dom": "17.0.2", "react-select": "5.7.0", + "tailwindcss": "3.3.5", "vue": "3.2.36", "vue-router": "4.0.15" }, diff --git a/test/pnpm-lock.yaml b/test/pnpm-lock.yaml index 28302a33..acaeb910 100644 --- a/test/pnpm-lock.yaml +++ b/test/pnpm-lock.yaml @@ -14,6 +14,9 @@ devDependencies: '@types/react-dom': specifier: 17.0.17 version: 17.0.17 + autoprefixer: + specifier: 10.4.16 + version: 10.4.16(postcss@8.4.31) graphql: specifier: ^15.3.0 version: 15.7.2 @@ -29,6 +32,9 @@ devDependencies: react-select: specifier: 5.7.0 version: 5.7.0(@babel/core@7.22.5)(@types/react@17.0.50)(react-dom@17.0.2)(react@17.0.2) + tailwindcss: + specifier: 3.3.5 + version: 3.3.5 vue: specifier: 3.2.36 version: 3.2.36 @@ -38,6 +44,11 @@ devDependencies: packages: + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -101,7 +112,7 @@ packages: '@babel/compat-data': 7.22.5 '@babel/core': 7.22.5 '@babel/helper-validator-option': 7.22.5 - browserslist: 4.21.9 + browserslist: 4.22.1 lru-cache: 5.1.1 semver: 6.3.0 dev: true @@ -423,6 +434,27 @@ packages: '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + /@types/parse-json@4.0.0: resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} dev: true @@ -482,7 +514,7 @@ packages: '@vue/shared': 3.2.36 estree-walker: 2.0.2 magic-string: 0.25.9 - postcss: 8.4.14 + postcss: 8.4.31 source-map: 0.6.1 dev: true @@ -555,6 +587,18 @@ packages: color-convert: 1.9.3 dev: true + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + /apollo-link-http-common@0.2.16(graphql@15.7.2): resolution: {integrity: sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==} peerDependencies: @@ -603,28 +647,71 @@ packages: tslib: 1.14.1 dev: true + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + /asynckit@0.4.0: resolution: {integrity: sha1-x57Zf380y48robyXkLzDZkdLS3k=} dev: true + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001563 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: true + /babel-plugin-macros@3.1.0: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} dependencies: '@babel/runtime': 7.20.7 cosmiconfig: 7.1.0 - resolve: 1.22.1 + resolve: 1.22.8 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} dev: true - /browserslist@4.21.9: - resolution: {integrity: sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==} + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: true + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: true + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001503 - electron-to-chromium: 1.4.432 - node-releases: 2.0.12 - update-browserslist-db: 1.0.11(browserslist@4.21.9) + caniuse-lite: 1.0.30001563 + electron-to-chromium: 1.4.587 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) dev: true /callsites@3.1.0: @@ -632,8 +719,13 @@ packages: engines: {node: '>=6'} dev: true - /caniuse-lite@1.0.30001503: - resolution: {integrity: sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw==} + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /caniuse-lite@1.0.30001563: + resolution: {integrity: sha512-na2WUmOxnwIZtwnFI2CZ/3er0wdNzU7hN+cPYz/z2ajHThnkWjNBOpEPP4n+4r2WPM847JaMotaJE3bnfzjyKw==} dev: true /chalk@2.4.2: @@ -645,6 +737,21 @@ packages: supports-color: 5.5.0 dev: true + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -662,6 +769,15 @@ packages: delayed-stream: 1.0.0 dev: true + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: true + /convert-source-map@1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} dev: true @@ -677,6 +793,12 @@ packages: yaml: 1.10.2 dev: true + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + /csstype@2.6.19: resolution: {integrity: sha512-ZVxXaNy28/k3kJg0Fou5MiYpp88j7H9hLZp8PDC3jV0WFjfH5E9xHb56L0W59cPbKbcHXeP4qyT8PrHp8t6LcQ==} dev: true @@ -706,6 +828,14 @@ packages: resolution: {integrity: sha1-AJZjF7ehL+kvPMgx91g68ym4bDc=} dev: true + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: @@ -713,8 +843,8 @@ packages: csstype: 3.1.1 dev: true - /electron-to-chromium@1.4.432: - resolution: {integrity: sha512-yz3U/khQgAFT2HURJA3/F4fKIyO2r5eK09BQzBZFd6BvBSSaRuzKc2ZNBHtJcO75/EKiRYbVYJZ2RB0P4BuD2g==} + /electron-to-chromium@1.4.587: + resolution: {integrity: sha512-RyJX0q/zOkAoefZhB9XHghGeATVP0Q3mwA253XD/zj2OeXc+JZB9pCaEv6R578JUYaWM9PRhye0kXvd/V1cQ3Q==} dev: true /error-ex@1.3.2: @@ -747,10 +877,34 @@ packages: engines: {node: 10 - 12 || >= 13.7} dev: true + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} dev: true + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: true + /find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: true @@ -764,8 +918,24 @@ packages: mime-types: 2.1.34 dev: true - /function-bind@1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} dev: true /gensync@1.0.0-beta.2: @@ -773,6 +943,31 @@ packages: engines: {node: '>=6.9.0'} dev: true + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@7.1.6: + resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: true + /globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -805,11 +1000,11 @@ packages: engines: {node: '>=4'} dev: true - /has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} dependencies: - function-bind: 1.1.1 + function-bind: 1.1.2 dev: true /hoist-non-react-statics@3.3.2: @@ -826,20 +1021,60 @@ packages: resolve-from: 4.0.0 dev: true + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: true + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true - /is-core-module@2.11.0: - resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: - has: 1.0.3 + hasown: 2.0.0 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} dev: true /iterall@1.3.0: resolution: {integrity: sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg==} dev: true + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} dev: true @@ -860,6 +1095,11 @@ packages: hasBin: true dev: true + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} dev: true @@ -887,6 +1127,19 @@ packages: resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} dev: true + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + /mime-db@1.51.0: resolution: {integrity: sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==} engines: {node: '>= 0.6'} @@ -899,12 +1152,26 @@ packages: mime-db: 1.51.0 dev: true + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: true + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} dev: true - /nanoid@3.3.4: - resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true dev: true @@ -916,8 +1183,18 @@ packages: whatwg-url: 5.0.0 dev: true - /node-releases@2.0.12: - resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==} + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: true + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} dev: true /object-assign@4.1.1: @@ -925,6 +1202,17 @@ packages: engines: {node: '>=0.10.0'} dev: true + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: true + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -942,6 +1230,11 @@ packages: lines-and-columns: 1.2.4 dev: true + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} dev: true @@ -955,11 +1248,87 @@ packages: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} dev: true - /postcss@8.4.14: - resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.31): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.31): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.31 + dev: true + + /postcss-load-config@4.0.1(postcss@8.4.31): + resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 2.1.0 + postcss: 8.4.31 + yaml: 2.3.4 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.31): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.31 + postcss-selector-parser: 6.0.13 + dev: true + + /postcss-selector-parser@6.0.13: + resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: true + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} engines: {node: ^10 || ^12 || >=14} dependencies: - nanoid: 3.3.4 + nanoid: 3.3.7 picocolors: 1.0.0 source-map-js: 1.0.2 dev: true @@ -972,6 +1341,10 @@ packages: react-is: 16.13.1 dev: true + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + /react-dom@17.0.2(react@17.0.2): resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} peerDependencies: @@ -1031,6 +1404,19 @@ packages: object-assign: 4.1.1 dev: true + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + /regenerator-runtime@0.13.11: resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} dev: true @@ -1044,15 +1430,26 @@ packages: engines: {node: '>=4'} dev: true - /resolve@1.22.1: - resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true dependencies: - is-core-module: 2.11.0 + is-core-module: 2.13.1 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==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + /scheduler@0.20.2: resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} dependencies: @@ -1088,6 +1485,20 @@ packages: resolution: {integrity: sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==} dev: true + /sucrase@3.34.0: + resolution: {integrity: sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==} + engines: {node: '>=8'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + commander: 4.1.1 + glob: 7.1.6 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -1100,15 +1511,70 @@ packages: engines: {node: '>= 0.4'} dev: true + /tailwindcss@3.3.5: + resolution: {integrity: sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.5.3 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-import: 15.1.0(postcss@8.4.31) + postcss-js: 4.0.1(postcss@8.4.31) + postcss-load-config: 4.0.1(postcss@8.4.31) + postcss-nested: 6.0.1(postcss@8.4.31) + postcss-selector-parser: 6.0.13 + resolve: 1.22.8 + sucrase: 3.34.0 + transitivePeerDependencies: + - ts-node + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + /to-fast-properties@2.0.0: resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} engines: {node: '>=4'} dev: true + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: true + /tr46@0.0.3: resolution: {integrity: sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=} dev: true + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + /ts-invariant@0.4.4: resolution: {integrity: sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==} dependencies: @@ -1119,13 +1585,13 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /update-browserslist-db@1.0.11(browserslist@4.21.9): - resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==} + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.21.9 + browserslist: 4.22.1 escalade: 3.1.1 picocolors: 1.0.0 dev: true @@ -1143,6 +1609,10 @@ packages: react: 17.0.2 dev: true + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: true + /uuid@7.0.3: resolution: {integrity: sha512-DPSke0pXhTZgoF/d+WSt2QaKMCFSfx7QegxEWT+JOuHF5aWrKEn0G+ztjuJg/gG8/ItK+rbPCD/yNv8yyih6Cg==} hasBin: true @@ -1178,6 +1648,10 @@ packages: webidl-conversions: 3.0.1 dev: true + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: true + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} dev: true @@ -1187,6 +1661,11 @@ packages: engines: {node: '>= 6'} dev: true + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + /zen-observable-ts@0.8.21: resolution: {integrity: sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==} dependencies: From 93356fc3f18b6bf1f2dd217db1ae76b269025f16 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Sat, 18 Nov 2023 16:44:58 +0800 Subject: [PATCH 6/7] ci: add node 20 & npm provenance --- .github/workflows/ci.yml | 55 +++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 24 insertions(+), 33 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ebcf4aa3..5ff0a564 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,32 +13,22 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest] - node-version: [16.x, 18.x] + node-version: [16.x, 18.x, 20.x] runs-on: ${{ matrix.os }} # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - - uses: actions/setup-node@v3 - with: - node-version: ${{ matrix.node-version }} + - uses: pnpm/action-setup@v2 + name: Install pnpm - - name: Cache ~/.pnpm-store - uses: actions/cache@v3 - env: - cache-name: cache-pnpm-store + - uses: actions/setup-node@v4 with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ matrix.node-version }}-test-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-${{ matrix.node-version }}-test-${{ env.cache-name }}- - ${{ runner.os }}-${{ matrix.node-version }}-test- - ${{ runner.os }}- - - name: Install pnpm - run: corepack enable + node-version: ${{ matrix.node-version }} + cache: pnpm - name: Install deps run: pnpm i @@ -51,25 +41,26 @@ jobs: runs-on: ubuntu-latest needs: ['test'] if: "!contains(github.event.head_commit.message, 'skip-release') && !contains(github.event.head_commit.message, 'skip-ci') && github.event_name != 'pull_request'" + permissions: + contents: write + issues: write + pull-requests: write + id-token: write steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: 18.x - - name: Cache ~/.pnpm-store - uses: actions/cache@v3 - env: - cache-name: cache-pnpm-store + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v2 + name: Install pnpm + + - uses: actions/setup-node@v4 with: - path: ~/.pnpm-store - key: ${{ runner.os }}-${{ matrix.node-version }}-release-${{ env.cache-name }}-${{ hashFiles('**/pnpm-lock.yaml') }} - restore-keys: | - ${{ runner.os }}-${{ matrix.node-version }}-release-${{ env.cache-name }}- - ${{ runner.os }}-${{ matrix.node-version }}-release- - ${{ runner.os }}- - - run: corepack enable + node-version: lts/* + cache: pnpm + - run: pnpm i + - run: pnpx semantic-release --branches main env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_TOKEN: ${{ secrets.NPM_TOKEN }} + NPM_CONFIG_PROVENANCE: true diff --git a/package.json b/package.json index 74a4b347..f6145ba2 100644 --- a/package.json +++ b/package.json @@ -96,5 +96,5 @@ "engines": { "node": ">=18" }, - "packageManager": "pnpm@8.6.0" + "packageManager": "pnpm@8.10.5" } From 4c1ad387eb690c959a318287cc08dfadfe6ca011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90=20Kevin=20Deng?= Date: Sun, 19 Nov 2023 17:51:43 +0800 Subject: [PATCH 7/7] ci!: drop node 16 BREAKING CHANGE: Drop node < 18 --- .github/workflows/ci.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ff0a564..dde0600e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,12 +8,10 @@ on: jobs: test: - if: "!contains(github.event.head_commit.message, 'ci skip')" - strategy: matrix: os: [ubuntu-latest, windows-latest] - node-version: [16.x, 18.x, 20.x] + node-version: [18.x, 20.x] runs-on: ${{ matrix.os }} @@ -35,7 +33,7 @@ jobs: # Runs a set of commands using the runners shell - name: Build and Test - run: npm test + run: pnpm test release: runs-on: ubuntu-latest