diff --git a/.gitignore b/.gitignore index 960df7d52..4dbb2d65d 100644 --- a/.gitignore +++ b/.gitignore @@ -29,6 +29,7 @@ dist # misc .DS_Store +.env .env.local .env.development.local .env.test.local @@ -47,3 +48,9 @@ es # cursor .cursor + +verdaccio +ftp-data + + +/scripts/cli/dms-kit-publish/docs \ No newline at end of file diff --git a/Makefile b/Makefile index 11d7e3fec..acbde1e37 100644 --- a/Makefile +++ b/Makefile @@ -46,12 +46,5 @@ docker_build_ee: pull_image docker_install_node_modules docker_build_demo: pull_image docker_install_node_modules $(DOCKER) run -v $(MAIN_MODULE):/usr/src/app --user $(UID):$(GID) -w /usr/src/app --rm $(DOCKER_IMAGE) sh -c "pnpm build:demo" -docker_build_icons_docs: pull_image docker_install_node_modules - $(DOCKER) run -v $(MAIN_MODULE):/usr/src/app --user $(UID):$(GID) -w /usr/src/app --rm $(DOCKER_IMAGE) sh -c "pnpm icon:docs:g && pnpm icon:docs:build && mv packages/icons/docs-dist ./docs-dist && tar zcf $(ICONS_DOCS_OUTER_BUILD_NAME) ./docs-dist" - -docker_upload_icons_docs: - curl -T $(ICONS_DOCS_OUTER_BUILD_NAME) \ - ftp://$(RELEASE_FTP_HOST)/actiontech-dms-ui/icons/$(ICONS_DOCS_OUTER_BUILD_NAME) --ftp-create-dirs - -docker_sync_icons_docs_static: - curl -X POST ${SYNC_ICONS_DOCS_STATIC_HOST}/sync-static \ No newline at end of file +docker_dms_kit_publish: docker_install_node_modules + $(DOCKER) run -v $(MAIN_MODULE):/usr/src/app --user $(UID):$(GID) -w /usr/src/app --rm $(DOCKER_IMAGE) sh -c "pnpm dms-kit:publish" diff --git a/package.json b/package.json index 99e325790..f3c59eef7 100644 --- a/package.json +++ b/package.json @@ -34,12 +34,14 @@ "api_client:g": "npm_config_registry=http://10.186.18.19:4873 pnpx @actiontech/cli api-client -y", "api_mocks:g": "npm_config_registry=http://10.186.18.19:4873 pnpx @actiontech/cli api-mocks -y", "ai-doc": "npm_config_registry=http://10.186.18.19:4873 pnpx @actiontech/cli ai-doc", - "postinstall": "pnpm --filter @actiontech/dms-kit build" + "postinstall": "pnpm --filter @actiontech/dms-kit build", + "dms-kit:publish": "pnpm --filter @actiontech/cli-dms-kit-publish build && dms-kit-publish" }, "keywords": [], "author": "", "devDependencies": { "@actiontech/cli-create-dms-page": "workspace:^", + "@actiontech/cli-dms-kit-publish": "workspace:^", "@cfaester/enzyme-adapter-react-18": "^0.7.0", "@eslint/js": "^9.23.0", "@testing-library/dom": "9.3.4", @@ -92,6 +94,7 @@ "stylelint-config-styled-components": "^0.1.1", "stylelint-prettier": "^4.0.2", "ts-jest": "27.1.5", + "tsx": "^4.20.5", "typescript": "^5.0.2", "typescript-eslint": "^8.28.0", "vite": "^5.2.6", diff --git a/packages/dms-kit/.dumi/tsconfig.json b/packages/dms-kit/.dumi/tsconfig.json new file mode 100644 index 000000000..79711a82b --- /dev/null +++ b/packages/dms-kit/.dumi/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "**/*" + ] +} \ No newline at end of file diff --git a/packages/dms-kit/package.json b/packages/dms-kit/package.json index 05cf82ac0..72714c484 100644 --- a/packages/dms-kit/package.json +++ b/packages/dms-kit/package.json @@ -23,10 +23,6 @@ "test:c": "jest --watchAll=false --coverage", "test:ci": "jest --ci --watchAll=false --coverage --color --silent --testLocationInResults" }, - "publishConfig": { - "registry": "http://10.186.18.19:4873/", - "access": "restricted" - }, "dependencies": { "ahooks": "^3.7.0", "axios": ">=0.27.2", diff --git a/packages/icons/.dumi/tsconfig.json b/packages/icons/.dumi/tsconfig.json new file mode 100644 index 000000000..79711a82b --- /dev/null +++ b/packages/icons/.dumi/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../tsconfig.json", + "include": [ + "**/*" + ] +} \ No newline at end of file diff --git a/packages/icons/docs/icon/Common.md b/packages/icons/docs/icon/Common.md index f3faaa138..dc928e70e 100644 --- a/packages/icons/docs/icon/Common.md +++ b/packages/icons/docs/icon/Common.md @@ -361,6 +361,20 @@ import { EyeClosedOutlined } from '@actiontech/icons'; export default () => ``` +## FaLessThanEqualOutlined +```jsx +import { FaLessThanEqualOutlined } from '@actiontech/icons'; + +export default () => +``` + +## FilterOutlined +```jsx +import { FilterOutlined } from '@actiontech/icons'; + +export default () => +``` + ## HexagonOutlined ```jsx import { HexagonOutlined } from '@actiontech/icons'; diff --git a/packages/icons/docs/icon/Data.md b/packages/icons/docs/icon/Data.md index 3fbd8e0ef..ca59ecbb2 100644 --- a/packages/icons/docs/icon/Data.md +++ b/packages/icons/docs/icon/Data.md @@ -144,6 +144,13 @@ import { TrendCardFilled } from '@actiontech/icons'; export default () => ``` +## DashboardOutlined +```jsx +import { DashboardOutlined } from '@actiontech/icons'; + +export default () => +``` + ## DoubleDatabaseOutlined ```jsx import { DoubleDatabaseOutlined } from '@actiontech/icons'; diff --git a/packages/icons/package_publish.json b/packages/icons/package_publish.json index 112a4072d..8e8d9987f 100644 --- a/packages/icons/package_publish.json +++ b/packages/icons/package_publish.json @@ -1,7 +1,7 @@ { "name": "@actiontech/icons", - "version": "0.0.1-rc.7", "description": "", + "version": "0.0.1-rc.7", "main": "./dist/index.js", "module": "./es/index.js", "types": "./es/index.d.ts", @@ -21,10 +21,6 @@ "es", "dist" ], - "publishConfig": { - "registry": "http://10.186.18.19:4873/", - "access": "restricted" - }, "scripts": { "start": "dumi dev", "docs:build": "dumi build", @@ -46,4 +42,4 @@ "peerDependencies": { "react": ">=17" } -} \ No newline at end of file +} diff --git a/packages/icons/publish-icons.mjs b/packages/icons/publish-icons.mjs index 793ae5089..c0b864af1 100755 --- a/packages/icons/publish-icons.mjs +++ b/packages/icons/publish-icons.mjs @@ -5,8 +5,12 @@ import { fileURLToPath } from 'node:url'; import { spawnSync } from 'node:child_process'; import readline from 'node:readline'; +const __filename = fileURLToPath(import.meta.url); +const __dirname = path.dirname(__filename); +const iconsDir = __dirname; + function parseArgs(argv) { - const args = { version: '', skipConfirm: false }; + const args = { version: '', skipConfirm: false, registry: '', auth: '' }; for (let i = 2; i < argv.length; i += 1) { const key = argv[i]; const val = argv[i + 1]; @@ -15,6 +19,10 @@ function parseArgs(argv) { i += 1; } else if (key === '--skip-confirm' || key === '-y') { args.skipConfirm = true; + } else if (key === '--registry' || key === '-r') { + args.registry = val || ''; + } else if (key === '--auth' || key === '-a') { + args.auth = val || ''; } } return args; @@ -124,31 +132,10 @@ async function confirmPublish() { }); } -function updatePackagePublishVersion(iconsDir, version) { - const pubPkgPath = path.join(iconsDir, 'package_publish.json'); - try { - const pubPkgContent = readJson(pubPkgPath); - pubPkgContent.version = version; - writeJson(pubPkgPath, pubPkgContent); - console.log(`✅ 已更新 package_publish.json 版本号为: ${version}`); - } catch (err) { - console.warn(`⚠️ 更新 package_publish.json 版本号失败: ${err.message}`); - } -} - async function main() { - const { version, skipConfirm } = parseArgs(process.argv); - if (!version) { - console.error('请通过 --version 或 -v 指定版本号,例如:'); - console.error( - ' node packages/icons/publish-icons.mjs --version 0.0.1-rc.3' - ); - process.exit(1); - } + const { skipConfirm, registry, auth } = parseArgs(process.argv); - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - const iconsDir = __dirname; + const version = readJson(path.join(iconsDir, 'package.json')).version; const pubPkg = path.join(iconsDir, 'package_publish.json'); ensureFileExists(pubPkg, '发布用 package_publish.json'); @@ -158,12 +145,11 @@ async function main() { const originalVersion = originalPubPkgContent.version; const tmpBase = path.join(__dirname, '..'); - const tmpDir = fs.mkdtempSync( - path.join(tmpBase, 'actiontech-icons-publish-') - ); + const tmpDir = path.join(tmpBase, 'actiontech-icons-publish'); try { console.log(`[1/7] 创建临时目录: ${tmpDir}`); + fs.mkdirSync(tmpDir, { recursive: true }); console.log('[2/7] 复制整个 icons 包到临时目录'); // 复制整个包目录,但排除一些不需要的文件 @@ -226,12 +212,14 @@ async function main() { return; } } - - console.log('[6/7] 执行发布: npm publish'); - runCmd('npm', ['publish'], tmpDir); - - console.log('[7/7] 更新 package_publish.json 版本号'); - updatePackagePublishVersion(iconsDir, version); + console.log('[6/7] 配置认证'); + runCmd('pnpm', ['config', 'set', auth], tmpDir); + console.log('[7/7] 执行发布: pnpm publish'); + runCmd( + 'pnpm', + ['publish', '--registry', registry, '--no-git-checks'], + tmpDir + ); console.log('✅ 发布完成'); } catch (err) { @@ -250,7 +238,7 @@ async function main() { console.warn(`⚠️ 还原版本号失败: ${restoreErr.message}`); } } finally { - console.log('[8/7] 清理临时目录'); + console.log('[7/7] 清理临时目录'); try { if (fs.existsSync(tmpDir)) { fs.rmSync(tmpDir, { recursive: true, force: true }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 84f11b398..8d2b8c0a6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -132,6 +132,9 @@ importers: '@actiontech/cli-create-dms-page': specifier: workspace:^ version: link:scripts/cli/create-dms-page + '@actiontech/cli-dms-kit-publish': + specifier: workspace:^ + version: link:scripts/cli/dms-kit-publish '@cfaester/enzyme-adapter-react-18': specifier: ^0.7.0 version: 0.7.1(enzyme@3.11.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -260,7 +263,7 @@ importers: version: 3.0.5 msw: specifier: ^0.45.0 - version: 0.45.0(typescript@5.8.2) + version: 0.45.0(encoding@0.1.13)(typescript@5.8.2) postcss-less: specifier: ^6.0.0 version: 6.0.0(postcss@8.5.3) @@ -288,6 +291,9 @@ importers: ts-jest: specifier: 27.1.5 version: 27.1.5(@babel/core@7.26.10)(@types/jest@29.5.12)(babel-jest@29.7.0(@babel/core@7.26.10))(jest@29.1.2(@types/node@18.19.84)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@18.19.84)(typescript@5.8.2)))(typescript@5.8.2) + tsx: + specifier: ^4.20.5 + version: 4.20.5 typescript: specifier: ^5.0.2 version: 5.8.2 @@ -551,6 +557,50 @@ importers: specifier: ^7.20.6 version: 7.20.7 + scripts/cli/dms-kit-publish: + dependencies: + '@octokit/rest': + specifier: ^20.1.2 + version: 20.1.2 + archiver: + specifier: ^7.0.1 + version: 7.0.1 + basic-ftp: + specifier: ^5.0.5 + version: 5.0.5 + chalk: + specifier: ^4.1.2 + version: 4.1.2 + dotenv: + specifier: ^17.2.3 + version: 17.2.3 + execa: + specifier: ^8.0.1 + version: 8.0.1 + nodemailer: + specifier: ^7.0.10 + version: 7.0.10 + semver: + specifier: ^7.7.3 + version: 7.7.3 + devDependencies: + '@types/archiver': + specifier: ^6.0.3 + version: 6.0.4 + '@types/node': + specifier: ^18.0.4 + version: 18.19.84 + '@types/nodemailer': + specifier: ^7.0.3 + version: 7.0.3 + '@types/semver': + specifier: ^7.7.1 + version: 7.7.1 + + scripts/cli/dms-kit-publish/verdaccio/storage/data/@actiontech/dms-kit: {} + + scripts/cli/dms-kit-publish/verdaccio/storage/data/@actiontech/icons: {} + packages: '@adobe/css-tools@4.4.2': @@ -667,6 +717,131 @@ packages: '@antv/util@2.0.17': resolution: {integrity: sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q==} + '@aws-crypto/sha256-browser@5.2.0': + resolution: {integrity: sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==} + + '@aws-crypto/sha256-js@5.2.0': + resolution: {integrity: sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==} + engines: {node: '>=16.0.0'} + + '@aws-crypto/supports-web-crypto@5.2.0': + resolution: {integrity: sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==} + + '@aws-crypto/util@5.2.0': + resolution: {integrity: sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==} + + '@aws-sdk/client-sesv2@3.922.0': + resolution: {integrity: sha512-cowHCdzir4KmT/MoRyp2RV3BAebjcpiyKU1pidu2D1lI87iGXlxNG7KXJ0W8mjQoGpKa2XcihDY/mtqd/6uVlA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/client-sso@3.922.0': + resolution: {integrity: sha512-jdHs7uy7cSpiMvrxhYmqHyJxgK7hyqw4plG8OQ4YTBpq0SbfAxdoOuOkwJ1IVUUQho4otR1xYYjiX/8e8J8qwQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/core@3.922.0': + resolution: {integrity: sha512-EvfP4cqJfpO3L2v5vkIlTkMesPtRwWlMfsaW6Tpfm7iYfBOuTi6jx60pMDMTyJNVfh6cGmXwh/kj1jQdR+w99Q==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-env@3.922.0': + resolution: {integrity: sha512-WikGQpKkROJSK3D3E7odPjZ8tU7WJp5/TgGdRuZw3izsHUeH48xMv6IznafpRTmvHcjAbDQj4U3CJZNAzOK/OQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-http@3.922.0': + resolution: {integrity: sha512-i72DgHMK7ydAEqdzU0Duqh60Q8W59EZmRJ73y0Y5oFmNOqnYsAI+UXyOoCsubp+Dkr6+yOwAn1gPt1XGE9Aowg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-ini@3.922.0': + resolution: {integrity: sha512-bVF+pI5UCLNkvbiZr/t2fgTtv84s8FCdOGAPxQiQcw5qOZywNuuCCY3wIIchmQr6GJr8YFkEp5LgDCac5EC5aQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-node@3.922.0': + resolution: {integrity: sha512-agCwaD6mBihToHkjycL8ObIS2XOnWypWZZWhJSoWyHwFrhEKz1zGvgylK9Dc711oUfU+zU6J8e0JPKNJMNb3BQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-process@3.922.0': + resolution: {integrity: sha512-1DZOYezT6okslpvMW7oA2q+y17CJd4fxjNFH0jtThfswdh9CtG62+wxenqO+NExttq0UMaKisrkZiVrYQBTShw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-sso@3.922.0': + resolution: {integrity: sha512-nbD3G3hShTYxLCkKMqLkLPtKwAAfxdY/k9jHtZmVBFXek2T6tQrqZHKxlAu+fd23Ga4/Aik7DLQQx1RA1a5ipg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/credential-provider-web-identity@3.922.0': + resolution: {integrity: sha512-wjGIhgMHGGQfQTdFaJphNOKyAL8wZs6znJdHADPVURmgR+EWLyN/0fDO1u7wx8xaLMZpbHIFWBEvf9TritR/cQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-host-header@3.922.0': + resolution: {integrity: sha512-HPquFgBnq/KqKRVkiuCt97PmWbKtxQ5iUNLEc6FIviqOoZTmaYG3EDsIbuFBz9C4RHJU4FKLmHL2bL3FEId6AA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-logger@3.922.0': + resolution: {integrity: sha512-AkvYO6b80FBm5/kk2E636zNNcNgjztNNUxpqVx+huyGn9ZqGTzS4kLqW2hO6CBe5APzVtPCtiQsXL24nzuOlAg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-recursion-detection@3.922.0': + resolution: {integrity: sha512-TtSCEDonV/9R0VhVlCpxZbp/9sxQvTTRKzIf8LxW3uXpby6Wl8IxEciBJlxmSkoqxh542WRcko7NYODlvL/gDA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-sdk-s3@3.922.0': + resolution: {integrity: sha512-ygg8lME1oFAbsH42ed2wtGqfHLoT5irgx6VC4X98j79fV1qXEwwwbqMsAiMQ/HJehpjqAFRVsHox3MHLN48Z5A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/middleware-user-agent@3.922.0': + resolution: {integrity: sha512-N4Qx/9KP3oVQBJOrSghhz8iZFtUC2NNeSZt88hpPhbqAEAtuX8aD8OzVcpnAtrwWqy82Yd2YTxlkqMGkgqnBsQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/nested-clients@3.922.0': + resolution: {integrity: sha512-uYvKCF1TGh/MuJ4TMqmUM0Csuao02HawcseG4LUDyxdUsd/EFuxalWq1Cx4fKZQ2K8F504efZBjctMAMNY+l7A==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/region-config-resolver@3.922.0': + resolution: {integrity: sha512-44Y/rNNwhngR2KHp6gkx//TOr56/hx6s4l+XLjOqH7EBCHL7XhnrT1y92L+DLiroVr1tCSmO8eHQwBv0Y2+mvw==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/signature-v4-multi-region@3.922.0': + resolution: {integrity: sha512-mmsgEEL5pE+A7gFYiJMDBCLVciaXq4EFI5iAP7bPpnHvOplnNOYxVy2IreKMllGvrfjVyLnwxzZYlo5zZ65FWg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/token-providers@3.922.0': + resolution: {integrity: sha512-/inmPnjZE0ZBE16zaCowAvouSx05FJ7p6BQYuzlJ8vxEU0sS0Hf8fvhuiRnN9V9eDUPIBY+/5EjbMWygXL4wlQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/types@3.922.0': + resolution: {integrity: sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-arn-parser@3.893.0': + resolution: {integrity: sha512-u8H4f2Zsi19DGnwj5FSZzDMhytYF/bCh37vAtBsn3cNDL3YG578X5oc+wSX54pM3tOxS+NY7tvOAo52SW7koUA==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-endpoints@3.922.0': + resolution: {integrity: sha512-4ZdQCSuNMY8HMlR1YN4MRDdXuKd+uQTeKIr5/pIM+g3TjInZoj8imvXudjcrFGA63UF3t92YVTkBq88mg58RXQ==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-locate-window@3.893.0': + resolution: {integrity: sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==} + engines: {node: '>=18.0.0'} + + '@aws-sdk/util-user-agent-browser@3.922.0': + resolution: {integrity: sha512-qOJAERZ3Plj1st7M4Q5henl5FRpE30uLm6L9edZqZXGR6c7ry9jzexWamWVpQ4H4xVAVmiO9dIEBAfbq4mduOA==} + + '@aws-sdk/util-user-agent-node@3.922.0': + resolution: {integrity: sha512-NrPe/Rsr5kcGunkog0eBV+bY0inkRELsD2SacC4lQZvZiXf8VJ2Y7j+Yq1tB+h+FPLsdt3v9wItIvDf/laAm0Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + aws-crt: '>=1.0.0' + peerDependenciesMeta: + aws-crt: + optional: true + + '@aws-sdk/xml-builder@3.921.0': + resolution: {integrity: sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q==} + engines: {node: '>=18.0.0'} + + '@aws/lambda-invoke-store@0.1.1': + resolution: {integrity: sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==} + engines: {node: '>=18.0.0'} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -675,10 +850,6 @@ packages: resolution: {integrity: sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==} engines: {node: '>=6.9.0'} - '@babel/core@7.23.6': - resolution: {integrity: sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==} - engines: {node: '>=6.9.0'} - '@babel/core@7.26.10': resolution: {integrity: sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==} engines: {node: '>=6.9.0'} @@ -2883,6 +3054,58 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@octokit/auth-token@4.0.0': + resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} + engines: {node: '>= 18'} + + '@octokit/core@5.2.2': + resolution: {integrity: sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==} + engines: {node: '>= 18'} + + '@octokit/endpoint@9.0.6': + resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} + engines: {node: '>= 18'} + + '@octokit/graphql@7.1.1': + resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@24.2.0': + resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} + + '@octokit/plugin-paginate-rest@11.4.4-cjs.2': + resolution: {integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-request-log@4.0.1': + resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '5' + + '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1': + resolution: {integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^5 + + '@octokit/request-error@5.1.1': + resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} + engines: {node: '>= 18'} + + '@octokit/request@8.4.1': + resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} + engines: {node: '>= 18'} + + '@octokit/rest@20.1.2': + resolution: {integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==} + engines: {node: '>= 18'} + + '@octokit/types@13.10.0': + resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} + '@open-draft/until@1.0.3': resolution: {integrity: sha512-Aq58f5HiWdyDlFffbbSjAlv596h/cOnt2DO1w3DOC7OJ5EHs0hd/nycJfiu9RJbT6Yk6F1knnRRXNSpxoIVZ9Q==} @@ -3224,6 +3447,178 @@ packages: '@sketch-hq/sketch-file-format-ts@6.5.0': resolution: {integrity: sha512-shaGl4ttFDpHjYBoMaZpciOtsi/lKvJ3VfcBYk6+PjjbFs6H5GxPAyhbiSqy3Vmx30aos284pd88QzD3rE6iag==} + '@smithy/abort-controller@4.2.4': + resolution: {integrity: sha512-Z4DUr/AkgyFf1bOThW2HwzREagee0sB5ycl+hDiSZOfRLW8ZgrOjDi6g8mHH19yyU5E2A/64W3z6SMIf5XiUSQ==} + engines: {node: '>=18.0.0'} + + '@smithy/config-resolver@4.4.1': + resolution: {integrity: sha512-BciDJ5hkyYEGBBKMbjGB1A/Zq8bYZ41Zo9BMnGdKF6QD1fY4zIkYx6zui/0CHaVGnv6h0iy8y4rnPX9CPCAPyQ==} + engines: {node: '>=18.0.0'} + + '@smithy/core@3.17.2': + resolution: {integrity: sha512-n3g4Nl1Te+qGPDbNFAYf+smkRVB+JhFsGy9uJXXZQEufoP4u0r+WLh6KvTDolCswaagysDc/afS1yvb2jnj1gQ==} + engines: {node: '>=18.0.0'} + + '@smithy/credential-provider-imds@4.2.4': + resolution: {integrity: sha512-YVNMjhdz2pVto5bRdux7GMs0x1m0Afz3OcQy/4Yf9DH4fWOtroGH7uLvs7ZmDyoBJzLdegtIPpXrpJOZWvUXdw==} + engines: {node: '>=18.0.0'} + + '@smithy/fetch-http-handler@5.3.5': + resolution: {integrity: sha512-mg83SM3FLI8Sa2ooTJbsh5MFfyMTyNRwxqpKHmE0ICRIa66Aodv80DMsTQI02xBLVJ0hckwqTRr5IGAbbWuFLQ==} + engines: {node: '>=18.0.0'} + + '@smithy/hash-node@4.2.4': + resolution: {integrity: sha512-kKU0gVhx/ppVMntvUOZE7WRMFW86HuaxLwvqileBEjL7PoILI8/djoILw3gPQloGVE6O0oOzqafxeNi2KbnUJw==} + engines: {node: '>=18.0.0'} + + '@smithy/invalid-dependency@4.2.4': + resolution: {integrity: sha512-z6aDLGiHzsMhbS2MjetlIWopWz//K+mCoPXjW6aLr0mypF+Y7qdEh5TyJ20Onf9FbWHiWl4eC+rITdizpnXqOw==} + engines: {node: '>=18.0.0'} + + '@smithy/is-array-buffer@2.2.0': + resolution: {integrity: sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==} + engines: {node: '>=14.0.0'} + + '@smithy/is-array-buffer@4.2.0': + resolution: {integrity: sha512-DZZZBvC7sjcYh4MazJSGiWMI2L7E0oCiRHREDzIxi/M2LY79/21iXt6aPLHge82wi5LsuRF5A06Ds3+0mlh6CQ==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-content-length@4.2.4': + resolution: {integrity: sha512-hJRZuFS9UsElX4DJSJfoX4M1qXRH+VFiLMUnhsWvtOOUWRNvvOfDaUSdlNbjwv1IkpVjj/Rd/O59Jl3nhAcxow==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-endpoint@4.3.6': + resolution: {integrity: sha512-PXehXofGMFpDqr933rxD8RGOcZ0QBAWtuzTgYRAHAL2BnKawHDEdf/TnGpcmfPJGwonhginaaeJIKluEojiF/w==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-retry@4.4.6': + resolution: {integrity: sha512-OhLx131znrEDxZPAvH/OYufR9d1nB2CQADyYFN4C3V/NQS7Mg4V6uvxHC/Dr96ZQW8IlHJTJ+vAhKt6oxWRndA==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-serde@4.2.4': + resolution: {integrity: sha512-jUr3x2CDhV15TOX2/Uoz4gfgeqLrRoTQbYAuhLS7lcVKNev7FeYSJ1ebEfjk+l9kbb7k7LfzIR/irgxys5ZTOg==} + engines: {node: '>=18.0.0'} + + '@smithy/middleware-stack@4.2.4': + resolution: {integrity: sha512-Gy3TKCOnm9JwpFooldwAboazw+EFYlC+Bb+1QBsSi5xI0W5lX81j/P5+CXvD/9ZjtYKRgxq+kkqd/KOHflzvgA==} + engines: {node: '>=18.0.0'} + + '@smithy/node-config-provider@4.3.4': + resolution: {integrity: sha512-3X3w7qzmo4XNNdPKNS4nbJcGSwiEMsNsRSunMA92S4DJLLIrH5g1AyuOA2XKM9PAPi8mIWfqC+fnfKNsI4KvHw==} + engines: {node: '>=18.0.0'} + + '@smithy/node-http-handler@4.4.4': + resolution: {integrity: sha512-VXHGfzCXLZeKnFp6QXjAdy+U8JF9etfpUXD1FAbzY1GzsFJiDQRQIt2CnMUvUdz3/YaHNqT3RphVWMUpXTIODA==} + engines: {node: '>=18.0.0'} + + '@smithy/property-provider@4.2.4': + resolution: {integrity: sha512-g2DHo08IhxV5GdY3Cpt/jr0mkTlAD39EJKN27Jb5N8Fb5qt8KG39wVKTXiTRCmHHou7lbXR8nKVU14/aRUf86w==} + engines: {node: '>=18.0.0'} + + '@smithy/protocol-http@5.3.4': + resolution: {integrity: sha512-3sfFd2MAzVt0Q/klOmjFi3oIkxczHs0avbwrfn1aBqtc23WqQSmjvk77MBw9WkEQcwbOYIX5/2z4ULj8DuxSsw==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-builder@4.2.4': + resolution: {integrity: sha512-KQ1gFXXC+WsbPFnk7pzskzOpn4s+KheWgO3dzkIEmnb6NskAIGp/dGdbKisTPJdtov28qNDohQrgDUKzXZBLig==} + engines: {node: '>=18.0.0'} + + '@smithy/querystring-parser@4.2.4': + resolution: {integrity: sha512-aHb5cqXZocdzEkZ/CvhVjdw5l4r1aU/9iMEyoKzH4eXMowT6M0YjBpp7W/+XjkBnY8Xh0kVd55GKjnPKlCwinQ==} + engines: {node: '>=18.0.0'} + + '@smithy/service-error-classification@4.2.4': + resolution: {integrity: sha512-fdWuhEx4+jHLGeew9/IvqVU/fxT/ot70tpRGuOLxE3HzZOyKeTQfYeV1oaBXpzi93WOk668hjMuuagJ2/Qs7ng==} + engines: {node: '>=18.0.0'} + + '@smithy/shared-ini-file-loader@4.3.4': + resolution: {integrity: sha512-y5ozxeQ9omVjbnJo9dtTsdXj9BEvGx2X8xvRgKnV+/7wLBuYJQL6dOa/qMY6omyHi7yjt1OA97jZLoVRYi8lxA==} + engines: {node: '>=18.0.0'} + + '@smithy/signature-v4@5.3.4': + resolution: {integrity: sha512-ScDCpasxH7w1HXHYbtk3jcivjvdA1VICyAdgvVqKhKKwxi+MTwZEqFw0minE+oZ7F07oF25xh4FGJxgqgShz0A==} + engines: {node: '>=18.0.0'} + + '@smithy/smithy-client@4.9.2': + resolution: {integrity: sha512-gZU4uAFcdrSi3io8U99Qs/FvVdRxPvIMToi+MFfsy/DN9UqtknJ1ais+2M9yR8e0ASQpNmFYEKeIKVcMjQg3rg==} + engines: {node: '>=18.0.0'} + + '@smithy/types@4.8.1': + resolution: {integrity: sha512-N0Zn0OT1zc+NA+UVfkYqQzviRh5ucWwO7mBV3TmHHprMnfcJNfhlPicDkBHi0ewbh+y3evR6cNAW0Raxvb01NA==} + engines: {node: '>=18.0.0'} + + '@smithy/url-parser@4.2.4': + resolution: {integrity: sha512-w/N/Iw0/PTwJ36PDqU9PzAwVElo4qXxCC0eCTlUtIz/Z5V/2j/cViMHi0hPukSBHp4DVwvUlUhLgCzqSJ6plrg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-base64@4.3.0': + resolution: {integrity: sha512-GkXZ59JfyxsIwNTWFnjmFEI8kZpRNIBfxKjv09+nkAWPt/4aGaEWMM04m4sxgNVWkbt2MdSvE3KF/PfX4nFedQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-browser@4.2.0': + resolution: {integrity: sha512-Fkoh/I76szMKJnBXWPdFkQJl2r9SjPt3cMzLdOB6eJ4Pnpas8hVoWPYemX/peO0yrrvldgCUVJqOAjUrOLjbxg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-body-length-node@4.2.1': + resolution: {integrity: sha512-h53dz/pISVrVrfxV1iqXlx5pRg3V2YWFcSQyPyXZRrZoZj4R4DeWRDo1a7dd3CPTcFi3kE+98tuNyD2axyZReA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-buffer-from@2.2.0': + resolution: {integrity: sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==} + engines: {node: '>=14.0.0'} + + '@smithy/util-buffer-from@4.2.0': + resolution: {integrity: sha512-kAY9hTKulTNevM2nlRtxAG2FQ3B2OR6QIrPY3zE5LqJy1oxzmgBGsHLWTcNhWXKchgA0WHW+mZkQrng/pgcCew==} + engines: {node: '>=18.0.0'} + + '@smithy/util-config-provider@4.2.0': + resolution: {integrity: sha512-YEjpl6XJ36FTKmD+kRJJWYvrHeUvm5ykaUS5xK+6oXffQPHeEM4/nXlZPe+Wu0lsgRUcNZiliYNh/y7q9c2y6Q==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-browser@4.3.5': + resolution: {integrity: sha512-GwaGjv/QLuL/QHQaqhf/maM7+MnRFQQs7Bsl6FlaeK6lm6U7mV5AAnVabw68cIoMl5FQFyKK62u7RWRzWL25OQ==} + engines: {node: '>=18.0.0'} + + '@smithy/util-defaults-mode-node@4.2.7': + resolution: {integrity: sha512-6hinjVqec0WYGsqN7h9hL/ywfULmJJNXGXnNZW7jrIn/cFuC/aVlVaiDfBIJEvKcOrmN8/EgsW69eY0gXABeHw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-endpoints@3.2.4': + resolution: {integrity: sha512-f+nBDhgYRCmUEDKEQb6q0aCcOTXRDqH5wWaFHJxt4anB4pKHlgGoYP3xtioKXH64e37ANUkzWf6p4Mnv1M5/Vg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-hex-encoding@4.2.0': + resolution: {integrity: sha512-CCQBwJIvXMLKxVbO88IukazJD9a4kQ9ZN7/UMGBjBcJYvatpWk+9g870El4cB8/EJxfe+k+y0GmR9CAzkF+Nbw==} + engines: {node: '>=18.0.0'} + + '@smithy/util-middleware@4.2.4': + resolution: {integrity: sha512-fKGQAPAn8sgV0plRikRVo6g6aR0KyKvgzNrPuM74RZKy/wWVzx3BMk+ZWEueyN3L5v5EDg+P582mKU+sH5OAsg==} + engines: {node: '>=18.0.0'} + + '@smithy/util-retry@4.2.4': + resolution: {integrity: sha512-yQncJmj4dtv/isTXxRb4AamZHy4QFr4ew8GxS6XLWt7sCIxkPxPzINWd7WLISEFPsIan14zrKgvyAF+/yzfwoA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-stream@4.5.5': + resolution: {integrity: sha512-7M5aVFjT+HPilPOKbOmQfCIPchZe4DSBc1wf1+NvHvSoFTiFtauZzT+onZvCj70xhXd0AEmYnZYmdJIuwxOo4w==} + engines: {node: '>=18.0.0'} + + '@smithy/util-uri-escape@4.2.0': + resolution: {integrity: sha512-igZpCKV9+E/Mzrpq6YacdTQ0qTiLm85gD6N/IrmyDvQFA4UnU3d5g3m8tMT/6zG/vVkWSU+VxeUyGonL62DuxA==} + engines: {node: '>=18.0.0'} + + '@smithy/util-utf8@2.3.0': + resolution: {integrity: sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==} + engines: {node: '>=14.0.0'} + + '@smithy/util-utf8@4.2.0': + resolution: {integrity: sha512-zBPfuzoI8xyBtR2P6WQj63Rz8i3AmfAaJLuNG8dWsfvPe8lO4aCPYLn879mEgHndZH1zQ2oXmG8O1GGzzaoZiw==} + engines: {node: '>=18.0.0'} + + '@smithy/uuid@1.1.0': + resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} + engines: {node: '>=18.0.0'} + '@stackblitz/sdk@1.11.0': resolution: {integrity: sha512-DFQGANNkEZRzFk1/rDP6TcFdM82ycHE+zfl9C/M/jXlH68jiqHWHFMQURLELoD8koxvu/eW5uhg94NSAZlYrUQ==} @@ -3539,6 +3934,9 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@types/archiver@6.0.4': + resolution: {integrity: sha512-ULdQpARQ3sz9WH4nb98mJDYA0ft2A8C4f4fovvUcFwINa1cgGjY36JCAYuP5YypRq4mco1lJp1/7jEMS2oR0Hg==} + '@types/argparse@1.0.38': resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} @@ -3683,6 +4081,9 @@ packages: '@types/node@22.13.14': resolution: {integrity: sha512-Zs/Ollc1SJ8nKUAgc7ivOEdIBM8JAKgrqqUYi2J997JuKO7/tpQC+WCetQ1sypiKCQWHdvdg9wBNpUPEWZae7w==} + '@types/nodemailer@7.0.3': + resolution: {integrity: sha512-fC8w49YQ868IuPWRXqPfLf+MuTRex5Z1qxMoG8rr70riqqbOp2F5xgOKE9fODEBPzpnvjkJXFgK6IL2xgMSTnA==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3726,14 +4127,17 @@ packages: '@types/react@18.3.23': resolution: {integrity: sha512-/LDXMQh55EzZQ0uVAZmKKhfENivEvWz6E+EYzh+/MCjMhNsotd+ZHhBGIjFDTi6+fz0OhQQQLbTgdQIxxCsC0w==} + '@types/readdir-glob@1.1.5': + resolution: {integrity: sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg==} + '@types/resolve@1.20.6': resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} '@types/sax@1.2.7': resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - '@types/semver@7.7.0': - resolution: {integrity: sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA==} + '@types/semver@7.7.1': + resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} '@types/set-cookie-parser@2.4.10': resolution: {integrity: sha512-GGmQVGpQWUe5qglJozEjZV/5dyxbOOZ0LHe/lqyWssB88Y4svNfst0uqBVscdDeIKl5Jy5+aPSvy7mI9tYRguw==} @@ -4198,6 +4602,10 @@ packages: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + accepts@1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -4335,6 +4743,14 @@ packages: arch@2.2.0: resolution: {integrity: sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==} + archiver-utils@5.0.2: + resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} + engines: {node: '>= 14'} + + archiver@7.0.1: + resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} + engines: {node: '>= 14'} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -4465,6 +4881,14 @@ packages: axios@0.27.2: resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + b4a@1.7.3: + resolution: {integrity: sha512-5Q2mfq2WfGuFp3uS//0s6baOJLMoVduPYVeNmDYxu5OUA1/cBfvr2RIS7vi62LdNj/urk1hfmj867I3qt6uZ7Q==} + peerDependencies: + react-native-b4a: '*' + peerDependenciesMeta: + react-native-b4a: + optional: true + babel-jest@29.7.0: resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4546,12 +4970,27 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + bare-events@2.8.1: + resolution: {integrity: sha512-oxSAxTS1hRfnyit2CL5QpAOS5ixfBjj6ex3yTNvXyY/kE719jQ/IjuESJBK2w5v4wwQRAHGseVJXx9QBYOtFGQ==} + peerDependencies: + bare-abort-controller: '*' + peerDependenciesMeta: + bare-abort-controller: + optional: true + base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -4586,6 +5025,9 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bowser@2.12.1: + resolution: {integrity: sha512-z4rE2Gxh7tvshQ4hluIT7XcFrgLIQaw9X3A+kTTRdovCz5PMukm/0QC/BKSYPj3omF5Qfypn9O/c5kgpmvYUCw==} + bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -4635,6 +5077,10 @@ packages: bser@2.1.1: resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + buffer-crc32@1.0.0: + resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} + engines: {node: '>=8.0.0'} + buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -4650,6 +5096,9 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} @@ -4940,6 +5389,10 @@ packages: common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + compress-commons@6.0.2: + resolution: {integrity: sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==} + engines: {node: '>= 14'} + compressible@2.0.18: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} @@ -5046,6 +5499,15 @@ packages: typescript: optional: true + crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + + crc32-stream@6.0.0: + resolution: {integrity: sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==} + engines: {node: '>= 14'} + create-ecdh@4.0.4: resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==} @@ -5403,6 +5865,9 @@ packages: resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} engines: {node: '>= 0.8'} + deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -5543,6 +6008,10 @@ packages: resolution: {integrity: sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==} engines: {node: '>=12'} + dotenv@17.2.3: + resolution: {integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==} + engines: {node: '>=12'} + dotignore@0.1.2: resolution: {integrity: sha512-UGGGWfSauusaVJC+8fgV+NVvBXkCTmVv7sk6nojDZZvuOUNGUy0Zk4UpHQD6EDjS0jpBwcACvH4eofvyzBcRDw==} hasBin: true @@ -5610,6 +6079,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -5926,6 +6398,10 @@ packages: resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} engines: {node: '>= 0.6'} + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + eventemitter3@2.0.3: resolution: {integrity: sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==} @@ -5933,6 +6409,9 @@ packages: resolution: {integrity: sha512-6iR7z9hAJEwrT+D2Ywg6Fx62HSmN86OlcvPdrnq1JBeFr30dMF6l+j7M3VabjHfIi2KMtF8rO0J1rIZEfwMAwg==} engines: {node: '>=0.8.x'} + events-universal@1.0.1: + resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} + events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -5948,6 +6427,10 @@ packages: resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -5980,6 +6463,9 @@ packages: fast-equals@4.0.3: resolution: {integrity: sha512-G3BSX9cfKttjr+2o1O22tYMLq0DPluZnYtq1rXumE1SpL/F/SLIfHx08WYQoWSIpeMYf8sRbJ8++71+v6Pnxfg==} + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + fast-glob@3.2.12: resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} engines: {node: '>=8.6.0'} @@ -6001,6 +6487,10 @@ packages: fast-uri@3.0.6: resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} + fast-xml-parser@5.2.5: + resolution: {integrity: sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==} + hasBin: true + fastest-levenshtein@1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} @@ -6215,6 +6705,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -6590,6 +7084,10 @@ packages: resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} engines: {node: '>=14.18.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + hyphenate-style-name@1.1.0: resolution: {integrity: sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==} @@ -7304,6 +7802,10 @@ packages: resolution: {integrity: sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==} engines: {node: '>=0.10.0'} + lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + leac@0.6.0: resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} @@ -7931,6 +8433,10 @@ packages: node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nodemailer@7.0.10: + resolution: {integrity: sha512-Us/Se1WtT0ylXgNFfyFSx4LElllVLJXQjWi2Xz17xWw7amDKO2MLtFnVp1WACy7GkVGs+oBlRopVNUzlrGSw1w==} + engines: {node: '>=6.0.0'} + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -9241,6 +9747,13 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} + readable-stream@4.7.0: + resolution: {integrity: sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -9607,8 +10120,8 @@ packages: engines: {node: '>=10'} hasBin: true - semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} engines: {node: '>=10'} hasBin: true @@ -9838,6 +10351,9 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + streamx@2.23.0: + resolution: {integrity: sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==} + strict-event-emitter@0.2.8: resolution: {integrity: sha512-KDf/ujU8Zud3YaLtMCcTI4xkZlZVIYxTLr+XIULexP+77EEVWixeXroLUXQXiVtH4XH2W7jr/3PT1v3zBuvc3A==} @@ -9939,6 +10455,9 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + strnum@2.1.1: + resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + style-search@0.1.0: resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} @@ -10113,6 +10632,9 @@ packages: resolution: {integrity: sha512-KCuXjYxCZ3ru40dmND+oCLsXyuA8hoseu2SS404Px5ouyS0A99v8X/mdiLqsR5MTAyamMBN7PRwt2Dv3+xGIxw==} hasBin: true + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + terser-webpack-plugin@5.3.14: resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} @@ -10138,6 +10660,9 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + text-decoder@1.2.3: + resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} + textextensions@2.6.0: resolution: {integrity: sha512-49WtAWS+tcsy93dRt6P0P3AMD2m5PvXRhuEA0kaXos5ZLlujtYmpmFsB+QvWUSxE1ZsstmYXfQ7L40+EcQgpAQ==} engines: {node: '>=0.8'} @@ -10503,6 +11028,9 @@ packages: unist-util-visit@5.0.0: resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + universal-user-agent@6.0.1: + resolution: {integrity: sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -10938,6 +11466,10 @@ packages: engines: {node: '>=8.0.0'} hasBin: true + zip-stream@6.0.1: + resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} + engines: {node: '>= 14'} + zod-validation-error@2.1.0: resolution: {integrity: sha512-VJh93e2wb4c3tWtGgTa0OF/dTt/zoPCPzXq4V11ZjxmEAFaPi/Zss1xIZdEB5RD8GD00U0/iVXgqkF77RV7pdQ==} engines: {node: '>=18.0.0'} @@ -11193,33 +11725,397 @@ snapshots: csstype: 3.1.3 tslib: 2.8.1 - '@babel/code-frame@7.26.2': + '@aws-crypto/sha256-browser@5.2.0': dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-crypto/supports-web-crypto': 5.2.0 + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-locate-window': 3.893.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 - '@babel/compat-data@7.26.8': {} + '@aws-crypto/sha256-js@5.2.0': + dependencies: + '@aws-crypto/util': 5.2.0 + '@aws-sdk/types': 3.922.0 + tslib: 2.8.1 - '@babel/core@7.23.6': + '@aws-crypto/supports-web-crypto@5.2.0': dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.27.0 - '@babel/helper-compilation-targets': 7.27.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.23.6) - '@babel/helpers': 7.27.0 - '@babel/parser': 7.27.0 - '@babel/template': 7.27.0 - '@babel/traverse': 7.27.0 - '@babel/types': 7.27.0 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 + tslib: 2.8.1 + + '@aws-crypto/util@5.2.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@smithy/util-utf8': 2.3.0 + tslib: 2.8.1 + + '@aws-sdk/client-sesv2@3.922.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/credential-provider-node': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/signature-v4-multi-region': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 transitivePeerDependencies: - - supports-color + - aws-crt + + '@aws-sdk/client-sso@3.922.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/core@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@aws-sdk/xml-builder': 3.921.0 + '@smithy/core': 3.17.2 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-env@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-http@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/node-http-handler': 4.4.4 + '@smithy/property-provider': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-stream': 4.5.5 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-ini@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/credential-provider-env': 3.922.0 + '@aws-sdk/credential-provider-http': 3.922.0 + '@aws-sdk/credential-provider-process': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.922.0 + '@aws-sdk/credential-provider-web-identity': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-node@3.922.0': + dependencies: + '@aws-sdk/credential-provider-env': 3.922.0 + '@aws-sdk/credential-provider-http': 3.922.0 + '@aws-sdk/credential-provider-ini': 3.922.0 + '@aws-sdk/credential-provider-process': 3.922.0 + '@aws-sdk/credential-provider-sso': 3.922.0 + '@aws-sdk/credential-provider-web-identity': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-process@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/credential-provider-sso@3.922.0': + dependencies: + '@aws-sdk/client-sso': 3.922.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/token-providers': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/credential-provider-web-identity@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/middleware-host-header@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-logger@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-recursion-detection@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@aws/lambda-invoke-store': 0.1.1 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/middleware-sdk-s3@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-arn-parser': 3.893.0 + '@smithy/core': 3.17.2 + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@aws-sdk/middleware-user-agent@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@smithy/core': 3.17.2 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/nested-clients@3.922.0': + dependencies: + '@aws-crypto/sha256-browser': 5.2.0 + '@aws-crypto/sha256-js': 5.2.0 + '@aws-sdk/core': 3.922.0 + '@aws-sdk/middleware-host-header': 3.922.0 + '@aws-sdk/middleware-logger': 3.922.0 + '@aws-sdk/middleware-recursion-detection': 3.922.0 + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/region-config-resolver': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@aws-sdk/util-endpoints': 3.922.0 + '@aws-sdk/util-user-agent-browser': 3.922.0 + '@aws-sdk/util-user-agent-node': 3.922.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/core': 3.17.2 + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/hash-node': 4.2.4 + '@smithy/invalid-dependency': 4.2.4 + '@smithy/middleware-content-length': 4.2.4 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-retry': 4.4.6 + '@smithy/middleware-serde': 4.2.4 + '@smithy/middleware-stack': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/node-http-handler': 4.4.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-body-length-node': 4.2.1 + '@smithy/util-defaults-mode-browser': 4.3.5 + '@smithy/util-defaults-mode-node': 4.2.7 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/region-config-resolver@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@smithy/config-resolver': 4.4.1 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/signature-v4-multi-region@3.922.0': + dependencies: + '@aws-sdk/middleware-sdk-s3': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/signature-v4': 5.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/token-providers@3.922.0': + dependencies: + '@aws-sdk/core': 3.922.0 + '@aws-sdk/nested-clients': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + transitivePeerDependencies: + - aws-crt + + '@aws-sdk/types@3.922.0': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/util-arn-parser@3.893.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-endpoints@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-endpoints': 3.2.4 + tslib: 2.8.1 + + '@aws-sdk/util-locate-window@3.893.0': + dependencies: + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-browser@3.922.0': + dependencies: + '@aws-sdk/types': 3.922.0 + '@smithy/types': 4.8.1 + bowser: 2.12.1 + tslib: 2.8.1 + + '@aws-sdk/util-user-agent-node@3.922.0': + dependencies: + '@aws-sdk/middleware-user-agent': 3.922.0 + '@aws-sdk/types': 3.922.0 + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@aws-sdk/xml-builder@3.921.0': + dependencies: + '@smithy/types': 4.8.1 + fast-xml-parser: 5.2.5 + tslib: 2.8.1 + + '@aws/lambda-invoke-store@0.1.1': {} + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.8': {} '@babel/core@7.26.10': dependencies: @@ -11241,9 +12137,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/eslint-parser@7.23.3(@babel/core@7.23.6)(eslint@9.23.0)': + '@babel/eslint-parser@7.23.3(@babel/core@7.26.10)(eslint@9.23.0)': dependencies: - '@babel/core': 7.23.6 + '@babel/core': 7.26.10 '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 eslint: 9.23.0 eslint-visitor-keys: 2.1.0 @@ -11322,15 +12218,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.23.6)': - dependencies: - '@babel/core': 7.23.6 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.27.0 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -13569,6 +14456,69 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@octokit/auth-token@4.0.0': {} + + '@octokit/core@5.2.2': + dependencies: + '@octokit/auth-token': 4.0.0 + '@octokit/graphql': 7.1.1 + '@octokit/request': 8.4.1 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.1 + + '@octokit/endpoint@9.0.6': + dependencies: + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/graphql@7.1.1': + dependencies: + '@octokit/request': 8.4.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/openapi-types@24.2.0': {} + + '@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 13.10.0 + + '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + + '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.2)': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/types': 13.10.0 + + '@octokit/request-error@5.1.1': + dependencies: + '@octokit/types': 13.10.0 + deprecation: 2.3.1 + once: 1.4.0 + + '@octokit/request@8.4.1': + dependencies: + '@octokit/endpoint': 9.0.6 + '@octokit/request-error': 5.1.1 + '@octokit/types': 13.10.0 + universal-user-agent: 6.0.1 + + '@octokit/rest@20.1.2': + dependencies: + '@octokit/core': 5.2.2 + '@octokit/plugin-paginate-rest': 11.4.4-cjs.2(@octokit/core@5.2.2) + '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.2) + '@octokit/plugin-rest-endpoint-methods': 13.3.2-cjs.1(@octokit/core@5.2.2) + + '@octokit/types@13.10.0': + dependencies: + '@octokit/openapi-types': 24.2.0 + '@open-draft/until@1.0.3': {} '@parcel/watcher-android-arm64@2.5.1': @@ -13876,6 +14826,280 @@ snapshots: '@sketch-hq/sketch-file-format-ts@6.5.0': {} + '@smithy/abort-controller@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/config-resolver@4.4.1': + dependencies: + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-config-provider': 4.2.0 + '@smithy/util-endpoints': 3.2.4 + '@smithy/util-middleware': 4.2.4 + tslib: 2.8.1 + + '@smithy/core@3.17.2': + dependencies: + '@smithy/middleware-serde': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 + '@smithy/util-body-length-browser': 4.2.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-stream': 4.5.5 + '@smithy/util-utf8': 4.2.0 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/credential-provider-imds@4.2.4': + dependencies: + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + tslib: 2.8.1 + + '@smithy/fetch-http-handler@5.3.5': + dependencies: + '@smithy/protocol-http': 5.3.4 + '@smithy/querystring-builder': 4.2.4 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 + tslib: 2.8.1 + + '@smithy/hash-node@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/invalid-dependency@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/is-array-buffer@2.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/is-array-buffer@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/middleware-content-length@4.2.4': + dependencies: + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/middleware-endpoint@4.3.6': + dependencies: + '@smithy/core': 3.17.2 + '@smithy/middleware-serde': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + '@smithy/url-parser': 4.2.4 + '@smithy/util-middleware': 4.2.4 + tslib: 2.8.1 + + '@smithy/middleware-retry@4.4.6': + dependencies: + '@smithy/node-config-provider': 4.3.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/service-error-classification': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-retry': 4.2.4 + '@smithy/uuid': 1.1.0 + tslib: 2.8.1 + + '@smithy/middleware-serde@4.2.4': + dependencies: + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/middleware-stack@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/node-config-provider@4.3.4': + dependencies: + '@smithy/property-provider': 4.2.4 + '@smithy/shared-ini-file-loader': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/node-http-handler@4.4.4': + dependencies: + '@smithy/abort-controller': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/querystring-builder': 4.2.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/property-provider@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/protocol-http@5.3.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/querystring-builder@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + '@smithy/util-uri-escape': 4.2.0 + tslib: 2.8.1 + + '@smithy/querystring-parser@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/service-error-classification@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + + '@smithy/shared-ini-file-loader@4.3.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/signature-v4@5.3.4': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-middleware': 4.2.4 + '@smithy/util-uri-escape': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/smithy-client@4.9.2': + dependencies: + '@smithy/core': 3.17.2 + '@smithy/middleware-endpoint': 4.3.6 + '@smithy/middleware-stack': 4.2.4 + '@smithy/protocol-http': 5.3.4 + '@smithy/types': 4.8.1 + '@smithy/util-stream': 4.5.5 + tslib: 2.8.1 + + '@smithy/types@4.8.1': + dependencies: + tslib: 2.8.1 + + '@smithy/url-parser@4.2.4': + dependencies: + '@smithy/querystring-parser': 4.2.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/util-base64@4.3.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-body-length-browser@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-body-length-node@4.2.1': + dependencies: + tslib: 2.8.1 + + '@smithy/util-buffer-from@2.2.0': + dependencies: + '@smithy/is-array-buffer': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-buffer-from@4.2.0': + dependencies: + '@smithy/is-array-buffer': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-config-provider@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-defaults-mode-browser@4.3.5': + dependencies: + '@smithy/property-provider': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/util-defaults-mode-node@4.2.7': + dependencies: + '@smithy/config-resolver': 4.4.1 + '@smithy/credential-provider-imds': 4.2.4 + '@smithy/node-config-provider': 4.3.4 + '@smithy/property-provider': 4.2.4 + '@smithy/smithy-client': 4.9.2 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/util-endpoints@3.2.4': + dependencies: + '@smithy/node-config-provider': 4.3.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/util-hex-encoding@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-middleware@4.2.4': + dependencies: + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/util-retry@4.2.4': + dependencies: + '@smithy/service-error-classification': 4.2.4 + '@smithy/types': 4.8.1 + tslib: 2.8.1 + + '@smithy/util-stream@4.5.5': + dependencies: + '@smithy/fetch-http-handler': 5.3.5 + '@smithy/node-http-handler': 4.4.4 + '@smithy/types': 4.8.1 + '@smithy/util-base64': 4.3.0 + '@smithy/util-buffer-from': 4.2.0 + '@smithy/util-hex-encoding': 4.2.0 + '@smithy/util-utf8': 4.2.0 + tslib: 2.8.1 + + '@smithy/util-uri-escape@4.2.0': + dependencies: + tslib: 2.8.1 + + '@smithy/util-utf8@2.3.0': + dependencies: + '@smithy/util-buffer-from': 2.2.0 + tslib: 2.8.1 + + '@smithy/util-utf8@4.2.0': + dependencies: + '@smithy/util-buffer-from': 4.2.0 + tslib: 2.8.1 + + '@smithy/uuid@1.1.0': + dependencies: + tslib: 2.8.1 + '@stackblitz/sdk@1.11.0': {} '@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2(postcss-less@6.0.0(postcss@8.5.3))(postcss@8.5.3))(postcss@8.5.3)': @@ -14173,6 +15397,10 @@ snapshots: '@tsconfig/node16@1.0.4': optional: true + '@types/archiver@6.0.4': + dependencies: + '@types/readdir-glob': 1.1.5 + '@types/argparse@1.0.38': {} '@types/aria-query@5.0.4': {} @@ -14342,6 +15570,13 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/nodemailer@7.0.3': + dependencies: + '@aws-sdk/client-sesv2': 3.922.0 + '@types/node': 18.19.84 + transitivePeerDependencies: + - aws-crt + '@types/normalize-package-data@2.4.4': {} '@types/nprogress@0.2.3': {} @@ -14384,13 +15619,17 @@ snapshots: '@types/prop-types': 15.7.14 csstype: 3.1.3 + '@types/readdir-glob@1.1.5': + dependencies: + '@types/node': 18.19.84 + '@types/resolve@1.20.6': {} '@types/sax@1.2.7': dependencies: '@types/node': 18.19.84 - '@types/semver@7.7.0': {} + '@types/semver@7.7.1': {} '@types/set-cookie-parser@2.4.10': dependencies: @@ -14440,7 +15679,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 - semver: 7.7.1 + semver: 7.7.3 tsutils: 3.21.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 @@ -14459,7 +15698,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare-lite: 1.4.0 - semver: 7.7.1 + semver: 7.7.3 tsutils: 3.21.0(typescript@5.8.2) optionalDependencies: typescript: 5.8.2 @@ -14575,7 +15814,7 @@ snapshots: debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.1 + semver: 7.7.3 tsutils: 3.21.0(typescript@5.3.3) optionalDependencies: typescript: 5.3.3 @@ -14589,7 +15828,7 @@ snapshots: debug: 4.4.0 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.1 + semver: 7.7.3 tsutils: 3.21.0(typescript@5.8.2) optionalDependencies: typescript: 5.8.2 @@ -14604,7 +15843,7 @@ snapshots: fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.3 ts-api-utils: 2.1.0(typescript@5.8.2) typescript: 5.8.2 transitivePeerDependencies: @@ -14614,13 +15853,13 @@ snapshots: dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) eslint: 9.23.0 eslint-scope: 5.1.1 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript @@ -14629,13 +15868,13 @@ snapshots: dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0) '@types/json-schema': 7.0.15 - '@types/semver': 7.7.0 + '@types/semver': 7.7.1 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.8.2) eslint: 9.23.0 eslint-scope: 5.1.1 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color - typescript @@ -14897,8 +16136,8 @@ snapshots: '@umijs/lint@4.4.6(eslint@9.23.0)(jest@29.1.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@22.13.14)(typescript@5.3.3)))(postcss-less@6.0.0(postcss@8.5.3))(stylelint@15.11.0(typescript@5.3.3))(typescript@5.3.3)': dependencies: - '@babel/core': 7.23.6 - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@9.23.0) + '@babel/core': 7.26.10 + '@babel/eslint-parser': 7.23.3(@babel/core@7.26.10)(eslint@9.23.0) '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2(postcss-less@6.0.0(postcss@8.5.3))(postcss@8.5.3))(postcss@8.5.3) '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.3.3))(eslint@9.23.0)(typescript@5.3.3) '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.3.3) @@ -14923,8 +16162,8 @@ snapshots: '@umijs/lint@4.4.6(eslint@9.23.0)(jest@29.1.2(@types/node@22.13.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.9.2(@swc/helpers@0.5.1))(@types/node@22.13.14)(typescript@5.8.2)))(postcss-less@6.0.0(postcss@8.5.3))(stylelint@15.11.0(typescript@5.8.2))(typescript@5.8.2)': dependencies: - '@babel/core': 7.23.6 - '@babel/eslint-parser': 7.23.3(@babel/core@7.23.6)(eslint@9.23.0) + '@babel/core': 7.26.10 + '@babel/eslint-parser': 7.23.3(@babel/core@7.26.10)(eslint@9.23.0) '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2(postcss-less@6.0.0(postcss@8.5.3))(postcss@8.5.3))(postcss@8.5.3) '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0(eslint@9.23.0)(typescript@5.8.2))(eslint@9.23.0)(typescript@5.8.2) '@typescript-eslint/parser': 5.62.0(eslint@9.23.0)(typescript@5.8.2) @@ -14985,7 +16224,7 @@ snapshots: react-error-overlay: 6.0.9 react-refresh: 0.14.2 resolve: 1.22.10 - semver: 7.7.1 + semver: 7.7.3 yargs-parser: 21.1.1 optionalDependencies: '@umijs/mako-darwin-arm64': 0.11.5 @@ -15319,6 +16558,10 @@ snapshots: abab@2.0.6: {} + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + accepts@1.3.8: dependencies: mime-types: 2.1.35 @@ -15495,6 +16738,29 @@ snapshots: arch@2.2.0: {} + archiver-utils@5.0.2: + dependencies: + glob: 10.4.5 + graceful-fs: 4.2.11 + is-stream: 2.0.1 + lazystream: 1.0.1 + lodash: 4.17.21 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + + archiver@7.0.1: + dependencies: + archiver-utils: 5.0.2 + async: 3.2.6 + buffer-crc32: 1.0.0 + readable-stream: 4.7.0 + readdir-glob: 1.1.3 + tar-stream: 3.1.7 + zip-stream: 6.0.1 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + arg@4.1.3: optional: true @@ -15662,6 +16928,8 @@ snapshots: transitivePeerDependencies: - debug + b4a@1.7.3: {} + babel-jest@29.7.0(@babel/core@7.26.10): dependencies: '@babel/core': 7.26.10 @@ -15822,10 +17090,16 @@ snapshots: balanced-match@2.0.0: {} + bare-events@2.8.1: {} + base64-js@1.5.1: {} + basic-ftp@5.0.5: {} + bcp-47-match@2.0.3: {} + before-after-hook@2.2.3: {} + big-integer@1.6.52: {} big.js@5.2.2: {} @@ -15865,6 +17139,8 @@ snapshots: boolbase@1.0.0: {} + bowser@2.12.1: {} + bplist-parser@0.2.0: dependencies: big-integer: 1.6.52 @@ -15944,6 +17220,8 @@ snapshots: dependencies: node-int64: 0.4.0 + buffer-crc32@1.0.0: {} + buffer-from@1.1.2: {} buffer-okam@4.9.2: @@ -15965,6 +17243,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + builtin-status-codes@3.0.0: {} bundle-name@3.0.0: @@ -16245,6 +17528,14 @@ snapshots: common-path-prefix@3.0.0: {} + compress-commons@6.0.2: + dependencies: + crc-32: 1.2.2 + crc32-stream: 6.0.0 + is-stream: 2.0.1 + normalize-path: 3.0.0 + readable-stream: 4.7.0 + compressible@2.0.18: dependencies: mime-db: 1.54.0 @@ -16356,6 +17647,13 @@ snapshots: optionalDependencies: typescript: 5.8.2 + crc-32@1.2.2: {} + + crc32-stream@6.0.0: + dependencies: + crc-32: 1.2.2 + readable-stream: 4.7.0 + create-ecdh@4.0.4: dependencies: bn.js: 4.12.1 @@ -16480,7 +17778,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.5.3) postcss-modules-values: 4.0.0(postcss@8.5.3) postcss-value-parser: 4.2.0 - semver: 7.7.1 + semver: 7.7.3 webpack: 5.101.3(@swc/core@1.9.2(@swc/helpers@0.5.1)) css-prefers-color-scheme@6.0.3(postcss@8.5.3): @@ -16780,6 +18078,8 @@ snapshots: depd@2.0.0: {} + deprecation@2.3.1: {} + dequal@2.0.3: {} des.js@1.1.0: @@ -16918,6 +18218,8 @@ snapshots: dotenv@16.4.7: {} + dotenv@17.2.3: {} + dotignore@0.1.2: dependencies: minimatch: 3.1.2 @@ -17182,6 +18484,11 @@ snapshots: encodeurl@2.0.0: {} + encoding@0.1.13: + dependencies: + iconv-lite: 0.6.3 + optional: true + end-of-stream@1.4.4: dependencies: once: 1.4.0 @@ -17763,10 +19070,18 @@ snapshots: etag@1.8.1: {} + event-target-shim@5.0.1: {} + eventemitter3@2.0.3: {} events-okam@3.3.0: {} + events-universal@1.0.1: + dependencies: + bare-events: 2.8.1 + transitivePeerDependencies: + - bare-abort-controller + events@3.3.0: {} evp_bytestokey@1.0.3: @@ -17798,6 +19113,18 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 3.0.0 + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + exit@0.1.2: {} expect@29.7.0: @@ -17866,6 +19193,8 @@ snapshots: fast-equals@4.0.3: {} + fast-fifo@1.3.2: {} + fast-glob@3.2.12: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -17890,6 +19219,10 @@ snapshots: fast-uri@3.0.6: {} + fast-xml-parser@5.2.5: + dependencies: + strnum: 2.1.1 + fastest-levenshtein@1.0.16: {} fastq@1.19.1: @@ -18074,7 +19407,7 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.1 + semver: 7.7.3 tapable: 2.2.1 typescript: 5.3.3 webpack: 5.101.3(@swc/core@1.9.2(@swc/helpers@0.5.1)) @@ -18091,7 +19424,7 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.1 + semver: 7.7.3 tapable: 2.2.1 typescript: 5.8.2 webpack: 5.101.3(@swc/core@1.9.2(@swc/helpers@0.5.1)) @@ -18182,6 +19515,8 @@ snapshots: get-stream@6.0.1: {} + get-stream@8.0.1: {} + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -18707,6 +20042,8 @@ snapshots: human-signals@4.3.1: {} + human-signals@5.0.0: {} + hyphenate-style-name@1.1.0: {} i18next@21.10.0: @@ -19066,7 +20403,7 @@ snapshots: '@babel/parser': 7.27.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -19570,7 +20907,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.1 + semver: 7.7.3 transitivePeerDependencies: - supports-color @@ -19852,6 +21189,10 @@ snapshots: lazy-cache@1.0.4: {} + lazystream@1.0.1: + dependencies: + readable-stream: 2.3.8 + leac@0.6.0: {} less-plugin-resolve@1.0.2: @@ -20032,7 +21373,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.1 + semver: 7.7.3 make-error@1.3.6: {} @@ -20555,7 +21896,7 @@ snapshots: ms@2.1.3: {} - msw@0.45.0(typescript@5.8.2): + msw@0.45.0(encoding@0.1.13)(typescript@5.8.2): dependencies: '@mswjs/cookies': 0.2.2 '@mswjs/interceptors': 0.17.10 @@ -20569,7 +21910,7 @@ snapshots: inquirer: 8.2.6 is-node-process: 1.2.0 js-levenshtein: 1.1.6 - node-fetch: 2.7.0 + node-fetch: 2.7.0(encoding@0.1.13) outvariant: 1.4.3 path-to-regexp: 6.3.0 statuses: 2.0.1 @@ -20635,9 +21976,11 @@ snapshots: node-domexception@1.0.0: {} - node-fetch@2.7.0: + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 + optionalDependencies: + encoding: 0.1.13 node-fetch@3.3.2: dependencies: @@ -20706,6 +22049,8 @@ snapshots: node-releases@2.0.19: {} + nodemailer@7.0.10: {} + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -20717,7 +22062,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.1 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} @@ -22186,6 +23531,18 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 + readable-stream@4.7.0: + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + readdir-glob@1.1.3: + dependencies: + minimatch: 5.1.6 + readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -22644,7 +24001,7 @@ snapshots: dependencies: lru-cache: 6.0.0 - semver@7.7.1: {} + semver@7.7.3: {} send@0.19.0: dependencies: @@ -22922,6 +24279,15 @@ snapshots: stream-shift@1.0.3: {} + streamx@2.23.0: + dependencies: + events-universal: 1.0.1 + fast-fifo: 1.3.2 + text-decoder: 1.2.3 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + strict-event-emitter@0.2.8: dependencies: events: 3.3.0 @@ -23045,6 +24411,8 @@ snapshots: strip-json-comments@3.1.1: {} + strnum@2.1.1: {} + style-search@0.1.0: {} style-to-object@0.4.4: @@ -23394,6 +24762,15 @@ snapshots: resolve: 1.22.10 string.prototype.trim: 1.2.10 + tar-stream@3.1.7: + dependencies: + b4a: 1.7.3 + fast-fifo: 1.3.2 + streamx: 2.23.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + terser-webpack-plugin@5.3.14(@swc/core@1.9.2(@swc/helpers@0.5.1))(webpack@5.101.3(@swc/core@1.9.2(@swc/helpers@0.5.1))): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -23418,6 +24795,12 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + text-decoder@1.2.3: + dependencies: + b4a: 1.7.3 + transitivePeerDependencies: + - react-native-b4a + textextensions@2.6.0: {} thenify-all@1.6.0: @@ -23517,7 +24900,7 @@ snapshots: json5: 2.2.3 lodash.memoize: 4.1.2 make-error: 1.3.6 - semver: 7.7.1 + semver: 7.7.3 typescript: 5.8.2 yargs-parser: 20.2.9 optionalDependencies: @@ -23663,7 +25046,6 @@ snapshots: get-tsconfig: 4.10.0 optionalDependencies: fsevents: 2.3.3 - optional: true tty-browserify@0.0.0: {} @@ -23948,6 +25330,8 @@ snapshots: unist-util-is: 6.0.0 unist-util-visit-parents: 6.0.1 + universal-user-agent@6.0.1: {} + universalify@0.1.2: {} universalify@0.2.0: {} @@ -24408,6 +25792,12 @@ snapshots: optionalDependencies: commander: 9.5.0 + zip-stream@6.0.1: + dependencies: + archiver-utils: 5.0.2 + compress-commons: 6.0.2 + readable-stream: 4.7.0 + zod-validation-error@2.1.0(zod@3.24.2): dependencies: zod: 3.24.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 8cba9f65c..14388ec8e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,3 @@ packages: - 'packages/**' - - 'scripts/cli/create-dms-page' + - 'scripts/cli/**' diff --git a/scripts/cli/dms-kit-publish/.env.example b/scripts/cli/dms-kit-publish/.env.example new file mode 100644 index 000000000..4021abc73 --- /dev/null +++ b/scripts/cli/dms-kit-publish/.env.example @@ -0,0 +1,115 @@ +# ======================================== +# DMS-UI 部署脚本环境变量配置 +# ======================================== + +# 部署环境 (development | staging | production) +DEPLOY_ENV=development + +# ======================================== +# NPM 私有仓库配置 +# ======================================== + +# npm 仓库地址 +NPM_REGISTRY=http://localhost:4873/ + +# npm 认证信息 +# 格式: //registry_url/:_auth="base64_encoded_credentials" +# 生成方式: echo -n "username:password" | base64 +# 示例: publisher:publisher -> cHVibGlzaGVyOnB1Ymxpc2hlcg== +NPM_AUTH//localhost:4873/:_authToken=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJyZWFsX2dyb3VwcyI6WyJwdWJsaXNoZXIiXSwibmFtZSI6InB1Ymxpc2hlciIsImdyb3VwcyI6WyJwdWJsaXNoZXIiLCIkYWxsIiwiJGF1dGhlbnRpY2F0ZWQiLCJAYWxsIiwiQGF1dGhlbnRpY2F0ZWQiLCJhbGwiXSwiaWF0IjoxNzYyMjM2NzY5LCJuYmYiOjE3NjIyMzY3NzAsImV4cCI6MTc2NzQyMDc2OX0.jO5xsVp3dSnNEbW77a37SuPRL7Q1YL2i66evaBVd3Mo + +# ======================================== +# FTP 服务器配置 +# ======================================== + +# FTP 服务器地址 +FTP_HOST=localhost + +# FTP 用户名 +FTP_USER=ftpadmin + +# FTP 密码 +FTP_PASSWORD=test123 + +# FTP 上传目录 +FTP_DIR=/home/ftpadmin/actiontech-dms-ui/docs + +# ======================================== +# Robot SDK 配置 +# ======================================== + +# Robot SDK API 地址 +ROBOT_SDK_BASE_URL=http://localhost:3535 + +# ======================================== +# GitHub API 配置 +# ======================================== + +# GitHub 组织/用户名 +GITHUB_OWNER=actiontech + +# GitHub 仓库名 +GITHUB_REPO=dms-ui + + +# GitHub 项目 ID +GITHUB_PROJECT_ID=706476902 + +# Github Token, 用于推送 tag 至仓库 +GITHUB_TOKEN= + +# ======================================== +# 邮件通知配置(可选) +# ======================================== + +# SMTP 服务器地址 +# 留空则不发送邮件通知 +EMAIL_HOST=localhost + +# SMTP 端口 +EMAIL_PORT=1025 + +# 是否使用 SSL/TLS (true | false) +EMAIL_SECURE=false + +# SMTP 用户名(如不需要认证可留空) +EMAIL_USER= + +# SMTP 密码(如不需要认证可留空) +EMAIL_PASS= + +# 发件人邮箱 +EMAIL_FROM=dms-deploy@example.com + +# 收件人邮箱(多个邮箱用逗号分隔) +EMAIL_TO=admin@example.com,team@example.com + +# ======================================== +# 说明 +# ======================================== + +# 本地测试环境(development): +# - NPM_REGISTRY: http://localhost:4873/ +# - FTP_HOST: localhost +# - EMAIL_HOST: localhost (MailHog) +# - 其他密码使用测试密码即可 + +# 测试环境(staging): +# - 使用测试服务器的实际地址 +# - 密码使用测试环境密码 +# - 版本号使用 x.x.x-staging.x + +# 生产环境(production): +# - 使用生产服务器地址 +# - 密码使用生产环境密码 +# - 必须通过 GoCD 执行,不要手动运行 + +# ======================================== +# 安全提示 +# ======================================== + +# 1. 不要将此文件提交到 Git +# 2. 不要在公共场合分享此文件 +# 3. 定期更换密码 +# 4. 生产环境密码必须使用强密码 +# 5. 在 GoCD 中使用 Secure Variables 存储敏感信息 diff --git a/scripts/cli/dms-kit-publish/bin/core.js b/scripts/cli/dms-kit-publish/bin/core.js new file mode 100755 index 000000000..5dad674fd --- /dev/null +++ b/scripts/cli/dms-kit-publish/bin/core.js @@ -0,0 +1,2 @@ +#!/usr/bin/env node +require('../dist/index.js'); diff --git a/scripts/cli/dms-kit-publish/package.json b/scripts/cli/dms-kit-publish/package.json new file mode 100644 index 000000000..08ad5444c --- /dev/null +++ b/scripts/cli/dms-kit-publish/package.json @@ -0,0 +1,32 @@ +{ + "name": "@actiontech/cli-dms-kit-publish", + "version": "1.0.0", + "description": "DMS Kit 包发布和文档部署工具", + "bin": { + "dms-kit-publish": "./bin/core.js" + }, + "files": [ + "dist" + ], + "scripts": { + "build:watch": "tsc -w", + "build": "tsc", + "start": "tsc && node dist/index.js" + }, + "dependencies": { + "@octokit/rest": "^20.1.2", + "archiver": "^7.0.1", + "basic-ftp": "^5.0.5", + "chalk": "^4.1.2", + "dotenv": "^17.2.3", + "execa": "^8.0.1", + "nodemailer": "^7.0.10", + "semver": "^7.7.3" + }, + "devDependencies": { + "@types/archiver": "^6.0.3", + "@types/node": "^18.0.4", + "@types/nodemailer": "^7.0.3", + "@types/semver": "^7.7.1" + } +} \ No newline at end of file diff --git a/scripts/cli/dms-kit-publish/scripts/setup-local-test.sh b/scripts/cli/dms-kit-publish/scripts/setup-local-test.sh new file mode 100755 index 000000000..94b40a548 --- /dev/null +++ b/scripts/cli/dms-kit-publish/scripts/setup-local-test.sh @@ -0,0 +1,214 @@ +#!/bin/bash + +# DMS-UI 本地测试环境启动脚本 + +set -e + +echo "" +echo "🚀 启动 DMS-KIT-PUBLISH 本地测试环境" +echo "================================" +echo "" + +# 检查 Docker 是否安装 +if ! command -v docker &> /dev/null; then + echo "❌ 错误: 未安装 Docker" + echo "请先安装 Docker: https://docs.docker.com/get-docker/" + exit 1 +fi + +# 检查 Docker 是否运行 +if ! docker info &> /dev/null; then + echo "❌ 错误: Docker 未运行" + echo "请先启动 Docker" + exit 1 +fi + +# 停止并删除已存在的容器 +echo "🧹 清理旧容器..." +docker rm -f verdaccio ftp-server mailhog 2>/dev/null || true + +# 清理旧的 Verdaccio 配置(如果需要) +if [ -f "$(pwd)/verdaccio/conf/config.yaml" ]; then + echo "🔍 检测到现有配置文件,将重新生成以确保配置正确..." + rm -f $(pwd)/verdaccio/conf/config.yaml +fi + +echo "" + +# 启动 Verdaccio +echo "📦 启动 npm 私有仓库 (Verdaccio)..." + +# 创建 Verdaccio 数据目录 +mkdir -p $(pwd)/verdaccio/storage $(pwd)/verdaccio/conf + +# 创建 Verdaccio 配置文件(如果不存在) +if [ ! -f "$(pwd)/verdaccio/conf/config.yaml" ]; then + cat > $(pwd)/verdaccio/conf/config.yaml << 'EOF' +storage: /verdaccio/storage/data + +auth: + htpasswd: + file: /verdaccio/storage/htpasswd + max_users: 1000 + algorithm: bcrypt + rounds: 10 + +security: + api: + jwt: + sign: + expiresIn: 60d + notBefore: 1 + web: + sign: + expiresIn: 7d + verify: + expiresIn: 7d + +uplinks: + npmjs: + url: https://registry.npmjs.org/ + timeout: 30s + +packages: + '@*/*': + access: $all + publish: $authenticated + unpublish: $authenticated + proxy: npmjs + + '**': + access: $all + publish: $authenticated + unpublish: $authenticated + proxy: npmjs + +server: + keepAliveTimeout: 60 + +middlewares: + audit: + enabled: true + +logs: { type: stdout, format: pretty, level: http } + +max_body_size: 100mb +EOF +fi + +docker run -d \ + --name verdaccio \ + -p 4873:4873 \ + -v $(pwd)/verdaccio/storage:/verdaccio/storage \ + -v $(pwd)/verdaccio/conf:/verdaccio/conf \ + verdaccio/verdaccio + +echo " 等待 Verdaccio 启动..." +sleep 5 + +# 检查 Verdaccio 是否启动成功 +if curl -s http://localhost:4873 > /dev/null; then + echo " ✅ Verdaccio 启动成功" +else + echo " ⚠️ Verdaccio 可能未完全启动,请稍后检查" + echo " 检查日志: docker logs verdaccio" +fi +echo "" + +# 启动 FTP 服务器 +echo "📁 启动 FTP 服务器..." + +# 预创建 FTP 目录结构(模拟生产环境) +mkdir -p $(pwd)/ftp-data/actiontech-dms-ui/docs +echo " 已预创建目录结构: /home/ftpadmin/actiontech-dms-ui/docs" + +docker run -d \ + --name ftp-server \ + -p 21:21 \ + -p 21000-21010:21000-21010 \ + -e USERS="ftpadmin|test123" \ + -e ADDRESS=localhost \ + -e MIN_PORT=21000 \ + -e MAX_PORT=21010 \ + -v $(pwd)/ftp-data:/home/ftpadmin \ + delfer/alpine-ftp-server + +echo " 等待 FTP 服务器启动..." +sleep 3 +echo " ✅ FTP 服务器启动成功" +echo "" + +# 启动 Mailpit (MailHog 的现代化替代品,支持 ARM) +echo "📧 启动邮件测试服务 (Mailpit)..." +docker run -d \ + --name mailhog \ + -p 1025:1025 \ + -p 8025:8025 \ + -e MP_MAX_MESSAGES=5000 \ + axllent/mailpit + +echo " 等待 Mailpit 启动..." +sleep 2 +echo " ✅ Mailpit 启动成功" +echo "" + +echo "================================" +echo "✅ 测试环境启动完成!" +echo "================================" +echo "" +echo "📌 服务地址:" +echo " - npm 仓库: http://localhost:4873" +echo " - FTP 服务: ftp://localhost:21" +echo " - 邮件界面: http://localhost:8025" +echo "" +echo "🔐 测试凭据:" +echo " - FTP 用户: ftpadmin / test123" +echo " - npm 用户: publisher / publisher" +echo "" +echo "📝 下一步操作:" +echo " 1. 注册 npm 用户 (如果还未注册):" +echo " npm adduser --registry http://localhost:4873/" +echo "" +echo " 2. 配置环境变量:" +echo " cd scripts/publishAndDocsDeploy" +echo " cp .env.example .env" +echo " # 编辑 .env 文件(开发环境已经配置好,无需修改)" +echo "" +echo " 3. 准备测试包:" +echo " # 修改 packages/*/package.json 中的版本号" +echo " # 更新 packages/*/docs/CHANGELOG.md" +echo "" +echo " 4. 运行测试:" +echo " pnpm tsx scripts/publishAndDocsDeploy/index.ts" +echo "" +echo "📖 详细文档: scripts/publishAndDocsDeploy/LOCAL_TEST_GUIDE.md" +echo "" + +# 提示注册 npm 用户 +echo "❓ 是否现在注册 npm 用户? (y/n)" +read -r response +if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then + echo "" + echo "请输入以下信息注册 npm 用户:" + echo "用户名: publisher" + echo "密码: publisher" + echo "邮箱: publisher@example.com" + echo "" + npm adduser --registry http://localhost:4873/ + + if [ $? -eq 0 ]; then + echo "" + echo "✅ npm 用户注册成功!" + echo "" + echo "🔑 认证信息已保存到 ~/.npmrc" + echo " 你可以从中获取 NPM_AUTH 配置" + else + echo "" + echo "⚠️ npm 用户注册失败,请稍后手动注册" + fi +fi + +echo "" +echo "🎉 准备就绪!可以开始测试了!" +echo "" + diff --git a/scripts/cli/dms-kit-publish/scripts/stop-local-test.sh b/scripts/cli/dms-kit-publish/scripts/stop-local-test.sh new file mode 100755 index 000000000..d55ad5ae1 --- /dev/null +++ b/scripts/cli/dms-kit-publish/scripts/stop-local-test.sh @@ -0,0 +1,42 @@ +#!/bin/bash + +# DMS-UI 本地测试环境停止脚本 + +echo "" +echo "🛑 停止 DMS-KIT-PUBLISH 本地测试环境" +echo "================================" +echo "" + +# 停止并删除容器 +echo "🧹 停止容器..." +docker rm -f verdaccio ftp-server mailhog 2>/dev/null || true +echo "" + +echo "================================" +echo "✅ 测试环境已停止并清理" +echo "================================" +echo "" + +# 询问是否删除数据 +echo "❓ 是否删除测试数据? (y/n)" +echo " - verdaccio/ (npm 包数据)" +echo " - ftp-data/ (FTP 上传文件)" +echo "" +read -r response + +if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then + echo "" + echo "🗑️ 删除测试数据..." + rm -rf verdaccio/ ftp-data/ + echo "✅ 测试数据已删除" +else + echo "" + echo "📦 测试数据已保留" + echo " - 位置: $(pwd)/verdaccio/ 和 $(pwd)/ftp-data/" + echo " - 下次启动测试环境时会复用这些数据" +fi + +echo "" +echo "👋 再见!" +echo "" + diff --git a/scripts/cli/dms-kit-publish/src/config/environment.ts b/scripts/cli/dms-kit-publish/src/config/environment.ts new file mode 100644 index 000000000..056b7adcc --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/config/environment.ts @@ -0,0 +1,99 @@ +import chalk from 'chalk'; +import 'dotenv/config'; +import type { EnvironmentConfig } from '../types/index'; + +// 获取当前环境 +export const ENV = process.env.DEPLOY_ENV || 'production'; + +// 解析命令行参数 +const args = process.argv.slice(2); +export const RETRY_DEPLOY_TRIGGER = args.includes('--retry-deploy-trigger'); + +// 环境配置定义 +const environments: Record = { + development: { + pnpm: { + registry: process.env.NPM_REGISTRY || 'http://localhost:4873/', + auth: process.env.NPM_AUTH || '' + }, + ftpServer: { + host: process.env.FTP_HOST || 'localhost', + user: process.env.FTP_USER || '', + password: process.env.FTP_PASSWORD || '' + }, + ftpDir: process.env.FTP_DIR || '/home/ftpadmin/actiontech-dms-ui/docs', + robotSDK: { + baseUrl: process.env.ROBOT_SDK_BASE_URL || 'http://localhost:3535' + }, + githubApi: { + owner: process.env.GITHUB_OWNER || 'actiontech', + repo: process.env.GITHUB_REPO || 'dms-ui', + baseUrl: process.env.GITHUB_API_BASE_URL || 'https://api.github.com', + projectId: parseInt(process.env.GITHUB_PROJECT_ID || '706476902'), + token: process.env.GITHUB_TOKEN || '' + }, + email: process.env.EMAIL_HOST + ? { + host: process.env.EMAIL_HOST, + port: parseInt(process.env.EMAIL_PORT || '587'), + secure: process.env.EMAIL_SECURE === 'true', + auth: { + user: process.env.EMAIL_USER || '', + pass: process.env.EMAIL_PASS || '' + }, + from: process.env.EMAIL_FROM || '', + to: (process.env.EMAIL_TO || '').split(',').filter(Boolean) + } + : undefined + }, + production: { + pnpm: { + registry: process.env.NPM_REGISTRY || 'http://10.186.18.19:4873/', + auth: process.env.NPM_AUTH || '' + }, + ftpServer: { + host: process.env.FTP_HOST || '10.186.18.90', + user: process.env.FTP_USER || '', + password: process.env.FTP_PASSWORD || '' + }, + ftpDir: process.env.FTP_DIR || '/actiontech-dms-ui/docs', + robotSDK: { + baseUrl: process.env.ROBOT_SDK_BASE_URL || 'http://10.186.18.19:8000' + }, + githubApi: { + owner: process.env.GITHUB_OWNER || 'actiontech', + repo: process.env.GITHUB_REPO || 'dms-ui', + baseUrl: process.env.GITHUB_API_BASE_URL || 'https://api.github.com', + projectId: parseInt(process.env.GITHUB_PROJECT_ID || '706476902'), + token: process.env.GITHUB_TOKEN || '' + }, + email: process.env.EMAIL_HOST + ? { + host: process.env.EMAIL_HOST, + port: parseInt(process.env.EMAIL_PORT || '587'), + secure: process.env.EMAIL_SECURE === 'true', + auth: { + user: process.env.EMAIL_USER || '', + pass: process.env.EMAIL_PASS || '' + }, + from: process.env.EMAIL_FROM || '', + to: (process.env.EMAIL_TO || '').split(',').filter(Boolean) + } + : undefined + } +}; + +// 验证环境并获取配置 +if (!environments[ENV]) { + console.error(chalk.red(`不支持的环境: ${ENV}`)); + console.error( + chalk.red(`支持的环境: ${Object.keys(environments).join(', ')}`) + ); + process.exit(1); +} + +// 导出当前环境配置 +export const config = environments[ENV]; + +// 输出当前环境信息 +console.log(chalk.blue(`\n当前部署环境: ${ENV}\n`)); diff --git a/scripts/cli/dms-kit-publish/src/config/index.ts b/scripts/cli/dms-kit-publish/src/config/index.ts new file mode 100644 index 000000000..5d04aebd1 --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/config/index.ts @@ -0,0 +1 @@ +export * from './environment'; diff --git a/scripts/cli/dms-kit-publish/src/constants/packages.ts b/scripts/cli/dms-kit-publish/src/constants/packages.ts new file mode 100644 index 000000000..2c3cd69e2 --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/constants/packages.ts @@ -0,0 +1,34 @@ +import * as path from 'path'; +import type { PackageConfig } from '../types/index'; + +// 项目根目录 +const projectRoot = path.join(__dirname, '..', '..', '..', '..', '..'); + +// 包配置列表 +export const packages: PackageConfig[] = [ + { + dir: 'icons', + distDir: path.join(projectRoot, 'packages', 'icons', 'docs-dist'), + changelogPath: path.join( + projectRoot, + 'packages', + 'icons', + 'docs', + 'CHANGELOG.md' + ) + }, + { + dir: 'dms-kit', + distDir: path.join(projectRoot, 'packages', 'dms-kit', 'docs-dist'), + changelogPath: path.join( + projectRoot, + 'packages', + 'dms-kit', + 'docs', + 'CHANGELOG.md' + ) + } +]; + +// 导出项目根目录 +export { projectRoot }; diff --git a/scripts/cli/dms-kit-publish/src/index.ts b/scripts/cli/dms-kit-publish/src/index.ts new file mode 100644 index 000000000..b0e57e892 --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/index.ts @@ -0,0 +1,18 @@ +/** + * DMS UI 部署脚本入口文件 + * + * 功能: + * 1. 从 package.json 中获取对应包名称和版本 + * 2. [包]@[版本]未发布时,发布包 + * 3. 构建文档和部署文档 + * 4. 推送 tag + * + * 使用方法: + * - 正常部署: node dist/index.js + * - 重试文档部署触发: node dist/index.js --retry-deploy-trigger + */ + +import { DmsKitPublish } from './services/deploy'; + +// 启动部署流程 +new DmsKitPublish().start(); diff --git a/scripts/cli/dms-kit-publish/src/services/deploy.ts b/scripts/cli/dms-kit-publish/src/services/deploy.ts new file mode 100644 index 000000000..8d89a75ec --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/services/deploy.ts @@ -0,0 +1,847 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import { Client as ftpClient } from 'basic-ftp'; +import { execa } from 'execa'; +import { Octokit } from '@octokit/rest'; +import { config, ENV, RETRY_DEPLOY_TRIGGER } from '../config/index'; +import { packages, projectRoot } from '../constants/packages'; +import { + ErrorCode, + DeployError, + PackageInfo, + ZipFileInfo +} from '../types/index'; +import { + stepLog, + successLog, + errorLog, + warnLog, + infoLog +} from '../utils/logger'; +import { getChangelogForVersion } from '../utils/changelog'; +import { compressFolder } from '../utils/compress'; +import { VersionValidator } from './validator'; +import { NotificationService } from './notification'; +import axios from 'axios'; + +/** + * DMS UI 部署主类 + * 负责整个部署流程的协调和执行 + */ +export class DmsKitPublish { + private pkgs: PackageInfo[] = []; + private cwd = projectRoot; + private validator = new VersionValidator(); + private notificationService = new NotificationService(); + private currentPhase: 'preparation' | 'publishing' = 'preparation'; + + /** + * 启动部署流程 + */ + async start() { + const startTime = Date.now(); + let zipFiles: ZipFileInfo[] = []; + try { + // 如果是重试部署触发模式 + if (RETRY_DEPLOY_TRIGGER) { + infoLog('\n========================================'); + infoLog(' 重试部署触发模式'); + infoLog('========================================\n'); + + await this.retryDeployTrigger(); + + const duration = ((Date.now() - startTime) / 1000).toFixed(2); + successLog(`\n部署触发完成 (耗时: ${duration}s)`); + process.exit(0); + } + + infoLog('\n========================================'); + infoLog(' 准备阶段'); + infoLog('========================================\n'); + + // 验证必需的环境变量 + this.validateEnvironmentVariables(); + + stepLog('获取包信息'); + await this.loadPkgInfo(); + + if (!this.pkgs.length) { + infoLog('未找到有效的包信息'); + return; + } + + // 验证 FTP 连接 + await this.validateFtpConnection(); + + // 构建文档 + await this.buildDocs(); + + // 压缩文档 + zipFiles = await this.compressDocs(); + + infoLog('\n========================================'); + infoLog(' 发布阶段'); + infoLog('========================================\n'); + + // 进入发布阶段 + this.currentPhase = 'publishing'; + + // 发布包 + await this.publishPkg(); + + // 创建并推送 Git tags + await this.createGitTags(); + + // 上传文档 + await this.uploadDocs(zipFiles); + + // 触发文档部署 + await this.triggerDocsDeploy(zipFiles); + + // 清理临时文件 + this.cleanupTempFiles(zipFiles); + + // stepLog('步骤3: 推送版本标签'); + // 没有 github token 暂不推送 + // await this.setGitRegistryTag(); + + const duration = ((Date.now() - startTime) / 1000).toFixed(2); + successLog(`\n所有步骤执行完成 (耗时: ${duration}s)`); + + // 发送成功通知 + const notificationContent = `环境: ${ENV} + +执行步骤: + 1. ✓ 验证环境变量 + 2. ✓ 获取包信息 + 3. ✓ 验证 FTP 连接 (准备阶段) + 4. ✓ 构建文档 (准备阶段) + 5. ✓ 压缩文档 (准备阶段) + 6. ✓ 发布包 (发布阶段) + 7. ✓ 创建 Git Tags (发布阶段) + 8. ✓ 上传文档 (发布阶段) + 9. ✓ 触发文档部署 (发布阶段) + +包列表: +${this.pkgs.map((p) => ` - ${p.name}@${p.version}`).join('\n')} + +Git Tags: +${this.pkgs.map((p) => ` - ${p.dir}-v${p.version}`).join('\n')} + +总耗时: ${duration}s`; + + await this.notificationService.sendEmailNotification( + '发布成功', + notificationContent + ); + + process.exit(0); + } catch (error) { + const duration = ((Date.now() - startTime) / 1000).toFixed(2); + + // 发送失败通知 + const errorMessage = + error instanceof Error ? error.message : String(error); + await this.notificationService.sendEmailNotification( + '发布失败', + `环境: ${ENV}\n错误信息:\n${errorMessage}\n耗时: ${duration}s`, + true + ); + + this.handleError(error); + } + } + + /** + * 验证必需的环境变量 + */ + private validateEnvironmentVariables() { + const requiredVars: Array<{ name: string; value: any; env: string[] }> = [ + { name: 'NPM_REGISTRY', value: config.pnpm.registry, env: ['all'] }, + { name: 'FTP_HOST', value: config.ftpServer.host, env: ['all'] }, + { + name: 'FTP_USER', + value: config.ftpServer.user, + env: ['production'] + }, + { + name: 'FTP_PASSWORD', + value: config.ftpServer.password, + env: ['production'] + }, + { name: 'GITHUB_TOKEN', value: config.githubApi.token, env: ['all'] } + ]; + + const missing: string[] = []; + + for (const varCheck of requiredVars) { + if ( + varCheck.env.includes('all') || + varCheck.env.includes(ENV.toLowerCase()) + ) { + if (!varCheck.value || varCheck.value === '') { + missing.push(varCheck.name); + } + } + } + + if (missing.length > 0) { + throw new DeployError( + ErrorCode.ENV_VAR_MISSING, + `缺少必需的环境变量: ${missing.join(', ')}`, + { missing } + ); + } + + successLog('环境变量检查通过'); + } + + /** + * 重试部署触发 + */ + private async retryDeployTrigger() { + stepLog('读取包信息'); + + // 从 package.json 读取所有包的信息 + const allPackages: PackageInfo[] = []; + for (const pkg of packages) { + try { + const packageJsonPath = path.join( + this.cwd, + `packages/${pkg.dir}/package.json` + ); + const packageJson = JSON.parse( + fs.readFileSync(packageJsonPath, 'utf-8') + ); + const { name, version } = packageJson; + + allPackages.push({ + ...pkg, + name, + version + }); + + infoLog(` 读取包信息: ${name}@${version}`); + } catch (error: any) { + warnLog(`跳过包 ${pkg.dir}: ${error.message}`); + } + } + + if (allPackages.length === 0) { + throw new Error('未找到任何包信息'); + } + + // 连接 FTP 检查哪些版本已上传 + stepLog('检查 FTP 服务器上的文件'); + const ftp = new ftpClient(); + const existingPackages: PackageInfo[] = []; + + try { + await ftp.access(config.ftpServer); + const list = await ftp.list(config.ftpDir); + + for (const pkg of allPackages) { + const zipFileName = `${pkg.dir}-v${pkg.version}.zip`; + const exists = list.some((file) => file.name === zipFileName); + + if (exists) { + existingPackages.push(pkg); + successLog(` 找到已上传文件: ${zipFileName}`); + } else { + warnLog(` 未找到文件: ${zipFileName}`); + } + } + } catch (error: any) { + throw new DeployError(ErrorCode.FTP_UPLOAD_FAILED, 'FTP 连接失败', { + originalError: error.message + }); + } finally { + ftp.close(); + } + + if (existingPackages.length === 0) { + throw new Error('FTP 服务器上未找到任何已上传的文档包'); + } + + // 构建 zipFiles 信息 + const zipFiles: ZipFileInfo[] = existingPackages.map((pkg) => ({ + pkg, + zipPath: path.join(this.cwd, `${pkg.dir}-v${pkg.version}.zip`) + })); + + // 触发文档部署 + stepLog('触发文档部署'); + await this.triggerDocsDeploy(zipFiles); + + successLog(`成功触发 ${existingPackages.length} 个包的文档部署`); + } + + /** + * 加载包信息并验证 + */ + private async loadPkgInfo() { + for (const pkg of packages) { + try { + const packageJsonPath = path.join( + this.cwd, + `packages/${pkg.dir}/package.json` + ); + const packageJson = JSON.parse( + fs.readFileSync(packageJsonPath, 'utf-8') + ); + const { name, version } = packageJson; + + // 验证版本号格式 + if (!this.validator.validateFormat(version)) { + throw new DeployError( + ErrorCode.VERSION_INVALID, + `版本号格式不正确: ${version}` + ); + } + + // 验证版本号递增 + const shouldPublish = await this.validator.validateIncrement( + name, + version + ); + + if (shouldPublish) { + // 验证 CHANGELOG + this.validator.validateChangelog(pkg.changelogPath, version); + + this.pkgs.push({ + ...pkg, + name, + version + }); + + successLog(`包信息加载成功: ${name}@${version}`); + } + } catch (error: any) { + throw new DeployError( + ErrorCode.PKG_LOAD_FAILED, + `加载包信息失败: ${pkg.dir}`, + { originalError: error.message } + ); + } + } + } + + /** + * 发布包到 npm 仓库 + */ + private async publishPkg() { + for (const pkg of this.pkgs) { + // 检查包是否已发布 + let isPublished = false; + try { + const { stdout } = await execa('pnpm', [ + 'info', + `${pkg.name}@${pkg.version}`, + '--registry', + config.pnpm.registry + ]); + if (stdout.length) { + isPublished = true; + } + } catch { + isPublished = false; + } + + if (isPublished) { + infoLog(`包 ${pkg.name}@${pkg.version} 已发布,跳过发布步骤`); + continue; + } + + try { + stepLog(`发布包 ${pkg.name}@${pkg.version}`); + if (pkg.dir === 'icons') { + await execa( + 'node', + [ + 'publish-icons.mjs', + '--skip-confirm', + '--registry', + config.pnpm.registry, + '--auth', + config.pnpm.auth + ], + { + cwd: path.join(this.cwd, 'packages', 'icons') + } + ); + continue; + } + const pkgPath = path.join(this.cwd, 'packages', pkg.dir); + + // 设置 npm 认证 + await execa('pnpm', ['config', 'set', config.pnpm.auth], { + cwd: pkgPath + }); + + // 发布包 + await execa( + 'pnpm', + ['publish', '--registry', config.pnpm.registry, '--no-git-checks'], + { + cwd: pkgPath + } + ); + + successLog(`包 ${pkg.name}@${pkg.version} 发布成功`); + } catch (error: any) { + throw new DeployError( + ErrorCode.NPM_PUBLISH_FAILED, + `包 ${pkg.name}@${pkg.version} 发布失败`, + { originalError: error.message } + ); + } + } + } + + /** + * 创建并推送 Git Tags + */ + private async createGitTags() { + stepLog('创建并推送 Git Tags'); + + // 初始化 Octokit 实例 + const octokit = new Octokit({ + auth: config.githubApi.token + }); + + try { + // 1. 获取当前分支的最新 commit SHA + const { data: refData } = await octokit.git.getRef({ + owner: config.githubApi.owner, + repo: config.githubApi.repo, + ref: 'heads/main' + }); + + const commitSha = refData.object.sha; + infoLog(` 当前 commit SHA: ${commitSha}`); + + // 2. 为每个包创建 tag + for (const pkg of this.pkgs) { + const tagName = `${pkg.dir}-v${pkg.version}`; + + try { + // 检查 tag 是否已存在 + try { + await octokit.git.getRef({ + owner: config.githubApi.owner, + repo: config.githubApi.repo, + ref: `tags/${tagName}` + }); + infoLog(` Tag ${tagName} 已存在,跳过创建`); + continue; + } catch (error: any) { + // tag 不存在,继续创建 + if (error.status !== 404) { + throw error; + } + } + + // 3. 创建 tag 对象 + const { data: tagData } = await octokit.git.createTag({ + owner: config.githubApi.owner, + repo: config.githubApi.repo, + tag: tagName, + message: `Release ${pkg.name}@${pkg.version}`, + object: commitSha, + type: 'commit' + }); + + // 4. 创建 tag 引用 + await octokit.git.createRef({ + owner: config.githubApi.owner, + repo: config.githubApi.repo, + ref: `refs/tags/${tagName}`, + sha: tagData.sha + }); + + successLog(` Tag ${tagName} 创建成功`); + } catch (error: any) { + throw new DeployError( + ErrorCode.TAG_PUSH_FAILED, + `创建 tag ${tagName} 失败`, + { + originalError: error.message, + status: error.status + } + ); + } + } + + successLog('Git Tags 创建完成'); + } catch (error: any) { + if (error instanceof DeployError) { + throw error; + } + throw new DeployError(ErrorCode.TAG_PUSH_FAILED, '获取 commit SHA 失败', { + originalError: error.message, + status: error.status + }); + } + } + + /** + * 构建文档 + */ + private async buildDocs() { + stepLog('构建文档'); + + for (const pkg of this.pkgs) { + stepLog(`构建文档: ${pkg.dir}`); + + // icons 包特殊处理 + if (pkg.dir === 'icons') { + await execa('pnpm', ['docs:g'], { + cwd: path.join(this.cwd, 'packages', 'icons') + }); + } + + const dumiConfigPath = path.join( + this.cwd, + 'packages', + pkg.dir, + '.dumirc.ts' + ); + + // 读取原始配置 + const originalConfig = fs.readFileSync(dumiConfigPath, 'utf-8'); + + // 修改配置用于构建 + const modifiedConfig = originalConfig.replace( + new RegExp(`/dms-docs`, 'g'), + `/doc/${pkg.dir}-v${pkg.version.split('.')[0]}` + ); + + // 写入修改后的配置 + fs.writeFileSync(dumiConfigPath, modifiedConfig); + + try { + // 构建文档 + await execa('pnpm', ['docs:build'], { + cwd: path.join(this.cwd, 'packages', pkg.dir) + }); + + // 验证构建产物 + if (!fs.existsSync(pkg.distDir)) { + throw new DeployError( + ErrorCode.DOCS_BUILD_FAILED, + `构建产物不存在: ${pkg.distDir}` + ); + } + + successLog(`文档构建完成: ${pkg.dir}`); + } catch (error: any) { + throw new DeployError( + ErrorCode.DOCS_BUILD_FAILED, + `文档构建失败: ${pkg.dir}`, + { originalError: error.message } + ); + } finally { + // 恢复原始配置 + fs.writeFileSync(dumiConfigPath, originalConfig); + } + } + } + + /** + * 压缩文档 + */ + private async compressDocs(): Promise { + stepLog('压缩文档'); + + const zipFiles: ZipFileInfo[] = []; + + for (const pkg of this.pkgs) { + const zipFileName = `${pkg.dir}-v${pkg.version}.zip`; + const zipPath = path.join(this.cwd, zipFileName); + + await compressFolder(pkg.distDir, zipPath); + + // 验证压缩文件 + const stats = fs.statSync(zipPath); + infoLog(` ${pkg.dir}: ${(stats.size / 1024 / 1024).toFixed(2)} MB`); + + zipFiles.push({ pkg, zipPath }); + } + + successLog('文档压缩完成'); + return zipFiles; + } + + /** + * 确保 FTP 目录存在(递归创建) + */ + private async ensureFtpDir(ftp: ftpClient, dirPath: string): Promise { + infoLog(` 正在确保 FTP 目录存在: ${dirPath}`); + + try { + // 尝试使用 basic-ftp 的 ensureDir 方法,它会自动递归创建目录 + await ftp.ensureDir(dirPath); + infoLog(` FTP 目录已准备就绪: ${dirPath}`); + } catch (error: any) { + throw new Error(`确保 FTP 目录失败 ${dirPath}: ${error.message}`); + } + } + + /** + * 验证 FTP 连接 + */ + private async validateFtpConnection(): Promise { + stepLog('验证 FTP 连接'); + const ftp = new ftpClient(); + const testFileName = '.test_write_permission'; + const testFilePath = path.join(config.ftpDir, testFileName); + const tempTestFile = path.join(this.cwd, testFileName); + + try { + await ftp.access(config.ftpServer); + + // 确保目录存在(递归创建) + await this.ensureFtpDir(ftp, config.ftpDir); + + // 创建临时测试文件 + fs.writeFileSync(tempTestFile, 'test'); + + // 测试写权限 + const testStream = fs.createReadStream(tempTestFile); + await ftp.uploadFrom(testStream, testFilePath); + await ftp.remove(testFilePath); + + successLog('FTP 连接验证通过'); + } catch (error: any) { + throw new DeployError( + ErrorCode.FTP_UPLOAD_FAILED, + `FTP 连接验证失败,请检查服务器配置\n目标目录: ${config.ftpDir}`, + { originalError: error.message } + ); + } finally { + ftp.close(); + // 清理本地临时文件 + if (fs.existsSync(tempTestFile)) { + fs.unlinkSync(tempTestFile); + } + } + } + + /** + * 上传文档到 FTP + */ + private async uploadDocs(zipFiles: ZipFileInfo[]) { + stepLog('上传文档到 FTP'); + const ftp = new ftpClient(); + + try { + await ftp.access(config.ftpServer); + + // 确保目录存在(递归创建) + await this.ensureFtpDir(ftp, config.ftpDir); + + for (const { zipPath } of zipFiles) { + const zipFileName = path.basename(zipPath); + + // 检查文档是否已部署 + let isDeployed = false; + try { + const list = await ftp.list(config.ftpDir); + isDeployed = list.some((file) => file.name === zipFileName); + } catch { + isDeployed = false; + } + + if (isDeployed) { + infoLog(` ${zipFileName} 已存在,跳过上传`); + continue; + } + + // 上传 + const readStream = fs.createReadStream(zipPath); + await ftp.uploadFrom(readStream, path.join(config.ftpDir, zipFileName)); + + successLog(` ${zipFileName} 上传成功`); + } + + successLog('文档上传完成'); + } catch (error: any) { + throw new DeployError(ErrorCode.FTP_UPLOAD_FAILED, 'FTP 上传失败', { + originalError: error.message + }); + } finally { + ftp.close(); + } + } + + /** + * 触发文档部署 + */ + private async triggerDocsDeploy(zipFiles: ZipFileInfo[]) { + const packageList = zipFiles.map(({ pkg, zipPath }) => ({ + filepath: path.join(config.ftpDir, path.basename(zipPath)), + name: pkg.name, + version: pkg.version, + changelog: getChangelogForVersion(pkg.changelogPath, pkg.version) + })); + + if (packageList.length === 0) { + infoLog('没有需要部署的文档'); + return; + } + + stepLog('发送文档部署请求'); + try { + await axios.post( + `${config.robotSDK.baseUrl}/v1/doc-management/dmp-kit-deploy`, + { + package_list: packageList, + project_id: config.githubApi.projectId + }, + { + headers: { + 'Content-Type': 'application/json' + } + } + ); + successLog('文档部署请求发送成功'); + } catch (error: any) { + if (RETRY_DEPLOY_TRIGGER) { + // 在重试模式下,抛出错误 + throw new DeployError( + ErrorCode.NOTIFICATION_FAILED, + '文档部署请求发送失败', + { originalError: error.message } + ); + } else { + // 在正常流程中,只警告不中断 + warnLog('文档部署请求发送失败,但不影响主流程'); + errorLog(error.message); + warnLog('\n💡 提示: 如需重试文档部署触发,可使用参数:'); + infoLog('--retry-deploy-trigger\n'); + } + } + } + + /** + * 清理临时文件 + */ + private cleanupTempFiles(zipFiles: ZipFileInfo[]) { + for (const { zipPath } of zipFiles) { + if (fs.existsSync(zipPath)) { + fs.unlinkSync(zipPath); + } + } + infoLog('临时文件清理完成'); + } + + /** + * 错误处理 + */ + private handleError(error: any) { + infoLog('\n'); + errorLog('========================================'); + errorLog(' 部署失败'); + errorLog('========================================\n'); + + // 根据阶段显示不同的提示 + if (this.currentPhase === 'preparation') { + warnLog('⚠️ 当前处于准备阶段,未发布任何包'); + warnLog(' 可以修复问题后直接重新运行脚本\n'); + } else { + warnLog('⚠️ 当前处于发布阶段'); + warnLog(' 部分包可能已发布,可重新运行脚本继续未完成的步骤\n'); + } + + if (error instanceof DeployError) { + errorLog(`错误代码: ${error.code}`); + errorLog(`错误信息: ${error.message}`); + + // 根据错误类型提供解决方案 + switch (error.code) { + case ErrorCode.ENV_VAR_MISSING: + infoLog('\n解决方案:'); + infoLog(' 1. 检查 .env 文件配置'); + infoLog(' 2. 确认 GoCD 中的环境变量配置'); + infoLog(' 3. 参考 .env.example 文件'); + break; + + case ErrorCode.VERSION_INVALID: + infoLog('\n解决方案:'); + infoLog(' 1. 检查 package.json 中的版本号格式'); + infoLog(' 2. 确保版本号大于当前已发布版本'); + infoLog(' 3. 遵循语义化版本规范 (semver)'); + break; + + case ErrorCode.CHANGELOG_MISSING: + infoLog('\n解决方案:'); + infoLog(' 1. 在 CHANGELOG.md 中添加对应版本的更新说明'); + infoLog(' 2. 格式: ## 版本号'); + break; + + case ErrorCode.NPM_PUBLISH_FAILED: + infoLog('\n可能的原因:'); + infoLog(' 1. npm 认证信息过期'); + infoLog(' 2. 版本号已存在'); + infoLog(' 3. 网络连接问题'); + infoLog('\n解决方案:'); + infoLog(' - 检查 NPM_AUTH 环境变量'); + infoLog(' - 确认版本号是否已更新'); + break; + + case ErrorCode.DOCS_BUILD_FAILED: + infoLog('\n可能的原因:'); + infoLog(' 1. 依赖未安装'); + infoLog(' 2. 文档配置错误'); + infoLog(' 3. 文档源文件有语法错误'); + infoLog('\n解决方案:'); + infoLog(' - 运行 pnpm install'); + infoLog(' - 检查 .dumirc.ts 配置'); + infoLog(' - 本地运行 pnpm docs:build 测试'); + break; + + case ErrorCode.FTP_UPLOAD_FAILED: + infoLog('\n可能的原因:'); + infoLog(' 1. FTP 服务器连接失败'); + infoLog(' 2. 认证失败'); + infoLog(' 3. 磁盘空间不足'); + infoLog('\n解决方案:'); + infoLog(' - 检查 FTP 服务器状态'); + infoLog(' - 验证 FTP 账号密码'); + infoLog(' - 测试 FTP 连接: ftp ' + config.ftpServer.host); + break; + + case ErrorCode.TAG_PUSH_FAILED: + infoLog('\n可能的原因:'); + infoLog(' 1. GITHUB_TOKEN 环境变量未设置或无效'); + infoLog(' 2. Token 权限不足(需要 repo 或 public_repo 权限)'); + infoLog(' 3. 网络连接问题'); + infoLog(' 4. Tag 已存在(可能是并发创建导致)'); + infoLog(' 5. 指定的分支不存在(默认为 main)'); + infoLog('\n解决方案:'); + infoLog(' - 检查 GITHUB_TOKEN 环境变量是否正确设置'); + infoLog( + ' - 确认 Token 具有 repo 权限(Settings > Developer settings > Personal access tokens)' + ); + infoLog(' - 验证仓库地址和分支名称是否正确'); + infoLog(' - 检查网络连接是否正常'); + infoLog(' - 如果 Tag 已存在,可以忽略此错误'); + break; + } + + if (error.details) { + infoLog('\n详细信息:'); + infoLog(JSON.stringify(error.details, null, 2)); + } + } else { + errorLog(`未知错误: ${error.message || String(error)}`); + if (error.stack) { + errorLog(error.stack); + } + } + + errorLog('\n========================================\n'); + process.exit(1); + } +} diff --git a/scripts/cli/dms-kit-publish/src/services/notification.ts b/scripts/cli/dms-kit-publish/src/services/notification.ts new file mode 100644 index 000000000..a9add3b9a --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/services/notification.ts @@ -0,0 +1,84 @@ +import nodemailer from 'nodemailer'; +import { config, ENV } from '../config/index'; + +/** + * 通知服务 + * 负责发送邮件通知(未来可扩展为飞书通知) + * TODO: 目前不会配置邮件通知,后续应该会调整为 feishu 通知,修改 robot 服务来配合消息推送 + */ +export class NotificationService { + private transporter?: nodemailer.Transporter; + + constructor() { + if (config.email) { + this.transporter = nodemailer.createTransport({ + host: config.email.host, + port: config.email.port, + secure: config.email.secure, + auth: config.email.auth + }); + } + } + + /** + * 发送邮件通知 + * @param subject 邮件主题 + * @param content 邮件内容 + * @param isError 是否为错误通知 + */ + async sendEmailNotification( + subject: string, + content: string, + isError = false + ): Promise { + if (!this.transporter || !config.email) { + console.log('邮件通知未配置,跳过发送'); + return; + } + + try { + const html = ` + + + + + + +
+

${isError ? '❌' : '✅'} ${subject}

+
+
+
${content}
+
+ + + + `; + + await this.transporter.sendMail({ + from: config.email.from, + to: config.email.to, + subject: `[DMS-UI] ${subject}`, + html + }); + + console.log('邮件通知发送成功'); + } catch (error: any) { + console.error('邮件通知发送失败:', error.message); + // 不抛出错误,避免影响主流程 + } + } +} diff --git a/scripts/cli/dms-kit-publish/src/services/validator.ts b/scripts/cli/dms-kit-publish/src/services/validator.ts new file mode 100644 index 000000000..756b17e5f --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/services/validator.ts @@ -0,0 +1,97 @@ +import * as fs from 'fs'; +import { execa } from 'execa'; +import semver from 'semver'; +import { config } from '../config/index'; +import { ErrorCode, DeployError } from '../types/index'; +import { successLog, warnLog } from '../utils/logger'; + +/** + * 版本校验器 + * 负责验证版本号格式、递增和 CHANGELOG 一致性 + */ +export class VersionValidator { + /** + * 验证版本号格式 + * @param version 版本号 + * @returns 是否有效 + */ + validateFormat(version: string): boolean { + return semver.valid(version) !== null; + } + + /** + * 验证版本号递增 + * @param pkgName 包名 + * @param newVersion 新版本号 + * @returns 是否应该发布(版本号大于当前版本) + */ + async validateIncrement( + pkgName: string, + newVersion: string + ): Promise { + try { + console.log(config.pnpm.registry, 'config.pnpm.registry'); + const { stdout } = await execa('pnpm', [ + 'view', + pkgName, + 'version', + '--registry', + config.pnpm.registry + ]); + + const currentVersion = stdout.trim(); + + // 比较版本号 + if (semver.lt(newVersion, currentVersion)) { + throw new DeployError( + ErrorCode.VERSION_INVALID, + `新版本 ${newVersion} 必须大于当前版本 ${currentVersion}` + ); + } + + if (semver.eq(newVersion, currentVersion)) { + warnLog( + `包 ${pkgName} 版本 ${newVersion} 与已发布版本相同,将跳过发布。` + ); + return false; + } + + // 检查版本跳跃是否合理 + const diff = semver.diff(currentVersion, newVersion); + if (diff === 'major') { + warnLog(`⚠️ 检测到主版本号升级: ${currentVersion} → ${newVersion}`); + warnLog(' 请确认这是一个包含破坏性更改的版本'); + } + + successLog(`版本号校验通过: ${currentVersion} → ${newVersion}`); + return true; + } catch (error: any) { + // 如果包还未发布,跳过检查 + if (error.message && error.message.includes('404')) { + console.log(`包 ${pkgName} 首次发布`); + return true; + } + throw error; + } + } + + /** + * 验证版本号与 CHANGELOG 一致 + * @param changelogPath CHANGELOG 文件路径 + * @param version 版本号 + * @returns 是否一致 + */ + validateChangelog(changelogPath: string, version: string): boolean { + const content = fs.readFileSync(changelogPath, 'utf-8'); + const hasVersion = new RegExp(`^## ${version}`, 'm').test(content); + + if (!hasVersion) { + throw new DeployError( + ErrorCode.CHANGELOG_MISSING, + `CHANGELOG.md 中未找到版本 ${version} 的更新说明` + ); + } + + return true; + } +} diff --git a/scripts/cli/dms-kit-publish/src/types/config.ts b/scripts/cli/dms-kit-publish/src/types/config.ts new file mode 100644 index 000000000..016e0e832 --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/types/config.ts @@ -0,0 +1,34 @@ +// 环境配置接口 +export interface EnvironmentConfig { + pnpm: { + registry: string; + auth: string; + }; + ftpServer: { + host: string; + user: string; + password: string; + }; + ftpDir: string; + robotSDK: { + baseUrl: string; + }; + githubApi: { + owner: string; + repo: string; + baseUrl: string; + projectId: number; + token: string; + }; + email?: { + host: string; + port: number; + secure: boolean; + auth: { + user: string; + pass: string; + }; + from: string; + to: string[]; + }; +} diff --git a/scripts/cli/dms-kit-publish/src/types/error.ts b/scripts/cli/dms-kit-publish/src/types/error.ts new file mode 100644 index 000000000..0ab0ff9de --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/types/error.ts @@ -0,0 +1,20 @@ +// 错误代码枚举 +export enum ErrorCode { + ENV_VAR_MISSING = 'ENV_VAR_MISSING', + PKG_LOAD_FAILED = 'PKG_LOAD_FAILED', + VERSION_INVALID = 'VERSION_INVALID', + CHANGELOG_MISSING = 'CHANGELOG_MISSING', + NPM_PUBLISH_FAILED = 'NPM_PUBLISH_FAILED', + DOCS_BUILD_FAILED = 'DOCS_BUILD_FAILED', + FTP_UPLOAD_FAILED = 'FTP_UPLOAD_FAILED', + TAG_PUSH_FAILED = 'TAG_PUSH_FAILED', + NOTIFICATION_FAILED = 'NOTIFICATION_FAILED' +} + +// 部署错误类 +export class DeployError extends Error { + constructor(public code: ErrorCode, message: string, public details?: any) { + super(message); + this.name = 'DeployError'; + } +} diff --git a/scripts/cli/dms-kit-publish/src/types/index.ts b/scripts/cli/dms-kit-publish/src/types/index.ts new file mode 100644 index 000000000..08159f96b --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/types/index.ts @@ -0,0 +1,4 @@ +// 统一导出所有类型定义 +export * from './error'; +export * from './config'; +export * from './package'; diff --git a/scripts/cli/dms-kit-publish/src/types/package.ts b/scripts/cli/dms-kit-publish/src/types/package.ts new file mode 100644 index 000000000..5d614b2a2 --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/types/package.ts @@ -0,0 +1,21 @@ +// 包信息接口 +export interface PackageInfo { + name: string; + version: string; + dir: string; + distDir: string; + changelogPath: string; +} + +// 压缩文件信息接口 +export interface ZipFileInfo { + pkg: PackageInfo; + zipPath: string; +} + +// 包配置接口 +export interface PackageConfig { + dir: string; + distDir: string; + changelogPath: string; +} diff --git a/scripts/cli/dms-kit-publish/src/utils/changelog.ts b/scripts/cli/dms-kit-publish/src/utils/changelog.ts new file mode 100644 index 000000000..a420e8546 --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/utils/changelog.ts @@ -0,0 +1,42 @@ +import * as fs from 'fs'; + +/** + * 从 CHANGELOG.md 中提取指定版本的更新内容 + * @param changelogPath CHANGELOG.md 文件路径 + * @param version 版本号 + * @returns 版本的更新内容 + */ +export function getChangelogForVersion( + changelogPath: string, + version: string +): string { + try { + const changelogContent = fs.readFileSync(changelogPath, 'utf-8'); + + // 构建版本标题的正则表达式 + // 匹配 ## version 后面的内容,直到下一个 ## 或文件结尾 + const versionPattern = new RegExp( + `## ${version}(?:\\s+[^\\n]*)?\\s*\\n([\\s\\S]*?)(?=\\n## |$)`, + 'i' + ); + const match = changelogContent.match(versionPattern); + + if (match && match[1]) { + // 清理内容,移除多余的空行和缩进 + const content = match[1] + .trim() + .split('\n') + .map((line) => line.trim()) + .filter((line) => line.length > 0) + .join('\n'); + + return content; + } + + console.log(`未找到版本 ${version} 的 changelog`); + return `未找到版本 ${version} 的 changelog`; + } catch (error) { + console.error('读取 changelog.md 文件失败:', error); + return `读取 changelog.md 文件失败: ${error}`; + } +} diff --git a/scripts/cli/dms-kit-publish/src/utils/compress.ts b/scripts/cli/dms-kit-publish/src/utils/compress.ts new file mode 100644 index 000000000..5714dcab9 --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/utils/compress.ts @@ -0,0 +1,25 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import archiver from 'archiver'; + +/** + * 压缩文件夹为 zip 文件 + * @param sourceDir 源文件夹路径 + * @param outputZipPath 输出 zip 文件路径 + */ +export function compressFolder( + sourceDir: string, + outputZipPath: string +): Promise { + return new Promise((resolve, reject) => { + const archive = archiver('zip', { zlib: { level: 9 } }); + const outputStream = fs.createWriteStream(outputZipPath); + + outputStream.on('close', resolve); + outputStream.on('error', reject); + + archive.pipe(outputStream); + archive.directory(sourceDir, path.basename(sourceDir)); + archive.finalize(); + }); +} diff --git a/scripts/cli/dms-kit-publish/src/utils/logger.ts b/scripts/cli/dms-kit-publish/src/utils/logger.ts new file mode 100644 index 000000000..862cd45bf --- /dev/null +++ b/scripts/cli/dms-kit-publish/src/utils/logger.ts @@ -0,0 +1,8 @@ +import chalk from 'chalk'; + +// 日志工具函数 +export const stepLog = (msg: string) => console.log(chalk.magenta(`>> ${msg}`)); +export const successLog = (msg: string) => console.log(chalk.green(msg)); +export const errorLog = (msg: string) => console.log(chalk.red(msg)); +export const warnLog = (msg: string) => console.log(chalk.yellow(msg)); +export const infoLog = (msg: string) => console.log(chalk.cyan(msg)); diff --git a/scripts/cli/dms-kit-publish/tsconfig.json b/scripts/cli/dms-kit-publish/tsconfig.json new file mode 100644 index 000000000..af9c7a141 --- /dev/null +++ b/scripts/cli/dms-kit-publish/tsconfig.json @@ -0,0 +1,106 @@ +{ + "compilerOptions": { + /* Visit https://aka.ms/tsconfig.json to read more about this file */ + + /* Projects */ + // "incremental": true, /* Enable incremental compilation */ + // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ + // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ + // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ + // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ + // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ + + /* Language and Environment */ + "target": "ES6" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, + // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ + // "jsx": "preserve", /* Specify what JSX code is generated. */ + // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ + // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ + // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ + // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ + // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ + // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ + // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ + // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ + + /* Modules */ + "module": "CommonJS" /* Specify what module code is generated. */, + "rootDir": "./src" /* Specify the root folder within your source files. */, + "moduleResolution": "Node" /* Specify how TypeScript looks up a file from a given module specifier. */, + "baseUrl": "./" /* Specify the base directory to resolve non-relative module names. */, + // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ + // "rootDirs": [ + // "./src", + // "./package.json" + // ] /* Allow multiple folders to be treated as one when resolving modules. */, + // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ + // "types": [], /* Specify type package names to be included without being referenced in a source file. */ + // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ + "resolveJsonModule": true /* Enable importing .json files */, + // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ + + /* JavaScript Support */ + "allowJs": true /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */, + // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ + // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ + + /* Emit */ + // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ + // "declarationMap": true, /* Create sourcemaps for d.ts files. */ + // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ + "sourceMap": true /* Create source map files for emitted JavaScript files. */, + // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ + "outDir": "./dist" /* Specify an output folder for all emitted files. */, + // "removeComments": true, /* Disable emitting comments. */ + // "noEmit": true, /* Disable emitting files from a compilation. */ + // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ + // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ + // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ + // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ + // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ + // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ + // "newLine": "crlf", /* Set the newline character for emitting files. */ + // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ + // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ + // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ + // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ + // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ + // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ + + /* Interop Constraints */ + // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ + // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ + "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, + // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + + /* Type Checking */ + "strict": true /* Enable all strict type-checking options. */, + // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ + // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ + // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ + // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ + // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ + // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ + // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ + // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ + // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ + // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ + // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ + // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ + // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ + // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ + // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ + // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ + // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ + // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ + + /* Completeness */ + "skipDefaultLibCheck": true /* Skip type checking .d.ts files that are included with TypeScript. */, + "skipLibCheck": true /* Skip type checking all .d.ts files. */ + }, + "exclude": ["node_modules", "dist", "./bin"], + "include": ["./src"] +}