From 09b88b61fe49f39541ac8c2a6d0e595b17d20d28 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Mon, 13 Oct 2025 14:12:04 +0330 Subject: [PATCH 1/4] tab completions --- package.json | 1 + pnpm-lock.yaml | 25 +++++++ src/cli/completions.ts | 148 +++++++++++++++++++++++++++++++++++++++++ src/cli/index.ts | 10 ++- 4 files changed, 182 insertions(+), 2 deletions(-) create mode 100644 src/cli/completions.ts diff --git a/package.json b/package.json index 75bf57e0aa..64eb16f4df 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "undici": "^7.11.0" }, "dependencies": { + "@bomb.sh/tab": "^0.0.5", "consola": "^3.4.2", "cookie-es": "^2.0.0", "crossws": "^0.4.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c8ae3bc981..f8690bfb5b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,9 @@ importers: .: dependencies: + '@bomb.sh/tab': + specifier: ^0.0.5 + version: 0.0.5(cac@6.7.14)(citty@0.1.6) consola: specifier: ^3.4.2 version: 3.4.2 @@ -534,6 +537,21 @@ 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==} + 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 + '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} @@ -6785,6 +6803,13 @@ 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 + optionalDependencies: + cac: 6.7.14 + citty: 0.1.6 + '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 diff --git a/src/cli/completions.ts b/src/cli/completions.ts new file mode 100644 index 0000000000..d98b98af28 --- /dev/null +++ b/src/cli/completions.ts @@ -0,0 +1,148 @@ +import type { ArgsDef, CommandDef } from "citty"; +import tab from "@bomb.sh/tab/citty"; + +export async function initCompletions( + command: CommandDef +) { + const completion = await tab(command); + + 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"); + complete("4000", "Another common 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 dirOption = devCommand.options.get("dir"); + if (dirOption) { + dirOption.handler = (complete) => { + complete(".", "Current directory"); + }; + } + } + + 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("node-middleware", "Node.js middleware"); + complete("node-cluster", "Node.js cluster mode"); + + // Static presets + complete("static", "Static hosting"); + complete("github-pages", "GitHub Pages"); + complete("gitlab-pages", "GitLab Pages"); + + complete("cloudflare-pages", "Cloudflare Pages"); + complete("cloudflare-pages-static", "Cloudflare Pages (static)"); + complete("cloudflare-module", "Cloudflare Workers (module)"); + complete("cloudflare-durable", "Cloudflare Durable Objects"); + complete("vercel", "Vercel"); + complete("vercel-static", "Vercel (static)"); + complete("netlify", "Netlify"); + complete("netlify-edge", "Netlify Edge Functions"); + complete("netlify-static", "Netlify (static)"); + + complete("aws-lambda", "AWS Lambda"); + complete("aws-amplify", "AWS Amplify"); + + complete("azure-swa", "Azure Static Web Apps"); + + complete("firebase-app-hosting", "Firebase App Hosting"); + complete("deno-deploy", "Deno Deploy"); + complete("deno-server", "Deno Server"); + complete("bun", "Bun runtime"); + complete("digital-ocean", "DigitalOcean"); + complete("heroku", "Heroku"); + complete("render-com", "Render.com"); + complete("zeabur", "Zeabur"); + complete("zeabur-static", "Zeabur (static)"); + complete("zerops", "Zerops"); + complete("zerops-static", "Zerops (static)"); + complete("koyeb", "Koyeb"); + complete("platform-sh", "Platform.sh"); + complete("flight-control", "FlightControl"); + complete("cleavr", "Cleavr"); + complete("stormkit", "Stormkit"); + complete("genezio", "Genezio"); + complete("alwaysdata", "AlwaysData"); + + complete("iis-handler", "IIS Handler"); + complete("iis-node", "IIS Node"); + complete("winterjs", "WinterJS"); + complete("standard", "Standard runtime"); + }; + } + + const minifyOption = buildCommand.options.get("minify"); + if (minifyOption) { + minifyOption.handler = (complete) => { + complete("true", "Enable minification"); + complete("false", "Disable minification"); + }; + } + + const dirOption = buildCommand.options.get("dir"); + if (dirOption) { + dirOption.handler = (complete) => { + complete(".", "Current directory"); + }; + } + } + + const prepareCommand = completion.commands.get("prepare"); + if (prepareCommand) { + const dirOption = prepareCommand.options.get("dir"); + if (dirOption) { + dirOption.handler = (complete) => { + complete(".", "Current directory"); + }; + } + } + + const taskListCommand = completion.commands.get("task list"); + if (taskListCommand) { + const dirOption = taskListCommand.options.get("dir"); + if (dirOption) { + dirOption.handler = (complete: (value: string, description: string) => void) => { + complete(".", "Current directory"); + }; + } + } + + const taskRunCommand = completion.commands.get("task run"); + if (taskRunCommand) { + const dirOption = taskRunCommand.options.get("dir"); + if (dirOption) { + dirOption.handler = (complete: (value: string, description: string) => void) => { + complete(".", "Current directory"); + }; + } + + const payloadOption = taskRunCommand.options.get("payload"); + if (payloadOption) { + payloadOption.handler = (complete: (value: string, description: string) => void) => { + complete("{}", ""); + }; + } + } + + return completion; +} + diff --git a/src/cli/index.ts b/src/cli/index.ts index bc3f21d7bb..7b1553bdb3 100644 --- a/src/cli/index.ts +++ b/src/cli/index.ts @@ -1,6 +1,7 @@ #!/usr/bin/env node -import { defineCommand, runMain } from "citty"; +import { defineCommand, runMain as _runMain } from "citty"; import { version as nitroVersion } from "nitro/meta"; +import { initCompletions } from "./completions"; const main = defineCommand({ meta: { @@ -16,4 +17,9 @@ const main = defineCommand({ }, }); -runMain(main); +async function runMain() { + await initCompletions(main); + return _runMain(main); +} + +runMain(); From d3274c55d76855a86da2b9ce4ef4adda35feea69 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Mon, 13 Oct 2025 17:30:55 +0330 Subject: [PATCH 2/4] move tab to devDeps --- package.json | 2 +- pnpm-lock.yaml | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 64eb16f4df..c8e642a496 100644 --- a/package.json +++ b/package.json @@ -52,7 +52,6 @@ "undici": "^7.11.0" }, "dependencies": { - "@bomb.sh/tab": "^0.0.5", "consola": "^3.4.2", "cookie-es": "^2.0.0", "crossws": "^0.4.1", @@ -74,6 +73,7 @@ "devDependencies": { "@azure/functions": "^3.5.1", "@azure/static-web-apps-cli": "^2.0.7", + "@bomb.sh/tab": "^0.0.5", "@cloudflare/workers-types": "^4.20251008.0", "@deno/types": "^0.0.1", "@netlify/edge-functions": "^2.18.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8690bfb5b..04342581a9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,9 +12,6 @@ importers: .: dependencies: - '@bomb.sh/tab': - specifier: ^0.0.5 - version: 0.0.5(cac@6.7.14)(citty@0.1.6) consola: specifier: ^3.4.2 version: 3.4.2 @@ -76,6 +73,9 @@ importers: '@azure/static-web-apps-cli': specifier: ^2.0.7 version: 2.0.7 + '@bomb.sh/tab': + specifier: ^0.0.5 + version: 0.0.5(cac@6.7.14)(citty@0.1.6) '@cloudflare/workers-types': specifier: ^4.20251008.0 version: 4.20251008.0 From 20e8f011b44c5807186e503b6382752b41ed42eb Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Fri, 24 Oct 2025 10:42:14 +0330 Subject: [PATCH 3/4] chore: update tab to version 0.0.7 --- package.json | 2 +- pnpm-lock.yaml | 12 +++++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index c8e642a496..f35c7f7750 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "devDependencies": { "@azure/functions": "^3.5.1", "@azure/static-web-apps-cli": "^2.0.7", - "@bomb.sh/tab": "^0.0.5", + "@bomb.sh/tab": "^0.0.7", "@cloudflare/workers-types": "^4.20251008.0", "@deno/types": "^0.0.1", "@netlify/edge-functions": "^2.18.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 04342581a9..0565f134df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -74,8 +74,8 @@ importers: specifier: ^2.0.7 version: 2.0.7 '@bomb.sh/tab': - specifier: ^0.0.5 - version: 0.0.5(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.7 + version: 0.0.7(cac@6.7.14)(citty@0.1.6) '@cloudflare/workers-types': specifier: ^4.20251008.0 version: 4.20251008.0 @@ -537,8 +537,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.7': + resolution: {integrity: sha512-/9fTHWWYFl0m2nmfNT9ngI8XEVCvwh7ggAkeHtQybM2CrlIWyakTjbESBpxIFjT8ckpuH3oA2ROyjxoglVtOGQ==} hasBin: true peerDependencies: cac: ^6.7.14 @@ -6803,9 +6803,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.7(cac@6.7.14)(citty@0.1.6)': optionalDependencies: cac: 6.7.14 citty: 0.1.6 From 532ac9469f4fd3a30dada6501082b7a2aca62734 Mon Sep 17 00:00:00 2001 From: AmirSa12 Date: Tue, 4 Nov 2025 12:27:03 +0330 Subject: [PATCH 4/4] update tab to version 0.0.9 --- package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f35c7f7750..8f197ed509 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,7 @@ "devDependencies": { "@azure/functions": "^3.5.1", "@azure/static-web-apps-cli": "^2.0.7", - "@bomb.sh/tab": "^0.0.7", + "@bomb.sh/tab": "^0.0.9", "@cloudflare/workers-types": "^4.20251008.0", "@deno/types": "^0.0.1", "@netlify/edge-functions": "^2.18.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0565f134df..2133891750 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -74,8 +74,8 @@ importers: specifier: ^2.0.7 version: 2.0.7 '@bomb.sh/tab': - specifier: ^0.0.7 - version: 0.0.7(cac@6.7.14)(citty@0.1.6) + specifier: ^0.0.9 + version: 0.0.9(cac@6.7.14)(citty@0.1.6) '@cloudflare/workers-types': specifier: ^4.20251008.0 version: 4.20251008.0 @@ -537,8 +537,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.9': + resolution: {integrity: sha512-HUJ0b+LkZpLsyn0u7G/H5aJioAdSLqWMWX5ryuFS6n70MOEFu+SGrF8d8u6HzI1gINVQTvsfoxDLcjWkmI0AWg==} hasBin: true peerDependencies: cac: ^6.7.14 @@ -6803,7 +6803,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.9(cac@6.7.14)(citty@0.1.6)': optionalDependencies: cac: 6.7.14 citty: 0.1.6