From 3ce4f791400776bc07ed886b0a1b1979a353f40b Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Sat, 11 Oct 2025 14:59:23 +0330 Subject: [PATCH 01/24] feat(cli): add tab completions --- README.md | 12 +++++ packages/nuxi/package.json | 4 ++ packages/nuxi/src/completions.ts | 85 ++++++++++++++++++++++++++++++++ packages/nuxi/src/main.ts | 7 ++- pnpm-lock.yaml | 15 ++++++ 5 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 packages/nuxi/src/completions.ts diff --git a/README.md b/README.md index eb0c52ce1..64003d1d3 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,18 @@ All commands are listed on https://nuxt.com/docs/api/commands. +## Shell Autocompletions + +Nuxi now supports shell autocompletions for `zsh`, `bash`, `fish`, and `powershell`, powered by [`@bomb.sh/tab`](https://github.com/bombshell-dev/tab). + +For permanent setup in zsh, add this to your `~/.zshrc`: + +```bash +source <(vitest complete zsh) +# same can be done for other shells +``` +For more information, see [bomb.sh/tab](https://bomb.sh/docs/tab/). + ## Contributing ```bash diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 4bbbb0309..afae9b135 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -79,5 +79,9 @@ "unplugin-purge-polyfills": "^0.1.0", "vitest": "^3.2.4", "youch": "^4.1.0-beta.11" + }, + "dependencies": { + "@bomb.sh/tab": "^0.0.4", + "nuxi": "3.16.0" } } diff --git a/packages/nuxi/src/completions.ts b/packages/nuxi/src/completions.ts new file mode 100644 index 000000000..126675f6b --- /dev/null +++ b/packages/nuxi/src/completions.ts @@ -0,0 +1,85 @@ +import type { CommandDef } from 'citty' +import tab from '@bomb.sh/tab/citty' + +export async function initCompletions(command: CommandDef) { + const completion = await tab(command as any) + + const devCommand = completion.commands.get('dev') + if (devCommand) { + const portOption = devCommand.options.get('port') + if (portOption) { + portOption.handler = (complete) => { + complete('3000', 'Default development port') + complete('3001', 'Alternative port') + complete('8080', 'Common alternative port') + } + } + + const hostOption = devCommand.options.get('host') + if (hostOption) { + hostOption.handler = (complete) => { + complete('localhost', 'Local development') + complete('0.0.0.0', 'Listen on all interfaces') + complete('127.0.0.1', 'Loopback address') + } + } + } + + const buildCommand = completion.commands.get('build') + if (buildCommand) { + const presetOption = buildCommand.options.get('preset') + if (presetOption) { + presetOption.handler = (complete) => { + complete('node-server', 'Node.js server') + complete('static', 'Static hosting') + complete('cloudflare-pages', 'Cloudflare Pages') + complete('vercel', 'Vercel') + complete('netlify', 'Netlify') + complete('aws-lambda', 'AWS Lambda') + complete('azure', 'Azure') + complete('firebase', 'Firebase') + complete('deno-deploy', 'Deno Deploy') + complete('bun', 'Bun runtime') + } + } + } + + const initCommand = completion.commands.get('init') + if (initCommand) { + const templateOption = initCommand.options.get('template') + if (templateOption) { + templateOption.handler = (complete) => { + complete('v3', 'Nuxt 3 template') + complete('v4', 'Nuxt 4 template') + } + } + } + + const addCommand = completion.commands.get('add') + if (addCommand) { + const cwdOption = addCommand.options.get('cwd') + if (cwdOption) { + cwdOption.handler = (complete) => { + complete('.', 'Current directory') + } + } + } + + const logLevelCommands = ['dev', 'build', 'generate', 'preview', 'prepare'] + for (const cmdName of logLevelCommands) { + const cmd = completion.commands.get(cmdName) + if (cmd) { + const logLevelOption = cmd.options.get('logLevel') + if (logLevelOption) { + logLevelOption.handler = (complete) => { + complete('silent', 'No logs') + complete('info', 'Standard logging') + complete('verbose', 'Detailed logging') + } + } + } + } + + return completion +} + diff --git a/packages/nuxi/src/main.ts b/packages/nuxi/src/main.ts index 995ef52b4..77e86b3a4 100644 --- a/packages/nuxi/src/main.ts +++ b/packages/nuxi/src/main.ts @@ -84,4 +84,9 @@ export const main = defineCommand({ }, }) -export const runMain = () => _runMain(main) +export const runMain = async () => { + const { initCompletions } = await import('./completions') + await initCompletions(main as any) + + return _runMain(main) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 373f25c38..c67ac4835 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,6 +106,13 @@ importers: version: link:../create-nuxt packages/nuxi: + dependencies: + '@bomb.sh/tab': + specifier: ^0.0.4 + version: 0.0.4 + nuxi: + specifier: workspace:* + version: 'link:' devDependencies: '@nuxt/kit': specifier: ^4.1.3 @@ -553,6 +560,10 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} + '@bomb.sh/tab@0.0.4': + resolution: {integrity: sha512-iIMFJRK1dVjcqYMevdiXZLGnUBThD4MSe+vVW6V/mlNTWcr1dXRstQsrb7i9O2SdXjVfJZpJB+Ac7u7KR/M4Mg==} + hasBin: true + '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -5880,6 +5891,10 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} + '@bomb.sh/tab@0.0.4': + dependencies: + mri: 1.2.0 + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 From 447e1a38d209d3eddf325f6c76f05756e68512ab Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Mon, 13 Oct 2025 12:18:25 +0330 Subject: [PATCH 02/24] readme --- README.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 64003d1d3..b60c32ab3 100644 --- a/README.md +++ b/README.md @@ -8,15 +8,30 @@ All commands are listed on https://nuxt.com/docs/api/commands. ## Shell Autocompletions -Nuxi now supports shell autocompletions for `zsh`, `bash`, `fish`, and `powershell`, powered by [`@bomb.sh/tab`](https://github.com/bombshell-dev/tab). +Nuxi provides shell autocompletions for commands, options, and option values powered by [`@bomb.sh/tab`](https://github.com/bombshell-dev/tab). + +### Setup For permanent setup in zsh, add this to your `~/.zshrc`: ```bash -source <(vitest complete zsh) -# same can be done for other shells +# Add to ~/.zshrc for permanent autocompletions (same can be done for other shells) +source <(nuxi complete zsh) ``` -For more information, see [bomb.sh/tab](https://bomb.sh/docs/tab/). + +### Package Manager Integration + +`@bomb.sh/tab` integrates with [package managers](https://github.com/bombshell-dev/tab?tab=readme-ov-file#package-manager-completions). Autocompletions work when running nuxi directly: + +```bash +npx nuxi +npm exec nuxi +pnpm nuxi +yarn nuxi +bun nuxi +``` + +For package manager autocompletions, you should install [tab's package manager completions](https://github.com/bombshell-dev/tab?tab=readme-ov-file#package-manager-completions) separately. ## Contributing From 0461d5c7fda8da3a34cb80c46774afb8c62bfb7e Mon Sep 17 00:00:00 2001 From: "autofix-ci[bot]" <114827586+autofix-ci[bot]@users.noreply.github.com> Date: Mon, 13 Oct 2025 08:52:53 +0000 Subject: [PATCH 03/24] [autofix.ci] apply automated fixes --- packages/nuxi/package.json | 8 +- packages/nuxi/src/completions.ts | 133 +++++++++++++++---------------- packages/nuxi/src/main.ts | 2 +- 3 files changed, 71 insertions(+), 72 deletions(-) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index afae9b135..3abb7a07d 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -38,6 +38,10 @@ "prepack": "unbuild", "test:dist": "node ./bin/nuxi.mjs info ./playground" }, + "dependencies": { + "@bomb.sh/tab": "^0.0.4", + "nuxi": "3.16.0" + }, "devDependencies": { "@nuxt/kit": "^4.1.3", "@nuxt/schema": "^4.1.3", @@ -79,9 +83,5 @@ "unplugin-purge-polyfills": "^0.1.0", "vitest": "^3.2.4", "youch": "^4.1.0-beta.11" - }, - "dependencies": { - "@bomb.sh/tab": "^0.0.4", - "nuxi": "3.16.0" } } diff --git a/packages/nuxi/src/completions.ts b/packages/nuxi/src/completions.ts index 126675f6b..f400c0344 100644 --- a/packages/nuxi/src/completions.ts +++ b/packages/nuxi/src/completions.ts @@ -2,84 +2,83 @@ import type { CommandDef } from 'citty' import tab from '@bomb.sh/tab/citty' export async function initCompletions(command: CommandDef) { - const completion = await tab(command as any) + const completion = await tab(command as any) - const devCommand = completion.commands.get('dev') - if (devCommand) { - const portOption = devCommand.options.get('port') - if (portOption) { - portOption.handler = (complete) => { - complete('3000', 'Default development port') - complete('3001', 'Alternative port') - complete('8080', 'Common alternative port') - } - } + const devCommand = completion.commands.get('dev') + if (devCommand) { + const portOption = devCommand.options.get('port') + if (portOption) { + portOption.handler = (complete) => { + complete('3000', 'Default development port') + complete('3001', 'Alternative port') + complete('8080', 'Common alternative port') + } + } - const hostOption = devCommand.options.get('host') - if (hostOption) { - hostOption.handler = (complete) => { - complete('localhost', 'Local development') - complete('0.0.0.0', 'Listen on all interfaces') - complete('127.0.0.1', 'Loopback address') - } - } + const hostOption = devCommand.options.get('host') + if (hostOption) { + hostOption.handler = (complete) => { + complete('localhost', 'Local development') + complete('0.0.0.0', 'Listen on all interfaces') + complete('127.0.0.1', 'Loopback address') + } } + } - const buildCommand = completion.commands.get('build') - if (buildCommand) { - const presetOption = buildCommand.options.get('preset') - if (presetOption) { - presetOption.handler = (complete) => { - complete('node-server', 'Node.js server') - complete('static', 'Static hosting') - complete('cloudflare-pages', 'Cloudflare Pages') - complete('vercel', 'Vercel') - complete('netlify', 'Netlify') - complete('aws-lambda', 'AWS Lambda') - complete('azure', 'Azure') - complete('firebase', 'Firebase') - complete('deno-deploy', 'Deno Deploy') - complete('bun', 'Bun runtime') - } - } + const buildCommand = completion.commands.get('build') + if (buildCommand) { + const presetOption = buildCommand.options.get('preset') + if (presetOption) { + presetOption.handler = (complete) => { + complete('node-server', 'Node.js server') + complete('static', 'Static hosting') + complete('cloudflare-pages', 'Cloudflare Pages') + complete('vercel', 'Vercel') + complete('netlify', 'Netlify') + complete('aws-lambda', 'AWS Lambda') + complete('azure', 'Azure') + complete('firebase', 'Firebase') + complete('deno-deploy', 'Deno Deploy') + complete('bun', 'Bun runtime') + } } + } - const initCommand = completion.commands.get('init') - if (initCommand) { - const templateOption = initCommand.options.get('template') - if (templateOption) { - templateOption.handler = (complete) => { - complete('v3', 'Nuxt 3 template') - complete('v4', 'Nuxt 4 template') - } - } + const initCommand = completion.commands.get('init') + if (initCommand) { + const templateOption = initCommand.options.get('template') + if (templateOption) { + templateOption.handler = (complete) => { + complete('v3', 'Nuxt 3 template') + complete('v4', 'Nuxt 4 template') + } } + } - const addCommand = completion.commands.get('add') - if (addCommand) { - const cwdOption = addCommand.options.get('cwd') - if (cwdOption) { - cwdOption.handler = (complete) => { - complete('.', 'Current directory') - } - } + const addCommand = completion.commands.get('add') + if (addCommand) { + const cwdOption = addCommand.options.get('cwd') + if (cwdOption) { + cwdOption.handler = (complete) => { + complete('.', 'Current directory') + } } + } - const logLevelCommands = ['dev', 'build', 'generate', 'preview', 'prepare'] - for (const cmdName of logLevelCommands) { - const cmd = completion.commands.get(cmdName) - if (cmd) { - const logLevelOption = cmd.options.get('logLevel') - if (logLevelOption) { - logLevelOption.handler = (complete) => { - complete('silent', 'No logs') - complete('info', 'Standard logging') - complete('verbose', 'Detailed logging') - } - } + const logLevelCommands = ['dev', 'build', 'generate', 'preview', 'prepare'] + for (const cmdName of logLevelCommands) { + const cmd = completion.commands.get(cmdName) + if (cmd) { + const logLevelOption = cmd.options.get('logLevel') + if (logLevelOption) { + logLevelOption.handler = (complete) => { + complete('silent', 'No logs') + complete('info', 'Standard logging') + complete('verbose', 'Detailed logging') } + } } + } - return completion + return completion } - diff --git a/packages/nuxi/src/main.ts b/packages/nuxi/src/main.ts index 77e86b3a4..f9894e3f3 100644 --- a/packages/nuxi/src/main.ts +++ b/packages/nuxi/src/main.ts @@ -84,7 +84,7 @@ export const main = defineCommand({ }, }) -export const runMain = async () => { +export async function runMain() { const { initCompletions } = await import('./completions') await initCompletions(main as any) From 394e3bc5ec9345747ba08a22ef0f771275dc93a4 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Mon, 13 Oct 2025 12:26:08 +0330 Subject: [PATCH 04/24] update --- packages/nuxi/package.json | 9 +++------ pnpm-lock.yaml | 6 +----- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 3abb7a07d..9b6f91d88 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -38,13 +38,10 @@ "prepack": "unbuild", "test:dist": "node ./bin/nuxi.mjs info ./playground" }, - "dependencies": { - "@bomb.sh/tab": "^0.0.4", - "nuxi": "3.16.0" - }, "devDependencies": { - "@nuxt/kit": "^4.1.3", - "@nuxt/schema": "^4.1.3", + "@bomb.sh/tab": "^0.0.4", + "@nuxt/kit": "^4.1.2", + "@nuxt/schema": "^4.1.2", "@nuxt/test-utils": "^3.19.2", "@types/node": "^22.18.10", "@types/semver": "^7.7.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c67ac4835..ba553da14 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -106,14 +106,10 @@ importers: version: link:../create-nuxt packages/nuxi: - dependencies: + devDependencies: '@bomb.sh/tab': specifier: ^0.0.4 version: 0.0.4 - nuxi: - specifier: workspace:* - version: 'link:' - devDependencies: '@nuxt/kit': specifier: ^4.1.3 version: 4.1.3(magicast@0.3.5) From 2bf2b6cb549e955e952a7ceedbeb6163738fd6d6 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Mon, 13 Oct 2025 12:27:46 +0330 Subject: [PATCH 05/24] bombshell v0.0.5 --- packages/nuxi/package.json | 2 +- pnpm-lock.yaml | 24 +++++++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 9b6f91d88..7f0383d10 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -39,7 +39,7 @@ "test:dist": "node ./bin/nuxi.mjs info ./playground" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.4", + "@bomb.sh/tab": "^0.0.5", "@nuxt/kit": "^4.1.2", "@nuxt/schema": "^4.1.2", "@nuxt/test-utils": "^3.19.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ba553da14..fd6561ae6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -108,8 +108,8 @@ importers: packages/nuxi: devDependencies: '@bomb.sh/tab': - specifier: ^0.0.4 - version: 0.0.4 + specifier: ^0.0.5 + version: 0.0.5(cac@6.7.14)(citty@0.1.6) '@nuxt/kit': specifier: ^4.1.3 version: 4.1.3(magicast@0.3.5) @@ -556,9 +556,20 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@bomb.sh/tab@0.0.4': - resolution: {integrity: sha512-iIMFJRK1dVjcqYMevdiXZLGnUBThD4MSe+vVW6V/mlNTWcr1dXRstQsrb7i9O2SdXjVfJZpJB+Ac7u7KR/M4Mg==} + '@bomb.sh/tab@0.0.5': + resolution: {integrity: sha512-S0dAhnulM/q284LkmBT7ykITbRvnog8a/3nuVi4Iy0VhyfkTZcB0bXB5pltmINyL+OjAfYd9TQeOge+CYk/l1w==} hasBin: true + peerDependencies: + cac: ^6.7.14 + citty: ^0.1.6 + commander: ^13.1.0 + peerDependenciesMeta: + cac: + optional: true + citty: + optional: true + commander: + optional: true '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -5887,9 +5898,12 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@bomb.sh/tab@0.0.4': + '@bomb.sh/tab@0.0.5(cac@6.7.14)(citty@0.1.6)': dependencies: mri: 1.2.0 + optionalDependencies: + cac: 6.7.14 + citty: 0.1.6 '@clack/core@0.5.0': dependencies: From 22fc13cd204c259fd86edbee9831218f55203b6d Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Mon, 13 Oct 2025 12:32:53 +0330 Subject: [PATCH 06/24] types --- packages/nuxi/src/completions.ts | 6 +++--- packages/nuxi/src/main.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/nuxi/src/completions.ts b/packages/nuxi/src/completions.ts index f400c0344..9b3738777 100644 --- a/packages/nuxi/src/completions.ts +++ b/packages/nuxi/src/completions.ts @@ -1,8 +1,8 @@ -import type { CommandDef } from 'citty' +import type { ArgsDef, CommandDef } from 'citty' import tab from '@bomb.sh/tab/citty' -export async function initCompletions(command: CommandDef) { - const completion = await tab(command as any) +export async function initCompletions(command: CommandDef) { + const completion = await tab(command) const devCommand = completion.commands.get('dev') if (devCommand) { diff --git a/packages/nuxi/src/main.ts b/packages/nuxi/src/main.ts index f9894e3f3..95f4d81ea 100644 --- a/packages/nuxi/src/main.ts +++ b/packages/nuxi/src/main.ts @@ -9,6 +9,7 @@ import { provider } from 'std-env' import { description, name, version } from '../package.json' import { commands } from './commands' import { cwdArgs } from './commands/_shared' +import { initCompletions } from './completions' import { setupGlobalConsole } from './utils/console' import { checkEngines } from './utils/engines' import { logger } from './utils/logger' @@ -85,8 +86,7 @@ export const main = defineCommand({ }) export async function runMain() { - const { initCompletions } = await import('./completions') - await initCompletions(main as any) + await initCompletions(main) return _runMain(main) } From 8877baa21fc3e8513217b09ca0c234af7c8c3c72 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Mon, 13 Oct 2025 12:40:20 +0330 Subject: [PATCH 07/24] update --- packages/nuxi/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 7f0383d10..e0a604e48 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -40,8 +40,8 @@ }, "devDependencies": { "@bomb.sh/tab": "^0.0.5", - "@nuxt/kit": "^4.1.2", - "@nuxt/schema": "^4.1.2", + "@nuxt/kit": "^4.1.3", + "@nuxt/schema": "^4.1.3", "@nuxt/test-utils": "^3.19.2", "@types/node": "^22.18.10", "@types/semver": "^7.7.1", From 81e36cfcd5faafbc7fe217a153d24233bf514d4a Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Fri, 17 Oct 2025 14:27:45 +0330 Subject: [PATCH 08/24] updates --- README.md | 13 ++-- packages/create-nuxt/package.json | 1 + packages/create-nuxt/src/main.ts | 8 +++ packages/nuxi/package.json | 5 +- .../nuxi/scripts/generate-completions-data.ts | 70 +++++++++++++++++++ packages/nuxi/src/completions-data.ts | 69 ++++++++++++++++++ packages/nuxi/src/completions-init.ts | 28 ++++++++ packages/nuxi/src/completions.ts | 21 +++--- packages/nuxt-cli/package.json | 1 + packages/nuxt-cli/src/run.ts | 6 +- pnpm-lock.yaml | 18 +++-- 11 files changed, 210 insertions(+), 30 deletions(-) create mode 100644 packages/nuxi/scripts/generate-completions-data.ts create mode 100644 packages/nuxi/src/completions-data.ts create mode 100644 packages/nuxi/src/completions-init.ts diff --git a/README.md b/README.md index b60c32ab3..d7be98c2d 100644 --- a/README.md +++ b/README.md @@ -16,19 +16,18 @@ For permanent setup in zsh, add this to your `~/.zshrc`: ```bash # Add to ~/.zshrc for permanent autocompletions (same can be done for other shells) -source <(nuxi complete zsh) +source <(nuxt complete zsh) ``` ### Package Manager Integration -`@bomb.sh/tab` integrates with [package managers](https://github.com/bombshell-dev/tab?tab=readme-ov-file#package-manager-completions). Autocompletions work when running nuxi directly: +`@bomb.sh/tab` integrates with [package managers](https://github.com/bombshell-dev/tab?tab=readme-ov-file#package-manager-completions). Autocompletions work when running `nuxt` directly within a Nuxt project: ```bash -npx nuxi -npm exec nuxi -pnpm nuxi -yarn nuxi -bun nuxi +pnpm nuxt +npm run nuxt +yarn nuxt +bun nuxt ``` For package manager autocompletions, you should install [tab's package manager completions](https://github.com/bombshell-dev/tab?tab=readme-ov-file#package-manager-completions) separately. diff --git a/packages/create-nuxt/package.json b/packages/create-nuxt/package.json index 4459afe51..31e655717 100644 --- a/packages/create-nuxt/package.json +++ b/packages/create-nuxt/package.json @@ -33,6 +33,7 @@ "citty": "^0.1.6" }, "devDependencies": { + "@bomb.sh/tab": "^0.0.6", "@types/node": "^22.18.10", "rollup": "^4.52.4", "rollup-plugin-visualizer": "^6.0.4", diff --git a/packages/create-nuxt/src/main.ts b/packages/create-nuxt/src/main.ts index 0d0956ab6..5cc2b2af4 100644 --- a/packages/create-nuxt/src/main.ts +++ b/packages/create-nuxt/src/main.ts @@ -2,6 +2,7 @@ import { defineCommand } from 'citty' import { provider } from 'std-env' import init from '../../nuxi/src/commands/init' +import { setupInitCompletions } from '../../nuxi/src/completions-init' import { setupGlobalConsole } from '../../nuxi/src/utils/console' import { checkEngines } from '../../nuxi/src/utils/engines' import { logger } from '../../nuxi/src/utils/logger' @@ -15,6 +16,11 @@ export const main = defineCommand({ }, args: init.args, async setup(ctx) { + const isCompletionRequest = ctx.args._?.[0] === 'complete' + if (isCompletionRequest) { + return + } + setupGlobalConsole({ dev: false }) // Check Node.js version and CLI updates in background @@ -25,3 +31,5 @@ export const main = defineCommand({ await init.run?.(ctx) }, }) + +await setupInitCompletions(main) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index e0a604e48..d1dcaa800 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -29,17 +29,18 @@ }, "scripts": { "dev:prepare": "unbuild --stub", - "build": "unbuild", + "build": "pnpm generate:completions-data && unbuild", "build:stub": "unbuild --stub", "dev": "node ./bin/nuxi.mjs dev ./playground", "dev:bun": "bun --bun ./bin/nuxi.mjs dev ./playground", + "generate:completions-data": "tsx ./scripts/generate-completions-data.ts", "nuxi": "node ./bin/nuxi.mjs", "nuxi-bun": "bun --bun ./bin/nuxi.mjs", "prepack": "unbuild", "test:dist": "node ./bin/nuxi.mjs info ./playground" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.5", + "@bomb.sh/tab": "^0.0.6", "@nuxt/kit": "^4.1.3", "@nuxt/schema": "^4.1.3", "@nuxt/test-utils": "^3.19.2", diff --git a/packages/nuxi/scripts/generate-completions-data.ts b/packages/nuxi/scripts/generate-completions-data.ts new file mode 100644 index 000000000..5bb36daa0 --- /dev/null +++ b/packages/nuxi/scripts/generate-completions-data.ts @@ -0,0 +1,70 @@ +/** generate completion data from nitropack and Nuxt starter repo */ + +import { writeFile } from 'node:fs/promises' +import { fileURLToPath } from 'node:url' +import { dirname, resolve } from 'node:path' +// @ts-expect-error: internal nitropack file +import allPresets from '../node_modules/nitropack/dist/presets/_all.gen.mjs' + +const __dirname = dirname(fileURLToPath(import.meta.url)) + +interface PresetMeta { + _meta?: { name: string } +} + +async function generateCompletionData() { + const data: { + nitroPresets: string[] + templates: string[] + } = { + nitroPresets: [], + templates: [], + } + + data.nitroPresets = (allPresets as PresetMeta[]) + .map(preset => preset._meta?.name) + .filter((name): name is string => Boolean(name)) + .filter(name => !['base-worker', 'nitro-dev', 'nitro-prerender'].includes(name)) + .filter((name, index, array) => array.indexOf(name) === index) + .sort() + + const response = await fetch( + 'https://api.github.com/repos/nuxt/starter/contents/templates?ref=templates' + ) + + if (!response.ok) { + throw new Error(`GitHub API error: ${response.status}`) + } + + const files = await response.json() as Array<{ name: string; type: string }> + + const templateEntries = files + .filter(file => { + if (file.type === 'dir') return true + if (file.type === 'file' && file.name.endsWith('.json') && file.name !== 'content.json') { + return true + } + return false + }) + .map(file => file.name.replace('.json', '')) + + data.templates = Array.from(new Set(templateEntries)) + .filter(name => name !== 'community') + .sort() + + const outputPath = resolve(__dirname, '../src/completions-data.ts') + const content = `/** Auto-generated file */ + +export const nitroPresets = ${JSON.stringify(data.nitroPresets, null, 2)} as const + +export const templates = ${JSON.stringify(data.templates, null, 2)} as const +` + + await writeFile(outputPath, content, 'utf-8') +} + +generateCompletionData().catch((error) => { + console.error('Failed to generate completion data:', error) + process.exit(1) +}) + diff --git a/packages/nuxi/src/completions-data.ts b/packages/nuxi/src/completions-data.ts new file mode 100644 index 000000000..67f041e8b --- /dev/null +++ b/packages/nuxi/src/completions-data.ts @@ -0,0 +1,69 @@ +/** Auto-generated file */ + +export const nitroPresets = [ + "alwaysdata", + "aws-amplify", + "aws-lambda", + "azure-functions", + "azure-swa", + "bun", + "cleavr", + "cli", + "cloudflare-dev", + "cloudflare-durable", + "cloudflare-module", + "cloudflare-module-legacy", + "cloudflare-pages", + "cloudflare-pages-static", + "cloudflare-worker", + "deno-deploy", + "deno-server", + "deno-server-legacy", + "digital-ocean", + "edgio", + "firebase", + "firebase-app-hosting", + "flight-control", + "genezio", + "github-pages", + "gitlab-pages", + "heroku", + "iis-handler", + "iis-node", + "koyeb", + "netlify", + "netlify-builder", + "netlify-edge", + "netlify-legacy", + "netlify-static", + "node-cluster", + "node-listener", + "node-server", + "platform-sh", + "render-com", + "service-worker", + "static", + "stormkit", + "vercel", + "vercel-edge", + "vercel-static", + "winterjs", + "zeabur", + "zeabur-static", + "zerops", + "zerops-static" +] as const + +export const templates = [ + "doc-driven", + "hub", + "layer", + "module", + "module-devtools", + "ui", + "ui-vue", + "v2-bridge", + "v3", + "v4", + "v4-compat" +] as const diff --git a/packages/nuxi/src/completions-init.ts b/packages/nuxi/src/completions-init.ts new file mode 100644 index 000000000..167b1113a --- /dev/null +++ b/packages/nuxi/src/completions-init.ts @@ -0,0 +1,28 @@ +import type { ArgsDef, CommandDef } from 'citty' +import tab from '@bomb.sh/tab/citty' +import { templates } from './completions-data' + +export async function setupInitCompletions(command: CommandDef) { + const completion = await tab(command) + + const templateOption = completion.options?.get('template') + if (templateOption) { + templateOption.handler = (complete) => { + for (const template of templates) { + complete(template, '') + } + } + } + + const logLevelOption = completion.options?.get('logLevel') + if (logLevelOption) { + logLevelOption.handler = (complete) => { + complete('silent', 'No logs') + complete('info', 'Standard logging') + complete('verbose', 'Detailed logging') + } + } + + return completion +} + diff --git a/packages/nuxi/src/completions.ts b/packages/nuxi/src/completions.ts index 9b3738777..d60fb7e06 100644 --- a/packages/nuxi/src/completions.ts +++ b/packages/nuxi/src/completions.ts @@ -1,5 +1,6 @@ import type { ArgsDef, CommandDef } from 'citty' import tab from '@bomb.sh/tab/citty' +import { nitroPresets, templates } from './completions-data' export async function initCompletions(command: CommandDef) { const completion = await tab(command) @@ -30,16 +31,9 @@ export async function initCompletions(command: Comm const presetOption = buildCommand.options.get('preset') if (presetOption) { presetOption.handler = (complete) => { - complete('node-server', 'Node.js server') - complete('static', 'Static hosting') - complete('cloudflare-pages', 'Cloudflare Pages') - complete('vercel', 'Vercel') - complete('netlify', 'Netlify') - complete('aws-lambda', 'AWS Lambda') - complete('azure', 'Azure') - complete('firebase', 'Firebase') - complete('deno-deploy', 'Deno Deploy') - complete('bun', 'Bun runtime') + for (const preset of nitroPresets) { + complete(preset, '') + } } } } @@ -49,8 +43,9 @@ export async function initCompletions(command: Comm const templateOption = initCommand.options.get('template') if (templateOption) { templateOption.handler = (complete) => { - complete('v3', 'Nuxt 3 template') - complete('v4', 'Nuxt 4 template') + for (const template of templates) { + complete(template, '') + } } } } @@ -65,7 +60,7 @@ export async function initCompletions(command: Comm } } - const logLevelCommands = ['dev', 'build', 'generate', 'preview', 'prepare'] + const logLevelCommands = ['dev', 'build', 'generate', 'preview', 'prepare', 'init'] for (const cmdName of logLevelCommands) { const cmd = completion.commands.get(cmdName) if (cmd) { diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index fe3a5e217..49af8ebd5 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -33,6 +33,7 @@ "prepack": "unbuild" }, "dependencies": { + "@bomb.sh/tab": "^0.0.6", "c12": "^3.3.0", "citty": "^0.1.6", "clipboardy": "^5.0.0", diff --git a/packages/nuxt-cli/src/run.ts b/packages/nuxt-cli/src/run.ts index 5610b6f56..2807430b2 100644 --- a/packages/nuxt-cli/src/run.ts +++ b/packages/nuxt-cli/src/run.ts @@ -4,6 +4,7 @@ import { fileURLToPath } from 'node:url' import { runCommand as _runCommand, runMain as _runMain } from 'citty' import { commands } from '../../nuxi/src/commands' +import { initCompletions } from '../../nuxi/src/completions' import { main } from './main' globalThis.__nuxt_cli__ = globalThis.__nuxt_cli__ || { @@ -17,7 +18,10 @@ globalThis.__nuxt_cli__ = globalThis.__nuxt_cli__ || { ), } -export const runMain = () => _runMain(main) +export const runMain = async () => { + await initCompletions(main) + return _runMain(main) +} export async function runCommand( name: string, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fd6561ae6..3791ed53b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,6 +80,9 @@ importers: specifier: ^0.1.6 version: 0.1.6 devDependencies: + '@bomb.sh/tab': + specifier: ^0.0.6 + version: 0.0.6(cac@6.7.14)(citty@0.1.6) '@types/node': specifier: ^22.18.10 version: 22.18.10 @@ -108,8 +111,8 @@ importers: packages/nuxi: devDependencies: '@bomb.sh/tab': - specifier: ^0.0.5 - version: 0.0.5(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.6 + version: 0.0.6(cac@6.7.14)(citty@0.1.6) '@nuxt/kit': specifier: ^4.1.3 version: 4.1.3(magicast@0.3.5) @@ -233,6 +236,9 @@ importers: packages/nuxt-cli: dependencies: + '@bomb.sh/tab': + specifier: ^0.0.6 + version: 0.0.6(cac@6.7.14)(citty@0.1.6) c12: specifier: ^3.3.0 version: 3.3.0(magicast@0.3.5) @@ -556,8 +562,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@bomb.sh/tab@0.0.5': - resolution: {integrity: sha512-S0dAhnulM/q284LkmBT7ykITbRvnog8a/3nuVi4Iy0VhyfkTZcB0bXB5pltmINyL+OjAfYd9TQeOge+CYk/l1w==} + '@bomb.sh/tab@0.0.6': + resolution: {integrity: sha512-EK9Ssulo5Ju/N8o9qV35MTA7F5210ehEoHvWzBxtiHrpUEmGk7NYeW0E8BH0scR6BbzdxjDQqHLK4PK/ifjREw==} hasBin: true peerDependencies: cac: ^6.7.14 @@ -5898,9 +5904,7 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@bomb.sh/tab@0.0.5(cac@6.7.14)(citty@0.1.6)': - dependencies: - mri: 1.2.0 + '@bomb.sh/tab@0.0.6(cac@6.7.14)(citty@0.1.6)': optionalDependencies: cac: 6.7.14 citty: 0.1.6 From d1babb44cee3960acf9bc0e124280de31123307b Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Fri, 17 Oct 2025 14:38:56 +0330 Subject: [PATCH 09/24] use node module resolution --- packages/nuxi/scripts/generate-completions-data.ts | 14 +++++++++----- packages/nuxi/src/completions-init.ts | 2 +- packages/nuxi/src/completions.ts | 2 +- packages/nuxi/src/{ => utils}/completions-data.ts | 0 4 files changed, 11 insertions(+), 7 deletions(-) rename packages/nuxi/src/{ => utils}/completions-data.ts (100%) diff --git a/packages/nuxi/scripts/generate-completions-data.ts b/packages/nuxi/scripts/generate-completions-data.ts index 5bb36daa0..a3d7be039 100644 --- a/packages/nuxi/scripts/generate-completions-data.ts +++ b/packages/nuxi/scripts/generate-completions-data.ts @@ -1,11 +1,11 @@ /** generate completion data from nitropack and Nuxt starter repo */ import { writeFile } from 'node:fs/promises' +import { createRequire } from 'node:module' import { fileURLToPath } from 'node:url' -import { dirname, resolve } from 'node:path' -// @ts-expect-error: internal nitropack file -import allPresets from '../node_modules/nitropack/dist/presets/_all.gen.mjs' +import { dirname, join, resolve } from 'node:path' +const require = createRequire(import.meta.url) const __dirname = dirname(fileURLToPath(import.meta.url)) interface PresetMeta { @@ -21,7 +21,11 @@ async function generateCompletionData() { templates: [], } - data.nitroPresets = (allPresets as PresetMeta[]) + const nitropackPath = dirname(require.resolve('nitropack/package.json')) + const presetsPath = join(nitropackPath, 'dist/presets/_all.gen.mjs') + const { default: allPresets } = await import(presetsPath) as { default: PresetMeta[] } + + data.nitroPresets = allPresets .map(preset => preset._meta?.name) .filter((name): name is string => Boolean(name)) .filter(name => !['base-worker', 'nitro-dev', 'nitro-prerender'].includes(name)) @@ -52,7 +56,7 @@ async function generateCompletionData() { .filter(name => name !== 'community') .sort() - const outputPath = resolve(__dirname, '../src/completions-data.ts') + const outputPath = resolve(__dirname, '../src/utils/completions-data.ts') const content = `/** Auto-generated file */ export const nitroPresets = ${JSON.stringify(data.nitroPresets, null, 2)} as const diff --git a/packages/nuxi/src/completions-init.ts b/packages/nuxi/src/completions-init.ts index 167b1113a..2aac80d93 100644 --- a/packages/nuxi/src/completions-init.ts +++ b/packages/nuxi/src/completions-init.ts @@ -1,6 +1,6 @@ import type { ArgsDef, CommandDef } from 'citty' import tab from '@bomb.sh/tab/citty' -import { templates } from './completions-data' +import { templates } from './utils/completions-data' export async function setupInitCompletions(command: CommandDef) { const completion = await tab(command) diff --git a/packages/nuxi/src/completions.ts b/packages/nuxi/src/completions.ts index d60fb7e06..f593b0320 100644 --- a/packages/nuxi/src/completions.ts +++ b/packages/nuxi/src/completions.ts @@ -1,6 +1,6 @@ import type { ArgsDef, CommandDef } from 'citty' import tab from '@bomb.sh/tab/citty' -import { nitroPresets, templates } from './completions-data' +import { nitroPresets, templates } from './utils/completions-data' export async function initCompletions(command: CommandDef) { const completion = await tab(command) diff --git a/packages/nuxi/src/completions-data.ts b/packages/nuxi/src/utils/completions-data.ts similarity index 100% rename from packages/nuxi/src/completions-data.ts rename to packages/nuxi/src/utils/completions-data.ts From 22524722e80c3bd7ea124b97a0a2d9de9959659d Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 23 Oct 2025 12:39:08 +0900 Subject: [PATCH 10/24] refactor: use native node to run completions data --- packages/nuxi/package.json | 2 +- .../nuxi/scripts/generate-completions-data.ts | 103 +++++++++--------- 2 files changed, 53 insertions(+), 52 deletions(-) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index d479dbe1d..191fcff5d 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -30,7 +30,7 @@ "scripts": { "build": "pnpm generate:completions-data && tsdown", "prepack": "pnpm build", - "generate:completions-data": "tsx ./scripts/generate-completions-data.ts" + "generate:completions-data": "node ./scripts/generate-completions-data.ts" }, "devDependencies": { "@bomb.sh/tab": "^0.0.6", diff --git a/packages/nuxi/scripts/generate-completions-data.ts b/packages/nuxi/scripts/generate-completions-data.ts index a3d7be039..a6fe47bd0 100644 --- a/packages/nuxi/scripts/generate-completions-data.ts +++ b/packages/nuxi/scripts/generate-completions-data.ts @@ -2,73 +2,74 @@ import { writeFile } from 'node:fs/promises' import { createRequire } from 'node:module' -import { fileURLToPath } from 'node:url' import { dirname, join, resolve } from 'node:path' +import process from 'node:process' +import { fileURLToPath } from 'node:url' const require = createRequire(import.meta.url) const __dirname = dirname(fileURLToPath(import.meta.url)) interface PresetMeta { - _meta?: { name: string } + _meta?: { name: string } } async function generateCompletionData() { - const data: { - nitroPresets: string[] - templates: string[] - } = { - nitroPresets: [], - templates: [], - } - - const nitropackPath = dirname(require.resolve('nitropack/package.json')) - const presetsPath = join(nitropackPath, 'dist/presets/_all.gen.mjs') - const { default: allPresets } = await import(presetsPath) as { default: PresetMeta[] } - - data.nitroPresets = allPresets - .map(preset => preset._meta?.name) - .filter((name): name is string => Boolean(name)) - .filter(name => !['base-worker', 'nitro-dev', 'nitro-prerender'].includes(name)) - .filter((name, index, array) => array.indexOf(name) === index) - .sort() - - const response = await fetch( - 'https://api.github.com/repos/nuxt/starter/contents/templates?ref=templates' - ) - - if (!response.ok) { - throw new Error(`GitHub API error: ${response.status}`) - } - - const files = await response.json() as Array<{ name: string; type: string }> - - const templateEntries = files - .filter(file => { - if (file.type === 'dir') return true - if (file.type === 'file' && file.name.endsWith('.json') && file.name !== 'content.json') { - return true - } - return false - }) - .map(file => file.name.replace('.json', '')) - - data.templates = Array.from(new Set(templateEntries)) - .filter(name => name !== 'community') - .sort() - - const outputPath = resolve(__dirname, '../src/utils/completions-data.ts') - const content = `/** Auto-generated file */ + const data: { + nitroPresets: string[] + templates: string[] + } = { + nitroPresets: [], + templates: [], + } + + const nitropackPath = dirname(require.resolve('nitropack/package.json')) + const presetsPath = join(nitropackPath, 'dist/presets/_all.gen.mjs') + const { default: allPresets } = await import(presetsPath) as { default: PresetMeta[] } + + data.nitroPresets = allPresets + .map(preset => preset._meta?.name) + .filter((name): name is string => Boolean(name)) + .filter(name => !['base-worker', 'nitro-dev', 'nitro-prerender'].includes(name)) + .filter((name, index, array) => array.indexOf(name) === index) + .sort() + + const response = await fetch( + 'https://api.github.com/repos/nuxt/starter/contents/templates?ref=templates', + ) + + if (!response.ok) { + throw new Error(`GitHub API error: ${response.status}`) + } + + const files = await response.json() as Array<{ name: string, type: string }> + + const templateEntries = files + .filter((file) => { + if (file.type === 'dir') + return true + if (file.type === 'file' && file.name.endsWith('.json') && file.name !== 'content.json') { + return true + } + return false + }) + .map(file => file.name.replace('.json', '')) + + data.templates = Array.from(new Set(templateEntries)) + .filter(name => name !== 'community') + .sort() + + const outputPath = resolve(__dirname, '../src/utils/completions-data.ts') + const content = `/** Auto-generated file */ export const nitroPresets = ${JSON.stringify(data.nitroPresets, null, 2)} as const export const templates = ${JSON.stringify(data.templates, null, 2)} as const ` - await writeFile(outputPath, content, 'utf-8') + await writeFile(outputPath, content, 'utf-8') } generateCompletionData().catch((error) => { - console.error('Failed to generate completion data:', error) - process.exit(1) + console.error('Failed to generate completion data:', error) + process.exit(1) }) - From 87e58f9b38811d300fc7675c7e54789751ecad40 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Thu, 23 Oct 2025 13:15:14 +0330 Subject: [PATCH 11/24] chore: update tab to version 0.0.7 --- packages/create-nuxt/package.json | 2 +- packages/nuxi/package.json | 2 +- packages/nuxt-cli/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/create-nuxt/package.json b/packages/create-nuxt/package.json index 030cf79e8..bcbc19ee5 100644 --- a/packages/create-nuxt/package.json +++ b/packages/create-nuxt/package.json @@ -32,7 +32,7 @@ "citty": "^0.1.6" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.6", + "@bomb.sh/tab": "^0.0.7", "@types/node": "^22.18.12", "rollup": "^4.52.5", "rollup-plugin-visualizer": "^6.0.5", diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 191fcff5d..348ae6341 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -33,7 +33,7 @@ "generate:completions-data": "node ./scripts/generate-completions-data.ts" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.6", + "@bomb.sh/tab": "^0.0.7", "@nuxt/kit": "^4.1.3", "@nuxt/schema": "^4.1.3", "@nuxt/test-utils": "^3.19.2", diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index cf0583156..8a36207e4 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -33,7 +33,7 @@ "prepack": "tsdown" }, "dependencies": { - "@bomb.sh/tab": "^0.0.6", + "@bomb.sh/tab": "^0.0.7", "c12": "^3.3.1", "citty": "^0.1.6", "confbox": "^0.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 13daa1676..599c9c2e7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,8 +81,8 @@ importers: version: 0.1.6 devDependencies: '@bomb.sh/tab': - specifier: ^0.0.6 - version: 0.0.6(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.7 + version: 0.0.7(cac@6.7.14)(citty@0.1.6) '@types/node': specifier: ^22.18.12 version: 22.18.12 @@ -111,8 +111,8 @@ importers: packages/nuxi: devDependencies: '@bomb.sh/tab': - specifier: ^0.0.6 - version: 0.0.6(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.7 + version: 0.0.7(cac@6.7.14)(citty@0.1.6) '@nuxt/kit': specifier: ^4.1.3 version: 4.1.3(magicast@0.3.5) @@ -240,8 +240,8 @@ importers: packages/nuxt-cli: dependencies: '@bomb.sh/tab': - specifier: ^0.0.6 - version: 0.0.6(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.7 + version: 0.0.7(cac@6.7.14)(citty@0.1.6) c12: specifier: ^3.3.1 version: 3.3.1(magicast@0.3.5) @@ -565,8 +565,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@bomb.sh/tab@0.0.6': - resolution: {integrity: sha512-EK9Ssulo5Ju/N8o9qV35MTA7F5210ehEoHvWzBxtiHrpUEmGk7NYeW0E8BH0scR6BbzdxjDQqHLK4PK/ifjREw==} + '@bomb.sh/tab@0.0.7': + resolution: {integrity: sha512-/9fTHWWYFl0m2nmfNT9ngI8XEVCvwh7ggAkeHtQybM2CrlIWyakTjbESBpxIFjT8ckpuH3oA2ROyjxoglVtOGQ==} hasBin: true peerDependencies: cac: ^6.7.14 @@ -5619,7 +5619,7 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@bomb.sh/tab@0.0.6(cac@6.7.14)(citty@0.1.6)': + '@bomb.sh/tab@0.0.7(cac@6.7.14)(citty@0.1.6)': optionalDependencies: cac: 6.7.14 citty: 0.1.6 From 1860f10dfe8b498ff27be8792b6f1c523a33f390 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Thu, 23 Oct 2025 13:17:47 +0330 Subject: [PATCH 12/24] chore: readme --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e57b06cfe..6aaac6ddc 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ source <(nuxt complete zsh) ```bash pnpm nuxt -npm run nuxt +npm exec nuxt yarn nuxt bun nuxt ``` From d4213cd74dcbc26edf8d2b9cd5fc64c4bdd6e2a5 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:05:05 +0000 Subject: [PATCH 13/24] chore: move into build script --- packages/nuxi/package.json | 5 ++--- packages/nuxi/tsdown.config.ts | 6 ++++++ packages/nuxt-cli/tsdown.config.ts | 6 ++++++ .../generate-completions-data.ts | 16 +++------------- 4 files changed, 17 insertions(+), 16 deletions(-) rename {packages/nuxi/scripts => scripts}/generate-completions-data.ts (79%) diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 967fd33ce..85635d013 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -28,9 +28,8 @@ "node": "^16.10.0 || >=18.0.0" }, "scripts": { - "build": "pnpm generate:completions-data && tsdown", - "prepack": "pnpm build", - "generate:completions-data": "node ./scripts/generate-completions-data.ts" + "build": "tsdown", + "prepack": "pnpm build" }, "devDependencies": { "@bomb.sh/tab": "^0.0.7", diff --git a/packages/nuxi/tsdown.config.ts b/packages/nuxi/tsdown.config.ts index f1309f069..0d651df50 100644 --- a/packages/nuxi/tsdown.config.ts +++ b/packages/nuxi/tsdown.config.ts @@ -3,6 +3,7 @@ import process from 'node:process' import { visualizer } from 'rollup-plugin-visualizer' import { defineConfig } from 'tsdown' import { purgePolyfills } from 'unplugin-purge-polyfills' +import { generateCompletionData } from '../../scripts/generate-completions-data' const isAnalysingSize = process.env.BUNDLE_SIZE === 'true' @@ -12,6 +13,11 @@ export default defineConfig({ dts: !isAnalysingSize && { oxc: true, }, + hooks: { + 'build:prepare': async function () { + await generateCompletionData() + }, + }, failOnWarn: !isAnalysingSize, plugins: [ purgePolyfills.rolldown({ logLevel: 'verbose' }), diff --git a/packages/nuxt-cli/tsdown.config.ts b/packages/nuxt-cli/tsdown.config.ts index f1309f069..0d651df50 100644 --- a/packages/nuxt-cli/tsdown.config.ts +++ b/packages/nuxt-cli/tsdown.config.ts @@ -3,6 +3,7 @@ import process from 'node:process' import { visualizer } from 'rollup-plugin-visualizer' import { defineConfig } from 'tsdown' import { purgePolyfills } from 'unplugin-purge-polyfills' +import { generateCompletionData } from '../../scripts/generate-completions-data' const isAnalysingSize = process.env.BUNDLE_SIZE === 'true' @@ -12,6 +13,11 @@ export default defineConfig({ dts: !isAnalysingSize && { oxc: true, }, + hooks: { + 'build:prepare': async function () { + await generateCompletionData() + }, + }, failOnWarn: !isAnalysingSize, plugins: [ purgePolyfills.rolldown({ logLevel: 'verbose' }), diff --git a/packages/nuxi/scripts/generate-completions-data.ts b/scripts/generate-completions-data.ts similarity index 79% rename from packages/nuxi/scripts/generate-completions-data.ts rename to scripts/generate-completions-data.ts index a6fe47bd0..9351610b6 100644 --- a/packages/nuxi/scripts/generate-completions-data.ts +++ b/scripts/generate-completions-data.ts @@ -1,19 +1,14 @@ /** generate completion data from nitropack and Nuxt starter repo */ import { writeFile } from 'node:fs/promises' -import { createRequire } from 'node:module' -import { dirname, join, resolve } from 'node:path' -import process from 'node:process' +import { dirname, join } from 'node:path' import { fileURLToPath } from 'node:url' -const require = createRequire(import.meta.url) -const __dirname = dirname(fileURLToPath(import.meta.url)) - interface PresetMeta { _meta?: { name: string } } -async function generateCompletionData() { +export async function generateCompletionData() { const data: { nitroPresets: string[] templates: string[] @@ -58,7 +53,7 @@ async function generateCompletionData() { .filter(name => name !== 'community') .sort() - const outputPath = resolve(__dirname, '../src/utils/completions-data.ts') + const outputPath = fileURLToPath(new URL('../packages/nuxi/src/utils/completions-data.ts', import.meta.url)) const content = `/** Auto-generated file */ export const nitroPresets = ${JSON.stringify(data.nitroPresets, null, 2)} as const @@ -68,8 +63,3 @@ export const templates = ${JSON.stringify(data.templates, null, 2)} as const await writeFile(outputPath, content, 'utf-8') } - -generateCompletionData().catch((error) => { - console.error('Failed to generate completion data:', error) - process.exit(1) -}) From d64d259d0fe0b9aedb9513df9fdfb30fc03dc23d Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:06:50 +0000 Subject: [PATCH 14/24] chore: suppress lint --- packages/create-nuxt/src/main.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/create-nuxt/src/main.ts b/packages/create-nuxt/src/main.ts index e709a8252..b3f3b964b 100644 --- a/packages/create-nuxt/src/main.ts +++ b/packages/create-nuxt/src/main.ts @@ -33,6 +33,7 @@ const _main = defineCommand({ }, }) +// eslint-disable-next-line antfu/no-top-level-await await setupInitCompletions(_main) export const main = _main as CommandDef From c7352b5c7bb74615794749d9dedd0af9c3eb2b21 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:07:25 +0000 Subject: [PATCH 15/24] chore: lint --- .gitignore | 1 + packages/nuxi/src/completions-init.ts | 33 +++++----- packages/nuxi/src/utils/completions-data.ts | 69 --------------------- packages/nuxt-cli/src/run.ts | 2 +- 4 files changed, 18 insertions(+), 87 deletions(-) delete mode 100644 packages/nuxi/src/utils/completions-data.ts diff --git a/.gitignore b/.gitignore index 206cc5902..806dc20d6 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ stats.json playground-bun* playground-deno* playground-node* +packages/nuxi/src/utils/completions-data.ts diff --git a/packages/nuxi/src/completions-init.ts b/packages/nuxi/src/completions-init.ts index 2aac80d93..0799bedba 100644 --- a/packages/nuxi/src/completions-init.ts +++ b/packages/nuxi/src/completions-init.ts @@ -3,26 +3,25 @@ import tab from '@bomb.sh/tab/citty' import { templates } from './utils/completions-data' export async function setupInitCompletions(command: CommandDef) { - const completion = await tab(command) + const completion = await tab(command) - const templateOption = completion.options?.get('template') - if (templateOption) { - templateOption.handler = (complete) => { - for (const template of templates) { - complete(template, '') - } - } + const templateOption = completion.options?.get('template') + if (templateOption) { + templateOption.handler = (complete) => { + for (const template of templates) { + complete(template, '') + } } + } - const logLevelOption = completion.options?.get('logLevel') - if (logLevelOption) { - logLevelOption.handler = (complete) => { - complete('silent', 'No logs') - complete('info', 'Standard logging') - complete('verbose', 'Detailed logging') - } + const logLevelOption = completion.options?.get('logLevel') + if (logLevelOption) { + logLevelOption.handler = (complete) => { + complete('silent', 'No logs') + complete('info', 'Standard logging') + complete('verbose', 'Detailed logging') } + } - return completion + return completion } - diff --git a/packages/nuxi/src/utils/completions-data.ts b/packages/nuxi/src/utils/completions-data.ts deleted file mode 100644 index 67f041e8b..000000000 --- a/packages/nuxi/src/utils/completions-data.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** Auto-generated file */ - -export const nitroPresets = [ - "alwaysdata", - "aws-amplify", - "aws-lambda", - "azure-functions", - "azure-swa", - "bun", - "cleavr", - "cli", - "cloudflare-dev", - "cloudflare-durable", - "cloudflare-module", - "cloudflare-module-legacy", - "cloudflare-pages", - "cloudflare-pages-static", - "cloudflare-worker", - "deno-deploy", - "deno-server", - "deno-server-legacy", - "digital-ocean", - "edgio", - "firebase", - "firebase-app-hosting", - "flight-control", - "genezio", - "github-pages", - "gitlab-pages", - "heroku", - "iis-handler", - "iis-node", - "koyeb", - "netlify", - "netlify-builder", - "netlify-edge", - "netlify-legacy", - "netlify-static", - "node-cluster", - "node-listener", - "node-server", - "platform-sh", - "render-com", - "service-worker", - "static", - "stormkit", - "vercel", - "vercel-edge", - "vercel-static", - "winterjs", - "zeabur", - "zeabur-static", - "zerops", - "zerops-static" -] as const - -export const templates = [ - "doc-driven", - "hub", - "layer", - "module", - "module-devtools", - "ui", - "ui-vue", - "v2-bridge", - "v3", - "v4", - "v4-compat" -] as const diff --git a/packages/nuxt-cli/src/run.ts b/packages/nuxt-cli/src/run.ts index 065a66a8a..eb044027d 100644 --- a/packages/nuxt-cli/src/run.ts +++ b/packages/nuxt-cli/src/run.ts @@ -18,7 +18,7 @@ globalThis.__nuxt_cli__ = globalThis.__nuxt_cli__ || { ), } -export const runMain = async (): Promise => { +export async function runMain(): Promise { await initCompletions(main) return _runMain(main) } From 4e7d9bc964f0df9bdfbd250c5bcf980ae1eb4991 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:08:02 +0000 Subject: [PATCH 16/24] build: also for create nuxt --- packages/create-nuxt/tsdown.config.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/create-nuxt/tsdown.config.ts b/packages/create-nuxt/tsdown.config.ts index 3ffca620e..1e9ff9c5b 100644 --- a/packages/create-nuxt/tsdown.config.ts +++ b/packages/create-nuxt/tsdown.config.ts @@ -3,6 +3,7 @@ import process from 'node:process' import { visualizer } from 'rollup-plugin-visualizer' import { defineConfig } from 'tsdown' import { purgePolyfills } from 'unplugin-purge-polyfills' +import { generateCompletionData } from '../../scripts/generate-completions-data' const isAnalysingSize = process.env.BUNDLE_SIZE === 'true' @@ -12,6 +13,11 @@ export default defineConfig({ dts: !isAnalysingSize && { oxc: true, }, + hooks: { + 'build:prepare': async function () { + await generateCompletionData() + }, + }, failOnWarn: !isAnalysingSize, plugins: [ purgePolyfills.rolldown({ logLevel: 'verbose' }), From 6325654254596e11275e648b299ea46bb4493183 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:18:58 +0000 Subject: [PATCH 17/24] build: move back to postinstall --- package.json | 3 ++- packages/create-nuxt/tsdown.config.ts | 6 ------ packages/nuxi/tsdown.config.ts | 6 ------ packages/nuxt-cli/tsdown.config.ts | 6 ------ pnpm-lock.yaml | 3 +++ scripts/generate-completions-data.ts | 20 +++++++++++--------- 6 files changed, 16 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index efae36cc2..3bc90dda9 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "nuxi": "node ./packages/nuxi/bin/nuxi.mjs", "nuxt": "node ./packages/nuxt-cli/bin/nuxi.mjs", "nuxi-bun": "bun --bun ./packages/nuxt-cli/bin/nuxi.mjs", - "postinstall": "pnpm build", + "postinstall": "node --experimental-strip-types ./scripts/generate-completions-data.ts && pnpm build", "test:types": "tsc --noEmit", "test:knip": "knip", "test:dist": "pnpm -r test:dist", @@ -30,6 +30,7 @@ "@vitest/coverage-v8": "^3.2.4", "changelogen": "^0.6.2", "eslint": "^9.38.0", + "exsolve": "^1.0.7", "knip": "^5.66.3", "nuxt": "^4.1.3", "pkg-pr-new": "^0.0.60", diff --git a/packages/create-nuxt/tsdown.config.ts b/packages/create-nuxt/tsdown.config.ts index 1e9ff9c5b..3ffca620e 100644 --- a/packages/create-nuxt/tsdown.config.ts +++ b/packages/create-nuxt/tsdown.config.ts @@ -3,7 +3,6 @@ import process from 'node:process' import { visualizer } from 'rollup-plugin-visualizer' import { defineConfig } from 'tsdown' import { purgePolyfills } from 'unplugin-purge-polyfills' -import { generateCompletionData } from '../../scripts/generate-completions-data' const isAnalysingSize = process.env.BUNDLE_SIZE === 'true' @@ -13,11 +12,6 @@ export default defineConfig({ dts: !isAnalysingSize && { oxc: true, }, - hooks: { - 'build:prepare': async function () { - await generateCompletionData() - }, - }, failOnWarn: !isAnalysingSize, plugins: [ purgePolyfills.rolldown({ logLevel: 'verbose' }), diff --git a/packages/nuxi/tsdown.config.ts b/packages/nuxi/tsdown.config.ts index 0d651df50..f1309f069 100644 --- a/packages/nuxi/tsdown.config.ts +++ b/packages/nuxi/tsdown.config.ts @@ -3,7 +3,6 @@ import process from 'node:process' import { visualizer } from 'rollup-plugin-visualizer' import { defineConfig } from 'tsdown' import { purgePolyfills } from 'unplugin-purge-polyfills' -import { generateCompletionData } from '../../scripts/generate-completions-data' const isAnalysingSize = process.env.BUNDLE_SIZE === 'true' @@ -13,11 +12,6 @@ export default defineConfig({ dts: !isAnalysingSize && { oxc: true, }, - hooks: { - 'build:prepare': async function () { - await generateCompletionData() - }, - }, failOnWarn: !isAnalysingSize, plugins: [ purgePolyfills.rolldown({ logLevel: 'verbose' }), diff --git a/packages/nuxt-cli/tsdown.config.ts b/packages/nuxt-cli/tsdown.config.ts index 0d651df50..f1309f069 100644 --- a/packages/nuxt-cli/tsdown.config.ts +++ b/packages/nuxt-cli/tsdown.config.ts @@ -3,7 +3,6 @@ import process from 'node:process' import { visualizer } from 'rollup-plugin-visualizer' import { defineConfig } from 'tsdown' import { purgePolyfills } from 'unplugin-purge-polyfills' -import { generateCompletionData } from '../../scripts/generate-completions-data' const isAnalysingSize = process.env.BUNDLE_SIZE === 'true' @@ -13,11 +12,6 @@ export default defineConfig({ dts: !isAnalysingSize && { oxc: true, }, - hooks: { - 'build:prepare': async function () { - await generateCompletionData() - }, - }, failOnWarn: !isAnalysingSize, plugins: [ purgePolyfills.rolldown({ logLevel: 'verbose' }), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75a106ca0..191f589a2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,6 +46,9 @@ importers: eslint: specifier: ^9.38.0 version: 9.38.0(jiti@2.6.1) + exsolve: + specifier: ^1.0.7 + version: 1.0.7 knip: specifier: ^5.66.3 version: 5.66.3(@types/node@22.18.12)(typescript@5.9.3) diff --git a/scripts/generate-completions-data.ts b/scripts/generate-completions-data.ts index 9351610b6..0ab83df41 100644 --- a/scripts/generate-completions-data.ts +++ b/scripts/generate-completions-data.ts @@ -2,22 +2,20 @@ import { writeFile } from 'node:fs/promises' import { dirname, join } from 'node:path' +import process from 'node:process' import { fileURLToPath } from 'node:url' +import { resolveModulePath } from 'exsolve' interface PresetMeta { _meta?: { name: string } } +const outputPath = fileURLToPath(new URL('../packages/nuxi/src/utils/completions-data.ts', import.meta.url)) + export async function generateCompletionData() { - const data: { - nitroPresets: string[] - templates: string[] - } = { - nitroPresets: [], - templates: [], - } + const data = { nitroPresets: [] as string[], templates: [] as string[] } - const nitropackPath = dirname(require.resolve('nitropack/package.json')) + const nitropackPath = dirname(resolveModulePath('nitropack/package.json', { from: outputPath })) const presetsPath = join(nitropackPath, 'dist/presets/_all.gen.mjs') const { default: allPresets } = await import(presetsPath) as { default: PresetMeta[] } @@ -53,7 +51,6 @@ export async function generateCompletionData() { .filter(name => name !== 'community') .sort() - const outputPath = fileURLToPath(new URL('../packages/nuxi/src/utils/completions-data.ts', import.meta.url)) const content = `/** Auto-generated file */ export const nitroPresets = ${JSON.stringify(data.nitroPresets, null, 2)} as const @@ -63,3 +60,8 @@ export const templates = ${JSON.stringify(data.templates, null, 2)} as const await writeFile(outputPath, content, 'utf-8') } + +generateCompletionData().catch((error) => { + console.error('Failed to generate completion data:', error) + process.exit(1) +}) From f15c787c7d0409453e7465480727989a3bb65fbe Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:23:10 +0000 Subject: [PATCH 18/24] docs: remove global installation instructions --- README.md | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/README.md b/README.md index 6aaac6ddc..ed5b405f9 100644 --- a/README.md +++ b/README.md @@ -8,16 +8,7 @@ All commands are listed on https://nuxt.com/docs/api/commands. ## Shell Autocompletions -Nuxi provides shell autocompletions for commands, options, and option values powered by [`@bomb.sh/tab`](https://github.com/bombshell-dev/tab). - -### Setup - -For permanent setup in zsh, add this to your `~/.zshrc`: - -```bash -# Add to ~/.zshrc for permanent autocompletions (same can be done for other shells) -source <(nuxt complete zsh) -``` +`nuxt/cli` provides shell autocompletions for commands, options, and option values – powered by [`@bomb.sh/tab`](https://github.com/bombshell-dev/tab). ### Package Manager Integration From 1ede8e82c75ea60c0a5322f3a174e07962972538 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:34:03 +0000 Subject: [PATCH 19/24] chore: knip update --- knip.json | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/knip.json b/knip.json index b9b81125a..40b53a72e 100644 --- a/knip.json +++ b/knip.json @@ -24,6 +24,7 @@ "test/fixtures/*" ], "ignoreDependencies": [ + "@bomb.sh/tab", "c12", "confbox", "consola", @@ -48,6 +49,11 @@ "ufo", "youch" ] + }, + "packages/create-nuxt": { + "ignoreDependencies": [ + "@bomb.sh/tab" + ] } } } From c1c28d0228e3858372fa1d21e1b0da531cf4e4fb Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Thu, 30 Oct 2025 12:35:00 +0000 Subject: [PATCH 20/24] chore: use file url for output path --- scripts/generate-completions-data.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/generate-completions-data.ts b/scripts/generate-completions-data.ts index 0ab83df41..927f4152d 100644 --- a/scripts/generate-completions-data.ts +++ b/scripts/generate-completions-data.ts @@ -3,14 +3,13 @@ import { writeFile } from 'node:fs/promises' import { dirname, join } from 'node:path' import process from 'node:process' -import { fileURLToPath } from 'node:url' import { resolveModulePath } from 'exsolve' interface PresetMeta { _meta?: { name: string } } -const outputPath = fileURLToPath(new URL('../packages/nuxi/src/utils/completions-data.ts', import.meta.url)) +const outputPath = new URL('../packages/nuxi/src/utils/completions-data.ts', import.meta.url) export async function generateCompletionData() { const data = { nitroPresets: [] as string[], templates: [] as string[] } From 243bf6528c8931ea59bd2b2b8f7fc973c7d93690 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Thu, 30 Oct 2025 17:34:42 +0330 Subject: [PATCH 21/24] chore: update tab to version 0.0.8 --- packages/create-nuxt/package.json | 2 +- packages/nuxi/package.json | 2 +- packages/nuxt-cli/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/create-nuxt/package.json b/packages/create-nuxt/package.json index 9ea0ca317..c2f070a5e 100644 --- a/packages/create-nuxt/package.json +++ b/packages/create-nuxt/package.json @@ -32,7 +32,7 @@ "citty": "^0.1.6" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.7", + "@bomb.sh/tab": "^0.0.8", "@types/node": "^22.18.12", "rollup": "^4.52.5", "rollup-plugin-visualizer": "^6.0.5", diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 85635d013..6037b79cc 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -32,7 +32,7 @@ "prepack": "pnpm build" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.7", + "@bomb.sh/tab": "^0.0.8", "@nuxt/kit": "^4.1.3", "@nuxt/schema": "^4.1.3", "@nuxt/test-utils": "^3.20.1", diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index 392260996..71f22a8e9 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -33,7 +33,7 @@ "prepack": "tsdown" }, "dependencies": { - "@bomb.sh/tab": "^0.0.7", + "@bomb.sh/tab": "^0.0.8", "c12": "^3.3.1", "citty": "^0.1.6", "confbox": "^0.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 191f589a2..861c15d68 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,8 +84,8 @@ importers: version: 0.1.6 devDependencies: '@bomb.sh/tab': - specifier: ^0.0.7 - version: 0.0.7(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.8 + version: 0.0.8(cac@6.7.14)(citty@0.1.6) '@types/node': specifier: ^22.18.12 version: 22.18.12 @@ -114,8 +114,8 @@ importers: packages/nuxi: devDependencies: '@bomb.sh/tab': - specifier: ^0.0.7 - version: 0.0.7(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.8 + version: 0.0.8(cac@6.7.14)(citty@0.1.6) '@nuxt/kit': specifier: ^4.1.3 version: 4.1.3(magicast@0.4.0) @@ -243,8 +243,8 @@ importers: packages/nuxt-cli: dependencies: '@bomb.sh/tab': - specifier: ^0.0.7 - version: 0.0.7(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.8 + version: 0.0.8(cac@6.7.14)(citty@0.1.6) c12: specifier: ^3.3.1 version: 3.3.1(magicast@0.3.5) @@ -594,8 +594,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@bomb.sh/tab@0.0.7': - resolution: {integrity: sha512-/9fTHWWYFl0m2nmfNT9ngI8XEVCvwh7ggAkeHtQybM2CrlIWyakTjbESBpxIFjT8ckpuH3oA2ROyjxoglVtOGQ==} + '@bomb.sh/tab@0.0.8': + resolution: {integrity: sha512-IN/y/PcDosB0hpWUvaTEkvtZyx3zqJ77mwg/O+DJFpz+quq4IioxFGdUtoZ/CyKcWBGlz9pCW/8Rwwd3sN1r5w==} hasBin: true peerDependencies: cac: ^6.7.14 @@ -6011,7 +6011,7 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@bomb.sh/tab@0.0.7(cac@6.7.14)(citty@0.1.6)': + '@bomb.sh/tab@0.0.8(cac@6.7.14)(citty@0.1.6)': optionalDependencies: cac: 6.7.14 citty: 0.1.6 From c016105f7e77c539d493364603fec886c1e31473 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Tue, 4 Nov 2025 11:40:50 +0330 Subject: [PATCH 22/24] update tab to version 0.0.9 --- packages/create-nuxt/package.json | 2 +- packages/nuxi/package.json | 2 +- packages/nuxt-cli/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/create-nuxt/package.json b/packages/create-nuxt/package.json index c2f070a5e..0ccae23f2 100644 --- a/packages/create-nuxt/package.json +++ b/packages/create-nuxt/package.json @@ -32,7 +32,7 @@ "citty": "^0.1.6" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.8", + "@bomb.sh/tab": "^0.0.9", "@types/node": "^22.18.12", "rollup": "^4.52.5", "rollup-plugin-visualizer": "^6.0.5", diff --git a/packages/nuxi/package.json b/packages/nuxi/package.json index 6037b79cc..770453a46 100644 --- a/packages/nuxi/package.json +++ b/packages/nuxi/package.json @@ -32,7 +32,7 @@ "prepack": "pnpm build" }, "devDependencies": { - "@bomb.sh/tab": "^0.0.8", + "@bomb.sh/tab": "^0.0.9", "@nuxt/kit": "^4.1.3", "@nuxt/schema": "^4.1.3", "@nuxt/test-utils": "^3.20.1", diff --git a/packages/nuxt-cli/package.json b/packages/nuxt-cli/package.json index 71f22a8e9..3154b4cc0 100644 --- a/packages/nuxt-cli/package.json +++ b/packages/nuxt-cli/package.json @@ -33,7 +33,7 @@ "prepack": "tsdown" }, "dependencies": { - "@bomb.sh/tab": "^0.0.8", + "@bomb.sh/tab": "^0.0.9", "c12": "^3.3.1", "citty": "^0.1.6", "confbox": "^0.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 861c15d68..83386a07e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,8 +84,8 @@ importers: version: 0.1.6 devDependencies: '@bomb.sh/tab': - specifier: ^0.0.8 - version: 0.0.8(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.9 + version: 0.0.9(cac@6.7.14)(citty@0.1.6) '@types/node': specifier: ^22.18.12 version: 22.18.12 @@ -114,8 +114,8 @@ importers: packages/nuxi: devDependencies: '@bomb.sh/tab': - specifier: ^0.0.8 - version: 0.0.8(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.9 + version: 0.0.9(cac@6.7.14)(citty@0.1.6) '@nuxt/kit': specifier: ^4.1.3 version: 4.1.3(magicast@0.4.0) @@ -243,8 +243,8 @@ importers: packages/nuxt-cli: dependencies: '@bomb.sh/tab': - specifier: ^0.0.8 - version: 0.0.8(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.9 + version: 0.0.9(cac@6.7.14)(citty@0.1.6) c12: specifier: ^3.3.1 version: 3.3.1(magicast@0.3.5) @@ -594,8 +594,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@bomb.sh/tab@0.0.8': - resolution: {integrity: sha512-IN/y/PcDosB0hpWUvaTEkvtZyx3zqJ77mwg/O+DJFpz+quq4IioxFGdUtoZ/CyKcWBGlz9pCW/8Rwwd3sN1r5w==} + '@bomb.sh/tab@0.0.9': + resolution: {integrity: sha512-HUJ0b+LkZpLsyn0u7G/H5aJioAdSLqWMWX5ryuFS6n70MOEFu+SGrF8d8u6HzI1gINVQTvsfoxDLcjWkmI0AWg==} hasBin: true peerDependencies: cac: ^6.7.14 @@ -6011,7 +6011,7 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@bomb.sh/tab@0.0.8(cac@6.7.14)(citty@0.1.6)': + '@bomb.sh/tab@0.0.9(cac@6.7.14)(citty@0.1.6)': optionalDependencies: cac: 6.7.14 citty: 0.1.6 From c9c8bf7b11ac3385c3ea57c2eefb510cad24524a Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 4 Nov 2025 17:03:26 +0000 Subject: [PATCH 23/24] build: use module url for import --- scripts/generate-completions-data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/generate-completions-data.ts b/scripts/generate-completions-data.ts index 927f4152d..3f4caf9ec 100644 --- a/scripts/generate-completions-data.ts +++ b/scripts/generate-completions-data.ts @@ -3,7 +3,7 @@ import { writeFile } from 'node:fs/promises' import { dirname, join } from 'node:path' import process from 'node:process' -import { resolveModulePath } from 'exsolve' +import { resolveModuleURL } from 'exsolve' interface PresetMeta { _meta?: { name: string } @@ -14,7 +14,7 @@ const outputPath = new URL('../packages/nuxi/src/utils/completions-data.ts', imp export async function generateCompletionData() { const data = { nitroPresets: [] as string[], templates: [] as string[] } - const nitropackPath = dirname(resolveModulePath('nitropack/package.json', { from: outputPath })) + const nitropackPath = dirname(resolveModuleURL('nitropack/package.json', { from: outputPath })) const presetsPath = join(nitropackPath, 'dist/presets/_all.gen.mjs') const { default: allPresets } = await import(presetsPath) as { default: PresetMeta[] } From 44a49d19e0b7310fb36147cbee69f9b65f31ecfb Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Tue, 4 Nov 2025 17:06:10 +0000 Subject: [PATCH 24/24] chore: dance, dance little man --- scripts/generate-completions-data.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/scripts/generate-completions-data.ts b/scripts/generate-completions-data.ts index 3f4caf9ec..4cc56214a 100644 --- a/scripts/generate-completions-data.ts +++ b/scripts/generate-completions-data.ts @@ -3,7 +3,8 @@ import { writeFile } from 'node:fs/promises' import { dirname, join } from 'node:path' import process from 'node:process' -import { resolveModuleURL } from 'exsolve' +import { pathToFileURL } from 'node:url' +import { resolveModulePath } from 'exsolve' interface PresetMeta { _meta?: { name: string } @@ -14,9 +15,9 @@ const outputPath = new URL('../packages/nuxi/src/utils/completions-data.ts', imp export async function generateCompletionData() { const data = { nitroPresets: [] as string[], templates: [] as string[] } - const nitropackPath = dirname(resolveModuleURL('nitropack/package.json', { from: outputPath })) + const nitropackPath = dirname(resolveModulePath('nitropack/package.json', { from: outputPath })) const presetsPath = join(nitropackPath, 'dist/presets/_all.gen.mjs') - const { default: allPresets } = await import(presetsPath) as { default: PresetMeta[] } + const { default: allPresets } = await import(pathToFileURL(presetsPath).toString()) as { default: PresetMeta[] } data.nitroPresets = allPresets .map(preset => preset._meta?.name)