Skip to content

Commit 948382c

Browse files
committed
feat(completion): implement dynamic task completion for VITE+ - The Unified Toolchain for the Web
bootstrap-cli: pnpm build && cargo build -p vite_global_cli -p vite_trampoline --release && pnpm install-global-cli bootstrap-cli:ci: pnpm install-global-cli build: pnpm -F @voidzero-dev/* -F vite-plus build build:src: vp run @rolldown/pluginutils#build && vp run rolldown#build-binding:release && vp run rolldown#build-node && vp run vite#build-types && vp run @voidzero-dev/vite-plus-core#build && vp run @voidzero-dev/vite-plus-test#build && vp run vite-plus#build docs:build: pnpm -C docs build docs:dev: pnpm -C docs dev fmt: vp fmt install-global-cli: tool install-global-cli lint: vp lint --type-aware --type-check --threads 4 prepare: husky test: vp test run && pnpm -r snap-test test:unit: vp test run tsgo: tsgo -b tsconfig.json @rolldown/browser#build: pnpm run build:debug @rolldown/browser#build-node: TARGET='browser' pnpm run --filter rolldown build-node @rolldown/browser#build:debug: pnpm run --filter rolldown build-browser-pkg:debug @rolldown/browser#build:release: pnpm run --filter rolldown build-browser-pkg:release @rolldown/browser#preinstall: npx only-allow pnpm @rolldown/browser#publint: publint . @rolldown/debug#build: pnpm run gen-action-types && tsc -b @rolldown/debug#gen-action-types: oxnode ../../scripts/src/gen-debug-action-types.ts @rolldown/debug#publint: publint . @rolldown/debug#test: echo "Error: no test specified" && exit 1 @rolldown/pluginutils#build: tsc @rolldown/pluginutils#publint: publint . @rolldown/pluginutils#test: vitest --typecheck @rolldown/test-dev-server#build: tsc -b @rolldown/test-dev-server#dev: tsc -b --watch @rolldown/test-dev-server#test: pnpm run --filter @rolldown/test-dev-server-tests test @vitejs/plugin-legacy#build: tsdown @vitejs/plugin-legacy#dev: tsdown --watch @vitejs/plugin-legacy#prepublishOnly: npm run build @vitejs/vite-monorepo#build: pnpm -r --filter='./packages/*' run build @vitejs/vite-monorepo#ci-docs: pnpm build && pnpm docs-build @vitejs/vite-monorepo#ci-publish: tsx scripts/publishCI.ts @vitejs/vite-monorepo#debug-build: VITE_TEST_BUILD=1 VITE_PRESERVE_BUILD_ARTIFACTS=1 vitest run -c vitest.config.e2e.ts @vitejs/vite-monorepo#debug-serve: VITE_DEBUG_SERVE=1 vitest run -c vitest.config.e2e.ts @vitejs/vite-monorepo#dev: pnpm -r --parallel --filter='./packages/*' run dev @vitejs/vite-monorepo#docs: pnpm --filter=./docs run docs @vitejs/vite-monorepo#docs-build: pnpm --filter=./docs run docs-build @vitejs/vite-monorepo#docs-serve: pnpm --filter=./docs run docs-serve @vitejs/vite-monorepo#format: prettier --write --cache . --experimental-cli @vitejs/vite-monorepo#lint: eslint --cache . --concurrency auto @vitejs/vite-monorepo#merge-changelog: tsx scripts/mergeChangelog.ts @vitejs/vite-monorepo#postinstall: simple-git-hooks @vitejs/vite-monorepo#preinstall: npx only-allow pnpm @vitejs/vite-monorepo#release: tsx scripts/release.ts @vitejs/vite-monorepo#test: pnpm test-unit && pnpm test-serve && pnpm test-build @vitejs/vite-monorepo#test-build: VITE_TEST_BUILD=1 vitest run -c vitest.config.e2e.ts @vitejs/vite-monorepo#test-docs: pnpm run docs-build @vitejs/vite-monorepo#test-serve: vitest run -c vitest.config.e2e.ts @vitejs/vite-monorepo#test-unit: vitest run @vitejs/vite-monorepo#typecheck: tsc -p scripts && pnpm -r --parallel run typecheck @voidzero-dev/vite-plus-core#build: oxnode -C dev ./build.ts @voidzero-dev/vite-plus-prompts#build: tsdown @voidzero-dev/vite-plus-test#build: oxnode -C dev ./build.ts @voidzero-dev/vite-plus-tools#snap-test: tool snap-test bench#bench: oxnode ./benches/compare.js bench#bench-ci: oxnode ./benches/ci.js bench#bench-par: oxnode ./benches/par.js create-vite#build: tsdown create-vite#dev: tsdown --watch create-vite#execute: node index.js create-vite#prepublishOnly: npm run build create-vite#typecheck: tsc monorepo#build: echo "Use just build" monorepo#build:release: echo "Use just build native release" monorepo#ci:build-release-binding: pnpm --filter rolldown run build-binding:release monorepo#docs: pnpm --filter rolldown-docs run dev monorepo#docs:build: pnpm --filter rolldown-docs run generate && pnpm --filter rolldown-docs run build monorepo#docs:preview: pnpm --filter rolldown-docs run preview monorepo#fmt: oxfmt monorepo#fmt-check: oxfmt --check monorepo#lint-code: oxlint -c .oxlintrc.json --ignore-path=.oxlintignore --deny-warnings --type-aware monorepo#lint-knip: knip monorepo#lint-publint: pnpm run -r --aggregate-output publint monorepo#preinstall: npx only-allow pnpm monorepo#prepare: husky monorepo#test: echo "Use just test-node" monorepo#type-check: tsc -b tsconfig.json rolldown## Scrips for binding #: _ rolldown## Scrips for docs #: _ rolldown## Scrips for node #: _ rolldown#artifacts: napi artifacts --cwd ./src --package-json-path ../package.json -o=../artifacts --npm-dir ../npm rolldown#build-binding: oxnode ./build-binding.ts rolldown#build-binding:profile: pnpm build-binding --profile profile rolldown#build-binding:release: pnpm build-binding --release rolldown#build-binding:wasi: pnpm build-binding --target wasm32-wasip1-threads rolldown#build-binding:wasi:release: pnpm build-binding --profile release-wasi --target wasm32-wasip1-threads rolldown#build-browser-pkg:debug: TARGET='browser' pnpm run --sequential '/^build-(binding:wasi|node)$/' rolldown#build-browser-pkg:release: TARGET='browser' pnpm run --sequential '/^build-(binding:wasi:release|node)$/' rolldown#build-js-glue: pnpm run --sequential '/^build-(node|types-check)$/' rolldown#build-native:debug: pnpm run --sequential '/^build-(binding|js-glue)$/' rolldown#build-native:memory-profile: pnpm run build-binding:profile --features default_global_allocator && pnpm run build-js-glue rolldown#build-native:profile: pnpm run build-binding:profile && pnpm run build-js-glue rolldown#build-native:release: pnpm run --sequential '/^build-(binding:release|js-glue)$/' rolldown#build-node: node --enable-source-maps --import @oxc-node/core/register -C dev ./build.ts rolldown#build-types-check: tsc -p ./tsconfig.check.json rolldown#build-wasi:debug: TARGET='rolldown-wasi' pnpm run --sequential '/^build-(binding|binding:wasi|node)$/' rolldown#build-wasi:release: TARGET='rolldown-wasi' pnpm run --sequential '/^build-(binding|binding:wasi:release|node)$/' rolldown#prepublishOnly: napi pre-publish -t npm --no-gh-release rolldown#publint: publint . rollup-tests#test: ROLLUP_TEST=1 mocha --file ./src/intercept/main.js test/test.js rollup-tests#update-treeshaking-failures: mocha ./test/form/found-tree-shaking-not-align.js vite#build: premove dist && pnpm build-bundle && pnpm build-types vite#build-bundle: rolldown --config rolldown.config.ts vite#build-types: pnpm build-types-roll && pnpm build-types-check vite#build-types-check: tsc --project tsconfig.check.json vite#build-types-roll: rolldown --config rolldown.dts.config.ts vite#dev: premove dist && pnpm build-bundle -w vite#format: prettier --write --cache --parser typescript "src/**/*.ts" vite#generate-target: tsx scripts/generateTarget.ts vite#lint: eslint --cache --ext .ts src/** vite#prepublishOnly: npm run build vite#typecheck: tsc && tsc -p src/node && tsc -p src/module-runner && tsc -p src/shared && tsc -p src/node/__tests_dts__ && tsc -p src/module-runner/__tests_dts__ vite-plus#build: oxnode -C dev ./build.ts vite-plus#build-native: oxnode -C dev ./build.ts --skip-ts vite-plus#build-ts: oxnode -C dev ./build.ts --skip-native vite-plus#publish-native: node ./publish-native-addons.ts vite-plus#snap-test: pnpm snap-test-local && pnpm snap-test-global vite-plus#snap-test-global: tool snap-test --dir snap-tests-global --bin-dir ~/.vite-plus/bin vite-plus#snap-test-local: tool snap-test vite-plus#test: vitest run vite-tests#test: oxnode ./run.ts
1 parent 607d912 commit 948382c

1 file changed

Lines changed: 32 additions & 8 deletions

File tree

  • crates/vite_global_cli/src

crates/vite_global_cli/src/cli.rs

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use std::process::ExitStatus;
77

88
use clap::{CommandFactory, FromArgMatches, Parser, Subcommand};
99
use clap_complete::ArgValueCandidates;
10+
use tokio::runtime::Runtime;
1011
use vite_install::commands::{
1112
add::SaveDependencyType, install::InstallCommandOptions, outdated::Format,
1213
};
@@ -21,14 +22,6 @@ use crate::{
2122
help,
2223
};
2324

24-
fn run_tasks_completions() -> Vec<clap_complete::CompletionCandidate> {
25-
vec![
26-
clap_complete::CompletionCandidate::new("build"),
27-
clap_complete::CompletionCandidate::new("dev"),
28-
clap_complete::CompletionCandidate::new("test"),
29-
]
30-
}
31-
3225
#[derive(Clone, Copy, Debug)]
3326
pub struct RenderOptions {
3427
pub show_header: bool,
@@ -1489,6 +1482,37 @@ fn should_force_global_delegate(command: &str, args: &[String]) -> bool {
14891482
}
14901483
}
14911484

1485+
/// Get available tasks for shell completion.
1486+
///
1487+
/// Delegates to the local vite-plus CLI to run `vp run` without arguments,
1488+
/// which returns a list of available tasks in the format "task_name: description".
1489+
1490+
fn run_tasks_completions() -> Vec<clap_complete::CompletionCandidate> {
1491+
let cwd = match std::env::current_dir() {
1492+
Ok(cwd) => cwd,
1493+
Err(_) => return vec![],
1494+
};
1495+
1496+
let output = tokio::task::block_in_place(|| {
1497+
Runtime::new().ok().and_then(|rt| {
1498+
let cwd = AbsolutePathBuf::new(cwd)?;
1499+
rt.block_on(async { commands::delegate::execute_output(cwd, "run", &[]).await.ok() })
1500+
})
1501+
});
1502+
1503+
output
1504+
.filter(|o| o.status.success())
1505+
.map(|output| {
1506+
String::from_utf8_lossy(&output.stdout)
1507+
.lines()
1508+
.filter_map(|line| line.split_once(": ").map(|(name, _)| name.trim()))
1509+
.filter(|name| !name.is_empty())
1510+
.map(|name| clap_complete::CompletionCandidate::new(name.to_string()))
1511+
.collect()
1512+
})
1513+
.unwrap_or_default()
1514+
}
1515+
14921516
/// Run the CLI command.
14931517
pub async fn run_command(cwd: AbsolutePathBuf, args: Args) -> Result<ExitStatus, Error> {
14941518
run_command_with_options(cwd, args, RenderOptions::default()).await

0 commit comments

Comments
 (0)