Repository: colinhacks/zod
Pull request #4127 (2025-04-12 12:25:14)

Add Spanish locale (i18n)
Initial base for Spanish (`es`) locale — enhancing Zod v4 [Internationalization](https://v4.zod.dev/error-customization#internationalization)

coderabbitai[bot]: <!-- This is an auto-generated comment: summarize by coderabbit.ai -->
<!-- This is an auto-generated comment: skip review by coderabbit.ai -->

> [!IMPORTANT]
> ## Review skipped
> 
> Auto reviews are disabled on base/target branches other than the default branch.
> 
> 
> 
> Please check the settings in the CodeRabbit UI or the `.coderabbit.yaml` file in this repository. To trigger a single review, invoke the `@coderabbitai review` command.
> 
> You can disable this status message by setting the `reviews.review_status` to `false` in the CodeRabbit configuration file.

<!-- end of auto-generated comment: skip review by coderabbit.ai -->
<!-- tips_start -->

---

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

<details>
<summary>❤️ Share</summary>

- [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai)
- [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai)
- [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai)
- [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

</details>

<details>
<summary>🪧 Tips</summary>

### Chat

There are 3 ways to chat with [CodeRabbit](https://coderabbit.ai?utm_source=oss&utm_medium=github&utm_campaign=colinhacks/zod&utm_content=4127):

- Review comments: Directly reply to a review comment made by CodeRabbit. Example:
  - `I pushed a fix in commit <commit_id>, please review it.`
  - `Generate unit testing code for this file.`
  - `Open a follow-up GitHub issue for this discussion.`
- Files and specific lines of code (under the "Files changed" tab): Tag `@coderabbitai` in a new review comment at the desired location with your query. Examples:
  - `@coderabbitai generate unit testing code for this file.`
  -	`@coderabbitai modularize this function.`
- PR comments: Tag `@coderabbitai` in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
  - `@coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.`
  - `@coderabbitai read src/utils.ts and generate unit testing code.`
  - `@coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.`
  - `@coderabbitai help me debug CodeRabbit configuration file.`

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

### CodeRabbit Commands (Invoked using PR comments)

- `@coderabbitai pause` to pause the reviews on a PR.
- `@coderabbitai resume` to resume the paused reviews.
- `@coderabbitai review` to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
- `@coderabbitai full review` to do a full review from scratch and review all the files again.
- `@coderabbitai summary` to regenerate the summary of the PR.
- `@coderabbitai generate docstrings` to [generate docstrings](https://docs.coderabbit.ai/finishing-touches/docstrings) for this PR.
- `@coderabbitai resolve` resolve all the CodeRabbit review comments.
- `@coderabbitai plan` to trigger planning for file edits and PR creation.
- `@coderabbitai configuration` to show the current CodeRabbit configuration for the repository.
- `@coderabbitai help` to get help.

### Other keywords and placeholders

- Add `@coderabbitai ignore` anywhere in the PR description to prevent this PR from being reviewed.
- Add `@coderabbitai summary` to generate the high-level summary at a specific location in the PR description.
- Add `@coderabbitai` anywhere in the PR title to generate the title automatically.

### CodeRabbit Configuration File (`.coderabbit.yaml`)

- You can programmatically configure CodeRabbit by adding a `.coderabbit.yaml` file to the root of your repository.
- Please see the [configuration documentation](https://docs.coderabbit.ai/guides/configure-coderabbit) for more information.
- If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: `# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json`

### Documentation and Community

- Visit our [Documentation](https://docs.coderabbit.ai) for detailed information on how to use CodeRabbit.
- Join our [Discord Community](http://discord.gg/coderabbit) to get help, request features, and share feedback.
- Follow us on [X/Twitter](https://twitter.com/coderabbitai) for updates and announcements.

</details>

<!-- tips_end -->

Patch:
diff --git a/packages/bench/object-moltar.ts b/packages/bench/object-moltar.ts
index af20667f..8b99ec44 100644
--- a/packages/bench/object-moltar.ts
+++ b/packages/bench/object-moltar.ts
@@ -16,6 +16,20 @@ const z3Schema = z3.object({
   }).strict()
 }).strict();
 
+const z4Schema = z4.object({
+  number: z4.number(),
+  negNumber: z4.number(),
+  maxNumber: z4.number(),
+  string: z4.string(),
+  longString: z4.string(),
+  boolean: z4.boolean(),
+  deeplyNested: z4.strictObject({
+    foo: z4.string(),
+    num: z4.number(),
+    bool: z4.boolean(),
+  }),
+});
+
 const z4SchemaStrict = z4.strictObject({
   number: z4.number(),
   negNumber: z4.number(),
@@ -62,18 +76,21 @@ const DATA = Array.from({ length: 1000 }, () =>
 );
 
 console.log(z3Schema.parse(DATA[0]));
-console.log(z4SchemaLoose.parse(DATA[0]));
+console.log(z4Schema.parse(DATA[0]));
 
 const bench = metabench("z.object() safeParse", {
   zod3() {
     for (const _ of DATA) z3Schema.parse(_);
   },
   zod4() {
-    for (const _ of DATA) z4SchemaStrict.parse(_);
-  },
-  zod4loose() {
-    for (const _ of DATA) z4SchemaLoose.parse(_);
+    for (const _ of DATA) z4Schema.parse(_);
   },
+  // zod4strict() {
+  //   for (const _ of DATA) z4SchemaStrict.parse(_);
+  // },
+  // zod4loose() {
+  //   for (const _ of DATA) z4SchemaLoose.parse(_);
+  // },
 });
 
 await bench.run();
diff --git a/packages/core/jsr.json b/packages/core/jsr.json
index 80b1286a..5a624d7c 100644
--- a/packages/core/jsr.json
+++ b/packages/core/jsr.json
@@ -3,9 +3,7 @@
   "version": "4.0.0-alpha.0",
   "exports": {
     ".": "./src/index.ts",
-    "./package.json": "./package.json",
-    "./locales/en": "./src/locales/en.ts",
-    "./locales/fa": "./src/locales/fa.ts"
+    "./package.json": "./package.json"
   },
   "publish": {
     "include": ["src", "LICENSE", "package.json", "README.md"],
diff --git a/packages/core/src/locales.ts b/packages/core/src/locales.ts
index 893bb5ef..8895c3c3 100644
--- a/packages/core/src/locales.ts
+++ b/packages/core/src/locales.ts
@@ -1,5 +1,3 @@
 import en from "./locales/en.js";
 
-import enGB from "./locales/en-GB.js";
-
-export { en, enGB };
+export { en };
diff --git a/packages/core/src/locales/en-GB.ts b/packages/core/src/locales/en-GB.ts
deleted file mode 100644
index 7332fbfd..00000000
--- a/packages/core/src/locales/en-GB.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import type { $ZodStringFormats } from "../checks.js";
-import type * as errors from "../errors.js";
-import * as util from "../util.js";
-
-const Sizable: Record<string, { unit: string; verb: string }> = {
-  string: { unit: "characters", verb: "to have" },
-  file: { unit: "bytes", verb: "to have" },
-  array: { unit: "items", verb: "to have" },
-  set: { unit: "items", verb: "to have" },
-};
-
-function getSizing(origin: string): { unit: string; verb: string } | null {
-  return Sizable[origin] ?? null;
-}
-
-const Nouns: {
-  [k in $ZodStringFormats | (string & {})]?: string;
-} = {
-  regex: "string",
-  email: "email address",
-  url: "URL",
-  emoji: "emoji",
-  uuid: "UUID",
-  uuidv4: "UUIDv4",
-  uuidv6: "UUIDv6",
-  nanoid: "nanoid",
-  guid: "GUID",
-  cuid: "cuid",
-  cuid2: "cuid2",
-  ulid: "ULID",
-  xid: "XID",
-  ksuid: "KSUID",
-  datetime: "ISO datetime",
-  date: "ISO date",
-  time: "ISO time",
-  duration: "ISO duration",
-  ipv4: "IPv4 address",
-  ipv6: "IPv6 address",
-  base64: "base64-encoded string",
-  base64url: "base64url-encoded string",
-  json_string: "JSON string",
-  e164: "E.164 number",
-  jwt: "JWT",
-};
-
-const error: errors.$ZodErrorMap = (issue) => {
-  switch (issue.code) {
-    case "invalid_type":
-      return `Invalid input: expected ${issue.expected}`;
-    // return `Invalid input: expected ${issue.expected}, received ${util.getParsedType(issue.input)}`;
-    case "invalid_value":
-      if (issue.values.length === 1) return `Invalid input: expected ${util.stringifyPrimitive(issue.values[0])}`;
-      return `Invalid option: expected one of ${util.joinValues(issue.values, "|")}`;
-    case "too_big": {
-      const adj = issue.inclusive ? "<=" : "<";
-      const sizing = getSizing(issue.origin);
-      if (sizing)
-        return `Too big: expected ${issue.origin ?? "value"} to have ${adj}${issue.maximum.toString()} ${sizing.unit ?? "elements"}`;
-      return `Too big: expected ${issue.origin ?? "value"} to be ${adj}${issue.maximum.toString()}`;
-    }
-    case "too_small": {
-      const adj = issue.inclusive ? ">=" : ">";
-      const sizing = getSizing(issue.origin);
-      if (sizing) {
-        return `Too small: expected ${issue.origin} to have ${adj}${issue.minimum.toString()} ${sizing.unit}`;
-      }
-
-      return `Too small: expected ${issue.origin} to be ${adj}${issue.minimum.toString()}`;
-    }
-    case "invalid_format": {
-      const _issue = issue as errors.$ZodStringFormatIssues;
-      if (_issue.format === "starts_with") return `Invalid string: must start with "${issue}"`;
-      if (_issue.format === "ends_with") return `Invalid string: must end with "${_issue.suffix}"`;
-      if (_issue.format === "includes") return `Invalid string: must include "${_issue.includes}"`;
-      if (_issue.format === "regex") return `Invalid string: must match pattern ${_issue.pattern}`;
-      return `Invalid ${Nouns[_issue.format] ?? issue.format}`;
-    }
-    case "not_multiple_of":
-      return `Invalid number: must be a multiple of ${issue.divisor}`;
-    case "unrecognized_keys":
-      return `Unrecognized key${issue.keys.length > 1 ? "s" : ""}: ${util.joinValues(issue.keys, ", ")}`;
-    case "invalid_key":
-      return `Invalid key in ${issue.origin}`;
-    case "invalid_union":
-      return "Invalid input";
-    case "invalid_element":
-      return `Invalid value in ${issue.origin}`;
-    default:
-      return `Invalid input`;
-  }
-};
-
-export { error };
-
-export default function (): { localeError: errors.$ZodErrorMap } {
-  return {
-    localeError: error,
-  };
-}
diff --git a/packages/core/src/locales/en.ts b/packages/core/src/locales/en.ts
index 5de51ee6..55ecf50e 100644
--- a/packages/core/src/locales/en.ts
+++ b/packages/core/src/locales/en.ts
@@ -27,7 +27,8 @@ export const parsedType = (data: any): string => {
       if (data === null) {
         return "null";
       }
-      if (Object.getPrototypeOf(data) !== Object.prototype) {
+
+      if (Object.getPrototypeOf(data) !== Object.prototype && data.constructor) {
         return data.constructor.name;
       }
     }
diff --git a/packages/core/src/locales/es.ts b/packages/core/src/locales/es.ts
new file mode 100644
index 00000000..59a02cf6
--- /dev/null
+++ b/packages/core/src/locales/es.ts
@@ -0,0 +1,124 @@
+import type { $ZodStringFormats } from "../checks.js";
+import type * as errors from "../errors.js";
+import * as util from "../util.js";
+
+const Sizable: Record<string, { unit: string; verb: string }> = {
+  string: { unit: "caracteres", verb: "tener" },
+  file: { unit: "bytes", verb: "tener" },
+  array: { unit: "elementos", verb: "tener" },
+  set: { unit: "elementos", verb: "tener" },
+};
+
+function getSizing(origin: string): { unit: string; verb: string } | null {
+  return Sizable[origin] ?? null;
+}
+
+export const parsedType = (data: any): string => {
+  const t = typeof data;
+
+  switch (t) {
+    case "number": {
+      return Number.isNaN(data) ? "NaN" : "número";
+    }
+    case "object": {
+      if (Array.isArray(data)) {
+        return "arreglo";
+      }
+      if (data === null) {
+        return "nulo";
+      }
+      if (Object.getPrototypeOf(data) !== Object.prototype) {
+        return data.constructor.name;
+      }
+    }
+  }
+  return t;
+};
+
+const Nouns: {
+  [k in $ZodStringFormats | (string & {})]?: string;
+} = {
+  regex: "entrada",
+  email: "dirección de correo electrónico",
+  url: "URL",
+  emoji: "emoji",
+  uuid: "UUID",
+  uuidv4: "UUIDv4",
+  uuidv6: "UUIDv6",
+  nanoid: "nanoid",
+  guid: "GUID",
+  cuid: "cuid",
+  cuid2: "cuid2",
+  ulid: "ULID",
+  xid: "XID",
+  ksuid: "KSUID",
+  datetime: "fecha y hora ISO",
+  date: "fecha ISO",
+  time: "hora ISO",
+  duration: "duración ISO",
+  ipv4: "dirección IPv4",
+  ipv6: "dirección IPv6",
+  cidrv4: "rango IPv4",
+  cidrv6: "rango IPv6",
+  base64: "cadena codificada en base64",
+  base64url: "URL codificada en base64",
+  json_string: "cadena JSON",
+  e164: "número E.164",
+  jwt: "JWT",
+  template_literal: "entrada",
+};
+
+const error: errors.$ZodErrorMap = (issue) => {
+  switch (issue.code) {
+    case "invalid_type":
+      return `Entrada inválida: se esperaba ${issue.expected}, recibido ${parsedType(issue.input)}`;
+    // return `Entrada inválida: se esperaba ${issue.expected}, recibido ${util.getParsedType(issue.input)}`;
+    case "invalid_value":
+      if (issue.values.length === 1) return `Entrada inválida: se esperaba ${util.stringifyPrimitive(issue.values[0])}`;
+      return `Opción inválida: se esperaba una de ${util.joinValues(issue.values, "|")}`;
+    case "too_big": {
+      const adj = issue.inclusive ? "<=" : "<";
+      const sizing = getSizing(issue.origin);
+      if (sizing)
+        return `Demasiado grande: se esperaba que ${issue.origin ?? "valor"} tuviera ${adj}${issue.maximum.toString()} ${sizing.unit ?? "elementos"}`;
+      return `Demasiado grande: se esperaba que ${issue.origin ?? "valor"} fuera ${adj}${issue.maximum.toString()}`;
+    }
+    case "too_small": {
+      const adj = issue.inclusive ? ">=" : ">";
+      const sizing = getSizing(issue.origin);
+      if (sizing) {
+        return `Demasiado pequeño: se esperaba que ${issue.origin} tuviera ${adj}${issue.minimum.toString()} ${sizing.unit}`;
+      }
+
+      return `Demasiado pequeño: se esperaba que ${issue.origin} fuera ${adj}${issue.minimum.toString()}`;
+    }
+    case "invalid_format": {
+      const _issue = issue as errors.$ZodStringFormatIssues;
+      if (_issue.format === "starts_with") return `Cadena inválida: debe comenzar con "${issue}"`;
+      if (_issue.format === "ends_with") return `Cadena inválida: debe terminar en "${_issue.suffix}"`;
+      if (_issue.format === "includes") return `Cadena inválida: debe incluir "${_issue.includes}"`;
+      if (_issue.format === "regex") return `Cadena inválida: debe coincidir con el patrón ${_issue.pattern}`;
+      return `Inválido ${Nouns[_issue.format] ?? issue.format}`;
+    }
+    case "not_multiple_of":
+      return `Número inválido: debe ser múltiplo de ${issue.divisor}`;
+    case "unrecognized_keys":
+      return `Llave${issue.keys.length > 1 ? "s" : ""} desconocida${issue.keys.length > 1 ? "s" : ""}: ${util.joinValues(issue.keys, ", ")}`;
+    case "invalid_key":
+      return `Llave inválida en ${issue.origin}`;
+    case "invalid_union":
+      return "Entrada inválida";
+    case "invalid_element":
+      return `Valor inválido en ${issue.origin}`;
+    default:
+      return `Entrada inválida`;
+  }
+};
+
+export { error };
+
+export default function (): { localeError: errors.$ZodErrorMap } {
+  return {
+    localeError: error,
+  };
+}
diff --git a/packages/core/src/schemas.ts b/packages/core/src/schemas.ts
index 3863770c..cd0327e4 100644
--- a/packages/core/src/schemas.ts
+++ b/packages/core/src/schemas.ts
@@ -199,8 +199,7 @@ export const $ZodType: core.$constructor<$ZodType> = /*@__PURE__*/ core.$constru
           throw new core.$ZodAsyncError();
         }
         if (asyncResult || _ instanceof Promise) {
-          asyncResult = asyncResult ?? Promise.resolve();
-          asyncResult.then(async () => {
+          asyncResult = (asyncResult ?? Promise.resolve()).then(async () => {
             await _;
             const nextLen = payload.issues.length;
             if (nextLen === currLen) return;
@@ -1684,7 +1683,7 @@ export const $ZodObjectLike: core.$constructor<$ZodObjectLike> = /*@__PURE__*/ c
 
     let fastpass!: ReturnType<typeof generateFastpass>;
     const fastEnabled = util.allowsEval.value; // && !def.catchall;
-    const isObject = util.isPlainObject;
+    const isObject = util.isObject;
     const { catchall } = def;
 
     let value!: typeof _normalized.value;
diff --git a/packages/core/src/to-json-schema.ts b/packages/core/src/to-json-schema.ts
index b3d7969e..9d796dff 100644
--- a/packages/core/src/to-json-schema.ts
+++ b/packages/core/src/to-json-schema.ts
@@ -413,8 +413,7 @@ export class JSONSchemaGenerator {
       }
       case "optional": {
         const inner = this.process(def.innerType, params);
-        const json: JSONSchema.BaseSchema = _json as any;
-        json!.oneOf = [inner, { type: "null" }];
+        Object.assign(_json, inner);
         break;
       }
       case "nullable": {
@@ -425,7 +424,6 @@ export class JSONSchemaGenerator {
       case "nonoptional": {
         const inner = this.process(def.innerType, params);
         Object.assign(_json, inner);
-        _json.not = { type: "null" };
         break;
       }
       case "success": {
diff --git a/packages/core/src/versions.ts b/packages/core/src/versions.ts
index d8be5fb3..1deb5622 100644
--- a/packages/core/src/versions.ts
+++ b/packages/core/src/versions.ts
@@ -1,5 +1,5 @@
 export const version = {
   major: 0,
-  minor: 4,
-  patch: 6 as number,
+  minor: 5,
+  patch: 0 as number,
 } as const;
diff --git a/packages/docs/app/(doc)/[[...slug]]/page.tsx b/packages/docs/app/(doc)/[[...slug]]/page.tsx
index 6eace85a..d3b231d1 100644
--- a/packages/docs/app/(doc)/[[...slug]]/page.tsx
+++ b/packages/docs/app/(doc)/[[...slug]]/page.tsx
@@ -26,7 +26,17 @@ export default async function Page(props: {
     });
 
   return (
-    <DocsPage toc={toc} tableOfContent={{ style: "clerk", single: false }} full={false}>
+    <DocsPage
+      toc={toc}
+      tableOfContent={{ style: "clerk", single: false }}
+      full={false}
+      editOnGithub={{
+        owner: "colinhacks",
+        repo: "zod",
+        sha: "v4",
+        path: `packages/docs/content/${page.file.path}`,
+      }}
+    >
       {title && title !== "Intro" ? <DocsTitle>{title}</DocsTitle> : null}
       <DocsDescription>{description}</DocsDescription>
       <DocsBody {...{}}>
diff --git a/packages/docs/components/ecosystem.tsx b/packages/docs/components/ecosystem.tsx
index f908d907..d921ac5b 100644
--- a/packages/docs/components/ecosystem.tsx
+++ b/packages/docs/components/ecosystem.tsx
@@ -17,494 +17,19 @@ const apiLibraries: ZodResource[] = [
     description: "Build end-to-end typesafe APIs without GraphQL.",
     slug: "trpc/trpc",
   },
-  {
-    name: "@anatine/zod-nestjs",
-    url: "https://github.com/anatine/zod-plugins/tree/main/packages/zod-nestjs",
-    description: "Helper methods for using Zod in a NestJS project.",
-    slug: "anatine/zod-plugins",
-  },
-  {
-    name: "zod-endpoints",
-    url: "https://github.com/flock-community/zod-endpoints",
-    description: "Contract-first strictly typed endpoints with Zod. OpenAPI compatible.",
-    slug: "flock-community/zod-endpoints",
-  },
-  {
-    name: "zhttp",
-    url: "https://github.com/evertdespiegeleer/zhttp",
-    description: "An OpenAPI compatible, strictly typed http library with Zod input and response validation.",
-    slug: "evertdespiegeleer/zhttp",
-  },
-  {
-    name: "domain-functions",
-    url: "https://github.com/SeasonedSoftware/domain-functions/",
-    description:
-      "Decouple your business logic from your framework using composable functions. With first-class type inference from end to end powered by Zod schemas.",
-    slug: "SeasonedSoftware/domain-functions",
-  },
-  {
-    name: "@zodios/core",
-    url: "https://github.com/ecyrbe/zodios",
-    description: "A typescript API client with runtime and compile time validation backed by axios and zod.",
-    slug: "ecyrbe/zodios",
-  },
-  {
-    name: "express-zod-api",
-    url: "https://github.com/RobinTail/express-zod-api",
-    description: "Build Express-based APIs with I/O schema validation and custom middlewares.",
-    slug: "RobinTail/express-zod-api",
-  },
-  {
-    name: "tapiduck",
-    url: "https://github.com/sumukhbarve/monoduck/blob/main/src/tapiduck/README.md",
-    description: "End-to-end typesafe JSON APIs with Zod and Express; a bit like tRPC, but simpler.",
-    slug: "sumukhbarve/monoduck",
-  },
-  {
-    name: "koa-zod-router",
-    url: "https://github.com/JakeFenley/koa-zod-router",
-    description: "Create typesafe routes in Koa with I/O validation using Zod.",
-    slug: "JakeFenley/koa-zod-router",
-  },
-  {
-    name: "zod-sockets",
-    url: "https://github.com/RobinTail/zod-sockets",
-    description: "Zod-powered Socket.IO microframework with I/O validation and built-in AsyncAPI specs",
-    slug: "RobinTail/zod-sockets",
-  },
-  {
-    name: "oas-tszod-gen",
-    url: "https://github.com/inkognitro/oas-tszod-gen",
-    description:
-      "Client SDK code generator to convert OpenApi v3 specifications into TS endpoint caller functions with Zod types.",
-    slug: "inkognitro/oas-tszod-gen",
-  },
-  {
-    name: "GQLoom",
-    url: "https://github.com/modevol-com/gqloom",
-    description: "Weave GraphQL schema and resolvers using Zod.",
-    slug: "modevol-com/gqloom",
-  },
 ];
 
-const formIntegrations: ZodResource[] = [
-  {
-    name: "react-hook-form",
-    url: "https://github.com/react-hook-form/resolvers#zod",
-    description: "A first-party Zod resolver for React Hook Form.",
-    slug: "react-hook-form/react-hook-form",
-  },
-  {
-    name: "zod-validation-error",
-    url: "https://github.com/causaly/zod-validation-error",
-    description: "Generate user-friendly error messages from ZodError instances.",
-    slug: "causaly/zod-validation-error",
-  },
-  {
-    name: "zod-formik-adapter",
-    url: "https://github.com/robertLichtnow/zod-formik-adapter",
-    description: "A community-maintained Formik adapter for Zod.",
-    slug: "robertLichtnow/zod-formik-adapter",
-  },
-  {
-    name: "react-zorm",
-    url: "https://github.com/esamattis/react-zorm",
-    description: "Standalone `<form>` generation and validation for React using Zod.",
-    slug: "esamattis/react-zorm",
-  },
-  {
-    name: "zodix",
-    url: "https://github.com/rileytomasek/zodix",
-    description: "Zod utilities for FormData and URLSearchParams in Remix loaders and actions.",
-    slug: "rileytomasek/zodix",
-  },
-  {
-    name: "conform",
-    url: "https://conform.guide/api/zod/parseWithZod",
-    description:
-      "A typesafe form validation library for progressive enhancement of HTML forms. Works with Remix and Next.js.",
-    slug: "edmundhung/conform",
-  },
-  {
-    name: "remix-params-helper",
-    url: "https://github.com/kiliman/remix-params-helper",
-    description: "Simplify integration of Zod with standard URLSearchParams and FormData for Remix apps.",
-    slug: "kiliman/remix-params-helper",
-  },
-  {
-    name: "formik-validator-zod",
-    url: "https://github.com/glazy/formik-validator-zod",
-    description: "Formik-compliant validator library that simplifies using Zod with Formik.",
-    slug: "glazy/formik-validator-zod",
-  },
-  {
-    name: "zod-i18n-map",
-    url: "https://github.com/aiji42/zod-i18n",
-    description: "Useful for translating Zod error messages.",
-    slug: "aiji42/zod-i18n",
-  },
-  {
-    name: "@modular-forms/solid",
-    url: "https://github.com/fabian-hiller/modular-forms",
-    description: "Modular form library for SolidJS that supports Zod for validation.",
-    slug: "fabian-hiller/modular-forms",
-  },
-  {
-    name: "houseform",
-    url: "https://github.com/crutchcorn/houseform/",
-    description: "A React form library that uses Zod for validation.",
-    slug: "crutchcorn/houseform",
-  },
-  {
-    name: "sveltekit-superforms",
-    url: "https://github.com/ciscoheat/sveltekit-superforms",
-    description: "Supercharged form library for SvelteKit with Zod validation.",
-    slug: "ciscoheat/sveltekit-superforms",
-  },
-  {
-    name: "mobx-zod-form",
-    url: "https://github.com/MonoidDev/mobx-zod-form",
-    description: "Data-first form builder based on MobX & Zod.",
-    slug: "MonoidDev/mobx-zod-form",
-  },
-  {
-    name: "@vee-validate/zod",
-    url: "https://github.com/logaretm/vee-validate/tree/main/packages/zod",
-    description: "Form library for Vue.js with Zod schema validation.",
-    slug: "logaretm/vee-validate",
-  },
-  {
-    name: "zod-form-renderer",
-    url: "https://github.com/thepeaklab/zod-form-renderer",
-    description: "Auto-infer form fields from zod schema and render them with react-hook-form with E2E type safety.",
-    slug: "thepeaklab/zod-form-renderer",
-  },
-  {
-    name: "antd-zod",
-    url: "https://github.com/MrBr/antd-zod",
-    description: "Zod adapter for Ant Design form fields validation.",
-    slug: "MrBr/antd-zod",
-  },
-  {
-    name: "frrm",
-    url: "https://github.com/schalkventer/frrm",
-    description: "Tiny 0.5kb Zod-based, HTML form abstraction that goes brr.",
-    slug: "schalkventer/frrm",
-  },
-];
+const formIntegrations: ZodResource[] = [];
 
-const zodToXConverters: ZodResource[] = [
-  {
-    name: "zod-to-ts",
-    url: "https://github.com/sachinraja/zod-to-ts",
-    description: "Generate TypeScript definitions from Zod schemas.",
-    slug: "sachinraja/zod-to-ts",
-  },
-  {
-    name: "zod-to-json-schema",
-    url: "https://github.com/StefanTerdell/zod-to-json-schema",
-    description: "Convert your Zod schemas into JSON Schemas.",
-    slug: "StefanTerdell/zod-to-json-schema",
-  },
-  {
-    name: "@anatine/zod-openapi",
-    url: "https://github.com/anatine/zod-plugins/tree/main/packages/zod-openapi",
-    description: "Converts a Zod schema to an OpenAPI v3.x `SchemaObject`.",
-    slug: "anatine/zod-plugins",
-  },
-  {
-    name: "zod-fast-check",
-    url: "https://github.com/DavidTimms/zod-fast-check",
-    description: "Generate `fast-check` arbitraries from Zod schemas.",
-    slug: "DavidTimms/zod-fast-check",
-  },
-  {
-    name: "zod-dto",
-    url: "https://github.com/kbkk/abitia/tree/master/packages/zod-dto",
-    description: "Generate Nest.js DTOs from a Zod schema.",
-    slug: "kbkk/abitia",
-  },
-  {
-    name: "fastify-type-provider-zod",
-    url: "https://github.com/turkerdev/fastify-type-provider-zod",
-    description: "Create Fastify type providers from Zod schemas.",
-    slug: "turkerdev/fastify-type-provider-zod",
-  },
-  {
-    name: "zod-to-openapi",
-    url: "https://github.com/asteasolutions/zod-to-openapi",
-    description: "Generate full OpenAPI (Swagger) docs from Zod, including schemas, endpoints & parameters.",
-    slug: "asteasolutions/zod-to-openapi",
-  },
-  {
-    name: "nestjs-graphql-zod",
-    url: "https://github.com/incetarik/nestjs-graphql-zod",
-    description:
-      "Generates NestJS GraphQL model classes from Zod schemas. Provides GraphQL method decorators working with Zod schemas.",
-    slug: "incetarik/nestjs-graphql-zod",
-  },
-  {
-    name: "zod-openapi",
-    url: "https://github.com/samchungy/zod-openapi",
-    description: "Create full OpenAPI v3.x documentation from Zod schemas.",
-    slug: "samchungy/zod-openapi",
-  },
-  {
-    name: "fastify-zod-openapi",
-    url: "https://github.com/samchungy/fastify-zod-openapi",
-    description: "Fastify type provider, validation, serialization and @fastify/swagger support for Zod schemas.",
-    slug: "samchungy/fastify-zod-openapi",
-  },
-  {
-    name: "typeschema",
-    url: "https://typeschema.com/",
-    description: "Universal adapter for schema validation.",
-    slug: "decs/typeschema",
-  },
-  {
-    name: "zodex",
-    url: "https://github.com/commonbaseapp/zodex",
-    description: "(De)serialization for zod schemas",
-    slug: "commonbaseapp/zodex",
-  },
-];
+const zodToXConverters: ZodResource[] = [];
 
-const xToZodConverters: ZodResource[] = [
-  {
-    name: "ts-to-zod",
-    url: "https://github.com/fabien0102/ts-to-zod",
-    description: "Convert TypeScript definitions into Zod schemas.",
-    slug: "fabien0102/ts-to-zod",
-  },
-  {
-    name: "@runtyping/zod",
-    url: "https://github.com/johngeorgewright/runtyping",
-    description: "Generate Zod from static types & JSON schema.",
-    slug: "johngeorgewright/runtyping",
-  },
-  {
-    name: "json-schema-to-zod",
-    url: "https://github.com/StefanTerdell/json-schema-to-zod",
-    description: "Convert your JSON Schemas into Zod schemas.",
-    slug: "StefanTerdell/json-schema-to-zod",
-  },
-  {
-    name: "json-to-zod",
-    url: "https://github.com/rsinohara/json-to-zod",
-    description: "Convert JSON objects into Zod schemas.",
-    slug: "rsinohara/json-to-zod",
-  },
-  {
-    name: "GraphQL schema gen",
-    url: "https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema",
-    description: "GraphQL Code Generator plugin to generate form validation schema from your GraphQL schema.",
-    slug: "Code-Hex/graphql-codegen-typescript-validation-schema",
-  },
-  {
-    name: "zod-prisma",
-    url: "https://github.com/CarterGrimmeisen/zod-prisma",
-    description: "Generate Zod schemas from your Prisma schema.",
-    slug: "CarterGrimmeisen/zod-prisma",
-  },
-  {
-    name: "Supervillain",
-    url: "https://github.com/Southclaws/supervillain",
-    description: "Generate Zod schemas from your Go structs.",
-    slug: "Southclaws/supervillain",
-  },
-  {
-    name: "prisma-zod-generator",
-    url: "https://github.com/omar-dulaimi/prisma-zod-generator",
-    description: "Emit Zod schemas from your Prisma schema.",
-    slug: "omar-dulaimi/prisma-zod-generator",
-  },
-  {
-    name: "drizzle-zod",
-    url: "https://orm.drizzle.team/docs/zod",
-    description: "Emit Zod schemas from your Drizzle schema.",
-    slug: "drizzle-team/drizzle-orm",
-  },
-  {
-    name: "prisma-trpc-generator",
-    url: "https://github.com/omar-dulaimi/prisma-trpc-generator",
-    description: "Emit fully implemented tRPC routers and their validation schemas using Zod.",
-    slug: "omar-dulaimi/prisma-trpc-generator",
-  },
-  {
-    name: "zod-prisma-types",
-    url: "https://github.com/chrishoermann/zod-prisma-types",
-    description: "Create Zod types from your Prisma models.",
-    slug: "chrishoermann/zod-prisma-types",
-  },
-  {
-    name: "quicktype",
-    url: "https://app.quicktype.io/",
-    description: "Convert JSON objects and JSON schemas into Zod schemas.",
-    slug: "glideapps/quicktype",
-  },
-  {
-    name: "@sanity-typed/zod",
-    url: "https://github.com/saiichihashimoto/sanity-typed/tree/main/packages/zod",
-    description: "Generate Zod Schemas from Sanity Schemas.",
-    slug: "saiichihashimoto/sanity-typed",
-  },
-  {
-    name: "java-to-zod",
-    url: "https://github.com/ivangreene/java-to-zod",
-    description: "Convert POJOs to Zod schemas",
-    slug: "ivangreene/java-to-zod",
-  },
-  {
-    name: "Orval",
-    url: "https://github.com/anymaniax/orval",
-    description: "Generate Zod schemas from OpenAPI schemas",
-    slug: "anymaniax/orval",
-  },
-  {
-    name: "Kubb",
-    url: "https://github.com/kubb-labs/kubb",
-    description: "Generate SDKs and Zod schemas from your OpenAPI schemas",
-    slug: "kubb-labs/kubb",
-  },
-];
+const xToZodConverters: ZodResource[] = [];
 
-const mockingLibraries: ZodResource[] = [
-  {
-    name: "@anatine/zod-mock",
-    url: "https://github.com/anatine/zod-plugins/tree/main/packages/zod-mock",
-    description: "Generate mock data from a Zod schema. Powered by faker.js.",
-    slug: "anatine/zod-plugins",
-  },
-  {
-    name: "zod-mocking",
-    url: "https://github.com/dipasqualew/zod-mocking",
-    description: "Generate mock data from your Zod schemas.",
-    slug: "dipasqualew/zod-mocking",
-  },
-  {
-    name: "zod-fixture",
-    url: "https://github.com/timdeschryver/zod-fixture",
-    description:
-      "Use your zod schemas to automate the generation of non-relevant test fixtures in a deterministic way.",
-    slug: "timdeschryver/zod-fixture",
-  },
-  {
-    name: "zocker",
-    url: "https://zocker.sigrist.dev",
-    description: "Generate plausible mock-data from your schemas.",
-    slug: "LorisSigrist/zocker",
-  },
-  {
-    name: "zodock",
-    url: "https://github.com/ItMaga/zodock",
-    description: "Generate mock data based on Zod schemas.",
-    slug: "ItMaga/zodock",
-  },
-  {
-    name: "zod-schema-faker",
-    url: "https://github.com/soc221b/zod-schema-faker",
-    description: "Generates mock data from Zod schemas. Powered by @faker-js/faker and randexp.js",
-    slug: "soc221b/zod-schema-faker",
-  },
-];
+const mockingLibraries: ZodResource[] = [];
 
-const poweredByZodProjects: ZodResource[] = [
-  {
-    name: "freerstore",
-    url: "https://github.com/JacobWeisenburger/freerstore",
-    description: "Firestore cost optimizer.",
-    slug: "JacobWeisenburger/freerstore",
-  },
-  {
-    name: "slonik",
-    url: "https://github.com/gajus/slonik/tree/gajus/add-zod-validation-backwards-compatible#runtime-validation-and-static-type-inference",
-    description: "Node.js Postgres client with strong Zod integration.",
-    slug: "gajus/slonik",
-  },
-  {
-    name: "schemql",
-    url: "https://github.com/a2lix/schemql",
-    description: "Enhances your SQL workflow by combining raw SQL with targeted type safety and schema validation.",
-    slug: "a2lix/schemql",
-  },
-  {
-    name: "soly",
-    url: "https://github.com/mdbetancourt/soly",
-    description: "Create CLI applications with zod.",
-    slug: "mdbetancourt/soly",
-  },
-  {
-    name: "pastel",
-    url: "reesericci/zod-struct",
-    description: "Create CLI applications with react, zod, and ink.",
-    slug: "vadimdemedes/pastel",
-  },
-  {
-    name: "zod-xlsx",
-    url: "https://github.com/sidwebworks/zod-xlsx",
-    description: "A xlsx based resource validator using Zod schemas.",
-    slug: "sidwebworks/zod-xlsx",
-  },
-  {
-    name: "znv",
-    url: "https://github.com/lostfictions/znv",
-    description: "Type-safe environment parsing and validation for Node.js with Zod schemas.",
-    slug: "lostfictions/znv",
-  },
-  {
-    name: "zod-config",
-    url: "https://github.com/alexmarqs/zod-config",
-    description: "Load configurations across multiple sources with flexible adapters, ensuring type safety with Zod.",
-    slug: "alexmarqs/zod-config",
-  },
-  {
-    name: "unplugin-environment",
-    url: "https://github.com/r17x/js/tree/main/packages/unplugin-environment#readme",
-    description:
-      "A plugin for loading environment variables safely with schema validation, simple with virtual module, type-safe with intellisense, and better DX 🔥 🚀 👷. Powered by Zod.",
-    slug: "r17x/js",
-  },
-  {
-    name: "zod-struct",
-    url: "https://codeberg.org/reesericci/zod-struct",
-    description: "Create runtime-checked structs with Zod.",
-    slug: "reesericci/zod-struct",
-    stars: 0,
-  },
-];
+const poweredByZodProjects: ZodResource[] = [];
 
-const zodUtilities: ZodResource[] = [
-  {
-    name: "zod_utilz",
-    url: "https://github.com/JacobWeisenburger/zod_utilz",
-    description: "Framework agnostic utilities for Zod.",
-    slug: "JacobWeisenburger/zod_utilz",
-  },
-  {
-    name: "zod-playground",
-    url: "https://github.com/marilari88/zod-playground",
-    description: "A tool for learning and testing Zod schema validation functionalities.",
-    slug: "marilari88/zod-playground",
-  },
-  {
-    name: "zod-sandbox",
-    url: "https://github.com/nereumelo/zod-sandbox",
-    description: "Controlled environment for testing zod schemas.",
-    slug: "nereumelo/zod-sandbox",
-  },
-  {
-    name: "zod-dev",
-    url: "https://github.com/schalkventer/zod-dev",
-    description: "Conditionally disables Zod runtime parsing in production.",
-    slug: "schalkventer/zod-dev",
-  },
-  {
-    name: "zod-accelerator",
-    url: "https://github.com/duplojs/duplojs-zod-accelerator",
-    description: "Accelerates Zod's throughput up to ~100x.",
-    slug: "duplojs/duplojs-zod-accelerator",
-  },
-];
+const zodUtilities: ZodResource[] = [];
 
 export {
   apiLibraries,
diff --git a/packages/docs/content/api.mdx b/packages/docs/content/api.mdx
index 1dd796d9..20f3ac51 100644
--- a/packages/docs/content/api.mdx
+++ b/packages/docs/content/api.mdx
@@ -621,7 +621,7 @@ To create a new enum schema, excluding certain values:
 <Tab value="zod">
 ```ts
 const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
-const SalmonAndTroutOnly = FishEnum.extract(["Salmon", "Trout"]);
+const TunaOnly = FishEnum.exclude(["Salmon", "Trout"]);
 ```
 </Tab>
 <Tab value="@zod/mini">
@@ -640,7 +640,7 @@ To create a new enum schema, extracting certain values:
 <Tab value="zod">
 ```ts
 const FishEnum = z.enum(["Salmon", "Tuna", "Trout"]);
-const TunaOnly = FishEnum.exclude(["Salmon", "Trout"]);
+const SalmonAndTroutOnly = FishEnum.extract(["Salmon", "Trout"]);
 ```
 </Tab>
 <Tab value="@zod/mini">
diff --git a/packages/docs/content/ecosystem.mdx b/packages/docs/content/ecosystem.mdx
index ead32539..571b31c0 100644
--- a/packages/docs/content/ecosystem.mdx
+++ b/packages/docs/content/ecosystem.mdx
@@ -55,103 +55,3 @@ There are a growing number of tools that are built atop or support Zod natively!
 ## Zod Utilities
 
 <ZodUtilities />
-
-{/* 
-## API libraries
-
-- [`tRPC`](https://github.com/trpc/trpc): Build end-to-end typesafe APIs without GraphQL.
-- [`@anatine/zod-nestjs`](https://github.com/anatine/zod-plugins/tree/main/packages/zod-nestjs): Helper methods for using Zod in a NestJS project.
-- [`zod-endpoints`](https://github.com/flock-community/zod-endpoints): Contract-first strictly typed endpoints with Zod. OpenAPI compatible.
-- [`zhttp`](https://github.com/evertdespiegeleer/zhttp): An OpenAPI compatible, strictly typed http library with Zod input and response validation.
-- [`domain-functions`](https://github.com/SeasonedSoftware/domain-functions/): Decouple your business logic from your framework using composable functions. With first-class type inference from end to end powered by Zod schemas.
-- [`@zodios/core`](https://github.com/ecyrbe/zodios): A typescript API client with runtime and compile time validation backed by axios and zod.
-- [`express-zod-api`](https://github.com/RobinTail/express-zod-api): Build Express-based APIs with I/O schema validation and custom middlewares.
-- [`tapiduck`](https://github.com/sumukhbarve/monoduck/blob/main/src/tapiduck/README.md): End-to-end typesafe JSON APIs with Zod and Express; a bit like tRPC, but simpler.
-- [`koa-zod-router`](https://github.com/JakeFenley/koa-zod-router): Create typesafe routes in Koa with I/O validation using Zod.
-- [`zod-sockets`](https://github.com/RobinTail/zod-sockets): Zod-powered Socket.IO microframework with I/O validation and built-in AsyncAPI specs
-- [`oas-tszod-gen`](https://github.com/inkognitro/oas-tszod-gen): Client SDK code generator to convert OpenApi v3 specifications into TS endpoint caller functions with Zod types.
-- [`GQLoom`](https://github.com/modevol-com/gqloom): Weave GraphQL schema and resolvers using Zod.
-
-## Form integrations
-
-- [`react-hook-form`](https://github.com/react-hook-form/resolvers#zod): A first-party Zod resolver for React Hook Form.
-- [`zod-validation-error`](https://github.com/causaly/zod-validation-error): Generate user-friendly error messages from `ZodError`s.
-- [`zod-formik-adapter`](https://github.com/robertLichtnow/zod-formik-adapter): A community-maintained Formik adapter for Zod.
-- [`react-zorm`](https://github.com/esamattis/react-zorm): Standalone `<form>` generation and validation for React using Zod.
-- [`zodix`](https://github.com/rileytomasek/zodix): Zod utilities for FormData and URLSearchParams in Remix loaders and actions.
-- [`conform`](https://conform.guide/api/zod/parseWithZod): A typesafe form validation library for progressive enhancement of HTML forms. Works with Remix and Next.js.
-- [`remix-params-helper`](https://github.com/kiliman/remix-params-helper): Simplify integration of Zod with standard URLSearchParams and FormData for Remix apps.
-- [`formik-validator-zod`](https://github.com/glazy/formik-validator-zod): Formik-compliant validator library that simplifies using Zod with Formik.
-- [`zod-i18n-map`](https://github.com/aiji42/zod-i18n): Useful for translating Zod error messages.
-- [`@modular-forms/solid`](https://github.com/fabian-hiller/modular-forms): Modular form library for SolidJS that supports Zod for validation.
-- [`houseform`](https://github.com/crutchcorn/houseform/): A React form library that uses Zod for validation.
-- [`sveltekit-superforms`](https://github.com/ciscoheat/sveltekit-superforms): Supercharged form library for SvelteKit with Zod validation.
-- [`mobx-zod-form`](https://github.com/MonoidDev/mobx-zod-form): Data-first form builder based on MobX & Zod.
-- [`@vee-validate/zod`](https://github.com/logaretm/vee-validate/tree/main/packages/zod): Form library for Vue.js with Zod schema validation.
-- [`zod-form-renderer`](https://github.com/thepeaklab/zod-form-renderer): Auto-infer form fields from zod schema and render them with react-hook-form with E2E type safety.
-- [`antd-zod`](https://github.com/MrBr/antd-zod): Zod adapter for Ant Design form fields validation.
-- [`frrm`](https://github.com/schalkventer/frrm): Tiny 0.5kb Zod-based, HTML form abstraction that goes brr.
-
-## Zod to X
-
-- [`zod-to-ts`](https://github.com/sachinraja/zod-to-ts): Generate TypeScript definitions from Zod schemas.
-- [`zod-to-json-schema`](https://github.com/StefanTerdell/zod-to-json-schema): Convert your Zod schemas into [JSON Schemas](https://json-schema.org/).
-- [`@anatine/zod-openapi`](https://github.com/anatine/zod-plugins/tree/main/packages/zod-openapi): Converts a Zod schema to an OpenAPI v3.x `SchemaObject`.
-- [`zod-fast-check`](https://github.com/DavidTimms/zod-fast-check): Generate `fast-check` arbitraries from Zod schemas.
-- [`zod-dto`](https://github.com/kbkk/abitia/tree/master/packages/zod-dto): Generate Nest.js DTOs from a Zod schema.
-- [`fastify-type-provider-zod`](https://github.com/turkerdev/fastify-type-provider-zod): Create Fastify type providers from Zod schemas.
-- [`zod-to-openapi`](https://github.com/asteasolutions/zod-to-openapi): Generate full OpenAPI (Swagger) docs from Zod, including schemas, endpoints & parameters.
-- [`nestjs-graphql-zod`](https://github.com/incetarik/nestjs-graphql-zod): Generates NestJS GraphQL model classes from Zod schemas. Provides GraphQL method decorators working with Zod schemas.
-- [`zod-openapi`](https://github.com/samchungy/zod-openapi): Create full OpenAPI v3.x documentation from Zod schemas.
-- [`fastify-zod-openapi`](https://github.com/samchungy/fastify-zod-openapi): Fastify type provider, validation, serialization and @fastify/swagger support for Zod schemas.
-- [`typeschema`](https://typeschema.com/): Universal adapter for schema validation.
-- [`zodex`](https://github.com/commonbaseapp/zodex): (De)serialization for zod schemas
-
-## X to Zod
-
-- [`ts-to-zod`](https://github.com/fabien0102/ts-to-zod): Convert TypeScript definitions into Zod schemas.
-- [`@runtyping/zod`](https://github.com/johngeorgewright/runtyping): Generate Zod from static types & JSON schema.
-- [`json-schema-to-zod`](https://github.com/StefanTerdell/json-schema-to-zod): Convert your [JSON Schemas](https://json-schema.org/) into Zod schemas. [Live demo](https://StefanTerdell.github.io/json-schema-to-zod-react/).
-- [`json-to-zod`](https://github.com/rsinohara/json-to-zod): Convert JSON objects into Zod schemas. [Live demo](https://rsinohara.github.io/json-to-zod-react/).
-- [`graphql-codegen-typescript-validation-schema`](https://github.com/Code-Hex/graphql-codegen-typescript-validation-schema): GraphQL Code Generator plugin to generate form validation schema from your GraphQL schema.
-- [`zod-prisma`](https://github.com/CarterGrimmeisen/zod-prisma): Generate Zod schemas from your Prisma schema.
-- [`Supervillain`](https://github.com/Southclaws/supervillain): Generate Zod schemas from your Go structs.
-- [`prisma-zod-generator`](https://github.com/omar-dulaimi/prisma-zod-generator): Emit Zod schemas from your Prisma schema.
-- [`drizzle-zod`](https://orm.drizzle.team/docs/zod): Emit Zod schemas from your Drizzle schema.
-- [`prisma-trpc-generator`](https://github.com/omar-dulaimi/prisma-trpc-generator): Emit fully implemented tRPC routers and their validation schemas using Zod.
-- [`zod-prisma-types`](https://github.com/chrishoermann/zod-prisma-types) Create Zod types from your Prisma models.
-- [`quicktype`](https://app.quicktype.io/): Convert JSON objects and JSON schemas into Zod schemas.
-- [`@sanity-typed/zod`](https://github.com/saiichihashimoto/sanity-typed/tree/main/packages/zod): Generate Zod Schemas from [Sanity Schemas](https://www.sanity.io/docs/schema-types).
-- [`java-to-zod`](https://github.com/ivangreene/java-to-zod): Convert POJOs to Zod schemas
-- [`Orval`](https://github.com/anymaniax/orval): Generate Zod schemas from OpenAPI schemas
-- [`Kubb`](https://github.com/kubb-labs/kubb): Generate SDKs and Zod schemas from your OpenAPI schemas
-
-## Mocking
-
-- [`@anatine/zod-mock`](https://github.com/anatine/zod-plugins/tree/main/packages/zod-mock): Generate mock data from a Zod schema. Powered by [faker.js](https://github.com/faker-js/faker).
-- [`zod-mocking`](https://github.com/dipasqualew/zod-mocking): Generate mock data from your Zod schemas.
-- [`zod-fixture`](https://github.com/timdeschryver/zod-fixture): Use your zod schemas to automate the generation of non-relevant test fixtures in a deterministic way.
-- [`zocker`](https://zocker.sigrist.dev): Generate plausible mock-data from your schemas.
-- [`zodock`](https://github.com/ItMaga/zodock) Generate mock data based on Zod schemas.
-- [`zod-schema-faker`](https://github.com/soc221b/zod-schema-faker) Generates mock data from Zod schemas. Powered by [@faker-js/faker](https://github.com/faker-js/faker) and [randexp.js](https://github.com/fent/randexp.js)
-
-## Powered by Zod
-
-- [`freerstore`](https://github.com/JacobWeisenburger/freerstore): Firestore cost optimizer.
-- [`slonik`](https://github.com/gajus/slonik/tree/gajus/add-zod-validation-backwards-compatible#runtime-validation-and-static-type-inference): Node.js Postgres client with strong Zod integration.
-- [`schemql`](https://github.com/a2lix/schemql): Enhances your SQL workflow by combining raw SQL with targeted type safety and schema validation.
-- [`soly`](https://github.com/mdbetancourt/soly): Create CLI applications with zod.
-- [`pastel`](https://github.com/vadimdemedes/pastel): Create CLI applications with react, zod, and ink.
-- [`zod-xlsx`](https://github.com/sidwebworks/zod-xlsx): A xlsx based resource validator using Zod schemas.
-- [`znv`](https://github.com/lostfictions/znv): Type-safe environment parsing and validation for Node.js with Zod schemas.
-- [`zod-config`](https://github.com/alexmarqs/zod-config): Load configurations across multiple sources with flexible adapters, ensuring type safety with Zod.
-- [`unplugin-environment`](https://github.com/r17x/js/tree/main/packages/unplugin-environment#readme): A plugin for loading enviroment variables safely with schema validation, simple with virtual module, type-safe with intellisense, and better DX 🔥 🚀 👷. Powered by Zod.
-- [`zod-struct`](https://codeberg.org/reesericci/zod-struct): Create runtime-checked structs with Zod.
-
-## Utilities for Zod
-
-- [`zod_utilz`](https://github.com/JacobWeisenburger/zod_utilz): Framework agnostic utilities for Zod.
-- [`zod-playground`](https://github.com/marilari88/zod-playground): A tool for learning and testing Zod schema validation functionalities. [Link](https://zod-playground.vercel.app/).
-- [`zod-sandbox`](https://github.com/nereumelo/zod-sandbox): Controlled environment for testing zod schemas. [Live demo](https://zod-sandbox.vercel.app/).
-- [`zod-dev`](https://github.com/schalkventer/zod-dev): Conditionally disables Zod runtime parsing in production.
-- [`zod-accelerator`](https://github.com/duplojs/duplojs-zod-accelerator): Accelerates Zod's throughput up to ~100x. */}
diff --git a/packages/docs/content/error-customization.mdx b/packages/docs/content/error-customization.mdx
index 8f0271e0..48b1fc58 100644
--- a/packages/docs/content/error-customization.mdx
+++ b/packages/docs/content/error-customization.mdx
@@ -321,14 +321,14 @@ For convenience, you can also references these from the `z.core` namespace expor
 ```ts
 import * as z from "zod";
 
-z.config(z.core.locales.en());
+z.config(z.locales.en());
 ```
 </Tab>
 <Tab value="@zod/mini">
 ```ts
 import * as z from "@zod/mini";
 
-z.config(z.core.locales.en());
+z.config(z.locales.en());
 ```
 </Tab>
 </Tabs>
diff --git a/packages/docs/content/packages/mini.mdx b/packages/docs/content/packages/mini.mdx
index 9796ebbb..1127c3bb 100644
--- a/packages/docs/content/packages/mini.mdx
+++ b/packages/docs/content/packages/mini.mdx
@@ -157,7 +157,7 @@ This means, by default the `message` property of all issues will simply read `"I
 ```ts
 import * as z from "@zod/mini";
 
-z.config(z.core.locales.en());
+z.config(z.locales.en());
 ```
 
 Refer to the [Locales](/error-customization#internationalization) docs for more on localization.
diff --git a/packages/docs/content/v4/index.mdx b/packages/docs/content/v4/index.mdx
index 1d4eed4c..245a362d 100644
--- a/packages/docs/content/v4/index.mdx
+++ b/packages/docs/content/v4/index.mdx
@@ -640,7 +640,7 @@ Zod 4 introduces a new `locales` API for globally translating error messages int
 import * as z from "zod";
 
 // configure English locale (default)
-z.config(z.core.locales.en());
+z.config(z.locales.en());
 ```
 
 At the time of this writing only the English locale is available; There will be a call for pull request from the community shortly; this section will be updated with a list of supported languages as they become available.
diff --git a/packages/mini/jsr.json b/packages/mini/jsr.json
index 5dd63f8a..e53e37ee 100644
--- a/packages/mini/jsr.json
+++ b/packages/mini/jsr.json
@@ -3,9 +3,7 @@
   "version": "4.0.0-alpha.0",
   "exports": {
     ".": "./src/index.ts",
-    "./package.json": "./package.json",
-    "./locales/en": "./src/locales/en.ts",
-    "./locales/fa": "./src/locales/fa.ts"
+    "./package.json": "./package.json"
   },
   "publish": {
     "include": ["src", "LICENSE", "package.json", "README.md"],
diff --git a/packages/mini/src/external.ts b/packages/mini/src/external.ts
index 71c8f8ab..e7524601 100644
--- a/packages/mini/src/external.ts
+++ b/packages/mini/src/external.ts
@@ -19,6 +19,7 @@ export {
   treeifyError,
   prettifyError,
   toJSONSchema,
+  locales,
 } from "@zod/core";
 
 /** A special constant with type `never` */
diff --git a/packages/treeshake/zod-locales.ts b/packages/treeshake/zod-locales.ts
index 5d550ff3..07223b95 100644
--- a/packages/treeshake/zod-locales.ts
+++ b/packages/treeshake/zod-locales.ts
@@ -1,5 +1,5 @@
 import { z } from "@zod/mini";
 
-z.config(z.core.locales.en());
+z.config(z.locales.en());
 
 z.string().parse(12);
diff --git a/packages/zod/jsr.json b/packages/zod/jsr.json
index df4606ea..bca902f3 100644
--- a/packages/zod/jsr.json
+++ b/packages/zod/jsr.json
@@ -3,9 +3,7 @@
   "version": "4.0.0-alpha.0",
   "exports": {
     ".": "./src/index.ts",
-    "./package.json": "./package.json",
-    "./locales/en": "./src/locales/en.ts",
-    "./locales/fa": "./src/locales/fa.ts"
+    "./package.json": "./package.json"
   },
   "publish": {
     "include": ["src", "LICENSE", "package.json", "README.md"],
diff --git a/packages/zod/src/external.ts b/packages/zod/src/external.ts
index a2f0dfdc..fe099468 100644
--- a/packages/zod/src/external.ts
+++ b/packages/zod/src/external.ts
@@ -26,4 +26,5 @@ export {
   treeifyError,
   prettifyError,
   toJSONSchema,
+  locales,
 } from "@zod/core";
diff --git a/packages/zod/src/schemas.ts b/packages/zod/src/schemas.ts
index 09153dd0..65bee960 100644
--- a/packages/zod/src/schemas.ts
+++ b/packages/zod/src/schemas.ts
@@ -1259,14 +1259,12 @@ export interface ZodObject<
   keyof(): ZodEnum<util.ToEnum<keyof Shape & string>>;
   catchall<T extends core.$ZodType>(schema: T): ZodObject<Shape, Record<string, T["_zod"]["output"]>>;
 
-  /** @deprecated Use `z.looseObject()` instead. */
+  /** @deprecated Use `z.looseObject()` or `.loose()` instead. */
   passthrough(): ZodObject<Shape, Record<string, unknown>>;
-  // /** @deprecated Use `z.looseObject()` instead. */
-  // nonstrict(): ZodObject<Shape>;
-  /** @deprecated Use `z.looseObject()` instead. */
+
   loose(): ZodObject<Shape, Record<string, unknown>>;
 
-  /** @deprecated Use `z.strictObject()` instead. */
+  /** The `z.strictObject()` API is preferred. */
   strict(): ZodObject<Shape, {}>;
 
   /** @deprecated This is the default behavior. This method call is likely unnecessary. */
diff --git a/play.ts b/play.ts
index a6f32fb0..f26f2754 100644
--- a/play.ts
+++ b/play.ts
@@ -1,3 +1,6 @@
 import * as z from "zod";
 
-console.log(z.object({}).parse([]));
+const Schema = z.object({
+  limit: z.int().default(0),
+});
+type Schema = z.infer<typeof Schema>;


Test patch:
diff --git a/packages/core/tests/locales/en.test.ts b/packages/core/tests/locales/en.test.ts
new file mode 100644
index 00000000..b06aaddd
--- /dev/null
+++ b/packages/core/tests/locales/en.test.ts
@@ -0,0 +1,22 @@
+import { expect, test } from "vitest";
+import { parsedType } from "../../src/locales/en.js";
+
+test("parsedType", () => {
+  expect(parsedType("string")).toBe("string");
+  expect(parsedType(1)).toBe("number");
+  expect(parsedType(true)).toBe("boolean");
+  expect(parsedType(null)).toBe("null");
+  expect(parsedType(undefined)).toBe("undefined");
+  expect(parsedType([])).toBe("array");
+  expect(parsedType({})).toBe("object");
+  expect(parsedType(new Date())).toBe("Date");
+  expect(parsedType(new Map())).toBe("Map");
+  expect(parsedType(new Set())).toBe("Set");
+  expect(parsedType(new Error())).toBe("Error");
+
+  const nullPrototype = Object.create(null);
+  expect(parsedType(nullPrototype)).toBe("object");
+
+  const doubleNullPrototype = Object.create(Object.create(null));
+  expect(parsedType(doubleNullPrototype)).toBe("object");
+});
diff --git a/packages/mini/tests/object.test.ts b/packages/mini/tests/object.test.ts
index 3db8f214..d40735da 100644
--- a/packages/mini/tests/object.test.ts
+++ b/packages/mini/tests/object.test.ts
@@ -28,6 +28,12 @@ test("z.object", () => {
   // "test?" is required in ZodObject
   expect(() => z.parse(a, { name: "john", age: "30" })).toThrow();
   expect(() => z.parse(a, "hello")).toThrow();
+
+  // null prototype
+  const schema = z.object({ a: z.string() });
+  const obj = Object.create(null);
+  obj.a = "foo";
+  expect(schema.parse(obj)).toEqual({ a: "foo" });
 });
 
 test("z.strictObject", () => {
diff --git a/packages/zod/tests/async-parsing.test.ts b/packages/zod/tests/async-parsing.test.ts
index f45f1345..a2d2c213 100644
--- a/packages/zod/tests/async-parsing.test.ts
+++ b/packages/zod/tests/async-parsing.test.ts
@@ -331,7 +331,14 @@ test("async validation multiple errors 2", async () => {
     z.object({
       hello: z.string(),
       foo: z.object({
-        bar: z.number().refine(is_async ? async () => false : () => false),
+        bar: z.number().refine(
+          is_async
+            ? async () =>
+                new Promise((resolve) => {
+                  setTimeout(() => resolve(false), 500);
+                })
+            : () => false
+        ),
       }),
     });
 
diff --git a/packages/zod/tests/json-schema.test.ts b/packages/zod/tests/json-schema.test.ts
index b30aba3d..5c3114e9 100644
--- a/packages/zod/tests/json-schema.test.ts
+++ b/packages/zod/tests/json-schema.test.ts
@@ -603,6 +603,7 @@ describe("toJSONSchema", () => {
     const schema = z.object({
       required: z.string(),
       optional: z.string().optional(),
+      nonoptional: z.string().optional().nonoptional(),
     });
 
     const result = toJSONSchema(schema);
@@ -610,15 +611,11 @@ describe("toJSONSchema", () => {
     expect(result).toMatchInlineSnapshot(`
       {
         "properties": {
+          "nonoptional": {
+            "type": "string",
+          },
           "optional": {
-            "oneOf": [
-              {
-                "type": "string",
-              },
-              {
-                "type": "null",
-              },
-            ],
+            "type": "string",
           },
           "required": {
             "type": "string",
@@ -626,6 +623,7 @@ describe("toJSONSchema", () => {
         },
         "required": [
           "required",
+          "nonoptional",
         ],
         "type": "object",
       }
diff --git a/packages/zod/tests/object.test.ts b/packages/zod/tests/object.test.ts
index 18344196..46283b7a 100644
--- a/packages/zod/tests/object.test.ts
+++ b/packages/zod/tests/object.test.ts
@@ -440,3 +440,10 @@ test("assignability", () => {
   z.interface({ "a?": z.string() }) satisfies z.ZodInterface;
   z.interface({ "?a": z.string() }) satisfies z.ZodInterface;
 });
+
+test("null prototype", () => {
+  const schema = z.object({ a: z.string() });
+  const obj = Object.create(null);
+  obj.a = "foo";
+  expect(schema.parse(obj)).toEqual({ a: "foo" });
+});