@orpc/zod 2.0.0-beta.22 → 2.0.0-beta.23

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.d.mts CHANGED
@@ -4,12 +4,24 @@ import { ToJSONSchemaParams, $input, $output } from 'zod/v4/core';
4
4
  import * as json_schema_typed from 'json-schema-typed';
5
5
 
6
6
  interface ZodToJsonSchemaConverterOptions extends Omit<ToJSONSchemaParams, 'target' | 'io'> {
7
+ /**
8
+ * Caches conversion results in a WeakMap keyed by the Zod schema instance,
9
+ * so converting the same schema again is free.
10
+ *
11
+ * When enabled, repeated conversions return the same JSON schema object,
12
+ * so treat returned schemas as immutable.
13
+ *
14
+ * @default false
15
+ */
16
+ cache?: boolean;
7
17
  }
8
18
  declare class ZodToJsonSchemaConverter implements JsonSchemaConverter {
9
- private readonly options;
10
- constructor(options?: ZodToJsonSchemaConverterOptions);
19
+ private readonly toJSONSchemaParams;
20
+ private readonly cache;
21
+ constructor({ cache, ...toJSONSchemaParams }?: ZodToJsonSchemaConverterOptions);
11
22
  condition(schema: AnySchema | undefined, _direction: JsonSchemaConverterDirection): boolean;
12
23
  convert(schema: AnySchema | undefined, direction: JsonSchemaConverterDirection): [jsonSchema: JsonSchema, optional: boolean];
24
+ private convertUncached;
13
25
  private convertZod;
14
26
  private getCustomJsonSchema;
15
27
  }
package/dist/index.d.ts CHANGED
@@ -4,12 +4,24 @@ import { ToJSONSchemaParams, $input, $output } from 'zod/v4/core';
4
4
  import * as json_schema_typed from 'json-schema-typed';
5
5
 
6
6
  interface ZodToJsonSchemaConverterOptions extends Omit<ToJSONSchemaParams, 'target' | 'io'> {
7
+ /**
8
+ * Caches conversion results in a WeakMap keyed by the Zod schema instance,
9
+ * so converting the same schema again is free.
10
+ *
11
+ * When enabled, repeated conversions return the same JSON schema object,
12
+ * so treat returned schemas as immutable.
13
+ *
14
+ * @default false
15
+ */
16
+ cache?: boolean;
7
17
  }
8
18
  declare class ZodToJsonSchemaConverter implements JsonSchemaConverter {
9
- private readonly options;
10
- constructor(options?: ZodToJsonSchemaConverterOptions);
19
+ private readonly toJSONSchemaParams;
20
+ private readonly cache;
21
+ constructor({ cache, ...toJSONSchemaParams }?: ZodToJsonSchemaConverterOptions);
11
22
  condition(schema: AnySchema | undefined, _direction: JsonSchemaConverterDirection): boolean;
12
23
  convert(schema: AnySchema | undefined, direction: JsonSchemaConverterDirection): [jsonSchema: JsonSchema, optional: boolean];
24
+ private convertUncached;
13
25
  private convertZod;
14
26
  private getCustomJsonSchema;
15
27
  }
package/dist/index.mjs CHANGED
@@ -6,14 +6,32 @@ const JSON_SCHEMA_INPUT_REGISTRY = registry();
6
6
  const JSON_SCHEMA_OUTPUT_REGISTRY = registry();
7
7
 
8
8
  class ZodToJsonSchemaConverter {
9
- constructor(options = {}) {
10
- this.options = options;
9
+ toJSONSchemaParams;
10
+ cache;
11
+ constructor({ cache, ...toJSONSchemaParams } = {}) {
12
+ this.toJSONSchemaParams = toJSONSchemaParams;
13
+ if (cache) {
14
+ this.cache = { input: /* @__PURE__ */ new WeakMap(), output: /* @__PURE__ */ new WeakMap() };
15
+ }
11
16
  }
12
17
  condition(schema, _direction) {
13
18
  return schema?.["~standard"].vendor === "zod";
14
19
  }
15
20
  convert(schema, direction) {
16
21
  const zodSchema = schema;
22
+ if (this.cache) {
23
+ const cached = this.cache[direction].get(zodSchema);
24
+ if (cached) {
25
+ return cached;
26
+ }
27
+ }
28
+ const result = this.convertUncached(zodSchema, direction);
29
+ if (this.cache) {
30
+ this.cache[direction].set(zodSchema, result);
31
+ }
32
+ return result;
33
+ }
34
+ convertUncached(zodSchema, direction) {
17
35
  const jsonSchema = this.convertZod(zodSchema, direction);
18
36
  let optional = false;
19
37
  try {
@@ -28,7 +46,7 @@ class ZodToJsonSchemaConverter {
28
46
  convertZod(schema, direction) {
29
47
  const jsonSchema = toJSONSchema(schema, {
30
48
  unrepresentable: "any",
31
- ...this.options,
49
+ ...this.toJSONSchemaParams,
32
50
  target: "draft-2020-12",
33
51
  io: direction,
34
52
  override: (ctx) => {
@@ -63,11 +81,11 @@ class ZodToJsonSchemaConverter {
63
81
  if (customJsonSchema) {
64
82
  Object.assign(ctx.jsonSchema, customJsonSchema);
65
83
  }
66
- this.options.override?.(ctx);
84
+ this.toJSONSchemaParams.override?.(ctx);
67
85
  }
68
86
  });
69
87
  const { $schema, ...rest } = jsonSchema;
70
- const registry = this.options.metadata ?? globalRegistry;
88
+ const registry = this.toJSONSchemaParams.metadata ?? globalRegistry;
71
89
  const { id } = registry.get(schema) || {};
72
90
  if (typeof id === "string" && rest.$ref === void 0) {
73
91
  const { $defs = {}, ...restWithoutDefs } = rest;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@orpc/zod",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.22",
4
+ "version": "2.0.0-beta.23",
5
5
  "license": "MIT",
6
6
  "homepage": "https://orpc.dev",
7
7
  "repository": {
@@ -30,7 +30,7 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "json-schema-typed": "^8.0.2",
33
- "@orpc/json-schema": "2.0.0-beta.22"
33
+ "@orpc/json-schema": "2.0.0-beta.23"
34
34
  },
35
35
  "devDependencies": {
36
36
  "zod": "^4.4.3"