zod-commander 0.0.4 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +8 -7
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -68,13 +68,14 @@ var zodCommand = /* @__PURE__ */ __name(({
|
|
|
68
68
|
if (description) command.description(description);
|
|
69
69
|
for (const key in args) command.addArgument(zodArgument(key, args[key]));
|
|
70
70
|
for (const key in opts) command.addOption(zodOption(key, opts[key]));
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
71
|
+
if (action)
|
|
72
|
+
command.action(async (...all) => {
|
|
73
|
+
const resultArgs = Object.fromEntries(
|
|
74
|
+
Object.keys(args ?? {}).map((key, i) => [key, all[i]])
|
|
75
|
+
);
|
|
76
|
+
const resultOpts = all[Object.keys(args ?? {}).length];
|
|
77
|
+
await action(resultArgs, resultOpts);
|
|
78
|
+
});
|
|
78
79
|
return command;
|
|
79
80
|
}, "zodCommand");
|
|
80
81
|
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":["zod","z","InvalidOptionArgumentError","InvalidArgumentError","Argument","Option","Command"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":["zod","z","InvalidOptionArgumentError","InvalidArgumentError","Argument","Option","Command"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from 'zod'\n\nconst zodCore = <T>(zod: z.ZodTypeAny, fn: (zod: z.ZodTypeAny) => T): T => {\n\tconst types = [z.ZodDefault, z.ZodNullable, z.ZodOptional]\n\tfor (const type of types)\n\t\tif (zod instanceof type) return zodCore(zod._def.innerType, fn)\n\tif (zod instanceof z.ZodEffects) return zodCore(zod._def.schema, fn)\n\treturn fn(zod)\n}\n\nconst zodEnumVals = (zod: z.ZodTypeAny): string[] | null =>\n\tzodCore(zod, (zod) => (zod instanceof z.ZodEnum ? zod._def.values : null))\n\nconst zodIsBoolean = (zod: z.ZodTypeAny): boolean =>\n\tzodCore(zod, (zod) => zod instanceof z.ZodBoolean)\n\nconst zodDefault = <Output, Def extends z.ZodTypeDef, Input>(\n\tzod: z.ZodType<Output, Def, Input>,\n): Input | undefined =>\n\tzod instanceof z.ZodEffects\n\t\t? zodDefault(zod._def.schema)\n\t\t: zod instanceof z.ZodDefault\n\t\t\t? zod._def.defaultValue()\n\t\t\t: undefined\n\nconst utils = {\n\tzodCore,\n\tzodEnumVals,\n\tzodIsBoolean,\n\tzodDefault,\n}\n\nexport default utils\n","import {\n\tArgument,\n\tCommand,\n\tInvalidArgumentError,\n\tInvalidOptionArgumentError,\n\tOption,\n} from 'commander'\nimport type { z } from 'zod'\nimport utils from './utils.js'\n\ntype BeforeFirstUnderscore<S> = S extends `${infer T}_${infer _}` ? T : S\n\ntype ReplaceKeyTypes<Type extends z.ZodRawShape> = {\n\t[Key in keyof Type as BeforeFirstUnderscore<Key>]: Type[Key]\n}\n\ntype Prettify<T> = {\n\t[K in keyof T]: T[K]\n} & {}\n\n/**\n * The action function signature for a Zod-powered command.\n * @template A - ZodRawShape for arguments\n * @template O - ZodRawShape for options\n * @param args - Parsed and validated arguments\n * @param opts - Parsed and validated options (with key normalization)\n * @returns A Promise or void\n */\nexport type ZodCommandAction<\n\tA extends z.ZodRawShape,\n\tO extends z.ZodRawShape,\n> = ZodCommandProps<A, O>['action']\n\ntype ZodCommandProps<A extends z.ZodRawShape, O extends z.ZodRawShape> = {\n\tname?: string\n\tdescription?: string\n\targs?: A\n\topts?: O\n\taction?: (\n\t\targs: Prettify<z.infer<z.ZodObject<A>>>,\n\t\topts: Prettify<z.infer<z.ZodObject<ReplaceKeyTypes<O>>>>,\n\t) => Promise<void> | void\n}\n\nconst zodParser = (zod: z.ZodTypeAny, opt?: 'opt') => (value: string) => {\n\tconst result = zod.safeParse(value)\n\tif (result.success) return result.data\n\tconst msg = result.error.issues[0].message\n\tif (opt) throw new InvalidOptionArgumentError(msg)\n\tthrow new InvalidArgumentError(msg)\n}\n\n/**\n * Creates a Commander.js Argument from a Zod schema.\n * Handles optionality, default values, and enum choices.\n * @param key - The argument name\n * @param zod - The Zod schema for the argument\n * @returns A Commander Argument instance\n */\nexport const zodArgument = (key: string, zod: z.ZodTypeAny): Argument => {\n\tconst flag = zod.isOptional() ? `[${key}]` : `<${key}>`\n\tconst arg = new Argument(flag, zod.description)\n\n\tconst def = utils.zodDefault(zod)\n\tif (def !== undefined) arg.default(zod.parse(def))\n\n\tconst choices = utils.zodEnumVals(zod)\n\tif (choices) arg.choices(choices)\n\n\t// parsing must be done at the end to override default parsers\n\treturn arg.argParser(zodParser(zod))\n}\n\n/**\n * Creates a Commander.js Option from a Zod schema.\n * Handles optionality, default values, enum choices, and boolean flags.\n * Supports short flags via description prefix (e.g., 's;...').\n * @param key - The option name (can include underscores for grouping)\n * @param zod - The Zod schema for the option\n * @returns A Commander Option instance\n */\nexport const zodOption = (key: string, zod: z.ZodTypeAny): Option => {\n\tconst abbr = zod.description?.match(/^(\\w);/)?.[1]\n\tconst description = abbr ? zod.description.slice(2) : zod.description\n\tconst arg = key.includes('_') ? key.split('_').slice(1).join('-') : key\n\tif (key.includes('_')) [key] = key.split('_')\n\tconst isBoolean = utils.zodIsBoolean(zod)\n\tconst flag = `--${key}${isBoolean ? '' : ` <${arg}>`}`\n\tconst flags = abbr ? `-${abbr}, ${flag}` : flag\n\tconst opt = new Option(flags, description)\n\n\t// required for boolean flags\n\tif (isBoolean) opt.optional = true\n\telse if (!zod.isOptional()) opt.makeOptionMandatory()\n\n\tconst def = utils.zodDefault(zod)\n\tif (def !== undefined) opt.default(zod.parse(def))\n\n\tconst choices = utils.zodEnumVals(zod)\n\tif (choices) opt.choices(choices)\n\n\t// parsing must be done at the end to override default parsers\n\treturn opt.argParser(zodParser(zod, 'opt'))\n}\n\n/**\n * Defines a Commander.js Command using Zod schemas for arguments and options.\n * Automatically wires up parsing, validation, and help configuration.\n * @template A - ZodRawShape for arguments\n * @template O - ZodRawShape for options\n * @param props - Command properties (name, description, args, opts, action)\n * @returns A Commander Command instance\n */\nexport const zodCommand = <A extends z.ZodRawShape, O extends z.ZodRawShape>({\n\tname,\n\tdescription,\n\targs,\n\topts,\n\taction,\n}: ZodCommandProps<A, O>): Command => {\n\tconst command = new Command(name)\n\tif (description) command.description(description)\n\tfor (const key in args) command.addArgument(zodArgument(key, args[key]))\n\tfor (const key in opts) command.addOption(zodOption(key, opts[key]))\n\tif (action)\n\t\tcommand.action(async (...all) => {\n\t\t\tconst resultArgs = Object.fromEntries(\n\t\t\t\tObject.keys(args ?? {}).map((key, i) => [key, all[i]]),\n\t\t\t) as z.infer<z.ZodObject<A>>\n\t\t\tconst resultOpts = all[Object.keys(args ?? {}).length] as z.infer<\n\t\t\t\tz.ZodObject<ReplaceKeyTypes<O>>\n\t\t\t>\n\t\t\tawait action(resultArgs, resultOpts)\n\t\t})\n\treturn command\n}\n"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -18,11 +18,11 @@ type Prettify<T> = {
|
|
|
18
18
|
*/
|
|
19
19
|
type ZodCommandAction<A extends z.ZodRawShape, O extends z.ZodRawShape> = ZodCommandProps<A, O>['action'];
|
|
20
20
|
type ZodCommandProps<A extends z.ZodRawShape, O extends z.ZodRawShape> = {
|
|
21
|
-
name
|
|
21
|
+
name?: string;
|
|
22
22
|
description?: string;
|
|
23
23
|
args?: A;
|
|
24
24
|
opts?: O;
|
|
25
|
-
action
|
|
25
|
+
action?: (args: Prettify<z.infer<z.ZodObject<A>>>, opts: Prettify<z.infer<z.ZodObject<ReplaceKeyTypes<O>>>>) => Promise<void> | void;
|
|
26
26
|
};
|
|
27
27
|
/**
|
|
28
28
|
* Creates a Commander.js Argument from a Zod schema.
|
package/dist/index.d.ts
CHANGED
|
@@ -18,11 +18,11 @@ type Prettify<T> = {
|
|
|
18
18
|
*/
|
|
19
19
|
type ZodCommandAction<A extends z.ZodRawShape, O extends z.ZodRawShape> = ZodCommandProps<A, O>['action'];
|
|
20
20
|
type ZodCommandProps<A extends z.ZodRawShape, O extends z.ZodRawShape> = {
|
|
21
|
-
name
|
|
21
|
+
name?: string;
|
|
22
22
|
description?: string;
|
|
23
23
|
args?: A;
|
|
24
24
|
opts?: O;
|
|
25
|
-
action
|
|
25
|
+
action?: (args: Prettify<z.infer<z.ZodObject<A>>>, opts: Prettify<z.infer<z.ZodObject<ReplaceKeyTypes<O>>>>) => Promise<void> | void;
|
|
26
26
|
};
|
|
27
27
|
/**
|
|
28
28
|
* Creates a Commander.js Argument from a Zod schema.
|
package/dist/index.js
CHANGED
|
@@ -66,13 +66,14 @@ var zodCommand = /* @__PURE__ */ __name(({
|
|
|
66
66
|
if (description) command.description(description);
|
|
67
67
|
for (const key in args) command.addArgument(zodArgument(key, args[key]));
|
|
68
68
|
for (const key in opts) command.addOption(zodOption(key, opts[key]));
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
69
|
+
if (action)
|
|
70
|
+
command.action(async (...all) => {
|
|
71
|
+
const resultArgs = Object.fromEntries(
|
|
72
|
+
Object.keys(args ?? {}).map((key, i) => [key, all[i]])
|
|
73
|
+
);
|
|
74
|
+
const resultOpts = all[Object.keys(args ?? {}).length];
|
|
75
|
+
await action(resultArgs, resultOpts);
|
|
76
|
+
});
|
|
76
77
|
return command;
|
|
77
78
|
}, "zodCommand");
|
|
78
79
|
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":["zod"],"mappings":"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
|
|
1
|
+
{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":["zod"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from 'zod'\n\nconst zodCore = <T>(zod: z.ZodTypeAny, fn: (zod: z.ZodTypeAny) => T): T => {\n\tconst types = [z.ZodDefault, z.ZodNullable, z.ZodOptional]\n\tfor (const type of types)\n\t\tif (zod instanceof type) return zodCore(zod._def.innerType, fn)\n\tif (zod instanceof z.ZodEffects) return zodCore(zod._def.schema, fn)\n\treturn fn(zod)\n}\n\nconst zodEnumVals = (zod: z.ZodTypeAny): string[] | null =>\n\tzodCore(zod, (zod) => (zod instanceof z.ZodEnum ? zod._def.values : null))\n\nconst zodIsBoolean = (zod: z.ZodTypeAny): boolean =>\n\tzodCore(zod, (zod) => zod instanceof z.ZodBoolean)\n\nconst zodDefault = <Output, Def extends z.ZodTypeDef, Input>(\n\tzod: z.ZodType<Output, Def, Input>,\n): Input | undefined =>\n\tzod instanceof z.ZodEffects\n\t\t? zodDefault(zod._def.schema)\n\t\t: zod instanceof z.ZodDefault\n\t\t\t? zod._def.defaultValue()\n\t\t\t: undefined\n\nconst utils = {\n\tzodCore,\n\tzodEnumVals,\n\tzodIsBoolean,\n\tzodDefault,\n}\n\nexport default utils\n","import {\n\tArgument,\n\tCommand,\n\tInvalidArgumentError,\n\tInvalidOptionArgumentError,\n\tOption,\n} from 'commander'\nimport type { z } from 'zod'\nimport utils from './utils.js'\n\ntype BeforeFirstUnderscore<S> = S extends `${infer T}_${infer _}` ? T : S\n\ntype ReplaceKeyTypes<Type extends z.ZodRawShape> = {\n\t[Key in keyof Type as BeforeFirstUnderscore<Key>]: Type[Key]\n}\n\ntype Prettify<T> = {\n\t[K in keyof T]: T[K]\n} & {}\n\n/**\n * The action function signature for a Zod-powered command.\n * @template A - ZodRawShape for arguments\n * @template O - ZodRawShape for options\n * @param args - Parsed and validated arguments\n * @param opts - Parsed and validated options (with key normalization)\n * @returns A Promise or void\n */\nexport type ZodCommandAction<\n\tA extends z.ZodRawShape,\n\tO extends z.ZodRawShape,\n> = ZodCommandProps<A, O>['action']\n\ntype ZodCommandProps<A extends z.ZodRawShape, O extends z.ZodRawShape> = {\n\tname?: string\n\tdescription?: string\n\targs?: A\n\topts?: O\n\taction?: (\n\t\targs: Prettify<z.infer<z.ZodObject<A>>>,\n\t\topts: Prettify<z.infer<z.ZodObject<ReplaceKeyTypes<O>>>>,\n\t) => Promise<void> | void\n}\n\nconst zodParser = (zod: z.ZodTypeAny, opt?: 'opt') => (value: string) => {\n\tconst result = zod.safeParse(value)\n\tif (result.success) return result.data\n\tconst msg = result.error.issues[0].message\n\tif (opt) throw new InvalidOptionArgumentError(msg)\n\tthrow new InvalidArgumentError(msg)\n}\n\n/**\n * Creates a Commander.js Argument from a Zod schema.\n * Handles optionality, default values, and enum choices.\n * @param key - The argument name\n * @param zod - The Zod schema for the argument\n * @returns A Commander Argument instance\n */\nexport const zodArgument = (key: string, zod: z.ZodTypeAny): Argument => {\n\tconst flag = zod.isOptional() ? `[${key}]` : `<${key}>`\n\tconst arg = new Argument(flag, zod.description)\n\n\tconst def = utils.zodDefault(zod)\n\tif (def !== undefined) arg.default(zod.parse(def))\n\n\tconst choices = utils.zodEnumVals(zod)\n\tif (choices) arg.choices(choices)\n\n\t// parsing must be done at the end to override default parsers\n\treturn arg.argParser(zodParser(zod))\n}\n\n/**\n * Creates a Commander.js Option from a Zod schema.\n * Handles optionality, default values, enum choices, and boolean flags.\n * Supports short flags via description prefix (e.g., 's;...').\n * @param key - The option name (can include underscores for grouping)\n * @param zod - The Zod schema for the option\n * @returns A Commander Option instance\n */\nexport const zodOption = (key: string, zod: z.ZodTypeAny): Option => {\n\tconst abbr = zod.description?.match(/^(\\w);/)?.[1]\n\tconst description = abbr ? zod.description.slice(2) : zod.description\n\tconst arg = key.includes('_') ? key.split('_').slice(1).join('-') : key\n\tif (key.includes('_')) [key] = key.split('_')\n\tconst isBoolean = utils.zodIsBoolean(zod)\n\tconst flag = `--${key}${isBoolean ? '' : ` <${arg}>`}`\n\tconst flags = abbr ? `-${abbr}, ${flag}` : flag\n\tconst opt = new Option(flags, description)\n\n\t// required for boolean flags\n\tif (isBoolean) opt.optional = true\n\telse if (!zod.isOptional()) opt.makeOptionMandatory()\n\n\tconst def = utils.zodDefault(zod)\n\tif (def !== undefined) opt.default(zod.parse(def))\n\n\tconst choices = utils.zodEnumVals(zod)\n\tif (choices) opt.choices(choices)\n\n\t// parsing must be done at the end to override default parsers\n\treturn opt.argParser(zodParser(zod, 'opt'))\n}\n\n/**\n * Defines a Commander.js Command using Zod schemas for arguments and options.\n * Automatically wires up parsing, validation, and help configuration.\n * @template A - ZodRawShape for arguments\n * @template O - ZodRawShape for options\n * @param props - Command properties (name, description, args, opts, action)\n * @returns A Commander Command instance\n */\nexport const zodCommand = <A extends z.ZodRawShape, O extends z.ZodRawShape>({\n\tname,\n\tdescription,\n\targs,\n\topts,\n\taction,\n}: ZodCommandProps<A, O>): Command => {\n\tconst command = new Command(name)\n\tif (description) command.description(description)\n\tfor (const key in args) command.addArgument(zodArgument(key, args[key]))\n\tfor (const key in opts) command.addOption(zodOption(key, opts[key]))\n\tif (action)\n\t\tcommand.action(async (...all) => {\n\t\t\tconst resultArgs = Object.fromEntries(\n\t\t\t\tObject.keys(args ?? {}).map((key, i) => [key, all[i]]),\n\t\t\t) as z.infer<z.ZodObject<A>>\n\t\t\tconst resultOpts = all[Object.keys(args ?? {}).length] as z.infer<\n\t\t\t\tz.ZodObject<ReplaceKeyTypes<O>>\n\t\t\t>\n\t\t\tawait action(resultArgs, resultOpts)\n\t\t})\n\treturn command\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zod-commander",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.5",
|
|
4
4
|
"description": "A TypeScript utility for building type-safe CLI commands using commander and zod.",
|
|
5
5
|
"author": "Román Via-Dufresne Saus <roman910dev@gmail.com>(https://github.com/roman910dev)",
|
|
6
6
|
"license": "MIT",
|