shadcn-ui/ui · error · Error
${(error as Error).message}\n\n${USAGE}
Error message
${(error as Error).message}\n\n${USAGE} What it means
parseBuildOptions calls Node's parseArgs with strict:true and allowPositionals:false over a fixed option schema (--examples/--indexes/--style/--registry). parseArgs throws on unknown flags, flags missing a value, repeated boolean flags, or any positional argument. The catch wraps the native message and appends USAGE so the cause and the correct invocation are visible together.
Source
Thrown at apps/v4/scripts/build-registry.mts:207
indexes?: boolean
style?: string
registry?: string
}
try {
;({ values } = parseArgs({
args: argv,
options: {
examples: { type: "boolean" },
indexes: { type: "boolean" },
style: { type: "string" },
registry: { type: "string" },
},
allowPositionals: false,
strict: true,
}))
} catch (error) {
throw new Error(`${(error as Error).message}\n\n${USAGE}`)
}
if (values.style !== undefined) {
assertKnownTarget("--style", values.style)
}
if (values.registry !== undefined) {
assertKnownTarget("--registry", values.registry)
}
return {
examples: values.examples ?? false,
indexes: values.indexes ?? false,
style: values.style ?? null,
registry: values.registry ?? null,
}
}
function isFullBuild(options: BuildOptions) {View on GitHub (pinned to efac598707)
Solutions
- Read the wrapped message — parseArgs states the exact problem (e.g. 'unknown option' or 'expected value').
- Restrict to the four supported flags and give --style/--registry a value.
- Do not pass positional arguments; everything must be a named flag.
Example fix
# before pnpm registry:build --styles base-nova ./extra # after pnpm registry:build --style base-nova
Defensive patterns
Strategy: validation
Validate before calling
import { parseArgs } from "util"
const ALLOWED = new Set(["examples", "indexes", "style", "registry"])
// pre-check argv tokens before parseArgs
for (const tok of argv) {
const name = tok.startsWith("--") ? tok.replace(/^--/, "").split("=")[0] : null
if (name && !ALLOWED.has(name)) throw new Error(`Unknown flag --${name}`)
} Type guard
function isAllowedFlag(tok: string): boolean {
if (!tok.startsWith("--")) return true
const name = tok.replace(/^--/, "").split("=")[0]
return new Set(["examples", "indexes", "style", "registry"]).has(name)
} Prevention
- Restrict invocations to --examples, --indexes, --style <id>, --registry <id>.
- Never pass positional arguments — parseArgs is configured with allowPositionals:false.
- Give string flags (--style/--registry) an explicit value.
- Validate argv in a wrapper script before delegating to the build.
When it happens
Trigger: Passing an unknown flag (--styles plural, --target); --style with no following value; --examples=foo (boolean flag given a value); passing a bare positional path argument (rejected because allowPositionals:false).
Common situations: Typo'd flag name; copy-pasting an outdated CLI invocation from docs; passing a file path positionally by habit.
Related errors
- Missing value for --only. Use one or more of: ${APPLY_ONLY_V
- Invalid value for --only: ${value}. Use one or more of: ${AP
- Missing preset for --only. Use: shadcn apply <preset> --only
- Unknown client: ${client}. Available clients: ${CLIENTS.map(
- Invalid registry namespace: ${namespace}. Registry names mus
AI-assisted analysis of shadcn-ui/ui@efac598707 (2026-08-12).
Data as JSON: /api/errors/e7b65012b8419970.
Report an issue: GitHub.