-
Notifications
You must be signed in to change notification settings - Fork 710
Description
Use cac to replace current cli implementation
--moduleTypes .png=dataurl is silently ignored
Bug
--moduleTypes .png=dataurl is silently ignored — parseArgs (with strict: false) treats it as an unrecognized boolean flag and loses the value to positionals. No error or warning is shown to the user.
Root cause
packages/rolldown/src/cli/arguments/index.ts registers options in kebab-case only (e.g. module-types). parseArgs has no camelCase ↔ kebab-case awareness, so --moduleTypes is treated as an unknown flag.
Broader problem — parseArgs is too minimal
The CLI arguments module (packages/rolldown/src/cli/arguments/) is ~445 lines, of which ~330 lines are custom workarounds for features parseArgs doesn't provide:
| Feature | parseArgs |
Custom workaround |
|---|---|---|
| camelCase ↔ kebab-case | No | normalizeArgv + utils.ts (~28 lines) |
--no-* boolean negation |
No | Manual prefix stripping + inversion (~20 lines) |
Object parsing (key=value,key=value) |
No | Manual split/parse (~21 lines) |
| Array accumulation | Basic multiple |
Manual push (~10 lines) |
| Nested option unflattening | No | setNestedProperty (~18 lines) |
| Union types | No | Manual handling (~8 lines) |
| Validation / error messages | Minimal | Custom validation (~50 lines) |
| Default values (conditional) | Basic | Config-driven defaults (~20 lines) |
| Prototype pollution guard | No | Manual check (~3 lines) |
Each new edge case (like -- delimiter handling) adds to this maintenance surface. We're effectively building a yargs-parser from scratch on top of parseArgs.
Alternatives to consider
| Library | Size | camelCase | --no-* |
Objects | Arrays | -- |
Notes |
|---|---|---|---|---|---|---|---|
| ordana | ~13 kB | Yes | Yes | Custom types | Yes | Yes | Used by Vite (PR vitejs/vite#19436). Built on parseArgs internally. TypeScript-first, auto docs generation. Strategic alignment since rolldown is Vite's future bundler. |
| yargs-parser | ~86 kB | Yes | Yes | Dot notation | Yes | Yes | Battle-tested (3,733 dependents). Most feature-complete standalone parser. |
| citty | ~24 kB | Yes | Yes | Via config | Yes | Yes | UnJS ecosystem (rolldown already uses consola). Zero deps, very active (v0.2.1 released Feb 2026). |
| commander | ~40 kB | Yes | Yes | Limited | Variadic | Yes | Full CLI framework (114K dependents). May be heavier than needed. |
Ref
Closes PR #8408 which attempted a narrow fix for the camelCase issue.