diff --git a/.gitignore b/.gitignore index ff13c06c..c85d94a0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,4 @@ node_modules dist .DS_Store -.vscode .turbo \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..bb215b2f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "files.readonlyInclude": { + "**/routeTree.gen.ts": true + }, + "files.watcherExclude": { + "**/routeTree.gen.ts": true + }, + "search.exclude": { + "**/routeTree.gen.ts": true + } +} \ No newline at end of file diff --git a/apps/website/docs/guide/01-getting-started/02-setup-commandkit.mdx b/apps/website/docs/guide/01-getting-started/02-setup-commandkit.mdx index c55bd35a..9ff49eba 100644 --- a/apps/website/docs/guide/01-getting-started/02-setup-commandkit.mdx +++ b/apps/website/docs/guide/01-getting-started/02-setup-commandkit.mdx @@ -21,12 +21,65 @@ The quickest way to setup a new CommandKit project is to use the your terminal: ```sh npm2yarn -npm create commandkit@next +npm create commandkit@latest ``` This will start the CLI in an interactive mode. You can follow the prompts to setup your project. +## Available Examples + +CommandKit comes with several pre-built examples to help you get started quickly. You can list all available examples using: + +```sh npm2yarn +npm create commandkit@latest --list-examples +``` + +### Using Examples + +You can create a project from any example using the `--example` flag: + +```sh npm2yarn +# Create a basic TypeScript bot +npm create commandkit@latest --example basic-ts + +# Create a basic JavaScript bot +npm create commandkit@latest --example basic-js + +# Create a Deno TypeScript bot +npm create commandkit@latest --example deno-ts + +# Create a bot without CLI integration +npm create commandkit@latest --example without-cli +``` + +### CLI Options + +The CLI supports various options for customization: + +```sh npm2yarn +# Skip prompts and use defaults +npm create commandkit@latest --yes + +# Use a specific package manager +npm create commandkit@latest --use-pnpm +npm create commandkit@latest --use-yarn +npm create commandkit@latest --use-bun +npm create commandkit@latest --use-deno + +# Skip dependency installation +npm create commandkit@latest --skip-install + +# Skip git initialization +npm create commandkit@latest --no-git + +# Create in a specific directory +npm create commandkit@latest my-bot + +# Use a custom GitHub repository +npm create commandkit@latest --example "https://github.com/user/repo" +``` + ## Project structure By using the CLI to create a base project, you should get a file tree @@ -49,6 +102,12 @@ that looks something like this: └── tsconfig.json ``` +:::note + +The exact project structure may vary depending on the example you choose. Each example comes with its own configuration and dependencies tailored to its specific use case. + +::: + ## Entry point The `src/app.ts` file is the main entry point for your application. @@ -107,6 +166,16 @@ The development version is likely to have bugs. ::: +## Getting Help + +For more information about the CLI options, you can use the help flag: + +```sh npm2yarn +npm create commandkit@latest --help +``` + +This will display all available options and usage examples. + ## Manual setup Alternatively, if you would like to setup a new CommandKit project diff --git a/examples/basic-js/.gitignore b/examples/basic-js/.gitignore new file mode 100644 index 00000000..d2a82db7 --- /dev/null +++ b/examples/basic-js/.gitignore @@ -0,0 +1,36 @@ +# dependencies +node_modules + +# build output +build +out +dist + +# commandkit +.commandkit +dist +compiled-commandkit.config.mjs + +# env +**/*.env* +!**/*.env.example* + +# logging +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# yarn v2+ +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# other +**/*.DS_Store +.temp-example \ No newline at end of file diff --git a/packages/create-commandkit/templates/TypeScript/README.md b/examples/basic-js/README.md similarity index 89% rename from packages/create-commandkit/templates/TypeScript/README.md rename to examples/basic-js/README.md index 0d64a8a7..fcff3790 100644 --- a/packages/create-commandkit/templates/TypeScript/README.md +++ b/examples/basic-js/README.md @@ -1,4 +1,4 @@ -# Welcome to CommandKit +# Welcome to CommandKit + JavaScript > This project was generated by [create-commandkit](https://npmjs.com/package/create-commandkit). diff --git a/packages/create-commandkit/templates/JavaScript/commandkit-env.d.ts b/examples/basic-js/commandkit-env.d.ts similarity index 100% rename from packages/create-commandkit/templates/JavaScript/commandkit-env.d.ts rename to examples/basic-js/commandkit-env.d.ts diff --git a/packages/create-commandkit/templates/JavaScript/commandkit.config.mjs b/examples/basic-js/commandkit.config.mjs similarity index 100% rename from packages/create-commandkit/templates/JavaScript/commandkit.config.mjs rename to examples/basic-js/commandkit.config.mjs diff --git a/packages/create-commandkit/templates/JavaScript/jsconfig.json b/examples/basic-js/jsconfig.json similarity index 100% rename from packages/create-commandkit/templates/JavaScript/jsconfig.json rename to examples/basic-js/jsconfig.json diff --git a/examples/basic-js/package.json b/examples/basic-js/package.json new file mode 100644 index 00000000..3595bf4f --- /dev/null +++ b/examples/basic-js/package.json @@ -0,0 +1,21 @@ +{ + "name": "commandkit-basic-js", + "description": "A CommandKit project using JavaScript", + "version": "0.1.0", + "type": "module", + "private": true, + "main": "dist/index.js", + "scripts": { + "dev": "commandkit dev", + "build": "commandkit build", + "start": "commandkit start" + }, + "devDependencies": { + "@types/node": "^24.0.10", + "typescript": "^5.8.3" + }, + "dependencies": { + "commandkit": "^1.2.0-rc.12", + "discord.js": "^14.23.2" + } +} diff --git a/packages/create-commandkit/templates/JavaScript/src/app.js b/examples/basic-js/src/app.js similarity index 100% rename from packages/create-commandkit/templates/JavaScript/src/app.js rename to examples/basic-js/src/app.js diff --git a/packages/create-commandkit/templates/JavaScript/src/app/commands/ping.js b/examples/basic-js/src/app/commands/ping.js similarity index 100% rename from packages/create-commandkit/templates/JavaScript/src/app/commands/ping.js rename to examples/basic-js/src/app/commands/ping.js diff --git a/packages/create-commandkit/templates/JavaScript/src/app/events/clientReady/log.js b/examples/basic-js/src/app/events/clientReady/log.js similarity index 100% rename from packages/create-commandkit/templates/JavaScript/src/app/events/clientReady/log.js rename to examples/basic-js/src/app/events/clientReady/log.js diff --git a/examples/basic-ts/.gitignore b/examples/basic-ts/.gitignore new file mode 100644 index 00000000..d2a82db7 --- /dev/null +++ b/examples/basic-ts/.gitignore @@ -0,0 +1,36 @@ +# dependencies +node_modules + +# build output +build +out +dist + +# commandkit +.commandkit +dist +compiled-commandkit.config.mjs + +# env +**/*.env* +!**/*.env.example* + +# logging +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# yarn v2+ +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# other +**/*.DS_Store +.temp-example \ No newline at end of file diff --git a/packages/create-commandkit/templates/JavaScript/README.md b/examples/basic-ts/README.md similarity index 89% rename from packages/create-commandkit/templates/JavaScript/README.md rename to examples/basic-ts/README.md index 0d64a8a7..e9f8b4f8 100644 --- a/packages/create-commandkit/templates/JavaScript/README.md +++ b/examples/basic-ts/README.md @@ -1,4 +1,4 @@ -# Welcome to CommandKit +# Welcome to CommandKit + TypeScript > This project was generated by [create-commandkit](https://npmjs.com/package/create-commandkit). diff --git a/packages/create-commandkit/templates/TypeScript/commandkit-env.d.ts b/examples/basic-ts/commandkit-env.d.ts similarity index 100% rename from packages/create-commandkit/templates/TypeScript/commandkit-env.d.ts rename to examples/basic-ts/commandkit-env.d.ts diff --git a/packages/create-commandkit/templates/TypeScript/commandkit.config.ts b/examples/basic-ts/commandkit.config.ts similarity index 100% rename from packages/create-commandkit/templates/TypeScript/commandkit.config.ts rename to examples/basic-ts/commandkit.config.ts diff --git a/examples/basic-ts/package.json b/examples/basic-ts/package.json new file mode 100644 index 00000000..b2d34003 --- /dev/null +++ b/examples/basic-ts/package.json @@ -0,0 +1,21 @@ +{ + "name": "commandkit-basic-ts", + "description": "A CommandKit project using TypeScript", + "version": "0.1.0", + "type": "module", + "private": true, + "main": "dist/index.js", + "scripts": { + "dev": "commandkit dev", + "build": "commandkit build", + "start": "commandkit start" + }, + "devDependencies": { + "@types/node": "^24.0.10", + "typescript": "^5.8.3" + }, + "dependencies": { + "commandkit": "^1.2.0-rc.12", + "discord.js": "^14.23.2" + } +} diff --git a/packages/create-commandkit/templates/TypeScript/src/app.ts b/examples/basic-ts/src/app.ts similarity index 100% rename from packages/create-commandkit/templates/TypeScript/src/app.ts rename to examples/basic-ts/src/app.ts diff --git a/packages/create-commandkit/templates/TypeScript/src/app/commands/ping.ts b/examples/basic-ts/src/app/commands/ping.ts similarity index 100% rename from packages/create-commandkit/templates/TypeScript/src/app/commands/ping.ts rename to examples/basic-ts/src/app/commands/ping.ts diff --git a/packages/create-commandkit/templates/TypeScript/src/app/events/clientReady/log.ts b/examples/basic-ts/src/app/events/clientReady/log.ts similarity index 100% rename from packages/create-commandkit/templates/TypeScript/src/app/events/clientReady/log.ts rename to examples/basic-ts/src/app/events/clientReady/log.ts diff --git a/packages/create-commandkit/templates/TypeScript/tsconfig.json b/examples/basic-ts/tsconfig.json similarity index 100% rename from packages/create-commandkit/templates/TypeScript/tsconfig.json rename to examples/basic-ts/tsconfig.json diff --git a/examples/deno-ts/.gitignore b/examples/deno-ts/.gitignore new file mode 100644 index 00000000..dad27ae6 --- /dev/null +++ b/examples/deno-ts/.gitignore @@ -0,0 +1,36 @@ + +# dependencies +node_modules + +# build output +build +out +dist + +# commandkit +.commandkit +dist +compiled-commandkit.config.mjs + +# env +**/*.env* +!**/*.env.example* + +# logging +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# yarn v2+ +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# other +**/*.DS_Store diff --git a/examples/deno-ts/.vscode/settings.json b/examples/deno-ts/.vscode/settings.json new file mode 100644 index 00000000..cbac5697 --- /dev/null +++ b/examples/deno-ts/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "deno.enable": true +} diff --git a/examples/deno-ts/README.md b/examples/deno-ts/README.md new file mode 100644 index 00000000..553339e3 --- /dev/null +++ b/examples/deno-ts/README.md @@ -0,0 +1,36 @@ +# Welcome to CommandKit + Deno + +> This project was generated by [create-commandkit](https://npmjs.com/package/create-commandkit). + +This project is a template for a CommandKit project using Deno. + +## To run this project + +### dependencies + +```sh +deno install +``` + +### run the dev server + +```sh +deno task dev +``` + +### build the project + +```sh +deno task build +``` + +### run the project (production) + +```sh +deno task start +``` + +## Useful links + +- [Documentation](https://commandkit.dev) +- [Discord](https://ctrl.lol/discord) diff --git a/examples/deno-ts/commandkit-env.d.ts b/examples/deno-ts/commandkit-env.d.ts new file mode 100644 index 00000000..cc2ba6df --- /dev/null +++ b/examples/deno-ts/commandkit-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/deno-ts/commandkit.config.ts b/examples/deno-ts/commandkit.config.ts new file mode 100644 index 00000000..57ae7a44 --- /dev/null +++ b/examples/deno-ts/commandkit.config.ts @@ -0,0 +1,3 @@ +import { defineConfig } from 'commandkit/config'; + +export default defineConfig({}); diff --git a/examples/deno-ts/deno.json b/examples/deno-ts/deno.json new file mode 100644 index 00000000..1dfe5b70 --- /dev/null +++ b/examples/deno-ts/deno.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "jsx": "react-jsx", + "jsxImportSource": "commandkit" + }, + "nodeModulesDir": "auto", + "lock": true, + "lint": { + "include": ["src/"], + "exclude": ["node_modules/", "dist/", ".commandkit/"] + }, + "fmt": { + "useTabs": false, + "lineWidth": 120, + "indentWidth": 2, + "semiColons": true, + "singleQuote": true, + "include": ["src/"], + "exclude": ["node_modules/", "dist/", ".commandkit/"] + } +} diff --git a/examples/deno-ts/package.json b/examples/deno-ts/package.json new file mode 100644 index 00000000..36dfbce2 --- /dev/null +++ b/examples/deno-ts/package.json @@ -0,0 +1,21 @@ +{ + "name": "commandkit-deno", + "description": "A CommandKit project using Deno", + "version": "0.1.0", + "type": "module", + "private": true, + "main": "dist/index.js", + "scripts": { + "dev": "commandkit dev", + "build": "commandkit build", + "start": "commandkit start" + }, + "devDependencies": { + "@types/node": "^24.0.10", + "typescript": "^5.8.3" + }, + "dependencies": { + "commandkit": "^1.2.0-rc.12", + "discord.js": "^14.23.2" + } +} diff --git a/examples/deno-ts/src/app.ts b/examples/deno-ts/src/app.ts new file mode 100644 index 00000000..ed8d0d48 --- /dev/null +++ b/examples/deno-ts/src/app.ts @@ -0,0 +1,7 @@ +import { Client } from 'discord.js'; + +const client = new Client({ + intents: ['Guilds', 'GuildMembers', 'GuildMessages', 'MessageContent'], +}); + +export default client; diff --git a/examples/deno-ts/src/app/commands/ping.ts b/examples/deno-ts/src/app/commands/ping.ts new file mode 100644 index 00000000..638398b5 --- /dev/null +++ b/examples/deno-ts/src/app/commands/ping.ts @@ -0,0 +1,20 @@ +import type { ChatInputCommand, MessageCommand, CommandData } from 'commandkit'; + +export const command: CommandData = { + name: 'ping', + description: "Ping the bot to check if it's online.", +}; + +export const chatInput: ChatInputCommand = async (ctx) => { + const latency = (ctx.client.ws.ping ?? -1).toString(); + const response = `Pong! Latency: ${latency}ms`; + + await ctx.interaction.reply(response); +}; + +export const message: MessageCommand = async (ctx) => { + const latency = (ctx.client.ws.ping ?? -1).toString(); + const response = `Pong! Latency: ${latency}ms`; + + await ctx.message.reply(response); +}; diff --git a/examples/deno-ts/src/app/events/ready/log.ts b/examples/deno-ts/src/app/events/ready/log.ts new file mode 100644 index 00000000..4414a153 --- /dev/null +++ b/examples/deno-ts/src/app/events/ready/log.ts @@ -0,0 +1,6 @@ +import type { Client } from 'discord.js'; +import { Logger } from 'commandkit/logger'; + +export default function log(client: Client) { + Logger.info(`Logged in as ${client.user.username}!`); +} diff --git a/examples/deno-ts/tsconfig.json b/examples/deno-ts/tsconfig.json new file mode 100644 index 00000000..2c06b336 --- /dev/null +++ b/examples/deno-ts/tsconfig.json @@ -0,0 +1,29 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "moduleResolution": "Node", + "module": "Preserve", + "allowImportingTsExtensions": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "noUncheckedIndexedAccess": true, + "removeComments": true, + "allowJs": true, + "strict": true, + "alwaysStrict": true, + "noEmit": true, + "declaration": false, + "jsx": "react-jsx", + "jsxImportSource": "commandkit", + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "commandkit.config.ts", "commandkit-env.d.ts"], + "exclude": ["dist", "node_modules", ".commandkit"] +} diff --git a/examples/without-cli/.gitignore b/examples/without-cli/.gitignore new file mode 100644 index 00000000..dad27ae6 --- /dev/null +++ b/examples/without-cli/.gitignore @@ -0,0 +1,36 @@ + +# dependencies +node_modules + +# build output +build +out +dist + +# commandkit +.commandkit +dist +compiled-commandkit.config.mjs + +# env +**/*.env* +!**/*.env.example* + +# logging +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# yarn v2+ +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# other +**/*.DS_Store diff --git a/examples/without-cli/.prettierrc b/examples/without-cli/.prettierrc new file mode 100644 index 00000000..0a65dacb --- /dev/null +++ b/examples/without-cli/.prettierrc @@ -0,0 +1,10 @@ +{ + "printWidth": 120, + "tabWidth": 2, + "useTabs": false, + "semi": true, + "endOfLine": "lf", + "singleQuote": true, + "trailingComma": "all", + "arrowParens": "always" +} diff --git a/examples/without-cli/README.md b/examples/without-cli/README.md new file mode 100644 index 00000000..3c23b2dc --- /dev/null +++ b/examples/without-cli/README.md @@ -0,0 +1,29 @@ +# CommandKit without CLI + +This is an example of a CommandKit project without using the CLI. +Note that not using CLI has some drawbacks, such as not being able to use some plugins that require syntax transformation. + +## To run this project + +1. First, install dependencies: + +```sh +pnpm install +``` + +2. Add your bot token to the `.env` file. + +3. Then, run the project: + +```sh +pnpm start +# or +COMMANDKIT_IS_CLI=true node src/index.js +``` + +> Note: You must set `COMMANDKIT_IS_CLI=true` environment variable when running the project without CLI. Not setting this variable will cause the project to fail with errors. + +## Useful links + +- [Documentation](https://commandkit.dev) +- [Discord](https://ctrl.lol/discord) diff --git a/examples/without-cli/commandkit-env.d.ts b/examples/without-cli/commandkit-env.d.ts new file mode 100644 index 00000000..cc2ba6df --- /dev/null +++ b/examples/without-cli/commandkit-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/examples/without-cli/commandkit.config.mjs b/examples/without-cli/commandkit.config.mjs new file mode 100644 index 00000000..57ae7a44 --- /dev/null +++ b/examples/without-cli/commandkit.config.mjs @@ -0,0 +1,3 @@ +import { defineConfig } from 'commandkit/config'; + +export default defineConfig({}); diff --git a/examples/without-cli/jsconfig.json b/examples/without-cli/jsconfig.json new file mode 100644 index 00000000..4e77fa74 --- /dev/null +++ b/examples/without-cli/jsconfig.json @@ -0,0 +1,30 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "target": "ESNext", + "moduleResolution": "Node", + "module": "Preserve", + "allowImportingTsExtensions": true, + "esModuleInterop": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "noUncheckedIndexedAccess": true, + "removeComments": true, + "allowJs": true, + "checkJs": false, + "strict": true, + "alwaysStrict": true, + "noEmit": true, + "declaration": false, + "jsx": "react-jsx", + "jsxImportSource": "commandkit", + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + }, + "include": ["src", "commandkit.config.mjs", "commandkit-env.d.ts"], + "exclude": ["dist", "node_modules", ".commandkit"] +} diff --git a/examples/without-cli/package.json b/examples/without-cli/package.json new file mode 100644 index 00000000..6d556f8d --- /dev/null +++ b/examples/without-cli/package.json @@ -0,0 +1,22 @@ +{ + "name": "commandkit-without-cli", + "description": "A CommandKit project without using the CLI", + "version": "0.1.0", + "type": "module", + "private": true, + "main": "./src/index.js", + "scripts": { + "start": "cross-env COMMANDKIT_IS_CLI=true node .", + "format": "prettier --write \"src/**/*.{js,ts}\"" + }, + "dependencies": { + "commandkit": "^1.2.0-rc.12", + "discord.js": "^14.23.2" + }, + "devDependencies": { + "@types/node": "^24.3.3", + "cross-env": "^10.0.0", + "prettier": "^3.6.2", + "typescript": "^5.9.2" + } +} diff --git a/examples/without-cli/src/app.js b/examples/without-cli/src/app.js new file mode 100644 index 00000000..ed8d0d48 --- /dev/null +++ b/examples/without-cli/src/app.js @@ -0,0 +1,7 @@ +import { Client } from 'discord.js'; + +const client = new Client({ + intents: ['Guilds', 'GuildMembers', 'GuildMessages', 'MessageContent'], +}); + +export default client; diff --git a/examples/without-cli/src/app/commands/ping.js b/examples/without-cli/src/app/commands/ping.js new file mode 100644 index 00000000..201df59d --- /dev/null +++ b/examples/without-cli/src/app/commands/ping.js @@ -0,0 +1,27 @@ +/** + * @type {import('commandkit').CommandData} + */ +export const command = { + name: 'ping', + description: "Ping the bot to check if it's online.", +}; + +/** + * @param {import('commandkit').ChatInputCommandContext} ctx + */ +export const chatInput = async (ctx) => { + const latency = (ctx.client.ws.ping ?? -1).toString(); + const response = `Pong! Latency: ${latency}ms`; + + await ctx.interaction.reply(response); +}; + +/** + * @param {import('commandkit').MessageCommandContext} ctx + */ +export const message = async (ctx) => { + const latency = (ctx.client.ws.ping ?? -1).toString(); + const response = `Pong! Latency: ${latency}ms`; + + await ctx.message.reply(response); +}; diff --git a/examples/without-cli/src/app/events/clientReady/log.js b/examples/without-cli/src/app/events/clientReady/log.js new file mode 100644 index 00000000..abb2fe51 --- /dev/null +++ b/examples/without-cli/src/app/events/clientReady/log.js @@ -0,0 +1,10 @@ +import { Logger } from 'commandkit/logger'; + +/** + * @type {import('commandkit').EventHandler<'clientReady'>} + */ +const handler = async (client) => { + Logger.info(`Logged in as ${client.user.username}!`); +}; + +export default handler; diff --git a/examples/without-cli/src/index.js b/examples/without-cli/src/index.js new file mode 100644 index 00000000..5e5e73cd --- /dev/null +++ b/examples/without-cli/src/index.js @@ -0,0 +1,21 @@ +async function bootstrap() { + // load .env + process.loadEnvFile(); + + // start commandkit + const { commandkit } = await import('commandkit'); + const { Client } = await import('discord.js'); + const app = await import('./app.js').then((m) => m.default ?? m); + + if (!app || !(app instanceof Client)) { + throw new Error('The app file must default export the discord.js client instance'); + } + + commandkit.setClient(app); + + await commandkit.start(); +} + +await bootstrap().catch((e) => { + console.error('Failed to bootstrap CommandKit application:\n', e.stack); +}); diff --git a/packages/create-commandkit/README.md b/packages/create-commandkit/README.md index 707770a3..8ce74229 100644 --- a/packages/create-commandkit/README.md +++ b/packages/create-commandkit/README.md @@ -14,6 +14,9 @@ create-commandkit is a CLI utility to quickly instantiate a Discord bot with Com - Interactive, beautiful command-line interface 🖥️ - Supports CommonJS and ES Modules 📦 +- Dynamic template system with examples from GitHub 🚀 +- Support for all major package managers (npm, pnpm, yarn, bun, deno) 📦 +- TypeScript and JavaScript support 🔧 ## Documentation @@ -21,12 +24,75 @@ You can find the full documentation [here](https://commandkit.dev). ## Usage -Run the following command in your terminal: +### Basic Usage ```sh npx create-commandkit@latest ``` +### With Project Name + +```sh +npx create-commandkit@latest my-bot +``` + +### Using Examples + +```sh +# Use a curated example +npx create-commandkit@latest --example with-database + +# Use a custom GitHub repository +npx create-commandkit@latest --example "https://github.com/user/repo" + +# Use a specific path within a repository +npx create-commandkit@latest --example "https://github.com/user/repo" --example-path "examples/bot" +``` + +### CLI Options + +- `-h, --help` - Show all available options +- `-V, --version` - Output the version number +- `-e, --example ` - An example to bootstrap the app with +- `--example-path ` - Specify the path to the example separately +- `--use-npm` - Use npm as package manager +- `--use-pnpm` - Use pnpm as package manager +- `--use-yarn` - Use yarn as package manager +- `--use-bun` - Use bun as package manager +- `--use-deno` - Use deno as package manager +- `--skip-install` - Skip installing packages +- `--no-git` - Skip git initialization +- `--yes` - Use defaults for all options +- `--list-examples` - List all available examples from the official repository + +### Available Examples + + +- `basic-js` - [examples/basic-js](https://github.com/underctrl-io/commandkit/tree/main/examples/basic-js) +- `basic-ts` - [examples/basic-ts](https://github.com/underctrl-io/commandkit/tree/main/examples/basic-ts) +- `deno-ts` - [examples/deno-ts](https://github.com/underctrl-io/commandkit/tree/main/examples/deno-ts) +- `without-cli` - [examples/without-cli](https://github.com/underctrl-io/commandkit/tree/main/examples/without-cli) + + +### Examples + +```sh +# Create a basic TypeScript bot, skip installation +npx create-commandkit@latest --example basic-ts --skip-install + +# Create a bot with all defaults (no prompts) +npx create-commandkit@latest --yes + +# Create a bot from custom repository +npx create-commandkit@latest --example "https://github.com/username/my-commandkit-template" + +# Create a bot with pnpm +npx create-commandkit@latest --use-pnpm + +# List all available examples +npx create-commandkit@latest --list-examples +``` + ## Support and Suggestions Submit any queries or suggestions in our [Discord community](https://ctrl.lol/discord). \ No newline at end of file diff --git a/packages/create-commandkit/package.json b/packages/create-commandkit/package.json index 66fbd2da..422b7d3e 100644 --- a/packages/create-commandkit/package.json +++ b/packages/create-commandkit/package.json @@ -18,8 +18,7 @@ "commands" ], "files": [ - "dist", - "templates" + "dist" ], "repository": { "type": "git", @@ -30,20 +29,25 @@ "scripts": { "check-types": "tsc --noEmit", "dev": "tsc --watch", - "build": "tsc" + "build": "tsc && tsx scripts/sync-available-examples.ts" }, "dependencies": { "@clack/prompts": "^0.11.0", + "commander": "^14.0.1", "fs-extra": "^11.1.1", "gradient-string": "^3.0.0", "ora": "^8.0.1", - "picocolors": "^1.1.1" + "picocolors": "^1.1.1", + "tiged": "^2.12.7", + "validate-npm-package-name": "^6.0.2" }, "devDependencies": { "@types/fs-extra": "^11.0.4", "@types/gradient-string": "^1.1.5", "@types/node": "^22.0.0", + "@types/validate-npm-package-name": "^4.0.2", "tsconfig": "workspace:*", + "tsx": "^4.20.6", "typescript": "catalog:build" } } diff --git a/packages/create-commandkit/scripts/sync-available-examples.ts b/packages/create-commandkit/scripts/sync-available-examples.ts new file mode 100644 index 00000000..cc6338c5 --- /dev/null +++ b/packages/create-commandkit/scripts/sync-available-examples.ts @@ -0,0 +1,34 @@ +import path from 'node:path'; +import fs from 'node:fs'; + +const BEGIN_MARKER = ''; +const END_MARKER = ''; + +const README_PATH = path.join(import.meta.dirname, '..', 'README.md'); +const README_CONTENT = fs.readFileSync(README_PATH, 'utf8'); + +function insertBetween(content: string) { + const availableExamples = fs.readdirSync( + path.join(import.meta.dirname, '..', '..', '..', 'examples'), + ); + + const examples = availableExamples + .map( + (example) => + `- \`${example}\` - [examples/${example}](https://github.com/underctrl-io/commandkit/tree/main/examples/${example})`, + ) + .join('\n'); + + const between = `${BEGIN_MARKER}\n${examples}\n${END_MARKER}`; + const newContent = [ + content.split(BEGIN_MARKER)[0], + between, + content.split(END_MARKER)[1], + ].join(''); + + return newContent; +} + +const newContent = insertBetween(README_CONTENT); + +fs.writeFileSync(README_PATH, newContent); diff --git a/packages/create-commandkit/src/cli.ts b/packages/create-commandkit/src/cli.ts new file mode 100644 index 00000000..7461adbf --- /dev/null +++ b/packages/create-commandkit/src/cli.ts @@ -0,0 +1,57 @@ +import { Command } from 'commander'; +import type { CLIOptions } from './types.js'; + +export function parseCLI(): CLIOptions { + const program = new Command(); + + program + .name('create-commandkit') + .description('Effortlessly create a CommandKit project') + .version(process.env.npm_package_version || '1.0.0') + .argument('[project-directory]', 'Project directory name') + .option('-h, --help', 'Show all available options') + .option( + '-e, --example ', + 'An example to bootstrap the app with', + ) + .option( + '--example-path ', + 'Specify the path to the example separately', + ) + .option('--use-npm', 'Explicitly tell the CLI to bootstrap using npm') + .option('--use-pnpm', 'Explicitly tell the CLI to bootstrap using pnpm') + .option('--use-yarn', 'Explicitly tell the CLI to bootstrap using yarn') + .option('--use-bun', 'Explicitly tell the CLI to bootstrap using bun') + .option('--use-deno', 'Explicitly tell the CLI to bootstrap using deno') + .option( + '--skip-install', + 'Explicitly tell the CLI to skip installing packages', + ) + .option('--no-git', 'Explicitly tell the CLI to disable git initialization') + .option('--yes', 'Use previous preferences or defaults for all options') + .option( + '--list-examples', + 'List all available examples from the official repository', + ); + + program.parse(); + + const options = program.opts(); + const args = program.args; + + return { + help: options.help, + example: options.example, + examplePath: options.examplePath, + useNpm: options.useNpm, + usePnpm: options.usePnpm, + useYarn: options.useYarn, + useBun: options.useBun, + useDeno: options.useDeno, + skipInstall: options.skipInstall, + noGit: options.noGit, + yes: options.yes, + listExamples: options.listExamples, + projectDirectory: args[0], + }; +} diff --git a/packages/create-commandkit/src/functions/copyTemplates.ts b/packages/create-commandkit/src/functions/copyTemplates.ts deleted file mode 100644 index 5653b85e..00000000 --- a/packages/create-commandkit/src/functions/copyTemplates.ts +++ /dev/null @@ -1,57 +0,0 @@ -import fs from 'fs-extra'; -import path from 'node:path'; -import type { Language } from '../types'; - -const templates = { - js: path.join(import.meta.dirname, '..', '..', 'templates', 'JavaScript'), - ts: path.join(import.meta.dirname, '..', '..', 'templates', 'TypeScript'), -}; - -const gitignore = ` -# dependencies -node_modules - -# build output -build -out -dist - -# commandkit -.commandkit -dist -compiled-commandkit.config.mjs - -# env -**/*.env* -!**/*.env.example* - -# logging -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -lerna-debug.log* -.pnpm-debug.log* - -# yarn v2+ -.yarn/cache -.yarn/unplugged -.yarn/build-state.yml -.yarn/install-state.gz -.pnp.* - -# other -**/*.DS_Store -`; - -export async function copyTemplates({ - dir, - lang, -}: { - lang: Language; - dir: string; -}) { - await fs.copy(templates[lang], dir); - await fs.writeFile(path.join(dir, '.gitignore'), gitignore); -} diff --git a/packages/create-commandkit/src/functions/fetchExample.ts b/packages/create-commandkit/src/functions/fetchExample.ts new file mode 100644 index 00000000..801e78b3 --- /dev/null +++ b/packages/create-commandkit/src/functions/fetchExample.ts @@ -0,0 +1,90 @@ +import fs from 'fs-extra'; +import path from 'node:path'; +// @ts-ignore +import tiged from 'tiged'; +import { validateExampleName } from './validate.js'; + +export interface FetchExampleOptions { + example: string; + examplePath?: string; + targetDir: string; +} + +export async function fetchExample({ + example, + examplePath, + targetDir, +}: FetchExampleOptions): Promise { + const validation = validateExampleName(example); + if (!validation.valid) { + throw new Error(validation.error); + } + + let sourceUrl: string; + + // Check if it's a GitHub URL + if (example.startsWith('http://') || example.startsWith('https://')) { + sourceUrl = example; + } else { + // Construct URL for curated examples + sourceUrl = `underctrl-io/commandkit/examples/${example}`; + } + + // Create temporary directory for download + const tempDir = path.join(targetDir, '.temp-example'); + + try { + // Download the example + const emitter = tiged(sourceUrl, { + mode: 'tar', + disableCache: true, + }); + + await emitter.clone(tempDir); + + // If examplePath is specified, navigate to that subdirectory + const sourceDir = examplePath ? path.join(tempDir, examplePath) : tempDir; + + if (examplePath && !fs.existsSync(sourceDir)) { + throw new Error( + `Example path '${examplePath}' not found in the repository`, + ); + } + + // Copy contents to target directory + const contents = fs.readdirSync(sourceDir); + + for (const item of contents) { + const srcPath = path.join(sourceDir, item); + const destPath = path.join(targetDir, item); + + if (fs.statSync(srcPath).isDirectory()) { + await fs.copy(srcPath, destPath); + } else { + await fs.copy(srcPath, destPath); + } + } + + // Clean up temporary directory + await fs.remove(tempDir); + } catch (error) { + // Clean up on error + if (fs.existsSync(tempDir)) { + await fs.remove(tempDir); + } + + if (error instanceof Error) { + if ( + error.message.includes('not found') || + error.message.includes('404') + ) { + throw new Error( + `Example '${example}' not found. Available examples: basic-ts, basic-js, deno-ts, without-cli`, + ); + } + throw new Error(`Failed to fetch example: ${error.message}`); + } + + throw new Error('Failed to fetch example due to an unknown error'); + } +} diff --git a/packages/create-commandkit/src/functions/installDeps.ts b/packages/create-commandkit/src/functions/installDeps.ts deleted file mode 100644 index 047d3393..00000000 --- a/packages/create-commandkit/src/functions/installDeps.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { type IOType, execSync } from 'node:child_process'; -import ora from 'ora'; - -import type { Language, PackageManager } from '../types'; -import { getCommandKitVersion } from '../utils.js'; - -const getBaseDependencies = () => [ - `commandkit${getCommandKitVersion()}`, - 'discord.js', -]; - -const getDependencies = () => ({ - js: { - dependencies: getBaseDependencies(), - devDependencies: ['@types/node', 'typescript', 'prettier'], - }, - ts: { - dependencies: getBaseDependencies(), - devDependencies: ['@types/node', 'typescript', 'prettier'], - }, -}); - -interface InstallDepsProps { - manager: PackageManager; - dir: string; - lang: Language; - stdio: IOType; -} - -function getInstallCommand( - manager: PackageManager, - deps: string[], - dev = false, -) { - switch (manager) { - case 'npm': - case 'pnpm': - case 'yarn': - case 'bun': - return `${manager} add ${dev ? '-D' : ''} ${deps.join(' ')}`; - case 'deno': - return `deno add ${dev ? '--dev' : ''} ${deps.map((d) => `npm:${d}`).join(' ')}`; - default: - return manager satisfies never; - } -} - -export function installDeps({ - manager, - dir, - lang, - stdio = 'inherit', -}: InstallDepsProps) { - const spinner = ora('Installing dependencies...').start(); - - try { - const dependencies = getDependencies(); - - if (dependencies[lang].dependencies.length) { - const depsCommand = getInstallCommand( - manager, - dependencies[lang].dependencies, - ); - - execSync(depsCommand, { cwd: dir, stdio }); - } - - if (dependencies[lang].devDependencies.length) { - const devDepsCommand = getInstallCommand( - manager, - dependencies[lang].devDependencies, - true, - ); - - execSync(devDepsCommand, { cwd: dir, stdio }); - } - - spinner.succeed('Dependencies installed successfully!'); - } catch (error) { - spinner.fail('Failed to install dependencies'); - throw error; - } -} diff --git a/packages/create-commandkit/src/functions/setup.ts b/packages/create-commandkit/src/functions/setup.ts deleted file mode 100644 index 6db00a8d..00000000 --- a/packages/create-commandkit/src/functions/setup.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { type IOType, execSync } from 'child_process'; -import fs from 'fs-extra'; -import path from 'node:path'; - -import type { PackageManager } from '../types'; -import { commands } from '../utils.js'; - -interface SetupProps { - manager: PackageManager; - token: string; - dir: string; - stdio?: IOType; -} - -export async function setup({ - manager, - token, - dir, - stdio = 'pipe', -}: SetupProps) { - await fs.emptyDir(dir); - - if (manager === 'yarn') { - execSync(commands.init.yarn, { cwd: dir, stdio }); - } - - if (manager === 'deno') { - const denoJsonPath = path.join(dir, 'deno.json'); - const denoJson = { - compilerOptions: { - jsx: 'react-jsx', - jsxImportSource: 'commandkit', - }, - nodeModulesDir: 'auto', - lock: true, - lint: { - include: ['src/'], - exclude: ['node_modules/', 'dist/', '.commandkit/'], - }, - fmt: { - useTabs: false, - lineWidth: 120, - indentWidth: 2, - endOfLine: 'lf', - semiColons: true, - singleQuote: true, - include: ['src/'], - exclude: ['node_modules/', 'dist/', '.commandkit/'], - }, - }; - - await fs.writeJSON(denoJsonPath, denoJson, { spaces: 2, EOL: '\n' }); - } - - const prettierrc = path.join(dir, '.prettierrc'); - - const prettierConfig = { - printWidth: 120, - tabWidth: 2, - useTabs: false, - semi: true, - endOfLine: 'lf', - singleQuote: true, - trailingComma: 'all', - arrowParens: 'always', - }; - - await fs.writeJSON(prettierrc, prettierConfig, { spaces: 2, EOL: '\n' }); - - const packageJsonPath = path.join(dir, 'package.json'); - - const packageJson = { - name: - dir.replaceAll('\\', '/').split('/').pop()?.toLowerCase() || - 'commandkit-project', - description: 'A CommandKit project', - version: '0.1.0', - type: 'module', - private: true, - main: 'dist/index.js', - scripts: { - dev: 'commandkit dev', - build: 'commandkit build', - start: 'commandkit start', - format: 'prettier --write "src/**/*.{js,ts}"', - }, - devDependencies: {}, - dependencies: {}, - }; - - await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 }); - - await fs.writeFile(`${dir}/.env`, `DISCORD_TOKEN="${token || ''}"`); -} diff --git a/packages/create-commandkit/src/functions/validate.ts b/packages/create-commandkit/src/functions/validate.ts new file mode 100644 index 00000000..84fa812e --- /dev/null +++ b/packages/create-commandkit/src/functions/validate.ts @@ -0,0 +1,91 @@ +import fs from 'fs-extra'; +import path from 'node:path'; +import validateNpmPackageName from 'validate-npm-package-name'; + +export function validateProjectName(name: string): { + valid: boolean; + error?: string; +} { + const result = validateNpmPackageName(name); + + if (!result.validForNewPackages) { + const errors = result.errors || []; + const warnings = result.warnings || []; + const allIssues = [...errors, ...warnings]; + + return { + valid: false, + error: allIssues.length > 0 ? allIssues[0] : 'Invalid project name', + }; + } + + return { valid: true }; +} + +export function validateDirectory(dir: string): { + valid: boolean; + error?: string; +} { + const resolvedDir = path.resolve(process.cwd(), dir); + + try { + const exists = fs.existsSync(resolvedDir); + + if (!exists) { + return { valid: true }; + } + + const contents = fs.readdirSync(resolvedDir); + const isEmpty = contents.length === 0; + + if (!isEmpty) { + return { + valid: false, + error: 'Directory is not empty!', + }; + } + + return { valid: true }; + } catch (error) { + return { + valid: false, + error: 'Unable to access directory', + }; + } +} + +export function validateExampleName(example: string): { + valid: boolean; + error?: string; +} { + // Check if it's a GitHub URL + if (example.startsWith('http://') || example.startsWith('https://')) { + try { + const url = new URL(example); + if (url.hostname === 'github.com' || url.hostname === 'www.github.com') { + return { valid: true }; + } + return { + valid: false, + error: 'Only GitHub URLs are supported', + }; + } catch { + return { + valid: false, + error: 'Invalid URL format', + }; + } + } + + // Check if it's a valid example name (alphanumeric, hyphens, underscores) + const exampleNameRegex = /^[a-zA-Z0-9-_]+$/; + if (!exampleNameRegex.test(example)) { + return { + valid: false, + error: + 'Example name can only contain letters, numbers, hyphens, and underscores', + }; + } + + return { valid: true }; +} diff --git a/packages/create-commandkit/src/index.ts b/packages/create-commandkit/src/index.ts index 0dfe3e7f..c2a818cd 100755 --- a/packages/create-commandkit/src/index.ts +++ b/packages/create-commandkit/src/index.ts @@ -1,125 +1,266 @@ #!/usr/bin/env node -console.clear(); -import { confirm, intro, outro, password, select, text } from '@clack/prompts'; +import { confirm, intro, outro, password, text } from '@clack/prompts'; import fs from 'fs-extra'; import gradient from 'gradient-string'; import { execSync } from 'node:child_process'; -import path from 'node:path'; +import path, { join } from 'node:path'; import colors from 'picocolors'; -import { copyTemplates } from './functions/copyTemplates.js'; -import { installDeps } from './functions/installDeps.js'; -import { setup } from './functions/setup.js'; -import type { Language, PackageManager } from './types'; -import { detectPackageManager, textColors } from './utils.js'; +import { parseCLI } from './cli.js'; +import { fetchExample } from './functions/fetchExample.js'; +import { + validateDirectory, + validateProjectName, +} from './functions/validate.js'; +import { + fetchAvailableExamples, + getDefaultExample, + getInstallCommand, + isOfficialExample, + resolvePackageManager, + textColors, +} from './utils.js'; +import { readFile } from 'node:fs/promises'; -const commandkitGradient = gradient(textColors.commandkit)('CommandKit'); +async function main() { + const cliOptions = parseCLI(); -intro(`Welcome to ${commandkitGradient}!`); + // Handle help and version flags + if (cliOptions.help) { + console.log(` +Usage: create-commandkit [options] [project-directory] -const dir = path.resolve( - process.cwd(), - (await text({ - message: 'Enter a project directory:', - placeholder: 'Leave blank for current directory', - defaultValue: '.', - validate: (value) => { - value = path.resolve(process.cwd(), value); - let isEmpty; +Options: + -h, --help Show all available options + -V, --version Output the version number + -e, --example An example to bootstrap the app with + --example-path Specify the path to the example separately + --use-npm Explicitly tell the CLI to bootstrap using npm + --use-pnpm Explicitly tell the CLI to bootstrap using pnpm + --use-yarn Explicitly tell the CLI to bootstrap using yarn + --use-bun Explicitly tell the CLI to bootstrap using bun + --use-deno Explicitly tell the CLI to bootstrap using deno + --skip-install Explicitly tell the CLI to skip installing packages + --no-git Explicitly tell the CLI to disable git initialization + --yes Use previous preferences or defaults for all options + --list-examples List all available examples from the official repository - try { - const contents = fs.readdirSync(value); - isEmpty = contents.length === 0; - } catch { - isEmpty = true; +Examples: + npx create-commandkit@latest + npx create-commandkit@latest my-bot + npx create-commandkit@latest --example basic-ts + npx create-commandkit@latest --example "https://github.com/user/repo" --example-path "examples/bot" + npx create-commandkit@latest --use-pnpm --yes + npx create-commandkit@latest --list-examples +`); + process.exit(0); + } + + // Handle list examples flag + if (cliOptions.listExamples) { + console.log(colors.cyan('Fetching available examples...')); + + try { + const examples = await fetchAvailableExamples(); + + console.log(colors.green('\nAvailable examples:')); + console.log(''); + + for (const example of examples) { + console.log(` ${colors.magenta(example)}`); } - return isEmpty ? undefined : 'Directory is not empty!'; - }, - })) as string, -); - -const manager = (await select({ - message: 'Select a package manager:', - initialValue: detectPackageManager(), - options: [ - { label: 'npm', value: 'npm' }, - { label: 'pnpm', value: 'pnpm' }, - { label: 'yarn', value: 'yarn' }, - { label: 'bun', value: 'bun' }, - { label: 'deno', value: 'deno' }, - ], -})) as PackageManager; - -const lang = (await select({ - message: 'Select the language to use:', - initialValue: 'ts' as Language, - options: [ - { label: 'TypeScript', value: 'ts' }, - { label: 'JavaScript', value: 'js' }, - ], -})) as Language; - -const token = (await password({ - message: 'Enter your Discord bot token (stored in .env, optional):', - mask: colors.gray('*'), -})) as string; - -const gitInit = await confirm({ - message: 'Initialize a git repository?', - initialValue: true, -}); + console.log(''); + console.log( + colors.gray( + 'Usage: npx create-commandkit@latest --example ', + ), + ); + console.log( + colors.gray('Example: npx create-commandkit@latest --example basic-ts'), + ); + } catch (error) { + console.error( + colors.red( + 'Failed to fetch examples list. Please check your internet connection.', + ), + ); + process.exit(1); + } -outro(colors.cyan('Setup complete.')); + process.exit(0); + } -await setup({ - manager, - dir, - token, -}); + const commandkitGradient = gradient(textColors.commandkit)('CommandKit'); + intro(`Welcome to ${commandkitGradient}!`); + + // Determine project directory + let projectDir: string; + if (cliOptions.projectDirectory) { + projectDir = path.resolve(process.cwd(), cliOptions.projectDirectory); + + // Validate project name if provided + const projectName = path.basename(projectDir); + const nameValidation = validateProjectName(projectName); + if (!nameValidation.valid) { + console.error(colors.red(`Error: ${nameValidation.error}`)); + process.exit(1); + } + } else if (cliOptions.yes) { + projectDir = path.resolve(process.cwd(), 'commandkit-project'); + } else { + projectDir = path.resolve( + process.cwd(), + (await text({ + message: 'Enter a project directory:', + placeholder: 'Leave blank for current directory', + defaultValue: '.', + validate: (value) => { + value = path.resolve(process.cwd(), value); + const validation = validateDirectory(value); + return validation.valid ? undefined : validation.error; + }, + })) as string, + ); + } + + // Validate directory + const dirValidation = validateDirectory(projectDir); + if (!dirValidation.valid) { + console.error(colors.red(`Error: ${dirValidation.error}`)); + process.exit(1); + } + + // Determine package manager + const manager = resolvePackageManager(cliOptions); + + // Get Discord token + let token: string; + if (cliOptions.yes) { + token = ''; + } else { + token = (await password({ + message: 'Enter your Discord bot token (stored in .env, optional):', + mask: colors.gray('*'), + })) as string; + } -await copyTemplates({ dir, lang }); + // Determine git initialization + const gitInit = cliOptions.noGit + ? false + : cliOptions.yes + ? true + : await confirm({ + message: 'Initialize a git repository?', + initialValue: true, + }); -if (gitInit) { + outro(colors.cyan('Setup complete.')); + + // Fetch example from GitHub try { - execSync('git init', { cwd: dir, stdio: 'pipe' }); + const example = cliOptions.example || getDefaultExample(cliOptions); + await fetchExample({ + example, + examplePath: cliOptions.examplePath, + targetDir: projectDir, + }); + // Create .env file with token + await fs.writeFile(`${projectDir}/.env`, `DISCORD_TOKEN="${token || ''}"`); + + // Install packages for official examples + if (isOfficialExample(example) && !cliOptions.skipInstall) { + console.log( + colors.cyan('Installing dependencies for official example...'), + ); + + try { + const tagMap = [ + ['-dev.', 'dev'], + ['-rc.', 'next'], + ]; + + const tag = await readFile( + join(import.meta.dirname, '..', 'package.json'), + 'utf-8', + ) + .then((data) => { + const version = JSON.parse(data).version; + + return ( + tagMap.find(([suffix]) => version.includes(suffix))?.[1] || + 'latest' + ); + }) + .catch(() => 'latest'); + + // Install dependencies + const depsCommand = getInstallCommand(manager, [ + `commandkit@${tag}`, + 'discord.js', + ]); + execSync(depsCommand, { cwd: projectDir, stdio: 'pipe' }); + + // Install dev dependencies + const devDepsCommand = getInstallCommand( + manager, + ['typescript', '@types/node'], + true, + ); + execSync(devDepsCommand, { cwd: projectDir, stdio: 'pipe' }); + + console.log(colors.green('Dependencies installed successfully!')); + } catch (error) { + console.log( + colors.yellow( + 'Warning: Failed to install dependencies. You may need to install them manually.', + ), + ); + } + } } catch (error) { - console.log( - colors.yellow( - 'Warning: Git initialization failed. Make sure Git is installed on your system.', + console.error( + colors.red( + `Error fetching example: ${error instanceof Error ? error.message : 'Unknown error'}`, ), ); + process.exit(1); } -} - -installDeps({ - dir, - manager, - lang, - stdio: 'pipe', -}); -const command = (cmd: string) => { - switch (manager) { - case 'npm': - // bun build runs bundler instead of the build script - case 'bun': - return `${manager} run ${cmd}`; - case 'pnpm': - case 'yarn': - return `${manager} ${cmd}`; - case 'deno': - return `deno task ${cmd}`; - default: - return manager satisfies never; + // Initialize git if requested + if (gitInit) { + try { + execSync('git init', { cwd: projectDir, stdio: 'pipe' }); + } catch (error) { + console.log( + colors.yellow( + 'Warning: Git initialization failed. Make sure Git is installed on your system.', + ), + ); + } } -}; -console.log( - `${gradient(textColors.commandkit)('Thank you for choosing CommandKit!')} + const command = (cmd: string) => { + switch (manager) { + case 'npm': + // bun build runs bundler instead of the build script + case 'bun': + return `${manager} run ${cmd}`; + case 'pnpm': + case 'yarn': + return `${manager} ${cmd}`; + case 'deno': + return `deno task ${cmd}`; + default: + return manager satisfies never; + } + }; -To start your bot, use the following commands: + console.log( + `${gradient(textColors.commandkit)('Thank you for choosing CommandKit!')} + +To start your bot${projectDir !== '.' ? `, ${colors.magenta(`cd ${projectDir}`)}` : ''}${projectDir !== '.' ? ' and' : ''} use the following commands: ${colors.magenta(command('dev'))} - Run your bot in development mode ${colors.magenta(command('build'))} - Build your bot for production ${colors.magenta(command('start'))} - Run your bot in production mode @@ -130,4 +271,14 @@ To start your bot, use the following commands: • Discord community: ${colors.blue('https://ctrl.lol/discord')} Happy coding! 🚀`, -); + ); +} + +main().catch((error) => { + console.error( + colors.red( + `Error: ${error instanceof Error ? error.message : 'Unknown error'}`, + ), + ); + process.exit(1); +}); diff --git a/packages/create-commandkit/src/types.ts b/packages/create-commandkit/src/types.ts index 4beaa26d..98405296 100644 --- a/packages/create-commandkit/src/types.ts +++ b/packages/create-commandkit/src/types.ts @@ -1,2 +1,17 @@ -export type Language = 'js' | 'ts'; export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun' | 'deno'; + +export interface CLIOptions { + help?: boolean; + example?: string; + examplePath?: string; + useNpm?: boolean; + usePnpm?: boolean; + useYarn?: boolean; + useBun?: boolean; + useDeno?: boolean; + skipInstall?: boolean; + noGit?: boolean; + yes?: boolean; + listExamples?: boolean; + projectDirectory?: string; +} diff --git a/packages/create-commandkit/src/utils.ts b/packages/create-commandkit/src/utils.ts index f7186739..f897cb47 100644 --- a/packages/create-commandkit/src/utils.ts +++ b/packages/create-commandkit/src/utils.ts @@ -1,7 +1,4 @@ -import fs from 'fs-extra'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import type { PackageManager } from './types'; +import type { CLIOptions, PackageManager } from './types'; export const textColors = { commandkit: ['#fdba74', '#e4a5a2', '#c288de', '#b27bf9'], @@ -9,12 +6,6 @@ export const textColors = { ts: ['#2480c5', '#2480c5'], }; -export const commands = { - init: { - yarn: 'yarn set version stable; yarn config set nodeLinker node-modules;', - }, -}; - export function detectPackageManager(): PackageManager { const packageManager = process.env.npm_config_user_agent; @@ -27,26 +18,124 @@ export function detectPackageManager(): PackageManager { return 'npm'; } -export function getCommandKitVersion(): string { +export function getPackageManagerFromCLI(options: { + useNpm?: boolean; + usePnpm?: boolean; + useYarn?: boolean; + useBun?: boolean; + useDeno?: boolean; +}): PackageManager | null { + if (options.useNpm) return 'npm'; + if (options.usePnpm) return 'pnpm'; + if (options.useYarn) return 'yarn'; + if (options.useBun) return 'bun'; + if (options.useDeno) return 'deno'; + + return null; +} + +export function resolvePackageManager(cliOptions: { + useNpm?: boolean; + usePnpm?: boolean; + useYarn?: boolean; + useBun?: boolean; + useDeno?: boolean; +}): PackageManager { + const cliManager = getPackageManagerFromCLI(cliOptions); + return cliManager || detectPackageManager(); +} + +export function getDefaultExample(cliOptions: CLIOptions): string { + if (cliOptions.useDeno) { + return 'deno-ts'; + } + + return 'basic-ts'; +} + +export function isOfficialExample(example: string): boolean { + // Check if it's a GitHub URL pointing to underctrl-io/commandkit + if (example.startsWith('http://') || example.startsWith('https://')) { + try { + const url = new URL(example); + return ( + url.hostname === 'github.com' && + url.pathname.startsWith('/underctrl-io/commandkit') + ); + } catch { + return false; + } + } + + // If it's just an example name, it's official + return true; +} + +export function getInstallCommand( + manager: PackageManager, + deps: string[], + dev = false, +): string { + switch (manager) { + case 'npm': + case 'pnpm': + case 'yarn': + case 'bun': + return `${manager} add ${dev ? '-D' : ''} ${deps.join(' ')}`; + case 'deno': + return `deno add ${dev ? '--dev' : ''} ${deps.map((d) => `npm:${d}`).join(' ')}`; + default: + return manager satisfies never; + } +} + +export async function fetchAvailableExamples(): Promise { + let controller: AbortController | null = null; + let timeoutId: NodeJS.Timeout | null = null; + try { - const __filename = fileURLToPath(import.meta.url); - const __dirname = path.dirname(__filename); - - const packageJsonPath = path.resolve(__dirname, '..', 'package.json'); - const packageJson = fs.readJsonSync(packageJsonPath); - const currentVersion = packageJson.version as string; - - if (currentVersion.includes('dev.')) { - return '@dev'; - } else if (currentVersion.includes('rc.')) { - return '@next'; - } else { - return '@latest'; + controller = new AbortController(); + timeoutId = setTimeout(() => controller!.abort(), 10000); // 10 second timeout + + const response = await fetch( + 'https://api.github.com/repos/underctrl-io/commandkit/contents/examples', + { + signal: controller.signal, + headers: { + 'User-Agent': 'create-commandkit', + }, + }, + ); + + if (timeoutId) { + clearTimeout(timeoutId); + timeoutId = null; } + + if (!response.ok) { + throw new Error(`GitHub API error: ${response.status}`); + } + + const data = (await response.json()) as Array<{ + name: string; + type: string; + }>; + + // Filter for directories only and return their names + return data + .filter((item) => item.type === 'dir') + .map((item) => item.name) + .sort(); } catch (error) { - console.warn( - 'Could not determine create-commandkit version, defaulting to commandkit@latest', - ); - return '@latest'; + // Clean up on error + if (timeoutId) { + clearTimeout(timeoutId); + } + if (controller) { + controller.abort(); + } + + // Fallback to few known examples if API fails + return ['basic-ts', 'basic-js', 'deno-ts', 'without-cli']; } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c4f78500..7e5c0e54 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -330,6 +330,9 @@ importers: '@clack/prompts': specifier: ^0.11.0 version: 0.11.0 + commander: + specifier: ^14.0.1 + version: 14.0.1 fs-extra: specifier: ^11.1.1 version: 11.3.2 @@ -342,6 +345,12 @@ importers: picocolors: specifier: ^1.1.1 version: 1.1.1 + tiged: + specifier: ^2.12.7 + version: 2.12.7 + validate-npm-package-name: + specifier: ^6.0.2 + version: 6.0.2 devDependencies: '@types/fs-extra': specifier: ^11.0.4 @@ -352,9 +361,15 @@ importers: '@types/node': specifier: ^22.0.0 version: 22.18.8 + '@types/validate-npm-package-name': + specifier: ^4.0.2 + version: 4.0.2 tsconfig: specifier: workspace:* version: link:../tsconfig + tsx: + specifier: ^4.20.6 + version: 4.20.6 typescript: specifier: catalog:build version: 5.9.3 @@ -1950,312 +1965,156 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/android-arm64@0.25.10': resolution: {integrity: sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm@0.25.10': resolution: {integrity: sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-x64@0.25.10': resolution: {integrity: sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/darwin-arm64@0.25.10': resolution: {integrity: sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-x64@0.25.10': resolution: {integrity: sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/freebsd-arm64@0.25.10': resolution: {integrity: sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-x64@0.25.10': resolution: {integrity: sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/linux-arm64@0.25.10': resolution: {integrity: sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm@0.25.10': resolution: {integrity: sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-ia32@0.25.10': resolution: {integrity: sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-loong64@0.25.10': resolution: {integrity: sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-mips64el@0.25.10': resolution: {integrity: sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-ppc64@0.25.10': resolution: {integrity: sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-riscv64@0.25.10': resolution: {integrity: sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-s390x@0.25.10': resolution: {integrity: sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-x64@0.25.10': resolution: {integrity: sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/netbsd-arm64@0.25.10': resolution: {integrity: sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-x64@0.25.10': resolution: {integrity: sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/openbsd-arm64@0.25.10': resolution: {integrity: sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-x64@0.25.10': resolution: {integrity: sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openharmony-arm64@0.25.10': resolution: {integrity: sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openharmony] - '@esbuild/sunos-x64@0.25.10': resolution: {integrity: sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/win32-arm64@0.25.10': resolution: {integrity: sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-ia32@0.25.10': resolution: {integrity: sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-x64@0.25.10': resolution: {integrity: sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2479,8 +2338,8 @@ packages: cpu: [x64] os: [win32] - '@napi-rs/wasm-runtime@1.0.6': - resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -3005,85 +2864,85 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rolldown/binding-android-arm64@1.0.0-beta.42': - resolution: {integrity: sha512-W5ZKF3TP3bOWuBfotAGp+UGjxOkGV7jRmIRbBA7NFjggx7Oi6vOmGDqpHEIX7kDCiry1cnIsWQaxNvWbMdkvzQ==} + '@rolldown/binding-android-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.42': - resolution: {integrity: sha512-abw/wtgJA8OCgaTlL+xJxnN/Z01BwV1rfzIp5Hh9x+IIO6xOBfPsQ0nzi0+rWx3TyZ9FZXyC7bbC+5NpQ9EaXQ==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.42': - resolution: {integrity: sha512-Y/UrZIRVr8CvXVEB88t6PeC46r1K9/QdPEo2ASE/b/KBEyXIx+QbM6kv9QfQVWU2Atly2+SVsQzxQsIvuk3lZQ==} + '@rolldown/binding-darwin-x64@1.0.0-beta.43': + resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.42': - resolution: {integrity: sha512-zRM0oOk7BZiy6DoWBvdV4hyEg+j6+WcBZIMHVirMEZRu8hd18kZdJkg+bjVMfCEhwpWeFUfBfZ1qcaZ5UdYzlQ==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': + resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': - resolution: {integrity: sha512-6RjFaC52QNwo7ilU8C5H7swbGlgfTkG9pudXwzr3VYyT18s0C9gLg3mvc7OMPIGqNxnQ0M5lU8j6aQCk2DTRVg==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': + resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': - resolution: {integrity: sha512-LMYHM5Sf6ROq+VUwHMDVX2IAuEsWTv4SnlFEedBnMGpvRuQ14lCmD4m5Q8sjyAQCgyha9oghdGoK8AEg1sXZKg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': - resolution: {integrity: sha512-/bNTYb9aKNhzdbPn3O4MK2aLv55AlrkUKPE4KNfBYjkoZUfDr4jWp7gsSlvTc5A/99V1RCm9axvt616ZzeXGyA==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': - resolution: {integrity: sha512-n/SLa4h342oyeGykZdch7Y3GNCNliRPL4k5wkeZ/5eQZs+c6/ZG1SHCJQoy7bZcmxiMyaXs9HoFmv1PEKrZgWg==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': - resolution: {integrity: sha512-4PSd46sFzqpLHSGdaSViAb1mk55sCUMpJg+X8ittXaVocQsV3QLG/uydSH8RyL0ngHX5fy3D70LcCzlB15AgHw==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': - resolution: {integrity: sha512-BmWoeJJyeZXmZBcfoxG6J9+rl2G7eO47qdTkAzEegj4n3aC6CBIHOuDcbE8BvhZaEjQR0nh0nJrtEDlt65Q7Sw==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': - resolution: {integrity: sha512-2Ft32F7uiDTrGZUKws6CLNTlvTWHC33l4vpXrzUucf9rYtUThAdPCOt89Pmn13tNX6AulxjGEP2R0nZjTSW3eQ==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': + resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': - resolution: {integrity: sha512-hC1kShXW/z221eG+WzQMN06KepvPbMBknF0iGR3VMYJLOe9gwnSTfGxFT5hf8XrPv7CEZqTWRd0GQpkSHRbGsw==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': - resolution: {integrity: sha512-AICBYromawouGjj+GS33369E8Vwhy6UwhQEhQ5evfS8jPCsyVvoICJatbDGDGH01dwtVGLD5eDFzPicUOVpe4g==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': - resolution: {integrity: sha512-XpZ0M+tjoEiSc9c+uZR7FCnOI0uxDRNs1elGOMjeB0pUP1QmvVbZGYNsyLbLoP4u7e3VQN8rie1OQ8/mB6rcJg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -3091,8 +2950,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.27': resolution: {integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==} - '@rolldown/pluginutils@1.0.0-beta.42': - resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} + '@rolldown/pluginutils@1.0.0-beta.43': + resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} '@rollup/plugin-json@6.1.0': resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} @@ -4036,6 +3895,9 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/validate-npm-package-name@4.0.2': + resolution: {integrity: sha512-lrpDziQipxCEeK5kWxvljWYhUvOiB2A9izZd9B2AFarYAkqZshb4lPbRs7zKEic6eGtH8V/2qJW+dPp9OtF6bw==} + '@types/ws@8.18.1': resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} @@ -4232,6 +4094,10 @@ packages: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.4: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} @@ -4282,6 +4148,10 @@ packages: ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -4634,6 +4504,10 @@ packages: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + chownr@3.0.0: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} @@ -4716,6 +4590,9 @@ packages: colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@1.2.1: + resolution: {integrity: sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==} + colorette@2.0.20: resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} @@ -4738,6 +4615,10 @@ packages: resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} engines: {node: '>=18'} + commander@14.0.1: + resolution: {integrity: sha512-2JkV3gUZUVrbNA+1sjBOYLsMZ5cEEl8GTFP2a4AVz5hvasAMCQ1D2l2le/cX+pV4N6ZU17zjUahLpIXRrnWL8A==} + engines: {node: '>=20'} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -5462,6 +5343,10 @@ packages: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} + enquirer@2.3.6: + resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} + engines: {node: '>=8.6'} + entities@2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} @@ -5502,11 +5387,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} - engines: {node: '>=18'} - hasBin: true - escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -5842,6 +5722,10 @@ packages: resolution: {integrity: sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==} engines: {node: '>=14.14'} + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -5853,6 +5737,9 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + fuzzysearch@1.0.3: + resolution: {integrity: sha512-s+kNWQuI3mo9OALw0HJ6YGmMbLqEufCh2nX/zzV5CrICQ/y4AwPxM+6TIiF9ItFCHXFCyM/BfCCmN57NTIJuPg==} + gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -5934,6 +5821,9 @@ packages: resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + globby@10.0.2: resolution: {integrity: sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==} engines: {node: '>=8'} @@ -5946,6 +5836,9 @@ packages: resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -6136,6 +6029,10 @@ packages: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + https-proxy-agent@5.0.0: + resolution: {integrity: sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -7104,10 +7001,22 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + minizlib@3.1.0: resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} engines: {node: '>= 18'} @@ -7116,9 +7025,18 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + mlly@1.7.4: resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} + mri@1.1.6: + resolution: {integrity: sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==} + engines: {node: '>=4'} + mrmime@2.0.0: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} @@ -8357,8 +8275,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.42: - resolution: {integrity: sha512-xaPcckj+BbJhYLsv8gOqezc8EdMcKKe/gk8v47B0KPvgABDrQ0qmNPAiT/gh9n9Foe0bUkEv2qzj42uU5q1WRg==} + rolldown@1.0.0-beta.43: + resolution: {integrity: sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -8787,6 +8705,10 @@ packages: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + tar@7.5.1: resolution: {integrity: sha512-nlGpxf+hv0v7GkWBK2V9spgactGOp0qvfWRxUMjqHyzrt3SgwE48DIv/FhqPHJYLHpgW1opq3nERbz5Anq7n1g==} engines: {node: '>=18'} @@ -8831,6 +8753,14 @@ packages: thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + tiged@2.12.7: + resolution: {integrity: sha512-6TwlABgdshi1h9atXFRx86IhuDANtNqfD1OuWmZKKdqqwWNEJXHLa2hrRiyve9kLwHPb2ADc8RU3mSc4MVBE5A==} + engines: {node: '>=8.0.0'} + hasBin: true + + tiny-glob@0.2.8: + resolution: {integrity: sha512-vkQP7qOslq63XRX9kMswlby99kyO5OvKptw7AMwBVMjXEI7Tb61eoI5DydyEMOseyGS5anDN1VPoVxEvH01q8w==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -9217,6 +9147,10 @@ packages: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@6.0.2: + resolution: {integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ==} + engines: {node: ^18.17.0 || >=20.5.0} + value-equal@1.0.1: resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} @@ -9543,6 +9477,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + 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'} @@ -12395,159 +12332,81 @@ snapshots: '@esbuild/aix-ppc64@0.25.10': optional: true - '@esbuild/aix-ppc64@0.25.9': - optional: true - '@esbuild/android-arm64@0.25.10': optional: true - '@esbuild/android-arm64@0.25.9': - optional: true - '@esbuild/android-arm@0.25.10': optional: true - '@esbuild/android-arm@0.25.9': - optional: true - '@esbuild/android-x64@0.25.10': optional: true - '@esbuild/android-x64@0.25.9': - optional: true - '@esbuild/darwin-arm64@0.25.10': optional: true - '@esbuild/darwin-arm64@0.25.9': - optional: true - '@esbuild/darwin-x64@0.25.10': optional: true - '@esbuild/darwin-x64@0.25.9': - optional: true - '@esbuild/freebsd-arm64@0.25.10': optional: true - '@esbuild/freebsd-arm64@0.25.9': - optional: true - '@esbuild/freebsd-x64@0.25.10': optional: true - '@esbuild/freebsd-x64@0.25.9': - optional: true - '@esbuild/linux-arm64@0.25.10': optional: true - '@esbuild/linux-arm64@0.25.9': - optional: true - '@esbuild/linux-arm@0.25.10': optional: true - '@esbuild/linux-arm@0.25.9': - optional: true - '@esbuild/linux-ia32@0.25.10': optional: true - '@esbuild/linux-ia32@0.25.9': - optional: true - '@esbuild/linux-loong64@0.25.10': optional: true - '@esbuild/linux-loong64@0.25.9': - optional: true - '@esbuild/linux-mips64el@0.25.10': optional: true - '@esbuild/linux-mips64el@0.25.9': - optional: true - '@esbuild/linux-ppc64@0.25.10': optional: true - '@esbuild/linux-ppc64@0.25.9': - optional: true - '@esbuild/linux-riscv64@0.25.10': optional: true - '@esbuild/linux-riscv64@0.25.9': - optional: true - '@esbuild/linux-s390x@0.25.10': optional: true - '@esbuild/linux-s390x@0.25.9': - optional: true - '@esbuild/linux-x64@0.25.10': optional: true - '@esbuild/linux-x64@0.25.9': - optional: true - '@esbuild/netbsd-arm64@0.25.10': optional: true - '@esbuild/netbsd-arm64@0.25.9': - optional: true - '@esbuild/netbsd-x64@0.25.10': optional: true - '@esbuild/netbsd-x64@0.25.9': - optional: true - '@esbuild/openbsd-arm64@0.25.10': optional: true - '@esbuild/openbsd-arm64@0.25.9': - optional: true - '@esbuild/openbsd-x64@0.25.10': optional: true - '@esbuild/openbsd-x64@0.25.9': - optional: true - '@esbuild/openharmony-arm64@0.25.10': optional: true - '@esbuild/openharmony-arm64@0.25.9': - optional: true - '@esbuild/sunos-x64@0.25.10': optional: true - '@esbuild/sunos-x64@0.25.9': - optional: true - '@esbuild/win32-arm64@0.25.10': optional: true - '@esbuild/win32-arm64@0.25.9': - optional: true - '@esbuild/win32-ia32@0.25.10': optional: true - '@esbuild/win32-ia32@0.25.9': - optional: true - '@esbuild/win32-x64@0.25.10': optional: true - '@esbuild/win32-x64@0.25.9': - optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.37.0(jiti@2.6.1))': dependencies: eslint: 9.37.0(jiti@2.6.1) @@ -12813,7 +12672,7 @@ snapshots: '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': optional: true - '@napi-rs/wasm-runtime@1.0.6': + '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 @@ -13342,53 +13201,53 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@rolldown/binding-android-arm64@1.0.0-beta.42': + '@rolldown/binding-android-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.42': + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.42': + '@rolldown/binding-darwin-x64@1.0.0-beta.43': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.42': + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': dependencies: - '@napi-rs/wasm-runtime': 1.0.6 + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': optional: true '@rolldown/pluginutils@1.0.0-beta.27': {} - '@rolldown/pluginutils@1.0.0-beta.42': {} + '@rolldown/pluginutils@1.0.0-beta.43': {} '@rollup/plugin-json@6.1.0(rollup@4.52.4)': dependencies: @@ -14339,6 +14198,8 @@ snapshots: '@types/unist@3.0.3': {} + '@types/validate-npm-package-name@4.0.2': {} + '@types/ws@8.18.1': dependencies: '@types/node': 22.18.8 @@ -14606,6 +14467,12 @@ snapshots: address@1.2.2: {} + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + agent-base@7.1.4: {} aggregate-error@3.1.0: @@ -14673,6 +14540,8 @@ snapshots: dependencies: string-width: 4.2.3 + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -15140,6 +15009,8 @@ snapshots: dependencies: readdirp: 4.1.1 + chownr@2.0.0: {} + chownr@3.0.0: {} chrome-trace-event@1.0.4: {} @@ -15204,6 +15075,8 @@ snapshots: colord@2.9.3: {} + colorette@1.2.1: {} + colorette@2.0.20: {} combine-promises@1.2.0: {} @@ -15218,6 +15091,8 @@ snapshots: commander@13.1.0: {} + commander@14.0.1: {} + commander@2.20.3: {} commander@4.1.1: {} @@ -15794,7 +15669,7 @@ snapshots: detect-port@1.6.1: dependencies: address: 1.2.2 - debug: 4.4.1 + debug: 4.4.3 transitivePeerDependencies: - supports-color @@ -15963,6 +15838,10 @@ snapshots: graceful-fs: 4.2.11 tapable: 2.3.0 + enquirer@2.3.6: + dependencies: + ansi-colors: 4.1.3 + entities@2.2.0: {} entities@4.5.0: {} @@ -16031,35 +15910,6 @@ snapshots: '@esbuild/win32-ia32': 0.25.10 '@esbuild/win32-x64': 0.25.10 - esbuild@0.25.9: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 - escalade@3.2.0: {} escape-goat@4.0.0: {} @@ -16466,6 +16316,10 @@ snapshots: jsonfile: 6.2.0 universalify: 2.0.1 + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + fs.realpath@1.0.0: {} fsevents@2.3.3: @@ -16473,6 +16327,8 @@ snapshots: function-bind@1.1.2: {} + fuzzysearch@1.0.3: {} + gensync@1.0.0-beta.2: {} get-east-asian-width@1.3.0: {} @@ -16564,6 +16420,8 @@ snapshots: globals@16.4.0: {} + globalyzer@0.1.0: {} + globby@10.0.2: dependencies: '@types/glob': 7.2.0 @@ -16592,6 +16450,8 @@ snapshots: merge2: 1.4.1 slash: 4.0.0 + globrex@0.1.2: {} + gopd@1.2.0: {} got@12.6.1: @@ -16894,6 +16754,13 @@ snapshots: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + https-proxy-agent@5.0.0: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.4 @@ -18073,8 +17940,19 @@ snapshots: minimist@1.2.8: {} + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + minipass@7.1.2: {} + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + minizlib@3.1.0: dependencies: minipass: 7.1.2 @@ -18083,6 +17961,8 @@ snapshots: dependencies: minimist: 1.2.8 + mkdirp@1.0.4: {} + mlly@1.7.4: dependencies: acorn: 8.15.0 @@ -18090,6 +17970,8 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 + mri@1.1.6: {} + mrmime@2.0.0: {} ms@2.0.0: {} @@ -19465,7 +19347,7 @@ snapshots: robust-predicates@3.0.2: {} - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.42)(typescript@5.9.3): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -19476,33 +19358,33 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.11.0 magic-string: 0.30.19 - rolldown: 1.0.0-beta.42 + rolldown: 1.0.0-beta.43 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.42: + rolldown@1.0.0-beta.43: dependencies: '@oxc-project/types': 0.94.0 - '@rolldown/pluginutils': 1.0.0-beta.42 + '@rolldown/pluginutils': 1.0.0-beta.43 ansis: 4.2.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.42 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.42 - '@rolldown/binding-darwin-x64': 1.0.0-beta.42 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.42 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.42 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.42 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.42 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.42 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.42 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.42 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.42 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.42 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 + '@rolldown/binding-android-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-x64': 1.0.0-beta.43 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.43 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.43 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.43 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.43 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 rollup@4.45.1: dependencies: @@ -20061,6 +19943,15 @@ snapshots: tapable@2.3.0: {} + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + tar@7.5.1: dependencies: '@isaacs/fs-minipass': 4.0.1 @@ -20103,6 +19994,25 @@ snapshots: thunky@1.1.0: {} + tiged@2.12.7: + dependencies: + colorette: 1.2.1 + enquirer: 2.3.6 + fs-extra: 10.1.0 + fuzzysearch: 1.0.3 + https-proxy-agent: 5.0.0 + mri: 1.1.6 + rimraf: 3.0.2 + tar: 6.2.1 + tiny-glob: 0.2.8 + transitivePeerDependencies: + - supports-color + + tiny-glob@0.2.8: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + tiny-invariant@1.3.3: {} tiny-warning@1.0.3: {} @@ -20200,8 +20110,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.42 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.42)(typescript@5.9.3) + rolldown: 1.0.0-beta.43 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.9.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -20474,6 +20384,8 @@ snapshots: validate-npm-package-name@5.0.1: {} + validate-npm-package-name@6.0.2: {} + value-equal@1.0.1: {} vary@1.1.2: {} @@ -20542,7 +20454,7 @@ snapshots: vite@7.0.6(@types/node@22.18.8)(jiti@2.6.1)(lightningcss@1.30.1)(terser@5.39.2)(tsx@4.20.6)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.25.10 fdir: 6.4.6(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 @@ -20842,6 +20754,8 @@ snapshots: yallist@3.1.1: {} + yallist@4.0.0: {} + yallist@5.0.0: {} yaml@2.8.1: {}