diff --git a/.vscode/settings.json b/.vscode/settings.json index bf89b30..1c9b59b 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,10 +8,13 @@ "Containerable", "datasource", "Fastly", + "gitee", + "gitly", "inversify", "jexl", "Naily", "nailyjs", + "nodegit", "nuxt", "paramtypes", "pluginutils", diff --git a/naily.config.ts b/naily.config.ts index 6517db4..93f39df 100644 --- a/naily.config.ts +++ b/naily.config.ts @@ -4,6 +4,8 @@ import { defineConfig } from './packages/config/src/helper' export default defineConfig({ naily: { + cli: {}, + typeorm: { type: 'sqlite', database: path.join(cwd(), './node_modules/.cache/naily/typeorm.db'), diff --git a/package.json b/package.json index d695d6d..5b1ced1 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "scripts": { "new": "pnpm create es-project@latest", "build": "pnpm -r build", + "build:cli": "pnpm -F @nailyjs/cli build", "build:ioc": "pnpm -F @nailyjs/ioc build", "build:backend": "pnpm -F @nailyjs/backend build", "build:config": "pnpm -F @nailyjs/config build", @@ -24,6 +25,8 @@ "test": "vitest", "test:ui": "vitest --ui --coverage", "swx": "pnpm tsx scripts/swc.ts", + "tsx": "tsx", + "naily": "naily", "changeset": "changeset", "version-packages": "changeset version", @@ -33,6 +36,7 @@ "devDependencies": { "@antfu/eslint-config": "^3.7.3", "@changesets/cli": "^2.27.9", + "@nailyjs/cli": "workspace:*", "@swc/core": "^1.7.42", "@types/js-yaml": "^4.0.9", "@types/node": "^22.7.5", diff --git a/packages/cli/logo.txt b/packages/cli/logo.txt new file mode 100644 index 0000000..a1db876 --- /dev/null +++ b/packages/cli/logo.txt @@ -0,0 +1,5 @@ + _ __ _ __ + / |/ /___ _ (_)/ /__ __ + / // _ `// // // // / + /_/|_/ \_,_//_//_/ \_, / + IOC Framework /___/ diff --git a/packages/cli/package.json b/packages/cli/package.json new file mode 100644 index 0000000..f43b02a --- /dev/null +++ b/packages/cli/package.json @@ -0,0 +1,43 @@ +{ + "name": "@nailyjs/cli", + "type": "module", + "version": "2.0.0", + "description": "The CLI for Naily.js", + "author": "Naily Zero (https://naily.cc)", + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.js", + "require": "./dist/index.cjs" + } + }, + "main": "./dist/index.cjs", + "module": "./dist/index.js", + "types": "./dist/index.d.ts", + "publishConfig": { + "access": "public" + }, + "bin": { + "naily": "./dist/cli.js" + }, + "files": [ + "dist", + "logo.txt" + ], + "scripts": { + "build": "tsup", + "watch": "tsup -w" + }, + "dependencies": { + "@nailyjs/config": "workspace:*", + "@nailyjs/ioc": "workspace:*", + "commander": "^12.1.0", + "gitly": "^3.0.2", + "ora": "^8.1.1", + "prompts": "^2.4.2" + }, + "devDependencies": { + "@types/prompts": "^2.4.9", + "tsup": "^8.3.0" + } +} diff --git a/packages/cli/src/cli.ts b/packages/cli/src/cli.ts new file mode 100644 index 0000000..680631d --- /dev/null +++ b/packages/cli/src/cli.ts @@ -0,0 +1,6 @@ +import { ConfigPlugin } from '@nailyjs/config' +import { CliBootstrap } from './index' + +new CliBootstrap() + .use(ConfigPlugin()) + .run() diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts new file mode 100644 index 0000000..65d5172 --- /dev/null +++ b/packages/cli/src/index.ts @@ -0,0 +1,101 @@ +import child_process from 'node:child_process' +import fs from 'node:fs' +import path from 'node:path' +import { argv, exit, stderr, stdout } from 'node:process' +import { AbstractBootstrap } from '@nailyjs/ioc' +import { Command, program } from 'commander' +import git from 'gitly' +import ora from 'ora' +import prompts from 'prompts' +import { LogoWriter } from './write-logo' + +export class CliBootstrap extends AbstractBootstrap { + async runNewProject(): Promise { + const projectPath = await prompts({ + type: 'text', + name: 'path', + message: 'Where do you want to create the project?', + initial: '.', + validate: (value: string) => { + if (value.length <= 0) return 'Path cannot be empty' + if (!fs.existsSync(path.resolve(value))) return true + if (fs.readdirSync(path.resolve(value)).length > 0) + return 'Path already exists and is not empty. Please choose another path or remove it first.' + return true + }, + format: (value: string) => path.resolve(value), + }).catch(() => exit(0)) + if (!projectPath.path) return exit(0) + console.log('✔ Will creating project at:', projectPath.path) + const template = await prompts({ + type: 'autocomplete', + name: 'template', + message: 'Select a template:', + choices: [ + { title: 'backend-app', value: 'template-backend-app', description: 'Basic naily backend application' }, + { title: 'vitesse-naily', value: 'vitesse-naily', description: 'Antfu\'s Vitesse with Naily' }, + ], + }).catch(() => exit(0)) + if (!template.template) return exit(0) + console.log('✔ Selected template:', template.template) + const packageManager = await prompts({ + type: 'select', + name: 'packageManager', + message: 'Select a package manager:', + choices: [ + { title: 'npm', value: 'npm', description: 'Default package manager' }, + { title: 'yarn', value: 'yarn', description: 'Fast, reliable, and secure dependency management' }, + { title: 'pnpm', value: 'pnpm', description: 'Fast, disk space efficient package manager' }, + { title: 'bun', value: 'bun', description: 'Bun have a Node.js-compatible package manager.' }, + { title: 'Install at later', value: 'none', description: 'Install deps at later' }, + ], + }).catch(() => exit(0)) + if (!packageManager.packageManager) return exit(0) + console.log('✔ Selected package manager:', packageManager.packageManager) + const spinner = ora('Creating project...').start() + + // eslint-disable-next-line ts/ban-ts-comment + // @ts-expect-error + const [tarPath, realPath] = await ((typeof git === 'function' ? git : git.default) as typeof import('gitly').default)(`github:nailyjs/${template.template}.git`, projectPath.path, { + backend: 'axios', + }) + if (!tarPath || !realPath) + return spinner.fail('Failed to create project, please try again.') as any + spinner.succeed('Project created successfully.') + + if (packageManager.packageManager !== 'none') { + spinner.text = `Installing dependencies using ${packageManager.packageManager}` + console.log('\n') + const child_process_exec = child_process.exec(packageManager.packageManager === 'yarn' ? 'FORCE_COLOR=1 yarn' : `FORCE_COLOR=1 ${packageManager.packageManager} install`, { + cwd: projectPath.path, + }) + child_process_exec.stdout?.pipe(stdout) + child_process_exec.stderr?.pipe(stderr) + child_process_exec.on('exit', () => { + console.log('\n') + spinner.succeed('Dependencies installed successfully.') + exit(0) + }) + } + } + + setupCommander(): Command { + program + .name('naily') + .version('0.0.1', '-v, --version', 'Output the current version') + .description('Naily CLI') + + program.command('new') + .alias('n') + .description('Create a new naily project') + .action(this.runNewProject.bind(this)) + + return program + } + + async run(): Promise { + await this.getPluginRunner().runBeforeRun() + LogoWriter.getInstance(this).write(true) + this.setupCommander().parse(argv) + } +} diff --git a/packages/cli/src/types.ts b/packages/cli/src/types.ts new file mode 100644 index 0000000..154e89c --- /dev/null +++ b/packages/cli/src/types.ts @@ -0,0 +1,15 @@ +export interface CliConfiguration { + /** Path to the logo file. the file must a txt file. */ + banner?: `${string}.txt` | false +} + +declare global { + namespace Naily { + namespace Configuration { + interface NailyUserConfig { + /** Configuration for the naily cli. */ + cli?: CliConfiguration + } + } + } +} diff --git a/packages/cli/src/write-logo.ts b/packages/cli/src/write-logo.ts new file mode 100644 index 0000000..e3b85de --- /dev/null +++ b/packages/cli/src/write-logo.ts @@ -0,0 +1,36 @@ +import fs from 'node:fs' +import path from 'node:path' +import { Value } from '@nailyjs/config' +import { ClassWrapper, Container, Injectable } from '@nailyjs/ioc' + +let __dirname = globalThis.__dirname +if (!globalThis.__dirname) + __dirname = import.meta.dirname + +@Injectable() +export class LogoWriter { + constructor( + @Value('naily.cli.banner') + private readonly logoPath: `${string}.txt` | false, + ) {} + + write(clear: boolean = true): void { + if (clear === true) console.clear() + if (this.logoPath === false) return + + if (typeof this.logoPath === 'string') { + const logoPath = path.resolve(this.logoPath) + if (fs.existsSync(logoPath)) return console.log(fs.readFileSync(logoPath, 'utf-8')) + } + + const defaultLogoPath = path.join(__dirname, '../logo.txt') + if (fs.existsSync(defaultLogoPath)) console.log(fs.readFileSync(defaultLogoPath, 'utf-8')) + else console.log('Naily CLI') + } + + static getInstance(container: Container): LogoWriter { + const writerWrapper = container.getContainer().get(LogoWriter) as ClassWrapper + if (writerWrapper) return writerWrapper.getClassFactory().getOrCreateInstance() + return container.createClassWrapper(LogoWriter).getClassFactory().getOrCreateInstance() + } +} diff --git a/packages/cli/tsconfig.json b/packages/cli/tsconfig.json new file mode 100644 index 0000000..ddc0a63 --- /dev/null +++ b/packages/cli/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "target": "ES2022", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "module": "ES2022", + "moduleResolution": "Bundler" + }, + "include": ["src"] +} diff --git a/packages/cli/tsup.config.ts b/packages/cli/tsup.config.ts new file mode 100644 index 0000000..2680c72 --- /dev/null +++ b/packages/cli/tsup.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'tsup' + +export default defineConfig({ + entry: { + index: './src/index.ts', + cli: './src/cli.ts', + }, + dts: true, + sourcemap: true, + clean: true, + format: ['cjs', 'esm'], +}) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 37ec23d..a541c2d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@changesets/cli': specifier: ^2.27.9 version: 2.27.9 + '@nailyjs/cli': + specifier: workspace:* + version: link:packages/cli '@swc/core': specifier: ^1.7.42 version: 1.7.42 @@ -143,6 +146,34 @@ importers: specifier: ^8.3.0 version: 8.3.5(@swc/core@1.7.42)(jiti@2.4.0)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + packages/cli: + dependencies: + '@nailyjs/config': + specifier: workspace:* + version: link:../config + '@nailyjs/ioc': + specifier: workspace:* + version: link:../ioc + commander: + specifier: ^12.1.0 + version: 12.1.0 + gitly: + specifier: ^3.0.2 + version: 3.0.2 + ora: + specifier: ^8.1.1 + version: 8.1.1 + prompts: + specifier: ^2.4.2 + version: 2.4.2 + devDependencies: + '@types/prompts': + specifier: ^2.4.9 + version: 2.4.9 + tsup: + specifier: ^8.3.0 + version: 8.3.5(@swc/core@1.7.42)(jiti@2.4.0)(postcss@8.4.47)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.0) + packages/config: dependencies: '@nailyjs/ioc': @@ -960,6 +991,10 @@ packages: 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'} + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -1258,6 +1293,9 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/prompts@2.4.9': + resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} + '@types/source-map-support@0.5.10': resolution: {integrity: sha512-tgVP2H469x9zq34Z0m/fgPewGhg/MLClalNOiPIzQlXrSS2YrKu/xCdSCKnEDwkFha51VKEKB6A9wW26/ZNwzA==} @@ -1648,6 +1686,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'} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -1676,6 +1718,10 @@ packages: engines: {node: '>=8.0.0', npm: '>=5.0.0'} hasBin: true + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -2285,6 +2331,10 @@ packages: github-from-package@0.0.0: resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + gitly@3.0.2: + resolution: {integrity: sha512-sIqqL4ADxjpK6C53NWXB4CrNlTUlNm2xAwLLzBKgY05l3mcq/Hq6fKESz68VP+R9Wgwqc9FVaTVZz08Ypet/ow==} + engines: {node: '>=20.x'} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2429,6 +2479,10 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} @@ -2478,6 +2532,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + 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==} @@ -2493,6 +2551,14 @@ packages: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} engines: {node: '>=4'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -2663,6 +2729,10 @@ packages: lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -2901,6 +2971,10 @@ packages: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} + mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -2914,6 +2988,11 @@ packages: engines: {node: '>=10'} hasBin: true + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + mlly@1.7.2: resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} @@ -3027,6 +3106,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@8.1.1: + resolution: {integrity: sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==} + engines: {node: '>=18'} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -3284,6 +3367,10 @@ packages: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} + rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + refa@0.12.1: resolution: {integrity: sha512-J8rn6v4DBb2nnFqkqwy6/NnTYMcgLA+sLr0iIO41qpv0n+ngb7ksag2tMRl0inb1bbO/esUwzW1vbJi7K0sI0g==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -3345,6 +3432,10 @@ packages: deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} + hasBin: true + rollup@4.24.3: resolution: {integrity: sha512-HBW896xR5HGmoksbi3JBDtmVzWiPAYqp7wip50hjQ67JbDz61nyoMPdqu1DvVW9asYb2M65Z20ZHsyJCMqMyDg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3406,6 +3497,11 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3527,6 +3623,10 @@ packages: std-env@3.7.0: resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -3617,6 +3717,10 @@ packages: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} + term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} @@ -4038,6 +4142,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-eslint-parser@1.2.3: resolution: {integrity: sha512-4wZWvE398hCP7O8n3nXKu/vdq1HcH01ixYlCREaJL5NUMwQ0g3MaGFUBNSlmBtKmhbtVG/Cm6lyYmSVTEVil8A==} engines: {node: ^14.17.0 || >=16.0.0} @@ -4704,6 +4812,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@istanbuljs/schema@0.1.3': {} '@jridgewell/gen-mapping@0.3.5': @@ -4991,6 +5103,11 @@ snapshots: '@types/normalize-package-data@2.4.4': {} + '@types/prompts@2.4.9': + dependencies: + '@types/node': 22.8.4 + kleur: 3.0.3 + '@types/source-map-support@0.5.10': dependencies: source-map: 0.6.1 @@ -5492,6 +5609,8 @@ snapshots: chownr@2.0.0: {} + chownr@3.0.0: {} + ci-info@3.9.0: {} ci-info@4.0.0: {} @@ -5520,6 +5639,8 @@ snapshots: parse5-htmlparser2-tree-adapter: 6.0.1 yargs: 16.2.0 + cli-spinners@2.9.2: {} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -6193,8 +6314,7 @@ snapshots: dependencies: minipass: 3.3.6 - fs.realpath@1.0.0: - optional: true + fs.realpath@1.0.0: {} fsevents@2.3.3: optional: true @@ -6238,6 +6358,15 @@ snapshots: github-from-package@0.0.0: {} + gitly@3.0.2: + dependencies: + axios: 1.7.7 + cross-spawn: 7.0.3 + shelljs: 0.8.5 + tar: 7.4.3 + transitivePeerDependencies: + - debug + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -6263,7 +6392,6 @@ snapshots: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 - optional: true globals@11.12.0: {} @@ -6380,12 +6508,13 @@ snapshots: dependencies: once: 1.4.0 wrappy: 1.0.2 - optional: true inherits@2.0.4: {} ini@1.3.8: {} + interpret@1.4.0: {} + ip-address@9.0.5: dependencies: jsbn: 1.1.0 @@ -6426,6 +6555,8 @@ snapshots: dependencies: is-docker: 3.0.0 + is-interactive@2.0.0: {} + is-lambda@1.0.1: optional: true @@ -6437,6 +6568,10 @@ snapshots: dependencies: better-path-resolve: 1.0.0 + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-windows@1.0.2: {} is-wsl@3.1.0: @@ -6601,6 +6736,11 @@ snapshots: lodash@4.17.21: {} + log-symbols@6.0.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + log-update@6.1.0: dependencies: ansi-escapes: 7.0.0 @@ -7036,12 +7176,19 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.0.1: + dependencies: + minipass: 7.1.2 + rimraf: 5.0.10 + mkdirp-classic@0.5.3: {} mkdirp@1.0.4: {} mkdirp@2.1.6: {} + mkdirp@3.0.1: {} + mlly@1.7.2: dependencies: acorn: 8.14.0 @@ -7183,6 +7330,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@8.1.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.0 + os-tmpdir@1.0.2: {} outdent@0.5.0: {} @@ -7248,8 +7407,7 @@ snapshots: path-exists@4.0.0: {} - path-is-absolute@1.0.1: - optional: true + path-is-absolute@1.0.1: {} path-key@3.1.1: {} @@ -7408,6 +7566,10 @@ snapshots: readdirp@4.0.2: {} + rechoir@0.6.2: + dependencies: + resolve: 1.22.8 + refa@0.12.1: dependencies: '@eslint-community/regexpp': 4.12.1 @@ -7458,6 +7620,10 @@ snapshots: glob: 7.2.3 optional: true + rimraf@5.0.10: + dependencies: + glob: 10.4.5 + rollup@4.24.3: dependencies: '@types/estree': 1.0.6 @@ -7526,6 +7692,12 @@ snapshots: shebang-regex@3.0.0: {} + shelljs@0.8.5: + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -7659,6 +7831,8 @@ snapshots: std-env@3.7.0: {} + stdin-discarder@0.2.2: {} + string-argv@0.3.2: {} string-width@4.2.3: @@ -7762,6 +7936,15 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.4.3: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 + term-size@2.2.1: {} test-exclude@7.0.1: @@ -8178,6 +8361,8 @@ snapshots: yallist@4.0.0: {} + yallist@5.0.0: {} + yaml-eslint-parser@1.2.3: dependencies: eslint-visitor-keys: 3.4.3