From 35669754ed1bc9104402f95a462138bac250a477 Mon Sep 17 00:00:00 2001 From: Peach Date: Sun, 28 Apr 2024 14:31:46 +0800 Subject: [PATCH] chore: add release script (#2088) * chore: add release script * chore: log version after publish * ci: add dingtalk group 4 release notify --- .github/workflows/release-notify.yml | 13 ++ package.json | 9 +- pnpm-lock.yaml | 239 ++++++++++++++++++++++++--- scripts/release.ts | 163 ++++++++++++++++++ suites/boilerplate/package.json | 3 +- suites/dumi-vue-meta/package.json | 1 - suites/father-plugin/package.json | 3 +- suites/preset-vue/package.json | 1 - suites/theme-mobile/package.json | 3 +- 9 files changed, 402 insertions(+), 33 deletions(-) create mode 100644 scripts/release.ts diff --git a/.github/workflows/release-notify.yml b/.github/workflows/release-notify.yml index 89154eda11..30c162bdb0 100644 --- a/.github/workflows/release-notify.yml +++ b/.github/workflows/release-notify.yml @@ -47,3 +47,16 @@ jobs: "text": "# [${{github.event.release.tag_name}}](${{github.event.release.html_url}}) released:\n${{github.event.release.body}}" } } + - name: Notify for the Dingtalk group 4 + uses: zcong1993/actions-ding@master + with: + dingToken: ${{ secrets.DINGTALK_GROUP4_TOKEN }} + secret: ${{ secrets.DINGTALK_GROUP4_SIGN }} + body: | + { + "msgtype": "markdown", + "markdown": { + "title": "${{github.event.release.tag_name}} released", + "text": "# [${{github.event.release.tag_name}}](${{github.event.release.html_url}}) released:\n${{github.event.release.body}}" + } + } diff --git a/package.json b/package.json index 89694215cc..cc864cf9c0 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,7 @@ "lint:css": "stylelint \"{src,test}/**/*.{css,less}\"", "lint:es": "eslint \"{src,test}/**/*.{js,jsx,ts,tsx}\"", "prepare": "husky install && npm run build && npm run build:suites && node ./bin/dumi.js setup && npm run docs:sync", - "prepublishOnly": "npm run build", + "release": "esno scripts/release.ts", "test": "vitest", "vercel:build": "npm run docs:build", "vercel:install": "./scripts/vercel-install.sh" @@ -94,7 +94,7 @@ "copy-to-clipboard": "^3.3.3", "deepmerge": "^4.3.1", "dumi-afx-deps": "^1.0.0-alpha.19", - "dumi-assets-types": "2.0.0-alpha.0", + "dumi-assets-types": "workspace:*", "enhanced-resolve": "^5.15.0", "estree-util-to-js": "^1.2.0", "estree-util-visit": "^1.2.1", @@ -166,8 +166,10 @@ "codesandbox-import-utils": "^2.2.3", "dumi-theme-mobile": "workspace:*", "eslint": "^8.46.0", + "esno": "^4.7.0", "fast-glob": "^3.3.1", "father": "^4.3.0", + "git-repo-info": "^2.1.1", "highlight-words-core": "^1.2.2", "husky": "^8.0.3", "lint-staged": "^13.2.3", @@ -179,7 +181,8 @@ "stylelint": "^15.10.2", "ts-node": "^10.9.1", "typescript": "~5.0.4", - "vitest": "^0.33.0" + "vitest": "^0.33.0", + "zx": "^7.2.3" }, "peerDependencies": { "react": ">=16.8", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e41d07172..0e266db279 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,5 +1,9 @@ lockfileVersion: '6.0' +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + importers: .: @@ -53,7 +57,7 @@ importers: specifier: ^1.0.0-alpha.19 version: 1.0.0-alpha.19 dumi-assets-types: - specifier: 2.0.0-alpha.0 + specifier: workspace:* version: link:assets-types enhanced-resolve: specifier: ^5.15.0 @@ -263,12 +267,18 @@ importers: eslint: specifier: ^8.46.0 version: 8.46.0 + esno: + specifier: ^4.7.0 + version: 4.7.0 fast-glob: specifier: ^3.3.1 version: 3.3.1 father: specifier: ^4.3.0 version: 4.3.0(@types/node@18.17.1)(styled-components@6.1.8)(webpack@5.89.0) + git-repo-info: + specifier: ^2.1.1 + version: 2.1.1 highlight-words-core: specifier: ^1.2.2 version: 1.2.2 @@ -305,6 +315,9 @@ importers: vitest: specifier: ^0.33.0 version: 0.33.0(sass@1.64.1) + zx: + specifier: ^7.2.3 + version: 7.2.3 assets-types: {} @@ -3584,7 +3597,6 @@ packages: dependencies: '@types/jsonfile': 6.1.2 '@types/node': 18.17.1 - dev: false /@types/github-slugger@1.3.0: resolution: {integrity: sha512-J/rMZa7RqiH/rT29TEVZO4nBoDP9XJOjnbbIofg7GQKs4JIduEO3WLpte+6WeUz/TcrXKlY+bM7FYrp8yFB+3g==} @@ -3673,7 +3685,6 @@ packages: resolution: {integrity: sha512-8t92P+oeW4d/CRQfJaSqEwXujrhH4OEeHRjGU3v1Q8mUS8GPF3yiX26sw4svv6faL2HfBtGTe2xWIoVgN3dy9w==} dependencies: '@types/node': 18.17.1 - dev: false /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} @@ -3741,6 +3752,10 @@ packages: /@types/prop-types@15.7.7: resolution: {integrity: sha512-FbtmBWCcSa2J4zL781Zf1p5YUBXQomPEcep9QZCfRfQgTxz3pJWiDFLebohZ9fFntX5ibzOkSsrJ0TEew8cAog==} + /@types/ps-tree@1.1.6: + resolution: {integrity: sha512-PtrlVaOaI44/3pl3cvnlK+GxOM3re2526TJvPvh7W+keHIXdV4TE0ylpPBAcvFQCbGitaTXwL9u+RF7qtVeazQ==} + dev: true + /@types/q@1.5.6: resolution: {integrity: sha512-IKjZ8RjTSwD4/YG+2gtj7BPFRB/lNbWKTiSj3M7U/TD2B7HfYCxvp2Zz6xA2WIY7pAuL1QOUPw8gQRbUrrq4fQ==} dev: false @@ -3827,6 +3842,10 @@ packages: resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==} dev: false + /@types/which@3.0.3: + resolution: {integrity: sha512-2C1+XoY0huExTbs8MQv1DuS5FS86+SEjdM9F/+GS61gg5Hqbtj8ZiDSx8MfWcyei907fIPbfPGCOrNUTnVHY1g==} + dev: true + /@types/yargs-parser@21.0.1: resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} @@ -4409,7 +4428,7 @@ packages: axios: 0.27.2 babel-plugin-import: 1.13.8 dayjs: 1.11.10 - dva-core: 2.0.4(redux@3.7.2) + dva-core: 2.0.4(redux@4.2.1) dva-immer: 1.0.1(dva@2.5.0-beta.2) dva-loading: 3.0.24(dva-core@2.0.4) event-emitter: 0.3.5 @@ -4529,7 +4548,7 @@ packages: react-refresh: 0.14.0 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.89.0(@swc/core@1.4.2)(esbuild@0.19.11) + webpack: 5.89.0(@swc/core@1.4.2) /@umijs/renderer-react@4.0.84(react-dom@18.1.0)(react@18.1.0): resolution: {integrity: sha512-0SDMuLsBpXmdNzubwke0ihq1tvlhDumZn0BJ0JC7xavOmx9bx6jWo3BRrBn1BfkUoCJC8E4C8ZmDJMKrmQ7BUA==} @@ -6587,7 +6606,7 @@ packages: postcss-modules-values: 4.0.0(postcss@8.4.33) postcss-value-parser: 4.2.0 semver: 7.5.4 - webpack: 5.89.0(@swc/core@1.4.2)(esbuild@0.19.11) + webpack: 5.89.0(@swc/core@1.4.2) /css-prefers-color-scheme@6.0.3(postcss@8.4.29): resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==} @@ -6726,7 +6745,6 @@ packages: /data-uri-to-buffer@4.0.1: resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} engines: {node: '>= 12'} - dev: false /datauri@3.0.0: resolution: {integrity: sha512-NeDFuUPV1YCpCn8MUIcDk1QnuyenUHs7f4Q5P0n9FFA0neKFrfEH9esR+YMW95BplbYfdmjbs0Pl/ZGAaM2QHQ==} @@ -7052,6 +7070,10 @@ packages: resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} dev: false + /duplexer@0.1.2: + resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dev: true + /duplexify@3.7.1: resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} dependencies: @@ -7084,7 +7106,7 @@ packages: warning: 3.0.0 dev: true - /dva-core@2.0.4(redux@3.7.2): + /dva-core@2.0.4(redux@4.2.1): resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==} peerDependencies: redux: 4.x @@ -7094,7 +7116,7 @@ packages: global: 4.4.0 invariant: 2.2.4 is-plain-object: 2.0.4 - redux: 3.7.2 + redux: 4.2.1 redux-saga: 0.16.2 warning: 3.0.0 dev: true @@ -7115,7 +7137,7 @@ packages: dva-core: ^1.1.0 || ^1.5.0-0 || ^1.6.0-0 dependencies: '@babel/runtime': 7.23.1 - dva-core: 2.0.4(redux@3.7.2) + dva-core: 2.0.4(redux@4.2.1) dev: true /dva@2.5.0-beta.2(react-dom@18.2.0)(react@18.2.0): @@ -7908,6 +7930,13 @@ packages: - supports-color dev: true + /esno@4.7.0: + resolution: {integrity: sha512-81owrjxIxOwqcABt20U09Wn8lpBo9K6ttqbGvQcB3VYNLJyaV1fvKkDtpZd3Rj5BX3WXiGiJCjUevKQGNICzJg==} + hasBin: true + dependencies: + tsx: 4.7.1 + dev: true + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -7981,6 +8010,18 @@ packages: es5-ext: 0.10.62 dev: true + /event-stream@3.3.4: + resolution: {integrity: sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=} + dependencies: + duplexer: 0.1.2 + from: 0.1.7 + map-stream: 0.1.0 + pause-stream: 0.0.11 + split: 0.3.3 + stream-combiner: 0.0.4 + through: 2.3.8 + dev: true + /eventemitter3@2.0.3: resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} dev: false @@ -8170,7 +8211,6 @@ packages: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.2.1 - dev: false /figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} @@ -8333,7 +8373,7 @@ packages: semver: 7.5.4 tapable: 2.2.1 typescript: 5.0.4 - webpack: 5.89.0(@swc/core@1.4.2)(esbuild@0.19.11) + webpack: 5.89.0(@swc/core@1.4.2) /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.3.3)(webpack@5.89.0): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} @@ -8377,7 +8417,6 @@ packages: engines: {node: '>=12.20.0'} dependencies: fetch-blob: 3.2.0 - dev: false /fraction.js@4.3.6: resolution: {integrity: sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==} @@ -8389,6 +8428,10 @@ packages: readable-stream: 2.3.8 dev: false + /from@0.1.7: + resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} + dev: true + /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} dev: false @@ -8468,6 +8511,11 @@ packages: /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + /fx@34.0.0: + resolution: {integrity: sha512-/fZih3/WLsrtlaj2mahjWxAmyuikmcl3D5kKPqLtFmEilLsy9wp0+/vEmfvYXXhwJc+ajtCFDCf+yttXmPMHSQ==} + hasBin: true + dev: true + /genfun@4.0.1: resolution: {integrity: sha512-48yv1eDS5Qrz6cbSDBBik0u7jCgC/eA9eZrl9MIN1LfKzFTuGt6EHgr31YM8yT9cjb5BplXb4Iz3VtOYmgt8Jg==} dev: false @@ -8522,7 +8570,6 @@ packages: resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} dependencies: resolve-pkg-maps: 1.0.0 - dev: false /get-value@2.0.6: resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} @@ -8558,6 +8605,11 @@ packages: through2: 4.0.2 dev: true + /git-repo-info@2.1.1: + resolution: {integrity: sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg==} + engines: {node: '>= 4.0'} + dev: true + /git-repo-name@0.6.0: resolution: {integrity: sha512-DF4XxB6H+Te79JA08/QF/IjIv+j+0gF990WlgAX3SXXU2irfqvBc/xxlAIh6eJWYaKz45MrrGVBFS0Qc4bBz5g==} engines: {node: '>=0.8'} @@ -9091,7 +9143,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.89.0(@swc/core@1.4.2)(esbuild@0.19.11) + webpack: 5.89.0(@swc/core@1.4.2) dev: false /html2sketch@1.0.2: @@ -10421,6 +10473,10 @@ packages: resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} engines: {node: '>=8'} + /map-stream@0.1.0: + resolution: {integrity: sha512-CkYQrPYZfWnu/DAmVCpTSX/xHpKZ80eKh2lAkyA6AJTef6bW+6JpbQZN5rofum7da+SyN1bi5ctTm+lTfcCW3g==} + dev: true + /markdown-table@3.0.3: resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} dev: false @@ -11170,7 +11226,6 @@ packages: /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} - dev: false /node-fetch-npm@2.0.4: resolution: {integrity: sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==} @@ -11189,6 +11244,15 @@ packages: is-stream: 1.1.0 dev: true + /node-fetch@3.3.1: + resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + dev: true + /node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -11754,6 +11818,12 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true + /pause-stream@0.0.11: + resolution: {integrity: sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=} + dependencies: + through: 2.3.8 + dev: true + /pbkdf2@3.1.2: resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==} engines: {node: '>=0.12'} @@ -12766,6 +12836,14 @@ packages: dev: false optional: true + /ps-tree@1.2.0: + resolution: {integrity: sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==} + engines: {node: '>= 0.10'} + hasBin: true + dependencies: + event-stream: 3.3.4 + dev: true + /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} dev: false @@ -12897,7 +12975,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.89.0(@swc/core@1.4.2)(esbuild@0.19.11) + webpack: 5.89.0(@swc/core@1.4.2) dev: false /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0): @@ -14441,7 +14519,6 @@ packages: /resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: false /resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} @@ -14992,6 +15069,12 @@ packages: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + /split@0.3.3: + resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} + dependencies: + through: 2.3.8 + dev: true + /sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -15034,6 +15117,12 @@ packages: inherits: 2.0.4 readable-stream: 2.3.8 + /stream-combiner@0.0.4: + resolution: {integrity: sha512-rT00SPnTVyRsaSz5zgSPma/aHSOic5U1prhYdRy5HS2kTZviFpmDgzilbtsJsxiroqACmayynDN/9VzIbX5DOw==} + dependencies: + duplexer: 0.1.2 + dev: true + /stream-each@1.2.3: resolution: {integrity: sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==} dependencies: @@ -15496,6 +15585,31 @@ packages: serialize-javascript: 6.0.2 terser: 5.27.0 webpack: 5.89.0(@swc/core@1.4.2)(esbuild@0.19.11) + dev: false + + /terser-webpack-plugin@5.3.10(@swc/core@1.4.2)(webpack@5.89.0): + resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.22 + '@swc/core': 1.4.2 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.2 + terser: 5.27.0 + webpack: 5.89.0(@swc/core@1.4.2) /terser@5.20.0: resolution: {integrity: sha512-e56ETryaQDyebBwJIWYB2TT6f2EZ0fL0sW/JRXNMN26zZdKi2u/E/5my5lG6jNxym6qsrVXfFRmOdV42zlAgLQ==} @@ -15841,6 +15955,17 @@ packages: fsevents: 2.3.3 dev: false + /tsx@4.7.1: + resolution: {integrity: sha512-8d6VuibXHtlN5E3zFkgY8u4DX7Y3Z27zvvPKVmLon/D4AjuKzarkUBTLDBgj9iTQ0hg5xM7c/mYiRVM+HETf0g==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + esbuild: 0.19.11 + get-tsconfig: 4.7.2 + optionalDependencies: + fsevents: 2.3.3 + dev: true + /tty-browserify@0.0.0: resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==} @@ -16726,7 +16851,6 @@ packages: /web-streams-polyfill@3.2.1: resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==} engines: {node: '>= 8'} - dev: false /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -16740,6 +16864,45 @@ packages: resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} dev: true + /webpack@5.89.0(@swc/core@1.4.2): + resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.5 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.11.3 + acorn-import-assertions: 1.9.0(acorn@8.11.3) + browserslist: 4.22.2 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.4.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.10(@swc/core@1.4.2)(webpack@5.89.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + /webpack@5.89.0(@swc/core@1.4.2)(esbuild@0.19.11): resolution: {integrity: sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==} engines: {node: '>=10.13.0'} @@ -16778,6 +16941,12 @@ packages: - '@swc/core' - esbuild - uglify-js + dev: false + + /webpod@0.0.2: + resolution: {integrity: sha512-cSwwQIeg8v4i3p4ajHhwgR7N6VyxAf+KYSSsY6Pd3aETE+xEU4vbitz7qQkB0I321xnhDdgtxuiSfk5r/FVtjg==} + hasBin: true + dev: true /whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -16848,6 +17017,14 @@ packages: dependencies: isexe: 2.0.0 + /which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: true + /why-is-node-running@2.2.2: resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} engines: {node: '>=8'} @@ -17020,6 +17197,24 @@ packages: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} dev: false -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false + /zx@7.2.3: + resolution: {integrity: sha512-QODu38nLlYXg/B/Gw7ZKiZrvPkEsjPN3LQ5JFXM7h0JvwhEdPNNl+4Ao1y4+o3CLNiDUNcwzQYZ4/Ko7kKzCMA==} + engines: {node: '>= 16.0.0'} + hasBin: true + dependencies: + '@types/fs-extra': 11.0.1 + '@types/minimist': 1.2.3 + '@types/node': 18.17.1 + '@types/ps-tree': 1.1.6 + '@types/which': 3.0.3 + chalk: 5.2.0 + fs-extra: 11.1.1 + fx: 34.0.0 + globby: 13.2.2 + minimist: 1.2.8 + node-fetch: 3.3.1 + ps-tree: 1.2.0 + webpod: 0.0.2 + which: 3.0.1 + yaml: 2.3.4 + dev: true diff --git a/scripts/release.ts b/scripts/release.ts new file mode 100644 index 0000000000..579c02cadb --- /dev/null +++ b/scripts/release.ts @@ -0,0 +1,163 @@ +import rimraf from '@umijs/utils/compiled/rimraf'; +import * as logger from '@umijs/utils/dist/logger'; +import assert from 'assert'; +import fs from 'fs'; +import getGitRepoInfo from 'git-repo-info'; +import { join } from 'path'; +import 'zx/globals'; + +const all = [ + '.', + 'assets-types', + ...fs + .readdirSync(join(__dirname, '../suites')) + .map((suite) => `suites/${suite}`), +]; + +(async () => { + const { branch } = getGitRepoInfo(); + logger.info(`branch: ${branch}`); + logger.info(`pkgs: ${all.join(', ')}`); + + // check git status + logger.event('check git status'); + const isGitClean = (await $`git status --porcelain`).stdout.trim().length; + assert(!isGitClean, 'git status is not clean'); + + // check git remote update + logger.event('check git remote update'); + await $`git fetch`; + const gitStatus = (await $`git status --short --branch`).stdout.trim(); + assert(!gitStatus.includes('behind'), `git status is behind remote`); + + // check npm registry + logger.event('check npm registry'); + const registry = (await $`npm config get registry`).stdout.trim(); + assert( + registry === 'https://registry.npmjs.org/', + 'npm registry is not https://registry.npmjs.org/', + ); + + // check npm ownership + logger.event('check npm ownership'); + const whoami = (await $`npm whoami`).stdout.trim(); + await Promise.all( + ['dumi', 'create-dumi'].map(async (pkg) => { + const owners = (await $`npm owner ls ${pkg}`).stdout + .trim() + .split('\n') + .map((line) => { + return line.split(' ')[0]; + }); + assert(owners.includes(whoami), `${pkg} is not owned by ${whoami}`); + }), + ); + + // select pkgs + const pkgs: string[] = []; + const vers: Record = {}; + + for (const pkg of all) { + const isMain = pkg === '.'; + const pkgJson = require(join('..', pkg, 'package.json')); + const ver = await question( + `Input ${ + isMain ? '`dumi`' : `\`${pkgJson.name}\`` + } release version\n(current: ${pkgJson.version}${ + isMain ? '' : ', empty means skip, . means same with `dumi`' + }): `, + ); + + if (ver) { + pkgs.push(pkg); + vers[pkg] = ver === '.' ? vers['.'] : ver; + } else { + assert(!isMain, 'main package version can not be empty'); + } + } + + // clean + logger.event('clean'); + pkgs.forEach((pkg) => { + logger.info(`clean ${pkg}/dist`); + rimraf.sync(join(pkg, 'dist')); + }); + + // build packages + logger.event('build packages'); + for (const pkg of pkgs) { + if (require(join('..', pkg, 'package.json')).scripts?.build) { + await $`cd ${pkg} && npm run build`; + } + } + + // bump version + logger.event('bump version'); + const version = vers['.']; + await Promise.all( + pkgs.map(async (pkg) => { + await $`cd ${pkg} && npm version ${vers[pkg]} --no-git-tag-version`; + }), + ); + let tag = 'latest'; + if ( + version.includes('-alpha.') || + version.includes('-beta.') || + version.includes('-rc.') + ) { + tag = 'next'; + } + if (version.includes('-canary.')) tag = 'canary'; + + // commit + logger.event('commit'); + await $`git commit --all --message "build: release ${version}"`; + + // git tag + if (tag !== 'canary') { + logger.event('git tag'); + await $`git tag v${version}`; + } + + // git push + logger.event('git push'); + await $`git push origin ${branch} --tags`; + + // npm publish + logger.event('pnpm publish'); + $.verbose = false; + + // check 2fa config + let otpArg: string[] = []; + if ( + (await $`npm profile get "two-factor auth"`).toString().includes('writes') + ) { + let code = ''; + do { + // get otp from user + code = await question('This operation requires a one-time password: '); + // generate arg for zx command + // why use array? https://github.com/google/zx/blob/main/docs/quotes.md + otpArg = ['--otp', code]; + } while (code.length !== 6); + } + + await Promise.all( + pkgs.map(async (pkg) => { + await $`cd ${pkg} && pnpm publish --no-git-checks --tag ${tag} ${otpArg}`; + logger.info(`+ ${pkg}@${vers[pkg]}`); + }), + ); + + // sync tnpm + logger.event('sync tnpm'); + $.verbose = false; + await Promise.all( + pkgs.map(async (pkg) => { + const { name } = require(path.join(pkg, 'package.json')); + logger.info(`sync ${name}`); + await $`tnpm sync ${name}`; + }), + ); + $.verbose = true; +})(); diff --git a/suites/boilerplate/package.json b/suites/boilerplate/package.json index 0c0dfac86d..ec2c35ffd0 100644 --- a/suites/boilerplate/package.json +++ b/suites/boilerplate/package.json @@ -20,8 +20,7 @@ ], "scripts": { "build": "father build", - "dev": "father dev", - "prepublishOnly": "father doctor && father build" + "dev": "father dev" }, "dependencies": { "@umijs/utils": "^4.0.84" diff --git a/suites/dumi-vue-meta/package.json b/suites/dumi-vue-meta/package.json index a77042d209..de35df6601 100644 --- a/suites/dumi-vue-meta/package.json +++ b/suites/dumi-vue-meta/package.json @@ -18,7 +18,6 @@ "build": "father build", "build:deps": "father prebundle", "dev": "father dev", - "prepublishOnly": "father doctor && npm run build", "test": "vitest" }, "dependencies": { diff --git a/suites/father-plugin/package.json b/suites/father-plugin/package.json index a185ca5bf9..8de660ba63 100644 --- a/suites/father-plugin/package.json +++ b/suites/father-plugin/package.json @@ -15,8 +15,7 @@ ], "scripts": { "build": "father build", - "dev": "father dev", - "prepublishOnly": "father doctor && npm run build" + "dev": "father dev" }, "devDependencies": { "father": "^4.1.0" diff --git a/suites/preset-vue/package.json b/suites/preset-vue/package.json index 1823e43fbc..c5e6f23f76 100644 --- a/suites/preset-vue/package.json +++ b/suites/preset-vue/package.json @@ -21,7 +21,6 @@ "build:deps": "father prebundle", "build:lib": "tsup --minify", "dev": "father dev", - "prepublishOnly": "father doctor && npm run build", "test": "vitest" }, "dependencies": { diff --git a/suites/theme-mobile/package.json b/suites/theme-mobile/package.json index b5e9073377..578d8dfbe2 100644 --- a/suites/theme-mobile/package.json +++ b/suites/theme-mobile/package.json @@ -23,8 +23,7 @@ ], "scripts": { "build": "father build", - "dev": "father dev", - "prepublishOnly": "father doctor && npm run build" + "dev": "father dev" }, "dependencies": { "@ant-design/icons-svg": "^4.2.1",