zod-opts
Version:
node.js CLI option parser / validator using Zod
365 lines • 13.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.createPositionalArg = exports.createOption = void 0;
const zod_1 = require("zod");
const zod_util_1 = require("../src/zod_util");
function createOption({ type = zod_1.z.string(), alias = "a", description = "description1", }) {
return { type, alias, description };
}
exports.createOption = createOption;
function createPositionalArg({ type = zod_1.z.string(), name = "pos1", description = "description1", }) {
return { type, name, description };
}
exports.createPositionalArg = createPositionalArg;
describe("optionToInternal()", () => {
describe("string", () => {
test("common", () => {
expect((0, zod_util_1.optionToInternal)({
type: zod_1.z
.string()
.describe("zod_description")
.regex(/^[0-9A-Za-z].+$/),
alias: "a",
description: "description1",
}, "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: true,
isArray: false,
});
});
test("default", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.string().default("default"),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: "default",
isArray: false,
});
});
test("optional", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.string().optional(),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
isArray: false,
});
});
test("optional with default", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.string().default("default").optional(),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
isArray: false,
});
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.optional(zod_1.z.string().default("default")),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
isArray: false,
});
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.string().optional().default("default"),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: "default",
isArray: false,
});
});
test("refine", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.string().refine(() => true),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: true,
isArray: false,
});
});
test("refine & default", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z
.string()
.refine(() => true)
.default("default"),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: "default",
isArray: false,
});
});
test("refine & optional", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z
.string()
.refine(() => true)
.optional(),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
isArray: false,
});
});
});
describe("number", () => {
test("", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.number().max(256),
}), "name1")).toEqual({
type: "number",
name: "name1",
alias: "a",
description: "description1",
required: true,
defaultValue: undefined,
isArray: false,
});
});
test("default", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.number().max(256).default(10),
}), "name1")).toEqual({
type: "number",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: 10,
isArray: false,
});
});
});
describe("boolean", () => {
test("", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.boolean(),
}), "name1")).toEqual({
type: "boolean",
name: "name1",
alias: "a",
description: "description1",
required: true,
defaultValue: undefined,
isArray: false,
});
});
});
describe("enum", () => {
test("common", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.enum(["a", "b", "c"]),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: true,
defaultValue: undefined,
enumValues: ["a", "b", "c"],
isArray: false,
});
});
test("default", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.enum(["a", "b", "c"]).default("b"),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: "b",
enumValues: ["a", "b", "c"],
isArray: false,
});
});
test("optional", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.enum(["a", "b", "c"]).optional(),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: undefined,
enumValues: ["a", "b", "c"],
isArray: false,
});
});
test("define and default", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z
.enum(["a", "b", "c"])
.refine(() => true)
.default("b"),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: "b",
enumValues: ["a", "b", "c"],
isArray: false,
});
});
});
describe("union", () => {
test("string", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.union([zod_1.z.string(), zod_1.z.string()]),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: true,
defaultValue: undefined,
isArray: false,
});
});
test("number", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.union([zod_1.z.number(), zod_1.z.number().max(256)]),
}), "name1")).toEqual({
type: "number",
name: "name1",
alias: "a",
description: "description1",
required: true,
default: undefined,
isArray: false,
});
});
test("boolean", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.union([zod_1.z.boolean(), zod_1.z.boolean()]),
}), "name1")).toEqual({
type: "boolean",
name: "name1",
alias: "a",
description: "description1",
required: true,
isArray: false,
});
});
test("is not required when some elements have default value", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.union([zod_1.z.string(), zod_1.z.string().default("default1")]),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: undefined,
isArray: false,
});
});
test("is not required when some element are optional", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.union([zod_1.z.string(), zod_1.z.string().optional()]),
}), "name1")).toEqual({
type: "string",
name: "name1",
alias: "a",
description: "description1",
required: false,
defaultValue: undefined,
isArray: false,
});
});
test("refine union of refine element", () => {
expect((0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z
.union([
zod_1.z.boolean().refine(() => true),
zod_1.z.boolean().default(true),
])
.refine(() => true),
}), "name1")).toEqual({
type: "boolean",
name: "name1",
alias: "a",
description: "description1",
required: true,
isArray: false,
});
});
});
describe("throw runtime error on unsupported default value", () => {
test("invalid type", () => {
expect(() => {
(0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.object({ a: zod_1.z.number() }).default({ a: 10 }),
}), "name1");
}).toThrowError(new Error('Unsupported default value: {"a":10}'));
});
test("invalid item type of array", () => {
expect(() => {
(0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z.array(zod_1.z.boolean()).default([true, false]),
}), "name1");
}).toThrowError(new Error("Unsupported default value: [true,false]"));
});
test("multiple type items of array", () => {
expect(() => {
(0, zod_util_1.optionToInternal)(createOption({
type: zod_1.z
.array(zod_1.z.union([zod_1.z.string(), zod_1.z.number()]))
.default([10, "false"]),
}), "name1");
}).toThrowError(new Error('Unsupported default value: [10,"false"]'));
});
});
});
describe("positionalArgumentToInternal()", () => {
describe("array", () => {
test("common", () => {
expect((0, zod_util_1.positionalArgumentToInternal)({
name: "name1",
type: zod_1.z.array(zod_1.z.string()).describe("zod_description"),
description: "description1",
})).toEqual({
type: "string",
name: "name1",
description: "description1",
required: true,
isArray: true,
});
});
});
});
//# sourceMappingURL=zod_util.test.js.map