From 081de5e5ebc7345644baf8c4f06d85eb8a77e0a4 Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Tue, 7 Jul 2026 18:44:18 +0500 Subject: [PATCH 1/8] feat: upgrade yeoman-environment to v6 --- pnpm-lock.yaml | 1928 +++++++++++++++-- .../yeoman-ui/packages/backend/.vscodeignore | 1 + .../yeoman-ui/packages/backend/package.json | 19 +- .../packages/backend/src/replayUtils.ts | 42 +- .../packages/backend/src/utils/env.ts | 219 +- .../backend/src/utils/legacyGenerators.ts | 90 + .../packages/backend/src/utils/npm.ts | 2 +- .../packages/backend/src/yeomanui.ts | 22 +- .../packages/backend/src/youi-adapter.ts | 6 +- .../test/utils/legacyGenerators.spec.ts | 209 ++ .../packages/backend/test/yeomanui.spec.ts | 30 +- .../backend/test/youi-adapter.spec.ts | 2 +- .../yeoman-ui/packages/backend/tsconfig.json | 7 +- .../packages/backend/webpack.config.cjs | 179 +- .../packages/yeoman-env-v3/.gitignore | 2 + .../packages/yeoman-env-v3/package.json | 31 + .../packages/yeoman-env-v3/src/index.ts | 20 + .../packages/yeoman-env-v3/tsconfig.json | 16 + .../packages/yeoman-env-v3/webpack.config.cjs | 140 ++ 19 files changed, 2610 insertions(+), 355 deletions(-) create mode 100644 projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts create mode 100644 projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts create mode 100644 projects/yeoman-ui/packages/yeoman-env-v3/.gitignore create mode 100644 projects/yeoman-ui/packages/yeoman-env-v3/package.json create mode 100644 projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts create mode 100644 projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json create mode 100644 projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c355cf29..79a96d0a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -614,6 +614,12 @@ importers: '@vscode-logging/logger': specifier: 2.0.9 version: 2.0.9 + '@yeoman/adapter': + specifier: 4.0.2 + version: 4.0.2(@types/node@14.18.63) + '@yeoman/types': + specifier: 1.11.1 + version: 1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4) chalk: specifier: 4.1.2 version: 4.1.2 @@ -647,12 +653,15 @@ importers: vscode-uri: specifier: 3.1.0 version: 3.1.0 + yeoman-env-v3: + specifier: workspace:* + version: link:../yeoman-env-v3 yeoman-environment: - specifier: 3.19.3 - version: 3.19.3(@types/node@14.18.63) + specifier: 6.1.0 + version: 6.1.0(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4))(mem-fs@4.1.4) yeoman-generator: - specifier: ^4.13.0 - version: 4.13.0(encoding@0.1.13) + specifier: 8.2.2 + version: 8.2.2(@types/node@14.18.63)(@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4))(mem-fs@4.1.4) devDependencies: '@types/cheerio': specifier: ^0.22.31 @@ -684,12 +693,6 @@ importers: '@types/ws': specifier: ^8.5.14 version: 8.18.1 - '@types/yeoman-environment': - specifier: ^2.10.3 - version: 2.10.11(mem-fs@4.1.4) - '@types/yeoman-generator': - specifier: 5.2.14 - version: 5.2.14(mem-fs@4.1.4) '@vscode/vsce': specifier: 2.24.0 version: 2.24.0 @@ -860,6 +863,31 @@ importers: specifier: 0.25.5 version: 0.25.5 + projects/yeoman-ui/packages/yeoman-env-v3: + dependencies: + yeoman-environment: + specifier: 3.19.3 + version: 3.19.3(@types/node@25.9.1) + devDependencies: + null-loader: + specifier: 4.0.1 + version: 4.0.1(webpack@5.106.2) + shx: + specifier: 0.3.4 + version: 0.3.4 + string-replace-loader: + specifier: 3.0.3 + version: 3.0.3(webpack@5.106.2) + ts-loader: + specifier: 9.6.2 + version: 9.6.2(loader-utils@2.0.4)(typescript@5.7.3)(webpack@5.106.2) + webpack: + specifier: 5.106.2 + version: 5.106.2(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.106.2) + packages: '@asamuzakjp/css-color@3.2.0': @@ -2002,6 +2030,10 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@gar/promise-retry@1.0.3': + resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} + engines: {node: ^20.17.0 || >=22.9.0} + '@gar/promisify@1.1.3': resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} @@ -2018,6 +2050,55 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@inquirer/ansi@2.0.7': + resolution: {integrity: sha512-3eTuUO1vH2cZm2ZKHeQxnOqlTi9EfZDGgIe3BL3I4u+rJHocr9Fz86M4fjYABPvFnQG/gGK551HqDiIcETwU6Q==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/checkbox@5.2.1': + resolution: {integrity: sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/confirm@6.1.1': + resolution: {integrity: sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/core@11.2.1': + resolution: {integrity: sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/editor@5.2.2': + resolution: {integrity: sha512-ZRVd/oD+sYsUd5zVm0NflqEzlqfYCyHNsqkHl2oWXEUHs12tCbcSFi+wVFEvD8+LGRaMUsVrE7qeo6lSG/S1Vg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/expand@5.1.1': + resolution: {integrity: sha512-YmQpenjbFSHAK3sOd44puHh3V1KXXr+JiNpUztoSQ4drLh2rTVzTap/YtlAVu/5xavifIlBfNEzJ/neZJ1a/1g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@inquirer/external-editor@1.0.3': resolution: {integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==} engines: {node: '>=18'} @@ -2027,10 +2108,99 @@ packages: '@types/node': optional: true + '@inquirer/external-editor@3.0.3': + resolution: {integrity: sha512-6thf5I8q7lZwzGLAxPaaGEREEkZ3nyePPDQ1oyobblxmEE8mqTLguScP7pDjUTAibiyb4hfXl+qjUEJ+di/aNA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/figures@2.0.7': + resolution: {integrity: sha512-aJ8TBPOGB6f/2qziPfElISTCEd5XOYTFckA2SGjhNmiKzfK/u4ot3v0DUzGVdUnKjN10EqnnEPck36BkyfLnJw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + + '@inquirer/input@5.1.2': + resolution: {integrity: sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/number@4.1.1': + resolution: {integrity: sha512-XF4IXAbPnGPgw0wsbC/i2tPcyfdZgDpUlhsqU0SfT4IRIGWha6Xm9VRgN5yYxJq+jnyXlfXI/nQ3ulfk0iEICA==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/password@5.1.1': + resolution: {integrity: sha512-3XBfF7DAsp5qeDsvN5Rd1HmbNokVvEQoUM0QLrRcybC9nX96w3Pbmu7qUsb3IT3J3jBvs2+mTXaKHOUsgHMLzg==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/prompts@8.5.2': + resolution: {integrity: sha512-IYR/3C/paEVVQYQvdDlFZVjRCJVYHHON0XXMH91KO9GSxs0TdKYWlUdvfQl2EfAHDxUaN3IBffkE/BDTh5nJ6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/rawlist@5.3.1': + resolution: {integrity: sha512-QqdTqQddL3qPX/PPrjobpsO25NZ4dWXgTLenrR445L2ptLEYE6Z+PD5c5CNDJNx4ugRgELAIpSIJxZaO2jJ2Og==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/search@4.2.1': + resolution: {integrity: sha512-xJj8QWKRSrfKoBIITLZK61dD3zwo0Rz11fgDImku30/Oe81zMdIdGgrLY2h6RkJ+KZ/GhNYIRMKnH/62qBTA5g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/select@5.2.1': + resolution: {integrity: sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + + '@inquirer/type@4.0.7': + resolution: {integrity: sha512-t28inv14nMQ1PhKpsJPY+kEs/c00qzeCOS2gTNRyTjG5d6qsVA2fItxW4hkvGZ5lvanGLdtCzVIx5dwdRpN1+g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^20.17.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@isaacs/string-locale-compare@1.1.0': resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} @@ -2244,11 +2414,20 @@ packages: resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} engines: {node: ^16.14.0 || >=18.0.0} + '@npmcli/agent@4.0.2': + resolution: {integrity: sha512-EUEuWAxnL07Sp5/iC/1X6Xj+XThUvnbei9zfRWZdEXa7lss9RTHMhAHBeg+MZ5To9s/gGaSI+UwZTPdYMvKSeg==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/arborist@4.3.1': resolution: {integrity: sha512-yMRgZVDpwWjplorzt9SFSaakWx6QIK248Nw4ZFgkrAy/GvJaFRaSZzE6nD7JBK5r8g/+PTxFq5Wj/sfciE7x+A==} engines: {node: ^12.13.0 || ^14.15.0 || >=16} hasBin: true + '@npmcli/arborist@9.9.0': + resolution: {integrity: sha512-tzsb1R8mx0k0drlLDT/9ckEYaQHIaWnUti/ci2IaFoQqdqwfmYrc+90p1+QEZC/ocvqcxBep9P1xKw4FbAGofw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + '@npmcli/fs@1.1.1': resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} @@ -2260,22 +2439,43 @@ packages: resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + '@npmcli/fs@5.0.0': + resolution: {integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/git@2.1.0': resolution: {integrity: sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==} + '@npmcli/git@7.0.2': + resolution: {integrity: sha512-oeolHDjExNAJAnlYP2qzNjMX/Xi9bmu78C9dIGr4xjobrSKbuMYCph8lTzn4vnW3NjIqVmw/f8BCfouqyJXlRg==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/installed-package-contents@1.0.7': resolution: {integrity: sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==} engines: {node: '>= 10'} hasBin: true + '@npmcli/installed-package-contents@4.0.0': + resolution: {integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + '@npmcli/map-workspaces@2.0.4': resolution: {integrity: sha512-bMo0aAfwhVwqoVM5UzX1DJnlvVvzDCHae821jv48L1EsrYwfOZChlqWYXEtto/+BkBXetPbEWgau++/brh4oVg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + '@npmcli/map-workspaces@5.0.3': + resolution: {integrity: sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/metavuln-calculator@2.0.0': resolution: {integrity: sha512-VVW+JhWCKRwCTE+0xvD6p3uV4WpqocNYYtzyvenqL/u1Q3Xx6fGTJ+6UoIoii07fbuEO9U3IIyuGY0CYHDv1sg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16} + '@npmcli/metavuln-calculator@9.0.3': + resolution: {integrity: sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/move-file@1.1.2': resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} engines: {node: '>=10'} @@ -2289,15 +2489,43 @@ packages: '@npmcli/name-from-folder@1.0.1': resolution: {integrity: sha512-qq3oEfcLFwNfEYOQ8HLimRGKlD8WSeGEdtUa7hmzpR8Sa7haL1KVQrvgO6wqMjhWFFVjgtrh1gIxDz+P8sjUaA==} + '@npmcli/name-from-folder@4.0.0': + resolution: {integrity: sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/node-gyp@1.0.3': resolution: {integrity: sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==} + '@npmcli/node-gyp@5.0.0': + resolution: {integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/package-json@1.0.1': resolution: {integrity: sha512-y6jnu76E9C23osz8gEMBayZmaZ69vFOIk8vR1FJL/wbEJ54+9aVG9rLTjQKSXfgYZEr50nw1txBBFfBZZe+bYg==} + '@npmcli/package-json@7.0.5': + resolution: {integrity: sha512-iVuTlG3ORq2iaVa1IWUxAO/jIp77tUKBhoMjuzYW2kL4MLN1bi/ofqkZ7D7OOwh8coAx1/S2ge0rMdGv8sLSOQ==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/promise-spawn@1.3.2': resolution: {integrity: sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==} + '@npmcli/promise-spawn@9.0.1': + resolution: {integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/query@5.0.0': + resolution: {integrity: sha512-8TZWfTQOsODpLqo9SVhVjHovmKXNpevHU0gO9e+y4V4fRIOneiXy0u0sMP9LmS71XivrEWfZWg50ReH4WRT4aQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/redact@4.0.0': + resolution: {integrity: sha512-gOBg5YHMfZy+TfHArfVogwgfBeQnKbbGo3pSUyK/gSI0AVu+pEiDVcKlQb0D8Mg1LNRZILZ6XG8I5dJ4KuAd9Q==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@npmcli/run-script@10.0.4': + resolution: {integrity: sha512-mGUWr1uMnf0le2TwfOZY4SFxZGXGfm4Jtay/nwAa2FLNAKXUoUwaGwBMNH36UHPtinWfTSJ3nqFQr0091CxVGg==} + engines: {node: ^20.17.0 || >=22.9.0} + '@npmcli/run-script@2.0.0': resolution: {integrity: sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==} @@ -2455,6 +2683,18 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@3.0.3': + resolution: {integrity: sha512-//0sR/cow/s4ICQaYoAobOl4aU8cjU6x/V24V7XkKotb9+O+3zySIYp146vpaobYHnxa4pZX8NkV54Z5AwbDKA==} + engines: {node: '>=12'} + '@sap-devx/feature-toggle-node@2.0.3': resolution: {integrity: sha512-OxdJigAFybeZH9Uxm14EXp0NAb+pWzU4U0CvttJgmrRx+NL1loL0/o8gb/Vqk8wHAtNTqXjhz7GvLZ4tfDjUrA==} engines: {node: '>=14.21.2'} @@ -2528,6 +2768,9 @@ packages: '@sap_oss/task_contrib_types@3.1.0': resolution: {integrity: sha512-kqGkb8hNCbqv05qY37peOtQFsjRoSbJvwTi+PAAkzfUrGEmKinJWXAVqGIoPKM1KYCSNWDEpSU7uEjoYXykrJg==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + '@secretlint/config-creator@10.1.1': resolution: {integrity: sha512-TJ42CHZqqnEe9ORvIXVVMqdu3KAtyZRxLspjFexo6XgrwJ6CoFHQYzIihilqRjo2sJh9HMrpnYSj/5hopofGrA==} engines: {node: '>=20.0.0'} @@ -2573,6 +2816,30 @@ packages: resolution: {integrity: sha512-/JGAvVkurVHkargk3AC7UxRy+Ymc+52AVBO/fZA5pShuLW2dX4O/rKc4n8cyhQiOb/3ym5ACSlLQuQ8apPfxrQ==} engines: {node: '>=20.0.0'} + '@sigstore/bundle@4.0.0': + resolution: {integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/core@3.2.1': + resolution: {integrity: sha512-qRsxPnCrbC/puegGxKuynfnxgLiHqWStrSjxkoB4YKqq3Z3s4cyZyj42ZdWFAEblNP65C+rBH8EuREHIXoi83g==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/protobuf-specs@0.5.1': + resolution: {integrity: sha512-/ScWUhhoFasJsSRGTVBwId1loQjjnjAfE4djL6ZhrXRpNCmPTnUKF5Jokd58ILseOMjzET3UrMOtJPS9sYeI0g==} + engines: {node: ^18.17.0 || >=20.5.0} + + '@sigstore/sign@4.1.1': + resolution: {integrity: sha512-Hf4xglukg0XXQ2RiD5vSoLjdPe8OBUPA8XeVjUObheuDcWdYWrnH/BNmxZCzkAy68MzmNCxXLeurJvs6hcP2OQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/tuf@4.0.2': + resolution: {integrity: sha512-TCAzTy0xzdP79EnxSjq9KQ3eaR7+FmudLC6eRKknVKZbV7ZNlGLClAAQb/HMNJ5n2OBNk2GT1tEmU0xuPr+SLQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + '@sigstore/verify@3.1.1': + resolution: {integrity: sha512-qv7+G3J2cc6wwFj3yKvXOamzqhMwSk1ogPGmhpS8iXllcPrJaIIBA+4HbttlHVu1pqWTdmaCH/WE7UOC51kdoA==} + engines: {node: ^20.17.0 || >=22.9.0} + '@simple-git/args-pathspec@1.0.3': resolution: {integrity: sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==} @@ -2586,6 +2853,10 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@sinonjs/commons@1.8.6': resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} @@ -2657,6 +2928,14 @@ packages: '@tsconfig/node16@1.0.4': resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + '@tufjs/canonical-json@2.0.0': + resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@tufjs/models@4.1.0': + resolution: {integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww==} + engines: {node: ^20.17.0 || >=22.9.0} + '@types/aws-lambda@8.10.147': resolution: {integrity: sha512-nD0Z9fNIZcxYX5Mai2CTmFD7wX7UldCkW2ezCF8D1T5hdiLsnTWDGRpfRYntU6VjTdLQjOvyszru7I1c1oCQew==} @@ -2706,10 +2985,6 @@ packages: '@types/deep-equal-in-any-order@1.0.4': resolution: {integrity: sha512-nkgl+KTkRWeybgMSBCrWrc1YHFrLADVxZ6Kllj40p9U499NGsCrFUjzgHgQY+Upsa/VWOc3YlsFEvhg+drUmkA==} - '@types/diff@8.0.0': - resolution: {integrity: sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw==} - deprecated: This is a stub types definition. diff provides its own type definitions, so you do not need this installed. - '@types/ejs@3.1.5': resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} @@ -2755,9 +3030,6 @@ packages: '@types/inquirer@7.3.3': resolution: {integrity: sha512-HhxyLejTHMfohAuhRun4csWigAMjXTmRyiJTU1Y/I1xmggikFMkOUoMQRlFm+zQcPEGHSs3io/0FAmNZf8EymQ==} - '@types/inquirer@8.2.13': - resolution: {integrity: sha512-shSvl3mn4Z8AK627kA1vx8PYkyH6CdIjV5NYYj7a0xIxzmG3ZgzEpzCi3CWfktjAlq+0Z0wHJGtWNiACaYpeOg==} - '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -2785,20 +3057,15 @@ packages: '@types/keyv@3.1.4': resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + '@types/lodash@4.14.177': resolution: {integrity: sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw==} '@types/lodash@4.14.202': resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} - '@types/mem-fs-editor@10.0.1': - resolution: {integrity: sha512-x8YRuVyEsp7AwHXwnOwjsroItyadmXHi3qglNHbzdCr/X9ofOn4IcTZl6RHEKtBJcYXK6KzX2N98kNVhUefbSA==} - deprecated: This is a stub types definition. mem-fs-editor provides its own type definitions, so you do not need this installed. - - '@types/mem-fs@2.2.0': - resolution: {integrity: sha512-G7D5J0wx7jMJ5dBMDFYcbE/VXol/51o/vpJu3DqRk1R7SrZYtzhDMf1eFoG8A/HOTM7EAbov/euJkULhwvLK1Q==} - deprecated: This is a stub types definition. mem-fs provides its own type definitions, so you do not need this installed. - '@types/mime@1.3.2': resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} @@ -2914,9 +3181,6 @@ packages: '@types/strip-json-comments@0.0.30': resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} - '@types/text-table@0.2.5': - resolution: {integrity: sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==} - '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -2962,12 +3226,6 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} - '@types/yeoman-environment@2.10.11': - resolution: {integrity: sha512-kIDgoiuPnL9HGHwa2t6h4FiUgYFb411/okY0nKhRKw+IMsRxMOWzQUFhZ/CKQvwXvKoCjFTj+MZI2KXAKxVmug==} - - '@types/yeoman-generator@5.2.14': - resolution: {integrity: sha512-eIYBqQyURXiAaoU6jvJqMI+tNSG4s7EXtcHucLCgb8EV2vqz4x1WPr91MT0MiWHV8+9dDRrMkc1VZ6LduexuyA==} - '@typescript-eslint/eslint-plugin@8.60.1': resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3290,6 +3548,41 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + '@yeoman/adapter@4.0.2': + resolution: {integrity: sha512-4uttbNuZ/guMBRhf7R6TCfnLT6XY1HGpxsq6vpHRM3AVr5G6Qz7xXqxG2kdMzBGtIuH5CkXz0k/Byl27GsvIkg==} + engines: {node: 20 || >=22} + + '@yeoman/conflicter@4.1.0': + resolution: {integrity: sha512-Py62rJdWHf1zMpf801Ql7kg+sbUeVmvfmZf++mgA1SOk/uByLIfcXUMDzQPSHkW4Y7I2yVWLKZATRGjoczXVFQ==} + engines: {node: 20 || >=22} + peerDependencies: + '@types/node': '>=20.14.8' + '@yeoman/types': ^1.0.0 + mem-fs: ^4.0.0 + + '@yeoman/namespace@2.1.0': + resolution: {integrity: sha512-/BxsZlALPRp34juAzzh9QUr2hR9w9o+dBSw8sF/iv7NfUU/A/QI0xOyVtQJz2uCPuvtY6nkGDxYxZoKI/lnFQg==} + engines: {node: ^16.13.0 || >=18.12.0} + + '@yeoman/transform@2.1.2': + resolution: {integrity: sha512-LdPNm5Moc+Z8l2YeQ0IzsybXoV531o7RmGJB8lpFr8SjtqqGkT2bZYlS1LftPpCcPJ//yE0MbI/fPGh1WWlabg==} + engines: {node: '>=18.19.0'} + peerDependencies: + '@types/node': '>=18.19.44' + + '@yeoman/types@1.11.1': + resolution: {integrity: sha512-27CI5hHQAHfq8ohYILmLNzClbdzBJzu+ny9AzUVV6naJO0l4/+t+67QDKlwQvt+TW3oE5j74I/Mh4Kn14rsVXA==} + engines: {node: ^16.13.0 || >=18.12.0} + peerDependencies: + '@types/node': '>=16.18.26' + '@yeoman/adapter': ^1.6.0 || ^2.0.0-beta.0 || ^3.0.0 || ^4.0.0 + mem-fs: ^3.0.0 || ^4.0.0-beta.1 + peerDependenciesMeta: + '@yeoman/adapter': + optional: true + mem-fs: + optional: true + JSONStream@1.3.5: resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} hasBin: true @@ -3305,6 +3598,10 @@ packages: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@4.0.0: + resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==} + engines: {node: ^20.17.0 || >=22.9.0} + abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -3428,10 +3725,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - ansi-regex@6.2.2: resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} engines: {node: '>=12'} @@ -3588,6 +3881,10 @@ packages: resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} engines: {node: '>=8'} + arrify@3.0.0: + resolution: {integrity: sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==} + engines: {node: '>=12'} + asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -3765,10 +4062,18 @@ packages: resolution: {integrity: sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + bin-links@6.0.2: + resolution: {integrity: sha512-frE1t78WOwJ45PKV2cF2tNPjTcs9L1J9s6VkrV59wanRP4GlaomuxYPVma7BwthMg8WnfSory4w5PTE6FZZ81w==} + engines: {node: ^20.17.0 || >=22.9.0} + binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} + binary-extensions@3.1.0: + resolution: {integrity: sha512-Jvvd9hy1w+xUad8+ckQsWA/V1AoyubOvqn0aygjMOVM4BfIaRav1NFS3LsTSDaV4n4FtcCtQXvzep1E6MboqwQ==} + engines: {node: '>=18.20'} + binary@0.3.0: resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} @@ -3916,6 +4221,10 @@ packages: resolution: {integrity: sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==} engines: {node: ^16.14.0 || >=18.0.0} + cacache@20.0.4: + resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} + engines: {node: ^20.17.0 || >=22.9.0} + cache-base@1.0.1: resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==} engines: {node: '>=0.10.0'} @@ -4013,6 +4322,10 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@5.6.2: + resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -4051,6 +4364,10 @@ packages: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + chrome-trace-event@1.0.3: resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} engines: {node: '>=6.0'} @@ -4074,10 +4391,18 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-spinners@3.4.0: + resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} + engines: {node: '>=18.20'} + cli-table@0.3.11: resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} engines: {node: '>= 0.2.0'} @@ -4090,6 +4415,10 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -4130,6 +4459,10 @@ packages: resolution: {integrity: sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + cmd-shim@8.0.0: + resolution: {integrity: sha512-Jk/BK6NCapZ58BKUxlSI+ouKRbjH1NLZCgJkYoab+vEHUY3f6OzpNBN9u7HFSv9J6TRDGs4PLOHezoKGaFRSCA==} + engines: {node: ^20.17.0 || >=22.9.0} + co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -4200,6 +4533,10 @@ packages: resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} engines: {node: '>=18'} + commander@14.0.3: + resolution: {integrity: sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -4215,10 +4552,6 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} - comment-json@4.1.0: resolution: {integrity: sha512-WEghmVYaNq9NlWbrkzQTSsya9ycLyxJxpTQfZEan6a5Jomnjw18zS3Podf8q1Zf9BvonvQd/+Z7Z39L7KKzzdQ==} engines: {node: '>= 6'} @@ -4230,6 +4563,10 @@ packages: common-ancestor-path@1.0.1: resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + common-ancestor-path@2.0.0: + resolution: {integrity: sha512-dnN3ibLeoRf2HNC+OlCiNc5d2zxbLJXOtiZUudNFSXZrNSydxcCsSpRzXwfu7BBWCIfHPw+xTayeBvJCP/D8Ng==} + engines: {node: '>= 18'} + commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -4504,6 +4841,10 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dateformat@5.0.3: + resolution: {integrity: sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA==} + engines: {node: '>=12.20'} + debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4944,6 +5285,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + envinfo@7.14.0: resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} engines: {node: '>=4'} @@ -5221,6 +5566,9 @@ packages: eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + eventemitter3@5.0.4: + resolution: {integrity: sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==} + events-universal@1.0.1: resolution: {integrity: sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==} @@ -5240,6 +5588,10 @@ packages: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@9.6.1: + resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} + engines: {node: ^18.19.0 || >=20.5.0} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -5260,6 +5612,9 @@ packages: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + exponential-backoff@3.1.3: + resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + express@4.22.1: resolution: {integrity: sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==} engines: {node: '>= 0.10.0'} @@ -5338,9 +5693,18 @@ packages: fast-safe-stringify@2.1.1: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + fast-string-truncated-width@3.0.3: + resolution: {integrity: sha512-0jjjIEL6+0jag3l2XWWizO64/aZVtpiGE3t0Zgqxv0DPuxiMjvB3M24fCyhZUO4KomJQPj3LTSUnDP3GpdwC0g==} + + fast-string-width@3.0.2: + resolution: {integrity: sha512-gX8LrtNEI5hq8DVUfRQMbr5lpaS4nMIWV+7XEbXk2b8kiQIizgnlr12B4dA3ZEx3308ze0O4Q1R+cHts8kyUJg==} + fast-uri@3.1.2: resolution: {integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==} + fast-wrap-ansi@0.2.2: + resolution: {integrity: sha512-7F2Fl+TjRSenLqlU3UjSH0iyqopqoZIu7eZVpEirP2g1GtWa2G/ecEmBdgz31+Mxr+ELclgg6sokpSFIQiZ02Q==} + fastest-levenshtein@1.0.12: resolution: {integrity: sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==} @@ -5369,6 +5733,10 @@ packages: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -5403,6 +5771,10 @@ packages: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} + find-up-simple@1.0.1: + resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} + engines: {node: '>=18'} + find-up@1.1.2: resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} engines: {node: '>=0.10.0'} @@ -5445,6 +5817,10 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} + fly-import@1.0.0: + resolution: {integrity: sha512-JZEaXZw9QR+DRMClMVJYeY5SNn8zzHBuc+KTreFGDBghRXzCiGR9aDgYGP7O/EeoxwHBZ2Brl+2ixlH/Jmt/qg==} + engines: {node: ^20.17.0 || >=22.9.0} + fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -5615,6 +5991,10 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-east-asian-width@1.6.0: + resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==} + engines: {node: '>=18'} + get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -5657,6 +6037,10 @@ packages: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -5768,6 +6152,10 @@ packages: resolution: {integrity: sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==} engines: {node: '>=18'} + globby@16.2.1: + resolution: {integrity: sha512-JmsqJalahxxgW8V2ecSQ2G7UjPlI9cpKdrkG9KoNiXhd/YslXOTEB0cViENWUznuovIuNT+FkMbraDGjr4FCUg==} + engines: {node: '>=20'} + globby@8.0.2: resolution: {integrity: sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==} engines: {node: '>=4'} @@ -5784,6 +6172,9 @@ packages: resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} engines: {node: '>=4'} + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -5911,6 +6302,10 @@ packages: resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@9.0.3: + resolution: {integrity: sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg==} + engines: {node: ^20.17.0 || >=22.9.0} + html-encoding-sniffer@2.0.1: resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} engines: {node: '>=10'} @@ -6000,6 +6395,10 @@ packages: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@8.0.1: + resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} + engines: {node: '>=18.18.0'} + humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} @@ -6031,6 +6430,10 @@ packages: resolution: {integrity: sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==} engines: {node: '>=10'} + ignore-walk@8.0.0: + resolution: {integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A==} + engines: {node: ^20.17.0 || >=22.9.0} + ignore@3.3.10: resolution: {integrity: sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==} @@ -6099,6 +6502,10 @@ packages: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + index-to-position@1.2.0: + resolution: {integrity: sha512-Yg7+ztRkqslMAS2iFaU+Oa4KTSidr63OsFGlOrJoW981kIYO3CGCS3wA95P1mUi/IVSJkn0D479KTJpVpvFNuw==} + engines: {node: '>=18'} + infer-owner@1.0.4: resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} @@ -6116,6 +6523,23 @@ packages: resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ini@5.0.0: + resolution: {integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==} + engines: {node: ^18.17.0 || >=20.5.0} + + ini@6.0.0: + resolution: {integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ==} + engines: {node: ^20.17.0 || >=22.9.0} + + inquirer@13.4.3: + resolution: {integrity: sha512-EPd3IqieHSavSOXh+LZhrIkdQcOELWeRblLT6kslQr+cF9XTh/HxZdSt1YkHH1iq4dvqBnV42uwg2YlorgOy6g==} + engines: {node: '>=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0'} + peerDependencies: + '@types/node': '>=18' + peerDependenciesMeta: + '@types/node': + optional: true + inquirer@7.3.3: resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} engines: {node: '>=8.0.0'} @@ -6262,6 +6686,10 @@ packages: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} @@ -6300,6 +6728,10 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + is-plain-obj@1.1.0: resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} engines: {node: '>=0.10.0'} @@ -6312,6 +6744,10 @@ packages: resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} engines: {node: '>=10'} + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + is-plain-object@2.0.4: resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} engines: {node: '>=0.10.0'} @@ -6359,6 +6795,10 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -6386,6 +6826,10 @@ packages: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} @@ -6430,6 +6874,10 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isexe@4.0.0: + resolution: {integrity: sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==} + engines: {node: '>=20'} + isobject@2.1.0: resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==} engines: {node: '>=0.10.0'} @@ -6874,6 +7322,10 @@ packages: resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-parse-even-better-errors@5.0.0: + resolution: {integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ==} + engines: {node: ^20.17.0 || >=22.9.0} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -6896,11 +7348,6 @@ packages: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true - json5@2.2.0: - resolution: {integrity: sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==} - engines: {node: '>=6'} - hasBin: true - json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -6936,6 +7383,9 @@ packages: just-diff@5.2.0: resolution: {integrity: sha512-6ufhP9SHjb7jibNFrNxyFZ6od3g+An6Ai9mhGRvcYe8UJlH0prseN64M+6ZBBUoKYHZsitDP42gAJ8+eVWr3lw==} + just-diff@6.0.2: + resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} + just-extend@6.2.0: resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} @@ -7002,6 +7452,14 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + ky@1.14.3: + resolution: {integrity: sha512-9zy9lkjac+TR1c2tG+mkNSVlyOpInnWdSMiue4F+kq8TwJSgv6o8jhLRg8Ho6SnZ9wOYUq/yozts9qQCfk7bIw==} + engines: {node: '>=18'} + + latest-version@9.0.0: + resolution: {integrity: sha512-7W0vV3rqv5tokqkBAFV1LbR7HPOWzXQDpDgEuib/aJ1jsZZx6x3c2mBI+TJhJzOhkGeaLbCKEHXEXLfirtG2JA==} + engines: {node: '>=18'} + lazy-cache@2.0.2: resolution: {integrity: sha512-7vp2Acd2+Kz4XkzxGxaB1FWOi8KjWIWsgdfD5MCb86DWvlLqhRPM+d6Pro3iNEL5VT9mstz5hKAlcd+QR6H3aA==} engines: {node: '>=0.10.0'} @@ -7104,6 +7562,13 @@ packages: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + locate-path@8.0.0: + resolution: {integrity: sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg==} + engines: {node: '>=20'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + lodash.camelcase@4.3.0: resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} @@ -7186,6 +7651,10 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + log-update@4.0.0: resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==} engines: {node: '>=10'} @@ -7220,6 +7689,10 @@ packages: resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} engines: {node: 20 || >=22} + lru-cache@11.5.1: + resolution: {integrity: sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==} + engines: {node: 20 || >=22} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -7253,6 +7726,10 @@ packages: resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} engines: {node: ^16.14.0 || >=18.0.0} + make-fetch-happen@15.0.6: + resolution: {integrity: sha512-Je0fLJ0F5atA7F+eIlLzk+Wkcl57JDf4kf+EW8xiP5E31xOQxkIxTbgf1Oi1Lw9tRI9UEMRdI5Vz2xTzoNU1Jw==} + engines: {node: ^20.17.0 || >=22.9.0} + make-fetch-happen@9.1.0: resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} engines: {node: '>= 10'} @@ -7442,6 +7919,10 @@ packages: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -7491,6 +7972,10 @@ packages: resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@5.0.2: + resolution: {integrity: sha512-2d0q2a8eCi2IRg/IGubCNRJoYbA1+YPXAzQVRFmB45gdGZafyivnZ5YSEfo3JikbjGxOdntGFvBQGqaSMXlAFQ==} + engines: {node: ^20.17.0 || >=22.9.0} + minipass-flush@1.0.7: resolution: {integrity: sha512-TbqTz9cUwWyHS2Dy89P3ocAGUGxKjjLuR9z8w4WUTGAVgEj17/4nhgo2Du56i0Fm3Pm30g4iA8Lcqctc76jCzA==} engines: {node: '>= 8'} @@ -7506,7 +7991,11 @@ packages: resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} engines: {node: '>=8'} - minipass@3.3.6: + minipass-sized@2.0.0: + resolution: {integrity: sha512-zSsHhto5BcUVM2m1LurnXY6M//cGhVaegT71OfOXoprxT6o780GZd792ea6FfrQkuU4usHZIUczAQMRUE2plzA==} + engines: {node: '>=8'} + + minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} @@ -7526,6 +8015,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} engines: {node: '>=0.10.0'} @@ -7602,6 +8095,10 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@3.0.0: + resolution: {integrity: sha512-dkEJPVvun4FryqBmZ5KhDo0K9iDXAwn08tMLDinNdRBNPcYEDiWYysLcc6k3mjTMlbP9KyylvRpd4wFtwrT9rw==} + engines: {node: ^20.17.0 || >=22.9.0} + nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7621,6 +8118,10 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: {integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==} + engines: {node: '>= 0.6'} + neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} @@ -7665,6 +8166,11 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-gyp@12.4.0: + resolution: {integrity: sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + node-gyp@8.4.1: resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} engines: {node: '>= 10.12.0'} @@ -7703,6 +8209,11 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} hasBin: true + nopt@9.0.0: + resolution: {integrity: sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -7710,6 +8221,10 @@ packages: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} + normalize-package-data@8.0.0: + resolution: {integrity: sha512-RWk+PI433eESQ7ounYxIp67CYuVsS1uYSonX3kA6ps/3LWfjVQa/ptEg6Y3T6uAMq1mWpX9PQ+qx+QaHpsc7gQ==} + engines: {node: ^20.17.0 || >=22.9.0} + normalize-path@2.1.1: resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} engines: {node: '>=0.10.0'} @@ -7725,10 +8240,18 @@ packages: npm-bundled@1.1.2: resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + npm-bundled@5.0.0: + resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-install-checks@4.0.0: resolution: {integrity: sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==} engines: {node: '>=10'} + npm-install-checks@8.0.0: + resolution: {integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-normalize-package-bin@1.0.1: resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} @@ -7736,19 +8259,35 @@ packages: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-normalize-package-bin@5.0.0: + resolution: {integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-package-arg@11.0.3: resolution: {integrity: sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw==} engines: {node: ^16.14.0 || >=18.0.0} + npm-package-arg@13.0.2: + resolution: {integrity: sha512-IciCE3SY3uE84Ld8WZU23gAPPV9rIYod4F+rc+vJ7h7cwAJt9Vk6TVsK60ry7Uj3SRS3bqRRIGuTp9YVlk6WNA==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-package-arg@8.1.5: resolution: {integrity: sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==} engines: {node: '>=10'} + npm-packlist@10.0.4: + resolution: {integrity: sha512-uMW73iajD8hiH4ZBxEV3HC+eTnppIqwakjOYuvgddnalIw2lJguKviK1pcUJDlIWm1wSJkchpDZDSVVsZEYRng==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-packlist@3.0.0: resolution: {integrity: sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==} engines: {node: '>=10'} hasBin: true + npm-pick-manifest@11.0.3: + resolution: {integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-pick-manifest@6.1.1: resolution: {integrity: sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==} @@ -7760,6 +8299,10 @@ packages: resolution: {integrity: sha512-PQCELXKt8Azvxnt5Y85GseQDJJlglTFM9L9U9gkv2y4e9s0k3GVDdOx3YoB6gm2Do0hlkzC39iCGXby+Wve1Bw==} engines: {node: ^16.14.0 || >=18.0.0} + npm-registry-fetch@19.1.1: + resolution: {integrity: sha512-TakBap6OM1w0H73VZVDf44iFXsOS3h+L4wVMXmbWOQroZgFhMch0juN6XSzBNlD965yIKvWg2dfu7NSiaYLxtw==} + engines: {node: ^20.17.0 || >=22.9.0} + npm-run-all2@5.0.2: resolution: {integrity: sha512-S2G6FWZ3pNWAAKm2PFSOtEAG/N+XO/kz3+9l6V91IY+Y3XFSt7Lp7DV92KCgEboEW0hRTu0vFaMe4zXDZYaOyA==} engines: {node: '>= 10'} @@ -7773,6 +8316,10 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. @@ -7789,6 +8336,12 @@ packages: resolution: {integrity: sha512-j8ZNHg19TyIQOWCGeeQJBuu6xZYIEurf8M1Qsfd8mFrGEfIZytbw18YjKWg+LcO25NowXGZXZpKAx+Ui3TFfDw==} engines: {node: '>=0.10.0'} + null-loader@4.0.1: + resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} + engines: {node: '>= 10.13.0'} + peerDependencies: + webpack: ^4.0.0 || ^5.0.0 + nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} @@ -7866,6 +8419,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + open@10.1.2: resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} engines: {node: '>=18'} @@ -7886,6 +8443,10 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + ora@9.4.1: + resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} + engines: {node: '>=20'} + os-homedir@1.0.2: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} @@ -7965,14 +8526,34 @@ packages: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} + p-queue@8.1.1: + resolution: {integrity: sha512-aNZ+VfjobsWryoiPnEApGGmf5WmNsCo9xu8dfaYamG5qaLP7ClhLN6NgsFe6SwJ2UbLEBK5dv9x8Mn5+RVhMWQ==} + engines: {node: '>=18'} + + p-queue@9.3.1: + resolution: {integrity: sha512-POWdiIPmsUPGwb4FeQ4OBg46aqmcInSWe45CKDsGHiOBiVQM9chqfQTuqhuTzcg2Vz9faTI65at0KkVyVEiCHw==} + engines: {node: '>=20'} + p-timeout@3.2.0: resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} engines: {node: '>=8'} + p-timeout@6.1.4: + resolution: {integrity: sha512-MyIV3ZA/PmyBN/ud8vV9XzwTrNtR4jFrObymZYnZqMmW0zA8Z17vnT0rBgFE/TlohB+YCHqXMgZzb3Csp49vqg==} + engines: {node: '>=14.16'} + + p-timeout@7.0.1: + resolution: {integrity: sha512-AxTM2wDGORHGEkPCt8yqxOTMgpfbEHqF51f/5fJCmwFC3C/zNcGT63SymH2ttOAaiIws2zVg4+izQCjrakcwHg==} + engines: {node: '>=20'} + p-transform@1.3.0: resolution: {integrity: sha512-UJKdSzgd3KOnXXAtqN5+/eeHcvTn1hBkesEmElVgvO/NAYcxAvmjzIGmnNd3Tb/gRAvMBdNRFD4qAWdHxY6QXg==} engines: {node: '>=12.10.0'} + p-transform@5.0.1: + resolution: {integrity: sha512-tb3/zIwbU6Z9RMDxZM3/UsyL5LpIUQj7Drq7iXWG9ilPpzyGG28EEFRRrGTsxHf3sOSOiQEiwevQH/VWtHbZfg==} + engines: {node: '>=18.19.0'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -7988,6 +8569,10 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-json@10.0.1: + resolution: {integrity: sha512-ua1L4OgXSBdsu1FPb7F3tYH0F48a6kxvod4pLUlGY9COeJAJQNX/sNH2IiEmsxw7lqYiAwrdHMjz1FctOsyDQg==} + engines: {node: '>=18'} + package-manager-detector@0.2.8: resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} @@ -7996,6 +8581,11 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16} hasBin: true + pacote@21.5.1: + resolution: {integrity: sha512-KvcJ9iy3crysCsgqc4+PknH/w6jkrp8JN36mpZBPwNaDRwTfMZD37YzRazNstiZUOhuF5pno9f78n9mEJBavwg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + paged-request@2.0.2: resolution: {integrity: sha512-NWrGqneZImDdcMU/7vMcAOo1bIi5h/pmpJqe7/jdsy85BA/s5MSaU/KlpxwW/IVPmIwBcq2uKPrBWWhEWhtxag==} engines: {node: '>=8'} @@ -8008,6 +8598,10 @@ packages: resolution: {integrity: sha512-jDbRGb00TAPFsKWCpZZOT93SxVP9nONOSgES3AevqRq/CHvavEBvKAjxX9p5Y5F0RZLxH9Ufd9+RwtCsa+lFDA==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + parse-conflict-json@5.0.1: + resolution: {integrity: sha512-ZHEmNKMq1wyJXNwLxyHnluPfRAFSIliBvbK/UiOceROt4Xh9Pz0fq49NytIaeaCUf5VR86hwQ/34FCcNU5/LKQ==} + engines: {node: ^20.17.0 || >=22.9.0} + parse-json@2.2.0: resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} engines: {node: '>=0.10.0'} @@ -8020,6 +8614,14 @@ packages: resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} engines: {node: '>=16'} + parse-json@8.3.0: + resolution: {integrity: sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ==} + engines: {node: '>=18'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-semver@1.1.1: resolution: {integrity: sha512-Eg1OuNntBMH0ojvEKSrvDSnwLmvVuUOSdylH/pSCPNMIspLlweJyIWXCE+k/5hm3cj/EBUYwmWkjhBALNP4LXQ==} @@ -8077,6 +8679,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -8134,10 +8740,6 @@ packages: resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==} engines: {node: '>=8.6'} - picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} - picomatch@4.0.4: resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} engines: {node: '>=12'} @@ -8197,6 +8799,10 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} + postcss-selector-parser@7.1.4: + resolution: {integrity: sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==} + engines: {node: '>=4'} + postcss@8.5.15: resolution: {integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==} engines: {node: ^10 || ^12 || >=14} @@ -8237,6 +8843,10 @@ packages: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} + pretty-bytes@7.1.0: + resolution: {integrity: sha512-nODzvTiYVRGRqAOvE84Vk5JDPyyxsVk0/fbA/bq7RqlnhksGpset09XTxbpvLTIjoaF7K8Z8DG8yHtKGTPSYRw==} + engines: {node: '>=20'} + pretty-format@27.5.1: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} @@ -8245,6 +8855,10 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-ms@9.3.0: + resolution: {integrity: sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==} + engines: {node: '>=18'} + pretty@2.0.0: resolution: {integrity: sha512-G9xUchgTEiNpormdYBl+Pha50gOUovT18IvAe7EYMZ1/f9W/WWMPRn+xI68yXNMUk3QXHDwo/1wV/4NejVNe1w==} engines: {node: '>=0.10.0'} @@ -8260,6 +8874,10 @@ packages: resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@6.1.0: + resolution: {integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==} + engines: {node: ^20.17.0 || >=22.9.0} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} @@ -8271,12 +8889,19 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + proggy@4.0.0: + resolution: {integrity: sha512-MbA4R+WQT76ZBm/5JUpV9yqcJt92175+Y0Bodg3HgiXzrmKu7Ggq+bpn6y6wHH+gN9NcyKn3yg1+d47VaKwNAQ==} + engines: {node: ^20.17.0 || >=22.9.0} + promise-all-reject-late@1.0.1: resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} promise-call-limit@1.0.2: resolution: {integrity: sha512-1vTUnfI2hzui8AEIixbdAJlFY4LFDXqQswy/2eOlThAscXCY4It8FdVuI0fMJGAB2aWGbdQf/gv0skKYXmdrHA==} + promise-call-limit@3.0.2: + resolution: {integrity: sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw==} + promise-inflight@1.0.1: resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} peerDependencies: @@ -8402,10 +9027,18 @@ packages: resolution: {integrity: sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + read-cmd-shim@6.0.0: + resolution: {integrity: sha512-1zM5HuOfagXCBWMN83fuFI/x+T/UhZ7k+KIzhrHXcQoeX5+7gmaDYjELQHmmzIodumBHeByBJT4QYS7ufAgs7A==} + engines: {node: ^20.17.0 || >=22.9.0} + read-package-json-fast@2.0.3: resolution: {integrity: sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==} engines: {node: '>=10'} + read-package-up@12.0.0: + resolution: {integrity: sha512-Q5hMVBYur/eQNWDdbF4/Wqqr9Bjvtrw2kjGxxBbKLbx8bVCL8gcArjTy8zDUuLGQicftpMuU0riQNcAsbtOVsw==} + engines: {node: '>=20'} + read-pkg-up@1.0.1: resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} engines: {node: '>=0.10.0'} @@ -8418,6 +9051,10 @@ packages: resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} engines: {node: '>=0.10.0'} + read-pkg@10.1.0: + resolution: {integrity: sha512-I8g2lArQiP78ll51UeMZojewtYgIRCKCWqZEgOO8c/uefTI+XDXvCSXu3+YNUaTNvZzobrL5+SqHjBrByRRTdg==} + engines: {node: '>=20'} + read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} @@ -8491,6 +9128,18 @@ packages: resolution: {integrity: sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==} engines: {node: '>=4'} + registry-auth-token@5.1.1: + resolution: {integrity: sha512-P7B4+jq8DeD2nMsAcdfaqHbssgHtZ7Z5+++a5ask90fvmJ8p5je4mOa+wzu+DB4vQ5tdJV/xywY+UnVFeQLV5Q==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + registry-url@7.2.0: + resolution: {integrity: sha512-I5UEBQ+09LWKInA1fPswOMZps0cs2Z+IQXb5Z5EkTJiUmIN52Vm/FD3ji5X82c5jIXL3nWEWOrYK0RkON6Oqyg==} + engines: {node: '>=18'} + regjsgen@0.8.0: resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} @@ -8601,6 +9250,10 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} + restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -8649,6 +9302,10 @@ packages: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} + run-async@4.0.6: + resolution: {integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -8857,6 +9514,11 @@ packages: engines: {node: '>=4'} hasBin: true + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + shelljs@0.9.2: resolution: {integrity: sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==} engines: {node: '>=18'} @@ -8870,6 +9532,11 @@ packages: engines: {node: '>=6'} hasBin: true + shx@0.3.4: + resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} + engines: {node: '>=6'} + hasBin: true + shx@0.4.0: resolution: {integrity: sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==} engines: {node: '>=18'} @@ -8905,6 +9572,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sigstore@4.1.1: + resolution: {integrity: sha512-endqECJkfhozrXMK5ngu/UAA0xVcVEFdnHJCElGaExypjW+HK5i6zu3NteLoaX/iFbRUbC3+DjttQs0GARr+5w==} + engines: {node: ^20.17.0 || >=22.9.0} + simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} @@ -8994,6 +9665,10 @@ packages: sort-any@2.0.0: resolution: {integrity: sha512-T9JoiDewQEmWcnmPn/s9h/PH9t3d/LSWi0RgVmXSuDYeZXTZOZ1/wrK2PHaptuR1VXe3clLLt0pD6sgVOwjNEA==} + sort-keys@6.0.1: + resolution: {integrity: sha512-w7xWRu8U9MneKNna8ptG194jp9PLtbd/Rl6gwrmbK4yUeKbE66a64rHgl0iKTBBDr/hpanx7zMGP1Qo8MRkc/w==} + engines: {node: '>=20'} + source-map-js@1.2.1: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} @@ -9051,6 +9726,9 @@ packages: spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + spdx-expression-parse@4.0.0: + resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + spdx-license-ids@3.0.11: resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} @@ -9077,6 +9755,10 @@ packages: resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@13.0.1: + resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} + engines: {node: ^20.17.0 || >=22.9.0} + ssri@8.0.1: resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} engines: {node: '>= 8'} @@ -9123,6 +9805,10 @@ packages: resolution: {integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==} engines: {node: '>= 0.8'} + stdin-discarder@0.3.2: + resolution: {integrity: sha512-eCPu1qRxPVkl5605OTWF8Wz40b4Mf45NY5LQmVPQ599knfs5QhASUm9GbJ5BDMDOXgrnh0wyEdvzmL//YMlw0A==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -9172,6 +9858,10 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} + string-width@8.2.1: + resolution: {integrity: sha512-IIaP0g3iy9Cyy18w3M9YcaDudujEAVHKt3a3QJg1+sr/oX96TbaGUubG0hJyCjCBThFH+tFpcIyoUHUn1ogaLA==} + engines: {node: '>=20'} + string.prototype.trim@1.2.10: resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==} engines: {node: '>= 0.4'} @@ -9210,10 +9900,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-ansi@7.2.0: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} @@ -9254,6 +9940,10 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@1.0.1: resolution: {integrity: sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==} engines: {node: '>=0.10.0'} @@ -9309,6 +9999,10 @@ packages: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tapable@1.1.3: resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==} engines: {node: '>=6'} @@ -9329,6 +10023,10 @@ packages: engines: {node: '>=10'} deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + tar@7.5.19: + resolution: {integrity: sha512-4LeEWl96twnS2Q7Bz4MGqgazLqO+hJN63GZxXoIqh1T3VweYD997gbU1ItNsQafqqXTXd5WFyFdReLtwvRBNiw==} + engines: {node: '>=18'} + teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -9497,6 +10195,10 @@ packages: treeverse@1.0.4: resolution: {integrity: sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==} + treeverse@3.0.0: + resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + trim-newlines@1.0.0: resolution: {integrity: sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==} engines: {node: '>=0.10.0'} @@ -9566,6 +10268,17 @@ packages: typescript: '*' webpack: ^5.0.0 + ts-loader@9.6.2: + resolution: {integrity: sha512-R4iuczmtgxvtuI556s+hTZ6/7Ee03VCAk/l/M8LY1OAsUgB7YydsCxkgq9D9pKRaD7GJqUi2u8fp9zZP/ufjKA==} + engines: {node: '>=12.0.0'} + peerDependencies: + loader-utils: '*' + typescript: '*' + webpack: ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + loader-utils: + optional: true + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -9595,6 +10308,10 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tuf-js@4.1.0: + resolution: {integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ==} + engines: {node: ^20.17.0 || >=22.9.0} + tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} @@ -9653,6 +10370,10 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} + type-fest@5.8.0: + resolution: {integrity: sha512-YGYEVz3Fm5iy/AybuA0oyNFq7H4CgQNfRp/qfe8nurE1kuCeNm3/vfm9X4Mtl+qLyaKJUh5xrFZwogr41SMjYA==} + engines: {node: '>=20'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -9718,6 +10439,10 @@ packages: undici-types@7.24.6: resolution: {integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==} + undici@6.27.0: + resolution: {integrity: sha512-YmfV3YnEDzXRC5lZ2jWtWWHKGUm1zIt8AhesR1tens+HTNv+YZlN/dp6G727LOvMJ8xjP9Be7Y2Sdr96LDm+pg==} + engines: {node: '>=18.17'} + undici@7.25.0: resolution: {integrity: sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==} engines: {node: '>=20.18.1'} @@ -9746,6 +10471,10 @@ packages: resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} engines: {node: '>=18'} + unicorn-magic@0.4.0: + resolution: {integrity: sha512-wH590V9VNgYH9g3lH9wWjTrUoKsjLF6sGLjhR4sH1LWpLmCOH0Zf7PukhDA8BiS7KHe4oPNkcTHqYkj7SOGUOw==} + engines: {node: '>=20'} + union-value@1.0.1: resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==} engines: {node: '>=0.10.0'} @@ -9806,6 +10535,10 @@ packages: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} + untildify@6.0.0: + resolution: {integrity: sha512-sA2YTBvW2F463GvSbiZtso+dpuQV+B7xX9saX30SGrR5Fyx4AUcvA/zN+ShAkABKUKVyDaHECsJrHv5ToTuHsQ==} + engines: {node: '>=20'} + unzip-response@2.0.1: resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} engines: {node: '>=4'} @@ -9896,6 +10629,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -10045,6 +10782,10 @@ packages: walk-up-path@1.0.0: resolution: {integrity: sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==} + walk-up-path@4.0.0: + resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==} + engines: {node: 20 || >=22} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -10196,6 +10937,10 @@ packages: which-module@2.0.0: resolution: {integrity: sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==} + which-package-manager@1.0.1: + resolution: {integrity: sha512-Nse2rVsL302dkEhCyyS1U3iEQ9FRYPPkWJNk188xUVkKIGXjMmDPlA3L1VettE+T2z7SGLsJiDaZw//8CHUQwQ==} + engines: {node: '>=18'} + which-pm@2.2.0: resolution: {integrity: sha512-MOiaDbA5ZZgUjkeMWM5EkJp4loW5ZRoa5bc3/aeMox/PJelMhE6t7S/mLuiY43DBupyxH+S0U1bTui9kWUlmsw==} engines: {node: '>=8.15'} @@ -10213,6 +10958,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@6.0.1: + resolution: {integrity: sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + wide-align@1.1.5: resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} @@ -10285,6 +11035,10 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + write-file-atomic@7.0.1: + resolution: {integrity: sha512-OTIk8iR8/aCRWBqvxrzxR0hgxWpnYBblY1S5hDWBQfk/VFmJwzmJgQFN3WsoUKHISv2eAwe+PpbUzyL1CKTLXg==} + engines: {node: ^20.17.0 || >=22.9.0} + ws@7.5.10: resolution: {integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==} engines: {node: '>=8.3.0'} @@ -10384,6 +11138,10 @@ packages: yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} @@ -10430,10 +11188,30 @@ packages: engines: {node: '>=12.10.0'} hasBin: true + yeoman-environment@6.1.0: + resolution: {integrity: sha512-QSKMfrSx3js9fxbMDBa+sZG0ctF0NDxcO6VA5BnrWdo6wqhdalT2IUU/ZrNakQLZQ76E3B6b0lXHKEA7ivsWxA==} + engines: {node: ^20.17.0 || >=22.9.0} + hasBin: true + peerDependencies: + '@yeoman/adapter': ^4.0.2 + '@yeoman/types': ^1.10.3 + mem-fs: ^4.1.4 + yeoman-generator@4.13.0: resolution: {integrity: sha512-f2/5N5IR3M2Ozm+QocvZQudlQITv2DwI6Mcxfy7R7gTTzaKgvUpgo/pQMJ+WQKm0KN0YMWCFOZpj0xFGxevc1w==} engines: {node: '>=10'} + yeoman-generator@8.2.2: + resolution: {integrity: sha512-GIvRULf09VrTyJ1nMIxCRFTI8gzW9zsAxVXTHOmsWVKZ7QYPdByRQvFtnp0XOObM6dvDSoAwBhuYR6i5inp/ig==} + engines: {node: ^20.17.0 || >=22.9.0} + peerDependencies: + '@types/node': '>=20.19.35' + '@yeoman/types': ^1.1.1 + mem-fs: ^4.0.0 + peerDependenciesMeta: + '@types/node': + optional: true + yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} @@ -10446,6 +11224,10 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + snapshots: '@asamuzakjp/css-color@3.2.0': @@ -11769,6 +12551,8 @@ snapshots: '@eslint/js@8.57.1': {} + '@gar/promise-retry@1.0.3': {} + '@gar/promisify@1.1.3': {} '@humanwhocodes/config-array@0.13.0': @@ -11783,10 +12567,129 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} - '@inquirer/external-editor@1.0.3(@types/node@14.18.63)': + '@inquirer/ansi@2.0.7': {} + + '@inquirer/checkbox@5.2.1(@types/node@14.18.63)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/confirm@6.1.1(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/core@11.2.1(@types/node@14.18.63)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@14.18.63) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/editor@5.2.2(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/external-editor': 3.0.3(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/expand@5.1.1(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/external-editor@1.0.3(@types/node@25.9.1)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 25.9.1 + + '@inquirer/external-editor@3.0.3(@types/node@14.18.63)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/figures@2.0.7': {} + + '@inquirer/input@5.1.2(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/number@4.1.1(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/password@5.1.1(@types/node@14.18.63)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/prompts@8.5.2(@types/node@14.18.63)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@14.18.63) + '@inquirer/confirm': 6.1.1(@types/node@14.18.63) + '@inquirer/editor': 5.2.2(@types/node@14.18.63) + '@inquirer/expand': 5.1.1(@types/node@14.18.63) + '@inquirer/input': 5.1.2(@types/node@14.18.63) + '@inquirer/number': 4.1.1(@types/node@14.18.63) + '@inquirer/password': 5.1.1(@types/node@14.18.63) + '@inquirer/rawlist': 5.3.1(@types/node@14.18.63) + '@inquirer/search': 4.2.1(@types/node@14.18.63) + '@inquirer/select': 5.2.1(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/rawlist@5.3.1(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/search@4.2.1(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/select@5.2.1(@types/node@14.18.63)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@14.18.63) + optionalDependencies: + '@types/node': 14.18.63 + + '@inquirer/type@4.0.7(@types/node@14.18.63)': optionalDependencies: '@types/node': 14.18.63 @@ -11794,11 +12697,15 @@ snapshots: dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 + strip-ansi: 7.2.0 strip-ansi-cjs: strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.3 + '@isaacs/string-locale-compare@1.1.0': {} '@istanbuljs/load-nyc-config@1.1.0': @@ -12273,6 +13180,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@npmcli/agent@4.0.2': + dependencies: + agent-base: 7.1.4 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 11.5.1 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + '@npmcli/arborist@4.3.1': dependencies: '@isaacs/string-locale-compare': 1.1.0 @@ -12311,6 +13228,45 @@ snapshots: - bluebird - supports-color + '@npmcli/arborist@9.9.0': + dependencies: + '@gar/promise-retry': 1.0.3 + '@isaacs/string-locale-compare': 1.1.0 + '@npmcli/fs': 5.0.0 + '@npmcli/installed-package-contents': 4.0.0 + '@npmcli/map-workspaces': 5.0.3 + '@npmcli/metavuln-calculator': 9.0.3 + '@npmcli/name-from-folder': 4.0.0 + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/query': 5.0.0 + '@npmcli/redact': 4.0.0 + '@npmcli/run-script': 10.0.4 + bin-links: 6.0.2 + cacache: 20.0.4 + common-ancestor-path: 2.0.0 + hosted-git-info: 9.0.3 + json-stringify-nice: 1.1.4 + lru-cache: 11.5.1 + minimatch: 10.2.5 + nopt: 9.0.0 + npm-install-checks: 8.0.0 + npm-package-arg: 13.0.2 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1 + pacote: 21.5.1 + parse-conflict-json: 5.0.1 + proc-log: 6.1.0 + proggy: 4.0.0 + promise-all-reject-late: 1.0.1 + promise-call-limit: 3.0.2 + semver: 7.6.3 + ssri: 13.0.1 + treeverse: 3.0.0 + walk-up-path: 4.0.0 + transitivePeerDependencies: + - supports-color + '@npmcli/fs@1.1.1': dependencies: '@gar/promisify': 1.1.3 @@ -12325,6 +13281,10 @@ snapshots: dependencies: semver: 7.6.3 + '@npmcli/fs@5.0.0': + dependencies: + semver: 7.6.3 + '@npmcli/git@2.1.0': dependencies: '@npmcli/promise-spawn': 1.3.2 @@ -12338,11 +13298,27 @@ snapshots: transitivePeerDependencies: - bluebird + '@npmcli/git@7.0.2': + dependencies: + '@gar/promise-retry': 1.0.3 + '@npmcli/promise-spawn': 9.0.1 + ini: 6.0.0 + lru-cache: 11.5.1 + npm-pick-manifest: 11.0.3 + proc-log: 6.1.0 + semver: 7.6.3 + which: 6.0.1 + '@npmcli/installed-package-contents@1.0.7': dependencies: npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 + '@npmcli/installed-package-contents@4.0.0': + dependencies: + npm-bundled: 5.0.0 + npm-normalize-package-bin: 5.0.0 + '@npmcli/map-workspaces@2.0.4': dependencies: '@npmcli/name-from-folder': 1.0.1 @@ -12350,6 +13326,13 @@ snapshots: minimatch: 5.1.6 read-package-json-fast: 2.0.3 + '@npmcli/map-workspaces@5.0.3': + dependencies: + '@npmcli/name-from-folder': 4.0.0 + '@npmcli/package-json': 7.0.5 + glob: 13.0.6 + minimatch: 10.2.5 + '@npmcli/metavuln-calculator@2.0.0': dependencies: cacache: 15.3.0 @@ -12360,6 +13343,16 @@ snapshots: - bluebird - supports-color + '@npmcli/metavuln-calculator@9.0.3': + dependencies: + cacache: 20.0.4 + json-parse-even-better-errors: 5.0.0 + pacote: 21.5.1 + proc-log: 6.1.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + '@npmcli/move-file@1.1.2': dependencies: mkdirp: 1.0.4 @@ -12372,16 +13365,48 @@ snapshots: '@npmcli/name-from-folder@1.0.1': {} + '@npmcli/name-from-folder@4.0.0': {} + '@npmcli/node-gyp@1.0.3': {} + '@npmcli/node-gyp@5.0.0': {} + '@npmcli/package-json@1.0.1': dependencies: json-parse-even-better-errors: 2.3.1 + '@npmcli/package-json@7.0.5': + dependencies: + '@npmcli/git': 7.0.2 + glob: 13.0.6 + hosted-git-info: 9.0.3 + json-parse-even-better-errors: 5.0.0 + proc-log: 6.1.0 + semver: 7.6.3 + spdx-expression-parse: 4.0.0 + '@npmcli/promise-spawn@1.3.2': dependencies: infer-owner: 1.0.4 + '@npmcli/promise-spawn@9.0.1': + dependencies: + which: 6.0.1 + + '@npmcli/query@5.0.0': + dependencies: + postcss-selector-parser: 7.1.4 + + '@npmcli/redact@4.0.0': {} + + '@npmcli/run-script@10.0.4': + dependencies: + '@npmcli/node-gyp': 5.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/promise-spawn': 9.0.1 + node-gyp: 12.4.0 + proc-log: 6.1.0 + '@npmcli/run-script@2.0.0': dependencies: '@npmcli/node-gyp': 1.0.3 @@ -12584,6 +13609,18 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@3.0.3': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@sap-devx/feature-toggle-node@2.0.3': dependencies: node-cache: 5.1.2 @@ -12775,6 +13812,8 @@ snapshots: '@sap_oss/task_contrib_types@3.1.0': {} + '@sec-ant/readable-stream@0.4.1': {} + '@secretlint/config-creator@10.1.1': dependencies: '@secretlint/types': 10.1.1 @@ -12849,6 +13888,38 @@ snapshots: '@secretlint/types@10.1.1': {} + '@sigstore/bundle@4.0.0': + dependencies: + '@sigstore/protobuf-specs': 0.5.1 + + '@sigstore/core@3.2.1': {} + + '@sigstore/protobuf-specs@0.5.1': {} + + '@sigstore/sign@4.1.1': + dependencies: + '@gar/promise-retry': 1.0.3 + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.2.1 + '@sigstore/protobuf-specs': 0.5.1 + make-fetch-happen: 15.0.6 + proc-log: 6.1.0 + transitivePeerDependencies: + - supports-color + + '@sigstore/tuf@4.0.2': + dependencies: + '@sigstore/protobuf-specs': 0.5.1 + tuf-js: 4.1.0 + transitivePeerDependencies: + - supports-color + + '@sigstore/verify@3.1.1': + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.2.1 + '@sigstore/protobuf-specs': 0.5.1 + '@simple-git/args-pathspec@1.0.3': {} '@simple-git/argv-parser@1.1.1': @@ -12859,6 +13930,8 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@1.8.6': dependencies: type-detect: 4.0.8 @@ -12943,6 +14016,13 @@ snapshots: '@tsconfig/node16@1.0.4': {} + '@tufjs/canonical-json@2.0.0': {} + + '@tufjs/models@4.1.0': + dependencies: + '@tufjs/canonical-json': 2.0.0 + minimatch: 10.2.5 + '@types/aws-lambda@8.10.147': {} '@types/babel__core@7.20.5': @@ -13007,10 +14087,6 @@ snapshots: '@types/deep-equal-in-any-order@1.0.4': {} - '@types/diff@8.0.0': - dependencies: - diff: 9.0.0 - '@types/ejs@3.1.5': {} '@types/eslint-scope@3.7.7': @@ -13076,11 +14152,6 @@ snapshots: '@types/through': 0.0.33 rxjs: 6.6.7 - '@types/inquirer@8.2.13': - dependencies: - '@types/through': 0.0.33 - rxjs: 7.8.2 - '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -13111,27 +14182,14 @@ snapshots: dependencies: '@types/node': 16.11.10 + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.14.202 + '@types/lodash@4.14.177': {} '@types/lodash@4.14.202': {} - '@types/mem-fs-editor@10.0.1(@types/node@16.11.10)(mem-fs@4.1.4)': - dependencies: - mem-fs-editor: 12.0.4(@types/node@16.11.10)(mem-fs@4.1.4) - transitivePeerDependencies: - - '@types/node' - - bare-abort-controller - - mem-fs - - react-native-b4a - - supports-color - - '@types/mem-fs@2.2.0': - dependencies: - mem-fs: 4.1.4 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - '@types/mime@1.3.2': {} '@types/mime@3.0.1': {} @@ -13238,8 +14296,6 @@ snapshots: '@types/strip-json-comments@0.0.30': {} - '@types/text-table@0.2.5': {} - '@types/through@0.0.33': dependencies: '@types/node': 16.11.10 @@ -13283,40 +14339,6 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 - '@types/yeoman-environment@2.10.11(mem-fs@4.1.4)': - dependencies: - '@types/diff': 8.0.0 - '@types/inquirer': 8.2.13 - '@types/mem-fs': 2.2.0 - '@types/node': 16.11.10 - '@types/text-table': 0.2.5 - '@types/vinyl': 2.0.12 - '@types/yeoman-generator': 5.2.14(mem-fs@4.1.4) - chalk: 4.1.2 - commander: 9.5.0 - execa: 5.1.1 - rxjs: 6.6.7 - transitivePeerDependencies: - - bare-abort-controller - - mem-fs - - react-native-b4a - - supports-color - - '@types/yeoman-generator@5.2.14(mem-fs@4.1.4)': - dependencies: - '@types/debug': 4.1.13 - '@types/ejs': 3.1.5 - '@types/inquirer': 8.2.13 - '@types/mem-fs-editor': 10.0.1(@types/node@16.11.10)(mem-fs@4.1.4) - '@types/node': 16.11.10 - '@types/yeoman-environment': 2.10.11(mem-fs@4.1.4) - rxjs: 6.6.7 - transitivePeerDependencies: - - bare-abort-controller - - mem-fs - - react-native-b4a - - supports-color - '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -13797,6 +14819,55 @@ snapshots: '@xtuc/long@4.2.2': {} + '@yeoman/adapter@4.0.2(@types/node@14.18.63)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/prompts': 8.5.2(@types/node@14.18.63) + chalk: 5.6.2 + inquirer: 13.4.3(@types/node@14.18.63) + log-symbols: 7.0.1 + ora: 9.4.1 + p-queue: 9.3.1 + text-table: 0.2.0 + transitivePeerDependencies: + - '@types/node' + + '@yeoman/conflicter@4.1.0(@types/node@14.18.63)(@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4))(mem-fs@4.1.4)': + dependencies: + '@types/node': 14.18.63 + '@yeoman/transform': 2.1.2(@types/node@14.18.63) + '@yeoman/types': 1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4) + binary-extensions: 3.1.0 + cli-table: 0.3.11 + dateformat: 5.0.3 + diff: 9.0.0 + isbinaryfile: 5.0.7 + mem-fs: 4.1.4 + mem-fs-editor: 12.0.4(@types/node@14.18.63)(mem-fs@4.1.4) + minimatch: 10.2.5 + p-transform: 5.0.1 + pretty-bytes: 7.1.0 + slash: 5.1.0 + textextensions: 6.11.0 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + + '@yeoman/namespace@2.1.0': {} + + '@yeoman/transform@2.1.2(@types/node@14.18.63)': + dependencies: + '@types/node': 14.18.63 + minimatch: 9.0.9 + + '@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4)': + dependencies: + '@types/node': 14.18.63 + optionalDependencies: + '@yeoman/adapter': 4.0.2(@types/node@14.18.63) + mem-fs: 4.1.4 + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -13808,6 +14879,8 @@ snapshots: abbrev@2.0.0: {} + abbrev@4.0.0: {} + abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 @@ -13924,8 +14997,6 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.1.0: {} - ansi-regex@6.2.2: {} ansi-styles@2.2.1: {} @@ -14082,6 +15153,8 @@ snapshots: arrify@2.0.1: {} + arrify@3.0.0: {} + asap@2.0.6: {} asn1@0.2.6: @@ -14283,8 +15356,18 @@ snapshots: rimraf: 3.0.2 write-file-atomic: 4.0.2 + bin-links@6.0.2: + dependencies: + cmd-shim: 8.0.0 + npm-normalize-package-bin: 5.0.0 + proc-log: 6.1.0 + read-cmd-shim: 6.0.0 + write-file-atomic: 7.0.1 + binary-extensions@2.3.0: {} + binary-extensions@3.1.0: {} + binary@0.3.0: dependencies: buffers: 0.1.1 @@ -14502,6 +15585,19 @@ snapshots: tar: 6.2.1 unique-filename: 3.0.0 + cacache@20.0.4: + dependencies: + '@npmcli/fs': 5.0.0 + fs-minipass: 3.0.3 + glob: 13.0.6 + lru-cache: 11.5.1 + minipass: 7.1.3 + minipass-collect: 2.0.1 + minipass-flush: 1.0.7 + minipass-pipeline: 1.2.4 + p-map: 7.0.3 + ssri: 13.0.1 + cache-base@1.0.1: dependencies: collection-visit: 1.0.0 @@ -14631,6 +15727,8 @@ snapshots: chalk@5.3.0: {} + chalk@5.6.2: {} + char-regex@1.0.2: {} chardet@0.7.0: {} @@ -14699,6 +15797,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + chrome-trace-event@1.0.3: {} ci-info@3.9.0: {} @@ -14718,8 +15818,14 @@ snapshots: dependencies: restore-cursor: 3.1.0 + cli-cursor@5.0.0: + dependencies: + restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-spinners@3.4.0: {} + cli-table@0.3.11: dependencies: colors: 1.0.3 @@ -14731,6 +15837,8 @@ snapshots: cli-width@3.0.0: {} + cli-width@4.1.0: {} + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -14779,6 +15887,8 @@ snapshots: dependencies: mkdirp-infer-owner: 2.0.0 + cmd-shim@8.0.0: {} + co@4.6.0: {} cockatiel@3.2.1: {} @@ -14833,6 +15943,8 @@ snapshots: commander@12.1.0: {} + commander@14.0.3: {} + commander@2.20.3: {} commander@6.2.1: {} @@ -14841,8 +15953,6 @@ snapshots: commander@8.3.0: {} - commander@9.5.0: {} - comment-json@4.1.0: dependencies: array-timsort: 1.0.3 @@ -14861,6 +15971,8 @@ snapshots: common-ancestor-path@1.0.1: {} + common-ancestor-path@2.0.0: {} + commondir@1.0.1: {} compare-func@2.0.0: @@ -15193,6 +16305,8 @@ snapshots: dateformat@4.6.3: {} + dateformat@5.0.3: {} + debug@2.6.9: dependencies: ms: 2.0.0 @@ -15588,6 +16702,8 @@ snapshots: env-paths@2.2.1: {} + env-paths@3.0.0: {} + envinfo@7.14.0: {} err-code@2.0.3: {} @@ -16005,6 +17121,8 @@ snapshots: eventemitter3@4.0.7: {} + eventemitter3@5.0.4: {} + events-universal@1.0.1: dependencies: bare-events: 2.8.3 @@ -16045,9 +17163,24 @@ snapshots: merge-stream: 2.0.0 npm-run-path: 4.0.1 onetime: 5.1.2 - signal-exit: 3.0.6 + signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@9.6.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.1 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.3.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.2 + exit@0.1.2: {} expand-brackets@2.1.4: @@ -16080,6 +17213,8 @@ snapshots: jest-message-util: 29.7.0 jest-util: 29.7.0 + exponential-backoff@3.1.3: {} + express@4.22.1: dependencies: accepts: 1.3.8 @@ -16214,8 +17349,18 @@ snapshots: fast-safe-stringify@2.1.1: {} + fast-string-truncated-width@3.0.3: {} + + fast-string-width@3.0.2: + dependencies: + fast-string-truncated-width: 3.0.3 + fast-uri@3.1.2: {} + fast-wrap-ansi@0.2.2: + dependencies: + fast-string-width: 3.0.2 + fastest-levenshtein@1.0.12: {} fastq@1.13.0: @@ -16240,6 +17385,10 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.0.4 @@ -16298,6 +17447,8 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 + find-up-simple@1.0.1: {} + find-up@1.1.2: dependencies: path-exists: 2.1.0 @@ -16343,6 +17494,15 @@ snapshots: flatted@3.4.2: {} + fly-import@1.0.0: + dependencies: + '@npmcli/arborist': 9.9.0 + env-paths: 3.0.0 + registry-auth-token: 5.1.1 + registry-url: 7.2.0 + transitivePeerDependencies: + - supports-color + fn.name@1.1.0: {} follow-redirects@1.15.11: {} @@ -16534,6 +17694,8 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} + get-func-name@2.0.2: {} get-intrinsic@1.2.4: @@ -16581,6 +17743,11 @@ snapshots: get-stream@6.0.1: {} + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.4 @@ -16738,6 +17905,15 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.3.0 + globby@16.2.1: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + fast-glob: 3.3.3 + ignore: 7.0.5 + is-path-inside: 4.0.0 + slash: 5.1.0 + unicorn-magic: 0.4.0 + globby@8.0.2: dependencies: array-union: 1.0.2 @@ -16782,6 +17958,8 @@ snapshots: unzip-response: 2.0.1 url-parse-lax: 1.0.0 + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} graceful-fs@4.2.8: {} @@ -16893,6 +18071,10 @@ snapshots: dependencies: lru-cache: 10.4.3 + hosted-git-info@9.0.3: + dependencies: + lru-cache: 11.5.1 + html-encoding-sniffer@2.0.1: dependencies: whatwg-encoding: 1.0.5 @@ -17023,6 +18205,8 @@ snapshots: human-signals@2.1.0: {} + human-signals@8.0.1: {} + humanize-ms@1.2.1: dependencies: ms: 2.1.3 @@ -17051,6 +18235,10 @@ snapshots: dependencies: minimatch: 3.1.2 + ignore-walk@8.0.0: + dependencies: + minimatch: 10.2.5 + ignore@3.3.10: optional: true @@ -17103,6 +18291,8 @@ snapshots: indent-string@4.0.0: {} + index-to-position@1.2.0: {} + infer-owner@1.0.4: {} inflight@1.0.6: @@ -17116,6 +18306,22 @@ snapshots: ini@4.1.1: {} + ini@5.0.0: {} + + ini@6.0.0: {} + + inquirer@13.4.3(@types/node@14.18.63): + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@14.18.63) + '@inquirer/prompts': 8.5.2(@types/node@14.18.63) + '@inquirer/type': 4.0.7(@types/node@14.18.63) + mute-stream: 3.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 14.18.63 + inquirer@7.3.3: dependencies: ansi-escapes: 4.3.2 @@ -17132,9 +18338,9 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.7(@types/node@14.18.63): + inquirer@8.2.7(@types/node@25.9.1): dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@14.18.63) + '@inquirer/external-editor': 1.0.3(@types/node@25.9.1) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -17282,6 +18488,8 @@ snapshots: is-interactive@1.0.0: {} + is-interactive@2.0.0: {} + is-lambda@1.0.1: {} is-map@2.0.3: {} @@ -17307,12 +18515,16 @@ snapshots: is-path-inside@3.0.3: {} + is-path-inside@4.0.0: {} + is-plain-obj@1.1.0: {} is-plain-obj@2.1.0: {} is-plain-obj@3.0.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: dependencies: isobject: 3.0.1 @@ -17351,6 +18563,8 @@ snapshots: is-stream@2.0.1: {} + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.4 @@ -17378,6 +18592,8 @@ snapshots: is-unicode-supported@0.1.0: {} + is-unicode-supported@2.1.0: {} + is-utf8@0.2.1: {} is-weakmap@2.0.2: {} @@ -17409,6 +18625,8 @@ snapshots: isexe@2.0.0: {} + isexe@4.0.0: {} + isobject@2.1.0: dependencies: isarray: 1.0.0 @@ -18468,6 +19686,8 @@ snapshots: json-parse-even-better-errors@3.0.2: {} + json-parse-even-better-errors@5.0.0: {} + json-schema-traverse@0.4.1: {} json-schema-traverse@1.0.0: {} @@ -18484,10 +19704,6 @@ snapshots: dependencies: minimist: 1.2.8 - json5@2.2.0: - dependencies: - minimist: 1.2.8 - json5@2.2.3: {} jsonc-parser@3.0.0: {} @@ -18530,6 +19746,8 @@ snapshots: just-diff@5.2.0: {} + just-diff@6.0.2: {} + just-extend@6.2.0: {} jwa@1.4.2: @@ -18628,6 +19846,12 @@ snapshots: kuler@2.0.0: {} + ky@1.14.3: {} + + latest-version@9.0.0: + dependencies: + package-json: 10.0.1 + lazy-cache@2.0.2: dependencies: set-getter: 0.1.1 @@ -18741,7 +19965,7 @@ snapshots: dependencies: big.js: 5.2.2 emojis-list: 3.0.0 - json5: 2.2.0 + json5: 2.2.3 locate-path@3.0.0: dependencies: @@ -18760,6 +19984,12 @@ snapshots: dependencies: p-locate: 6.0.0 + locate-path@8.0.0: + dependencies: + p-locate: 6.0.0 + + lodash-es@4.18.1: {} + lodash.camelcase@4.3.0: {} lodash.flattendeep@4.4.0: {} @@ -18818,6 +20048,11 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + log-update@4.0.0: dependencies: ansi-escapes: 4.3.2 @@ -18863,6 +20098,8 @@ snapshots: lru-cache@11.1.0: {} + lru-cache@11.5.1: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -18926,6 +20163,23 @@ snapshots: transitivePeerDependencies: - supports-color + make-fetch-happen@15.0.6: + dependencies: + '@gar/promise-retry': 1.0.3 + '@npmcli/agent': 4.0.2 + '@npmcli/redact': 4.0.0 + cacache: 20.0.4 + http-cache-semantics: 4.2.0 + minipass: 7.1.3 + minipass-fetch: 5.0.2 + minipass-flush: 1.0.7 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 6.1.0 + ssri: 13.0.1 + transitivePeerDependencies: + - supports-color + make-fetch-happen@9.1.0: dependencies: agentkeepalive: 4.6.0 @@ -18999,7 +20253,7 @@ snapshots: media-typer@0.3.0: {} - mem-fs-editor@12.0.4(@types/node@16.11.10)(mem-fs@4.1.4): + mem-fs-editor@12.0.4(@types/node@14.18.63)(mem-fs@4.1.4): dependencies: '@types/ejs': 3.1.5 '@types/picomatch': 4.0.3 @@ -19017,7 +20271,7 @@ snapshots: tinyglobby: 0.2.17 vinyl: 3.0.1 optionalDependencies: - '@types/node': 16.11.10 + '@types/node': 14.18.63 transitivePeerDependencies: - bare-abort-controller - react-native-b4a @@ -19153,7 +20407,7 @@ snapshots: micromatch@4.0.6: dependencies: braces: 3.0.3 - picomatch: 4.0.2 + picomatch: 4.0.4 micromatch@4.0.8: dependencies: @@ -19189,6 +20443,8 @@ snapshots: mimic-fn@2.1.0: {} + mimic-function@5.0.1: {} + mimic-response@3.1.0: optional: true @@ -19248,6 +20504,14 @@ snapshots: optionalDependencies: encoding: 0.1.13 + minipass-fetch@5.0.2: + dependencies: + minipass: 7.1.3 + minipass-sized: 2.0.0 + minizlib: 3.1.0 + optionalDependencies: + iconv-lite: 0.7.2 + minipass-flush@1.0.7: dependencies: minipass: 3.3.6 @@ -19265,6 +20529,10 @@ snapshots: dependencies: minipass: 3.3.6 + minipass-sized@2.0.0: + dependencies: + minipass: 7.1.3 + minipass@3.3.6: dependencies: yallist: 4.0.0 @@ -19280,6 +20548,10 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.3 + mixin-deep@1.3.2: dependencies: for-in: 1.0.2 @@ -19374,6 +20646,8 @@ snapshots: mute-stream@0.0.8: {} + mute-stream@3.0.0: {} + nanoid@3.3.12: {} nanomatch@1.2.13: @@ -19399,6 +20673,8 @@ snapshots: negotiator@0.6.3: {} + negotiator@1.0.0: {} + neo-async@2.6.2: {} next-tick@1.1.0: {} @@ -19443,6 +20719,19 @@ snapshots: node-gyp-build@4.8.4: {} + node-gyp@12.4.0: + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.3 + graceful-fs: 4.2.11 + nopt: 9.0.0 + proc-log: 6.1.0 + semver: 7.6.3 + tar: 7.5.19 + tinyglobby: 0.2.17 + undici: 6.27.0 + which: 6.0.1 + node-gyp@8.4.1: dependencies: env-paths: 2.2.1 @@ -19488,6 +20777,10 @@ snapshots: dependencies: abbrev: 2.0.0 + nopt@9.0.0: + dependencies: + abbrev: 4.0.0 + normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 @@ -19501,6 +20794,12 @@ snapshots: semver: 7.6.3 validate-npm-package-license: 3.0.4 + normalize-package-data@8.0.0: + dependencies: + hosted-git-info: 9.0.3 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + normalize-path@2.1.1: dependencies: remove-trailing-separator: 1.1.0 @@ -19524,14 +20823,24 @@ snapshots: dependencies: npm-normalize-package-bin: 1.0.1 + npm-bundled@5.0.0: + dependencies: + npm-normalize-package-bin: 5.0.0 + npm-install-checks@4.0.0: dependencies: semver: 7.6.3 + npm-install-checks@8.0.0: + dependencies: + semver: 7.6.3 + npm-normalize-package-bin@1.0.1: {} npm-normalize-package-bin@2.0.0: {} + npm-normalize-package-bin@5.0.0: {} + npm-package-arg@11.0.3: dependencies: hosted-git-info: 7.0.2 @@ -19539,12 +20848,24 @@ snapshots: semver: 7.6.3 validate-npm-package-name: 5.0.1 + npm-package-arg@13.0.2: + dependencies: + hosted-git-info: 9.0.3 + proc-log: 6.1.0 + semver: 7.6.3 + validate-npm-package-name: 7.0.2 + npm-package-arg@8.1.5: dependencies: hosted-git-info: 4.0.2 semver: 7.6.3 validate-npm-package-name: 3.0.0 + npm-packlist@10.0.4: + dependencies: + ignore-walk: 8.0.0 + proc-log: 6.1.0 + npm-packlist@3.0.0: dependencies: glob: 7.2.0 @@ -19552,6 +20873,13 @@ snapshots: npm-bundled: 1.1.2 npm-normalize-package-bin: 1.0.1 + npm-pick-manifest@11.0.3: + dependencies: + npm-install-checks: 8.0.0 + npm-normalize-package-bin: 5.0.0 + npm-package-arg: 13.0.2 + semver: 7.6.3 + npm-pick-manifest@6.1.1: dependencies: npm-install-checks: 4.0.0 @@ -19583,6 +20911,19 @@ snapshots: transitivePeerDependencies: - supports-color + npm-registry-fetch@19.1.1: + dependencies: + '@npmcli/redact': 4.0.0 + jsonparse: 1.3.1 + make-fetch-happen: 15.0.6 + minipass: 7.1.3 + minipass-fetch: 5.0.2 + minizlib: 3.1.0 + npm-package-arg: 13.0.2 + proc-log: 6.1.0 + transitivePeerDependencies: + - supports-color + npm-run-all2@5.0.2: dependencies: ansi-styles: 5.2.0 @@ -19601,6 +20942,11 @@ snapshots: dependencies: path-key: 3.1.1 + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 @@ -19621,6 +20967,12 @@ snapshots: null-check@1.0.0: {} + null-loader@4.0.1(webpack@5.106.2): + dependencies: + loader-utils: 2.0.4 + schema-utils: 3.1.1 + webpack: 5.106.2(webpack-cli@5.1.4) + nwsapi@2.2.23: {} nyc@15.1.0: @@ -19737,6 +21089,10 @@ snapshots: dependencies: mimic-fn: 2.1.0 + onetime@7.0.0: + dependencies: + mimic-function: 5.0.1 + open@10.1.2: dependencies: default-browser: 5.2.1 @@ -19778,6 +21134,17 @@ snapshots: strip-ansi: 6.0.0 wcwidth: 1.0.1 + ora@9.4.1: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 3.4.0 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 7.0.1 + stdin-discarder: 0.3.2 + string-width: 8.2.1 + os-homedir@1.0.2: {} os-tmpdir@1.0.2: {} @@ -19848,10 +21215,24 @@ snapshots: eventemitter3: 4.0.7 p-timeout: 3.2.0 + p-queue@8.1.1: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 6.1.4 + + p-queue@9.3.1: + dependencies: + eventemitter3: 5.0.4 + p-timeout: 7.0.1 + p-timeout@3.2.0: dependencies: p-finally: 1.0.0 + p-timeout@6.1.4: {} + + p-timeout@7.0.1: {} + p-transform@1.3.0: dependencies: debug: 4.4.3 @@ -19859,6 +21240,11 @@ snapshots: transitivePeerDependencies: - supports-color + p-transform@5.0.1: + dependencies: + '@types/node': 25.9.1 + p-queue: 8.1.1 + p-try@2.2.0: {} p-wait-for@3.2.0: @@ -19874,6 +21260,13 @@ snapshots: package-json-from-dist@1.0.1: {} + package-json@10.0.1: + dependencies: + ky: 1.14.3 + registry-auth-token: 5.1.1 + registry-url: 6.0.1 + semver: 7.6.3 + package-manager-detector@0.2.8: {} pacote@12.0.3: @@ -19901,6 +21294,28 @@ snapshots: - bluebird - supports-color + pacote@21.5.1: + dependencies: + '@gar/promise-retry': 1.0.3 + '@npmcli/git': 7.0.2 + '@npmcli/installed-package-contents': 4.0.0 + '@npmcli/package-json': 7.0.5 + '@npmcli/promise-spawn': 9.0.1 + '@npmcli/run-script': 10.0.4 + cacache: 20.0.4 + fs-minipass: 3.0.3 + minipass: 7.1.3 + npm-package-arg: 13.0.2 + npm-packlist: 10.0.4 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.1 + proc-log: 6.1.0 + sigstore: 4.1.1 + ssri: 13.0.1 + tar: 7.5.19 + transitivePeerDependencies: + - supports-color + paged-request@2.0.2(debug@3.2.7): dependencies: axios: 0.21.4(debug@3.2.7) @@ -19918,6 +21333,12 @@ snapshots: just-diff: 5.2.0 just-diff-apply: 5.5.0 + parse-conflict-json@5.0.1: + dependencies: + json-parse-even-better-errors: 5.0.0 + just-diff: 6.0.2 + just-diff-apply: 5.5.0 + parse-json@2.2.0: dependencies: error-ex: 1.3.2 @@ -19937,6 +21358,14 @@ snapshots: lines-and-columns: 2.0.4 type-fest: 3.13.1 + parse-json@8.3.0: + dependencies: + '@babel/code-frame': 7.29.7 + index-to-position: 1.2.0 + type-fest: 4.41.0 + + parse-ms@4.0.0: {} + parse-semver@1.1.1: dependencies: semver: 5.7.1 @@ -19982,6 +21411,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -20029,8 +21460,6 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.2: {} - picomatch@4.0.4: {} pidtree@0.5.0: {} @@ -20070,6 +21499,11 @@ snapshots: cssesc: 3.0.0 util-deprecate: 1.0.2 + postcss-selector-parser@7.1.4: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + postcss@8.5.15: dependencies: nanoid: 3.3.12 @@ -20111,6 +21545,8 @@ snapshots: pretty-bytes@5.6.0: {} + pretty-bytes@7.1.0: {} + pretty-format@27.5.1: dependencies: ansi-regex: 5.0.1 @@ -20123,6 +21559,10 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-ms@9.3.0: + dependencies: + parse-ms: 4.0.0 + pretty@2.0.0: dependencies: condense-newlines: 0.2.1 @@ -20135,6 +21575,8 @@ snapshots: proc-log@4.2.0: {} + proc-log@6.1.0: {} + process-nextick-args@2.0.1: {} process-on-spawn@1.0.0: @@ -20143,10 +21585,14 @@ snapshots: process@0.11.10: {} + proggy@4.0.0: {} + promise-all-reject-late@1.0.1: {} promise-call-limit@1.0.2: {} + promise-call-limit@3.0.2: {} + promise-inflight@1.0.1: {} promise-retry@2.0.1: @@ -20251,7 +21697,6 @@ snapshots: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - optional: true react-is@17.0.2: {} @@ -20264,11 +21709,19 @@ snapshots: read-cmd-shim@3.0.1: {} + read-cmd-shim@6.0.0: {} + read-package-json-fast@2.0.3: dependencies: json-parse-even-better-errors: 2.3.1 npm-normalize-package-bin: 1.0.1 + read-package-up@12.0.0: + dependencies: + find-up-simple: 1.0.1 + read-pkg: 10.1.0 + type-fest: 5.8.0 + read-pkg-up@1.0.1: dependencies: find-up: 1.1.2 @@ -20285,6 +21738,14 @@ snapshots: normalize-package-data: 2.5.0 path-type: 1.1.0 + read-pkg@10.1.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 8.0.0 + parse-json: 8.3.0 + type-fest: 5.8.0 + unicorn-magic: 0.4.0 + read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 @@ -20400,6 +21861,19 @@ snapshots: unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.2.1 + registry-auth-token@5.1.1: + dependencies: + '@pnpm/npm-conf': 3.0.3 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + registry-url@7.2.0: + dependencies: + find-up-simple: 1.0.1 + ini: 5.0.0 + regjsgen@0.8.0: {} regjsparser@0.13.1: @@ -20508,6 +21982,11 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 + restore-cursor@5.1.0: + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + ret@0.1.15: {} retry@0.12.0: {} @@ -20545,6 +22024,8 @@ snapshots: run-async@2.4.1: {} + run-async@4.0.6: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -20614,7 +22095,7 @@ snapshots: schema-utils@3.1.1: dependencies: - '@types/json-schema': 7.0.9 + '@types/json-schema': 7.0.15 ajv: 6.15.0 ajv-keywords: 3.5.2(ajv@6.15.0) @@ -20813,6 +22294,12 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 + shelljs@0.8.5: + dependencies: + glob: 7.2.0 + interpret: 1.4.0 + rechoir: 0.6.2 + shelljs@0.9.2: dependencies: execa: 1.0.0 @@ -20827,6 +22314,11 @@ snapshots: minimist: 1.2.8 shelljs: 0.8.4 + shx@0.3.4: + dependencies: + minimist: 1.2.8 + shelljs: 0.8.5 + shx@0.4.0: dependencies: minimist: 1.2.8 @@ -20873,6 +22365,17 @@ snapshots: signal-exit@4.1.0: {} + sigstore@4.1.1: + dependencies: + '@sigstore/bundle': 4.0.0 + '@sigstore/core': 3.2.1 + '@sigstore/protobuf-specs': 0.5.1 + '@sigstore/sign': 4.1.1 + '@sigstore/tuf': 4.0.2 + '@sigstore/verify': 3.1.1 + transitivePeerDependencies: + - supports-color + simple-concat@1.0.1: optional: true @@ -21015,6 +22518,10 @@ snapshots: dependencies: lodash: 4.18.1 + sort-keys@6.0.1: + dependencies: + is-plain-obj: 4.1.0 + source-map-js@1.2.1: {} source-map-resolve@0.5.3: @@ -21081,6 +22588,11 @@ snapshots: spdx-exceptions: 2.3.0 spdx-license-ids: 3.0.11 + spdx-expression-parse@4.0.0: + dependencies: + spdx-exceptions: 2.3.0 + spdx-license-ids: 3.0.11 + spdx-license-ids@3.0.11: {} split-string@3.1.0: @@ -21109,6 +22621,10 @@ snapshots: dependencies: minipass: 7.1.2 + ssri@13.0.1: + dependencies: + minipass: 7.1.3 + ssri@8.0.1: dependencies: minipass: 3.3.6 @@ -21153,6 +22669,8 @@ snapshots: statuses@2.0.2: {} + stdin-discarder@0.3.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -21218,6 +22736,11 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string-width@8.2.1: + dependencies: + get-east-asian-width: 1.6.0 + strip-ansi: 7.2.0 + string.prototype.trim@1.2.10: dependencies: call-bind: 1.0.9 @@ -21272,10 +22795,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -21310,6 +22829,8 @@ snapshots: strip-final-newline@2.0.0: {} + strip-final-newline@4.0.0: {} + strip-indent@1.0.1: dependencies: get-stdin: 4.0.1 @@ -21359,6 +22880,8 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 + tagged-tag@1.0.0: {} + tapable@1.1.3: {} tapable@2.3.3: {} @@ -21389,6 +22912,14 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.19: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.3 + minizlib: 3.1.0 + yallist: 5.0.0 + teex@1.0.1: dependencies: streamx: 2.25.0 @@ -21561,6 +23092,8 @@ snapshots: treeverse@1.0.4: {} + treeverse@3.0.0: {} + trim-newlines@1.0.0: {} triple-beam@1.3.0: {} @@ -21625,6 +23158,16 @@ snapshots: typescript: 5.7.3 webpack: 5.106.2(webpack-cli@5.1.4) + ts-loader@9.6.2(loader-utils@2.0.4)(typescript@5.7.3)(webpack@5.106.2): + dependencies: + chalk: 4.1.2 + picomatch: 4.0.4 + source-map: 0.7.6 + typescript: 5.7.3 + webpack: 5.106.2(webpack-cli@5.1.4) + optionalDependencies: + loader-utils: 2.0.4 + ts-node@10.9.2(@types/node@14.18.63)(typescript@5.7.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -21701,6 +23244,14 @@ snapshots: tslib@2.8.1: {} + tuf-js@4.1.0: + dependencies: + '@tufjs/models': 4.1.0 + debug: 4.4.3 + make-fetch-happen: 15.0.6 + transitivePeerDependencies: + - supports-color + tunnel-agent@0.6.0: dependencies: safe-buffer: 5.2.1 @@ -21737,6 +23288,10 @@ snapshots: type-fest@4.41.0: {} + type-fest@5.8.0: + dependencies: + tagged-tag: 1.0.0 + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -21813,6 +23368,8 @@ snapshots: undici-types@7.24.6: {} + undici@6.27.0: {} + undici@7.25.0: {} unicode-canonical-property-names-ecmascript@2.0.1: {} @@ -21830,6 +23387,8 @@ snapshots: unicorn-magic@0.3.0: {} + unicorn-magic@0.4.0: {} + union-value@1.0.1: dependencies: arr-union: 3.1.0 @@ -21883,6 +23442,8 @@ snapshots: untildify@4.0.0: {} + untildify@6.0.0: {} + unzip-response@2.0.1: {} unzipper@0.10.14: @@ -21971,6 +23532,8 @@ snapshots: validate-npm-package-name@5.0.1: {} + validate-npm-package-name@7.0.2: {} + vary@1.1.2: {} verror@1.10.0: @@ -22132,6 +23695,8 @@ snapshots: walk-up-path@1.0.0: {} + walk-up-path@4.0.0: {} + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -22397,6 +23962,11 @@ snapshots: which-module@2.0.0: {} + which-package-manager@1.0.1: + dependencies: + find-up: 7.0.0 + micromatch: 4.0.8 + which-pm@2.2.0: dependencies: load-yaml-file: 0.2.0 @@ -22420,6 +23990,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@6.0.1: + dependencies: + isexe: 4.0.0 + wide-align@1.1.5: dependencies: string-width: 4.2.3 @@ -22536,6 +24110,10 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 3.0.7 + write-file-atomic@7.0.1: + dependencies: + signal-exit: 4.1.0 + ws@7.5.10(bufferutil@4.1.0)(utf-8-validate@5.0.10): optionalDependencies: bufferutil: 4.1.0 @@ -22593,6 +24171,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml@1.10.2: {} yargs-parser@18.1.3: @@ -22680,7 +24260,7 @@ snapshots: - supports-color optional: true - yeoman-environment@3.19.3(@types/node@14.18.63): + yeoman-environment@3.19.3(@types/node@25.9.1): dependencies: '@npmcli/arborist': 4.3.1 are-we-there-yet: 2.0.0 @@ -22698,7 +24278,7 @@ snapshots: find-up: 5.0.0 globby: 11.1.0 grouped-queue: 2.1.0 - inquirer: 8.2.7(@types/node@14.18.63) + inquirer: 8.2.7(@types/node@25.9.1) is-scoped: 2.1.0 isbinaryfile: 4.0.10 lodash: 4.18.1 @@ -22724,6 +24304,35 @@ snapshots: - bluebird - supports-color + yeoman-environment@6.1.0(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4))(mem-fs@4.1.4): + dependencies: + '@yeoman/adapter': 4.0.2(@types/node@14.18.63) + '@yeoman/conflicter': 4.1.0(@types/node@14.18.63)(@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4))(mem-fs@4.1.4) + '@yeoman/namespace': 2.1.0 + '@yeoman/transform': 2.1.2(@types/node@14.18.63) + '@yeoman/types': 1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4) + arrify: 3.0.0 + chalk: 5.6.2 + commander: 14.0.3 + debug: 4.4.3 + execa: 9.6.1 + fly-import: 1.0.0 + globby: 16.2.1 + grouped-queue: 2.1.0 + locate-path: 8.0.0 + lodash-es: 4.18.1 + mem-fs: 4.1.4 + mem-fs-editor: 12.0.4(@types/node@14.18.63)(mem-fs@4.1.4) + semver: 7.8.1 + slash: 5.1.0 + untildify: 6.0.0 + which-package-manager: 1.0.1 + transitivePeerDependencies: + - '@types/node' + - bare-abort-controller + - react-native-b4a + - supports-color + yeoman-generator@4.13.0(encoding@0.1.13): dependencies: async: 2.6.4 @@ -22758,8 +24367,37 @@ snapshots: - encoding - supports-color + yeoman-generator@8.2.2(@types/node@14.18.63)(@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4))(mem-fs@4.1.4): + dependencies: + '@types/debug': 4.1.13 + '@types/lodash-es': 4.17.12 + '@yeoman/namespace': 2.1.0 + '@yeoman/types': 1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4) + chalk: 5.6.2 + debug: 4.4.3 + execa: 9.6.1 + latest-version: 9.0.0 + lodash-es: 4.18.1 + mem-fs: 4.1.4 + mem-fs-editor: 12.0.4(@types/node@14.18.63)(mem-fs@4.1.4) + minimist: 1.2.8 + read-package-up: 12.0.0 + semver: 7.8.1 + simple-git: 3.36.0 + sort-keys: 6.0.1 + text-table: 0.2.0 + type-fest: 5.8.0 + optionalDependencies: + '@types/node': 14.18.63 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + yn@3.1.1: {} yocto-queue@0.1.0: {} yocto-queue@1.1.1: {} + + yoctocolors@2.1.2: {} diff --git a/projects/yeoman-ui/packages/backend/.vscodeignore b/projects/yeoman-ui/packages/backend/.vscodeignore index 5daafaa8..2d410cdf 100644 --- a/projects/yeoman-ui/packages/backend/.vscodeignore +++ b/projects/yeoman-ui/packages/backend/.vscodeignore @@ -5,4 +5,5 @@ !Wizard_logo.png !dist/media !dist/*.js +!dist/*.cjs !resources diff --git a/projects/yeoman-ui/packages/backend/package.json b/projects/yeoman-ui/packages/backend/package.json index aac628a0..47444b37 100644 --- a/projects/yeoman-ui/packages/backend/package.json +++ b/projects/yeoman-ui/packages/backend/package.json @@ -30,7 +30,7 @@ "type": "module", "main": "./dist/extension.js", "scripts": { - "bundle": "webpack --config webpack.config.cjs --mode production", + "bundle": "pnpm --filter yeoman-env-v3 bundle && shx mkdir -p ./dist && shx cp ./node_modules/yeoman-env-v3/dist/index.js ./dist/yeoman-env-v3.cjs && webpack --config webpack.config.cjs --mode production", "ci": "npm-run-all clean compile coverage bundle frontend:copy package coverage:copy", "clean": "shx rm -rf ./dist ./coverage *.vsix", "clean:frontend": "cd ./dist && shx rm -rf ./media", @@ -150,6 +150,14 @@ "SAP Fiori Elements" ], "description": "Saved search query." + }, + "ApplicationWizard.legacyGenerators": { + "type": "array", + "items": { + "type": "string" + }, + "default": [], + "markdownDescription": "Generators listed here run under the legacy yeoman-environment v3 runtime instead of the default v6 runtime. Entries are matched against a generator's namespace prefix (e.g. `@sap/generator-name` matches all its sub-generators). The environment variable `YEOMAN_UI_LEGACY_GENERATORS` (comma-separated) is unioned with this list" } } }, @@ -184,6 +192,8 @@ "@sap/bas-sdk": "3.13.7", "@sap/swa-for-sapbas-vsx": "2.0.16", "@vscode-logging/logger": "2.0.9", + "@yeoman/adapter": "4.0.2", + "@yeoman/types": "1.11.1", "chalk": "4.1.2", "cheerio": "^1.0.0-rc.12", "datauri": "4.1.0", @@ -195,8 +205,9 @@ "sudo-prompt": "9.2.1", "titleize": "2.1.0", "vscode-uri": "3.1.0", - "yeoman-environment": "3.19.3", - "yeoman-generator": "^4.13.0" + "yeoman-env-v3": "workspace:*", + "yeoman-environment": "6.1.0", + "yeoman-generator": "8.2.2" }, "devDependencies": { "@types/cheerio": "^0.22.31", @@ -209,8 +220,6 @@ "@types/vscode": "^1.50.0", "@types/webpack-env": "^1.16.2", "@types/ws": "^8.5.14", - "@types/yeoman-environment": "^2.10.3", - "@types/yeoman-generator": "5.2.14", "@vscode/vsce": "2.24.0", "c8": "11.0.0", "copy-webpack-plugin": "^12.0.2", diff --git a/projects/yeoman-ui/packages/backend/src/replayUtils.ts b/projects/yeoman-ui/packages/backend/src/replayUtils.ts index 197578af..84455a66 100644 --- a/projects/yeoman-ui/packages/backend/src/replayUtils.ts +++ b/projects/yeoman-ui/packages/backend/src/replayUtils.ts @@ -1,7 +1,6 @@ -import Environment from "yeoman-environment"; import type { IPrompt } from "@sap-devx/yeoman-ui-types"; import hash from "object-hash"; -import type TerminalAdapter from "yeoman-environment/lib/adapter"; +import type { PromptQuestions, PromptAnswers } from "@yeoman/adapter/types"; export enum ReplayState { Replaying, @@ -11,9 +10,7 @@ export enum ReplayState { export class ReplayUtils { // assuming that order of questions is consistent - private static getQuestionsHash( - questions: TerminalAdapter.Questions - ): string { + private static getQuestionsHash(questions: PromptQuestions): string { // we need exclude members that we manipulate in setDefault() below // we also need to exclude members set by custom event handlers // instead of blacklisting member, we whitelist them based on inquirer.js docs: @@ -35,12 +32,12 @@ export class ReplayUtils { return keyIndex < 0; }; - return hash(questions, { excludeKeys }); + return hash(questions as any, { excludeKeys }); } private static setDefaults( - questions: TerminalAdapter.Questions, - answers: Environment.Answers + questions: PromptQuestions, + answers: PromptAnswers ): void { for (const question of questions as any[]) { const name = question["name"]; @@ -57,9 +54,9 @@ export class ReplayUtils { } public isReplaying: boolean; - private readonly answersCache: Map; - private replayStack: Environment.Answers[]; - private replayQueue: Environment.Answers[]; + private readonly answersCache: Map; + private replayStack: PromptAnswers[]; + private replayQueue: PromptAnswers[]; private numOfSteps: number; private prompts: IPrompt[]; @@ -78,8 +75,8 @@ export class ReplayUtils { } public start( - questions: TerminalAdapter.Questions, - answers: Environment.Answers, + questions: PromptQuestions, + answers: PromptAnswers, numOfSteps: number ): void { this._rememberAnswers(questions, answers); @@ -88,18 +85,18 @@ export class ReplayUtils { this.isReplaying = true; } - public stop(questions: TerminalAdapter.Questions): IPrompt[] { + public stop(questions: PromptQuestions): IPrompt[] { const prompts = this.prompts; this.isReplaying = false; this.prompts = []; this.replayQueue = []; - const answers: Environment.Answers = this.replayStack.pop(); + const answers: PromptAnswers = this.replayStack.pop(); ReplayUtils.setDefaults(questions, answers); this.replayStack.splice(this.replayStack.length - this.numOfSteps + 1); return prompts; } - public next(promptCount: number, promptName: string): Environment.Answers { + public next(promptCount: number, promptName: string): PromptAnswers { if (promptCount > this.prompts.length) { const prompt: IPrompt = { name: promptName, @@ -115,17 +112,14 @@ export class ReplayUtils { this.prompts = prompts; } - public remember( - questions: TerminalAdapter.Questions, - answers: Environment.Answers - ): void { + public remember(questions: PromptQuestions, answers: PromptAnswers): void { this._rememberAnswers(questions, answers); this.replayStack.push(answers); } - public recall(questions: TerminalAdapter.Questions): void { + public recall(questions: PromptQuestions): void { const key: string = ReplayUtils.getQuestionsHash(questions); - const previousAnswers: Environment.Answers = this.answersCache.get(key); + const previousAnswers: PromptAnswers = this.answersCache.get(key); if (previousAnswers !== undefined) { ReplayUtils.setDefaults(questions, previousAnswers); } @@ -144,8 +138,8 @@ export class ReplayUtils { } private _rememberAnswers( - questions: TerminalAdapter.Questions, - answers: Environment.Answers + questions: PromptQuestions, + answers: PromptAnswers ): void { const key: string = ReplayUtils.getQuestionsHash(questions); this.answersCache.set(key, answers); diff --git a/projects/yeoman-ui/packages/backend/src/utils/env.ts b/projects/yeoman-ui/packages/backend/src/utils/env.ts index f6341fde..eafdb6cd 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/env.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/env.ts @@ -1,27 +1,39 @@ import _ from "lodash"; -import { homedir } from "os"; -import * as path from "path"; -import { existsSync } from "fs"; -import { isWin32, NpmCommand } from "./npm.js"; +import { createRequire } from "module"; +import { NpmCommand } from "./npm.js"; import * as customLocation from "./customLocation.js"; -import Environment from "yeoman-environment"; -import type TerminalAdapter from "yeoman-environment/lib/adapter"; +import Environment, { createEnv } from "yeoman-environment"; +import type { + LookupGeneratorMeta, + BaseEnvironmentOptions, + InputOutputAdapter, +} from "@yeoman/types"; import type { IChildLogger } from "@vscode-logging/logger"; +import type { LegacyEnv } from "yeoman-env-v3"; import { getClassLogger } from "../logger/logger-wrapper.js"; -import { createRequire } from "module"; +import { isLegacyNamespace } from "./legacyGenerators.js"; const _require = createRequire(import.meta.url); const GENERATOR = "generator-"; const NAMESPACE = "namespace"; +// Yeoman-environment v6 dropped the `namespaceToName` static helper. Our uses +// only need the "package-name-from-namespace" transform — reproduce it here. +function namespaceToName(ns: string): string { + const base = ns.replace(/:.*$/, ""); + return base.startsWith("@") + ? base.replace(/\/generator-/, "/") + : base.replace(/^generator-/, ""); +} + export type EnvGen = { - env: Environment; + env: Environment; gen: any; }; export type GeneratorData = { - generatorMeta: Environment.LookupGeneratorMeta; + generatorMeta: LookupGeneratorMeta; generatorPackageJson: any; }; @@ -39,10 +51,23 @@ export class GeneratorNotFoundError extends Error { } } +/** + * Contract for the runtime-loaded yeoman-environment v3 bundle. The full + * `LegacyEnv` type ships from the `yeoman-env-v3` workspace package — we only + * need `createEnv` at this layer. + */ +interface LegacyCompat { + createEnv( + args: undefined, + opts: Record, + adapter: any + ): LegacyEnv; +} + class EnvUtil { private logger: IChildLogger; - private existingNpmPathsPromise: Promise; - private allInstalledGensMeta: Environment.LookupGeneratorMeta[]; + private allInstalledGensMeta: LookupGeneratorMeta[]; + private legacyCompat: LegacyCompat | undefined; constructor() { try { @@ -50,57 +75,22 @@ class EnvUtil { } catch (e) { // nothing TODO : testing scope } - this.loadNpmPath(); } - public loadNpmPath(force = false) { - if (_.isNil(this.existingNpmPathsPromise) || force === true) { - this.existingNpmPathsPromise = this.getExistingNpmPath().then((paths) => { - this.logger?.debug("existing npm paths", { paths: paths.join(";") }); - return paths; - }); - } + public loadNpmPath(_force = false) { return this; } - private getEnvNpmPath(): Promise { - return new Promise((resolve) => { - setTimeout(() => { - // this operation takes up to 2 seconds - // it should be wrapped with setTimeout to provide promise like behaviour - resolve(this.createEnvInstance().getNpmPaths()); - }, 1); - }); - } - - private async getExistingNpmPath(): Promise { - const globalNpmPaths: string[] = await this.getEnvNpmPath(); - const userNpmPaths = homedir() - .split(path.sep) - .map((part, index, parts) => { - const resPath = path.join(...parts.slice(0, index + 1), "node_modules"); - return isWin32 ? resPath : path.join(path.sep, resPath); - }); - // uniq and existing only paths (global npm path is always added) - const paths: string[] = _.union(globalNpmPaths, userNpmPaths).filter( - (npmPath: string) => existsSync(npmPath) - ); - paths.push(await NpmCommand.getGlobalNodeModulesPath()); - - return _.uniq(paths); - } - private createEnvInstance( - args?: string | string[], - opts?: Environment.Options, - adapter?: TerminalAdapter - ): Environment { - return Environment.createEnv(args, opts, adapter); + opts?: BaseEnvironmentOptions, + adapter?: InputOutputAdapter + ): Environment { + return createEnv({ ...opts, ...(adapter ? { adapter } : {}) }); } private unloadGeneratorModules(genNamespace: string): void { let generatorName; - const genShortName = Environment.namespaceToName(genNamespace); + const genShortName = namespaceToName(genNamespace); if (genShortName.startsWith("@")) { const firstSlashIndex = genShortName.indexOf("/"); generatorName = `${GENERATOR}${genShortName.substring( @@ -119,24 +109,21 @@ class EnvUtil { } private lookupGensMeta( - options?: Environment.LookupOptions - ): Environment.LookupGeneratorMeta[] { + options?: Parameters[0] + ): Promise { return this.createEnvInstance().lookup(options); } - // returns installed generators meta from global and custom installation location - // custom installation generators have priority over global installed generators when names are identical - private async lookupAllGensMeta(): Promise< - Environment.LookupGeneratorMeta[] - > { - const globallyInstalledGensMeta = this.lookupGensMeta({ - npmPaths: await this.existingNpmPathsPromise, - }); + // Returns installed generators meta from global and custom installation location. + // Custom installation generators have priority over global installed generators + // when names are identical + private async lookupAllGensMeta(): Promise { + const globallyInstalledGensMeta = await this.lookupGensMeta(); const customNpmPath = customLocation.getNodeModulesPath(); const customInstalledGensMeta = _.isEmpty(customNpmPath) ? [] - : this.lookupGensMeta({ npmPaths: [customNpmPath] }); + : await this.lookupGensMeta({ npmPaths: [customNpmPath] }); const gensMeta = _.unionBy( customInstalledGensMeta, @@ -148,7 +135,7 @@ class EnvUtil { private async getGenMetadata( genNamespace: string - ): Promise { + ): Promise { this.allInstalledGensMeta = await this.lookupAllGensMeta(); const genMetadata = this.allInstalledGensMeta.find( @@ -164,13 +151,13 @@ class EnvUtil { } private genMainGensMeta( - gensMeta: Environment.LookupGeneratorMeta[] - ): Environment.LookupGeneratorMeta[] { + gensMeta: LookupGeneratorMeta[] + ): LookupGeneratorMeta[] { return gensMeta.filter((genMeta) => genMeta.namespace.endsWith(":app")); } private async getGensMetaByInstallationPath(): Promise< - Environment.LookupGeneratorMeta[] + LookupGeneratorMeta[] > { const npmInstallationPaths = [ customLocation.getNodeModulesPath() ?? @@ -181,7 +168,7 @@ class EnvUtil { private async getGeneratorsMeta( mainOnly = true - ): Promise { + ): Promise { this.allInstalledGensMeta = await this.lookupAllGensMeta(); return mainOnly ? this.genMainGensMeta(this.allInstalledGensMeta) @@ -189,8 +176,7 @@ class EnvUtil { } public async getAllGeneratorNamespaces(): Promise { - const gensMeta: Environment.LookupGeneratorMeta[] = - await this.getGeneratorsMeta(false); + const gensMeta: LookupGeneratorMeta[] = await this.getGeneratorsMeta(false); return _.map(gensMeta, (genMeta) => genMeta.namespace); } @@ -199,30 +185,87 @@ class EnvUtil { options: any, adapter: any ): Promise { - const meta: Environment.LookupGeneratorMeta = await this.getGenMetadata( - genNamespace - ); + const meta: LookupGeneratorMeta = await this.getGenMetadata(genNamespace); this.unloadGeneratorModules(genNamespace); - const env: Environment = this.createEnvInstance( + + // Fast path: namespace is in the include list → route straight to v3. + // This avoids the wasted work of trying v6 first for known-legacy + // generators and skips the wall-clock cost of a failed v6.create(). + if (isLegacyNamespace(genNamespace)) { + this.logger?.info( + `routing generator ${genNamespace} to legacy yeoman-environment v3 (matched include list)` + ); + return this.createLegacyEnvAndGen(genNamespace, meta, options, adapter); + } + + // Default path: try v6 first. If it throws while instantiating (typical + // symptom for v4/v5-shape generators under v6), fall back to v3. This + // makes the include list a *performance hint*, not a *filter*: users + // still see all their generators, unlisted-legacy ones just pay a small + // first-run cost. Operators can add explicit entries once they identify + // which packages are legacy to eliminate the retry. + this.logger?.debug( + `routing generator ${genNamespace} to yeoman-environment v6` + ); + + try { + const env: Environment = this.createEnvInstance( + { sharedOptions: { forwardErrorToEnvironment: true } as any }, + adapter + ); + + env.register(meta.resolved!, { + namespace: genNamespace, + packagePath: meta.packagePath, + }); + + const gen: any = await env.create(genNamespace, { options } as any); + + return { env, gen }; + } catch (error) { + this.logger?.info( + `yeoman-environment v6 could not create ${genNamespace}, falling back to legacy v3`, + { error: (error as Error)?.message } + ); + return this.createLegacyEnvAndGen(genNamespace, meta, options, adapter); + } + } + + /** + * Legacy code path: load yeoman-environment v3 from the pre-bundled compat + * package at runtime and use its v3-shape API. The compat bundle is copied + * into the extension's `dist/` folder next to `extension.js` at build time. + * + * v3's `env.create()` is synchronous — no await here. v3's `register()` + * takes a raw namespace string rather than the metadata object v6 accepts. + */ + private createLegacyEnvAndGen( + genNamespace: string, + meta: LookupGeneratorMeta, + options: any, + adapter: any + ): EnvGen { + if (!this.legacyCompat) { + this.legacyCompat = __non_webpack_require__( + "./yeoman-env-v3.cjs" + ) as LegacyCompat; + } + + const env = this.legacyCompat.createEnv( undefined, { sharedOptions: { forwardErrorToEnvironment: true } }, adapter ); - // @types/yeoman-environment bug: generatorPath is still not exposed on LookupGeneratorMeta - env.register(_.get(meta, "generatorPath"), genNamespace, meta.packagePath); - let gen: any = env.create(genNamespace, { options } as any); + env.register(meta.resolved, genNamespace); + const gen = env.create(genNamespace, { options }); - // Handle async generator creation (ESM modules) - if (gen && typeof gen.then === "function") { - gen = await gen; - } - - return { env, gen }; + return { env: env as unknown as Environment, gen }; } public async getGeneratorsData(mainOnly = true): Promise { - const gensMeta: Environment.LookupGeneratorMeta[] = - await this.getGeneratorsMeta(mainOnly); + const gensMeta: LookupGeneratorMeta[] = await this.getGeneratorsMeta( + mainOnly + ); const packageJsons = await NpmCommand.getPackageJsons(gensMeta); const gensData = packageJsons.map( @@ -238,7 +281,7 @@ class EnvUtil { let additional: AdditionalGenerator[] = []; gensData.forEach((genData) => { additional = additional.concat( - ...(genData.generatorPackageJson.additional_generators ?? []) + ...(genData?.generatorPackageJson.additional_generators ?? []) ); }); // remove duplicates @@ -272,7 +315,7 @@ class EnvUtil { } public async getGeneratorNamesWithOutdatedVersion(): Promise { - const gensMeta: Environment.LookupGeneratorMeta[] = + const gensMeta: LookupGeneratorMeta[] = await this.getGensMetaByInstallationPath(); return NpmCommand.getPackageNamesWithOutdatedVersion( this.genMainGensMeta(gensMeta) @@ -280,7 +323,7 @@ class EnvUtil { } public getGeneratorFullName(genNamespace: string): string { - const genName = Environment.namespaceToName(genNamespace); + const genName = namespaceToName(genNamespace); const parts = _.split(genName, "/"); return _.size(parts) === 1 ? `${GENERATOR}${genName}` diff --git a/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts b/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts new file mode 100644 index 00000000..a907b2ac --- /dev/null +++ b/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts @@ -0,0 +1,90 @@ +import { vscode } from "./vscodeProxy.js"; + +const ENV_VAR = "YEOMAN_UI_LEGACY_GENERATORS"; +const CONFIG_SECTION = "ApplicationWizard"; +const CONFIG_KEY = "legacyGenerators"; + +/** + * Returns the merged legacy-generator include list from two sources: + * + * 1. The `YEOMAN_UI_LEGACY_GENERATORS` environment variable (comma or JSON + * array). Wins when the same generator appears in both — operators use it + * to override VSCode settings landscape-wide without a hotfix release. + * 2. The `ApplicationWizard.legacyGenerators` VSCode setting (array of + * strings). Users tweak this per-workspace / per-user. + * + * Each entry is a **namespace prefix**. A generator whose namespace starts + * with `:` or equals `` runs under the legacy yeoman-environment + * v3 runtime. + * + * An empty list means all generators use the default v6 runtime. + */ +export function getLegacyGeneratorList(): string[] { + const list = new Set(); + + const envRaw = process.env[ENV_VAR]; + if (envRaw && envRaw.trim().length > 0) { + for (const entry of parseListLoosely(envRaw)) { + list.add(entry); + } + } + + // In the extension host `vscode` is the real API; in tests / dev flow it is + // the mock defined in vscodeProxy — both expose `workspace.getConfiguration`, + // so the same lookup path works everywhere. + try { + const configured = vscode.workspace + ?.getConfiguration(CONFIG_SECTION) + ?.get(CONFIG_KEY); + if (Array.isArray(configured)) { + for (const entry of configured) { + if (typeof entry === "string" && entry.trim().length > 0) { + list.add(entry.trim()); + } + } + } + } catch { + // getConfiguration can throw in narrow lifecycle windows (activation + // race). Fall back to env-var-only list — safer than crashing the flow. + } + + return Array.from(list); +} + +/** + * Whether a generator namespace should route to the legacy v3 runtime. + * + * Matches an entry when the namespace equals it or is a colon-delimited + * descendant. + */ +export function isLegacyNamespace( + genNamespace: string, + list = getLegacyGeneratorList() +): boolean { + return list.some( + (entry) => genNamespace === entry || genNamespace.startsWith(`${entry}:`) + ); +} + +function parseListLoosely(raw: string): string[] { + const trimmed = raw.trim(); + // Accept a JSON array — the env-var may carry structured payloads set by + // orchestration tooling. + if (trimmed.startsWith("[")) { + try { + const parsed = JSON.parse(trimmed); + if (Array.isArray(parsed)) { + return parsed + .filter((s): s is string => typeof s === "string") + .map((s) => s.trim()) + .filter((s) => s.length > 0); + } + } catch { + // fall through to comma-splitting + } + } + return trimmed + .split(",") + .map((s) => s.trim()) + .filter((s) => s.length > 0); +} diff --git a/projects/yeoman-ui/packages/backend/src/utils/npm.ts b/projects/yeoman-ui/packages/backend/src/utils/npm.ts index 69950070..fd469f57 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/npm.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/npm.ts @@ -9,7 +9,7 @@ import messages from "../messages.js"; import { vscode } from "./vscodeProxy.js"; import * as path from "path"; import * as npmFetch from "npm-registry-fetch"; -import type { LookupGeneratorMeta } from "yeoman-environment"; +import type { LookupGeneratorMeta } from "@yeoman/types"; import { getConsoleWarnLogger } from "../logger/console-logger.js"; import { Constants } from "./constants.js"; import { spawn } from "child_process"; diff --git a/projects/yeoman-ui/packages/backend/src/yeomanui.ts b/projects/yeoman-ui/packages/backend/src/yeomanui.ts index c00fafe5..8dc7eee5 100644 --- a/projects/yeoman-ui/packages/backend/src/yeomanui.ts +++ b/projects/yeoman-ui/packages/backend/src/yeomanui.ts @@ -25,7 +25,7 @@ import { import { vscode, getVscode } from "./utils/vscodeProxy.js"; import Generator from "yeoman-generator"; import Environment from "yeoman-environment"; -import type { Questions } from "yeoman-environment/lib/adapter"; +import type { PromptQuestions, PromptAnswers } from "@yeoman/adapter/types"; import { State } from "./utils/promise.js"; import { Constants } from "./utils/constants.js"; import { isUriFlow } from "./utils/workspaceFile.js"; @@ -53,7 +53,7 @@ export class YeomanUI { private readonly youiAdapter: YouiAdapter; private gen: Generator | undefined; private promptCount: number; - private currentQuestions: Questions; + private currentQuestions: PromptQuestions | undefined; private generatorName: string; private readonly replayUtils: ReplayUtils; private readonly customQuestionEventHandlers: Map< @@ -107,7 +107,7 @@ export class YeomanUI { this.youiAdapter = new YouiAdapter(youiEvents, output); this.youiAdapter.setYeomanUI(this); this.promptCount = 0; - this.currentQuestions = {}; + this.currentQuestions = undefined; this.customQuestionEventHandlers = new Map(); this.typesMap = new Map(); this.generatorsToIgnoreArray = []; @@ -427,7 +427,7 @@ export class YeomanUI { } public async showPrompt( - questions: Questions + questions: PromptQuestions ): Promise { this.promptCount++; const promptName = this.getPromptName(questions); @@ -442,7 +442,7 @@ export class YeomanUI { this.replayUtils.recall(questions); this.currentQuestions = questions; - const mappedQuestions: Questions = this.normalizeFunctions(questions); + const mappedQuestions: PromptQuestions = this.normalizeFunctions(questions); if (_.isEmpty(mappedQuestions)) { return {}; } @@ -456,7 +456,7 @@ export class YeomanUI { } private async back( - partialAnswers: Environment.Answers, + partialAnswers: PromptAnswers, numOfSteps: number ): Promise { this.replayUtils.start(this.currentQuestions, partialAnswers, numOfSteps); @@ -478,7 +478,7 @@ export class YeomanUI { } } - private getPromptName(questions: Questions): string { + private getPromptName(questions: PromptQuestions): string { const firstQuestionName = _.get(questions, "[0].name"); return firstQuestionName ? _.startCase(firstQuestionName) @@ -728,7 +728,9 @@ export class YeomanUI { this.logger.debug(error); } - const genName = Environment.namespaceToName(genNamespace); + const genName = genNamespace + .replace(/:.*$/, "") + .replace(/(?:^|(?<=\/))generator-/, ""); const genMessage = _.get( packageJson, "description", @@ -763,7 +765,7 @@ export class YeomanUI { * Functions are lost when being passed to client (using JSON.Stringify) * Also functions cannot be evaluated on client) */ - private normalizeFunctions(questions: Questions): Questions { + private normalizeFunctions(questions: PromptQuestions): PromptQuestions { this.addCustomQuestionEventHandlers(questions); return JSON.parse(JSON.stringify(questions, YeomanUI.funcReplacer)); } @@ -780,7 +782,7 @@ export class YeomanUI { } } - private addCustomQuestionEventHandlers(questions: Questions): void { + private addCustomQuestionEventHandlers(questions: PromptQuestions): void { for (const question of questions as any[]) { const guiType = _.get(question, "guiOptions.type", question.guiType); const questionHandlers = this.customQuestionEventHandlers.get(guiType); diff --git a/projects/yeoman-ui/packages/backend/src/youi-adapter.ts b/projects/yeoman-ui/packages/backend/src/youi-adapter.ts index 5e86fa97..45207ab4 100644 --- a/projects/yeoman-ui/packages/backend/src/youi-adapter.ts +++ b/projects/yeoman-ui/packages/backend/src/youi-adapter.ts @@ -3,7 +3,7 @@ import { YouiEvents } from "./youi-events.js"; import yoUiLog from "./utils/log.js"; import lodash from "lodash"; import chalk from "chalk"; -import type { Questions } from "yeoman-environment/lib/adapter"; +import type { PromptQuestions, PromptAnswers } from "@yeoman/adapter/types"; import { Output } from "./output.js"; const { get, isFunction } = lodash; @@ -41,8 +41,8 @@ export class YouiAdapter { * @param {Array} questions * @param {Function} callback */ - public async prompt( - questions: Questions, + public async prompt( + questions: PromptQuestions, cb?: (res: T1) => T2 ): Promise { if (this.yeomanui && questions) { diff --git a/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts new file mode 100644 index 00000000..9132affe --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts @@ -0,0 +1,209 @@ +import { createSandbox, SinonSandbox, SinonMock } from "sinon"; +import { expect } from "chai"; +import { vscode } from "../mockUtil.js"; +import { + getLegacyGeneratorList, + isLegacyNamespace, +} from "../../src/utils/legacyGenerators.js"; + +const ENV_VAR = "YEOMAN_UI_LEGACY_GENERATORS"; + +describe("legacyGenerators", () => { + let sandbox: SinonSandbox; + let wsConfigMock: SinonMock; + let originalEnv: string | undefined; + + before(() => { + sandbox = createSandbox(); + }); + + beforeEach(() => { + originalEnv = process.env[ENV_VAR]; + delete process.env[ENV_VAR]; + // The vscodeProxy mock returns the same configuration object on every + // getConfiguration() call, so mocking it once per test is stable. + wsConfigMock = sandbox.mock(vscode.workspace.getConfiguration()); + }); + + afterEach(() => { + if (originalEnv === undefined) { + delete process.env[ENV_VAR]; + } else { + process.env[ENV_VAR] = originalEnv; + } + wsConfigMock.verify(); + sandbox.restore(); + }); + + describe("getLegacyGeneratorList()", () => { + it("returns empty array when neither env-var nor setting is set", () => { + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal([]); + }); + + it("reads a single value from the env-var", () => { + process.env[ENV_VAR] = "@sap/adaptation-project"; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal([ + "@sap/adaptation-project", + ]); + }); + + it("splits a comma-separated env-var value", () => { + process.env[ENV_VAR] = "@sap/one, @sap/two,@sap/three"; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal([ + "@sap/one", + "@sap/two", + "@sap/three", + ]); + }); + + it("filters empty and whitespace-only comma entries", () => { + process.env[ENV_VAR] = ",, @sap/one ,, ,@sap/two,"; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); + }); + + it("parses a JSON array env-var value", () => { + process.env[ENV_VAR] = '["@sap/one", "@sap/two"]'; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); + }); + + it("falls back to comma splitting when JSON is malformed", () => { + // Starts with '[' but not valid JSON — the parser should try JSON, fail, + // then fall through to comma splitting rather than raise. + process.env[ENV_VAR] = "[not,json,but,commas"; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal([ + "[not", + "json", + "but", + "commas", + ]); + }); + + it("ignores non-string entries inside a JSON array", () => { + process.env[ENV_VAR] = '["@sap/one", 42, null, "@sap/two", ""]'; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); + }); + + it("returns empty array when env-var is set to whitespace only", () => { + process.env[ENV_VAR] = " "; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(getLegacyGeneratorList()).to.deep.equal([]); + }); + + it("returns the VSCode setting value when env-var is unset", () => { + wsConfigMock + .expects("get") + .withArgs("legacyGenerators") + .returns(["@sap/fiori"]); + expect(getLegacyGeneratorList()).to.deep.equal(["@sap/fiori"]); + }); + + it("unions env-var and VSCode setting, deduplicating identical entries", () => { + process.env[ENV_VAR] = "@sap/one,@sap/shared"; + wsConfigMock + .expects("get") + .withArgs("legacyGenerators") + .returns(["@sap/shared", "@sap/two"]); + expect(getLegacyGeneratorList()).to.deep.equal([ + "@sap/one", + "@sap/shared", + "@sap/two", + ]); + }); + + it("trims whitespace and skips empty strings in the VSCode setting", () => { + wsConfigMock + .expects("get") + .withArgs("legacyGenerators") + .returns([" @sap/one ", "", " ", "@sap/two"]); + expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); + }); + + it("skips non-string entries in the VSCode setting", () => { + wsConfigMock + .expects("get") + .withArgs("legacyGenerators") + .returns(["@sap/one", 42 as any, null as any, "@sap/two"]); + expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); + }); + + it("tolerates a non-array VSCode setting value", () => { + wsConfigMock + .expects("get") + .withArgs("legacyGenerators") + .returns("not-an-array" as any); + expect(getLegacyGeneratorList()).to.deep.equal([]); + }); + + it("survives getConfiguration() throwing (activation-race path)", () => { + process.env[ENV_VAR] = "@sap/from-env"; + sandbox + .stub(vscode.workspace, "getConfiguration") + .throws(new Error("configuration service not ready")); + expect(getLegacyGeneratorList()).to.deep.equal(["@sap/from-env"]); + }); + }); + + describe("isLegacyNamespace()", () => { + it("returns false for an empty list", () => { + expect(isLegacyNamespace("@sap/adaptation-project:app", [])).to.be.false; + }); + + it("matches an exact namespace", () => { + expect( + isLegacyNamespace("@sap/adaptation-project", [ + "@sap/adaptation-project", + ]) + ).to.be.true; + }); + + it("matches a colon-delimited descendant of an entry", () => { + expect( + isLegacyNamespace("@sap/adaptation-project:app", [ + "@sap/adaptation-project", + ]) + ).to.be.true; + expect( + isLegacyNamespace("@sap/adaptation-project:adp:sub", [ + "@sap/adaptation-project", + ]) + ).to.be.true; + }); + + it("rejects a namespace that only shares a name prefix (no colon boundary)", () => { + // "@sap/adaptation-project-extended" must NOT match "@sap/adaptation-project" + expect( + isLegacyNamespace("@sap/adaptation-project-extended:app", [ + "@sap/adaptation-project", + ]) + ).to.be.false; + }); + + it("rejects a namespace not in the list", () => { + expect(isLegacyNamespace("@sap/fiori:app", ["@sap/adaptation-project"])) + .to.be.false; + }); + + it("matches when any of several list entries applies", () => { + const list = ["@sap/fiori", "@sap/adaptation-project", "@bas-dev/cicd"]; + expect(isLegacyNamespace("@sap/fiori:abap", list)).to.be.true; + expect(isLegacyNamespace("@bas-dev/cicd", list)).to.be.true; + expect(isLegacyNamespace("@sap/unrelated:app", list)).to.be.false; + }); + + it("defaults to the merged list from env + settings when none is passed", () => { + process.env[ENV_VAR] = "@sap/fiori"; + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(isLegacyNamespace("@sap/fiori:app")).to.be.true; + // second call re-reads the default list — set up a fresh expectation + wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); + expect(isLegacyNamespace("@sap/other:app")).to.be.false; + }); + }); +}); diff --git a/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts b/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts index c3cd8da9..36a142cd 100644 --- a/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts +++ b/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts @@ -18,7 +18,7 @@ import messages from "../src/messages.js"; import { AnalyticsWrapper } from "../src/usage-report/usage-analytics-wrapper.js"; import { AppWizard, MessageType } from "@sap-devx/yeoman-ui-types"; import { Env } from "../src/utils/env.js"; -import Environment from "yeoman-environment"; +import Environment, { createEnv } from "yeoman-environment"; import { createFlowPromise } from "../src/utils/promise.js"; import { Constants } from "../src/utils/constants.js"; @@ -1225,7 +1225,7 @@ describe("yeomanui unit test", () => { q2: "y", q3: "z", }; - ReplayUtils["setDefaults"](questions, answers); + ReplayUtils["setDefaults"](questions as any, answers); for (const question of questions) { expect((question as any)["__origAnswer"]).to.equal( (answers)[question.name] @@ -1244,7 +1244,7 @@ describe("yeomanui unit test", () => { q1: "x", q3: "z", }; - ReplayUtils["setDefaults"](questions, answers); + ReplayUtils["setDefaults"](questions as any, answers); const question = _.find(questions, { name: "q2" }); expect((question as any).__origAnswer).to.be.undefined; expect((question as any).__ForceDefault).to.be.undefined; @@ -1260,7 +1260,7 @@ describe("yeomanui unit test", () => { {}, flowPromise.state ); - const env: Environment = Environment.createEnv(); + const env: Environment = createEnv(); const envMock = sandbox.mock(env); const gen = { on: () => "" }; const genMock = sandbox.mock(gen); @@ -1286,7 +1286,7 @@ describe("yeomanui unit test", () => { ); yeomanUiInstance["onUncaughtException"] = () => ""; const onUncaughtExceptionBefore = yeomanUiInstance["onUncaughtException"]; - const env: Environment = Environment.createEnv(); + const env: Environment = createEnv(); const envMock = sandbox.mock(env); const gen = { on: () => "" }; const genMock = sandbox.mock(gen); @@ -1393,7 +1393,7 @@ describe("yeomanui unit test", () => { flowPromise.state ); const questions = [{ name: "q1" }]; - const response = await yeomanUiInstance.showPrompt(questions); + const response = await yeomanUiInstance.showPrompt(questions as any); expect(response.firstName).to.equal(firstName); }); @@ -1429,12 +1429,12 @@ describe("yeomanui unit test", () => { return Promise.resolve(); }; let questions = [{ name: "q1" }]; - let response = await yeomanUiInstance.showPrompt(questions); + let response = await yeomanUiInstance.showPrompt(questions as any); expect(response.firstName).to.equal(firstName); questions = [{ name: "q2" }]; - response = await yeomanUiInstance.showPrompt(questions); + response = await yeomanUiInstance.showPrompt(questions as any); expect(response.country).to.equal(country); expect(yeomanUiInstance["replayUtils"]["isReplaying"]).to.be.false; @@ -1442,7 +1442,7 @@ describe("yeomanui unit test", () => { expect(yeomanUiInstance["replayUtils"]["isReplaying"]).to.be.true; questions = [{ name: "q1" }]; - response = await yeomanUiInstance.showPrompt(questions); + response = await yeomanUiInstance.showPrompt(questions as any); expect(response.firstName).to.equal(firstName); }); }); @@ -1653,7 +1653,7 @@ describe("yeomanui unit test", () => { const testEventFunction = () => { return true; }; - const questions = [ + const questions: any[] = [ { name: "q1", guiType: "questionType", @@ -1703,7 +1703,7 @@ describe("yeomanui unit test", () => { ); yeomanUiInstance["currentQuestions"] = [ { name: "question1", guiType: "questionType" }, - ]; + ] as any; const response = await yeomanUiInstance["evaluateMethod"]( null, "question1", @@ -1728,7 +1728,7 @@ describe("yeomanui unit test", () => { return true; }, }, - ]; + ] as any; const response = await yeomanUiInstance["evaluateMethod"]( null, "question1", @@ -1764,7 +1764,7 @@ describe("yeomanui unit test", () => { flowPromise.state ); yeomanUiInstance["gen"] = Object.create({}); - yeomanUiInstance["gen"].options = {}; + (yeomanUiInstance["gen"] as any).options = {}; yeomanUiInstance["currentQuestions"] = [ { name: "question1", @@ -1772,7 +1772,7 @@ describe("yeomanui unit test", () => { throw new Error("Error"); }, }, - ]; + ] as any; try { await yeomanUiInstance["evaluateMethod"](null, "question1", "method1"); } catch (e) { @@ -1790,7 +1790,7 @@ describe("yeomanui unit test", () => { flowPromise.state ); yeomanUiInstance["gen"] = Object.create({}); - yeomanUiInstance["gen"].options = {}; + (yeomanUiInstance["gen"] as any).options = {}; yeomanUiInstance["currentQuestions"] = undefined; try { await yeomanUiInstance["evaluateMethod"](null, "question1", "method1"); diff --git a/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts b/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts index 1475c1c0..fc5d3f1f 100644 --- a/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts +++ b/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts @@ -123,7 +123,7 @@ describe("YouiAdapter", () => { const youiAdapter = new YouiAdapter(youiEvents, outputChannel); youiAdapter.setYeomanUI(yeomanUi); const questions = [{ name: "q1" }]; - const response: any = await youiAdapter.prompt(questions, null); + const response: any = await youiAdapter.prompt(questions as any, null); expect(response.firstName).to.equal(firstName); expect(response.lastName).to.equal(lastName); }); diff --git a/projects/yeoman-ui/packages/backend/tsconfig.json b/projects/yeoman-ui/packages/backend/tsconfig.json index a7dde15e..9bbd5234 100644 --- a/projects/yeoman-ui/packages/backend/tsconfig.json +++ b/projects/yeoman-ui/packages/backend/tsconfig.json @@ -18,12 +18,7 @@ "allowSyntheticDefaultImports": true, "traceResolution": false, "declaration": true, - "skipLibCheck": true, - "paths": { - "yeoman-environment/lib/adapter": [ - "./node_modules/@types/yeoman-environment/lib/adapter.d.ts" - ] - } + "skipLibCheck": true }, "include": ["src/**/*", "test/**/*"], "ts-node": { diff --git a/projects/yeoman-ui/packages/backend/webpack.config.cjs b/projects/yeoman-ui/packages/backend/webpack.config.cjs index 3d086b48..1c96263a 100644 --- a/projects/yeoman-ui/packages/backend/webpack.config.cjs +++ b/projects/yeoman-ui/packages/backend/webpack.config.cjs @@ -6,10 +6,26 @@ const path = require("path"); const TerserPlugin = require("terser-webpack-plugin"); /** - * Investigate the usage of "import(/webpackIgnore: true / 'ignored-module.js');" - * https://webpack.js.org/api/module-methods/#magic-comments - * This will become relevant once we move to the newer versions of yeoman-evnironment - * that require the migration to ESM modules of the yeoman-ui. + * VSCode extension bundle for yeoman-ui backend. + * + * Output is native ESM (experiments.outputModule + library.type: "module") + * — VSCode 1.100+ runs extension code as ESM in the extension host. + * + * Under ESM output, webpack passes `import.meta.url` and native + * `createRequire(import.meta.url)` through untouched, so most of the patches + * needed by a CJS bundle of yeoman-environment v6 are unnecessary here — v6's + * `store.js` gets its native runtime `require` and can load generators from + * disk directly. + * + * What is still needed: + * - Externalize `vscode` (provided by the extension host). + * - Load `yeoman-env-v3` at runtime via + * `__non_webpack_require__("./yeoman-env-v3.cjs")` — its own build produced + * a self-contained CJS bundle that is copied into dist/ before webpack. + * - String-replace-loader patches for a handful of third-party CJS packages + * that do dynamic `require()` calls webpack cannot statically resolve. + * - Keep class/function names so v6 does not re-mangle dynamic ESM class + * lookups at generator run time. */ /**@type {import('webpack').Configuration}*/ @@ -30,9 +46,19 @@ const config = { }, devtoolModuleFilenameTemplate: "../[resource-path]", }, + externalsType: "module", externals: { + // vscode is provided by the extension host, not bundled vscode: "module vscode", - // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ + // spdx-* are large data-only packages; keep them out of the bundle. + "spdx-license-ids": "commonjs2 spdx-license-ids", + "spdx-license-ids/deprecated": "commonjs2 spdx-license-ids/deprecated", + "spdx-exceptions": "commonjs2 spdx-exceptions", + // Optional native metric packages that Application Insights tries to load; + // absent in production. + "@azure/functions-core": "commonjs2 @azure/functions-core", + "applicationinsights-native-metrics": + "commonjs2 applicationinsights-native-metrics", }, resolve: { modules: ["node_modules"], @@ -56,96 +82,135 @@ const config = { }, ], }, + // yeoman-environment v6 store.js: `require(meta.resolved)` loads a + // generator module from disk at runtime. Webpack's static analyzer + // would try to resolve it through the bundle graph — force it native. { - test: /yeoman-environment[/|\\]lib[/|\\]environment.js/, + test: /yeoman-environment[/|\\]dist[/|\\]store\.js/, loader: "string-replace-loader", options: { - search: "require[.]resolve[(]", - replace: "__non_webpack_require__.resolve(", + search: "require\\(meta\\.resolved\\)", + replace: "__non_webpack_require__(meta.resolved)", flags: "g", }, }, - // We replace require() with __non_webpack_require__() to bypass webpack's module resolution and use - // Node's native require at runtime, allowing dynamic loading of generators installed globally or locally. + // ...and the parallel require.resolve() call. { - test: /yeoman-environment[/|\\]lib[/|\\]util[/|\\]esm.js/, + test: /yeoman-environment[/|\\]dist[/|\\]store\.js/, loader: "string-replace-loader", options: { - search: "require[(]", - replace: "__non_webpack_require__(", + search: "require\\.resolve\\(meta\\.resolved\\)", + replace: "__non_webpack_require__.resolve(meta.resolved)", flags: "g", }, }, - // ESM (ES Module) dynamic import workaround for bundled context: - // Webpack processes dynamic import() calls at build time, converting them to webpack's chunk loading system. - // However, yeoman-environment's esm.js needs to use native Node.js dynamic import() at runtime to load - // external .mjs generator files from the file system (not bundled). - // We wrap import() in a Function constructor to hide it from webpack's static analysis, forcing it to - // use the native import() at runtime. This is similar to __non_webpack_require__ but for ESM modules. + // store.js falls back to dynamic import() for ESM generators. Webpack + // would turn this into its own chunk loader, breaking runtime loading of + // generators from disk. Wrap in Function() to hide it from webpack. { - test: /yeoman-environment[/|\\]lib[/|\\]util[/|\\]esm.js/, + test: /yeoman-environment[/|\\]dist[/|\\]store\.js/, loader: "string-replace-loader", options: { - search: "return import[(]", + search: "return import\\(", replace: "return new Function('specifier', 'return import(specifier)')(", flags: "g", }, }, + // environment-full.js: `await import('yeoman-generator')` is a static + // string, so webpack CAN resolve and bundle yeoman-generator — but doing + // so triples the bundle size and yeoman-generator itself does dynamic + // filesystem loading. Keep it as a native runtime import so the + // generator's own installed copy on disk is used. + { + test: /yeoman-environment[/|\\]dist[/|\\]environment-full\.js/, + loader: "string-replace-loader", + options: { + search: "await import\\('yeoman-generator'\\)", + replace: + "await new Function('s', 'return import(s)')('yeoman-generator')", + flags: "g", + }, + }, + // fly-import (yeoman-environment's fallback generator loader) does a + // native dynamic import that must not be bundled. { - test: /yeoman-environment[/|\\]lib[/|\\]store.js/, + test: /fly-import[/|\\]dist[/|\\]fly-import\.js/, loader: "string-replace-loader", options: { - search: "require[(]path", - replace: "__non_webpack_require__(path", + search: "async \\(\\) => import\\(", + replace: "async () => new Function('s', 'return import(s)')(", flags: "g", }, }, + // yeoman-generator v8 lifecycle.js also loads sub-generators from disk. { - test: /yeoman-environment[/|\\]lib[/|\\]util[/|\\]repository.js/, + test: /yeoman-generator[/|\\]dist[/|\\]actions[/|\\]lifecycle\.js/, loader: "string-replace-loader", options: { - search: "require[(]packageJson", - replace: "__non_webpack_require__(packageJson", + search: "await import\\(", + replace: "await new Function('s', 'return import(s)')(", flags: "g", }, }, + // yeoman-environment v6 module-lookup.js runs at module load time: + // const __filename = fileURLToPath(import.meta.url); + // const __dirname = dirname(__filename); + // const PROJECT_ROOT = join(__dirname, '..'); + // const PACKAGE_NAME_PATTERN = + // [JSON.parse(readFileSync(join(PROJECT_ROOT, 'package.json')).toString()).name]; + // + // When webpack inlines this module into a code-split chunk, `import.meta.url` + // in the inlined body is baked to the build-machine file:// URL, so at runtime + // on another machine (BAS, CI, …) readFileSync throws ENOENT for the frozen + // absolute path. Also, the un-referenced `fileURLToPath(import.meta.url)` call + // survives dead-code elimination and leaks the build-machine path as a string + // literal into the shipped bundle. Neutralize all four preamble constants so + // no filesystem I/O runs at load time and no build-machine path is retained. { - test: /yeoman-environment[/|\\]lib[/|\\]util[/|\\]repository.js/, + test: /yeoman-environment[/|\\]dist[/|\\]module-lookup\.js/, loader: "string-replace-loader", options: { - search: "require[(]absolutePath", - replace: "__non_webpack_require__(absolutePath", + search: + "const __filename = fileURLToPath\\(import\\.meta\\.url\\);", + replace: + "const __filename = ''; // neutralized by webpack.config.cjs — bake-machine import.meta.url is not portable", flags: "g", }, }, { - test: /yeoman-environment[/|\\]lib[/|\\]resolver.js/, + test: /yeoman-environment[/|\\]dist[/|\\]module-lookup\.js/, loader: "string-replace-loader", options: { - search: "require[(]path", - replace: "__non_webpack_require__(path", + search: "const __dirname = dirname\\(__filename\\);", + replace: + "const __dirname = ''; // neutralized by webpack.config.cjs", flags: "g", }, }, { - test: /yeoman-environment[/|\\]lib[/|\\]resolver.js/, + test: /yeoman-environment[/|\\]dist[/|\\]module-lookup\.js/, loader: "string-replace-loader", options: { - search: "PACKAGE_NAME_PATTERN = [[]require.*", - replace: "PACKAGE_NAME_PATTERN = ['yeoman-environment'];", + search: + "const PROJECT_ROOT = join\\(__dirname, '\\.\\.'\\);", + replace: + "const PROJECT_ROOT = ''; // neutralized by webpack.config.cjs", flags: "g", }, }, { - test: /yeoman-environment[/|\\]lib[/|\\]composability.js/, + test: /yeoman-environment[/|\\]dist[/|\\]module-lookup\.js/, loader: "string-replace-loader", options: { - search: "require[(]'yeoman", - replace: "__non_webpack_require__('yeoman", + search: + "const PACKAGE_NAME_PATTERN = \\[JSON\\.parse\\(readFileSync\\(join\\(PROJECT_ROOT, 'package\\.json'\\)\\)\\.toString\\(\\)\\)\\.name\\];", + replace: + "const PACKAGE_NAME_PATTERN = ['yeoman-environment']; // inlined by webpack.config.cjs — was readFileSync(bake-machine path)", flags: "g", }, }, + // colors loads themes via a dynamic require(theme) call. { test: /node_modules[/|\\]colors[/|\\]lib[/|\\]colors.js/, loader: "string-replace-loader", @@ -155,6 +220,8 @@ const config = { flags: "g", }, }, + // node-gyp is a build-time tool we never invoke at runtime; its dynamic + // requires would fail static analysis. { test: /node-gyp[/|\\]lib[/|\\]node-gyp.js/, loader: "string-replace-loader", @@ -182,24 +249,6 @@ const config = { flags: "g", }, }, - { - test: /yeoman-environment[/|\\]lib[/|\\]util[/|\\]binary-diff.js/, - loader: "string-replace-loader", - options: { - search: "const istextorbinary.*", - replace: "import {isBinary} from 'istextorbinary';", - flags: "g", - }, - }, - { - test: /yeoman-environment[/|\\]lib[/|\\]util[/|\\]binary-diff.js/, - loader: "string-replace-loader", - options: { - search: "istextorbinary[.]isBinary", - replace: "isBinary", - flags: "g", - }, - }, { test: /node_modules[/|\\]download-stats[/|\\]lib[/|\\]utils.js/, loader: "string-replace-loader", @@ -218,6 +267,7 @@ const config = { flags: "g", }, }, + // ejs's `require.extensions` is legacy Node API webpack cannot polyfill. { test: /node_modules[/|\\]ejs[/|\\]lib[/|\\]ejs.js/, loader: "string-replace-loader", @@ -227,6 +277,21 @@ const config = { flags: "g", }, }, + // env.ts uses `_require.cache` (a runtime `createRequire` result) to + // unload generator modules between runs. Under ESM output that + // `createRequire` runs natively at runtime and its `.cache` is a live + // property — no webpack rewrite needed. Rule kept out intentionally. + // vscodeProxy.ts inspects require.main to detect the extension host. + { + test: /utils[/|\\]vscodeProxy.ts/, + loader: "string-replace-loader", + options: { + search: "require[.]main", + replace: "__non_webpack_require__.main", + flags: "g", + }, + }, + // ws's optional native accelerators — kept optional at runtime. { test: /node_modules[/|\\]ws[/|\\]lib[/|\\]buffer-util.js/, loader: "string-replace-loader", diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/.gitignore b/projects/yeoman-ui/packages/yeoman-env-v3/.gitignore new file mode 100644 index 00000000..de4d1f00 --- /dev/null +++ b/projects/yeoman-ui/packages/yeoman-env-v3/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/package.json b/projects/yeoman-ui/packages/yeoman-env-v3/package.json new file mode 100644 index 00000000..baaa9d59 --- /dev/null +++ b/projects/yeoman-ui/packages/yeoman-env-v3/package.json @@ -0,0 +1,31 @@ +{ + "name": "yeoman-env-v3", + "version": "1.25.0", + "private": true, + "description": "TypeScript wrapper that bundles yeoman-environment v3 for the yeoman-ui extension's legacy-generator code path", + "license": "Apache 2.0", + "author": "SAP SE", + "repository": { + "type": "git", + "url": "https://github.com/SAP/app-studio-toolkit.git", + "directory": "projects/yeoman-ui/packages/yeoman-env-v3" + }, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "scripts": { + "clean": "shx rm -rf ./dist", + "compile": "tsc --noEmit", + "bundle": "webpack --config webpack.config.cjs --mode production" + }, + "dependencies": { + "yeoman-environment": "3.19.3" + }, + "devDependencies": { + "null-loader": "4.0.1", + "shx": "0.3.4", + "string-replace-loader": "3.0.3", + "ts-loader": "9.6.2", + "webpack": "5.106.2", + "webpack-cli": "5.1.4" + } +} diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts new file mode 100644 index 00000000..e7fee87d --- /dev/null +++ b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts @@ -0,0 +1,20 @@ +const YeomanEnvironment = require("yeoman-environment") as any; + +export interface LegacyEnv { + register(resolved: string, namespace: string): void; + create(namespace: string, options: { options: any }): any; + runGenerator(gen: any): Promise; + lookup(options?: any): any; + runLoop: any; + adapter: any; + sharedFs: any; + on(event: string, cb: (...args: any[]) => void): unknown; + emit(event: string, ...args: any[]): boolean; + removeAllListeners(event?: string): unknown; +} + +export const createEnv: ( + args?: string[], + opts?: Record, + adapter?: any +) => LegacyEnv = YeomanEnvironment.createEnv ?? YeomanEnvironment; diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json b/projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json new file mode 100644 index 00000000..7a6976ec --- /dev/null +++ b/projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json @@ -0,0 +1,16 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src", + "target": "es2019", + "module": "commonjs", + "moduleResolution": "node", + "esModuleInterop": true, + "allowSyntheticDefaultImports": true, + "skipLibCheck": true, + "declaration": true + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "dist"] +} diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs b/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs new file mode 100644 index 00000000..f622674d --- /dev/null +++ b/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs @@ -0,0 +1,140 @@ +//@ts-check +"use strict"; + +const path = require("path"); +const fs = require("fs"); + +// Resolve the real path to yeoman-environment@3 through the symlink pnpm created +// under this package's node_modules. Without realpathSync webpack might follow +// a hoisted copy higher up in the pnpm store and bundle a mismatched version. +const compatNodeModules = path.resolve(__dirname, "node_modules"); +const envV3Root = fs.realpathSync( + path.join(compatNodeModules, "yeoman-environment") +); + +// istextorbinary and errlop ship multiple editions via the 'editions' loader, +// several of which are ESM files webpack can't parse. Alias each to its known +// CJS edition, resolved from v3's own dep tree. +const envV3Req = require("module").createRequire(envV3Root + "/package.json"); +const istextorbinaryCJS = envV3Req + .resolve("istextorbinary") + .replace(/index\.js$/, "edition-node-0.12/index.js"); +const errlop = envV3Req.resolve("errlop"); + +/** @type {import('webpack').Configuration} */ +module.exports = { + target: "node", + mode: "production", + entry: "./src/index.ts", + output: { + path: path.resolve(__dirname, "dist"), + filename: "index.js", + libraryTarget: "commonjs2", + }, + optimization: { + // Keep class and function names — generators inspect env.runLoop and + // rely on structural class identity that mangling would break. + minimize: false, + }, + externals: { + // spdx-* are large data packages and already present in the backend bundle. + "spdx-license-ids": "commonjs spdx-license-ids", + "spdx-license-ids/deprecated": "commonjs spdx-license-ids/deprecated", + "spdx-exceptions": "commonjs spdx-exceptions", + // node-gyp does dynamic require('./' + command) and pulls in a .cs file + // webpack can't parse. Only relevant during native module compilation, + // never during generator execution — externalize it. + "node-gyp": "commonjs node-gyp", + // bluebird is an optional peer of promise-inflight; not present in pnpm store. + bluebird: "commonjs bluebird", + }, + resolve: { + extensions: [".ts", ".js", ".json"], + alias: { + "yeoman-environment": envV3Root, + istextorbinary: istextorbinaryCJS, + errlop: errlop, + }, + }, + module: { + rules: [ + // TypeScript entry point — transpile with ts-loader against the local + // tsconfig.json (commonjs target, matching the bundle output shape). + { + test: /\.ts$/, + exclude: /node_modules/, + use: [{ loader: "ts-loader" }], + }, + // Webpack can't parse .cs files pulled in by node-gyp's dynamic requires — + // return an empty module for them. + { + test: /\.cs$/, + use: "null-loader", + }, + // resolver.js reads PROJECT_ROOT/package.json at module load time to get the + // package name pattern. When bundled, __dirname points at dist/ instead of + // the v3 source root, so keep that particular require native at runtime. + { + test: /yeoman-environment[/\\]lib[/\\]resolver\.js$/, + loader: "string-replace-loader", + options: { + search: "require\\(path\\.join\\(PROJECT_ROOT,", + replace: "__non_webpack_require__(path.join(PROJECT_ROOT,", + flags: "g", + }, + }, + // resolver.js uses require.resolve() to locate installed generator packages + // from the machine, not the bundle — must stay native. + { + test: /yeoman-environment[/\\]lib[/\\]resolver\.js$/, + loader: "string-replace-loader", + options: { + search: "require\\.resolve\\(", + replace: "__non_webpack_require__.resolve(", + flags: "g", + }, + }, + // esm.js loads generator files from disk by variable path — both require() + // calls in the file are dynamic and must be native. + { + test: /yeoman-environment[/\\]lib[/\\]util[/\\]esm\.js$/, + loader: "string-replace-loader", + options: { + search: "require\\(fileToImport\\)", + replace: "__non_webpack_require__(fileToImport)", + flags: "g", + }, + }, + // environment.js loads a package.json from an installed generator at runtime. + { + test: /yeoman-environment[/\\]lib[/\\]environment\.js$/, + loader: "string-replace-loader", + options: { + search: "require\\(`\\$\\{packageName\\}", + replace: "__non_webpack_require__(`${packageName}", + flags: "g", + }, + }, + // environment.js uses require.resolve() to locate modules at runtime. + { + test: /yeoman-environment[/\\]lib[/\\]environment\.js$/, + loader: "string-replace-loader", + options: { + search: "require\\.resolve\\(", + replace: "__non_webpack_require__.resolve(", + flags: "g", + }, + }, + // repository.js loads a package.json path that was resolved from disk. + { + test: /yeoman-environment[/\\]lib[/\\]util[/\\]repository\.js$/, + loader: "string-replace-loader", + options: { + search: "require\\(packageJson\\)", + replace: "__non_webpack_require__(packageJson)", + flags: "g", + }, + }, + ], + }, +}; From f703dbf6c301e8cb0c0f2381b79600e375b11153 Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Tue, 7 Jul 2026 19:05:08 +0500 Subject: [PATCH 2/8] fix: "Cannot find module 'yeoman-env-v3'..." build ci error --- projects/yeoman-ui/packages/backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/yeoman-ui/packages/backend/package.json b/projects/yeoman-ui/packages/backend/package.json index 47444b37..0fbd074a 100644 --- a/projects/yeoman-ui/packages/backend/package.json +++ b/projects/yeoman-ui/packages/backend/package.json @@ -34,7 +34,7 @@ "ci": "npm-run-all clean compile coverage bundle frontend:copy package coverage:copy", "clean": "shx rm -rf ./dist ./coverage *.vsix", "clean:frontend": "cd ./dist && shx rm -rf ./media", - "compile": "tsc", + "compile": "pnpm --filter yeoman-env-v3 bundle && tsc", "compile:watch": "tsc -watch", "coverage": "NODE_OPTIONS='--max-old-space-size=8192 --no-experimental-strip-types' c8 mocha", "coverage:copy": "shx mkdir -p ../../../../coverage && shx cp -u ./coverage/lcov.info ../../../../coverage/lcov_backend.info", From b7618eac850816785e3dfd9669a6cfe5692552f1 Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Thu, 9 Jul 2026 15:23:56 +0500 Subject: [PATCH 3/8] fix: add changes according to review comments - remove redundant .gitignore - fix index.ts for yeoman-env-v3 package - move namespaceToName function to legacyGenerators.ts - fix tsconfig in yeoman-env-v3 - fix backend and yeoman-env-v3 package.json's - fix webpack.config.cjs's --- pnpm-lock.yaml | 42 ++++--------- .../yeoman-ui/packages/backend/package.json | 5 +- .../packages/backend/src/utils/env.ts | 11 +--- .../backend/src/utils/legacyGenerators.ts | 15 +++++ .../packages/backend/src/yeomanui.ts | 5 +- .../test/utils/legacyGenerators.spec.ts | 23 +++++++ .../packages/backend/webpack.config.cjs | 62 ++++++++++--------- .../packages/yeoman-env-v3/.gitignore | 2 - .../packages/yeoman-env-v3/package.json | 2 +- .../packages/yeoman-env-v3/src/index.ts | 14 +++-- .../packages/yeoman-env-v3/tsconfig.json | 1 - .../packages/yeoman-env-v3/webpack.config.cjs | 57 ++++++----------- 12 files changed, 116 insertions(+), 123 deletions(-) delete mode 100644 projects/yeoman-ui/packages/yeoman-env-v3/.gitignore diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 79a96d0a..01b3fd42 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -614,12 +614,6 @@ importers: '@vscode-logging/logger': specifier: 2.0.9 version: 2.0.9 - '@yeoman/adapter': - specifier: 4.0.2 - version: 4.0.2(@types/node@14.18.63) - '@yeoman/types': - specifier: 1.11.1 - version: 1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4) chalk: specifier: 4.1.2 version: 4.1.2 @@ -696,6 +690,12 @@ importers: '@vscode/vsce': specifier: 2.24.0 version: 2.24.0 + '@yeoman/adapter': + specifier: 4.0.2 + version: 4.0.2(@types/node@14.18.63) + '@yeoman/types': + specifier: 1.11.1 + version: 1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4) c8: specifier: 11.0.0 version: 11.0.0 @@ -705,6 +705,9 @@ importers: lcov-result-merger: specifier: 5.0.0 version: 5.0.0 + null-loader: + specifier: 4.0.1 + version: 4.0.1(webpack@5.106.2) sinon: specifier: ^18.0.1 version: 18.0.1 @@ -872,12 +875,12 @@ importers: null-loader: specifier: 4.0.1 version: 4.0.1(webpack@5.106.2) - shx: - specifier: 0.3.4 - version: 0.3.4 string-replace-loader: specifier: 3.0.3 version: 3.0.3(webpack@5.106.2) + terser-webpack-plugin: + specifier: ^5.3.0 + version: 5.5.0(webpack@5.106.2) ts-loader: specifier: 9.6.2 version: 9.6.2(loader-utils@2.0.4)(typescript@5.7.3)(webpack@5.106.2) @@ -9514,11 +9517,6 @@ packages: engines: {node: '>=4'} hasBin: true - shelljs@0.8.5: - resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} - engines: {node: '>=4'} - hasBin: true - shelljs@0.9.2: resolution: {integrity: sha512-S3I64fEiKgTZzKCC46zT/Ib9meqofLrQVbpSswtjFfAVDW+AZ54WTnAM/3/yENoxz/V1Cy6u3kiiEbQ4DNphvw==} engines: {node: '>=18'} @@ -9532,11 +9530,6 @@ packages: engines: {node: '>=6'} hasBin: true - shx@0.3.4: - resolution: {integrity: sha512-N6A9MLVqjxZYcVn8hLmtneQWIJtp8IKzMP4eMnx+nqkvXoqinUPCbUFLp2UcWTEIUONhlk0ewxr/jaVGlc+J+g==} - engines: {node: '>=6'} - hasBin: true - shx@0.4.0: resolution: {integrity: sha512-Z0KixSIlGPpijKgcH6oCMCbltPImvaKy0sGH8AkLRXw1KyzpKtaCTizP2xen+hNDqVF4xxgvA0KXSb9o4Q6hnA==} engines: {node: '>=18'} @@ -22294,12 +22287,6 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shelljs@0.8.5: - dependencies: - glob: 7.2.0 - interpret: 1.4.0 - rechoir: 0.6.2 - shelljs@0.9.2: dependencies: execa: 1.0.0 @@ -22314,11 +22301,6 @@ snapshots: minimist: 1.2.8 shelljs: 0.8.4 - shx@0.3.4: - dependencies: - minimist: 1.2.8 - shelljs: 0.8.5 - shx@0.4.0: dependencies: minimist: 1.2.8 diff --git a/projects/yeoman-ui/packages/backend/package.json b/projects/yeoman-ui/packages/backend/package.json index 0fbd074a..bc80d1d5 100644 --- a/projects/yeoman-ui/packages/backend/package.json +++ b/projects/yeoman-ui/packages/backend/package.json @@ -192,8 +192,6 @@ "@sap/bas-sdk": "3.13.7", "@sap/swa-for-sapbas-vsx": "2.0.16", "@vscode-logging/logger": "2.0.9", - "@yeoman/adapter": "4.0.2", - "@yeoman/types": "1.11.1", "chalk": "4.1.2", "cheerio": "^1.0.0-rc.12", "datauri": "4.1.0", @@ -221,9 +219,12 @@ "@types/webpack-env": "^1.16.2", "@types/ws": "^8.5.14", "@vscode/vsce": "2.24.0", + "@yeoman/adapter": "4.0.2", + "@yeoman/types": "1.11.1", "c8": "11.0.0", "copy-webpack-plugin": "^12.0.2", "lcov-result-merger": "5.0.0", + "null-loader": "4.0.1", "sinon": "^18.0.1", "string-replace-loader": "3.0.3", "terser": "^5.48.0", diff --git a/projects/yeoman-ui/packages/backend/src/utils/env.ts b/projects/yeoman-ui/packages/backend/src/utils/env.ts index eafdb6cd..4479cbc4 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/env.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/env.ts @@ -11,22 +11,13 @@ import type { import type { IChildLogger } from "@vscode-logging/logger"; import type { LegacyEnv } from "yeoman-env-v3"; import { getClassLogger } from "../logger/logger-wrapper.js"; -import { isLegacyNamespace } from "./legacyGenerators.js"; +import { isLegacyNamespace, namespaceToName } from "./legacyGenerators.js"; const _require = createRequire(import.meta.url); const GENERATOR = "generator-"; const NAMESPACE = "namespace"; -// Yeoman-environment v6 dropped the `namespaceToName` static helper. Our uses -// only need the "package-name-from-namespace" transform — reproduce it here. -function namespaceToName(ns: string): string { - const base = ns.replace(/:.*$/, ""); - return base.startsWith("@") - ? base.replace(/\/generator-/, "/") - : base.replace(/^generator-/, ""); -} - export type EnvGen = { env: Environment; gen: any; diff --git a/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts b/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts index a907b2ac..b4e562d8 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts @@ -88,3 +88,18 @@ function parseListLoosely(raw: string): string[] { .map((s) => s.trim()) .filter((s) => s.length > 0); } + +/** + * Convert a generator namespace to its package short-name. + * + * Strips the sub-generator segment (everything after the first `:`), then the + * `generator-` prefix — both for bare (`generator-foo:app` → `foo`) and scoped + * (`@scope/generator-foo:app` → `@scope/foo`) namespaces. Yeoman-environment + * v6 dropped the equivalent `namespaceToName` static helper so we ship our own. + */ +export function namespaceToName(ns: string): string { + const base = ns.replace(/:.*$/, ""); + return base.startsWith("@") + ? base.replace(/\/generator-/, "/") + : base.replace(/^generator-/, ""); +} diff --git a/projects/yeoman-ui/packages/backend/src/yeomanui.ts b/projects/yeoman-ui/packages/backend/src/yeomanui.ts index 8dc7eee5..bb1c51c2 100644 --- a/projects/yeoman-ui/packages/backend/src/yeomanui.ts +++ b/projects/yeoman-ui/packages/backend/src/yeomanui.ts @@ -22,6 +22,7 @@ import { GeneratorData, GeneratorNotFoundError, } from "./utils/env.js"; +import { namespaceToName } from "./utils/legacyGenerators.js"; import { vscode, getVscode } from "./utils/vscodeProxy.js"; import Generator from "yeoman-generator"; import Environment from "yeoman-environment"; @@ -728,9 +729,7 @@ export class YeomanUI { this.logger.debug(error); } - const genName = genNamespace - .replace(/:.*$/, "") - .replace(/(?:^|(?<=\/))generator-/, ""); + const genName = namespaceToName(genNamespace); const genMessage = _.get( packageJson, "description", diff --git a/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts index 9132affe..3bad47b8 100644 --- a/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts +++ b/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts @@ -4,6 +4,7 @@ import { vscode } from "../mockUtil.js"; import { getLegacyGeneratorList, isLegacyNamespace, + namespaceToName, } from "../../src/utils/legacyGenerators.js"; const ENV_VAR = "YEOMAN_UI_LEGACY_GENERATORS"; @@ -206,4 +207,26 @@ describe("legacyGenerators", () => { expect(isLegacyNamespace("@sap/other:app")).to.be.false; }); }); + + describe("namespaceToName()", () => { + it("strips the sub-generator segment from a scoped namespace", () => { + expect(namespaceToName("@sap/adaptation-project:app")).to.equal( + "@sap/adaptation-project" + ); + }); + + it("drops the generator- prefix on a scoped package", () => { + expect(namespaceToName("@bas-dev/generator-abap-project:app")).to.equal( + "@bas-dev/abap-project" + ); + }); + + it("drops the generator- prefix on a bare package", () => { + expect(namespaceToName("generator-foo:app")).to.equal("foo"); + }); + + it("returns the namespace unchanged when no colon or generator- prefix", () => { + expect(namespaceToName("plain-name")).to.equal("plain-name"); + }); + }); }); diff --git a/projects/yeoman-ui/packages/backend/webpack.config.cjs b/projects/yeoman-ui/packages/backend/webpack.config.cjs index 1c96263a..f765f9ec 100644 --- a/projects/yeoman-ui/packages/backend/webpack.config.cjs +++ b/projects/yeoman-ui/packages/backend/webpack.config.cjs @@ -5,29 +5,6 @@ const path = require("path"); const TerserPlugin = require("terser-webpack-plugin"); -/** - * VSCode extension bundle for yeoman-ui backend. - * - * Output is native ESM (experiments.outputModule + library.type: "module") - * — VSCode 1.100+ runs extension code as ESM in the extension host. - * - * Under ESM output, webpack passes `import.meta.url` and native - * `createRequire(import.meta.url)` through untouched, so most of the patches - * needed by a CJS bundle of yeoman-environment v6 are unnecessary here — v6's - * `store.js` gets its native runtime `require` and can load generators from - * disk directly. - * - * What is still needed: - * - Externalize `vscode` (provided by the extension host). - * - Load `yeoman-env-v3` at runtime via - * `__non_webpack_require__("./yeoman-env-v3.cjs")` — its own build produced - * a self-contained CJS bundle that is copied into dist/ before webpack. - * - String-replace-loader patches for a handful of third-party CJS packages - * that do dynamic `require()` calls webpack cannot statically resolve. - * - Keep class/function names so v6 does not re-mangle dynamic ESM class - * lookups at generator run time. - */ - /**@type {import('webpack').Configuration}*/ const config = { target: "node", // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ @@ -48,14 +25,21 @@ const config = { }, externalsType: "module", externals: { - // vscode is provided by the extension host, not bundled + // vscode is provided by the extension host, not bundled. vscode: "module vscode", - // spdx-* are large data-only packages; keep them out of the bundle. + // spdx-expression-parse (pulled in transitively by @npmcli/arborist → fly-import + // → yeoman-environment v6) `require`s these siblings, but they are not listed + // in its `dependencies` — pnpm's strict layout therefore does not place them + // where webpack's `resolve.modules: ["node_modules"]` walk can reach them. + // Leave them as unresolved externals; the code path that actually loads them + // is only reached when Arborist normalizes a package.json license field, + // which happens during `npm install`-style flows the extension never runs. "spdx-license-ids": "commonjs2 spdx-license-ids", "spdx-license-ids/deprecated": "commonjs2 spdx-license-ids/deprecated", "spdx-exceptions": "commonjs2 spdx-exceptions", - // Optional native metric packages that Application Insights tries to load; - // absent in production. + // Optional native metric packages that Application Insights tries to load + // via `require()` but that are absent in production installs — leave them + // as un-resolvable externals so webpack does not attempt to bundle them. "@azure/functions-core": "commonjs2 @azure/functions-core", "applicationinsights-native-metrics": "commonjs2 applicationinsights-native-metrics", @@ -203,10 +187,17 @@ const config = { test: /yeoman-environment[/|\\]dist[/|\\]module-lookup\.js/, loader: "string-replace-loader", options: { + // PACKAGE_NAME_PATTERN is only referenced further down in this same + // file as the DEFAULT for `options.packagePatterns`. Yeoman-ui always + // passes an explicit `packagePatterns` (or the caller in v6's own + // `generator-lookup.js` does — set to `['generator-*']`), so the + // inlined value is never actually consulted at lookup time. The + // literal `'yeoman-environment'` is just a non-empty placeholder that + // makes the static array shape well-formed. search: "const PACKAGE_NAME_PATTERN = \\[JSON\\.parse\\(readFileSync\\(join\\(PROJECT_ROOT, 'package\\.json'\\)\\)\\.toString\\(\\)\\)\\.name\\];", replace: - "const PACKAGE_NAME_PATTERN = ['yeoman-environment']; // inlined by webpack.config.cjs — was readFileSync(bake-machine path)", + "const PACKAGE_NAME_PATTERN = ['yeoman-environment']; // inlined by webpack.config.cjs — see this file's rule comment above", flags: "g", }, }, @@ -220,8 +211,19 @@ const config = { flags: "g", }, }, - // node-gyp is a build-time tool we never invoke at runtime; its dynamic - // requires would fail static analysis. + // node-gyp is pulled in transitively by @npmcli/arborist. The code path + // that reaches it (native-module rebuild during install) is never hit + // from the extension, but webpack still has to parse its source graph: + // - Find-VisualStudio.cs is a C# file webpack cannot parse — return + // an empty module for it. + // - bin/node-gyp.js starts with a `#!/usr/bin/env node` shebang that + // webpack's static analyzer trips on — comment it out. + // - lib/node-gyp.js does `require('./' + command)` dynamically — + // hide it from webpack via __non_webpack_require__. + { + test: /Find-VisualStudio\.cs$/, + use: "null-loader", + }, { test: /node-gyp[/|\\]lib[/|\\]node-gyp.js/, loader: "string-replace-loader", diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/.gitignore b/projects/yeoman-ui/packages/yeoman-env-v3/.gitignore deleted file mode 100644 index de4d1f00..00000000 --- a/projects/yeoman-ui/packages/yeoman-env-v3/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/package.json b/projects/yeoman-ui/packages/yeoman-env-v3/package.json index baaa9d59..99e3f281 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/package.json +++ b/projects/yeoman-ui/packages/yeoman-env-v3/package.json @@ -22,8 +22,8 @@ }, "devDependencies": { "null-loader": "4.0.1", - "shx": "0.3.4", "string-replace-loader": "3.0.3", + "terser-webpack-plugin": "^5.3.0", "ts-loader": "9.6.2", "webpack": "5.106.2", "webpack-cli": "5.1.4" diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts index e7fee87d..fb61b1d8 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts +++ b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts @@ -1,4 +1,10 @@ -const YeomanEnvironment = require("yeoman-environment") as any; +const YeomanEnvironment = require("yeoman-environment") as { + createEnv: ( + args?: string[], + opts?: Record, + adapter?: unknown + ) => LegacyEnv; +}; export interface LegacyEnv { register(resolved: string, namespace: string): void; @@ -13,8 +19,4 @@ export interface LegacyEnv { removeAllListeners(event?: string): unknown; } -export const createEnv: ( - args?: string[], - opts?: Record, - adapter?: any -) => LegacyEnv = YeomanEnvironment.createEnv ?? YeomanEnvironment; +export const createEnv = YeomanEnvironment.createEnv; diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json b/projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json index 7a6976ec..c6d67657 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json +++ b/projects/yeoman-ui/packages/yeoman-env-v3/tsconfig.json @@ -8,7 +8,6 @@ "moduleResolution": "node", "esModuleInterop": true, "allowSyntheticDefaultImports": true, - "skipLibCheck": true, "declaration": true }, "include": ["src/**/*"], diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs b/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs index f622674d..730c2138 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs +++ b/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs @@ -2,24 +2,7 @@ "use strict"; const path = require("path"); -const fs = require("fs"); - -// Resolve the real path to yeoman-environment@3 through the symlink pnpm created -// under this package's node_modules. Without realpathSync webpack might follow -// a hoisted copy higher up in the pnpm store and bundle a mismatched version. -const compatNodeModules = path.resolve(__dirname, "node_modules"); -const envV3Root = fs.realpathSync( - path.join(compatNodeModules, "yeoman-environment") -); - -// istextorbinary and errlop ship multiple editions via the 'editions' loader, -// several of which are ESM files webpack can't parse. Alias each to its known -// CJS edition, resolved from v3's own dep tree. -const envV3Req = require("module").createRequire(envV3Root + "/package.json"); -const istextorbinaryCJS = envV3Req - .resolve("istextorbinary") - .replace(/index\.js$/, "edition-node-0.12/index.js"); -const errlop = envV3Req.resolve("errlop"); +const TerserPlugin = require("terser-webpack-plugin"); /** @type {import('webpack').Configuration} */ module.exports = { @@ -32,29 +15,27 @@ module.exports = { libraryTarget: "commonjs2", }, optimization: { - // Keep class and function names — generators inspect env.runLoop and - // rely on structural class identity that mangling would break. - minimize: false, - }, - externals: { - // spdx-* are large data packages and already present in the backend bundle. - "spdx-license-ids": "commonjs spdx-license-ids", - "spdx-license-ids/deprecated": "commonjs spdx-license-ids/deprecated", - "spdx-exceptions": "commonjs spdx-exceptions", - // node-gyp does dynamic require('./' + command) and pulls in a .cs file - // webpack can't parse. Only relevant during native module compilation, - // never during generator execution — externalize it. - "node-gyp": "commonjs node-gyp", - // bluebird is an optional peer of promise-inflight; not present in pnpm store. - bluebird: "commonjs bluebird", + // yeoman-environment v3's `isNamespace()` does `constructor.name === "YeomanNamespace"`. + // Terser's default mangler renames the class to a short symbol at production + // level, making that runtime string comparison always fail — every namespace + // instance is then treated as a plain object, re-parsed, and rejected because + // `typeof yeomanNamespaceInstance !== "string"`. Preserve class + function + // names to keep those reflection-style checks working. + minimizer: [ + new TerserPlugin({ + terserOptions: { + keep_classnames: true, + keep_fnames: true, + mangle: { + keep_classnames: true, + keep_fnames: true, + }, + }, + }), + ], }, resolve: { extensions: [".ts", ".js", ".json"], - alias: { - "yeoman-environment": envV3Root, - istextorbinary: istextorbinaryCJS, - errlop: errlop, - }, }, module: { rules: [ From c19427b045dfd9c69f2e8b3624b9eebfc5e84bbf Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Thu, 9 Jul 2026 18:18:35 +0500 Subject: [PATCH 4/8] fix: add changes according to review comments - env.ts: reuse yeoman-env-v3's exported type, drop local LegacyCompat - webpack: bundle spdx-* instead of externalizing - build: remove sibling orchestration - types: add narrower YeomanUIQuestion type, remove as-any casts in tests --- pnpm-lock.yaml | 16 +++++++++ .../yeoman-ui/packages/backend/package.json | 6 ++-- .../packages/backend/src/replayUtils.ts | 26 ++++++++------- .../packages/backend/src/utils/env.ts | 19 ++--------- .../backend/src/utils/questionTypes.ts | 29 ++++++++++++++++ .../packages/backend/src/yeomanui.ts | 18 ++++++---- .../packages/backend/src/youi-adapter.ts | 7 ++-- .../backend/test/utils/questionTypes.spec.ts | 16 +++++++++ .../packages/backend/test/yeomanui.spec.ts | 33 ++++++++++--------- .../backend/test/youi-adapter.spec.ts | 2 +- .../packages/backend/webpack.config.cjs | 32 ++++++++++++------ .../packages/yeoman-env-v3/package.json | 7 ++-- 12 files changed, 143 insertions(+), 68 deletions(-) create mode 100644 projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts create mode 100644 projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 01b3fd42..43501aa5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -711,6 +711,12 @@ importers: sinon: specifier: ^18.0.1 version: 18.0.1 + spdx-exceptions: + specifier: ^2.5.0 + version: 2.5.0 + spdx-license-ids: + specifier: ^3.0.20 + version: 3.0.23 string-replace-loader: specifier: 3.0.3 version: 3.0.3(webpack@5.106.2) @@ -9716,6 +9722,9 @@ packages: spdx-exceptions@2.3.0: resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + spdx-expression-parse@3.0.1: resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} @@ -9725,6 +9734,9 @@ packages: spdx-license-ids@3.0.11: resolution: {integrity: sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==} + spdx-license-ids@3.0.23: + resolution: {integrity: sha512-CWLcCCH7VLu13TgOH+r8p1O/Znwhqv/dbb6lqWy67G+pT1kHmeD/+V36AVb/vq8QMIQwVShJ6Ssl5FPh0fuSdw==} + split-string@3.1.0: resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==} engines: {node: '>=0.10.0'} @@ -22565,6 +22577,8 @@ snapshots: spdx-exceptions@2.3.0: {} + spdx-exceptions@2.5.0: {} + spdx-expression-parse@3.0.1: dependencies: spdx-exceptions: 2.3.0 @@ -22577,6 +22591,8 @@ snapshots: spdx-license-ids@3.0.11: {} + spdx-license-ids@3.0.23: {} + split-string@3.1.0: dependencies: extend-shallow: 3.0.2 diff --git a/projects/yeoman-ui/packages/backend/package.json b/projects/yeoman-ui/packages/backend/package.json index bc80d1d5..da4d17b2 100644 --- a/projects/yeoman-ui/packages/backend/package.json +++ b/projects/yeoman-ui/packages/backend/package.json @@ -30,11 +30,11 @@ "type": "module", "main": "./dist/extension.js", "scripts": { - "bundle": "pnpm --filter yeoman-env-v3 bundle && shx mkdir -p ./dist && shx cp ./node_modules/yeoman-env-v3/dist/index.js ./dist/yeoman-env-v3.cjs && webpack --config webpack.config.cjs --mode production", + "bundle": "shx mkdir -p ./dist && shx cp ./node_modules/yeoman-env-v3/dist/index.js ./dist/yeoman-env-v3.cjs && webpack --config webpack.config.cjs --mode production", "ci": "npm-run-all clean compile coverage bundle frontend:copy package coverage:copy", "clean": "shx rm -rf ./dist ./coverage *.vsix", "clean:frontend": "cd ./dist && shx rm -rf ./media", - "compile": "pnpm --filter yeoman-env-v3 bundle && tsc", + "compile": "tsc", "compile:watch": "tsc -watch", "coverage": "NODE_OPTIONS='--max-old-space-size=8192 --no-experimental-strip-types' c8 mocha", "coverage:copy": "shx mkdir -p ../../../../coverage && shx cp -u ./coverage/lcov.info ../../../../coverage/lcov_backend.info", @@ -226,6 +226,8 @@ "lcov-result-merger": "5.0.0", "null-loader": "4.0.1", "sinon": "^18.0.1", + "spdx-exceptions": "^2.5.0", + "spdx-license-ids": "^3.0.20", "string-replace-loader": "3.0.3", "terser": "^5.48.0", "terser-webpack-plugin": "^5.3.0", diff --git a/projects/yeoman-ui/packages/backend/src/replayUtils.ts b/projects/yeoman-ui/packages/backend/src/replayUtils.ts index 84455a66..0e5bbb03 100644 --- a/projects/yeoman-ui/packages/backend/src/replayUtils.ts +++ b/projects/yeoman-ui/packages/backend/src/replayUtils.ts @@ -1,6 +1,10 @@ import type { IPrompt } from "@sap-devx/yeoman-ui-types"; import hash from "object-hash"; -import type { PromptQuestions, PromptAnswers } from "@yeoman/adapter/types"; +import { asArray } from "./utils/questionTypes.js"; +import type { + YeomanUIQuestions, + PromptAnswers, +} from "./utils/questionTypes.js"; export enum ReplayState { Replaying, @@ -10,7 +14,7 @@ export enum ReplayState { export class ReplayUtils { // assuming that order of questions is consistent - private static getQuestionsHash(questions: PromptQuestions): string { + private static getQuestionsHash(questions: YeomanUIQuestions): string { // we need exclude members that we manipulate in setDefault() below // we also need to exclude members set by custom event handlers // instead of blacklisting member, we whitelist them based on inquirer.js docs: @@ -32,16 +36,16 @@ export class ReplayUtils { return keyIndex < 0; }; - return hash(questions as any, { excludeKeys }); + return hash(questions as object, { excludeKeys }); } private static setDefaults( - questions: PromptQuestions, + questions: YeomanUIQuestions, answers: PromptAnswers ): void { - for (const question of questions as any[]) { + for (const question of asArray(questions)) { const name = question["name"]; - const answer = answers[name]; + const answer = answers[name as string]; // __ForceDefault is required to let the frontend know to ignore all forms // of default values defined on the question, e.g. the checked property of @@ -75,7 +79,7 @@ export class ReplayUtils { } public start( - questions: PromptQuestions, + questions: YeomanUIQuestions, answers: PromptAnswers, numOfSteps: number ): void { @@ -85,7 +89,7 @@ export class ReplayUtils { this.isReplaying = true; } - public stop(questions: PromptQuestions): IPrompt[] { + public stop(questions: YeomanUIQuestions): IPrompt[] { const prompts = this.prompts; this.isReplaying = false; this.prompts = []; @@ -112,12 +116,12 @@ export class ReplayUtils { this.prompts = prompts; } - public remember(questions: PromptQuestions, answers: PromptAnswers): void { + public remember(questions: YeomanUIQuestions, answers: PromptAnswers): void { this._rememberAnswers(questions, answers); this.replayStack.push(answers); } - public recall(questions: PromptQuestions): void { + public recall(questions: YeomanUIQuestions): void { const key: string = ReplayUtils.getQuestionsHash(questions); const previousAnswers: PromptAnswers = this.answersCache.get(key); if (previousAnswers !== undefined) { @@ -138,7 +142,7 @@ export class ReplayUtils { } private _rememberAnswers( - questions: PromptQuestions, + questions: YeomanUIQuestions, answers: PromptAnswers ): void { const key: string = ReplayUtils.getQuestionsHash(questions); diff --git a/projects/yeoman-ui/packages/backend/src/utils/env.ts b/projects/yeoman-ui/packages/backend/src/utils/env.ts index 4479cbc4..2f528ff6 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/env.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/env.ts @@ -9,7 +9,7 @@ import type { InputOutputAdapter, } from "@yeoman/types"; import type { IChildLogger } from "@vscode-logging/logger"; -import type { LegacyEnv } from "yeoman-env-v3"; +import type * as YeomanEnvV3 from "yeoman-env-v3"; import { getClassLogger } from "../logger/logger-wrapper.js"; import { isLegacyNamespace, namespaceToName } from "./legacyGenerators.js"; @@ -42,23 +42,10 @@ export class GeneratorNotFoundError extends Error { } } -/** - * Contract for the runtime-loaded yeoman-environment v3 bundle. The full - * `LegacyEnv` type ships from the `yeoman-env-v3` workspace package — we only - * need `createEnv` at this layer. - */ -interface LegacyCompat { - createEnv( - args: undefined, - opts: Record, - adapter: any - ): LegacyEnv; -} - class EnvUtil { private logger: IChildLogger; private allInstalledGensMeta: LookupGeneratorMeta[]; - private legacyCompat: LegacyCompat | undefined; + private legacyCompat: typeof YeomanEnvV3 | undefined; constructor() { try { @@ -239,7 +226,7 @@ class EnvUtil { if (!this.legacyCompat) { this.legacyCompat = __non_webpack_require__( "./yeoman-env-v3.cjs" - ) as LegacyCompat; + ) as typeof YeomanEnvV3; } const env = this.legacyCompat.createEnv( diff --git a/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts new file mode 100644 index 00000000..e5a8fb28 --- /dev/null +++ b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts @@ -0,0 +1,29 @@ +import type { PromptAnswers } from "@yeoman/adapter/types"; + +export interface YeomanUIQuestion { + name?: string; + type?: string; + message?: string | ((answers: PromptAnswers) => string); + default?: unknown; + choices?: unknown; + when?: unknown; + validate?: unknown; + filter?: unknown; + /** yeoman-ui GUI hint used to pick a custom question renderer. */ + guiType?: string; + guiOptions?: { type?: string; [key: string]: unknown }; + // Replay markers set by ReplayUtils.setDefaults. + __ForceDefault?: boolean; + __origAnswer?: unknown; + // Custom event-handler methods are attached by name at runtime. + [key: string]: unknown; +} + +export type YeomanUIQuestions = YeomanUIQuestion | YeomanUIQuestion[]; + +/** Normalize a single-or-array question value to an array. */ +export function asArray(questions: YeomanUIQuestions): YeomanUIQuestion[] { + return Array.isArray(questions) ? questions : [questions]; +} + +export type { PromptAnswers }; diff --git a/projects/yeoman-ui/packages/backend/src/yeomanui.ts b/projects/yeoman-ui/packages/backend/src/yeomanui.ts index bb1c51c2..017fb831 100644 --- a/projects/yeoman-ui/packages/backend/src/yeomanui.ts +++ b/projects/yeoman-ui/packages/backend/src/yeomanui.ts @@ -26,7 +26,10 @@ import { namespaceToName } from "./utils/legacyGenerators.js"; import { vscode, getVscode } from "./utils/vscodeProxy.js"; import Generator from "yeoman-generator"; import Environment from "yeoman-environment"; -import type { PromptQuestions, PromptAnswers } from "@yeoman/adapter/types"; +import type { + YeomanUIQuestions, + PromptAnswers, +} from "./utils/questionTypes.js"; import { State } from "./utils/promise.js"; import { Constants } from "./utils/constants.js"; import { isUriFlow } from "./utils/workspaceFile.js"; @@ -54,7 +57,7 @@ export class YeomanUI { private readonly youiAdapter: YouiAdapter; private gen: Generator | undefined; private promptCount: number; - private currentQuestions: PromptQuestions | undefined; + private currentQuestions: YeomanUIQuestions | undefined; private generatorName: string; private readonly replayUtils: ReplayUtils; private readonly customQuestionEventHandlers: Map< @@ -428,7 +431,7 @@ export class YeomanUI { } public async showPrompt( - questions: PromptQuestions + questions: YeomanUIQuestions ): Promise { this.promptCount++; const promptName = this.getPromptName(questions); @@ -443,7 +446,8 @@ export class YeomanUI { this.replayUtils.recall(questions); this.currentQuestions = questions; - const mappedQuestions: PromptQuestions = this.normalizeFunctions(questions); + const mappedQuestions: YeomanUIQuestions = + this.normalizeFunctions(questions); if (_.isEmpty(mappedQuestions)) { return {}; } @@ -479,7 +483,7 @@ export class YeomanUI { } } - private getPromptName(questions: PromptQuestions): string { + private getPromptName(questions: YeomanUIQuestions): string { const firstQuestionName = _.get(questions, "[0].name"); return firstQuestionName ? _.startCase(firstQuestionName) @@ -764,7 +768,7 @@ export class YeomanUI { * Functions are lost when being passed to client (using JSON.Stringify) * Also functions cannot be evaluated on client) */ - private normalizeFunctions(questions: PromptQuestions): PromptQuestions { + private normalizeFunctions(questions: YeomanUIQuestions): YeomanUIQuestions { this.addCustomQuestionEventHandlers(questions); return JSON.parse(JSON.stringify(questions, YeomanUI.funcReplacer)); } @@ -781,7 +785,7 @@ export class YeomanUI { } } - private addCustomQuestionEventHandlers(questions: PromptQuestions): void { + private addCustomQuestionEventHandlers(questions: YeomanUIQuestions): void { for (const question of questions as any[]) { const guiType = _.get(question, "guiOptions.type", question.guiType); const questionHandlers = this.customQuestionEventHandlers.get(guiType); diff --git a/projects/yeoman-ui/packages/backend/src/youi-adapter.ts b/projects/yeoman-ui/packages/backend/src/youi-adapter.ts index 45207ab4..36f7a2e1 100644 --- a/projects/yeoman-ui/packages/backend/src/youi-adapter.ts +++ b/projects/yeoman-ui/packages/backend/src/youi-adapter.ts @@ -3,7 +3,10 @@ import { YouiEvents } from "./youi-events.js"; import yoUiLog from "./utils/log.js"; import lodash from "lodash"; import chalk from "chalk"; -import type { PromptQuestions, PromptAnswers } from "@yeoman/adapter/types"; +import type { + YeomanUIQuestions, + PromptAnswers, +} from "./utils/questionTypes.js"; import { Output } from "./output.js"; const { get, isFunction } = lodash; @@ -42,7 +45,7 @@ export class YouiAdapter { * @param {Function} callback */ public async prompt( - questions: PromptQuestions, + questions: YeomanUIQuestions, cb?: (res: T1) => T2 ): Promise { if (this.yeomanui && questions) { diff --git a/projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts new file mode 100644 index 00000000..f84e32e6 --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts @@ -0,0 +1,16 @@ +import { expect } from "chai"; +import { asArray } from "../../src/utils/questionTypes.js"; + +describe("questionTypes", () => { + describe("asArray()", () => { + it("returns the array unchanged when given an array", () => { + const questions = [{ name: "q1" }, { name: "q2" }]; + expect(asArray(questions)).to.equal(questions); + }); + + it("wraps a single question object into an array", () => { + const question = { name: "q1" }; + expect(asArray(question)).to.deep.equal([question]); + }); + }); +}); diff --git a/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts b/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts index 36a142cd..1f8c9252 100644 --- a/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts +++ b/projects/yeoman-ui/packages/backend/test/yeomanui.spec.ts @@ -21,6 +21,7 @@ import { Env } from "../src/utils/env.js"; import Environment, { createEnv } from "yeoman-environment"; import { createFlowPromise } from "../src/utils/promise.js"; import { Constants } from "../src/utils/constants.js"; +import type { YeomanUIQuestion } from "../src/utils/questionTypes.js"; describe("yeomanui unit test", () => { let sandbox: SinonSandbox; @@ -1215,7 +1216,7 @@ describe("yeomanui unit test", () => { describe("answersUtils", () => { it("setDefaults", () => { - const questions = [ + const questions: YeomanUIQuestion[] = [ { name: "q1", default: "a" }, { name: "q2", default: () => "b" }, { name: "q3" }, @@ -1225,17 +1226,17 @@ describe("yeomanui unit test", () => { q2: "y", q3: "z", }; - ReplayUtils["setDefaults"](questions as any, answers); + ReplayUtils["setDefaults"](questions, answers); for (const question of questions) { - expect((question as any)["__origAnswer"]).to.equal( + expect(question["__origAnswer"]).to.equal( (answers)[question.name] ); - expect((question as any)["__ForceDefault"]).to.be.true; + expect(question["__ForceDefault"]).to.be.true; } }); it("setDefaults", () => { - const questions = [ + const questions: YeomanUIQuestion[] = [ { name: "q1", default: "a" }, { name: "q2", default: () => "b" }, { name: "q3" }, @@ -1244,10 +1245,10 @@ describe("yeomanui unit test", () => { q1: "x", q3: "z", }; - ReplayUtils["setDefaults"](questions as any, answers); + ReplayUtils["setDefaults"](questions, answers); const question = _.find(questions, { name: "q2" }); - expect((question as any).__origAnswer).to.be.undefined; - expect((question as any).__ForceDefault).to.be.undefined; + expect(question.__origAnswer).to.be.undefined; + expect(question.__ForceDefault).to.be.undefined; }); }); @@ -1393,7 +1394,7 @@ describe("yeomanui unit test", () => { flowPromise.state ); const questions = [{ name: "q1" }]; - const response = await yeomanUiInstance.showPrompt(questions as any); + const response = await yeomanUiInstance.showPrompt(questions); expect(response.firstName).to.equal(firstName); }); @@ -1429,12 +1430,12 @@ describe("yeomanui unit test", () => { return Promise.resolve(); }; let questions = [{ name: "q1" }]; - let response = await yeomanUiInstance.showPrompt(questions as any); + let response = await yeomanUiInstance.showPrompt(questions); expect(response.firstName).to.equal(firstName); questions = [{ name: "q2" }]; - response = await yeomanUiInstance.showPrompt(questions as any); + response = await yeomanUiInstance.showPrompt(questions); expect(response.country).to.equal(country); expect(yeomanUiInstance["replayUtils"]["isReplaying"]).to.be.false; @@ -1442,7 +1443,7 @@ describe("yeomanui unit test", () => { expect(yeomanUiInstance["replayUtils"]["isReplaying"]).to.be.true; questions = [{ name: "q1" }]; - response = await yeomanUiInstance.showPrompt(questions as any); + response = await yeomanUiInstance.showPrompt(questions); expect(response.firstName).to.equal(firstName); }); }); @@ -1678,7 +1679,7 @@ describe("yeomanui unit test", () => { ); yeomanUiInstance["addCustomQuestionEventHandlers"](questions); expect(questions[0]).to.have.property("testEvent"); - expect((questions[0] as any)["testEvent"]).to.equal(testEventFunction); + expect(questions[0]["testEvent"]).to.equal(testEventFunction); }); }); @@ -1703,7 +1704,7 @@ describe("yeomanui unit test", () => { ); yeomanUiInstance["currentQuestions"] = [ { name: "question1", guiType: "questionType" }, - ] as any; + ]; const response = await yeomanUiInstance["evaluateMethod"]( null, "question1", @@ -1728,7 +1729,7 @@ describe("yeomanui unit test", () => { return true; }, }, - ] as any; + ]; const response = await yeomanUiInstance["evaluateMethod"]( null, "question1", @@ -1772,7 +1773,7 @@ describe("yeomanui unit test", () => { throw new Error("Error"); }, }, - ] as any; + ]; try { await yeomanUiInstance["evaluateMethod"](null, "question1", "method1"); } catch (e) { diff --git a/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts b/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts index fc5d3f1f..1475c1c0 100644 --- a/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts +++ b/projects/yeoman-ui/packages/backend/test/youi-adapter.spec.ts @@ -123,7 +123,7 @@ describe("YouiAdapter", () => { const youiAdapter = new YouiAdapter(youiEvents, outputChannel); youiAdapter.setYeomanUI(yeomanUi); const questions = [{ name: "q1" }]; - const response: any = await youiAdapter.prompt(questions as any, null); + const response: any = await youiAdapter.prompt(questions, null); expect(response.firstName).to.equal(firstName); expect(response.lastName).to.equal(lastName); }); diff --git a/projects/yeoman-ui/packages/backend/webpack.config.cjs b/projects/yeoman-ui/packages/backend/webpack.config.cjs index f765f9ec..15407de6 100644 --- a/projects/yeoman-ui/packages/backend/webpack.config.cjs +++ b/projects/yeoman-ui/packages/backend/webpack.config.cjs @@ -27,16 +27,6 @@ const config = { externals: { // vscode is provided by the extension host, not bundled. vscode: "module vscode", - // spdx-expression-parse (pulled in transitively by @npmcli/arborist → fly-import - // → yeoman-environment v6) `require`s these siblings, but they are not listed - // in its `dependencies` — pnpm's strict layout therefore does not place them - // where webpack's `resolve.modules: ["node_modules"]` walk can reach them. - // Leave them as unresolved externals; the code path that actually loads them - // is only reached when Arborist normalizes a package.json license field, - // which happens during `npm install`-style flows the extension never runs. - "spdx-license-ids": "commonjs2 spdx-license-ids", - "spdx-license-ids/deprecated": "commonjs2 spdx-license-ids/deprecated", - "spdx-exceptions": "commonjs2 spdx-exceptions", // Optional native metric packages that Application Insights tries to load // via `require()` but that are absent in production installs — leave them // as un-resolvable externals so webpack does not attempt to bundle them. @@ -54,6 +44,28 @@ const config = { extensionAlias: { ".js": [".ts", ".js"], }, + // `spdx-expression-parse` (pulled transitively via @npmcli/arborist → + // fly-import → yeoman-environment@6) requires these siblings without + // declaring them in its own `dependencies`. Under pnpm's strict layout + // they aren't reachable from within `.pnpm/spdx-expression-parse@…/`. + // Declaring them as backend devDependencies places them under + // `backend/node_modules/`; the aliases here point webpack directly at + // those symlinks so the resolver finds them regardless of where in the + // pnpm store it started the walk. + alias: { + "spdx-license-ids/deprecated$": path.resolve( + __dirname, + "node_modules/spdx-license-ids/deprecated.json" + ), + "spdx-license-ids$": path.resolve( + __dirname, + "node_modules/spdx-license-ids/index.json" + ), + "spdx-exceptions$": path.resolve( + __dirname, + "node_modules/spdx-exceptions/index.json" + ), + }, }, module: { rules: [ diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/package.json b/projects/yeoman-ui/packages/yeoman-env-v3/package.json index 99e3f281..813a7e21 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/package.json +++ b/projects/yeoman-ui/packages/yeoman-env-v3/package.json @@ -1,6 +1,6 @@ { "name": "yeoman-env-v3", - "version": "1.25.0", + "version": "1.25.1", "private": true, "description": "TypeScript wrapper that bundles yeoman-environment v3 for the yeoman-ui extension's legacy-generator code path", "license": "Apache 2.0", @@ -14,8 +14,9 @@ "types": "./dist/index.d.ts", "scripts": { "clean": "shx rm -rf ./dist", - "compile": "tsc --noEmit", - "bundle": "webpack --config webpack.config.cjs --mode production" + "compile": "pnpm run bundle", + "bundle": "webpack --config webpack.config.cjs --mode production", + "ci": "pnpm run clean && pnpm run bundle" }, "dependencies": { "yeoman-environment": "3.19.3" From 64e9ad6c51570e364458dea8e0a80b1d91a8dafd Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Fri, 10 Jul 2026 17:35:54 +0500 Subject: [PATCH 5/8] fix: add changes according to review comments - remove include-list; dynamic v6-then-v3-fallback routing - yeoman-env-v3 typed via @types/yeoman-environment@2 - add yeoman-ui project root package.json - make YeomanUIQuestion via Pick --- package.json | 4 +- pnpm-lock.yaml | 382 +++++++++++++++--- projects/yeoman-ui/package.json | 21 + .../yeoman-ui/packages/backend/package.json | 15 - .../packages/backend/src/replayUtils.ts | 26 +- .../packages/backend/src/utils/env.ts | 29 +- .../backend/src/utils/legacyGenerators.ts | 105 ----- .../packages/backend/src/utils/namespace.ts | 13 + .../backend/src/utils/questionTypes.ts | 27 +- .../packages/backend/src/yeomanui.ts | 9 +- .../packages/backend/src/youi-adapter.ts | 8 +- .../generators/app/index.js | 14 + .../generator-env-v3-fixture/package.json | 4 + .../generators/app/index.js | 10 + .../generator-env-v6-fixture/package.json | 4 + .../packages/backend/test/utils/env.spec.ts | 116 ++++++ .../test/utils/legacyGenerators.spec.ts | 232 ----------- .../backend/test/utils/namespace.spec.ts | 26 ++ .../packages/backend/webpack.config.cjs | 16 +- .../packages/yeoman-env-v3/package.json | 7 +- .../packages/yeoman-env-v3/src/index.ts | 23 +- scripts/legal-copy.js | 5 +- 22 files changed, 591 insertions(+), 505 deletions(-) create mode 100644 projects/yeoman-ui/package.json delete mode 100644 projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts create mode 100644 projects/yeoman-ui/packages/backend/src/utils/namespace.ts create mode 100644 projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/generators/app/index.js create mode 100644 projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/package.json create mode 100644 projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/generators/app/index.js create mode 100644 projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/package.json create mode 100644 projects/yeoman-ui/packages/backend/test/utils/env.spec.ts delete mode 100644 projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts create mode 100644 projects/yeoman-ui/packages/backend/test/utils/namespace.spec.ts diff --git a/package.json b/package.json index 421974d0..56fd2e30 100644 --- a/package.json +++ b/package.json @@ -20,8 +20,8 @@ "format:fix": "prettier --write \"**/*.@(js|ts|json|md)\" --ignore-path=.gitignore", "format:validate": "prettier --check \"**/*.@(js|ts|json|md)\" --ignore-path=.gitignore", "preinstall": "npx only-allow pnpm", - "legal:copy-license": "node scripts/legal-copy.js copy && pnpm -r exec -- shx cp -r ../../LICENSES LICENSES", - "legal:copy-reuse": "pnpm -r exec -- shx cp -r ../../.reuse .reuse", + "legal:copy-license": "node scripts/legal-copy.js copy && pnpm -r exec -- shx cp -r ../../LICENSES/. LICENSES", + "legal:copy-reuse": "pnpm -r exec -- shx cp -r ../../.reuse/. .reuse", "legal:delete": "node scripts/legal-copy.js delete && pnpm -r exec -- shx rm -rf .reuse LICENSES || true", "lint:fix": "eslint . --ext=js,ts,vue --fix --max-warnings=0 --ignore-path=.gitignore", "lint:validate": "eslint . --ext=js,ts,vue --max-warnings=0 --ignore-path=.gitignore", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 43501aa5..a9832456 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -597,6 +597,27 @@ importers: specifier: 1.5.2 version: 1.5.2 + projects/yeoman-ui: + devDependencies: + null-loader: + specifier: 4.0.1 + version: 4.0.1(webpack@5.106.2) + string-replace-loader: + specifier: 3.0.3 + version: 3.0.3(webpack@5.106.2) + terser-webpack-plugin: + specifier: 5.5.0 + version: 5.5.0(webpack@5.106.2) + ts-loader: + specifier: 9.6.2 + version: 9.6.2(loader-utils@2.0.4)(typescript@5.7.3)(webpack@5.106.2) + webpack: + specifier: 5.106.2 + version: 5.106.2(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.106.2) + projects/yeoman-ui/packages/backend: dependencies: '@sap-devx/webview-rpc': @@ -690,9 +711,6 @@ importers: '@vscode/vsce': specifier: 2.24.0 version: 2.24.0 - '@yeoman/adapter': - specifier: 4.0.2 - version: 4.0.2(@types/node@14.18.63) '@yeoman/types': specifier: 1.11.1 version: 1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4) @@ -701,13 +719,10 @@ importers: version: 11.0.0 copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.106.2) + version: 12.0.2(webpack@5.106.2(webpack-cli@6.0.1(webpack@5.104.1))) lcov-result-merger: specifier: 5.0.0 version: 5.0.0 - null-loader: - specifier: 4.0.1 - version: 4.0.1(webpack@5.106.2) sinon: specifier: ^18.0.1 version: 18.0.1 @@ -717,27 +732,12 @@ importers: spdx-license-ids: specifier: ^3.0.20 version: 3.0.23 - string-replace-loader: - specifier: 3.0.3 - version: 3.0.3(webpack@5.106.2) terser: specifier: ^5.48.0 version: 5.48.0 - terser-webpack-plugin: - specifier: ^5.3.0 - version: 5.5.0(webpack@5.106.2) - ts-loader: - specifier: ^9.2.3 - version: 9.4.2(typescript@5.7.3)(webpack@5.106.2) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@14.18.63)(typescript@5.7.3) - webpack: - specifier: ^5.94.0 - version: 5.106.2(webpack-cli@5.1.4) - webpack-cli: - specifier: ^5.1.4 - version: 5.1.4(webpack@5.106.2) ws: specifier: 8.17.1 version: 8.17.1(bufferutil@4.1.0)(utf-8-validate@5.0.10) @@ -876,26 +876,11 @@ importers: dependencies: yeoman-environment: specifier: 3.19.3 - version: 3.19.3(@types/node@25.9.1) + version: 3.19.3(@types/node@16.11.10) devDependencies: - null-loader: - specifier: 4.0.1 - version: 4.0.1(webpack@5.106.2) - string-replace-loader: - specifier: 3.0.3 - version: 3.0.3(webpack@5.106.2) - terser-webpack-plugin: - specifier: ^5.3.0 - version: 5.5.0(webpack@5.106.2) - ts-loader: - specifier: 9.6.2 - version: 9.6.2(loader-utils@2.0.4)(typescript@5.7.3)(webpack@5.106.2) - webpack: - specifier: 5.106.2 - version: 5.106.2(webpack-cli@5.1.4) - webpack-cli: - specifier: 5.1.4 - version: 5.1.4(webpack@5.106.2) + '@types/yeoman-environment': + specifier: 2.10.11 + version: 2.10.11(@yeoman/types@1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4))(mem-fs@4.1.4) packages: @@ -2994,6 +2979,10 @@ packages: '@types/deep-equal-in-any-order@1.0.4': resolution: {integrity: sha512-nkgl+KTkRWeybgMSBCrWrc1YHFrLADVxZ6Kllj40p9U499NGsCrFUjzgHgQY+Upsa/VWOc3YlsFEvhg+drUmkA==} + '@types/diff@8.0.0': + resolution: {integrity: sha512-o7jqJM04gfaYrdCecCVMbZhNdG6T1MHg/oQoRFdERLV+4d+V7FijhiEAbFu0Usww84Yijk9yH58U4Jk4HbtzZw==} + deprecated: This is a stub types definition. diff provides its own type definitions, so you do not need this installed. + '@types/ejs@3.1.5': resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} @@ -3039,6 +3028,9 @@ packages: '@types/inquirer@7.3.3': resolution: {integrity: sha512-HhxyLejTHMfohAuhRun4csWigAMjXTmRyiJTU1Y/I1xmggikFMkOUoMQRlFm+zQcPEGHSs3io/0FAmNZf8EymQ==} + '@types/inquirer@8.2.13': + resolution: {integrity: sha512-shSvl3mn4Z8AK627kA1vx8PYkyH6CdIjV5NYYj7a0xIxzmG3ZgzEpzCi3CWfktjAlq+0Z0wHJGtWNiACaYpeOg==} + '@types/istanbul-lib-coverage@2.0.6': resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} @@ -3075,6 +3067,10 @@ packages: '@types/lodash@4.14.202': resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} + '@types/mem-fs@2.2.0': + resolution: {integrity: sha512-G7D5J0wx7jMJ5dBMDFYcbE/VXol/51o/vpJu3DqRk1R7SrZYtzhDMf1eFoG8A/HOTM7EAbov/euJkULhwvLK1Q==} + deprecated: This is a stub types definition. mem-fs provides its own type definitions, so you do not need this installed. + '@types/mime@1.3.2': resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} @@ -3190,6 +3186,9 @@ packages: '@types/strip-json-comments@0.0.30': resolution: {integrity: sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==} + '@types/text-table@0.2.5': + resolution: {integrity: sha512-hcZhlNvMkQG/k1vcZ6yHOl6WAYftQ2MLfTHcYRZ2xYZFD8tGVnE3qFV0lj1smQeDSR7/yY0PyuUalauf33bJeA==} + '@types/through@0.0.33': resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} @@ -3235,6 +3234,13 @@ packages: '@types/yargs@17.0.35': resolution: {integrity: sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==} + '@types/yeoman-environment@2.10.11': + resolution: {integrity: sha512-kIDgoiuPnL9HGHwa2t6h4FiUgYFb411/okY0nKhRKw+IMsRxMOWzQUFhZ/CKQvwXvKoCjFTj+MZI2KXAKxVmug==} + + '@types/yeoman-generator@6.0.0': + resolution: {integrity: sha512-K3UaW2Y2o1g+0bbaMtdtWA1oQe//W4AD8LYxDXT/qhjeLies35CV/2zWK9Rx32WYqp3FaYbHYKAS9e/5oZqvrw==} + deprecated: This is a stub types definition. yeoman-generator provides its own type definitions, so you do not need this installed. + '@typescript-eslint/eslint-plugin@8.60.1': resolution: {integrity: sha512-JQ4S5GB0tfjO8BuJ4fcX+HodkzJjYBV+7OJ+wLygaX7OGQ7FudyHL4NSCA6ob+w3Yn+5MkKIozOwQhXeM7opVg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4561,6 +4567,10 @@ packages: resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} engines: {node: '>= 12'} + commander@9.5.0: + resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} + engines: {node: ^12.20.0 || >=14} + comment-json@4.1.0: resolution: {integrity: sha512-WEghmVYaNq9NlWbrkzQTSsya9ycLyxJxpTQfZEan6a5Jomnjw18zS3Podf8q1Zf9BvonvQd/+Z7Z39L7KKzzdQ==} engines: {node: '>= 6'} @@ -12583,6 +12593,16 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/checkbox@5.2.1(@types/node@16.11.10)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/confirm@6.1.1(@types/node@14.18.63)': dependencies: '@inquirer/core': 11.2.1(@types/node@14.18.63) @@ -12590,6 +12610,14 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/confirm@6.1.1(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/core@11.2.1(@types/node@14.18.63)': dependencies: '@inquirer/ansi': 2.0.7 @@ -12602,6 +12630,19 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/core@11.2.1(@types/node@16.11.10)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@16.11.10) + cli-width: 4.1.0 + fast-wrap-ansi: 0.2.2 + mute-stream: 3.0.0 + signal-exit: 4.1.0 + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/editor@5.2.2(@types/node@14.18.63)': dependencies: '@inquirer/core': 11.2.1(@types/node@14.18.63) @@ -12610,6 +12651,15 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/editor@5.2.2(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/external-editor': 3.0.3(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/expand@5.1.1(@types/node@14.18.63)': dependencies: '@inquirer/core': 11.2.1(@types/node@14.18.63) @@ -12617,12 +12667,20 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 - '@inquirer/external-editor@1.0.3(@types/node@25.9.1)': + '@inquirer/expand@5.1.1(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + + '@inquirer/external-editor@1.0.3(@types/node@16.11.10)': dependencies: chardet: 2.1.1 iconv-lite: 0.7.2 optionalDependencies: - '@types/node': 25.9.1 + '@types/node': 16.11.10 '@inquirer/external-editor@3.0.3(@types/node@14.18.63)': dependencies: @@ -12631,6 +12689,14 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/external-editor@3.0.3(@types/node@16.11.10)': + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.2 + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/figures@2.0.7': {} '@inquirer/input@5.1.2(@types/node@14.18.63)': @@ -12640,6 +12706,14 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/input@5.1.2(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/number@4.1.1(@types/node@14.18.63)': dependencies: '@inquirer/core': 11.2.1(@types/node@14.18.63) @@ -12647,6 +12721,14 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/number@4.1.1(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/password@5.1.1(@types/node@14.18.63)': dependencies: '@inquirer/ansi': 2.0.7 @@ -12655,6 +12737,15 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/password@5.1.1(@types/node@16.11.10)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/prompts@8.5.2(@types/node@14.18.63)': dependencies: '@inquirer/checkbox': 5.2.1(@types/node@14.18.63) @@ -12670,6 +12761,22 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/prompts@8.5.2(@types/node@16.11.10)': + dependencies: + '@inquirer/checkbox': 5.2.1(@types/node@16.11.10) + '@inquirer/confirm': 6.1.1(@types/node@16.11.10) + '@inquirer/editor': 5.2.2(@types/node@16.11.10) + '@inquirer/expand': 5.1.1(@types/node@16.11.10) + '@inquirer/input': 5.1.2(@types/node@16.11.10) + '@inquirer/number': 4.1.1(@types/node@16.11.10) + '@inquirer/password': 5.1.1(@types/node@16.11.10) + '@inquirer/rawlist': 5.3.1(@types/node@16.11.10) + '@inquirer/search': 4.2.1(@types/node@16.11.10) + '@inquirer/select': 5.2.1(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/rawlist@5.3.1(@types/node@14.18.63)': dependencies: '@inquirer/core': 11.2.1(@types/node@14.18.63) @@ -12677,6 +12784,14 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/rawlist@5.3.1(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/search@4.2.1(@types/node@14.18.63)': dependencies: '@inquirer/core': 11.2.1(@types/node@14.18.63) @@ -12685,6 +12800,15 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/search@4.2.1(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/select@5.2.1(@types/node@14.18.63)': dependencies: '@inquirer/ansi': 2.0.7 @@ -12694,10 +12818,25 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + '@inquirer/select@5.2.1(@types/node@16.11.10)': + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/figures': 2.0.7 + '@inquirer/type': 4.0.7(@types/node@16.11.10) + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@inquirer/type@4.0.7(@types/node@14.18.63)': optionalDependencies: '@types/node': 14.18.63 + '@inquirer/type@4.0.7(@types/node@16.11.10)': + optionalDependencies: + '@types/node': 16.11.10 + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -14092,6 +14231,10 @@ snapshots: '@types/deep-equal-in-any-order@1.0.4': {} + '@types/diff@8.0.0': + dependencies: + diff: 9.0.0 + '@types/ejs@3.1.5': {} '@types/eslint-scope@3.7.7': @@ -14157,6 +14300,11 @@ snapshots: '@types/through': 0.0.33 rxjs: 6.6.7 + '@types/inquirer@8.2.13': + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.2 + '@types/istanbul-lib-coverage@2.0.6': {} '@types/istanbul-lib-report@3.0.3': @@ -14195,6 +14343,13 @@ snapshots: '@types/lodash@4.14.202': {} + '@types/mem-fs@2.2.0': + dependencies: + mem-fs: 4.1.4 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + '@types/mime@1.3.2': {} '@types/mime@3.0.1': {} @@ -14301,6 +14456,8 @@ snapshots: '@types/strip-json-comments@0.0.30': {} + '@types/text-table@0.2.5': {} + '@types/through@0.0.33': dependencies: '@types/node': 16.11.10 @@ -14344,6 +14501,37 @@ snapshots: dependencies: '@types/yargs-parser': 21.0.3 + '@types/yeoman-environment@2.10.11(@yeoman/types@1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4))(mem-fs@4.1.4)': + dependencies: + '@types/diff': 8.0.0 + '@types/inquirer': 8.2.13 + '@types/mem-fs': 2.2.0 + '@types/node': 16.11.10 + '@types/text-table': 0.2.5 + '@types/vinyl': 2.0.12 + '@types/yeoman-generator': 6.0.0(@types/node@16.11.10)(@yeoman/types@1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4))(mem-fs@4.1.4) + chalk: 4.1.2 + commander: 9.5.0 + execa: 5.1.1 + rxjs: 6.6.7 + transitivePeerDependencies: + - '@yeoman/types' + - bare-abort-controller + - mem-fs + - react-native-b4a + - supports-color + + '@types/yeoman-generator@6.0.0(@types/node@16.11.10)(@yeoman/types@1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4))(mem-fs@4.1.4)': + dependencies: + yeoman-generator: 8.2.2(@types/node@16.11.10)(@yeoman/types@1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4))(mem-fs@4.1.4) + transitivePeerDependencies: + - '@types/node' + - '@yeoman/types' + - bare-abort-controller + - mem-fs + - react-native-b4a + - supports-color + '@typescript-eslint/eslint-plugin@8.60.1(@typescript-eslint/parser@8.60.1(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.2 @@ -14837,6 +15025,20 @@ snapshots: transitivePeerDependencies: - '@types/node' + '@yeoman/adapter@4.0.2(@types/node@16.11.10)': + dependencies: + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/prompts': 8.5.2(@types/node@16.11.10) + chalk: 5.6.2 + inquirer: 13.4.3(@types/node@16.11.10) + log-symbols: 7.0.1 + ora: 9.4.1 + p-queue: 9.3.1 + text-table: 0.2.0 + transitivePeerDependencies: + - '@types/node' + optional: true + '@yeoman/conflicter@4.1.0(@types/node@14.18.63)(@yeoman/types@1.11.1(@types/node@14.18.63)(@yeoman/adapter@4.0.2(@types/node@14.18.63))(mem-fs@4.1.4))(mem-fs@4.1.4)': dependencies: '@types/node': 14.18.63 @@ -14873,6 +15075,13 @@ snapshots: '@yeoman/adapter': 4.0.2(@types/node@14.18.63) mem-fs: 4.1.4 + '@yeoman/types@1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4)': + dependencies: + '@types/node': 16.11.10 + optionalDependencies: + '@yeoman/adapter': 4.0.2(@types/node@16.11.10) + mem-fs: 4.1.4 + JSONStream@1.3.5: dependencies: jsonparse: 1.3.1 @@ -15958,6 +16167,8 @@ snapshots: commander@8.3.0: {} + commander@9.5.0: {} + comment-json@4.1.0: dependencies: array-timsort: 1.0.3 @@ -16061,7 +16272,7 @@ snapshots: serialize-javascript: 6.0.0 webpack: 5.106.2(webpack-cli@6.0.1(webpack@5.104.1)) - copy-webpack-plugin@12.0.2(webpack@5.106.2): + copy-webpack-plugin@12.0.2(webpack@5.106.2(webpack-cli@6.0.1(webpack@5.104.1))): dependencies: fast-glob: 3.3.3 glob-parent: 6.0.2 @@ -16069,7 +16280,7 @@ snapshots: normalize-path: 3.0.0 schema-utils: 4.3.3 serialize-javascript: 6.0.2 - webpack: 5.106.2(webpack-cli@5.1.4) + webpack: 5.106.2(webpack-cli@6.0.1(webpack@5.104.1)) copy-webpack-plugin@9.0.1(webpack@5.106.2(webpack-cli@6.0.1(webpack@5.104.1))): dependencies: @@ -18327,6 +18538,19 @@ snapshots: optionalDependencies: '@types/node': 14.18.63 + inquirer@13.4.3(@types/node@16.11.10): + dependencies: + '@inquirer/ansi': 2.0.7 + '@inquirer/core': 11.2.1(@types/node@16.11.10) + '@inquirer/prompts': 8.5.2(@types/node@16.11.10) + '@inquirer/type': 4.0.7(@types/node@16.11.10) + mute-stream: 3.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + '@types/node': 16.11.10 + optional: true + inquirer@7.3.3: dependencies: ansi-escapes: 4.3.2 @@ -18343,9 +18567,9 @@ snapshots: strip-ansi: 6.0.1 through: 2.3.8 - inquirer@8.2.7(@types/node@25.9.1): + inquirer@8.2.7(@types/node@16.11.10): dependencies: - '@inquirer/external-editor': 1.0.3(@types/node@25.9.1) + '@inquirer/external-editor': 1.0.3(@types/node@16.11.10) ansi-escapes: 4.3.2 chalk: 4.1.2 cli-cursor: 3.1.0 @@ -20282,6 +20506,30 @@ snapshots: - react-native-b4a - supports-color + mem-fs-editor@12.0.4(@types/node@16.11.10)(mem-fs@4.1.4): + dependencies: + '@types/ejs': 3.1.5 + '@types/picomatch': 4.0.3 + binaryextensions: 6.11.0 + commondir: 1.0.1 + debug: 4.4.3 + deep-extend: 0.6.0 + ejs: 5.0.2 + isbinaryfile: 5.0.7 + mem-fs: 4.1.4 + minimatch: 10.2.5 + multimatch: 8.0.0 + normalize-path: 3.0.0 + textextensions: 6.11.0 + tinyglobby: 0.2.17 + vinyl: 3.0.1 + optionalDependencies: + '@types/node': 16.11.10 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + mem-fs-editor@6.0.0: dependencies: commondir: 1.0.1 @@ -23147,15 +23395,6 @@ snapshots: typescript: 5.7.3 webpack: 5.106.2(webpack-cli@6.0.1(webpack@5.104.1)) - ts-loader@9.4.2(typescript@5.7.3)(webpack@5.106.2): - dependencies: - chalk: 4.1.2 - enhanced-resolve: 5.21.1 - micromatch: 4.0.8 - semver: 7.6.3 - typescript: 5.7.3 - webpack: 5.106.2(webpack-cli@5.1.4) - ts-loader@9.6.2(loader-utils@2.0.4)(typescript@5.7.3)(webpack@5.106.2): dependencies: chalk: 4.1.2 @@ -24258,7 +24497,7 @@ snapshots: - supports-color optional: true - yeoman-environment@3.19.3(@types/node@25.9.1): + yeoman-environment@3.19.3(@types/node@16.11.10): dependencies: '@npmcli/arborist': 4.3.1 are-we-there-yet: 2.0.0 @@ -24276,7 +24515,7 @@ snapshots: find-up: 5.0.0 globby: 11.1.0 grouped-queue: 2.1.0 - inquirer: 8.2.7(@types/node@25.9.1) + inquirer: 8.2.7(@types/node@16.11.10) is-scoped: 2.1.0 isbinaryfile: 4.0.10 lodash: 4.18.1 @@ -24392,6 +24631,33 @@ snapshots: - react-native-b4a - supports-color + yeoman-generator@8.2.2(@types/node@16.11.10)(@yeoman/types@1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4))(mem-fs@4.1.4): + dependencies: + '@types/debug': 4.1.13 + '@types/lodash-es': 4.17.12 + '@yeoman/namespace': 2.1.0 + '@yeoman/types': 1.11.1(@types/node@16.11.10)(@yeoman/adapter@4.0.2(@types/node@16.11.10))(mem-fs@4.1.4) + chalk: 5.6.2 + debug: 4.4.3 + execa: 9.6.1 + latest-version: 9.0.0 + lodash-es: 4.18.1 + mem-fs: 4.1.4 + mem-fs-editor: 12.0.4(@types/node@16.11.10)(mem-fs@4.1.4) + minimist: 1.2.8 + read-package-up: 12.0.0 + semver: 7.8.1 + simple-git: 3.36.0 + sort-keys: 6.0.1 + text-table: 0.2.0 + type-fest: 5.8.0 + optionalDependencies: + '@types/node': 16.11.10 + transitivePeerDependencies: + - bare-abort-controller + - react-native-b4a + - supports-color + yn@3.1.1: {} yocto-queue@0.1.0: {} diff --git a/projects/yeoman-ui/package.json b/projects/yeoman-ui/package.json new file mode 100644 index 00000000..eca0bf00 --- /dev/null +++ b/projects/yeoman-ui/package.json @@ -0,0 +1,21 @@ +{ + "name": "@sap-devx/yeoman-ui-project", + "version": "1.25.1", + "private": true, + "description": "Private root package for the yeoman-ui project", + "license": "Apache 2.0", + "author": "SAP SE", + "repository": { + "type": "git", + "url": "https://github.com/SAP/app-studio-toolkit.git", + "directory": "projects/yeoman-ui" + }, + "devDependencies": { + "null-loader": "4.0.1", + "string-replace-loader": "3.0.3", + "terser-webpack-plugin": "5.5.0", + "ts-loader": "9.6.2", + "webpack": "5.106.2", + "webpack-cli": "5.1.4" + } +} diff --git a/projects/yeoman-ui/packages/backend/package.json b/projects/yeoman-ui/packages/backend/package.json index da4d17b2..797bc7e8 100644 --- a/projects/yeoman-ui/packages/backend/package.json +++ b/projects/yeoman-ui/packages/backend/package.json @@ -150,14 +150,6 @@ "SAP Fiori Elements" ], "description": "Saved search query." - }, - "ApplicationWizard.legacyGenerators": { - "type": "array", - "items": { - "type": "string" - }, - "default": [], - "markdownDescription": "Generators listed here run under the legacy yeoman-environment v3 runtime instead of the default v6 runtime. Entries are matched against a generator's namespace prefix (e.g. `@sap/generator-name` matches all its sub-generators). The environment variable `YEOMAN_UI_LEGACY_GENERATORS` (comma-separated) is unioned with this list" } } }, @@ -219,22 +211,15 @@ "@types/webpack-env": "^1.16.2", "@types/ws": "^8.5.14", "@vscode/vsce": "2.24.0", - "@yeoman/adapter": "4.0.2", "@yeoman/types": "1.11.1", "c8": "11.0.0", "copy-webpack-plugin": "^12.0.2", "lcov-result-merger": "5.0.0", - "null-loader": "4.0.1", "sinon": "^18.0.1", "spdx-exceptions": "^2.5.0", "spdx-license-ids": "^3.0.20", - "string-replace-loader": "3.0.3", "terser": "^5.48.0", - "terser-webpack-plugin": "^5.3.0", - "ts-loader": "^9.2.3", "ts-node": "^10.9.2", - "webpack": "^5.94.0", - "webpack-cli": "^5.1.4", "ws": "8.17.1" }, "extensionDependencies": [ diff --git a/projects/yeoman-ui/packages/backend/src/replayUtils.ts b/projects/yeoman-ui/packages/backend/src/replayUtils.ts index 0e5bbb03..57cdbc02 100644 --- a/projects/yeoman-ui/packages/backend/src/replayUtils.ts +++ b/projects/yeoman-ui/packages/backend/src/replayUtils.ts @@ -1,10 +1,8 @@ import type { IPrompt } from "@sap-devx/yeoman-ui-types"; import hash from "object-hash"; +import type { Answers } from "inquirer"; import { asArray } from "./utils/questionTypes.js"; -import type { - YeomanUIQuestions, - PromptAnswers, -} from "./utils/questionTypes.js"; +import type { YeomanUIQuestions } from "./utils/questionTypes.js"; export enum ReplayState { Replaying, @@ -41,7 +39,7 @@ export class ReplayUtils { private static setDefaults( questions: YeomanUIQuestions, - answers: PromptAnswers + answers: Answers ): void { for (const question of asArray(questions)) { const name = question["name"]; @@ -58,9 +56,9 @@ export class ReplayUtils { } public isReplaying: boolean; - private readonly answersCache: Map; - private replayStack: PromptAnswers[]; - private replayQueue: PromptAnswers[]; + private readonly answersCache: Map; + private replayStack: Answers[]; + private replayQueue: Answers[]; private numOfSteps: number; private prompts: IPrompt[]; @@ -80,7 +78,7 @@ export class ReplayUtils { public start( questions: YeomanUIQuestions, - answers: PromptAnswers, + answers: Answers, numOfSteps: number ): void { this._rememberAnswers(questions, answers); @@ -94,13 +92,13 @@ export class ReplayUtils { this.isReplaying = false; this.prompts = []; this.replayQueue = []; - const answers: PromptAnswers = this.replayStack.pop(); + const answers: Answers = this.replayStack.pop(); ReplayUtils.setDefaults(questions, answers); this.replayStack.splice(this.replayStack.length - this.numOfSteps + 1); return prompts; } - public next(promptCount: number, promptName: string): PromptAnswers { + public next(promptCount: number, promptName: string): Answers { if (promptCount > this.prompts.length) { const prompt: IPrompt = { name: promptName, @@ -116,14 +114,14 @@ export class ReplayUtils { this.prompts = prompts; } - public remember(questions: YeomanUIQuestions, answers: PromptAnswers): void { + public remember(questions: YeomanUIQuestions, answers: Answers): void { this._rememberAnswers(questions, answers); this.replayStack.push(answers); } public recall(questions: YeomanUIQuestions): void { const key: string = ReplayUtils.getQuestionsHash(questions); - const previousAnswers: PromptAnswers = this.answersCache.get(key); + const previousAnswers: Answers = this.answersCache.get(key); if (previousAnswers !== undefined) { ReplayUtils.setDefaults(questions, previousAnswers); } @@ -143,7 +141,7 @@ export class ReplayUtils { private _rememberAnswers( questions: YeomanUIQuestions, - answers: PromptAnswers + answers: Answers ): void { const key: string = ReplayUtils.getQuestionsHash(questions); this.answersCache.set(key, answers); diff --git a/projects/yeoman-ui/packages/backend/src/utils/env.ts b/projects/yeoman-ui/packages/backend/src/utils/env.ts index 2f528ff6..cf256d48 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/env.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/env.ts @@ -11,7 +11,7 @@ import type { import type { IChildLogger } from "@vscode-logging/logger"; import type * as YeomanEnvV3 from "yeoman-env-v3"; import { getClassLogger } from "../logger/logger-wrapper.js"; -import { isLegacyNamespace, namespaceToName } from "./legacyGenerators.js"; +import { namespaceToName } from "./namespace.js"; const _require = createRequire(import.meta.url); @@ -166,22 +166,13 @@ class EnvUtil { const meta: LookupGeneratorMeta = await this.getGenMetadata(genNamespace); this.unloadGeneratorModules(genNamespace); - // Fast path: namespace is in the include list → route straight to v3. - // This avoids the wasted work of trying v6 first for known-legacy - // generators and skips the wall-clock cost of a failed v6.create(). - if (isLegacyNamespace(genNamespace)) { - this.logger?.info( - `routing generator ${genNamespace} to legacy yeoman-environment v3 (matched include list)` - ); - return this.createLegacyEnvAndGen(genNamespace, meta, options, adapter); - } - - // Default path: try v6 first. If it throws while instantiating (typical - // symptom for v4/v5-shape generators under v6), fall back to v3. This - // makes the include list a *performance hint*, not a *filter*: users - // still see all their generators, unlisted-legacy ones just pay a small - // first-run cost. Operators can add explicit entries once they identify - // which packages are legacy to eliminate the retry. + // Try the default (modern) yeoman-environment v6 first. Generators written + // against the v3/v4 API shape throw when v6 instantiates them; in that case + // fall back to the bundled v3 runtime. This keeps the routing fully dynamic: + // every installed generator is attempted on v6 and only drops to v3 when it + // actually fails, so no static list of "legacy" generators has to be + // maintained. The only cost is a single failed v6 create() for a legacy + // generator before the fallback runs this.logger?.debug( `routing generator ${genNamespace} to yeoman-environment v6` ); @@ -235,7 +226,9 @@ class EnvUtil { adapter ); env.register(meta.resolved, genNamespace); - const gen = env.create(genNamespace, { options }); + const gen = env.create(genNamespace, { + options, + } as unknown as string[]); return { env: env as unknown as Environment, gen }; } diff --git a/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts b/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts deleted file mode 100644 index b4e562d8..00000000 --- a/projects/yeoman-ui/packages/backend/src/utils/legacyGenerators.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { vscode } from "./vscodeProxy.js"; - -const ENV_VAR = "YEOMAN_UI_LEGACY_GENERATORS"; -const CONFIG_SECTION = "ApplicationWizard"; -const CONFIG_KEY = "legacyGenerators"; - -/** - * Returns the merged legacy-generator include list from two sources: - * - * 1. The `YEOMAN_UI_LEGACY_GENERATORS` environment variable (comma or JSON - * array). Wins when the same generator appears in both — operators use it - * to override VSCode settings landscape-wide without a hotfix release. - * 2. The `ApplicationWizard.legacyGenerators` VSCode setting (array of - * strings). Users tweak this per-workspace / per-user. - * - * Each entry is a **namespace prefix**. A generator whose namespace starts - * with `:` or equals `` runs under the legacy yeoman-environment - * v3 runtime. - * - * An empty list means all generators use the default v6 runtime. - */ -export function getLegacyGeneratorList(): string[] { - const list = new Set(); - - const envRaw = process.env[ENV_VAR]; - if (envRaw && envRaw.trim().length > 0) { - for (const entry of parseListLoosely(envRaw)) { - list.add(entry); - } - } - - // In the extension host `vscode` is the real API; in tests / dev flow it is - // the mock defined in vscodeProxy — both expose `workspace.getConfiguration`, - // so the same lookup path works everywhere. - try { - const configured = vscode.workspace - ?.getConfiguration(CONFIG_SECTION) - ?.get(CONFIG_KEY); - if (Array.isArray(configured)) { - for (const entry of configured) { - if (typeof entry === "string" && entry.trim().length > 0) { - list.add(entry.trim()); - } - } - } - } catch { - // getConfiguration can throw in narrow lifecycle windows (activation - // race). Fall back to env-var-only list — safer than crashing the flow. - } - - return Array.from(list); -} - -/** - * Whether a generator namespace should route to the legacy v3 runtime. - * - * Matches an entry when the namespace equals it or is a colon-delimited - * descendant. - */ -export function isLegacyNamespace( - genNamespace: string, - list = getLegacyGeneratorList() -): boolean { - return list.some( - (entry) => genNamespace === entry || genNamespace.startsWith(`${entry}:`) - ); -} - -function parseListLoosely(raw: string): string[] { - const trimmed = raw.trim(); - // Accept a JSON array — the env-var may carry structured payloads set by - // orchestration tooling. - if (trimmed.startsWith("[")) { - try { - const parsed = JSON.parse(trimmed); - if (Array.isArray(parsed)) { - return parsed - .filter((s): s is string => typeof s === "string") - .map((s) => s.trim()) - .filter((s) => s.length > 0); - } - } catch { - // fall through to comma-splitting - } - } - return trimmed - .split(",") - .map((s) => s.trim()) - .filter((s) => s.length > 0); -} - -/** - * Convert a generator namespace to its package short-name. - * - * Strips the sub-generator segment (everything after the first `:`), then the - * `generator-` prefix — both for bare (`generator-foo:app` → `foo`) and scoped - * (`@scope/generator-foo:app` → `@scope/foo`) namespaces. Yeoman-environment - * v6 dropped the equivalent `namespaceToName` static helper so we ship our own. - */ -export function namespaceToName(ns: string): string { - const base = ns.replace(/:.*$/, ""); - return base.startsWith("@") - ? base.replace(/\/generator-/, "/") - : base.replace(/^generator-/, ""); -} diff --git a/projects/yeoman-ui/packages/backend/src/utils/namespace.ts b/projects/yeoman-ui/packages/backend/src/utils/namespace.ts new file mode 100644 index 00000000..d99be495 --- /dev/null +++ b/projects/yeoman-ui/packages/backend/src/utils/namespace.ts @@ -0,0 +1,13 @@ +/** + * Convert a generator namespace to its package short-name. + * + * Strips the sub-generator segment (everything after the first `:`), then the + * `generator-` prefix — both for bare (`generator-foo:app` → `foo`) and scoped + * (`@scope/generator-foo:app` → `@scope/foo`) namespaces + */ +export function namespaceToName(ns: string): string { + const base = ns.replace(/:.*$/, ""); + return base.startsWith("@") + ? base.replace(/\/generator-/, "/") + : base.replace(/^generator-/, ""); +} diff --git a/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts index e5a8fb28..84a2c63f 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts @@ -1,29 +1,24 @@ -import type { PromptAnswers } from "@yeoman/adapter/types"; +import type { Question } from "inquirer"; -export interface YeomanUIQuestion { - name?: string; - type?: string; - message?: string | ((answers: PromptAnswers) => string); - default?: unknown; +export type YeomanUIQuestion = Pick< + Question, + "type" | "name" | "message" | "default" | "when" | "validate" | "filter" +> & { + // Choices live on inquirer's list-style questions, not the base Question choices?: unknown; - when?: unknown; - validate?: unknown; - filter?: unknown; - /** yeoman-ui GUI hint used to pick a custom question renderer. */ + // yeoman-ui GUI hint used to pick a custom question renderer guiType?: string; guiOptions?: { type?: string; [key: string]: unknown }; - // Replay markers set by ReplayUtils.setDefaults. + // Replay markers set by ReplayUtils.setDefaults __ForceDefault?: boolean; __origAnswer?: unknown; - // Custom event-handler methods are attached by name at runtime. + // Custom event-handler methods are attached by name at runtime [key: string]: unknown; -} +}; export type YeomanUIQuestions = YeomanUIQuestion | YeomanUIQuestion[]; -/** Normalize a single-or-array question value to an array. */ +// Normalize a single-or-array question value to an array export function asArray(questions: YeomanUIQuestions): YeomanUIQuestion[] { return Array.isArray(questions) ? questions : [questions]; } - -export type { PromptAnswers }; diff --git a/projects/yeoman-ui/packages/backend/src/yeomanui.ts b/projects/yeoman-ui/packages/backend/src/yeomanui.ts index 017fb831..ec21c8fd 100644 --- a/projects/yeoman-ui/packages/backend/src/yeomanui.ts +++ b/projects/yeoman-ui/packages/backend/src/yeomanui.ts @@ -22,14 +22,11 @@ import { GeneratorData, GeneratorNotFoundError, } from "./utils/env.js"; -import { namespaceToName } from "./utils/legacyGenerators.js"; +import { namespaceToName } from "./utils/namespace.js"; import { vscode, getVscode } from "./utils/vscodeProxy.js"; import Generator from "yeoman-generator"; import Environment from "yeoman-environment"; -import type { - YeomanUIQuestions, - PromptAnswers, -} from "./utils/questionTypes.js"; +import type { YeomanUIQuestions } from "./utils/questionTypes.js"; import { State } from "./utils/promise.js"; import { Constants } from "./utils/constants.js"; import { isUriFlow } from "./utils/workspaceFile.js"; @@ -461,7 +458,7 @@ export class YeomanUI { } private async back( - partialAnswers: PromptAnswers, + partialAnswers: inquirer.Answers, numOfSteps: number ): Promise { this.replayUtils.start(this.currentQuestions, partialAnswers, numOfSteps); diff --git a/projects/yeoman-ui/packages/backend/src/youi-adapter.ts b/projects/yeoman-ui/packages/backend/src/youi-adapter.ts index 36f7a2e1..be1cf30f 100644 --- a/projects/yeoman-ui/packages/backend/src/youi-adapter.ts +++ b/projects/yeoman-ui/packages/backend/src/youi-adapter.ts @@ -3,10 +3,8 @@ import { YouiEvents } from "./youi-events.js"; import yoUiLog from "./utils/log.js"; import lodash from "lodash"; import chalk from "chalk"; -import type { - YeomanUIQuestions, - PromptAnswers, -} from "./utils/questionTypes.js"; +import type { Answers } from "inquirer"; +import type { YeomanUIQuestions } from "./utils/questionTypes.js"; import { Output } from "./output.js"; const { get, isFunction } = lodash; @@ -44,7 +42,7 @@ export class YouiAdapter { * @param {Array} questions * @param {Function} callback */ - public async prompt( + public async prompt( questions: YeomanUIQuestions, cb?: (res: T1) => T2 ): Promise { diff --git a/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/generators/app/index.js b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/generators/app/index.js new file mode 100644 index 00000000..e6270287 --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/generators/app/index.js @@ -0,0 +1,14 @@ +"use strict"; + +module.exports = class EnvV3FixtureGenerator { + constructor(args, opts) { + this.args = args; + this.options = opts; + this.env = opts && opts.env; + this.envV3FixtureLoaded = true; + } + + initializing() { + return "env-v3-fixture-initialized"; + } +}; diff --git a/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/package.json b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/package.json new file mode 100644 index 00000000..ca02e797 --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v3-fixture/package.json @@ -0,0 +1,4 @@ +{ + "name": "generator-env-v3-fixture", + "type": "commonjs" +} diff --git a/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/generators/app/index.js b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/generators/app/index.js new file mode 100644 index 00000000..82dd717a --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/generators/app/index.js @@ -0,0 +1,10 @@ +"use strict"; + +const Generator = require("yeoman-generator").default; + +module.exports = class EnvV6FixtureGenerator extends Generator { + // A trivial lifecycle method so the class is a valid, instantiable generator. + initializing() { + this.envV6FixtureLoaded = true; + } +}; diff --git a/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/package.json b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/package.json new file mode 100644 index 00000000..2722cb9b --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-fixture/package.json @@ -0,0 +1,4 @@ +{ + "name": "generator-env-v6-fixture", + "type": "commonjs" +} diff --git a/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts new file mode 100644 index 00000000..b3853adf --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts @@ -0,0 +1,116 @@ +import { createSandbox, SinonSandbox } from "sinon"; +import { expect } from "chai"; +import { resolve } from "path"; +import { fileURLToPath } from "url"; +import { dirname } from "path"; +import { createRequire } from "module"; +import { Env } from "../../src/utils/env.js"; +import type { LookupGeneratorMeta } from "@yeoman/types"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); +const require = createRequire(import.meta.url); + +const FIXTURES = resolve(__dirname, "../fixtures"); + +const envV6Fixture = { + namespace: "env-v6-fixture:app", + packagePath: resolve(FIXTURES, "generator-env-v6-fixture"), + resolved: resolve( + FIXTURES, + "generator-env-v6-fixture/generators/app/index.js" + ), +}; + +const envV3Fixture = { + namespace: "env-v3-fixture:app", + packagePath: resolve(FIXTURES, "generator-env-v3-fixture"), + resolved: resolve( + FIXTURES, + "generator-env-v3-fixture/generators/app/index.js" + ), +}; + +/** Build a LookupGeneratorMeta the way env.ts consumes it. */ +function metaFor(fixture: { + namespace: string; + packagePath: string; + resolved: string; +}): LookupGeneratorMeta { + return { + namespace: fixture.namespace, + packagePath: fixture.packagePath, + resolved: fixture.resolved, + registered: true, + } as unknown as LookupGeneratorMeta; +} + +describe("Env.createEnvAndGen — loading generators on both environments", () => { + let sandbox: SinonSandbox; + + beforeEach(() => { + sandbox = createSandbox(); + }); + + afterEach(() => { + sandbox.restore(); + // Clear the cached compat handle so each test controls it explicitly. + (Env as any)["legacyCompat"] = undefined; + }); + + it("loads a generator through yeoman-environment v6", async () => { + // Point metadata resolution at the v6 fixture; let the real v6 env + // register + create it (no fallback). + sandbox.stub(Env as any, "getGenMetadata").resolves(metaFor(envV6Fixture)); + + const { env, gen } = await Env.createEnvAndGen( + envV6Fixture.namespace, + { silent: true }, + undefined + ); + + expect(env, "a v6 environment instance is returned").to.be.an("object"); + expect(gen, "a generator instance is returned").to.be.an("object"); + expect( + gen.constructor.name, + "the v6 fixture class was instantiated" + ).to.equal("EnvV6FixtureGenerator"); + }); + + it("falls back to yeoman-environment v3 when v6 cannot create the generator", async () => { + sandbox.stub(Env as any, "getGenMetadata").resolves(metaFor(envV3Fixture)); + + // Force the v6 path to fail so the v3 fallback runs — simulates a + // v3-shape generator that v6 rejects at create() time. + const failingV6Env: any = { + register(): void { + return undefined; + }, + create(): never { + throw new Error("v6 cannot instantiate a v3-shape generator"); + }, + }; + sandbox.stub(Env as any, "createEnvInstance").returns(failingV6Env); + + // Inject the real yeoman-env-v3 compat runtime (in the bundled extension + // this is loaded from ./yeoman-env-v3.cjs via __non_webpack_require__, + // which is not available under ts-node; the package resolves directly here). + (Env as any)["legacyCompat"] = require("yeoman-env-v3"); + + const { env, gen } = await Env.createEnvAndGen( + envV3Fixture.namespace, + { silent: true }, + undefined + ); + + expect(env, "a v3 environment instance is returned").to.be.an("object"); + expect(gen, "a generator instance is returned").to.be.an("object"); + expect( + gen.constructor.name, + "the v3 fixture class was instantiated by the v3 runtime" + ).to.equal("EnvV3FixtureGenerator"); + expect( + gen.envV3FixtureLoaded, + "the v3 fixture's constructor actually ran" + ).to.equal(true); + }); +}); diff --git a/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts deleted file mode 100644 index 3bad47b8..00000000 --- a/projects/yeoman-ui/packages/backend/test/utils/legacyGenerators.spec.ts +++ /dev/null @@ -1,232 +0,0 @@ -import { createSandbox, SinonSandbox, SinonMock } from "sinon"; -import { expect } from "chai"; -import { vscode } from "../mockUtil.js"; -import { - getLegacyGeneratorList, - isLegacyNamespace, - namespaceToName, -} from "../../src/utils/legacyGenerators.js"; - -const ENV_VAR = "YEOMAN_UI_LEGACY_GENERATORS"; - -describe("legacyGenerators", () => { - let sandbox: SinonSandbox; - let wsConfigMock: SinonMock; - let originalEnv: string | undefined; - - before(() => { - sandbox = createSandbox(); - }); - - beforeEach(() => { - originalEnv = process.env[ENV_VAR]; - delete process.env[ENV_VAR]; - // The vscodeProxy mock returns the same configuration object on every - // getConfiguration() call, so mocking it once per test is stable. - wsConfigMock = sandbox.mock(vscode.workspace.getConfiguration()); - }); - - afterEach(() => { - if (originalEnv === undefined) { - delete process.env[ENV_VAR]; - } else { - process.env[ENV_VAR] = originalEnv; - } - wsConfigMock.verify(); - sandbox.restore(); - }); - - describe("getLegacyGeneratorList()", () => { - it("returns empty array when neither env-var nor setting is set", () => { - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal([]); - }); - - it("reads a single value from the env-var", () => { - process.env[ENV_VAR] = "@sap/adaptation-project"; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal([ - "@sap/adaptation-project", - ]); - }); - - it("splits a comma-separated env-var value", () => { - process.env[ENV_VAR] = "@sap/one, @sap/two,@sap/three"; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal([ - "@sap/one", - "@sap/two", - "@sap/three", - ]); - }); - - it("filters empty and whitespace-only comma entries", () => { - process.env[ENV_VAR] = ",, @sap/one ,, ,@sap/two,"; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); - }); - - it("parses a JSON array env-var value", () => { - process.env[ENV_VAR] = '["@sap/one", "@sap/two"]'; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); - }); - - it("falls back to comma splitting when JSON is malformed", () => { - // Starts with '[' but not valid JSON — the parser should try JSON, fail, - // then fall through to comma splitting rather than raise. - process.env[ENV_VAR] = "[not,json,but,commas"; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal([ - "[not", - "json", - "but", - "commas", - ]); - }); - - it("ignores non-string entries inside a JSON array", () => { - process.env[ENV_VAR] = '["@sap/one", 42, null, "@sap/two", ""]'; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); - }); - - it("returns empty array when env-var is set to whitespace only", () => { - process.env[ENV_VAR] = " "; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(getLegacyGeneratorList()).to.deep.equal([]); - }); - - it("returns the VSCode setting value when env-var is unset", () => { - wsConfigMock - .expects("get") - .withArgs("legacyGenerators") - .returns(["@sap/fiori"]); - expect(getLegacyGeneratorList()).to.deep.equal(["@sap/fiori"]); - }); - - it("unions env-var and VSCode setting, deduplicating identical entries", () => { - process.env[ENV_VAR] = "@sap/one,@sap/shared"; - wsConfigMock - .expects("get") - .withArgs("legacyGenerators") - .returns(["@sap/shared", "@sap/two"]); - expect(getLegacyGeneratorList()).to.deep.equal([ - "@sap/one", - "@sap/shared", - "@sap/two", - ]); - }); - - it("trims whitespace and skips empty strings in the VSCode setting", () => { - wsConfigMock - .expects("get") - .withArgs("legacyGenerators") - .returns([" @sap/one ", "", " ", "@sap/two"]); - expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); - }); - - it("skips non-string entries in the VSCode setting", () => { - wsConfigMock - .expects("get") - .withArgs("legacyGenerators") - .returns(["@sap/one", 42 as any, null as any, "@sap/two"]); - expect(getLegacyGeneratorList()).to.deep.equal(["@sap/one", "@sap/two"]); - }); - - it("tolerates a non-array VSCode setting value", () => { - wsConfigMock - .expects("get") - .withArgs("legacyGenerators") - .returns("not-an-array" as any); - expect(getLegacyGeneratorList()).to.deep.equal([]); - }); - - it("survives getConfiguration() throwing (activation-race path)", () => { - process.env[ENV_VAR] = "@sap/from-env"; - sandbox - .stub(vscode.workspace, "getConfiguration") - .throws(new Error("configuration service not ready")); - expect(getLegacyGeneratorList()).to.deep.equal(["@sap/from-env"]); - }); - }); - - describe("isLegacyNamespace()", () => { - it("returns false for an empty list", () => { - expect(isLegacyNamespace("@sap/adaptation-project:app", [])).to.be.false; - }); - - it("matches an exact namespace", () => { - expect( - isLegacyNamespace("@sap/adaptation-project", [ - "@sap/adaptation-project", - ]) - ).to.be.true; - }); - - it("matches a colon-delimited descendant of an entry", () => { - expect( - isLegacyNamespace("@sap/adaptation-project:app", [ - "@sap/adaptation-project", - ]) - ).to.be.true; - expect( - isLegacyNamespace("@sap/adaptation-project:adp:sub", [ - "@sap/adaptation-project", - ]) - ).to.be.true; - }); - - it("rejects a namespace that only shares a name prefix (no colon boundary)", () => { - // "@sap/adaptation-project-extended" must NOT match "@sap/adaptation-project" - expect( - isLegacyNamespace("@sap/adaptation-project-extended:app", [ - "@sap/adaptation-project", - ]) - ).to.be.false; - }); - - it("rejects a namespace not in the list", () => { - expect(isLegacyNamespace("@sap/fiori:app", ["@sap/adaptation-project"])) - .to.be.false; - }); - - it("matches when any of several list entries applies", () => { - const list = ["@sap/fiori", "@sap/adaptation-project", "@bas-dev/cicd"]; - expect(isLegacyNamespace("@sap/fiori:abap", list)).to.be.true; - expect(isLegacyNamespace("@bas-dev/cicd", list)).to.be.true; - expect(isLegacyNamespace("@sap/unrelated:app", list)).to.be.false; - }); - - it("defaults to the merged list from env + settings when none is passed", () => { - process.env[ENV_VAR] = "@sap/fiori"; - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(isLegacyNamespace("@sap/fiori:app")).to.be.true; - // second call re-reads the default list — set up a fresh expectation - wsConfigMock.expects("get").withArgs("legacyGenerators").returns([]); - expect(isLegacyNamespace("@sap/other:app")).to.be.false; - }); - }); - - describe("namespaceToName()", () => { - it("strips the sub-generator segment from a scoped namespace", () => { - expect(namespaceToName("@sap/adaptation-project:app")).to.equal( - "@sap/adaptation-project" - ); - }); - - it("drops the generator- prefix on a scoped package", () => { - expect(namespaceToName("@bas-dev/generator-abap-project:app")).to.equal( - "@bas-dev/abap-project" - ); - }); - - it("drops the generator- prefix on a bare package", () => { - expect(namespaceToName("generator-foo:app")).to.equal("foo"); - }); - - it("returns the namespace unchanged when no colon or generator- prefix", () => { - expect(namespaceToName("plain-name")).to.equal("plain-name"); - }); - }); -}); diff --git a/projects/yeoman-ui/packages/backend/test/utils/namespace.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/namespace.spec.ts new file mode 100644 index 00000000..60f03d4d --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/utils/namespace.spec.ts @@ -0,0 +1,26 @@ +import { expect } from "chai"; +import { namespaceToName } from "../../src/utils/namespace.js"; + +describe("namespace utility", () => { + describe("namespaceToName()", () => { + it("strips the sub-generator segment from a scoped namespace", () => { + expect(namespaceToName("@sap/adaptation-project:app")).to.equal( + "@sap/adaptation-project" + ); + }); + + it("drops the generator- prefix on a scoped package", () => { + expect(namespaceToName("@bas-dev/generator-abap-project:app")).to.equal( + "@bas-dev/abap-project" + ); + }); + + it("drops the generator- prefix on a bare package", () => { + expect(namespaceToName("generator-foo:app")).to.equal("foo"); + }); + + it("returns the namespace unchanged when no colon or generator- prefix", () => { + expect(namespaceToName("plain-name")).to.equal("plain-name"); + }); + }); +}); diff --git a/projects/yeoman-ui/packages/backend/webpack.config.cjs b/projects/yeoman-ui/packages/backend/webpack.config.cjs index 15407de6..bce6a312 100644 --- a/projects/yeoman-ui/packages/backend/webpack.config.cjs +++ b/projects/yeoman-ui/packages/backend/webpack.config.cjs @@ -113,11 +113,17 @@ const config = { flags: "g", }, }, - // environment-full.js: `await import('yeoman-generator')` is a static - // string, so webpack CAN resolve and bundle yeoman-generator — but doing - // so triples the bundle size and yeoman-generator itself does dynamic - // filesystem loading. Keep it as a native runtime import so the - // generator's own installed copy on disk is used. + // environment-full.js `requireGenerator(undefined)` does + // `await import('yeoman-generator')` to obtain a *default* base Generator + // class (only when no resolved generator path is given). We keep it a + // native runtime import rather than letting webpack bundle it, because: + // 1. Our normal flow never reaches it — generators are loaded by + // store.js via require(meta.resolved), which pulls each generator's + // OWN yeoman-generator from its own node_modules on disk. + // 2. If it ever is reached, this bare specifier has no node_modules to + // resolve against inside the *.vsix, so the import rejects and + // yeoman-environment falls through to its `flyImport(...)` fallback + // (which installs on demand). Bundling it wouldn't help that path. { test: /yeoman-environment[/|\\]dist[/|\\]environment-full\.js/, loader: "string-replace-loader", diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/package.json b/projects/yeoman-ui/packages/yeoman-env-v3/package.json index 813a7e21..10b7b4cf 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/package.json +++ b/projects/yeoman-ui/packages/yeoman-env-v3/package.json @@ -22,11 +22,6 @@ "yeoman-environment": "3.19.3" }, "devDependencies": { - "null-loader": "4.0.1", - "string-replace-loader": "3.0.3", - "terser-webpack-plugin": "^5.3.0", - "ts-loader": "9.6.2", - "webpack": "5.106.2", - "webpack-cli": "5.1.4" + "@types/yeoman-environment": "2.10.11" } } diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts index fb61b1d8..9520b337 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts +++ b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts @@ -1,22 +1,5 @@ -const YeomanEnvironment = require("yeoman-environment") as { - createEnv: ( - args?: string[], - opts?: Record, - adapter?: unknown - ) => LegacyEnv; -}; +import Environment = require("yeoman-environment"); -export interface LegacyEnv { - register(resolved: string, namespace: string): void; - create(namespace: string, options: { options: any }): any; - runGenerator(gen: any): Promise; - lookup(options?: any): any; - runLoop: any; - adapter: any; - sharedFs: any; - on(event: string, cb: (...args: any[]) => void): unknown; - emit(event: string, ...args: any[]): boolean; - removeAllListeners(event?: string): unknown; -} +export const createEnv = Environment.createEnv; -export const createEnv = YeomanEnvironment.createEnv; +export type LegacyEnv = Environment; diff --git a/scripts/legal-copy.js b/scripts/legal-copy.js index 8003b708..7283d03d 100644 --- a/scripts/legal-copy.js +++ b/scripts/legal-copy.js @@ -24,17 +24,16 @@ function projectDirs() { encoding: "utf8", }); const packages = JSON.parse(raw); - const packagePaths = new Set(packages.map((p) => p.path)); const dirs = new Set(); for (const { path: pkgPath } of packages) { if (!pkgPath || pkgPath === ROOT) continue; - // `pnpm -r exec -- shx cp -r ../../X X` copies from two levels up. + // `pnpm -r exec -- shx cp -r ../../X/. X` copies from two levels up. // For packages nested more than 2 levels below root the "two levels up" // target is an intermediate project dir, not the root itself. // We need to pre-populate those intermediate dirs with the legal files. const twoUp = path.resolve(pkgPath, "../.."); - if (twoUp !== ROOT && !packagePaths.has(twoUp)) { + if (twoUp !== ROOT) { dirs.add(twoUp); } } From ea85013a476866e2bab2659b50cc358907fbe4a1 Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Tue, 21 Jul 2026 14:06:34 +0500 Subject: [PATCH 6/8] fix: add changes according to review comments - remove unnecessary comments - replace yeoman-env-v3 packages version with yeoman-environment v3 (current) - simplify root yeoman-ui package.json - rename yeoman-env-v3 exports - remove asArray test - simplify backend package bundle script --- projects/yeoman-ui/package.json | 11 +---------- projects/yeoman-ui/packages/backend/package.json | 2 +- .../packages/backend/src/replayUtils.ts | 4 ++-- .../yeoman-ui/packages/backend/src/utils/env.ts | 10 +--------- .../packages/backend/src/utils/questionTypes.ts | 5 ----- .../packages/backend/test/utils/env.spec.ts | 5 +---- .../backend/test/utils/questionTypes.spec.ts | 16 ---------------- .../packages/backend/webpack.config.cjs | 11 +++++++++++ .../packages/yeoman-env-v3/package.json | 2 +- .../packages/yeoman-env-v3/src/index.ts | 4 ++-- 10 files changed, 20 insertions(+), 50 deletions(-) delete mode 100644 projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts diff --git a/projects/yeoman-ui/package.json b/projects/yeoman-ui/package.json index eca0bf00..226d52c9 100644 --- a/projects/yeoman-ui/package.json +++ b/projects/yeoman-ui/package.json @@ -1,15 +1,6 @@ { - "name": "@sap-devx/yeoman-ui-project", - "version": "1.25.1", + "name": "@sap-devx/yeoman-ui-root", "private": true, - "description": "Private root package for the yeoman-ui project", - "license": "Apache 2.0", - "author": "SAP SE", - "repository": { - "type": "git", - "url": "https://github.com/SAP/app-studio-toolkit.git", - "directory": "projects/yeoman-ui" - }, "devDependencies": { "null-loader": "4.0.1", "string-replace-loader": "3.0.3", diff --git a/projects/yeoman-ui/packages/backend/package.json b/projects/yeoman-ui/packages/backend/package.json index 797bc7e8..693c25a8 100644 --- a/projects/yeoman-ui/packages/backend/package.json +++ b/projects/yeoman-ui/packages/backend/package.json @@ -30,7 +30,7 @@ "type": "module", "main": "./dist/extension.js", "scripts": { - "bundle": "shx mkdir -p ./dist && shx cp ./node_modules/yeoman-env-v3/dist/index.js ./dist/yeoman-env-v3.cjs && webpack --config webpack.config.cjs --mode production", + "bundle": "webpack --config webpack.config.cjs --mode production", "ci": "npm-run-all clean compile coverage bundle frontend:copy package coverage:copy", "clean": "shx rm -rf ./dist ./coverage *.vsix", "clean:frontend": "cd ./dist && shx rm -rf ./media", diff --git a/projects/yeoman-ui/packages/backend/src/replayUtils.ts b/projects/yeoman-ui/packages/backend/src/replayUtils.ts index 57cdbc02..b6fd3465 100644 --- a/projects/yeoman-ui/packages/backend/src/replayUtils.ts +++ b/projects/yeoman-ui/packages/backend/src/replayUtils.ts @@ -1,7 +1,6 @@ import type { IPrompt } from "@sap-devx/yeoman-ui-types"; import hash from "object-hash"; import type { Answers } from "inquirer"; -import { asArray } from "./utils/questionTypes.js"; import type { YeomanUIQuestions } from "./utils/questionTypes.js"; export enum ReplayState { @@ -41,7 +40,8 @@ export class ReplayUtils { questions: YeomanUIQuestions, answers: Answers ): void { - for (const question of asArray(questions)) { + const questionList = Array.isArray(questions) ? questions : [questions]; + for (const question of questionList) { const name = question["name"]; const answer = answers[name as string]; diff --git a/projects/yeoman-ui/packages/backend/src/utils/env.ts b/projects/yeoman-ui/packages/backend/src/utils/env.ts index cf256d48..ef95f0a9 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/env.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/env.ts @@ -200,14 +200,6 @@ class EnvUtil { } } - /** - * Legacy code path: load yeoman-environment v3 from the pre-bundled compat - * package at runtime and use its v3-shape API. The compat bundle is copied - * into the extension's `dist/` folder next to `extension.js` at build time. - * - * v3's `env.create()` is synchronous — no await here. v3's `register()` - * takes a raw namespace string rather than the metadata object v6 accepts. - */ private createLegacyEnvAndGen( genNamespace: string, meta: LookupGeneratorMeta, @@ -220,7 +212,7 @@ class EnvUtil { ) as typeof YeomanEnvV3; } - const env = this.legacyCompat.createEnv( + const env = this.legacyCompat.createV3Env( undefined, { sharedOptions: { forwardErrorToEnvironment: true } }, adapter diff --git a/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts index 84a2c63f..af1555cd 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts @@ -17,8 +17,3 @@ export type YeomanUIQuestion = Pick< }; export type YeomanUIQuestions = YeomanUIQuestion | YeomanUIQuestion[]; - -// Normalize a single-or-array question value to an array -export function asArray(questions: YeomanUIQuestions): YeomanUIQuestion[] { - return Array.isArray(questions) ? questions : [questions]; -} diff --git a/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts index b3853adf..a6bf01c2 100644 --- a/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts +++ b/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts @@ -44,7 +44,7 @@ function metaFor(fixture: { } as unknown as LookupGeneratorMeta; } -describe("Env.createEnvAndGen — loading generators on both environments", () => { +describe("Env.createEnvAndGen()", () => { let sandbox: SinonSandbox; beforeEach(() => { @@ -91,9 +91,6 @@ describe("Env.createEnvAndGen — loading generators on both environments", () = }; sandbox.stub(Env as any, "createEnvInstance").returns(failingV6Env); - // Inject the real yeoman-env-v3 compat runtime (in the bundled extension - // this is loaded from ./yeoman-env-v3.cjs via __non_webpack_require__, - // which is not available under ts-node; the package resolves directly here). (Env as any)["legacyCompat"] = require("yeoman-env-v3"); const { env, gen } = await Env.createEnvAndGen( diff --git a/projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts deleted file mode 100644 index f84e32e6..00000000 --- a/projects/yeoman-ui/packages/backend/test/utils/questionTypes.spec.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { expect } from "chai"; -import { asArray } from "../../src/utils/questionTypes.js"; - -describe("questionTypes", () => { - describe("asArray()", () => { - it("returns the array unchanged when given an array", () => { - const questions = [{ name: "q1" }, { name: "q2" }]; - expect(asArray(questions)).to.equal(questions); - }); - - it("wraps a single question object into an array", () => { - const question = { name: "q1" }; - expect(asArray(question)).to.deep.equal([question]); - }); - }); -}); diff --git a/projects/yeoman-ui/packages/backend/webpack.config.cjs b/projects/yeoman-ui/packages/backend/webpack.config.cjs index bce6a312..4617e329 100644 --- a/projects/yeoman-ui/packages/backend/webpack.config.cjs +++ b/projects/yeoman-ui/packages/backend/webpack.config.cjs @@ -4,6 +4,7 @@ const path = require("path"); const TerserPlugin = require("terser-webpack-plugin"); +const CopyPlugin = require("copy-webpack-plugin"); /**@type {import('webpack').Configuration}*/ const config = { @@ -332,6 +333,16 @@ const config = { }, ], }, + plugins: [ + new CopyPlugin({ + patterns: [ + { + from: require.resolve("yeoman-env-v3"), + to: "yeoman-env-v3.cjs", + }, + ], + }), + ], optimization: { minimizer: [ new TerserPlugin({ diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/package.json b/projects/yeoman-ui/packages/yeoman-env-v3/package.json index 10b7b4cf..4ee0f565 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/package.json +++ b/projects/yeoman-ui/packages/yeoman-env-v3/package.json @@ -1,6 +1,6 @@ { "name": "yeoman-env-v3", - "version": "1.25.1", + "version": "3.19.3", "private": true, "description": "TypeScript wrapper that bundles yeoman-environment v3 for the yeoman-ui extension's legacy-generator code path", "license": "Apache 2.0", diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts index 9520b337..aa2ffb36 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts +++ b/projects/yeoman-ui/packages/yeoman-env-v3/src/index.ts @@ -1,5 +1,5 @@ import Environment = require("yeoman-environment"); -export const createEnv = Environment.createEnv; +export const createV3Env = Environment.createEnv; -export type LegacyEnv = Environment; +export type LegacyV3Env = Environment; From 2eb9425c21c95fb39e7fa233155c4eacbe245f1a Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Tue, 21 Jul 2026 17:35:50 +0500 Subject: [PATCH 7/8] fix: add changes according to review comments - rename variables to descriptive values - add yeoman-environment v6 and v3 errors handling - edit namespace.ts - add comment in questionTypes.ts - simplify v3 compat loading - add yeoman-env-v3 post-bundle smoke test - add v6 init-error fixture and test - rewrite legal-copy.js on @manypkg/get-packages --- package.json | 6 +- pnpm-lock.yaml | 18 ++--- .../packages/backend/src/utils/env.ts | 68 +++++++++++-------- .../packages/backend/src/utils/namespace.ts | 21 +++--- .../backend/src/utils/questionTypes.ts | 3 + .../generators/app/index.js | 14 ++++ .../package.json | 4 ++ .../packages/backend/test/utils/env.spec.ts | 48 ++++++++++++- .../packages/yeoman-env-v3/package.json | 3 +- .../packages/yeoman-env-v3/test/smoke.cjs | 26 +++++++ .../packages/yeoman-env-v3/webpack.config.cjs | 2 +- scripts/legal-copy.js | 56 ++++++--------- 12 files changed, 173 insertions(+), 96 deletions(-) create mode 100644 projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/generators/app/index.js create mode 100644 projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/package.json create mode 100644 projects/yeoman-ui/packages/yeoman-env-v3/test/smoke.cjs diff --git a/package.json b/package.json index 56fd2e30..9e7e2281 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,8 @@ "format:fix": "prettier --write \"**/*.@(js|ts|json|md)\" --ignore-path=.gitignore", "format:validate": "prettier --check \"**/*.@(js|ts|json|md)\" --ignore-path=.gitignore", "preinstall": "npx only-allow pnpm", - "legal:copy-license": "node scripts/legal-copy.js copy && pnpm -r exec -- shx cp -r ../../LICENSES/. LICENSES", - "legal:copy-reuse": "pnpm -r exec -- shx cp -r ../../.reuse/. .reuse", - "legal:delete": "node scripts/legal-copy.js delete && pnpm -r exec -- shx rm -rf .reuse LICENSES || true", + "legal:copy": "node scripts/legal-copy.js copy", + "legal:delete": "node scripts/legal-copy.js delete", "lint:fix": "eslint . --ext=js,ts,vue --fix --max-warnings=0 --ignore-path=.gitignore", "lint:validate": "eslint . --ext=js,ts,vue --max-warnings=0 --ignore-path=.gitignore", "prepare": "husky install", @@ -37,6 +36,7 @@ "@changesets/cli": "2.29.5", "@commitlint/cli": "19.5.0", "@commitlint/config-conventional": "19.5.0", + "@manypkg/get-packages": "1.1.3", "@types/chai": "4.3.20", "@types/chai-as-promised": "7.1.8", "@types/deep-equal-in-any-order": "1.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9832456..2a2febf7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: '@commitlint/config-conventional': specifier: 19.5.0 version: 19.5.0 + '@manypkg/get-packages': + specifier: 1.1.3 + version: 1.1.3 '@types/chai': specifier: 4.3.20 version: 4.3.20 @@ -6155,10 +6158,6 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} - globby@11.0.4: - resolution: {integrity: sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==} - engines: {node: '>=10'} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -13263,7 +13262,7 @@ snapshots: '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 - globby: 11.0.4 + globby: 11.1.0 read-yaml-file: 1.1.0 '@mdi/font@5.9.55': {} @@ -18086,15 +18085,6 @@ snapshots: define-properties: 1.2.1 gopd: 1.2.0 - globby@11.0.4: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.3 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - globby@11.1.0: dependencies: array-union: 2.1.0 diff --git a/projects/yeoman-ui/packages/backend/src/utils/env.ts b/projects/yeoman-ui/packages/backend/src/utils/env.ts index ef95f0a9..4ec28ed2 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/env.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/env.ts @@ -45,7 +45,6 @@ export class GeneratorNotFoundError extends Error { class EnvUtil { private logger: IChildLogger; private allInstalledGensMeta: LookupGeneratorMeta[]; - private legacyCompat: typeof YeomanEnvV3 | undefined; constructor() { try { @@ -166,63 +165,78 @@ class EnvUtil { const meta: LookupGeneratorMeta = await this.getGenMetadata(genNamespace); this.unloadGeneratorModules(genNamespace); - // Try the default (modern) yeoman-environment v6 first. Generators written - // against the v3/v4 API shape throw when v6 instantiates them; in that case - // fall back to the bundled v3 runtime. This keeps the routing fully dynamic: - // every installed generator is attempted on v6 and only drops to v3 when it - // actually fails, so no static list of "legacy" generators has to be - // maintained. The only cost is a single failed v6 create() for a legacy - // generator before the fallback runs + // v6 is the default runtime; retry with v3 for legacy generator shapes this.logger?.debug( - `routing generator ${genNamespace} to yeoman-environment v6` + `routing generator ${genNamespace} to default yeoman-environment v6` ); try { - const env: Environment = this.createEnvInstance( + const v6Env: Environment = this.createEnvInstance( { sharedOptions: { forwardErrorToEnvironment: true } as any }, adapter ); - env.register(meta.resolved!, { + v6Env.register(meta.resolved!, { namespace: genNamespace, packagePath: meta.packagePath, }); - const gen: any = await env.create(genNamespace, { options } as any); + const gen: any = await v6Env.create(genNamespace, { options } as any); - return { env, gen }; - } catch (error) { + return { env: v6Env, gen }; + } catch (v6Error) { this.logger?.info( - `yeoman-environment v6 could not create ${genNamespace}, falling back to legacy v3`, - { error: (error as Error)?.message } + `default yeoman-environment v6 could not create ${genNamespace}, falling back to yeoman-environment v3`, + { error: (v6Error as Error)?.message } ); - return this.createLegacyEnvAndGen(genNamespace, meta, options, adapter); + try { + return this.createLegacyV3EnvAndGen( + genNamespace, + meta, + options, + adapter + ); + } catch (v3Error) { + this.logger?.error( + `yeoman-environment v3 fallback also failed for ${genNamespace}; surfacing the v3 error`, + { + v6Error: (v6Error as Error)?.message, + v3Error: (v3Error as Error)?.message, + } + ); + + v3Error.v6Error = v6Error; + throw v3Error; + } } } - private createLegacyEnvAndGen( + private createLegacyV3EnvAndGen( genNamespace: string, meta: LookupGeneratorMeta, options: any, adapter: any ): EnvGen { - if (!this.legacyCompat) { - this.legacyCompat = __non_webpack_require__( - "./yeoman-env-v3.cjs" - ) as typeof YeomanEnvV3; - } + const legacyCompat = this.loadLegacyV3Compat(); - const env = this.legacyCompat.createV3Env( + const v3Env = legacyCompat.createV3Env( undefined, { sharedOptions: { forwardErrorToEnvironment: true } }, adapter ); - env.register(meta.resolved, genNamespace); - const gen = env.create(genNamespace, { + v3Env.register(meta.resolved, { + namespace: genNamespace, + packagePath: meta.packagePath, + } as any); + const gen = v3Env.create(genNamespace, { options, } as unknown as string[]); - return { env: env as unknown as Environment, gen }; + return { env: v3Env as unknown as Environment, gen }; + } + + private loadLegacyV3Compat(): typeof YeomanEnvV3 { + return __non_webpack_require__("./yeoman-env-v3.cjs") as typeof YeomanEnvV3; } public async getGeneratorsData(mainOnly = true): Promise { diff --git a/projects/yeoman-ui/packages/backend/src/utils/namespace.ts b/projects/yeoman-ui/packages/backend/src/utils/namespace.ts index d99be495..0e89ab9f 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/namespace.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/namespace.ts @@ -1,13 +1,10 @@ -/** - * Convert a generator namespace to its package short-name. - * - * Strips the sub-generator segment (everything after the first `:`), then the - * `generator-` prefix — both for bare (`generator-foo:app` → `foo`) and scoped - * (`@scope/generator-foo:app` → `@scope/foo`) namespaces - */ -export function namespaceToName(ns: string): string { - const base = ns.replace(/:.*$/, ""); - return base.startsWith("@") - ? base.replace(/\/generator-/, "/") - : base.replace(/^generator-/, ""); +// Yeoman namespaces may include a sub-generator suffix, e.g. "generator-foo:app" +export function namespaceToName(namespace: string): string { + const packageNamespace = namespace.replace(/:.*$/, ""); + + if (packageNamespace.startsWith("@")) { + return packageNamespace.replace("/generator-", "/"); + } + + return packageNamespace.replace(/^generator-/, ""); } diff --git a/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts index af1555cd..29285205 100644 --- a/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts +++ b/projects/yeoman-ui/packages/backend/src/utils/questionTypes.ts @@ -1,5 +1,8 @@ import type { Question } from "inquirer"; +// A loose shape over inquirer's base `Question` plus the wizard's own fields. +// @yeoman/adapter's strict `DistinctQuestion` union forced compile errors and +// `any` casts at every call site, since the wizard adds guiType/replay markers export type YeomanUIQuestion = Pick< Question, "type" | "name" | "message" | "default" | "when" | "validate" | "filter" diff --git a/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/generators/app/index.js b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/generators/app/index.js new file mode 100644 index 00000000..9f8bd756 --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/generators/app/index.js @@ -0,0 +1,14 @@ +"use strict"; + +const Generator = require("yeoman-generator").default; + +const V6_INIT_ERROR = "env-v6 fixture constructor failed on purpose"; + +module.exports = class EnvV6InitErrorFixtureGenerator extends Generator { + constructor(args, opts) { + super(args, opts); + throw new Error(V6_INIT_ERROR); + } +}; + +module.exports.V6_INIT_ERROR = V6_INIT_ERROR; diff --git a/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/package.json b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/package.json new file mode 100644 index 00000000..0bbe860a --- /dev/null +++ b/projects/yeoman-ui/packages/backend/test/fixtures/generator-env-v6-init-error-fixture/package.json @@ -0,0 +1,4 @@ +{ + "name": "generator-env-v6-init-error-fixture", + "type": "commonjs" +} diff --git a/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts b/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts index a6bf01c2..afec223f 100644 --- a/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts +++ b/projects/yeoman-ui/packages/backend/test/utils/env.spec.ts @@ -30,6 +30,15 @@ const envV3Fixture = { ), }; +const envV6InitErrorFixture = { + namespace: "env-v6-init-error-fixture:app", + packagePath: resolve(FIXTURES, "generator-env-v6-init-error-fixture"), + resolved: resolve( + FIXTURES, + "generator-env-v6-init-error-fixture/generators/app/index.js" + ), +}; + /** Build a LookupGeneratorMeta the way env.ts consumes it. */ function metaFor(fixture: { namespace: string; @@ -53,8 +62,6 @@ describe("Env.createEnvAndGen()", () => { afterEach(() => { sandbox.restore(); - // Clear the cached compat handle so each test controls it explicitly. - (Env as any)["legacyCompat"] = undefined; }); it("loads a generator through yeoman-environment v6", async () => { @@ -91,7 +98,9 @@ describe("Env.createEnvAndGen()", () => { }; sandbox.stub(Env as any, "createEnvInstance").returns(failingV6Env); - (Env as any)["legacyCompat"] = require("yeoman-env-v3"); + sandbox + .stub(Env as any, "loadLegacyV3Compat") + .returns(require("yeoman-env-v3")); const { env, gen } = await Env.createEnvAndGen( envV3Fixture.namespace, @@ -110,4 +119,37 @@ describe("Env.createEnvAndGen()", () => { "the v3 fixture's constructor actually ran" ).to.equal(true); }); + + it("surfaces the v3 fallback error (with the v6 error attached) when both runtimes fail", async () => { + sandbox + .stub(Env as any, "getGenMetadata") + .resolves(metaFor(envV6InitErrorFixture)); + sandbox + .stub(Env as any, "loadLegacyV3Compat") + .returns(require("yeoman-env-v3")); + + const { V6_INIT_ERROR } = require(envV6InitErrorFixture.resolved); + + let thrown: any; + try { + await Env.createEnvAndGen( + envV6InitErrorFixture.namespace, + { silent: true }, + undefined + ); + } catch (error) { + thrown = error; + } + + expect(thrown, "createEnvAndGen should reject").to.be.instanceOf(Error); + expect( + thrown?.message, + "the v3 fallback error is surfaced to the user, not the v6 error" + ).to.contain("requires yeoman-environment"); + // The v6 error is preserved as context for diagnostics. + expect( + thrown?.v6Error?.message, + "the original v6 error is attached for diagnostics" + ).to.contain(V6_INIT_ERROR); + }); }); diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/package.json b/projects/yeoman-ui/packages/yeoman-env-v3/package.json index 4ee0f565..e87392ba 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/package.json +++ b/projects/yeoman-ui/packages/yeoman-env-v3/package.json @@ -16,7 +16,8 @@ "clean": "shx rm -rf ./dist", "compile": "pnpm run bundle", "bundle": "webpack --config webpack.config.cjs --mode production", - "ci": "pnpm run clean && pnpm run bundle" + "test": "node ./test/smoke.cjs", + "ci": "pnpm run clean && pnpm run bundle && pnpm run test" }, "dependencies": { "yeoman-environment": "3.19.3" diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/test/smoke.cjs b/projects/yeoman-ui/packages/yeoman-env-v3/test/smoke.cjs new file mode 100644 index 00000000..45aa2b68 --- /dev/null +++ b/projects/yeoman-ui/packages/yeoman-env-v3/test/smoke.cjs @@ -0,0 +1,26 @@ +"use strict"; + +const assert = require("node:assert"); +const { createV3Env } = require("../dist/index.js"); + +assert.strictEqual( + typeof createV3Env, + "function", + "dist/index.js must export a createV3Env function" +); + +const env = createV3Env(undefined, { sharedOptions: {} }, undefined); + +for (const method of ["register", "create", "lookup", "runGenerator"]) { + assert.strictEqual( + typeof env[method], + "function", + `the bundled v3 environment must expose ${method}()` + ); +} + +// runLoop is the structural property yeoman-generator v4 checks for; its +// presence confirms the v3 environment bundled with its internals intact +assert.ok(env.runLoop, "the bundled v3 environment must have a runLoop"); + +console.log("yeoman-env-v3 bundle smoke test passed"); diff --git a/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs b/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs index 730c2138..f83ecb9f 100644 --- a/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs +++ b/projects/yeoman-ui/packages/yeoman-env-v3/webpack.config.cjs @@ -35,7 +35,7 @@ module.exports = { ], }, resolve: { - extensions: [".ts", ".js", ".json"], + extensions: [".ts", "..."], }, module: { rules: [ diff --git a/scripts/legal-copy.js b/scripts/legal-copy.js index 7283d03d..5721106f 100644 --- a/scripts/legal-copy.js +++ b/scripts/legal-copy.js @@ -1,61 +1,47 @@ /** - * Copies LICENSES/ and .reuse/ from the repo root into every intermediate - * "project" directory that sits between the root and its pnpm workspace - * packages (e.g. projects/yeoman-ui/). + * Distributes the repo-root LICENSES/ and .reuse/ directories into every + * workspace package so REUSE/legal metadata travels with each packaged + * artifact. These copies are git-ignored everywhere except the repo root, so + * they are build-time only and safe to (re)create or remove idempotently. * - * A directory qualifies as an intermediate project dir when it is an ancestor - * of one or more workspace packages but is not itself the repo root. + * Package discovery uses @manypkg/get-packages, which understands the pnpm + * workspace layout directly — no assumptions about how deeply packages are + * nested. * * Usage (called from root package.json scripts): * node scripts/legal-copy.js copy -- copy LICENSES and .reuse * node scripts/legal-copy.js delete -- remove LICENSES and .reuse */ -const { execSync } = require("child_process"); const fs = require("fs"); const path = require("path"); +const { getPackagesSync } = require("@manypkg/get-packages"); const ROOT = path.resolve(__dirname, ".."); +const LEGAL_DIRS = ["LICENSES", ".reuse"]; const [, , command] = process.argv; -function projectDirs() { - const raw = execSync("pnpm ls -r --depth -1 --json", { - cwd: ROOT, - encoding: "utf8", - }); - const packages = JSON.parse(raw); - const dirs = new Set(); - - for (const { path: pkgPath } of packages) { - if (!pkgPath || pkgPath === ROOT) continue; - // `pnpm -r exec -- shx cp -r ../../X/. X` copies from two levels up. - // For packages nested more than 2 levels below root the "two levels up" - // target is an intermediate project dir, not the root itself. - // We need to pre-populate those intermediate dirs with the legal files. - const twoUp = path.resolve(pkgPath, "../.."); - if (twoUp !== ROOT) { - dirs.add(twoUp); - } - } - return [...dirs]; +function packageDirs() { + const { packages } = getPackagesSync(ROOT); + return packages.map((pkg) => pkg.dir).filter((dir) => dir !== ROOT); } -const dirs = projectDirs(); +const dirs = packageDirs(); if (command === "copy") { for (const dir of dirs) { - fs.cpSync(path.join(ROOT, "LICENSES"), path.join(dir, "LICENSES"), { - recursive: true, - }); - fs.cpSync(path.join(ROOT, ".reuse"), path.join(dir, ".reuse"), { - recursive: true, - }); + for (const legalDir of LEGAL_DIRS) { + fs.cpSync(path.join(ROOT, legalDir), path.join(dir, legalDir), { + recursive: true, + }); + } console.log(`Copied legal files → ${path.relative(ROOT, dir)}/`); } } else if (command === "delete") { for (const dir of dirs) { - fs.rmSync(path.join(dir, "LICENSES"), { recursive: true, force: true }); - fs.rmSync(path.join(dir, ".reuse"), { recursive: true, force: true }); + for (const legalDir of LEGAL_DIRS) { + fs.rmSync(path.join(dir, legalDir), { recursive: true, force: true }); + } console.log(`Removed legal files from ${path.relative(ROOT, dir)}/`); } } else { From 52be1c16c48a0d7461d6ccf59e4b0a5d7af93f59 Mon Sep 17 00:00:00 2001 From: Ilya Taupeka Date: Tue, 21 Jul 2026 17:58:02 +0500 Subject: [PATCH 8/8] fix: ci broken lockfile error --- pnpm-lock.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 07a5506f..93e2db8c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -722,7 +722,7 @@ importers: version: 11.0.0 copy-webpack-plugin: specifier: ^12.0.2 - version: 12.0.2(webpack@5.106.2) + version: 12.0.2(webpack@5.106.2(webpack-cli@6.0.1(webpack@5.104.1))) cross-env: specifier: ^10.1.0 version: 10.1.0