agent_patch
runs/2026-02-27__21-30-28__gpt-5-1-codex-mini/flux-pr-4970/flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/agent-logs/agent.patch
6921 bytes
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/docs/content/api.mdx b/app/packages/docs/content/api.mdx
index 1bcb69d..1e84339 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/docs/content/api.mdx
+++ b/app/packages/docs/content/api.mdx
@@ -218,6 +218,21 @@ z.string().check(z.toUpperCase()); // toUpperCase
</Tab>
</Tabs>
+Zod also exposes a **Unicode normalization helper** (`z.normalize`) that mirrors `String.prototype.normalize`. Provide one of the Unicode forms (`"NFC"`, `"NFD"`, `"NFKC"`, or `"NFKD"`) before running other checks to keep strings canonical:
+
+<Tabs groupId="lib" items={["Zod", "Zod Mini"]}>
+<Tab value="Zod">
+```ts
+z.string().normalize("NFC"); // normalize Unicode text
+```
+</Tab>
+<Tab value="Zod Mini">
+```ts
+z.string().check(z.normalize("NFC")); // normalize Unicode text
+```
+</Tab>
+</Tabs>
+
## String formats
To validate against some common string formats:
@@ -2742,4 +2757,3 @@ const MyFunction = z.function({
const computeTrimmedLength = MyFunction.implement((input) => input.trim.length);
```
-
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/jsr.json b/app/packages/zod/jsr.json
index 4005c45..20e6e2a 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/jsr.json
+++ b/app/packages/zod/jsr.json
@@ -1,6 +1,6 @@
{
"name": "@zod/zod",
- "version": "4.0.8",
+ "version": "4.0.9",
"exports": {
"./package.json": "./package.json",
".": "./src/index.ts",
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/package.json b/app/packages/zod/package.json
index d079aab..751c4e0 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/package.json
+++ b/app/packages/zod/package.json
@@ -1,6 +1,6 @@
{
"name": "zod",
- "version": "4.0.8",
+ "version": "4.0.9",
"type": "module",
"author": "Colin McDonnell <zod@colinhacks.com>",
"description": "TypeScript-first schema declaration and validation library with static type inference",
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/classic/schemas.ts b/app/packages/zod/src/v4/classic/schemas.ts
index a912e22..cef310b 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/classic/schemas.ts
+++ b/app/packages/zod/src/v4/classic/schemas.ts
@@ -1535,9 +1535,13 @@ export function literal<const T extends util.Literal>(
params?: string | core.$ZodLiteralParams
): ZodLiteral<T>;
export function literal(value: any, params: any) {
+ const values = Array.isArray(value) ? value : [value];
+ if (values.length === 0) {
+ throw new Error("Literal schemas must include at least one value.");
+ }
return new ZodLiteral({
type: "literal",
- values: Array.isArray(value) ? value : [value],
+ values,
...util.normalizeParams(params),
});
}
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/classic/tests/literal.test.ts b/app/packages/zod/src/v4/classic/tests/literal.test.ts
index 8c48b20..8a85882 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/classic/tests/literal.test.ts
+++ b/app/packages/zod/src/v4/classic/tests/literal.test.ts
@@ -8,6 +8,9 @@ const literalTunaCustomMessage = z.literal("tuna", {
});
const literalFortyTwo = z.literal(42);
const literalTrue = z.literal(true);
+test("literal requires at least one value", () => {
+ expect(() => z.literal([] as const)).toThrow("Literal schemas must include at least one value.");
+});
test("passing validations", () => {
literalTuna.parse("tuna");
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/classic/tests/union.test.ts b/app/packages/zod/src/v4/classic/tests/union.test.ts
index f787693..668a588 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/classic/tests/union.test.ts
+++ b/app/packages/zod/src/v4/classic/tests/union.test.ts
@@ -134,3 +134,29 @@ test("non-aborted errors", () => {
}
`);
});
+
+test("union requires a single non-aborted branch", () => {
+ const continuingBranch = (label: string) =>
+ z.string().transform((value, ctx) => {
+ ctx.issues.push({
+ code: "custom",
+ message: label,
+ input: value,
+ continue: true,
+ });
+ return value;
+ });
+
+ const schema = z.union([continuingBranch("first"), continuingBranch("second")]);
+ const result = schema.safeParse("value");
+ expect(result.success).toBe(false);
+
+ if (!result.success) {
+ const issue = result.error.issues[0];
+ expect(issue.code).toBe("invalid_union");
+ const invalidUnion = issue as { errors: Array<Array<{ code: string }>> };
+ expect(invalidUnion.errors).toHaveLength(2);
+ expect(invalidUnion.errors[0][0].code).toBe("custom");
+ expect(invalidUnion.errors[1][0].code).toBe("custom");
+ }
+});
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/core/api.ts b/app/packages/zod/src/v4/core/api.ts
index 10cab7f..46c8d0c 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/core/api.ts
+++ b/app/packages/zod/src/v4/core/api.ts
@@ -1255,9 +1255,13 @@ export function _literal<const T extends util.Literal>(
params?: string | $ZodLiteralParams
): schemas.$ZodLiteral<T>;
export function _literal(Class: util.SchemaClass<schemas.$ZodLiteral>, value: any, params: any) {
+ const values = Array.isArray(value) ? value : [value];
+ if (values.length === 0) {
+ throw new Error("Literal schemas must include at least one value.");
+ }
return new Class({
type: "literal",
- values: Array.isArray(value) ? value : [value],
+ values,
...util.normalizeParams(params),
});
}
diff --git a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/core/schemas.ts b/app/packages/zod/src/v4/core/schemas.ts
index 0622c5d..8b180cb 100644
--- a/tmp/agent-patch-flux-pr-4970.1-of-1.2026-02-27__21-30-28__gpt-5-1-codex-mini/app/packages/zod/src/v4/core/schemas.ts
+++ b/app/packages/zod/src/v4/core/schemas.ts
@@ -1911,7 +1911,7 @@ function handleUnionResults(results: ParsePayload[], final: ParsePayload, inst:
}
const nonaborted = results.filter((r) => !util.aborted(r));
- if (nonaborted.length > 0) {
+ if (nonaborted.length === 1) {
final.value = nonaborted[0].value;
return nonaborted[0];
}