diff --git a/packages/cli/binding/src/cli.rs b/packages/cli/binding/src/cli.rs index d3a7832f95..7913e16cb9 100644 --- a/packages/cli/binding/src/cli.rs +++ b/packages/cli/binding/src/cli.rs @@ -419,13 +419,6 @@ pub async fn main< let workspace = Workspace::partial_load(cwd.clone())?; let lib_fn = options.map(|o| o.lib).expect("lib command requires CliOptions to be provided"); - let lib_config_path = workspace.cache_path().join("vite-lib.config.js"); - if write_vite_lib_config(&cwd, &lib_config_path).await? { - args.extend_from_slice(&[ - "--config".to_string(), - lib_config_path.as_path().to_string_lossy().into_owned(), - ]); - } let summary = lib(lib_fn, &workspace, args).await?; workspace.unload().await?; summary @@ -574,42 +567,6 @@ async fn read_vite_config_from_workspace_root< Ok(None) } -async fn write_vite_lib_config( - workspace_root: &AbsolutePathBuf, - lib_config_path: &AbsolutePathBuf, -) -> Result { - let relative_vite_config_path = - lib_config_path.strip_prefix(workspace_root).map_err(|e| Error::InvalidRelativePath { - path: e.stripped_path.into(), - reason: e.invalid_path_data_error.into(), - })?; - if let Some(relative_vite_config_path) = relative_vite_config_path { - let relative_prefix = relative_vite_config_path - .as_path() - .components() - .skip(1) - .map(|_| "..".to_string()) - .collect::>() - .join("/"); - write( - &lib_config_path, - format!( - r#"let config -try {{ - const viteConfig = await import('{relative_prefix}/vite.config.ts') - config = viteConfig.default.lib -}} catch {{ -}} -export default config -"# - ), - ) - .await?; - return Ok(true); - } - Ok(false) -} - #[cfg(test)] mod tests { use clap::Parser; diff --git a/packages/cli/package.json b/packages/cli/package.json index db09889720..9527152a96 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -27,6 +27,7 @@ "dependencies": { "@voidzero-dev/vite-plus-core": "workspace:*", "@voidzero-dev/vite-plus-test": "workspace:*", + "cac": "catalog:", "oxfmt": "catalog:", "oxlint": "catalog:", "oxlint-tsgolint": "catalog:" diff --git a/packages/cli/snap-tests/command-helper/snap.txt b/packages/cli/snap-tests/command-helper/snap.txt index a55503e37b..b92c1f3339 100644 --- a/packages/cli/snap-tests/command-helper/snap.txt +++ b/packages/cli/snap-tests/command-helper/snap.txt @@ -26,36 +26,34 @@ Options: -V, --version Print version > vite lib -h # lib help message -tsdown/ +vite lib Usage: - $ tsdown [...files] + $ vite lib [...files] Commands: [...files] Bundle files - migrate Migrate from tsup to tsdown For more info, run any command with the `--help` flag: - $ tsdown --help - $ tsdown migrate --help + $ vite lib --help Options: - -c, --config Use a custom config file --config-loader Config loader to use: auto, native, unrun (default: auto) --no-config Disable config file (default: true) -f, --format Bundle format: esm, cjs, iife, umd (default: esm) --clean Clean output directory, --no-clean to disable --external Mark dependencies as external --minify Minify output - --debug Enable debug mode - --debug-logs [feat] Show debug logs + --devtools Enable devtools integration + --debug [feat] Show debug logs --target Bundle target, e.g "es2015", "esnext" -l, --logLevel Set log level: info, warn, error, silent --fail-on-warn Fail on warnings (default: true) + --no-write Disable writing files to disk, incompatible with watch mode (default: true) -d, --out-dir Output directory (default: dist) --treeshake Tree-shake bundle (default: true) --sourcemap Generate source map (default: false) - --shims Enable cjs and esm shims (default: false) + --shims Enable cjs and esm shims (default: false) --platform Target platform (default: node) --dts Generate dts files --publint Enable publint (default: false) @@ -66,16 +64,17 @@ Options: --from-vite [vitest] Reuse config from Vite or Vitest --report Size report (default: true) --env.* Define compile-time env variables + --env-file Load environment variables from a file, when used together with --env, variables in --env take precedence + --env-prefix Prefix for env variables to inject into the bundle (default: VITE_LIB_,TSDOWN_) --on-success Command to run on success --copy Copy files to output dir --public-dir Alias for --copy, deprecated --tsconfig Set tsconfig path --unbundle Unbundle mode -W, --workspace [dir] Enable workspace mode - -F, --filter Filter workspace packages, e.g. /regex/ or substring + -F, --filter Filter configs (cwd or name), e.g. /pkg-name$/ or pkg-name --exports Generate export-related metadata for package.json (experimental) -h, --help Display this message - -v, --version Display version number > vite fmt -h # fmt help message diff --git a/packages/cli/snap-tests/command-lib-monorepo/packages/hello/tsdown.config.ts b/packages/cli/snap-tests/command-lib-monorepo/packages/hello/tsdown.config.ts deleted file mode 100644 index 9b6cdbff9f..0000000000 --- a/packages/cli/snap-tests/command-lib-monorepo/packages/hello/tsdown.config.ts +++ /dev/null @@ -1,4 +0,0 @@ -export default { - entry: 'src/index.ts', - format: ['cjs'], -}; diff --git a/packages/cli/snap-tests/command-lib-monorepo/packages/hello/vite.config.ts b/packages/cli/snap-tests/command-lib-monorepo/packages/hello/vite.config.ts new file mode 100644 index 0000000000..e13f61dc43 --- /dev/null +++ b/packages/cli/snap-tests/command-lib-monorepo/packages/hello/vite.config.ts @@ -0,0 +1,6 @@ +export default { + lib: { + entry: 'src/index.ts', + format: ['cjs'], + }, +}; diff --git a/packages/cli/snap-tests/command-lib-monorepo/snap.txt b/packages/cli/snap-tests/command-lib-monorepo/snap.txt index 0c76f5fd35..32dded1b71 100644 --- a/packages/cli/snap-tests/command-lib-monorepo/snap.txt +++ b/packages/cli/snap-tests/command-lib-monorepo/snap.txt @@ -1,7 +1,5 @@ > vite run hello#build # should build the library ~/packages/hello$ vite lib -ℹ tsdown v powered by rolldown v -ℹ Using tsdown config: /packages/hello/tsdown.config.ts ℹ entry: src/index.ts ℹ Build start ℹ dist/index.cjs kB │ gzip: kB @@ -28,8 +26,6 @@ index.cjs > vite run hello#build # should hit cache ~/packages/hello$ vite lib (✓ cache hit, replaying) -ℹ tsdown v powered by rolldown v -ℹ Using tsdown config: /packages/hello/tsdown.config.ts ℹ entry: src/index.ts ℹ Build start ℹ dist/index.cjs kB │ gzip: kB diff --git a/packages/cli/snap-tests/command-lib/snap.txt b/packages/cli/snap-tests/command-lib/snap.txt index c0a816f276..e4111fa51a 100644 --- a/packages/cli/snap-tests/command-lib/snap.txt +++ b/packages/cli/snap-tests/command-lib/snap.txt @@ -1,34 +1,32 @@ > vite lib -h # should print the help message -tsdown/ +vite lib Usage: - $ tsdown [...files] + $ vite lib [...files] Commands: [...files] Bundle files - migrate Migrate from tsup to tsdown For more info, run any command with the `--help` flag: - $ tsdown --help - $ tsdown migrate --help + $ vite lib --help Options: - -c, --config Use a custom config file --config-loader Config loader to use: auto, native, unrun (default: auto) --no-config Disable config file (default: true) -f, --format Bundle format: esm, cjs, iife, umd (default: esm) --clean Clean output directory, --no-clean to disable --external Mark dependencies as external --minify Minify output - --debug Enable debug mode - --debug-logs [feat] Show debug logs + --devtools Enable devtools integration + --debug [feat] Show debug logs --target Bundle target, e.g "es2015", "esnext" -l, --logLevel Set log level: info, warn, error, silent --fail-on-warn Fail on warnings (default: true) + --no-write Disable writing files to disk, incompatible with watch mode (default: true) -d, --out-dir Output directory (default: dist) --treeshake Tree-shake bundle (default: true) --sourcemap Generate source map (default: false) - --shims Enable cjs and esm shims (default: false) + --shims Enable cjs and esm shims (default: false) --platform Target platform (default: node) --dts Generate dts files --publint Enable publint (default: false) @@ -39,21 +37,20 @@ Options: --from-vite [vitest] Reuse config from Vite or Vitest --report Size report (default: true) --env.* Define compile-time env variables + --env-file Load environment variables from a file, when used together with --env, variables in --env take precedence + --env-prefix Prefix for env variables to inject into the bundle (default: VITE_LIB_,TSDOWN_) --on-success Command to run on success --copy Copy files to output dir --public-dir Alias for --copy, deprecated --tsconfig Set tsconfig path --unbundle Unbundle mode -W, --workspace [dir] Enable workspace mode - -F, --filter Filter workspace packages, e.g. /regex/ or substring + -F, --filter Filter configs (cwd or name), e.g. /pkg-name$/ or pkg-name --exports Generate export-related metadata for package.json (experimental) -h, --help Display this message - -v, --version Display version number > vite lib src/index.ts # should build the library -ℹ tsdown v powered by rolldown v -ℹ Using tsdown config: /node_modules/.vite/task-cache/vite-lib.config.js ℹ entry: src/index.ts ℹ Build start ℹ dist/index.mjs kB │ gzip: kB @@ -66,8 +63,6 @@ index.mjs > vite lib src/index.ts # should hit cache ✓ cache hit, replaying -ℹ tsdown v powered by rolldown v -ℹ Using tsdown config: /node_modules/.vite/task-cache/vite-lib.config.js ℹ entry: src/index.ts ℹ Build start ℹ dist/index.mjs kB │ gzip: kB diff --git a/packages/cli/src/lib-bin.ts b/packages/cli/src/lib-bin.ts new file mode 100644 index 0000000000..146a02c826 --- /dev/null +++ b/packages/cli/src/lib-bin.ts @@ -0,0 +1,98 @@ +#!/usr/bin/env node +import module from 'node:module'; + +import { resolveConfig } from '@voidzero-dev/vite-plus-core'; +import { build, type UserConfig, globalLogger } from '@voidzero-dev/vite-plus-core/lib'; +import { cac } from 'cac'; + +const cli = cac('vite lib'); +cli.help(); + +const DEFAULT_ENV_PREFIXES = ['VITE_LIB_', 'TSDOWN_']; + +cli + .command('[...files]', 'Bundle files', { + ignoreOptionDefaultValue: true, + allowUnknownOptions: true, + }) + // Only support config file in vite.config.ts + // .option('-c, --config ', 'Use a custom config file') + .option('--config-loader ', 'Config loader to use: auto, native, unrun', { + default: 'auto', + }) + .option('--no-config', 'Disable config file') + .option('-f, --format ', 'Bundle format: esm, cjs, iife, umd', { + default: 'esm', + }) + .option('--clean', 'Clean output directory, --no-clean to disable') + .option('--external ', 'Mark dependencies as external') + .option('--minify', 'Minify output') + .option('--devtools', 'Enable devtools integration') + .option('--debug [feat]', 'Show debug logs') + .option('--target ', 'Bundle target, e.g "es2015", "esnext"') + .option('-l, --logLevel ', 'Set log level: info, warn, error, silent') + .option('--fail-on-warn', 'Fail on warnings', { default: true }) + .option('--no-write', 'Disable writing files to disk, incompatible with watch mode') + .option('-d, --out-dir ', 'Output directory', { default: 'dist' }) + .option('--treeshake', 'Tree-shake bundle', { default: true }) + .option('--sourcemap', 'Generate source map', { default: false }) + .option('--shims', 'Enable cjs and esm shims', { default: false }) + .option('--platform ', 'Target platform', { + default: 'node', + }) + .option('--dts', 'Generate dts files') + .option('--publint', 'Enable publint', { default: false }) + .option('--attw', 'Enable Are the types wrong integration', { + default: false, + }) + .option('--unused', 'Enable unused dependencies check', { default: false }) + .option('-w, --watch [path]', 'Watch mode') + .option('--ignore-watch ', 'Ignore custom paths in watch mode') + .option('--from-vite [vitest]', 'Reuse config from Vite or Vitest') + .option('--report', 'Size report', { default: true }) + .option('--env.* ', 'Define compile-time env variables') + .option( + '--env-file ', + 'Load environment variables from a file, when used together with --env, variables in --env take precedence', + ) + .option('--env-prefix ', 'Prefix for env variables to inject into the bundle', { + // support `TSDOWN_` for migration compatibility + default: DEFAULT_ENV_PREFIXES, + }) + .option('--on-success ', 'Command to run on success') + .option('--copy ', 'Copy files to output dir') + .option('--public-dir ', 'Alias for --copy, deprecated') + .option('--tsconfig ', 'Set tsconfig path') + .option('--unbundle', 'Unbundle mode') + .option('-W, --workspace [dir]', 'Enable workspace mode') + .option('-F, --filter ', 'Filter configs (cwd or name), e.g. /pkg-name$/ or pkg-name') + .option('--exports', 'Generate export-related metadata for package.json (experimental)') + .action(async (input: string[], flags: UserConfig) => { + const viteConfig = await resolveConfig({ root: process.cwd() }, 'build'); + if (input.length > 0) flags.entry = input; + // TODO: set default envPrefix after tsdown upgrade + await build({ + ...(viteConfig.lib as UserConfig), + ...flags, + config: false, + }); + }); + +export async function runCLI(): Promise { + cli.parse(process.argv, { run: false }); + + // TODO: enable debug after tsdown upgrade + // enableDebug(cli.options) + + try { + await cli.runMatchedCommand(); + } catch (error: any) { + globalLogger.error(String(error.stack || error.message)); + process.exit(1); + } +} + +if (module.enableCompileCache) { + module.enableCompileCache(); +} +runCLI(); diff --git a/packages/cli/src/resolve-lib.ts b/packages/cli/src/resolve-lib.ts index bdf6cb7b05..7d4dbb59a8 100644 --- a/packages/cli/src/resolve-lib.ts +++ b/packages/cli/src/resolve-lib.ts @@ -8,9 +8,9 @@ * Used for: `vite-plus lib` command */ -import { dirname, join } from 'node:path'; +import { join } from 'node:path'; -import { DEFAULT_ENVS, resolve } from './utils.js'; +import { DEFAULT_ENVS } from './utils.js'; /** * Resolves the Tsdown binary path and environment variables. @@ -26,12 +26,7 @@ export async function lib(): Promise<{ envs: Record; }> { // Resolve the bundled Tsdown CLI - const binPath = join( - dirname(resolve('@voidzero-dev/vite-plus-core/package.json')), - 'dist', - 'tsdown', - 'run.js', - ); + const binPath = join(import.meta.dirname, 'lib-bin.js'); return { binPath, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5f9e04bfba..82da06e0df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,6 +93,9 @@ catalogs: buble: specifier: ^0.20.0 version: 0.20.0 + cac: + specifier: ^6.7.14 + version: 6.7.14 chalk: specifier: ^5.3.0 version: 5.6.2 @@ -328,6 +331,9 @@ importers: '@voidzero-dev/vite-plus-test': specifier: workspace:* version: link:../test + cac: + specifier: 'catalog:' + version: 6.7.14 oxfmt: specifier: 'catalog:' version: 0.16.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 94c85eed11..5bbfc90f1f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -45,6 +45,7 @@ catalog: acorn: ^8.12.1 astring: ^1.9.0 buble: ^0.20.0 + cac: ^6.7.14 chalk: ^5.3.0 change-case: ^5.4.4 connect: ^3.7.0