@rexeus/typeweaver-zod-to-ts 0.10.5 → 0.11.0

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/README.md CHANGED
@@ -49,17 +49,19 @@ The library provides complete TypeScript type generation for the following Zod s
49
49
  - **Objects**: `z.object()` with nested properties and optional fields
50
50
  - **Unions**: `z.union()`
51
51
  - **Intersections**: `z.intersection()`
52
- - **Modifiers**: `z.optional()`, `z.nullable()`, `z.default()`
53
- - **Special types**: `z.unknown()`, `z.any()`, `z.void()`, `z.never()`, `z.null()`, `z.undefined()`
52
+ - **Modifiers**: `z.optional()`, `z.nullable()`, `z.default()`, `z.nonoptional()`, `z.readonly()`,
53
+ `z.catch()`
54
+ - **Special types**: `z.unknown()`, `z.any()`, `z.void()`, `z.never()`, `z.null()`, `z.undefined()`,
55
+ `z.nan()`, `z.file()`, `z.success()`
54
56
  - **Async types**: `z.promise()`
57
+ - **Pipes**: `z.pipe()` outputs the pipe output schema type; unsupported output schemas still fall
58
+ back to `unknown`
55
59
 
56
60
  ### ⚠️ Unsupported Types
57
61
 
58
62
  The following Zod types are not yet implemented and will fall back to `unknown` type:
59
63
 
60
- - **Advanced types**: `z.lazy()`, `z.templateLiteral()`, `z.custom()`, `z.transform()`, `z.pipe()`
61
- - **Modifiers**: `z.nonoptional()`, `z.readonly()`, `z.catch()`
62
- - **Special types**: `z.nan()`, `z.file()`, `z.success()`
64
+ - **Advanced types**: `z.lazy()`, `z.templateLiteral()`, `z.custom()`, `z.transform()`
63
65
 
64
66
  > **Note**: When encountering unsupported Zod types, the library gracefully falls back to
65
67
  > TypeScript's `unknown` type to maintain type safety.
package/dist/index.cjs CHANGED
@@ -179,12 +179,13 @@ function fromZodOptional(zodOptional) {
179
179
  function fromZodDefault(zodDefault) {
180
180
  return withoutUndefined(fromZod(zodDefault._zod.def.innerType));
181
181
  }
182
- function withoutUndefined(type) {
183
- if ((0, typescript.isParenthesizedTypeNode)(type)) return withoutUndefined(type.type);
182
+ function withoutUndefined(type, fallbackType = type) {
183
+ if ((0, typescript.isParenthesizedTypeNode)(type)) return withoutUndefined(type.type, fallbackType);
184
+ if (type.kind === typescript.SyntaxKind.UndefinedKeyword) return fallbackType;
184
185
  if (!(0, typescript.isUnionTypeNode)(type)) return type;
185
- const types = type.types.map(withoutUndefined).flatMap((nextType) => (0, typescript.isUnionTypeNode)(nextType) ? Array.from(nextType.types) : [nextType]).filter((nextType) => nextType.kind !== typescript.SyntaxKind.UndefinedKeyword);
186
+ const types = type.types.map((nextType) => withoutUndefined(nextType)).flatMap((nextType) => (0, typescript.isUnionTypeNode)(nextType) ? Array.from(nextType.types) : [nextType]).filter((nextType) => nextType.kind !== typescript.SyntaxKind.UndefinedKeyword);
186
187
  const [singleType] = types;
187
- if (types.length === 0) return type;
188
+ if (types.length === 0) return fallbackType;
188
189
  if (types.length === 1 && singleType) return singleType;
189
190
  return typescript.factory.createUnionTypeNode(types);
190
191
  }
@@ -197,39 +198,150 @@ function fromZodCustom(_zodCustom) {
197
198
  function fromZodTransform(_zodTransform) {
198
199
  return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
199
200
  }
200
- function fromZodNonOptional(_zodNonOptional) {
201
- return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
201
+ function fromZodNonOptional(zodNonOptional) {
202
+ return withoutUndefined(fromZod(zodNonOptional._zod.def.innerType), typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.NeverKeyword));
202
203
  }
203
- function fromZodReadonly(_zodReadonly) {
204
- return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
204
+ function fromZodReadonly(zodReadonly) {
205
+ return createReadonlyType(fromZod(zodReadonly._zod.def.innerType));
205
206
  }
206
207
  function fromZodNaN(_zodNaN) {
207
- return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
208
+ return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.NumberKeyword);
208
209
  }
209
- function fromZodPipe(_zodPipe) {
210
- return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
210
+ function fromZodPipe(zodPipe) {
211
+ return fromZod(zodPipe._zod.def.out);
211
212
  }
212
213
  function fromZodSuccess(_zodSuccess) {
213
- return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
214
+ return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.BooleanKeyword);
214
215
  }
215
- function fromZodCatch(_zodCatch) {
216
- return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
216
+ function fromZodCatch(zodCatch) {
217
+ return fromZod(zodCatch._zod.def.innerType);
217
218
  }
218
219
  function fromZodFile(_zodFile) {
219
- return typescript.factory.createKeywordTypeNode(typescript.SyntaxKind.UnknownKeyword);
220
- }
221
- /**
222
- * Returns a TypeScript AST node representing the property key.
223
- * If the key is a valid JavaScript identifier, returns an Identifier node.
224
- * Otherwise, returns a StringLiteral node.
225
- *
226
- * @param {string} key - The property key to convert.
227
- * @returns {Identifier | StringLiteral} The corresponding AST node for the property key.
228
- */
220
+ return typescript.factory.createTypeReferenceNode(typescript.factory.createIdentifier("File"));
221
+ }
222
+ function createReadonlyType(type) {
223
+ if ((0, typescript.isParenthesizedTypeNode)(type)) return createReadonlyType(type.type);
224
+ if ((0, typescript.isUnionTypeNode)(type)) return typescript.factory.createUnionTypeNode(type.types.map(createReadonlyType));
225
+ if ((0, typescript.isArrayTypeNode)(type) || (0, typescript.isTupleTypeNode)(type)) return typescript.factory.createTypeOperatorNode(typescript.SyntaxKind.ReadonlyKeyword, type);
226
+ if (isReadonlyPrimitiveType(type) || (0, typescript.isLiteralTypeNode)(type)) return type;
227
+ if ((0, typescript.isTypeReferenceNode)(type)) {
228
+ const typeName = (0, typescript.isIdentifier)(type.typeName) ? type.typeName.escapedText.toString() : void 0;
229
+ if (typeName === "Map") return typescript.factory.createTypeReferenceNode(typescript.factory.createIdentifier("ReadonlyMap"), type.typeArguments);
230
+ if (typeName === "Set") return typescript.factory.createTypeReferenceNode(typescript.factory.createIdentifier("ReadonlySet"), type.typeArguments);
231
+ if (typeName === "Date" || typeName === "Promise") return type;
232
+ }
233
+ return typescript.factory.createTypeReferenceNode(typescript.factory.createIdentifier("Readonly"), [type]);
234
+ }
235
+ function isReadonlyPrimitiveType(type) {
236
+ return [
237
+ typescript.SyntaxKind.AnyKeyword,
238
+ typescript.SyntaxKind.BigIntKeyword,
239
+ typescript.SyntaxKind.BooleanKeyword,
240
+ typescript.SyntaxKind.NeverKeyword,
241
+ typescript.SyntaxKind.NumberKeyword,
242
+ typescript.SyntaxKind.StringKeyword,
243
+ typescript.SyntaxKind.SymbolKeyword,
244
+ typescript.SyntaxKind.UndefinedKeyword,
245
+ typescript.SyntaxKind.UnknownKeyword,
246
+ typescript.SyntaxKind.VoidKeyword
247
+ ].includes(type.kind);
248
+ }
249
+ const RESERVED_IDENTIFIER_NAMES = new Set([
250
+ "abstract",
251
+ "accessor",
252
+ "any",
253
+ "as",
254
+ "asserts",
255
+ "async",
256
+ "await",
257
+ "bigint",
258
+ "boolean",
259
+ "break",
260
+ "case",
261
+ "catch",
262
+ "class",
263
+ "const",
264
+ "constructor",
265
+ "continue",
266
+ "debugger",
267
+ "declare",
268
+ "default",
269
+ "delete",
270
+ "do",
271
+ "else",
272
+ "enum",
273
+ "export",
274
+ "extends",
275
+ "false",
276
+ "finally",
277
+ "for",
278
+ "from",
279
+ "function",
280
+ "get",
281
+ "global",
282
+ "if",
283
+ "implements",
284
+ "import",
285
+ "in",
286
+ "infer",
287
+ "instanceof",
288
+ "interface",
289
+ "intrinsic",
290
+ "is",
291
+ "keyof",
292
+ "let",
293
+ "module",
294
+ "namespace",
295
+ "never",
296
+ "new",
297
+ "null",
298
+ "number",
299
+ "object",
300
+ "of",
301
+ "out",
302
+ "override",
303
+ "package",
304
+ "private",
305
+ "protected",
306
+ "public",
307
+ "readonly",
308
+ "require",
309
+ "return",
310
+ "satisfies",
311
+ "set",
312
+ "static",
313
+ "string",
314
+ "super",
315
+ "switch",
316
+ "symbol",
317
+ "this",
318
+ "throw",
319
+ "true",
320
+ "try",
321
+ "type",
322
+ "typeof",
323
+ "undefined",
324
+ "unique",
325
+ "unknown",
326
+ "using",
327
+ "var",
328
+ "void",
329
+ "while",
330
+ "with",
331
+ "yield"
332
+ ]);
229
333
  function createTsAstPropertyKey(key) {
230
- if (/^[$A-Z_a-z][\w$]*$/.test(key)) return typescript.factory.createIdentifier(key);
334
+ if (isSafePropertyIdentifier(key)) return typescript.factory.createIdentifier(key);
231
335
  return typescript.factory.createStringLiteral(key);
232
336
  }
337
+ function isSafePropertyIdentifier(key) {
338
+ return isIdentifierName(key) && !RESERVED_IDENTIFIER_NAMES.has(key);
339
+ }
340
+ function isIdentifierName(value) {
341
+ const [firstCharacter] = value;
342
+ if (!firstCharacter) return false;
343
+ return (0, typescript.isIdentifierStart)(firstCharacter.codePointAt(0), typescript.ScriptTarget.Latest) && Array.from(value.slice(firstCharacter.length)).every((character) => (0, typescript.isIdentifierPart)(character.codePointAt(0), typescript.ScriptTarget.Latest));
344
+ }
233
345
  //#endregion
234
346
  //#region src/tsTypePrinter.ts
235
347
  function print(tsType) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/tsTypeGenerator.ts","../src/tsTypePrinter.ts"],"mappings":";;;;iBAuDgB,OAAA,CAAQ,OAAA,EAAS,QAAA,GAAW,QAAA;;;iBC9C5B,KAAA,CAAM,MAAA,EAAQ,QAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/tsTypeGenerator.ts","../src/tsTypePrinter.ts"],"mappings":";;;;iBA+DgB,OAAA,CAAQ,OAAA,EAAS,QAAA,GAAW,QAAA;;;iBCtD5B,KAAA,CAAM,MAAA,EAAQ,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/tsTypeGenerator.ts","../src/tsTypePrinter.ts"],"mappings":";;;;iBAuDgB,OAAA,CAAQ,OAAA,EAAS,QAAA,GAAW,QAAA;;;iBC9C5B,KAAA,CAAM,MAAA,EAAQ,QAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/tsTypeGenerator.ts","../src/tsTypePrinter.ts"],"mappings":";;;;iBA+DgB,OAAA,CAAQ,OAAA,EAAS,QAAA,GAAW,QAAA;;;iBCtD5B,KAAA,CAAM,MAAA,EAAQ,QAAA"}
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { EmitHint, ScriptKind, ScriptTarget, SyntaxKind, createPrinter, createSourceFile, factory, isParenthesizedTypeNode, isUnionTypeNode } from "typescript";
1
+ import { EmitHint, ScriptKind, ScriptTarget, SyntaxKind, createPrinter, createSourceFile, factory, isArrayTypeNode, isIdentifier, isIdentifierPart, isIdentifierStart, isLiteralTypeNode, isParenthesizedTypeNode, isTupleTypeNode, isTypeReferenceNode, isUnionTypeNode } from "typescript";
2
2
  import { $ZodAny, $ZodArray, $ZodBigInt, $ZodBoolean, $ZodCatch, $ZodCustom, $ZodDate, $ZodDefault, $ZodEnum, $ZodFile, $ZodIntersection, $ZodLazy, $ZodLiteral, $ZodMap, $ZodNaN, $ZodNever, $ZodNonOptional, $ZodNull, $ZodNullable, $ZodNumber, $ZodObject, $ZodOptional, $ZodPipe, $ZodPromise, $ZodReadonly, $ZodRecord, $ZodSet, $ZodString, $ZodSuccess, $ZodSymbol, $ZodTemplateLiteral, $ZodTransform, $ZodTuple, $ZodUndefined, $ZodUnion, $ZodUnknown, $ZodVoid } from "zod/v4/core";
3
3
  //#region src/errors/EmptyZodLiteralError.ts
4
4
  var EmptyZodLiteralError = class extends Error {
@@ -178,12 +178,13 @@ function fromZodOptional(zodOptional) {
178
178
  function fromZodDefault(zodDefault) {
179
179
  return withoutUndefined(fromZod(zodDefault._zod.def.innerType));
180
180
  }
181
- function withoutUndefined(type) {
182
- if (isParenthesizedTypeNode(type)) return withoutUndefined(type.type);
181
+ function withoutUndefined(type, fallbackType = type) {
182
+ if (isParenthesizedTypeNode(type)) return withoutUndefined(type.type, fallbackType);
183
+ if (type.kind === SyntaxKind.UndefinedKeyword) return fallbackType;
183
184
  if (!isUnionTypeNode(type)) return type;
184
- const types = type.types.map(withoutUndefined).flatMap((nextType) => isUnionTypeNode(nextType) ? Array.from(nextType.types) : [nextType]).filter((nextType) => nextType.kind !== SyntaxKind.UndefinedKeyword);
185
+ const types = type.types.map((nextType) => withoutUndefined(nextType)).flatMap((nextType) => isUnionTypeNode(nextType) ? Array.from(nextType.types) : [nextType]).filter((nextType) => nextType.kind !== SyntaxKind.UndefinedKeyword);
185
186
  const [singleType] = types;
186
- if (types.length === 0) return type;
187
+ if (types.length === 0) return fallbackType;
187
188
  if (types.length === 1 && singleType) return singleType;
188
189
  return factory.createUnionTypeNode(types);
189
190
  }
@@ -196,39 +197,150 @@ function fromZodCustom(_zodCustom) {
196
197
  function fromZodTransform(_zodTransform) {
197
198
  return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
198
199
  }
199
- function fromZodNonOptional(_zodNonOptional) {
200
- return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
200
+ function fromZodNonOptional(zodNonOptional) {
201
+ return withoutUndefined(fromZod(zodNonOptional._zod.def.innerType), factory.createKeywordTypeNode(SyntaxKind.NeverKeyword));
201
202
  }
202
- function fromZodReadonly(_zodReadonly) {
203
- return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
203
+ function fromZodReadonly(zodReadonly) {
204
+ return createReadonlyType(fromZod(zodReadonly._zod.def.innerType));
204
205
  }
205
206
  function fromZodNaN(_zodNaN) {
206
- return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
207
+ return factory.createKeywordTypeNode(SyntaxKind.NumberKeyword);
207
208
  }
208
- function fromZodPipe(_zodPipe) {
209
- return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
209
+ function fromZodPipe(zodPipe) {
210
+ return fromZod(zodPipe._zod.def.out);
210
211
  }
211
212
  function fromZodSuccess(_zodSuccess) {
212
- return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
213
+ return factory.createKeywordTypeNode(SyntaxKind.BooleanKeyword);
213
214
  }
214
- function fromZodCatch(_zodCatch) {
215
- return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
215
+ function fromZodCatch(zodCatch) {
216
+ return fromZod(zodCatch._zod.def.innerType);
216
217
  }
217
218
  function fromZodFile(_zodFile) {
218
- return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);
219
- }
220
- /**
221
- * Returns a TypeScript AST node representing the property key.
222
- * If the key is a valid JavaScript identifier, returns an Identifier node.
223
- * Otherwise, returns a StringLiteral node.
224
- *
225
- * @param {string} key - The property key to convert.
226
- * @returns {Identifier | StringLiteral} The corresponding AST node for the property key.
227
- */
219
+ return factory.createTypeReferenceNode(factory.createIdentifier("File"));
220
+ }
221
+ function createReadonlyType(type) {
222
+ if (isParenthesizedTypeNode(type)) return createReadonlyType(type.type);
223
+ if (isUnionTypeNode(type)) return factory.createUnionTypeNode(type.types.map(createReadonlyType));
224
+ if (isArrayTypeNode(type) || isTupleTypeNode(type)) return factory.createTypeOperatorNode(SyntaxKind.ReadonlyKeyword, type);
225
+ if (isReadonlyPrimitiveType(type) || isLiteralTypeNode(type)) return type;
226
+ if (isTypeReferenceNode(type)) {
227
+ const typeName = isIdentifier(type.typeName) ? type.typeName.escapedText.toString() : void 0;
228
+ if (typeName === "Map") return factory.createTypeReferenceNode(factory.createIdentifier("ReadonlyMap"), type.typeArguments);
229
+ if (typeName === "Set") return factory.createTypeReferenceNode(factory.createIdentifier("ReadonlySet"), type.typeArguments);
230
+ if (typeName === "Date" || typeName === "Promise") return type;
231
+ }
232
+ return factory.createTypeReferenceNode(factory.createIdentifier("Readonly"), [type]);
233
+ }
234
+ function isReadonlyPrimitiveType(type) {
235
+ return [
236
+ SyntaxKind.AnyKeyword,
237
+ SyntaxKind.BigIntKeyword,
238
+ SyntaxKind.BooleanKeyword,
239
+ SyntaxKind.NeverKeyword,
240
+ SyntaxKind.NumberKeyword,
241
+ SyntaxKind.StringKeyword,
242
+ SyntaxKind.SymbolKeyword,
243
+ SyntaxKind.UndefinedKeyword,
244
+ SyntaxKind.UnknownKeyword,
245
+ SyntaxKind.VoidKeyword
246
+ ].includes(type.kind);
247
+ }
248
+ const RESERVED_IDENTIFIER_NAMES = new Set([
249
+ "abstract",
250
+ "accessor",
251
+ "any",
252
+ "as",
253
+ "asserts",
254
+ "async",
255
+ "await",
256
+ "bigint",
257
+ "boolean",
258
+ "break",
259
+ "case",
260
+ "catch",
261
+ "class",
262
+ "const",
263
+ "constructor",
264
+ "continue",
265
+ "debugger",
266
+ "declare",
267
+ "default",
268
+ "delete",
269
+ "do",
270
+ "else",
271
+ "enum",
272
+ "export",
273
+ "extends",
274
+ "false",
275
+ "finally",
276
+ "for",
277
+ "from",
278
+ "function",
279
+ "get",
280
+ "global",
281
+ "if",
282
+ "implements",
283
+ "import",
284
+ "in",
285
+ "infer",
286
+ "instanceof",
287
+ "interface",
288
+ "intrinsic",
289
+ "is",
290
+ "keyof",
291
+ "let",
292
+ "module",
293
+ "namespace",
294
+ "never",
295
+ "new",
296
+ "null",
297
+ "number",
298
+ "object",
299
+ "of",
300
+ "out",
301
+ "override",
302
+ "package",
303
+ "private",
304
+ "protected",
305
+ "public",
306
+ "readonly",
307
+ "require",
308
+ "return",
309
+ "satisfies",
310
+ "set",
311
+ "static",
312
+ "string",
313
+ "super",
314
+ "switch",
315
+ "symbol",
316
+ "this",
317
+ "throw",
318
+ "true",
319
+ "try",
320
+ "type",
321
+ "typeof",
322
+ "undefined",
323
+ "unique",
324
+ "unknown",
325
+ "using",
326
+ "var",
327
+ "void",
328
+ "while",
329
+ "with",
330
+ "yield"
331
+ ]);
228
332
  function createTsAstPropertyKey(key) {
229
- if (/^[$A-Z_a-z][\w$]*$/.test(key)) return factory.createIdentifier(key);
333
+ if (isSafePropertyIdentifier(key)) return factory.createIdentifier(key);
230
334
  return factory.createStringLiteral(key);
231
335
  }
336
+ function isSafePropertyIdentifier(key) {
337
+ return isIdentifierName(key) && !RESERVED_IDENTIFIER_NAMES.has(key);
338
+ }
339
+ function isIdentifierName(value) {
340
+ const [firstCharacter] = value;
341
+ if (!firstCharacter) return false;
342
+ return isIdentifierStart(firstCharacter.codePointAt(0), ScriptTarget.Latest) && Array.from(value.slice(firstCharacter.length)).every((character) => isIdentifierPart(character.codePointAt(0), ScriptTarget.Latest));
343
+ }
232
344
  //#endregion
233
345
  //#region src/tsTypePrinter.ts
234
346
  function print(tsType) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors/EmptyZodLiteralError.ts","../src/errors/UnsupportedLiteralValueError.ts","../src/tsTypeGenerator.ts","../src/tsTypePrinter.ts"],"sourcesContent":["export class EmptyZodLiteralError extends Error {\n public override readonly name = \"EmptyZodLiteralError\";\n\n public constructor() {\n super(\"ZodLiteral must contain at least one literal value.\");\n }\n}\n","export class UnsupportedLiteralValueError extends Error {\n public override readonly name = \"UnsupportedLiteralValueError\";\n\n public constructor(public readonly valueType: string) {\n super(`Unsupported Zod literal value type: ${valueType}.`);\n }\n}\n","import {\n factory,\n isParenthesizedTypeNode,\n isUnionTypeNode,\n SyntaxKind,\n} from \"typescript\";\nimport {\n $ZodAny,\n $ZodArray,\n $ZodBigInt,\n $ZodBoolean,\n $ZodCatch,\n $ZodCustom,\n $ZodDate,\n $ZodDefault,\n $ZodEnum,\n $ZodFile,\n $ZodIntersection,\n $ZodLazy,\n $ZodLiteral,\n $ZodMap,\n $ZodNaN,\n $ZodNever,\n $ZodNonOptional,\n $ZodNull,\n $ZodNullable,\n $ZodNumber,\n $ZodObject,\n $ZodOptional,\n $ZodPipe,\n $ZodPromise,\n $ZodReadonly,\n $ZodRecord,\n $ZodSet,\n $ZodString,\n $ZodSuccess,\n $ZodSymbol,\n $ZodTemplateLiteral,\n $ZodTransform,\n $ZodTuple,\n $ZodUndefined,\n $ZodUnion,\n $ZodUnknown,\n $ZodVoid,\n} from \"zod/v4/core\";\nimport { EmptyZodLiteralError } from \"./errors/EmptyZodLiteralError.js\";\nimport { UnsupportedLiteralValueError } from \"./errors/UnsupportedLiteralValueError.js\";\nimport type {\n Identifier,\n StringLiteral,\n TypeElement,\n TypeNode,\n} from \"typescript\";\nimport type { $ZodType } from \"zod/v4/core\";\n\nexport function fromZod(zodType: $ZodType): TypeNode {\n if (zodType instanceof $ZodString) {\n return fromZodString(zodType);\n }\n if (zodType instanceof $ZodNumber) {\n return fromZodNumber(zodType);\n }\n if (zodType instanceof $ZodBigInt) {\n return fromZodBigInt(zodType);\n }\n if (zodType instanceof $ZodBoolean) {\n return fromZodBoolean(zodType);\n }\n if (zodType instanceof $ZodDate) {\n return fromZodDate(zodType);\n }\n if (zodType instanceof $ZodSymbol) {\n return fromZodSymbol(zodType);\n }\n if (zodType instanceof $ZodUndefined) {\n return fromZodUndefined(zodType);\n }\n if (zodType instanceof $ZodNullable) {\n return fromZodNullable(zodType);\n }\n if (zodType instanceof $ZodNull) {\n return fromZodNull(zodType);\n }\n if (zodType instanceof $ZodAny) {\n return fromZodAny(zodType);\n }\n if (zodType instanceof $ZodUnknown) {\n return fromZodUnknown(zodType);\n }\n if (zodType instanceof $ZodNever) {\n return fromZodNever(zodType);\n }\n if (zodType instanceof $ZodVoid) {\n return fromZodVoid(zodType);\n }\n if (zodType instanceof $ZodArray) {\n return fromZodArray(zodType);\n }\n if (zodType instanceof $ZodObject) {\n return fromZodObject(zodType);\n }\n if (zodType instanceof $ZodUnion) {\n return fromZodUnion(zodType);\n }\n if (zodType instanceof $ZodIntersection) {\n return fromZodIntersection(zodType);\n }\n if (zodType instanceof $ZodTuple) {\n return fromZodTuple(zodType);\n }\n if (zodType instanceof $ZodRecord) {\n return fromZodRecord(zodType);\n }\n if (zodType instanceof $ZodMap) {\n return fromZodMap(zodType);\n }\n if (zodType instanceof $ZodSet) {\n return fromZodSet(zodType);\n }\n if (zodType instanceof $ZodLiteral) {\n return fromZodLiteral(zodType);\n }\n if (zodType instanceof $ZodEnum) {\n return fromZodEnum(zodType);\n }\n if (zodType instanceof $ZodPromise) {\n return fromZodPromise(zodType);\n }\n if (zodType instanceof $ZodLazy) {\n return fromZodLazy(zodType);\n }\n if (zodType instanceof $ZodOptional) {\n return fromZodOptional(zodType);\n }\n if (zodType instanceof $ZodDefault) {\n return fromZodDefault(zodType);\n }\n if (zodType instanceof $ZodTemplateLiteral) {\n return fromZodTemplateLiteral(zodType);\n }\n if (zodType instanceof $ZodCustom) {\n return fromZodCustom(zodType);\n }\n if (zodType instanceof $ZodTransform) {\n return fromZodTransform(zodType);\n }\n if (zodType instanceof $ZodNonOptional) {\n return fromZodNonOptional(zodType);\n }\n if (zodType instanceof $ZodReadonly) {\n return fromZodReadonly(zodType);\n }\n if (zodType instanceof $ZodNaN) {\n return fromZodNaN(zodType);\n }\n if (zodType instanceof $ZodPipe) {\n return fromZodPipe(zodType);\n }\n if (zodType instanceof $ZodSuccess) {\n return fromZodSuccess(zodType);\n }\n if (zodType instanceof $ZodCatch) {\n return fromZodCatch(zodType);\n }\n if (zodType instanceof $ZodFile) {\n return fromZodFile(zodType);\n }\n\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodString(_zodString: $ZodString): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.StringKeyword);\n}\n\nfunction fromZodNumber(_zodNumber: $ZodNumber): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.NumberKeyword);\n}\n\nfunction fromZodBigInt(_zodBigInt: $ZodBigInt): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.BigIntKeyword);\n}\n\nfunction fromZodBoolean(_zodBoolean: $ZodBoolean): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.BooleanKeyword);\n}\n\nfunction fromZodDate(_zodDate: $ZodDate): TypeNode {\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Date\"));\n}\n\nfunction fromZodSymbol(_zodSymbol: $ZodSymbol): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.SymbolKeyword);\n}\n\nfunction fromZodUndefined(_zodUndefined: $ZodUndefined): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword);\n}\n\nfunction fromZodNullable(zodNullable: $ZodNullable): TypeNode {\n const innerType = fromZod(zodNullable._zod.def.innerType);\n return factory.createUnionTypeNode([\n innerType,\n factory.createLiteralTypeNode(factory.createNull()),\n ]);\n}\n\nfunction fromZodNull(_zodNull: $ZodNull): TypeNode {\n return factory.createLiteralTypeNode(factory.createNull());\n}\n\nfunction fromZodAny(_zodAny: $ZodAny): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);\n}\n\nfunction fromZodUnknown(_zodUnknown: $ZodUnknown): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodNever(_zodNever: $ZodNever): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.NeverKeyword);\n}\n\nfunction fromZodVoid(_zodVoid: $ZodVoid): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.VoidKeyword);\n}\n\nfunction fromZodArray(zodArray: $ZodArray): TypeNode {\n const innerType = fromZod(zodArray._zod.def.element);\n return factory.createArrayTypeNode(innerType);\n}\n\nfunction fromZodObject(zodObject: $ZodObject): TypeNode {\n const entries = Object.entries(zodObject._zod.def.shape);\n\n const members: TypeElement[] = entries.map(([key, nextZodNode]) => {\n const type = fromZod(nextZodNode);\n\n if (!nextZodNode._zod?.def) {\n console.warn(\n `Zod node for key \"${key}\" does not have a _zod.def property. This may indicate an issue with the Zod schema.`,\n {\n key,\n }\n );\n }\n const isOptional = nextZodNode._zod?.optout === \"optional\";\n\n const propertySignature = factory.createPropertySignature(\n undefined,\n createTsAstPropertyKey(key),\n isOptional ? factory.createToken(SyntaxKind.QuestionToken) : undefined,\n type\n );\n\n // TODO: add description?\n return propertySignature;\n });\n return factory.createTypeLiteralNode(members);\n}\n\nfunction fromZodUnion(zodUnion: $ZodUnion): TypeNode {\n const options = zodUnion._zod.def.options.map(fromZod);\n return factory.createUnionTypeNode(options);\n}\n\nfunction fromZodIntersection(zodIntersection: $ZodIntersection): TypeNode {\n const left = fromZod(zodIntersection._zod.def.left);\n const right = fromZod(zodIntersection._zod.def.right);\n return factory.createIntersectionTypeNode([left, right]);\n}\n\nfunction fromZodTuple(zodTuple: $ZodTuple): TypeNode {\n const elements = zodTuple._zod.def.items.map(fromZod);\n const { rest } = zodTuple._zod.def;\n\n if (rest) {\n elements.push(\n factory.createRestTypeNode(factory.createArrayTypeNode(fromZod(rest)))\n );\n }\n\n return factory.createTupleTypeNode(elements);\n}\n\nfunction fromZodRecord(zodRecord: $ZodRecord): TypeNode {\n const keyType = fromZod(zodRecord._zod.def.keyType);\n const valueType = fromZod(zodRecord._zod.def.valueType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Record\"), [\n keyType,\n valueType,\n ]);\n}\n\nfunction fromZodMap(zodMap: $ZodMap): TypeNode {\n const keyType = fromZod(zodMap._zod.def.keyType);\n const valueType = fromZod(zodMap._zod.def.valueType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Map\"), [\n keyType,\n valueType,\n ]);\n}\n\nfunction fromZodSet(zodSet: $ZodSet): TypeNode {\n const innerType = fromZod(zodSet._zod.def.valueType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Set\"), [\n innerType,\n ]);\n}\n\nfunction fromZodLiteral(zodLiteral: $ZodLiteral): TypeNode {\n if (zodLiteral._zod.def.values.length === 0) {\n throw new EmptyZodLiteralError();\n }\n const types = zodLiteral._zod.def.values.map(fromLiteralValue);\n\n const [type] = types;\n if (types.length === 1 && type) {\n return type;\n }\n\n return factory.createUnionTypeNode(types);\n}\n\ntype LiteralValue = string | number | boolean | bigint | null | undefined;\n\nfunction fromLiteralValue(value: LiteralValue): TypeNode {\n if (typeof value === \"string\") {\n return factory.createLiteralTypeNode(factory.createStringLiteral(value));\n }\n if (typeof value === \"number\") {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(value));\n }\n if (typeof value === \"boolean\") {\n return factory.createLiteralTypeNode(\n value ? factory.createTrue() : factory.createFalse()\n );\n }\n if (typeof value === \"bigint\") {\n return factory.createLiteralTypeNode(\n factory.createBigIntLiteral(`${value.toString()}n`)\n );\n }\n if (value === null) {\n return factory.createLiteralTypeNode(factory.createNull());\n }\n if (value === undefined) {\n return factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword);\n }\n\n throw new UnsupportedLiteralValueError(typeof value);\n}\n\nfunction fromZodEnum(zodEnum: $ZodEnum): TypeNode {\n const values = getZodEnumValues(zodEnum._zod.def.entries);\n const types = values.map(fromLiteralValue);\n return factory.createUnionTypeNode(types);\n}\n\nfunction getZodEnumValues(\n entries: Record<string, string | number>\n): Array<string | number> {\n const numericValues = Object.values(entries).filter(\n (value): value is number => typeof value === \"number\"\n );\n\n return Object.entries(entries)\n .filter(([key]) => !numericValues.includes(Number(key)))\n .map(([, value]) => value);\n}\n\nfunction fromZodPromise(zodPromise: $ZodPromise): TypeNode {\n const innerType = fromZod(zodPromise._zod.def.innerType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Promise\"), [\n innerType,\n ]);\n}\n\nfunction fromZodLazy(_zodLazy: $ZodLazy): TypeNode {\n // TODO: handle zodLazy\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodOptional(zodOptional: $ZodOptional): TypeNode {\n const innerType = fromZod(zodOptional._zod.def.innerType);\n return factory.createUnionTypeNode([\n innerType,\n factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword),\n ]);\n}\n\nfunction fromZodDefault(zodDefault: $ZodDefault): TypeNode {\n const innerType = fromZod(zodDefault._zod.def.innerType);\n return withoutUndefined(innerType);\n}\n\nfunction withoutUndefined(type: TypeNode): TypeNode {\n if (isParenthesizedTypeNode(type)) {\n return withoutUndefined(type.type);\n }\n\n if (!isUnionTypeNode(type)) {\n return type;\n }\n\n const types = type.types\n .map(withoutUndefined)\n .flatMap(nextType =>\n isUnionTypeNode(nextType) ? Array.from(nextType.types) : [nextType]\n )\n .filter(nextType => nextType.kind !== SyntaxKind.UndefinedKeyword);\n\n const [singleType] = types;\n if (types.length === 0) {\n return type;\n }\n if (types.length === 1 && singleType) {\n return singleType;\n }\n\n return factory.createUnionTypeNode(types);\n}\n\nfunction fromZodTemplateLiteral(\n _zodTemplateLiteral: $ZodTemplateLiteral\n): TypeNode {\n // TODO: handle zodTemplateLiteral\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodCustom(_zodCustom: $ZodCustom): TypeNode {\n // TODO: handle zodCustom\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodTransform(_zodTransform: $ZodTransform): TypeNode {\n // TODO: handle zodTransform\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodNonOptional(_zodNonOptional: $ZodNonOptional): TypeNode {\n // TODO: handle zodNonOptional\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodReadonly(_zodReadonly: $ZodReadonly): TypeNode {\n // TODO: handle zodReadonly\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodNaN(_zodNaN: $ZodNaN): TypeNode {\n // TODO: handle zodNaN\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodPipe(_zodPipe: $ZodPipe): TypeNode {\n // TODO: handle zodPipe\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodSuccess(_zodSuccess: $ZodSuccess): TypeNode {\n // TODO: handle zodSuccess\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodCatch(_zodCatch: $ZodCatch): TypeNode {\n // TODO: handle zodCatch\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodFile(_zodFile: $ZodFile): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\n/**\n * Returns a TypeScript AST node representing the property key.\n * If the key is a valid JavaScript identifier, returns an Identifier node.\n * Otherwise, returns a StringLiteral node.\n *\n * @param {string} key - The property key to convert.\n * @returns {Identifier | StringLiteral} The corresponding AST node for the property key.\n */\nfunction createTsAstPropertyKey(key: string): Identifier | StringLiteral {\n // TODO: is TsTypeNode correct or required anymore?\n if (/^[$A-Z_a-z][\\w$]*$/.test(key)) {\n return factory.createIdentifier(key);\n }\n return factory.createStringLiteral(key);\n}\n","import {\n createPrinter,\n createSourceFile,\n EmitHint,\n ScriptKind,\n ScriptTarget,\n} from \"typescript\";\nimport type { TypeNode } from \"typescript\";\n\nexport function print(tsType: TypeNode): string {\n const sourceFile = createSourceFile(\n \"print.ts\",\n \"\",\n ScriptTarget.Latest,\n false,\n ScriptKind.TS\n );\n const printer = createPrinter();\n return printer.printNode(EmitHint.Unspecified, tsType, sourceFile);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/errors/EmptyZodLiteralError.ts","../src/errors/UnsupportedLiteralValueError.ts","../src/tsTypeGenerator.ts","../src/tsTypePrinter.ts"],"sourcesContent":["export class EmptyZodLiteralError extends Error {\n public override readonly name = \"EmptyZodLiteralError\";\n\n public constructor() {\n super(\"ZodLiteral must contain at least one literal value.\");\n }\n}\n","export class UnsupportedLiteralValueError extends Error {\n public override readonly name = \"UnsupportedLiteralValueError\";\n\n public constructor(public readonly valueType: string) {\n super(`Unsupported Zod literal value type: ${valueType}.`);\n }\n}\n","import {\n factory,\n isArrayTypeNode,\n isIdentifier,\n isIdentifierPart,\n isIdentifierStart,\n isLiteralTypeNode,\n isParenthesizedTypeNode,\n isTupleTypeNode,\n isTypeReferenceNode,\n isUnionTypeNode,\n ScriptTarget,\n SyntaxKind,\n} from \"typescript\";\nimport {\n $ZodAny,\n $ZodArray,\n $ZodBigInt,\n $ZodBoolean,\n $ZodCatch,\n $ZodCustom,\n $ZodDate,\n $ZodDefault,\n $ZodEnum,\n $ZodFile,\n $ZodIntersection,\n $ZodLazy,\n $ZodLiteral,\n $ZodMap,\n $ZodNaN,\n $ZodNever,\n $ZodNonOptional,\n $ZodNull,\n $ZodNullable,\n $ZodNumber,\n $ZodObject,\n $ZodOptional,\n $ZodPipe,\n $ZodPromise,\n $ZodReadonly,\n $ZodRecord,\n $ZodSet,\n $ZodString,\n $ZodSuccess,\n $ZodSymbol,\n $ZodTemplateLiteral,\n $ZodTransform,\n $ZodTuple,\n $ZodUndefined,\n $ZodUnion,\n $ZodUnknown,\n $ZodVoid,\n} from \"zod/v4/core\";\nimport { EmptyZodLiteralError } from \"./errors/EmptyZodLiteralError.js\";\nimport { UnsupportedLiteralValueError } from \"./errors/UnsupportedLiteralValueError.js\";\nimport type {\n Identifier,\n StringLiteral,\n TypeElement,\n TypeNode,\n} from \"typescript\";\nimport type { $ZodType } from \"zod/v4/core\";\n\nexport function fromZod(zodType: $ZodType): TypeNode {\n if (zodType instanceof $ZodString) {\n return fromZodString(zodType);\n }\n if (zodType instanceof $ZodNumber) {\n return fromZodNumber(zodType);\n }\n if (zodType instanceof $ZodBigInt) {\n return fromZodBigInt(zodType);\n }\n if (zodType instanceof $ZodBoolean) {\n return fromZodBoolean(zodType);\n }\n if (zodType instanceof $ZodDate) {\n return fromZodDate(zodType);\n }\n if (zodType instanceof $ZodSymbol) {\n return fromZodSymbol(zodType);\n }\n if (zodType instanceof $ZodUndefined) {\n return fromZodUndefined(zodType);\n }\n if (zodType instanceof $ZodNullable) {\n return fromZodNullable(zodType);\n }\n if (zodType instanceof $ZodNull) {\n return fromZodNull(zodType);\n }\n if (zodType instanceof $ZodAny) {\n return fromZodAny(zodType);\n }\n if (zodType instanceof $ZodUnknown) {\n return fromZodUnknown(zodType);\n }\n if (zodType instanceof $ZodNever) {\n return fromZodNever(zodType);\n }\n if (zodType instanceof $ZodVoid) {\n return fromZodVoid(zodType);\n }\n if (zodType instanceof $ZodArray) {\n return fromZodArray(zodType);\n }\n if (zodType instanceof $ZodObject) {\n return fromZodObject(zodType);\n }\n if (zodType instanceof $ZodUnion) {\n return fromZodUnion(zodType);\n }\n if (zodType instanceof $ZodIntersection) {\n return fromZodIntersection(zodType);\n }\n if (zodType instanceof $ZodTuple) {\n return fromZodTuple(zodType);\n }\n if (zodType instanceof $ZodRecord) {\n return fromZodRecord(zodType);\n }\n if (zodType instanceof $ZodMap) {\n return fromZodMap(zodType);\n }\n if (zodType instanceof $ZodSet) {\n return fromZodSet(zodType);\n }\n if (zodType instanceof $ZodLiteral) {\n return fromZodLiteral(zodType);\n }\n if (zodType instanceof $ZodEnum) {\n return fromZodEnum(zodType);\n }\n if (zodType instanceof $ZodPromise) {\n return fromZodPromise(zodType);\n }\n if (zodType instanceof $ZodLazy) {\n return fromZodLazy(zodType);\n }\n if (zodType instanceof $ZodOptional) {\n return fromZodOptional(zodType);\n }\n if (zodType instanceof $ZodDefault) {\n return fromZodDefault(zodType);\n }\n if (zodType instanceof $ZodTemplateLiteral) {\n return fromZodTemplateLiteral(zodType);\n }\n if (zodType instanceof $ZodCustom) {\n return fromZodCustom(zodType);\n }\n if (zodType instanceof $ZodTransform) {\n return fromZodTransform(zodType);\n }\n if (zodType instanceof $ZodNonOptional) {\n return fromZodNonOptional(zodType);\n }\n if (zodType instanceof $ZodReadonly) {\n return fromZodReadonly(zodType);\n }\n if (zodType instanceof $ZodNaN) {\n return fromZodNaN(zodType);\n }\n if (zodType instanceof $ZodPipe) {\n return fromZodPipe(zodType);\n }\n if (zodType instanceof $ZodSuccess) {\n return fromZodSuccess(zodType);\n }\n if (zodType instanceof $ZodCatch) {\n return fromZodCatch(zodType);\n }\n if (zodType instanceof $ZodFile) {\n return fromZodFile(zodType);\n }\n\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodString(_zodString: $ZodString): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.StringKeyword);\n}\n\nfunction fromZodNumber(_zodNumber: $ZodNumber): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.NumberKeyword);\n}\n\nfunction fromZodBigInt(_zodBigInt: $ZodBigInt): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.BigIntKeyword);\n}\n\nfunction fromZodBoolean(_zodBoolean: $ZodBoolean): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.BooleanKeyword);\n}\n\nfunction fromZodDate(_zodDate: $ZodDate): TypeNode {\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Date\"));\n}\n\nfunction fromZodSymbol(_zodSymbol: $ZodSymbol): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.SymbolKeyword);\n}\n\nfunction fromZodUndefined(_zodUndefined: $ZodUndefined): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword);\n}\n\nfunction fromZodNullable(zodNullable: $ZodNullable): TypeNode {\n const innerType = fromZod(zodNullable._zod.def.innerType);\n return factory.createUnionTypeNode([\n innerType,\n factory.createLiteralTypeNode(factory.createNull()),\n ]);\n}\n\nfunction fromZodNull(_zodNull: $ZodNull): TypeNode {\n return factory.createLiteralTypeNode(factory.createNull());\n}\n\nfunction fromZodAny(_zodAny: $ZodAny): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.AnyKeyword);\n}\n\nfunction fromZodUnknown(_zodUnknown: $ZodUnknown): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodNever(_zodNever: $ZodNever): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.NeverKeyword);\n}\n\nfunction fromZodVoid(_zodVoid: $ZodVoid): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.VoidKeyword);\n}\n\nfunction fromZodArray(zodArray: $ZodArray): TypeNode {\n const innerType = fromZod(zodArray._zod.def.element);\n return factory.createArrayTypeNode(innerType);\n}\n\nfunction fromZodObject(zodObject: $ZodObject): TypeNode {\n const entries = Object.entries(zodObject._zod.def.shape);\n\n const members: TypeElement[] = entries.map(([key, nextZodNode]) => {\n const type = fromZod(nextZodNode);\n\n if (!nextZodNode._zod?.def) {\n console.warn(\n `Zod node for key \"${key}\" does not have a _zod.def property. This may indicate an issue with the Zod schema.`,\n {\n key,\n }\n );\n }\n const isOptional = nextZodNode._zod?.optout === \"optional\";\n\n const propertySignature = factory.createPropertySignature(\n undefined,\n createTsAstPropertyKey(key),\n isOptional ? factory.createToken(SyntaxKind.QuestionToken) : undefined,\n type\n );\n\n // TODO: add description?\n return propertySignature;\n });\n return factory.createTypeLiteralNode(members);\n}\n\nfunction fromZodUnion(zodUnion: $ZodUnion): TypeNode {\n const options = zodUnion._zod.def.options.map(fromZod);\n return factory.createUnionTypeNode(options);\n}\n\nfunction fromZodIntersection(zodIntersection: $ZodIntersection): TypeNode {\n const left = fromZod(zodIntersection._zod.def.left);\n const right = fromZod(zodIntersection._zod.def.right);\n return factory.createIntersectionTypeNode([left, right]);\n}\n\nfunction fromZodTuple(zodTuple: $ZodTuple): TypeNode {\n const elements = zodTuple._zod.def.items.map(fromZod);\n const { rest } = zodTuple._zod.def;\n\n if (rest) {\n elements.push(\n factory.createRestTypeNode(factory.createArrayTypeNode(fromZod(rest)))\n );\n }\n\n return factory.createTupleTypeNode(elements);\n}\n\nfunction fromZodRecord(zodRecord: $ZodRecord): TypeNode {\n const keyType = fromZod(zodRecord._zod.def.keyType);\n const valueType = fromZod(zodRecord._zod.def.valueType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Record\"), [\n keyType,\n valueType,\n ]);\n}\n\nfunction fromZodMap(zodMap: $ZodMap): TypeNode {\n const keyType = fromZod(zodMap._zod.def.keyType);\n const valueType = fromZod(zodMap._zod.def.valueType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Map\"), [\n keyType,\n valueType,\n ]);\n}\n\nfunction fromZodSet(zodSet: $ZodSet): TypeNode {\n const innerType = fromZod(zodSet._zod.def.valueType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Set\"), [\n innerType,\n ]);\n}\n\nfunction fromZodLiteral(zodLiteral: $ZodLiteral): TypeNode {\n if (zodLiteral._zod.def.values.length === 0) {\n throw new EmptyZodLiteralError();\n }\n const types = zodLiteral._zod.def.values.map(fromLiteralValue);\n\n const [type] = types;\n if (types.length === 1 && type) {\n return type;\n }\n\n return factory.createUnionTypeNode(types);\n}\n\ntype LiteralValue = string | number | boolean | bigint | null | undefined;\n\nfunction fromLiteralValue(value: LiteralValue): TypeNode {\n if (typeof value === \"string\") {\n return factory.createLiteralTypeNode(factory.createStringLiteral(value));\n }\n if (typeof value === \"number\") {\n return factory.createLiteralTypeNode(factory.createNumericLiteral(value));\n }\n if (typeof value === \"boolean\") {\n return factory.createLiteralTypeNode(\n value ? factory.createTrue() : factory.createFalse()\n );\n }\n if (typeof value === \"bigint\") {\n return factory.createLiteralTypeNode(\n factory.createBigIntLiteral(`${value.toString()}n`)\n );\n }\n if (value === null) {\n return factory.createLiteralTypeNode(factory.createNull());\n }\n if (value === undefined) {\n return factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword);\n }\n\n throw new UnsupportedLiteralValueError(typeof value);\n}\n\nfunction fromZodEnum(zodEnum: $ZodEnum): TypeNode {\n const values = getZodEnumValues(zodEnum._zod.def.entries);\n const types = values.map(fromLiteralValue);\n return factory.createUnionTypeNode(types);\n}\n\nfunction getZodEnumValues(\n entries: Record<string, string | number>\n): Array<string | number> {\n const numericValues = Object.values(entries).filter(\n (value): value is number => typeof value === \"number\"\n );\n\n return Object.entries(entries)\n .filter(([key]) => !numericValues.includes(Number(key)))\n .map(([, value]) => value);\n}\n\nfunction fromZodPromise(zodPromise: $ZodPromise): TypeNode {\n const innerType = fromZod(zodPromise._zod.def.innerType);\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Promise\"), [\n innerType,\n ]);\n}\n\nfunction fromZodLazy(_zodLazy: $ZodLazy): TypeNode {\n // TODO: handle zodLazy\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodOptional(zodOptional: $ZodOptional): TypeNode {\n const innerType = fromZod(zodOptional._zod.def.innerType);\n return factory.createUnionTypeNode([\n innerType,\n factory.createKeywordTypeNode(SyntaxKind.UndefinedKeyword),\n ]);\n}\n\nfunction fromZodDefault(zodDefault: $ZodDefault): TypeNode {\n const innerType = fromZod(zodDefault._zod.def.innerType);\n return withoutUndefined(innerType);\n}\n\nfunction withoutUndefined(\n type: TypeNode,\n fallbackType: TypeNode = type\n): TypeNode {\n if (isParenthesizedTypeNode(type)) {\n return withoutUndefined(type.type, fallbackType);\n }\n\n if (type.kind === SyntaxKind.UndefinedKeyword) {\n return fallbackType;\n }\n\n if (!isUnionTypeNode(type)) {\n return type;\n }\n\n const types = type.types\n .map(nextType => withoutUndefined(nextType))\n .flatMap(nextType =>\n isUnionTypeNode(nextType) ? Array.from(nextType.types) : [nextType]\n )\n .filter(nextType => nextType.kind !== SyntaxKind.UndefinedKeyword);\n\n const [singleType] = types;\n if (types.length === 0) {\n return fallbackType;\n }\n if (types.length === 1 && singleType) {\n return singleType;\n }\n\n return factory.createUnionTypeNode(types);\n}\n\nfunction fromZodTemplateLiteral(\n _zodTemplateLiteral: $ZodTemplateLiteral\n): TypeNode {\n // TODO: handle zodTemplateLiteral\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodCustom(_zodCustom: $ZodCustom): TypeNode {\n // TODO: handle zodCustom\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodTransform(_zodTransform: $ZodTransform): TypeNode {\n // TODO: handle zodTransform\n return factory.createKeywordTypeNode(SyntaxKind.UnknownKeyword);\n}\n\nfunction fromZodNonOptional(zodNonOptional: $ZodNonOptional): TypeNode {\n const innerType = fromZod(zodNonOptional._zod.def.innerType);\n return withoutUndefined(\n innerType,\n factory.createKeywordTypeNode(SyntaxKind.NeverKeyword)\n );\n}\n\nfunction fromZodReadonly(zodReadonly: $ZodReadonly): TypeNode {\n return createReadonlyType(fromZod(zodReadonly._zod.def.innerType));\n}\n\nfunction fromZodNaN(_zodNaN: $ZodNaN): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.NumberKeyword);\n}\n\nfunction fromZodPipe(zodPipe: $ZodPipe): TypeNode {\n return fromZod(zodPipe._zod.def.out);\n}\n\nfunction fromZodSuccess(_zodSuccess: $ZodSuccess): TypeNode {\n return factory.createKeywordTypeNode(SyntaxKind.BooleanKeyword);\n}\n\nfunction fromZodCatch(zodCatch: $ZodCatch): TypeNode {\n return fromZod(zodCatch._zod.def.innerType);\n}\n\nfunction fromZodFile(_zodFile: $ZodFile): TypeNode {\n return factory.createTypeReferenceNode(factory.createIdentifier(\"File\"));\n}\n\nfunction createReadonlyType(type: TypeNode): TypeNode {\n if (isParenthesizedTypeNode(type)) {\n return createReadonlyType(type.type);\n }\n\n if (isUnionTypeNode(type)) {\n return factory.createUnionTypeNode(type.types.map(createReadonlyType));\n }\n\n if (isArrayTypeNode(type) || isTupleTypeNode(type)) {\n return factory.createTypeOperatorNode(SyntaxKind.ReadonlyKeyword, type);\n }\n\n if (isReadonlyPrimitiveType(type) || isLiteralTypeNode(type)) {\n return type;\n }\n\n if (isTypeReferenceNode(type)) {\n const typeName = isIdentifier(type.typeName)\n ? type.typeName.escapedText.toString()\n : undefined;\n\n if (typeName === \"Map\") {\n return factory.createTypeReferenceNode(\n factory.createIdentifier(\"ReadonlyMap\"),\n type.typeArguments\n );\n }\n\n if (typeName === \"Set\") {\n return factory.createTypeReferenceNode(\n factory.createIdentifier(\"ReadonlySet\"),\n type.typeArguments\n );\n }\n\n if (typeName === \"Date\" || typeName === \"Promise\") {\n return type;\n }\n }\n\n return factory.createTypeReferenceNode(factory.createIdentifier(\"Readonly\"), [\n type,\n ]);\n}\n\nfunction isReadonlyPrimitiveType(type: TypeNode): boolean {\n return [\n SyntaxKind.AnyKeyword,\n SyntaxKind.BigIntKeyword,\n SyntaxKind.BooleanKeyword,\n SyntaxKind.NeverKeyword,\n SyntaxKind.NumberKeyword,\n SyntaxKind.StringKeyword,\n SyntaxKind.SymbolKeyword,\n SyntaxKind.UndefinedKeyword,\n SyntaxKind.UnknownKeyword,\n SyntaxKind.VoidKeyword,\n ].includes(type.kind);\n}\n\nconst RESERVED_IDENTIFIER_NAMES = new Set([\n \"abstract\",\n \"accessor\",\n \"any\",\n \"as\",\n \"asserts\",\n \"async\",\n \"await\",\n \"bigint\",\n \"boolean\",\n \"break\",\n \"case\",\n \"catch\",\n \"class\",\n \"const\",\n \"constructor\",\n \"continue\",\n \"debugger\",\n \"declare\",\n \"default\",\n \"delete\",\n \"do\",\n \"else\",\n \"enum\",\n \"export\",\n \"extends\",\n \"false\",\n \"finally\",\n \"for\",\n \"from\",\n \"function\",\n \"get\",\n \"global\",\n \"if\",\n \"implements\",\n \"import\",\n \"in\",\n \"infer\",\n \"instanceof\",\n \"interface\",\n \"intrinsic\",\n \"is\",\n \"keyof\",\n \"let\",\n \"module\",\n \"namespace\",\n \"never\",\n \"new\",\n \"null\",\n \"number\",\n \"object\",\n \"of\",\n \"out\",\n \"override\",\n \"package\",\n \"private\",\n \"protected\",\n \"public\",\n \"readonly\",\n \"require\",\n \"return\",\n \"satisfies\",\n \"set\",\n \"static\",\n \"string\",\n \"super\",\n \"switch\",\n \"symbol\",\n \"this\",\n \"throw\",\n \"true\",\n \"try\",\n \"type\",\n \"typeof\",\n \"undefined\",\n \"unique\",\n \"unknown\",\n \"using\",\n \"var\",\n \"void\",\n \"while\",\n \"with\",\n \"yield\",\n]);\n\nfunction createTsAstPropertyKey(key: string): Identifier | StringLiteral {\n if (isSafePropertyIdentifier(key)) {\n return factory.createIdentifier(key);\n }\n return factory.createStringLiteral(key);\n}\n\nfunction isSafePropertyIdentifier(key: string): boolean {\n return isIdentifierName(key) && !RESERVED_IDENTIFIER_NAMES.has(key);\n}\n\nfunction isIdentifierName(value: string): boolean {\n const [firstCharacter] = value;\n\n if (!firstCharacter) {\n return false;\n }\n\n return (\n isIdentifierStart(firstCharacter.codePointAt(0)!, ScriptTarget.Latest) &&\n Array.from(value.slice(firstCharacter.length)).every(character =>\n isIdentifierPart(character.codePointAt(0)!, ScriptTarget.Latest)\n )\n );\n}\n","import {\n createPrinter,\n createSourceFile,\n EmitHint,\n ScriptKind,\n ScriptTarget,\n} from \"typescript\";\nimport type { TypeNode } from \"typescript\";\n\nexport function print(tsType: TypeNode): string {\n const sourceFile = createSourceFile(\n \"print.ts\",\n \"\",\n ScriptTarget.Latest,\n false,\n ScriptKind.TS\n );\n const printer = createPrinter();\n return printer.printNode(EmitHint.Unspecified, tsType, sourceFile);\n}\n"],"mappings":"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A;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAEF,SAAS,uBAAuB,KAAyC;AACvE,KAAI,yBAAyB,IAAI,CAC/B,QAAO,QAAQ,iBAAiB,IAAI;AAEtC,QAAO,QAAQ,oBAAoB,IAAI;;AAGzC,SAAS,yBAAyB,KAAsB;AACtD,QAAO,iBAAiB,IAAI,IAAI,CAAC,0BAA0B,IAAI,IAAI;;AAGrE,SAAS,iBAAiB,OAAwB;CAChD,MAAM,CAAC,kBAAkB;AAEzB,KAAI,CAAC,eACH,QAAO;AAGT,QACE,kBAAkB,eAAe,YAAY,EAAE,EAAG,aAAa,OAAO,IACtE,MAAM,KAAK,MAAM,MAAM,eAAe,OAAO,CAAC,CAAC,OAAM,cACnD,iBAAiB,UAAU,YAAY,EAAE,EAAG,aAAa,OAAO,CACjE;;;;ACtoBL,SAAgB,MAAM,QAA0B;CAC9C,MAAM,aAAa,iBACjB,YACA,IACA,aAAa,QACb,OACA,WAAW,GACZ;AAED,QADgB,eAAe,CAChB,UAAU,SAAS,aAAa,QAAQ,WAAW"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rexeus/typeweaver-zod-to-ts",
3
- "version": "0.10.5",
3
+ "version": "0.11.0",
4
4
  "description": "Transforms Zod v4 schemas into precise TypeScript shapes. Powered by Typeweaver 🧵✨",
5
5
  "type": "module",
6
6
  "sideEffects": false,