@schemashift/zod-valibot 0.9.0 → 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/dist/index.cjs +82 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -2
- package/dist/index.d.ts +21 -2
- package/dist/index.js +82 -12
- package/dist/index.js.map +1 -1
- package/package.json +7 -2
package/dist/index.cjs
CHANGED
|
@@ -476,6 +476,7 @@ function createZodToValibotHandler() {
|
|
|
476
476
|
}
|
|
477
477
|
|
|
478
478
|
// src/valibot-to-zod-transformer.ts
|
|
479
|
+
var import_ts_morph2 = require("ts-morph");
|
|
479
480
|
var VALIBOT_TO_ZOD_FACTORY = {
|
|
480
481
|
"v.string": "z.string",
|
|
481
482
|
"v.number": "z.number",
|
|
@@ -536,14 +537,19 @@ var PIPE_TO_CHAIN = {
|
|
|
536
537
|
var ValibotToZodTransformer = class {
|
|
537
538
|
errors = [];
|
|
538
539
|
warnings = [];
|
|
540
|
+
stringLiteralRanges = [];
|
|
541
|
+
commentRanges = [];
|
|
539
542
|
transform(sourceFile) {
|
|
540
543
|
this.errors = [];
|
|
541
544
|
this.warnings = [];
|
|
545
|
+
this.stringLiteralRanges = [];
|
|
546
|
+
this.commentRanges = [];
|
|
542
547
|
const filePath = sourceFile.getFilePath();
|
|
543
548
|
const originalCode = sourceFile.getFullText();
|
|
544
549
|
try {
|
|
545
|
-
|
|
546
|
-
|
|
550
|
+
this.collectProtectedRanges(sourceFile);
|
|
551
|
+
this.transformImportsAST(sourceFile);
|
|
552
|
+
let text = sourceFile.getFullText();
|
|
547
553
|
text = this.transformTypeHelpers(text);
|
|
548
554
|
text = this.transformWrappers(text);
|
|
549
555
|
text = this.transformPipeExpressions(text);
|
|
@@ -570,13 +576,71 @@ var ValibotToZodTransformer = class {
|
|
|
570
576
|
};
|
|
571
577
|
}
|
|
572
578
|
}
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
579
|
+
/**
|
|
580
|
+
* Collect string literal and comment ranges from the AST
|
|
581
|
+
* so text-based transforms can avoid modifying them.
|
|
582
|
+
*/
|
|
583
|
+
collectProtectedRanges(sourceFile) {
|
|
584
|
+
this.stringLiteralRanges = [];
|
|
585
|
+
this.commentRanges = [];
|
|
586
|
+
sourceFile.forEachDescendant((node) => {
|
|
587
|
+
if (node.getKind() === import_ts_morph2.SyntaxKind.StringLiteral || node.getKind() === import_ts_morph2.SyntaxKind.TemplateExpression || node.getKind() === import_ts_morph2.SyntaxKind.NoSubstitutionTemplateLiteral) {
|
|
588
|
+
this.stringLiteralRanges.push({
|
|
589
|
+
start: node.getStart(),
|
|
590
|
+
end: node.getEnd()
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
});
|
|
594
|
+
const text = sourceFile.getFullText();
|
|
595
|
+
const commentRegex = /\/\/[^\n]*|\/\*[\s\S]*?\*\//g;
|
|
596
|
+
for (const match of text.matchAll(commentRegex)) {
|
|
597
|
+
if (match.index !== void 0) {
|
|
598
|
+
this.commentRanges.push({
|
|
599
|
+
start: match.index,
|
|
600
|
+
end: match.index + match[0].length
|
|
601
|
+
});
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
/**
|
|
606
|
+
* Check if a position is inside a protected range (string literal or comment).
|
|
607
|
+
*/
|
|
608
|
+
isProtected(position) {
|
|
609
|
+
for (const range of this.stringLiteralRanges) {
|
|
610
|
+
if (position >= range.start && position < range.end) return true;
|
|
611
|
+
}
|
|
612
|
+
for (const range of this.commentRanges) {
|
|
613
|
+
if (position >= range.start && position < range.end) return true;
|
|
614
|
+
}
|
|
615
|
+
return false;
|
|
616
|
+
}
|
|
617
|
+
/**
|
|
618
|
+
* AST-based import transformation.
|
|
619
|
+
* Replaces valibot imports with zod imports using the AST.
|
|
620
|
+
*/
|
|
621
|
+
transformImportsAST(sourceFile) {
|
|
622
|
+
const imports = sourceFile.getImportDeclarations();
|
|
623
|
+
const valibotImports = [];
|
|
624
|
+
for (const imp of imports) {
|
|
625
|
+
const moduleSpecifier = imp.getModuleSpecifierValue();
|
|
626
|
+
if (moduleSpecifier === "valibot") {
|
|
627
|
+
valibotImports.push(imp);
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
for (const imp of valibotImports) {
|
|
631
|
+
imp.setModuleSpecifier("zod");
|
|
632
|
+
const namespaceImport = imp.getNamespaceImport();
|
|
633
|
+
if (namespaceImport) {
|
|
634
|
+
imp.removeNamespaceImport();
|
|
635
|
+
imp.addNamedImport("z");
|
|
636
|
+
} else {
|
|
637
|
+
const namedImports = imp.getNamedImports();
|
|
638
|
+
for (const named of namedImports) {
|
|
639
|
+
named.remove();
|
|
640
|
+
}
|
|
641
|
+
imp.addNamedImport("z");
|
|
642
|
+
}
|
|
643
|
+
}
|
|
580
644
|
}
|
|
581
645
|
transformTypeHelpers(text) {
|
|
582
646
|
text = text.replace(/\bv\.InferOutput</g, "z.infer<");
|
|
@@ -632,13 +696,16 @@ var ValibotToZodTransformer = class {
|
|
|
632
696
|
}
|
|
633
697
|
/**
|
|
634
698
|
* Replace wrapper calls using balanced parenthesis matching.
|
|
699
|
+
* Skips matches inside string literals and comments.
|
|
635
700
|
*/
|
|
636
701
|
replaceWrapperCall(text, prefix, replacer) {
|
|
637
702
|
const pattern = new RegExp(`\\b${prefix.replace(".", "\\.")}\\(`, "g");
|
|
638
703
|
let result = text;
|
|
639
704
|
let offset = 0;
|
|
640
705
|
for (const match of text.matchAll(pattern)) {
|
|
641
|
-
const
|
|
706
|
+
const matchIdx = match.index ?? 0;
|
|
707
|
+
if (this.isProtected(matchIdx)) continue;
|
|
708
|
+
const startIdx = matchIdx + offset;
|
|
642
709
|
const openParen = startIdx + prefix.length;
|
|
643
710
|
let depth = 1;
|
|
644
711
|
let i = openParen + 1;
|
|
@@ -662,13 +729,16 @@ var ValibotToZodTransformer = class {
|
|
|
662
729
|
}
|
|
663
730
|
/**
|
|
664
731
|
* Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
|
|
732
|
+
* Skips matches inside string literals and comments.
|
|
665
733
|
*/
|
|
666
734
|
transformPipeExpressions(text) {
|
|
667
735
|
const pipePattern = /\bv\.pipe\(/g;
|
|
668
736
|
let result = text;
|
|
669
737
|
let offset = 0;
|
|
670
738
|
for (const match of text.matchAll(pipePattern)) {
|
|
671
|
-
const
|
|
739
|
+
const matchIdx = match.index ?? 0;
|
|
740
|
+
if (this.isProtected(matchIdx)) continue;
|
|
741
|
+
const startIdx = matchIdx + offset;
|
|
672
742
|
const openParen = startIdx + "v.pipe".length;
|
|
673
743
|
let depth = 1;
|
|
674
744
|
let i = openParen + 1;
|
|
@@ -695,7 +765,7 @@ var ValibotToZodTransformer = class {
|
|
|
695
765
|
return result;
|
|
696
766
|
}
|
|
697
767
|
/**
|
|
698
|
-
* Split arguments at top-level commas (not inside nested parens).
|
|
768
|
+
* Split arguments at top-level commas (not inside nested parens/brackets/braces).
|
|
699
769
|
*/
|
|
700
770
|
splitTopLevelArgs(text) {
|
|
701
771
|
const args = [];
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/transformer.ts","../src/mappings.ts","../src/handler.ts","../src/valibot-to-zod-transformer.ts","../src/valibot-to-zod-handler.ts"],"sourcesContent":["export { createZodToValibotHandler } from './handler.js';\nexport {\n FACTORY_MAPPINGS,\n MODIFIER_METHODS,\n NUMBER_VALIDATION_MAPPINGS,\n OBJECT_METHODS,\n VALIDATION_MAPPINGS,\n} from './mappings.js';\nexport { ZodToValibotTransformer } from './transformer.js';\nexport { createValibotToZodHandler } from './valibot-to-zod-handler.js';\nexport { ValibotToZodTransformer } from './valibot-to-zod-transformer.js';\n","import {\n isInsideStringLiteral,\n type MethodCallInfo,\n parseCallChain,\n type TransformError,\n type TransformResult,\n} from '@schemashift/core';\nimport { type CallExpression, Node, type SourceFile } from 'ts-morph';\nimport {\n FACTORY_MAPPINGS,\n MODIFIER_METHODS,\n NUMBER_VALIDATION_MAPPINGS,\n OBJECT_METHODS,\n VALIDATION_MAPPINGS,\n} from './mappings.js';\n\n/**\n * Zod to Valibot transformer.\n *\n * Converts Zod's fluent method chain API to Valibot's pipe-based API.\n *\n * Zod: z.string().email().min(5).max(100)\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n *\n * Zod: z.string().optional()\n * Valibot: v.optional(v.string())\n *\n * Zod: z.object({ name: z.string() }).partial()\n * Valibot: v.partial(v.object({ name: v.string() }))\n */\nexport class ZodToValibotTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n this.updateImports(sourceFile);\n this.transformTypeHelpers(sourceFile);\n this.transformSchemaExpressions(sourceFile);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n private updateImports(sourceFile: SourceFile): void {\n const zodImports = sourceFile\n .getImportDeclarations()\n .filter((imp) => imp.getModuleSpecifierValue() === 'zod');\n\n for (const imp of zodImports) {\n imp.setModuleSpecifier('valibot');\n\n const namespaceImport = imp.getNamespaceImport();\n const defaultImport = imp.getDefaultImport();\n const namedImports = imp.getNamedImports();\n\n if (namespaceImport) imp.removeNamespaceImport();\n if (defaultImport) imp.removeDefaultImport();\n if (namedImports.length > 0) imp.removeNamedImports();\n\n imp.setNamespaceImport('v');\n }\n }\n\n private transformTypeHelpers(sourceFile: SourceFile): void {\n const fullText = sourceFile.getFullText();\n let newText = fullText;\n newText = newText.replace(/\\bz\\.infer</g, 'v.InferOutput<');\n newText = newText.replace(/\\bz\\.input</g, 'v.InferInput<');\n newText = newText.replace(/\\bz\\.output</g, 'v.InferOutput<');\n if (newText !== fullText) {\n sourceFile.replaceWithText(newText);\n }\n }\n\n private transformSchemaExpressions(sourceFile: SourceFile): void {\n const nodesToTransform: CallExpression[] = [];\n\n sourceFile.forEachDescendant((node) => {\n if (Node.isCallExpression(node)) {\n if (isInsideStringLiteral(node)) return;\n\n const text = node.getText();\n if (text.startsWith('z.')) {\n nodesToTransform.push(node);\n }\n }\n });\n\n const outermost = this.filterOutermostNodes(nodesToTransform);\n outermost.sort((a, b) => b.getStart() - a.getStart());\n\n for (const node of outermost) {\n this.transformCallChain(node);\n }\n }\n\n private filterOutermostNodes(nodes: CallExpression[]): CallExpression[] {\n const result: CallExpression[] = [];\n for (const node of nodes) {\n let isChild = false;\n for (const other of nodes) {\n if (other === node) continue;\n if (other.getStart() <= node.getStart() && other.getEnd() >= node.getEnd()) {\n isChild = true;\n break;\n }\n }\n if (!isChild) result.push(node);\n }\n return result;\n }\n\n private transformCallChain(node: CallExpression): void {\n const chain = parseCallChain(node);\n\n if (!chain) {\n this.transformCallChainFallback(node);\n return;\n }\n\n if (chain.base !== 'z') return;\n\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Map the factory method\n const factoryMapping = FACTORY_MAPPINGS[chain.factoryMethod];\n if (!factoryMapping) {\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod factory z.${chain.factoryMethod}() — kept as-is`,\n );\n return;\n }\n\n // Determine the factory context for contextual mappings (string vs number vs array)\n const factoryType = chain.factoryMethod;\n\n // Categorize methods\n const pipeValidators: string[] = [];\n const modifiers: Array<{ name: string; args: string[] }> = [];\n const objectMethods: Array<{ name: string; args: string[] }> = [];\n\n for (const method of chain.methods) {\n const result = this.categorizeMethod(method, factoryType, filePath, lineNumber);\n if (result.type === 'pipe') {\n pipeValidators.push(result.code);\n } else if (result.type === 'modifier') {\n modifiers.push({ name: result.name, args: result.args });\n } else if (result.type === 'object') {\n objectMethods.push({ name: result.name, args: result.args });\n }\n // 'skip' type means the method is removed\n }\n\n // Build the Valibot expression\n let result: string;\n\n // Start with the factory call\n const factoryCall = `${factoryMapping}(${chain.factoryArgs.join(', ')})`;\n\n // If there are pipe validators, wrap in v.pipe()\n if (pipeValidators.length > 0) {\n result = `v.pipe(${factoryCall}, ${pipeValidators.join(', ')})`;\n } else {\n result = factoryCall;\n }\n\n // Apply object methods (wrapping)\n for (const objMethod of objectMethods) {\n result = this.applyObjectMethod(objMethod.name, objMethod.args, result, filePath, lineNumber);\n }\n\n // Apply modifiers (wrapping from inside out)\n for (const modifier of modifiers) {\n result = this.applyModifier(modifier.name, modifier.args, result, filePath, lineNumber);\n }\n\n // Post-process: transform any remaining nested z. references in the result\n result = this.transformNestedZodReferences(result);\n\n node.replaceWithText(result);\n }\n\n private transformNestedZodReferences(text: string): string {\n // Replace z.factoryName( with v.factoryName( for all known factories\n let result = text;\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bz\\\\.${zodName}\\\\(`, 'g');\n result = result.replace(regex, `${valibotName}(`);\n }\n return result;\n }\n\n private categorizeMethod(\n method: MethodCallInfo,\n factoryType: string,\n filePath: string,\n lineNumber: number,\n ):\n | { type: 'pipe'; code: string }\n | { type: 'modifier'; name: string; args: string[] }\n | { type: 'object'; name: string; args: string[] }\n | { type: 'skip' } {\n const { name, args } = method;\n\n // Check if it's a modifier (wrapping)\n if (MODIFIER_METHODS.has(name)) {\n return { type: 'modifier', name, args };\n }\n\n // Check if it's an object method\n if (OBJECT_METHODS.has(name)) {\n return { type: 'object', name, args };\n }\n\n // Check number-specific validations\n if (\n (factoryType === 'number' || factoryType === 'bigint') &&\n NUMBER_VALIDATION_MAPPINGS[name]\n ) {\n const mapping = NUMBER_VALIDATION_MAPPINGS[name];\n if (!mapping) return { type: 'skip' as const };\n const mappedArgs = mapping.args(args);\n return { type: 'pipe', code: `${mapping.name}(${mappedArgs.join(', ')})` };\n }\n\n // Check string-specific min/max -> minLength/maxLength\n if (factoryType === 'string' || factoryType === 'array') {\n if (name === 'min') {\n return { type: 'pipe', code: `v.minLength(${args.join(', ')})` };\n }\n if (name === 'max') {\n return { type: 'pipe', code: `v.maxLength(${args.join(', ')})` };\n }\n }\n\n // Check general validation mappings\n const validationMapping = VALIDATION_MAPPINGS[name];\n if (validationMapping === null) {\n // Should be handled by modifier/object checks above, but just in case\n return { type: 'skip' };\n }\n if (validationMapping) {\n return { type: 'pipe', code: `${validationMapping}(${args.join(', ')})` };\n }\n\n // Unknown method\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod method .${name}() — kept as-is in pipe`,\n );\n return { type: 'pipe', code: `/* TODO: .${name}(${args.join(', ')}) */` };\n }\n\n private applyModifier(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'optional':\n return `v.optional(${inner})`;\n case 'nullable':\n return `v.nullable(${inner})`;\n case 'nullish':\n return `v.nullish(${inner})`;\n case 'default':\n return `v.optional(${inner}, ${args.join(', ')})`;\n case 'catch':\n return `v.fallback(${inner}, ${args.join(', ')})`;\n case 'readonly':\n return `v.readonly(${inner})`;\n case 'transform':\n return `v.pipe(${inner}, v.transform(${args.join(', ')}))`;\n case 'refine':\n if (args.length >= 2) {\n return `v.pipe(${inner}, v.check(${args[0]}, ${args.slice(1).join(', ')}))`;\n }\n return `v.pipe(${inner}, v.check(${args.join(', ')}))`;\n case 'superRefine':\n this.warnings.push(\n `${filePath}:${lineNumber}: .superRefine() requires manual conversion to Valibot custom validation`,\n );\n return `v.pipe(${inner}, /* TODO: superRefine -> custom validation */ v.check(${args.join(', ')}))`;\n case 'brand':\n return `v.pipe(${inner}, v.brand(${args.join(', ')}))`;\n case 'describe':\n // Valibot doesn't have describe, skip it\n return inner;\n case 'pipe':\n return `v.pipe(${inner}, ${args.join(', ')})`;\n default:\n return inner;\n }\n }\n\n private applyObjectMethod(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'partial':\n return `v.partial(${inner})`;\n case 'required':\n return `v.required(${inner})`;\n case 'pick':\n return `v.pick(${inner}, ${args.join(', ')})`;\n case 'omit':\n return `v.omit(${inner}, ${args.join(', ')})`;\n case 'extend':\n case 'merge':\n return `v.merge([${inner}, ${args.join(', ')}])`;\n case 'passthrough':\n this.warnings.push(\n `${filePath}:${lineNumber}: .passthrough() — Valibot objects are loose by default, no action needed`,\n );\n return inner;\n case 'strict':\n return `v.strict(${inner})`;\n case 'strip':\n return inner; // Valibot strips unknown by default when using v.object\n case 'catchall':\n this.warnings.push(\n `${filePath}:${lineNumber}: .catchall() requires manual conversion to Valibot record or custom validation`,\n );\n return inner;\n case 'keyof':\n this.warnings.push(\n `${filePath}:${lineNumber}: .keyof() requires manual conversion to v.picklist(Object.keys(...))`,\n );\n return inner;\n default:\n return inner;\n }\n }\n\n private transformCallChainFallback(node: CallExpression): void {\n const text = node.getText();\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Simple regex-based fallback for chains we can't parse\n let transformed = text;\n\n // Replace z. with v.\n transformed = transformed.replace(/^z\\./, 'v.');\n\n // Basic type mappings\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bv\\\\.${zodName}\\\\(`, 'g');\n transformed = transformed.replace(regex, `${valibotName}(`);\n }\n\n this.warnings.push(\n `${filePath}:${lineNumber}: Complex Zod expression used fallback conversion — manual review recommended`,\n );\n\n node.replaceWithText(transformed);\n }\n}\n","/**\n * Zod -> Valibot method name mappings.\n *\n * Valibot uses a pipe-based API: v.pipe(v.string(), v.email(), v.minLength(5))\n * instead of Zod's fluent chain: z.string().email().min(5)\n *\n * Factory methods map directly. Validation methods become pipe arguments.\n */\n\n/** Zod factory -> Valibot factory */\nexport const FACTORY_MAPPINGS: Record<string, string> = {\n string: 'v.string',\n number: 'v.number',\n boolean: 'v.boolean',\n date: 'v.date',\n bigint: 'v.bigint',\n symbol: 'v.symbol',\n undefined: 'v.undefined_',\n null: 'v.null_',\n void: 'v.void_',\n any: 'v.any',\n unknown: 'v.unknown',\n never: 'v.never',\n nan: 'v.nan',\n literal: 'v.literal',\n enum: 'v.picklist',\n nativeEnum: 'v.enum_',\n array: 'v.array',\n object: 'v.object',\n record: 'v.record',\n tuple: 'v.tuple',\n union: 'v.union',\n discriminatedUnion: 'v.variant',\n intersection: 'v.intersect',\n lazy: 'v.lazy',\n promise: 'v.promise',\n instanceof: 'v.instance',\n};\n\n/** Zod chain methods -> Valibot pipe validators */\nexport const VALIDATION_MAPPINGS: Record<string, string | null> = {\n // String validations\n email: 'v.email',\n url: 'v.url',\n uuid: 'v.uuid',\n cuid: 'v.cuid2',\n cuid2: 'v.cuid2',\n ulid: 'v.ulid',\n regex: 'v.regex',\n ip: 'v.ip',\n datetime: 'v.isoDateTime',\n date: 'v.isoDate',\n time: 'v.isoTime',\n emoji: 'v.emoji',\n includes: 'v.includes',\n startsWith: 'v.startsWith',\n endsWith: 'v.endsWith',\n trim: 'v.trim',\n toLowerCase: 'v.toLowerCase',\n toUpperCase: 'v.toUpperCase',\n\n // Shared validations (string/number/array/date)\n min: 'v.minLength', // Will be context-sensitive\n max: 'v.maxLength', // Will be context-sensitive\n length: 'v.length',\n\n // Number validations\n gt: 'v.minValue',\n gte: 'v.minValue',\n lt: 'v.maxValue',\n lte: 'v.maxValue',\n int: 'v.integer',\n positive: 'v.minValue',\n negative: 'v.maxValue',\n nonnegative: 'v.minValue',\n nonpositive: 'v.maxValue',\n multipleOf: 'v.multipleOf',\n finite: 'v.finite',\n safe: 'v.safeInteger',\n\n // Array validations\n nonempty: 'v.nonEmpty',\n\n // Schema modifiers (not pipe validators)\n optional: null, // Handled specially\n nullable: null, // Handled specially\n nullish: null, // Handled specially\n default: null, // Handled specially\n catch: null, // Handled specially\n transform: null, // Handled specially\n refine: null, // Handled specially\n superRefine: null, // Handled specially\n brand: null, // Handled specially\n readonly: null, // Handled specially\n pipe: null, // Handled specially\n describe: null, // Handled specially\n\n // Object methods\n partial: null, // Handled specially\n required: null, // Handled specially\n pick: null, // Handled specially\n omit: null, // Handled specially\n extend: null, // Handled specially\n merge: null, // Handled specially\n passthrough: null, // Handled specially\n strict: null, // Handled specially\n strip: null, // Handled specially\n catchall: null, // Handled specially\n keyof: null, // Handled specially\n\n // Array methods\n element: null, // Part of factory\n};\n\n/** Zod number methods that need specific arg mapping to Valibot */\nexport const NUMBER_VALIDATION_MAPPINGS: Record<\n string,\n { name: string; args: (args: string[]) => string[] }\n> = {\n min: { name: 'v.minValue', args: (a) => a },\n max: { name: 'v.maxValue', args: (a) => a },\n gt: { name: 'v.minValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) + 1)] : a) },\n lt: { name: 'v.maxValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) - 1)] : a) },\n gte: { name: 'v.minValue', args: (a) => a },\n lte: { name: 'v.maxValue', args: (a) => a },\n positive: { name: 'v.minValue', args: () => ['1'] },\n negative: { name: 'v.maxValue', args: () => ['-1'] },\n nonnegative: { name: 'v.minValue', args: () => ['0'] },\n nonpositive: { name: 'v.maxValue', args: () => ['0'] },\n};\n\n/** Methods that wrap schemas (modifiers) */\nexport const MODIFIER_METHODS = new Set([\n 'optional',\n 'nullable',\n 'nullish',\n 'default',\n 'catch',\n 'readonly',\n 'brand',\n 'describe',\n 'transform',\n 'refine',\n 'superRefine',\n 'pipe',\n]);\n\n/** Object-specific methods */\nexport const OBJECT_METHODS = new Set([\n 'partial',\n 'required',\n 'pick',\n 'omit',\n 'extend',\n 'merge',\n 'passthrough',\n 'strict',\n 'strip',\n 'catchall',\n 'keyof',\n]);\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ZodToValibotTransformer } from './transformer.js';\n\nexport function createZodToValibotHandler(): TransformHandler {\n const transformer = new ZodToValibotTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\n\n/**\n * Reverse Valibot → Zod factory mappings.\n * Inverted from FACTORY_MAPPINGS in mappings.ts.\n */\nconst VALIBOT_TO_ZOD_FACTORY: Record<string, string> = {\n 'v.string': 'z.string',\n 'v.number': 'z.number',\n 'v.boolean': 'z.boolean',\n 'v.date': 'z.date',\n 'v.bigint': 'z.bigint',\n 'v.symbol': 'z.symbol',\n 'v.undefined_': 'z.undefined',\n 'v.null_': 'z.null',\n 'v.void_': 'z.void',\n 'v.any': 'z.any',\n 'v.unknown': 'z.unknown',\n 'v.never': 'z.never',\n 'v.nan': 'z.nan',\n 'v.literal': 'z.literal',\n 'v.picklist': 'z.enum',\n 'v.enum_': 'z.nativeEnum',\n 'v.array': 'z.array',\n 'v.object': 'z.object',\n 'v.record': 'z.record',\n 'v.tuple': 'z.tuple',\n 'v.union': 'z.union',\n 'v.variant': 'z.discriminatedUnion',\n 'v.intersect': 'z.intersection',\n 'v.lazy': 'z.lazy',\n 'v.promise': 'z.promise',\n 'v.instance': 'z.instanceof',\n};\n\n/**\n * Valibot pipe validator → Zod chain method mappings.\n */\nconst PIPE_TO_CHAIN: Record<string, string> = {\n 'v.email': '.email',\n 'v.url': '.url',\n 'v.uuid': '.uuid',\n 'v.cuid2': '.cuid2',\n 'v.ulid': '.ulid',\n 'v.regex': '.regex',\n 'v.ip': '.ip',\n 'v.isoDateTime': '.datetime',\n 'v.isoDate': '.date',\n 'v.isoTime': '.time',\n 'v.emoji': '.emoji',\n 'v.includes': '.includes',\n 'v.startsWith': '.startsWith',\n 'v.endsWith': '.endsWith',\n 'v.trim': '.trim',\n 'v.toLowerCase': '.toLowerCase',\n 'v.toUpperCase': '.toUpperCase',\n 'v.minLength': '.min',\n 'v.maxLength': '.max',\n 'v.length': '.length',\n 'v.minValue': '.min',\n 'v.maxValue': '.max',\n 'v.integer': '.int',\n 'v.finite': '.finite',\n 'v.safeInteger': '.safe',\n 'v.multipleOf': '.multipleOf',\n 'v.nonEmpty': '.nonempty',\n};\n\n/**\n * Valibot → Zod transformer.\n *\n * Converts Valibot's pipe-based API back to Zod's fluent method chain API.\n *\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n * Zod: z.string().email().min(5).max(100)\n *\n * Valibot: v.optional(v.string())\n * Zod: z.string().optional()\n *\n * Valibot: v.partial(v.object({ name: v.string() }))\n * Zod: z.object({ name: z.string() }).partial()\n */\nexport class ValibotToZodTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n // Text-based transformation (more robust for pipe-based API)\n let text = originalCode;\n\n text = this.transformImports(text);\n text = this.transformTypeHelpers(text);\n text = this.transformWrappers(text);\n text = this.transformPipeExpressions(text);\n text = this.transformFactories(text);\n\n sourceFile.replaceWithText(text);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n private transformImports(text: string): string {\n // Replace valibot imports with zod\n text = text.replace(\n /import\\s+\\*\\s+as\\s+v\\s+from\\s+['\"]valibot['\"]/g,\n \"import { z } from 'zod'\",\n );\n text = text.replace(/import\\s+\\{[^}]*\\}\\s+from\\s+['\"]valibot['\"]/g, \"import { z } from 'zod'\");\n return text;\n }\n\n private transformTypeHelpers(text: string): string {\n text = text.replace(/\\bv\\.InferOutput</g, 'z.infer<');\n text = text.replace(/\\bv\\.InferInput</g, 'z.input<');\n return text;\n }\n\n /**\n * Transform Valibot wrapper functions to Zod method chains.\n * v.optional(schema) → schema.optional()\n * v.nullable(schema) → schema.nullable()\n * v.nullish(schema) → schema.nullish()\n * v.readonly(schema) → schema.readonly()\n * v.partial(schema) → schema.partial()\n * v.required(schema) → schema.required()\n */\n private transformWrappers(text: string): string {\n // Two-arg wrappers first (more specific)\n const twoArgWrappers = [\n {\n prefix: 'v.optional',\n transform: (schema: string, value: string) => `${schema}.default(${value})`,\n },\n {\n prefix: 'v.fallback',\n transform: (schema: string, value: string) => `${schema}.catch(${value})`,\n },\n ];\n\n // Single-arg wrappers\n const singleArgWrappers = [\n { prefix: 'v.optional', suffix: '.optional()' },\n { prefix: 'v.nullable', suffix: '.nullable()' },\n { prefix: 'v.nullish', suffix: '.nullish()' },\n { prefix: 'v.readonly', suffix: '.readonly()' },\n { prefix: 'v.partial', suffix: '.partial()' },\n { prefix: 'v.required', suffix: '.required()' },\n { prefix: 'v.strict', suffix: '.strict()' },\n ];\n\n // Process two-arg wrappers first\n for (const { prefix, transform } of twoArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length >= 2) {\n return transform(args[0] ?? '', args[1] ?? '');\n }\n return null; // Not a two-arg call, skip\n });\n }\n\n // Process single-arg wrappers\n for (const { prefix, suffix } of singleArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length === 1) {\n return `${args[0] ?? ''}${suffix}`;\n }\n return null;\n });\n }\n\n return text;\n }\n\n /**\n * Replace wrapper calls using balanced parenthesis matching.\n */\n private replaceWrapperCall(\n text: string,\n prefix: string,\n replacer: (args: string[]) => string | null,\n ): string {\n const pattern = new RegExp(`\\\\b${prefix.replace('.', '\\\\.')}\\\\(`, 'g');\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pattern)) {\n const startIdx = (match.index ?? 0) + offset;\n const openParen = startIdx + prefix.length;\n\n // Find matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n const replacement = replacer(args);\n if (replacement === null) continue;\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + replacement + after;\n offset += replacement.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()\n */\n private transformPipeExpressions(text: string): string {\n // Match v.pipe(...) — use a simple approach for balanced parens\n const pipePattern = /\\bv\\.pipe\\(/g;\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pipePattern)) {\n const startIdx = (match.index ?? 0) + offset;\n const openParen = startIdx + 'v.pipe'.length;\n\n // Find the matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n if (args.length === 0) continue;\n\n // First arg is the factory, rest are pipe validators\n let zodExpr = args[0] ?? '';\n for (let j = 1; j < args.length; j++) {\n const validator = (args[j] ?? '').trim();\n zodExpr = this.convertPipeValidator(zodExpr, validator);\n }\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + zodExpr + after;\n offset += zodExpr.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Split arguments at top-level commas (not inside nested parens).\n */\n private splitTopLevelArgs(text: string): string[] {\n const args: string[] = [];\n let depth = 0;\n let current = '';\n\n for (const char of text) {\n if (char === '(' || char === '[' || char === '{') depth++;\n else if (char === ')' || char === ']' || char === '}') depth--;\n\n if (char === ',' && depth === 0) {\n args.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n args.push(current.trim());\n }\n\n return args;\n }\n\n private convertPipeValidator(base: string, validator: string): string {\n // Try known pipe-to-chain mappings\n for (const [valibotFn, zodMethod] of Object.entries(PIPE_TO_CHAIN)) {\n const fnCall = `${valibotFn}(`;\n if (validator.startsWith(fnCall)) {\n const argsStr = validator.substring(fnCall.length, validator.length - 1);\n return argsStr ? `${base}${zodMethod}(${argsStr})` : `${base}${zodMethod}()`;\n }\n // No-arg validators: v.email() matches exactly\n if (validator === `${valibotFn}()`) {\n return `${base}${zodMethod}()`;\n }\n }\n\n // v.transform(...) → .transform(...)\n if (validator.startsWith('v.transform(')) {\n const args = validator.substring('v.transform('.length, validator.length - 1);\n return `${base}.transform(${args})`;\n }\n\n // v.check(...) → .refine(...)\n if (validator.startsWith('v.check(')) {\n const args = validator.substring('v.check('.length, validator.length - 1);\n return `${base}.refine(${args})`;\n }\n\n // v.brand(...) → .brand(...)\n if (validator.startsWith('v.brand(')) {\n const args = validator.substring('v.brand('.length, validator.length - 1);\n return `${base}.brand(${args})`;\n }\n\n // Unknown validator — add TODO\n this.warnings.push(`Unknown Valibot pipe validator: ${validator} — kept as-is`);\n return `${base} /* TODO(schemashift): convert ${validator} */`;\n }\n\n private transformFactories(text: string): string {\n // Replace remaining v.factory() calls with z.factory()\n for (const [valibotFactory, zodFactory] of Object.entries(VALIBOT_TO_ZOD_FACTORY)) {\n const escaped = valibotFactory.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\(`, 'g');\n text = text.replace(regex, `${zodFactory}(`);\n }\n return text;\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ValibotToZodTransformer } from './valibot-to-zod-transformer.js';\n\nexport function createValibotToZodHandler(): TransformHandler {\n const transformer = new ValibotToZodTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n"],"mappings":"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","names":["result"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/transformer.ts","../src/mappings.ts","../src/handler.ts","../src/valibot-to-zod-transformer.ts","../src/valibot-to-zod-handler.ts"],"sourcesContent":["export { createZodToValibotHandler } from './handler.js';\nexport {\n FACTORY_MAPPINGS,\n MODIFIER_METHODS,\n NUMBER_VALIDATION_MAPPINGS,\n OBJECT_METHODS,\n VALIDATION_MAPPINGS,\n} from './mappings.js';\nexport { ZodToValibotTransformer } from './transformer.js';\nexport { createValibotToZodHandler } from './valibot-to-zod-handler.js';\nexport { ValibotToZodTransformer } from './valibot-to-zod-transformer.js';\n","import {\n isInsideStringLiteral,\n type MethodCallInfo,\n parseCallChain,\n type TransformError,\n type TransformResult,\n} from '@schemashift/core';\nimport { type CallExpression, Node, type SourceFile } from 'ts-morph';\nimport {\n FACTORY_MAPPINGS,\n MODIFIER_METHODS,\n NUMBER_VALIDATION_MAPPINGS,\n OBJECT_METHODS,\n VALIDATION_MAPPINGS,\n} from './mappings.js';\n\n/**\n * Zod to Valibot transformer.\n *\n * Converts Zod's fluent method chain API to Valibot's pipe-based API.\n *\n * Zod: z.string().email().min(5).max(100)\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n *\n * Zod: z.string().optional()\n * Valibot: v.optional(v.string())\n *\n * Zod: z.object({ name: z.string() }).partial()\n * Valibot: v.partial(v.object({ name: v.string() }))\n */\nexport class ZodToValibotTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n this.updateImports(sourceFile);\n this.transformTypeHelpers(sourceFile);\n this.transformSchemaExpressions(sourceFile);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n private updateImports(sourceFile: SourceFile): void {\n const zodImports = sourceFile\n .getImportDeclarations()\n .filter((imp) => imp.getModuleSpecifierValue() === 'zod');\n\n for (const imp of zodImports) {\n imp.setModuleSpecifier('valibot');\n\n const namespaceImport = imp.getNamespaceImport();\n const defaultImport = imp.getDefaultImport();\n const namedImports = imp.getNamedImports();\n\n if (namespaceImport) imp.removeNamespaceImport();\n if (defaultImport) imp.removeDefaultImport();\n if (namedImports.length > 0) imp.removeNamedImports();\n\n imp.setNamespaceImport('v');\n }\n }\n\n private transformTypeHelpers(sourceFile: SourceFile): void {\n const fullText = sourceFile.getFullText();\n let newText = fullText;\n newText = newText.replace(/\\bz\\.infer</g, 'v.InferOutput<');\n newText = newText.replace(/\\bz\\.input</g, 'v.InferInput<');\n newText = newText.replace(/\\bz\\.output</g, 'v.InferOutput<');\n if (newText !== fullText) {\n sourceFile.replaceWithText(newText);\n }\n }\n\n private transformSchemaExpressions(sourceFile: SourceFile): void {\n const nodesToTransform: CallExpression[] = [];\n\n sourceFile.forEachDescendant((node) => {\n if (Node.isCallExpression(node)) {\n if (isInsideStringLiteral(node)) return;\n\n const text = node.getText();\n if (text.startsWith('z.')) {\n nodesToTransform.push(node);\n }\n }\n });\n\n const outermost = this.filterOutermostNodes(nodesToTransform);\n outermost.sort((a, b) => b.getStart() - a.getStart());\n\n for (const node of outermost) {\n this.transformCallChain(node);\n }\n }\n\n private filterOutermostNodes(nodes: CallExpression[]): CallExpression[] {\n const result: CallExpression[] = [];\n for (const node of nodes) {\n let isChild = false;\n for (const other of nodes) {\n if (other === node) continue;\n if (other.getStart() <= node.getStart() && other.getEnd() >= node.getEnd()) {\n isChild = true;\n break;\n }\n }\n if (!isChild) result.push(node);\n }\n return result;\n }\n\n private transformCallChain(node: CallExpression): void {\n const chain = parseCallChain(node);\n\n if (!chain) {\n this.transformCallChainFallback(node);\n return;\n }\n\n if (chain.base !== 'z') return;\n\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Map the factory method\n const factoryMapping = FACTORY_MAPPINGS[chain.factoryMethod];\n if (!factoryMapping) {\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod factory z.${chain.factoryMethod}() — kept as-is`,\n );\n return;\n }\n\n // Determine the factory context for contextual mappings (string vs number vs array)\n const factoryType = chain.factoryMethod;\n\n // Categorize methods\n const pipeValidators: string[] = [];\n const modifiers: Array<{ name: string; args: string[] }> = [];\n const objectMethods: Array<{ name: string; args: string[] }> = [];\n\n for (const method of chain.methods) {\n const result = this.categorizeMethod(method, factoryType, filePath, lineNumber);\n if (result.type === 'pipe') {\n pipeValidators.push(result.code);\n } else if (result.type === 'modifier') {\n modifiers.push({ name: result.name, args: result.args });\n } else if (result.type === 'object') {\n objectMethods.push({ name: result.name, args: result.args });\n }\n // 'skip' type means the method is removed\n }\n\n // Build the Valibot expression\n let result: string;\n\n // Start with the factory call\n const factoryCall = `${factoryMapping}(${chain.factoryArgs.join(', ')})`;\n\n // If there are pipe validators, wrap in v.pipe()\n if (pipeValidators.length > 0) {\n result = `v.pipe(${factoryCall}, ${pipeValidators.join(', ')})`;\n } else {\n result = factoryCall;\n }\n\n // Apply object methods (wrapping)\n for (const objMethod of objectMethods) {\n result = this.applyObjectMethod(objMethod.name, objMethod.args, result, filePath, lineNumber);\n }\n\n // Apply modifiers (wrapping from inside out)\n for (const modifier of modifiers) {\n result = this.applyModifier(modifier.name, modifier.args, result, filePath, lineNumber);\n }\n\n // Post-process: transform any remaining nested z. references in the result\n result = this.transformNestedZodReferences(result);\n\n node.replaceWithText(result);\n }\n\n private transformNestedZodReferences(text: string): string {\n // Replace z.factoryName( with v.factoryName( for all known factories\n let result = text;\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bz\\\\.${zodName}\\\\(`, 'g');\n result = result.replace(regex, `${valibotName}(`);\n }\n return result;\n }\n\n private categorizeMethod(\n method: MethodCallInfo,\n factoryType: string,\n filePath: string,\n lineNumber: number,\n ):\n | { type: 'pipe'; code: string }\n | { type: 'modifier'; name: string; args: string[] }\n | { type: 'object'; name: string; args: string[] }\n | { type: 'skip' } {\n const { name, args } = method;\n\n // Check if it's a modifier (wrapping)\n if (MODIFIER_METHODS.has(name)) {\n return { type: 'modifier', name, args };\n }\n\n // Check if it's an object method\n if (OBJECT_METHODS.has(name)) {\n return { type: 'object', name, args };\n }\n\n // Check number-specific validations\n if (\n (factoryType === 'number' || factoryType === 'bigint') &&\n NUMBER_VALIDATION_MAPPINGS[name]\n ) {\n const mapping = NUMBER_VALIDATION_MAPPINGS[name];\n if (!mapping) return { type: 'skip' as const };\n const mappedArgs = mapping.args(args);\n return { type: 'pipe', code: `${mapping.name}(${mappedArgs.join(', ')})` };\n }\n\n // Check string-specific min/max -> minLength/maxLength\n if (factoryType === 'string' || factoryType === 'array') {\n if (name === 'min') {\n return { type: 'pipe', code: `v.minLength(${args.join(', ')})` };\n }\n if (name === 'max') {\n return { type: 'pipe', code: `v.maxLength(${args.join(', ')})` };\n }\n }\n\n // Check general validation mappings\n const validationMapping = VALIDATION_MAPPINGS[name];\n if (validationMapping === null) {\n // Should be handled by modifier/object checks above, but just in case\n return { type: 'skip' };\n }\n if (validationMapping) {\n return { type: 'pipe', code: `${validationMapping}(${args.join(', ')})` };\n }\n\n // Unknown method\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod method .${name}() — kept as-is in pipe`,\n );\n return { type: 'pipe', code: `/* TODO: .${name}(${args.join(', ')}) */` };\n }\n\n private applyModifier(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'optional':\n return `v.optional(${inner})`;\n case 'nullable':\n return `v.nullable(${inner})`;\n case 'nullish':\n return `v.nullish(${inner})`;\n case 'default':\n return `v.optional(${inner}, ${args.join(', ')})`;\n case 'catch':\n return `v.fallback(${inner}, ${args.join(', ')})`;\n case 'readonly':\n return `v.readonly(${inner})`;\n case 'transform':\n return `v.pipe(${inner}, v.transform(${args.join(', ')}))`;\n case 'refine':\n if (args.length >= 2) {\n return `v.pipe(${inner}, v.check(${args[0]}, ${args.slice(1).join(', ')}))`;\n }\n return `v.pipe(${inner}, v.check(${args.join(', ')}))`;\n case 'superRefine':\n this.warnings.push(\n `${filePath}:${lineNumber}: .superRefine() requires manual conversion to Valibot custom validation`,\n );\n return `v.pipe(${inner}, /* TODO: superRefine -> custom validation */ v.check(${args.join(', ')}))`;\n case 'brand':\n return `v.pipe(${inner}, v.brand(${args.join(', ')}))`;\n case 'describe':\n // Valibot doesn't have describe, skip it\n return inner;\n case 'pipe':\n return `v.pipe(${inner}, ${args.join(', ')})`;\n default:\n return inner;\n }\n }\n\n private applyObjectMethod(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'partial':\n return `v.partial(${inner})`;\n case 'required':\n return `v.required(${inner})`;\n case 'pick':\n return `v.pick(${inner}, ${args.join(', ')})`;\n case 'omit':\n return `v.omit(${inner}, ${args.join(', ')})`;\n case 'extend':\n case 'merge':\n return `v.merge([${inner}, ${args.join(', ')}])`;\n case 'passthrough':\n this.warnings.push(\n `${filePath}:${lineNumber}: .passthrough() — Valibot objects are loose by default, no action needed`,\n );\n return inner;\n case 'strict':\n return `v.strict(${inner})`;\n case 'strip':\n return inner; // Valibot strips unknown by default when using v.object\n case 'catchall':\n this.warnings.push(\n `${filePath}:${lineNumber}: .catchall() requires manual conversion to Valibot record or custom validation`,\n );\n return inner;\n case 'keyof':\n this.warnings.push(\n `${filePath}:${lineNumber}: .keyof() requires manual conversion to v.picklist(Object.keys(...))`,\n );\n return inner;\n default:\n return inner;\n }\n }\n\n private transformCallChainFallback(node: CallExpression): void {\n const text = node.getText();\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Simple regex-based fallback for chains we can't parse\n let transformed = text;\n\n // Replace z. with v.\n transformed = transformed.replace(/^z\\./, 'v.');\n\n // Basic type mappings\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bv\\\\.${zodName}\\\\(`, 'g');\n transformed = transformed.replace(regex, `${valibotName}(`);\n }\n\n this.warnings.push(\n `${filePath}:${lineNumber}: Complex Zod expression used fallback conversion — manual review recommended`,\n );\n\n node.replaceWithText(transformed);\n }\n}\n","/**\n * Zod -> Valibot method name mappings.\n *\n * Valibot uses a pipe-based API: v.pipe(v.string(), v.email(), v.minLength(5))\n * instead of Zod's fluent chain: z.string().email().min(5)\n *\n * Factory methods map directly. Validation methods become pipe arguments.\n */\n\n/** Zod factory -> Valibot factory */\nexport const FACTORY_MAPPINGS: Record<string, string> = {\n string: 'v.string',\n number: 'v.number',\n boolean: 'v.boolean',\n date: 'v.date',\n bigint: 'v.bigint',\n symbol: 'v.symbol',\n undefined: 'v.undefined_',\n null: 'v.null_',\n void: 'v.void_',\n any: 'v.any',\n unknown: 'v.unknown',\n never: 'v.never',\n nan: 'v.nan',\n literal: 'v.literal',\n enum: 'v.picklist',\n nativeEnum: 'v.enum_',\n array: 'v.array',\n object: 'v.object',\n record: 'v.record',\n tuple: 'v.tuple',\n union: 'v.union',\n discriminatedUnion: 'v.variant',\n intersection: 'v.intersect',\n lazy: 'v.lazy',\n promise: 'v.promise',\n instanceof: 'v.instance',\n};\n\n/** Zod chain methods -> Valibot pipe validators */\nexport const VALIDATION_MAPPINGS: Record<string, string | null> = {\n // String validations\n email: 'v.email',\n url: 'v.url',\n uuid: 'v.uuid',\n cuid: 'v.cuid2',\n cuid2: 'v.cuid2',\n ulid: 'v.ulid',\n regex: 'v.regex',\n ip: 'v.ip',\n datetime: 'v.isoDateTime',\n date: 'v.isoDate',\n time: 'v.isoTime',\n emoji: 'v.emoji',\n includes: 'v.includes',\n startsWith: 'v.startsWith',\n endsWith: 'v.endsWith',\n trim: 'v.trim',\n toLowerCase: 'v.toLowerCase',\n toUpperCase: 'v.toUpperCase',\n\n // Shared validations (string/number/array/date)\n min: 'v.minLength', // Will be context-sensitive\n max: 'v.maxLength', // Will be context-sensitive\n length: 'v.length',\n\n // Number validations\n gt: 'v.minValue',\n gte: 'v.minValue',\n lt: 'v.maxValue',\n lte: 'v.maxValue',\n int: 'v.integer',\n positive: 'v.minValue',\n negative: 'v.maxValue',\n nonnegative: 'v.minValue',\n nonpositive: 'v.maxValue',\n multipleOf: 'v.multipleOf',\n finite: 'v.finite',\n safe: 'v.safeInteger',\n\n // Array validations\n nonempty: 'v.nonEmpty',\n\n // Schema modifiers (not pipe validators)\n optional: null, // Handled specially\n nullable: null, // Handled specially\n nullish: null, // Handled specially\n default: null, // Handled specially\n catch: null, // Handled specially\n transform: null, // Handled specially\n refine: null, // Handled specially\n superRefine: null, // Handled specially\n brand: null, // Handled specially\n readonly: null, // Handled specially\n pipe: null, // Handled specially\n describe: null, // Handled specially\n\n // Object methods\n partial: null, // Handled specially\n required: null, // Handled specially\n pick: null, // Handled specially\n omit: null, // Handled specially\n extend: null, // Handled specially\n merge: null, // Handled specially\n passthrough: null, // Handled specially\n strict: null, // Handled specially\n strip: null, // Handled specially\n catchall: null, // Handled specially\n keyof: null, // Handled specially\n\n // Array methods\n element: null, // Part of factory\n};\n\n/** Zod number methods that need specific arg mapping to Valibot */\nexport const NUMBER_VALIDATION_MAPPINGS: Record<\n string,\n { name: string; args: (args: string[]) => string[] }\n> = {\n min: { name: 'v.minValue', args: (a) => a },\n max: { name: 'v.maxValue', args: (a) => a },\n gt: { name: 'v.minValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) + 1)] : a) },\n lt: { name: 'v.maxValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) - 1)] : a) },\n gte: { name: 'v.minValue', args: (a) => a },\n lte: { name: 'v.maxValue', args: (a) => a },\n positive: { name: 'v.minValue', args: () => ['1'] },\n negative: { name: 'v.maxValue', args: () => ['-1'] },\n nonnegative: { name: 'v.minValue', args: () => ['0'] },\n nonpositive: { name: 'v.maxValue', args: () => ['0'] },\n};\n\n/** Methods that wrap schemas (modifiers) */\nexport const MODIFIER_METHODS = new Set([\n 'optional',\n 'nullable',\n 'nullish',\n 'default',\n 'catch',\n 'readonly',\n 'brand',\n 'describe',\n 'transform',\n 'refine',\n 'superRefine',\n 'pipe',\n]);\n\n/** Object-specific methods */\nexport const OBJECT_METHODS = new Set([\n 'partial',\n 'required',\n 'pick',\n 'omit',\n 'extend',\n 'merge',\n 'passthrough',\n 'strict',\n 'strip',\n 'catchall',\n 'keyof',\n]);\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ZodToValibotTransformer } from './transformer.js';\n\nexport function createZodToValibotHandler(): TransformHandler {\n const transformer = new ZodToValibotTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport { type ImportDeclaration, type SourceFile, SyntaxKind } from 'ts-morph';\n\n/**\n * Reverse Valibot → Zod factory mappings.\n * Inverted from FACTORY_MAPPINGS in mappings.ts.\n */\nconst VALIBOT_TO_ZOD_FACTORY: Record<string, string> = {\n 'v.string': 'z.string',\n 'v.number': 'z.number',\n 'v.boolean': 'z.boolean',\n 'v.date': 'z.date',\n 'v.bigint': 'z.bigint',\n 'v.symbol': 'z.symbol',\n 'v.undefined_': 'z.undefined',\n 'v.null_': 'z.null',\n 'v.void_': 'z.void',\n 'v.any': 'z.any',\n 'v.unknown': 'z.unknown',\n 'v.never': 'z.never',\n 'v.nan': 'z.nan',\n 'v.literal': 'z.literal',\n 'v.picklist': 'z.enum',\n 'v.enum_': 'z.nativeEnum',\n 'v.array': 'z.array',\n 'v.object': 'z.object',\n 'v.record': 'z.record',\n 'v.tuple': 'z.tuple',\n 'v.union': 'z.union',\n 'v.variant': 'z.discriminatedUnion',\n 'v.intersect': 'z.intersection',\n 'v.lazy': 'z.lazy',\n 'v.promise': 'z.promise',\n 'v.instance': 'z.instanceof',\n};\n\n/**\n * Valibot pipe validator → Zod chain method mappings.\n */\nconst PIPE_TO_CHAIN: Record<string, string> = {\n 'v.email': '.email',\n 'v.url': '.url',\n 'v.uuid': '.uuid',\n 'v.cuid2': '.cuid2',\n 'v.ulid': '.ulid',\n 'v.regex': '.regex',\n 'v.ip': '.ip',\n 'v.isoDateTime': '.datetime',\n 'v.isoDate': '.date',\n 'v.isoTime': '.time',\n 'v.emoji': '.emoji',\n 'v.includes': '.includes',\n 'v.startsWith': '.startsWith',\n 'v.endsWith': '.endsWith',\n 'v.trim': '.trim',\n 'v.toLowerCase': '.toLowerCase',\n 'v.toUpperCase': '.toUpperCase',\n 'v.minLength': '.min',\n 'v.maxLength': '.max',\n 'v.length': '.length',\n 'v.minValue': '.min',\n 'v.maxValue': '.max',\n 'v.integer': '.int',\n 'v.finite': '.finite',\n 'v.safeInteger': '.safe',\n 'v.multipleOf': '.multipleOf',\n 'v.nonEmpty': '.nonempty',\n};\n\n/**\n * Valibot → Zod transformer.\n *\n * Converts Valibot's pipe-based API back to Zod's fluent method chain API.\n * Uses AST-based import handling for safety, with text-based pipe expression\n * transformation for the complex pipe-to-chain conversions.\n *\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n * Zod: z.string().email().min(5).max(100)\n *\n * Valibot: v.optional(v.string())\n * Zod: z.string().optional()\n *\n * Valibot: v.partial(v.object({ name: v.string() }))\n * Zod: z.object({ name: z.string() }).partial()\n */\nexport class ValibotToZodTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n private stringLiteralRanges: Array<{ start: number; end: number }> = [];\n private commentRanges: Array<{ start: number; end: number }> = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n this.stringLiteralRanges = [];\n this.commentRanges = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n // Step 1: Collect protected ranges (strings, comments) from AST\n this.collectProtectedRanges(sourceFile);\n\n // Step 2: AST-based import rewriting\n this.transformImportsAST(sourceFile);\n\n // Step 3: Text-based transformations on the updated source\n let text = sourceFile.getFullText();\n\n text = this.transformTypeHelpers(text);\n text = this.transformWrappers(text);\n text = this.transformPipeExpressions(text);\n text = this.transformFactories(text);\n\n sourceFile.replaceWithText(text);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n /**\n * Collect string literal and comment ranges from the AST\n * so text-based transforms can avoid modifying them.\n */\n private collectProtectedRanges(sourceFile: SourceFile): void {\n this.stringLiteralRanges = [];\n this.commentRanges = [];\n\n // Collect string literals\n sourceFile.forEachDescendant((node) => {\n if (\n node.getKind() === SyntaxKind.StringLiteral ||\n node.getKind() === SyntaxKind.TemplateExpression ||\n node.getKind() === SyntaxKind.NoSubstitutionTemplateLiteral\n ) {\n this.stringLiteralRanges.push({\n start: node.getStart(),\n end: node.getEnd(),\n });\n }\n });\n\n // Collect comments via regex (ts-morph doesn't expose comments easily)\n const text = sourceFile.getFullText();\n const commentRegex = /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//g;\n for (const match of text.matchAll(commentRegex)) {\n if (match.index !== undefined) {\n this.commentRanges.push({\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n }\n\n /**\n * Check if a position is inside a protected range (string literal or comment).\n */\n private isProtected(position: number): boolean {\n for (const range of this.stringLiteralRanges) {\n if (position >= range.start && position < range.end) return true;\n }\n for (const range of this.commentRanges) {\n if (position >= range.start && position < range.end) return true;\n }\n return false;\n }\n\n /**\n * AST-based import transformation.\n * Replaces valibot imports with zod imports using the AST.\n */\n private transformImportsAST(sourceFile: SourceFile): void {\n const imports = sourceFile.getImportDeclarations();\n const valibotImports: ImportDeclaration[] = [];\n\n for (const imp of imports) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n if (moduleSpecifier === 'valibot') {\n valibotImports.push(imp);\n }\n }\n\n for (const imp of valibotImports) {\n imp.setModuleSpecifier('zod');\n\n // Replace namespace import (import * as v from 'valibot') with named import\n const namespaceImport = imp.getNamespaceImport();\n if (namespaceImport) {\n imp.removeNamespaceImport();\n imp.addNamedImport('z');\n } else {\n // Replace named imports with { z }\n const namedImports = imp.getNamedImports();\n for (const named of namedImports) {\n named.remove();\n }\n imp.addNamedImport('z');\n }\n }\n }\n\n private transformTypeHelpers(text: string): string {\n text = text.replace(/\\bv\\.InferOutput</g, 'z.infer<');\n text = text.replace(/\\bv\\.InferInput</g, 'z.input<');\n return text;\n }\n\n /**\n * Transform Valibot wrapper functions to Zod method chains.\n * v.optional(schema) → schema.optional()\n * v.nullable(schema) → schema.nullable()\n * v.nullish(schema) → schema.nullish()\n * v.readonly(schema) → schema.readonly()\n * v.partial(schema) → schema.partial()\n * v.required(schema) → schema.required()\n */\n private transformWrappers(text: string): string {\n // Two-arg wrappers first (more specific)\n const twoArgWrappers = [\n {\n prefix: 'v.optional',\n transform: (schema: string, value: string) => `${schema}.default(${value})`,\n },\n {\n prefix: 'v.fallback',\n transform: (schema: string, value: string) => `${schema}.catch(${value})`,\n },\n ];\n\n // Single-arg wrappers\n const singleArgWrappers = [\n { prefix: 'v.optional', suffix: '.optional()' },\n { prefix: 'v.nullable', suffix: '.nullable()' },\n { prefix: 'v.nullish', suffix: '.nullish()' },\n { prefix: 'v.readonly', suffix: '.readonly()' },\n { prefix: 'v.partial', suffix: '.partial()' },\n { prefix: 'v.required', suffix: '.required()' },\n { prefix: 'v.strict', suffix: '.strict()' },\n ];\n\n // Process two-arg wrappers first\n for (const { prefix, transform } of twoArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length >= 2) {\n return transform(args[0] ?? '', args[1] ?? '');\n }\n return null; // Not a two-arg call, skip\n });\n }\n\n // Process single-arg wrappers\n for (const { prefix, suffix } of singleArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length === 1) {\n return `${args[0] ?? ''}${suffix}`;\n }\n return null;\n });\n }\n\n return text;\n }\n\n /**\n * Replace wrapper calls using balanced parenthesis matching.\n * Skips matches inside string literals and comments.\n */\n private replaceWrapperCall(\n text: string,\n prefix: string,\n replacer: (args: string[]) => string | null,\n ): string {\n const pattern = new RegExp(`\\\\b${prefix.replace('.', '\\\\.')}\\\\(`, 'g');\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pattern)) {\n const matchIdx = match.index ?? 0;\n\n // Skip if inside a protected range\n if (this.isProtected(matchIdx)) continue;\n\n const startIdx = matchIdx + offset;\n const openParen = startIdx + prefix.length;\n\n // Find matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n const replacement = replacer(args);\n if (replacement === null) continue;\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + replacement + after;\n offset += replacement.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()\n * Skips matches inside string literals and comments.\n */\n private transformPipeExpressions(text: string): string {\n const pipePattern = /\\bv\\.pipe\\(/g;\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pipePattern)) {\n const matchIdx = match.index ?? 0;\n\n // Skip if inside a protected range\n if (this.isProtected(matchIdx)) continue;\n\n const startIdx = matchIdx + offset;\n const openParen = startIdx + 'v.pipe'.length;\n\n // Find the matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n if (args.length === 0) continue;\n\n // First arg is the factory, rest are pipe validators\n let zodExpr = args[0] ?? '';\n for (let j = 1; j < args.length; j++) {\n const validator = (args[j] ?? '').trim();\n zodExpr = this.convertPipeValidator(zodExpr, validator);\n }\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + zodExpr + after;\n offset += zodExpr.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Split arguments at top-level commas (not inside nested parens/brackets/braces).\n */\n private splitTopLevelArgs(text: string): string[] {\n const args: string[] = [];\n let depth = 0;\n let current = '';\n\n for (const char of text) {\n if (char === '(' || char === '[' || char === '{') depth++;\n else if (char === ')' || char === ']' || char === '}') depth--;\n\n if (char === ',' && depth === 0) {\n args.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n args.push(current.trim());\n }\n\n return args;\n }\n\n private convertPipeValidator(base: string, validator: string): string {\n // Try known pipe-to-chain mappings\n for (const [valibotFn, zodMethod] of Object.entries(PIPE_TO_CHAIN)) {\n const fnCall = `${valibotFn}(`;\n if (validator.startsWith(fnCall)) {\n const argsStr = validator.substring(fnCall.length, validator.length - 1);\n return argsStr ? `${base}${zodMethod}(${argsStr})` : `${base}${zodMethod}()`;\n }\n // No-arg validators: v.email() matches exactly\n if (validator === `${valibotFn}()`) {\n return `${base}${zodMethod}()`;\n }\n }\n\n // v.transform(...) → .transform(...)\n if (validator.startsWith('v.transform(')) {\n const args = validator.substring('v.transform('.length, validator.length - 1);\n return `${base}.transform(${args})`;\n }\n\n // v.check(...) → .refine(...)\n if (validator.startsWith('v.check(')) {\n const args = validator.substring('v.check('.length, validator.length - 1);\n return `${base}.refine(${args})`;\n }\n\n // v.brand(...) → .brand(...)\n if (validator.startsWith('v.brand(')) {\n const args = validator.substring('v.brand('.length, validator.length - 1);\n return `${base}.brand(${args})`;\n }\n\n // Unknown validator — add TODO\n this.warnings.push(`Unknown Valibot pipe validator: ${validator} — kept as-is`);\n return `${base} /* TODO(schemashift): convert ${validator} */`;\n }\n\n private transformFactories(text: string): string {\n // Replace remaining v.factory() calls with z.factory()\n for (const [valibotFactory, zodFactory] of Object.entries(VALIBOT_TO_ZOD_FACTORY)) {\n const escaped = valibotFactory.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\(`, 'g');\n text = text.replace(regex, `${zodFactory}(`);\n }\n return text;\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ValibotToZodTransformer } from './valibot-to-zod-transformer.js';\n\nexport function createValibotToZodHandler(): TransformHandler {\n const transformer = new ValibotToZodTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n"],"mappings":"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","names":["result","import_ts_morph"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -61,6 +61,8 @@ declare function createValibotToZodHandler(): TransformHandler;
|
|
|
61
61
|
* Valibot → Zod transformer.
|
|
62
62
|
*
|
|
63
63
|
* Converts Valibot's pipe-based API back to Zod's fluent method chain API.
|
|
64
|
+
* Uses AST-based import handling for safety, with text-based pipe expression
|
|
65
|
+
* transformation for the complex pipe-to-chain conversions.
|
|
64
66
|
*
|
|
65
67
|
* Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))
|
|
66
68
|
* Zod: z.string().email().min(5).max(100)
|
|
@@ -74,8 +76,23 @@ declare function createValibotToZodHandler(): TransformHandler;
|
|
|
74
76
|
declare class ValibotToZodTransformer {
|
|
75
77
|
private errors;
|
|
76
78
|
private warnings;
|
|
79
|
+
private stringLiteralRanges;
|
|
80
|
+
private commentRanges;
|
|
77
81
|
transform(sourceFile: SourceFile): TransformResult;
|
|
78
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Collect string literal and comment ranges from the AST
|
|
84
|
+
* so text-based transforms can avoid modifying them.
|
|
85
|
+
*/
|
|
86
|
+
private collectProtectedRanges;
|
|
87
|
+
/**
|
|
88
|
+
* Check if a position is inside a protected range (string literal or comment).
|
|
89
|
+
*/
|
|
90
|
+
private isProtected;
|
|
91
|
+
/**
|
|
92
|
+
* AST-based import transformation.
|
|
93
|
+
* Replaces valibot imports with zod imports using the AST.
|
|
94
|
+
*/
|
|
95
|
+
private transformImportsAST;
|
|
79
96
|
private transformTypeHelpers;
|
|
80
97
|
/**
|
|
81
98
|
* Transform Valibot wrapper functions to Zod method chains.
|
|
@@ -89,14 +106,16 @@ declare class ValibotToZodTransformer {
|
|
|
89
106
|
private transformWrappers;
|
|
90
107
|
/**
|
|
91
108
|
* Replace wrapper calls using balanced parenthesis matching.
|
|
109
|
+
* Skips matches inside string literals and comments.
|
|
92
110
|
*/
|
|
93
111
|
private replaceWrapperCall;
|
|
94
112
|
/**
|
|
95
113
|
* Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
|
|
114
|
+
* Skips matches inside string literals and comments.
|
|
96
115
|
*/
|
|
97
116
|
private transformPipeExpressions;
|
|
98
117
|
/**
|
|
99
|
-
* Split arguments at top-level commas (not inside nested parens).
|
|
118
|
+
* Split arguments at top-level commas (not inside nested parens/brackets/braces).
|
|
100
119
|
*/
|
|
101
120
|
private splitTopLevelArgs;
|
|
102
121
|
private convertPipeValidator;
|
package/dist/index.d.ts
CHANGED
|
@@ -61,6 +61,8 @@ declare function createValibotToZodHandler(): TransformHandler;
|
|
|
61
61
|
* Valibot → Zod transformer.
|
|
62
62
|
*
|
|
63
63
|
* Converts Valibot's pipe-based API back to Zod's fluent method chain API.
|
|
64
|
+
* Uses AST-based import handling for safety, with text-based pipe expression
|
|
65
|
+
* transformation for the complex pipe-to-chain conversions.
|
|
64
66
|
*
|
|
65
67
|
* Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))
|
|
66
68
|
* Zod: z.string().email().min(5).max(100)
|
|
@@ -74,8 +76,23 @@ declare function createValibotToZodHandler(): TransformHandler;
|
|
|
74
76
|
declare class ValibotToZodTransformer {
|
|
75
77
|
private errors;
|
|
76
78
|
private warnings;
|
|
79
|
+
private stringLiteralRanges;
|
|
80
|
+
private commentRanges;
|
|
77
81
|
transform(sourceFile: SourceFile): TransformResult;
|
|
78
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Collect string literal and comment ranges from the AST
|
|
84
|
+
* so text-based transforms can avoid modifying them.
|
|
85
|
+
*/
|
|
86
|
+
private collectProtectedRanges;
|
|
87
|
+
/**
|
|
88
|
+
* Check if a position is inside a protected range (string literal or comment).
|
|
89
|
+
*/
|
|
90
|
+
private isProtected;
|
|
91
|
+
/**
|
|
92
|
+
* AST-based import transformation.
|
|
93
|
+
* Replaces valibot imports with zod imports using the AST.
|
|
94
|
+
*/
|
|
95
|
+
private transformImportsAST;
|
|
79
96
|
private transformTypeHelpers;
|
|
80
97
|
/**
|
|
81
98
|
* Transform Valibot wrapper functions to Zod method chains.
|
|
@@ -89,14 +106,16 @@ declare class ValibotToZodTransformer {
|
|
|
89
106
|
private transformWrappers;
|
|
90
107
|
/**
|
|
91
108
|
* Replace wrapper calls using balanced parenthesis matching.
|
|
109
|
+
* Skips matches inside string literals and comments.
|
|
92
110
|
*/
|
|
93
111
|
private replaceWrapperCall;
|
|
94
112
|
/**
|
|
95
113
|
* Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
|
|
114
|
+
* Skips matches inside string literals and comments.
|
|
96
115
|
*/
|
|
97
116
|
private transformPipeExpressions;
|
|
98
117
|
/**
|
|
99
|
-
* Split arguments at top-level commas (not inside nested parens).
|
|
118
|
+
* Split arguments at top-level commas (not inside nested parens/brackets/braces).
|
|
100
119
|
*/
|
|
101
120
|
private splitTopLevelArgs;
|
|
102
121
|
private convertPipeValidator;
|
package/dist/index.js
CHANGED
|
@@ -445,6 +445,7 @@ function createZodToValibotHandler() {
|
|
|
445
445
|
}
|
|
446
446
|
|
|
447
447
|
// src/valibot-to-zod-transformer.ts
|
|
448
|
+
import { SyntaxKind } from "ts-morph";
|
|
448
449
|
var VALIBOT_TO_ZOD_FACTORY = {
|
|
449
450
|
"v.string": "z.string",
|
|
450
451
|
"v.number": "z.number",
|
|
@@ -505,14 +506,19 @@ var PIPE_TO_CHAIN = {
|
|
|
505
506
|
var ValibotToZodTransformer = class {
|
|
506
507
|
errors = [];
|
|
507
508
|
warnings = [];
|
|
509
|
+
stringLiteralRanges = [];
|
|
510
|
+
commentRanges = [];
|
|
508
511
|
transform(sourceFile) {
|
|
509
512
|
this.errors = [];
|
|
510
513
|
this.warnings = [];
|
|
514
|
+
this.stringLiteralRanges = [];
|
|
515
|
+
this.commentRanges = [];
|
|
511
516
|
const filePath = sourceFile.getFilePath();
|
|
512
517
|
const originalCode = sourceFile.getFullText();
|
|
513
518
|
try {
|
|
514
|
-
|
|
515
|
-
|
|
519
|
+
this.collectProtectedRanges(sourceFile);
|
|
520
|
+
this.transformImportsAST(sourceFile);
|
|
521
|
+
let text = sourceFile.getFullText();
|
|
516
522
|
text = this.transformTypeHelpers(text);
|
|
517
523
|
text = this.transformWrappers(text);
|
|
518
524
|
text = this.transformPipeExpressions(text);
|
|
@@ -539,13 +545,71 @@ var ValibotToZodTransformer = class {
|
|
|
539
545
|
};
|
|
540
546
|
}
|
|
541
547
|
}
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
548
|
+
/**
|
|
549
|
+
* Collect string literal and comment ranges from the AST
|
|
550
|
+
* so text-based transforms can avoid modifying them.
|
|
551
|
+
*/
|
|
552
|
+
collectProtectedRanges(sourceFile) {
|
|
553
|
+
this.stringLiteralRanges = [];
|
|
554
|
+
this.commentRanges = [];
|
|
555
|
+
sourceFile.forEachDescendant((node) => {
|
|
556
|
+
if (node.getKind() === SyntaxKind.StringLiteral || node.getKind() === SyntaxKind.TemplateExpression || node.getKind() === SyntaxKind.NoSubstitutionTemplateLiteral) {
|
|
557
|
+
this.stringLiteralRanges.push({
|
|
558
|
+
start: node.getStart(),
|
|
559
|
+
end: node.getEnd()
|
|
560
|
+
});
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
const text = sourceFile.getFullText();
|
|
564
|
+
const commentRegex = /\/\/[^\n]*|\/\*[\s\S]*?\*\//g;
|
|
565
|
+
for (const match of text.matchAll(commentRegex)) {
|
|
566
|
+
if (match.index !== void 0) {
|
|
567
|
+
this.commentRanges.push({
|
|
568
|
+
start: match.index,
|
|
569
|
+
end: match.index + match[0].length
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Check if a position is inside a protected range (string literal or comment).
|
|
576
|
+
*/
|
|
577
|
+
isProtected(position) {
|
|
578
|
+
for (const range of this.stringLiteralRanges) {
|
|
579
|
+
if (position >= range.start && position < range.end) return true;
|
|
580
|
+
}
|
|
581
|
+
for (const range of this.commentRanges) {
|
|
582
|
+
if (position >= range.start && position < range.end) return true;
|
|
583
|
+
}
|
|
584
|
+
return false;
|
|
585
|
+
}
|
|
586
|
+
/**
|
|
587
|
+
* AST-based import transformation.
|
|
588
|
+
* Replaces valibot imports with zod imports using the AST.
|
|
589
|
+
*/
|
|
590
|
+
transformImportsAST(sourceFile) {
|
|
591
|
+
const imports = sourceFile.getImportDeclarations();
|
|
592
|
+
const valibotImports = [];
|
|
593
|
+
for (const imp of imports) {
|
|
594
|
+
const moduleSpecifier = imp.getModuleSpecifierValue();
|
|
595
|
+
if (moduleSpecifier === "valibot") {
|
|
596
|
+
valibotImports.push(imp);
|
|
597
|
+
}
|
|
598
|
+
}
|
|
599
|
+
for (const imp of valibotImports) {
|
|
600
|
+
imp.setModuleSpecifier("zod");
|
|
601
|
+
const namespaceImport = imp.getNamespaceImport();
|
|
602
|
+
if (namespaceImport) {
|
|
603
|
+
imp.removeNamespaceImport();
|
|
604
|
+
imp.addNamedImport("z");
|
|
605
|
+
} else {
|
|
606
|
+
const namedImports = imp.getNamedImports();
|
|
607
|
+
for (const named of namedImports) {
|
|
608
|
+
named.remove();
|
|
609
|
+
}
|
|
610
|
+
imp.addNamedImport("z");
|
|
611
|
+
}
|
|
612
|
+
}
|
|
549
613
|
}
|
|
550
614
|
transformTypeHelpers(text) {
|
|
551
615
|
text = text.replace(/\bv\.InferOutput</g, "z.infer<");
|
|
@@ -601,13 +665,16 @@ var ValibotToZodTransformer = class {
|
|
|
601
665
|
}
|
|
602
666
|
/**
|
|
603
667
|
* Replace wrapper calls using balanced parenthesis matching.
|
|
668
|
+
* Skips matches inside string literals and comments.
|
|
604
669
|
*/
|
|
605
670
|
replaceWrapperCall(text, prefix, replacer) {
|
|
606
671
|
const pattern = new RegExp(`\\b${prefix.replace(".", "\\.")}\\(`, "g");
|
|
607
672
|
let result = text;
|
|
608
673
|
let offset = 0;
|
|
609
674
|
for (const match of text.matchAll(pattern)) {
|
|
610
|
-
const
|
|
675
|
+
const matchIdx = match.index ?? 0;
|
|
676
|
+
if (this.isProtected(matchIdx)) continue;
|
|
677
|
+
const startIdx = matchIdx + offset;
|
|
611
678
|
const openParen = startIdx + prefix.length;
|
|
612
679
|
let depth = 1;
|
|
613
680
|
let i = openParen + 1;
|
|
@@ -631,13 +698,16 @@ var ValibotToZodTransformer = class {
|
|
|
631
698
|
}
|
|
632
699
|
/**
|
|
633
700
|
* Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
|
|
701
|
+
* Skips matches inside string literals and comments.
|
|
634
702
|
*/
|
|
635
703
|
transformPipeExpressions(text) {
|
|
636
704
|
const pipePattern = /\bv\.pipe\(/g;
|
|
637
705
|
let result = text;
|
|
638
706
|
let offset = 0;
|
|
639
707
|
for (const match of text.matchAll(pipePattern)) {
|
|
640
|
-
const
|
|
708
|
+
const matchIdx = match.index ?? 0;
|
|
709
|
+
if (this.isProtected(matchIdx)) continue;
|
|
710
|
+
const startIdx = matchIdx + offset;
|
|
641
711
|
const openParen = startIdx + "v.pipe".length;
|
|
642
712
|
let depth = 1;
|
|
643
713
|
let i = openParen + 1;
|
|
@@ -664,7 +734,7 @@ var ValibotToZodTransformer = class {
|
|
|
664
734
|
return result;
|
|
665
735
|
}
|
|
666
736
|
/**
|
|
667
|
-
* Split arguments at top-level commas (not inside nested parens).
|
|
737
|
+
* Split arguments at top-level commas (not inside nested parens/brackets/braces).
|
|
668
738
|
*/
|
|
669
739
|
splitTopLevelArgs(text) {
|
|
670
740
|
const args = [];
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transformer.ts","../src/mappings.ts","../src/handler.ts","../src/valibot-to-zod-transformer.ts","../src/valibot-to-zod-handler.ts"],"sourcesContent":["import {\n isInsideStringLiteral,\n type MethodCallInfo,\n parseCallChain,\n type TransformError,\n type TransformResult,\n} from '@schemashift/core';\nimport { type CallExpression, Node, type SourceFile } from 'ts-morph';\nimport {\n FACTORY_MAPPINGS,\n MODIFIER_METHODS,\n NUMBER_VALIDATION_MAPPINGS,\n OBJECT_METHODS,\n VALIDATION_MAPPINGS,\n} from './mappings.js';\n\n/**\n * Zod to Valibot transformer.\n *\n * Converts Zod's fluent method chain API to Valibot's pipe-based API.\n *\n * Zod: z.string().email().min(5).max(100)\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n *\n * Zod: z.string().optional()\n * Valibot: v.optional(v.string())\n *\n * Zod: z.object({ name: z.string() }).partial()\n * Valibot: v.partial(v.object({ name: v.string() }))\n */\nexport class ZodToValibotTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n this.updateImports(sourceFile);\n this.transformTypeHelpers(sourceFile);\n this.transformSchemaExpressions(sourceFile);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n private updateImports(sourceFile: SourceFile): void {\n const zodImports = sourceFile\n .getImportDeclarations()\n .filter((imp) => imp.getModuleSpecifierValue() === 'zod');\n\n for (const imp of zodImports) {\n imp.setModuleSpecifier('valibot');\n\n const namespaceImport = imp.getNamespaceImport();\n const defaultImport = imp.getDefaultImport();\n const namedImports = imp.getNamedImports();\n\n if (namespaceImport) imp.removeNamespaceImport();\n if (defaultImport) imp.removeDefaultImport();\n if (namedImports.length > 0) imp.removeNamedImports();\n\n imp.setNamespaceImport('v');\n }\n }\n\n private transformTypeHelpers(sourceFile: SourceFile): void {\n const fullText = sourceFile.getFullText();\n let newText = fullText;\n newText = newText.replace(/\\bz\\.infer</g, 'v.InferOutput<');\n newText = newText.replace(/\\bz\\.input</g, 'v.InferInput<');\n newText = newText.replace(/\\bz\\.output</g, 'v.InferOutput<');\n if (newText !== fullText) {\n sourceFile.replaceWithText(newText);\n }\n }\n\n private transformSchemaExpressions(sourceFile: SourceFile): void {\n const nodesToTransform: CallExpression[] = [];\n\n sourceFile.forEachDescendant((node) => {\n if (Node.isCallExpression(node)) {\n if (isInsideStringLiteral(node)) return;\n\n const text = node.getText();\n if (text.startsWith('z.')) {\n nodesToTransform.push(node);\n }\n }\n });\n\n const outermost = this.filterOutermostNodes(nodesToTransform);\n outermost.sort((a, b) => b.getStart() - a.getStart());\n\n for (const node of outermost) {\n this.transformCallChain(node);\n }\n }\n\n private filterOutermostNodes(nodes: CallExpression[]): CallExpression[] {\n const result: CallExpression[] = [];\n for (const node of nodes) {\n let isChild = false;\n for (const other of nodes) {\n if (other === node) continue;\n if (other.getStart() <= node.getStart() && other.getEnd() >= node.getEnd()) {\n isChild = true;\n break;\n }\n }\n if (!isChild) result.push(node);\n }\n return result;\n }\n\n private transformCallChain(node: CallExpression): void {\n const chain = parseCallChain(node);\n\n if (!chain) {\n this.transformCallChainFallback(node);\n return;\n }\n\n if (chain.base !== 'z') return;\n\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Map the factory method\n const factoryMapping = FACTORY_MAPPINGS[chain.factoryMethod];\n if (!factoryMapping) {\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod factory z.${chain.factoryMethod}() — kept as-is`,\n );\n return;\n }\n\n // Determine the factory context for contextual mappings (string vs number vs array)\n const factoryType = chain.factoryMethod;\n\n // Categorize methods\n const pipeValidators: string[] = [];\n const modifiers: Array<{ name: string; args: string[] }> = [];\n const objectMethods: Array<{ name: string; args: string[] }> = [];\n\n for (const method of chain.methods) {\n const result = this.categorizeMethod(method, factoryType, filePath, lineNumber);\n if (result.type === 'pipe') {\n pipeValidators.push(result.code);\n } else if (result.type === 'modifier') {\n modifiers.push({ name: result.name, args: result.args });\n } else if (result.type === 'object') {\n objectMethods.push({ name: result.name, args: result.args });\n }\n // 'skip' type means the method is removed\n }\n\n // Build the Valibot expression\n let result: string;\n\n // Start with the factory call\n const factoryCall = `${factoryMapping}(${chain.factoryArgs.join(', ')})`;\n\n // If there are pipe validators, wrap in v.pipe()\n if (pipeValidators.length > 0) {\n result = `v.pipe(${factoryCall}, ${pipeValidators.join(', ')})`;\n } else {\n result = factoryCall;\n }\n\n // Apply object methods (wrapping)\n for (const objMethod of objectMethods) {\n result = this.applyObjectMethod(objMethod.name, objMethod.args, result, filePath, lineNumber);\n }\n\n // Apply modifiers (wrapping from inside out)\n for (const modifier of modifiers) {\n result = this.applyModifier(modifier.name, modifier.args, result, filePath, lineNumber);\n }\n\n // Post-process: transform any remaining nested z. references in the result\n result = this.transformNestedZodReferences(result);\n\n node.replaceWithText(result);\n }\n\n private transformNestedZodReferences(text: string): string {\n // Replace z.factoryName( with v.factoryName( for all known factories\n let result = text;\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bz\\\\.${zodName}\\\\(`, 'g');\n result = result.replace(regex, `${valibotName}(`);\n }\n return result;\n }\n\n private categorizeMethod(\n method: MethodCallInfo,\n factoryType: string,\n filePath: string,\n lineNumber: number,\n ):\n | { type: 'pipe'; code: string }\n | { type: 'modifier'; name: string; args: string[] }\n | { type: 'object'; name: string; args: string[] }\n | { type: 'skip' } {\n const { name, args } = method;\n\n // Check if it's a modifier (wrapping)\n if (MODIFIER_METHODS.has(name)) {\n return { type: 'modifier', name, args };\n }\n\n // Check if it's an object method\n if (OBJECT_METHODS.has(name)) {\n return { type: 'object', name, args };\n }\n\n // Check number-specific validations\n if (\n (factoryType === 'number' || factoryType === 'bigint') &&\n NUMBER_VALIDATION_MAPPINGS[name]\n ) {\n const mapping = NUMBER_VALIDATION_MAPPINGS[name];\n if (!mapping) return { type: 'skip' as const };\n const mappedArgs = mapping.args(args);\n return { type: 'pipe', code: `${mapping.name}(${mappedArgs.join(', ')})` };\n }\n\n // Check string-specific min/max -> minLength/maxLength\n if (factoryType === 'string' || factoryType === 'array') {\n if (name === 'min') {\n return { type: 'pipe', code: `v.minLength(${args.join(', ')})` };\n }\n if (name === 'max') {\n return { type: 'pipe', code: `v.maxLength(${args.join(', ')})` };\n }\n }\n\n // Check general validation mappings\n const validationMapping = VALIDATION_MAPPINGS[name];\n if (validationMapping === null) {\n // Should be handled by modifier/object checks above, but just in case\n return { type: 'skip' };\n }\n if (validationMapping) {\n return { type: 'pipe', code: `${validationMapping}(${args.join(', ')})` };\n }\n\n // Unknown method\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod method .${name}() — kept as-is in pipe`,\n );\n return { type: 'pipe', code: `/* TODO: .${name}(${args.join(', ')}) */` };\n }\n\n private applyModifier(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'optional':\n return `v.optional(${inner})`;\n case 'nullable':\n return `v.nullable(${inner})`;\n case 'nullish':\n return `v.nullish(${inner})`;\n case 'default':\n return `v.optional(${inner}, ${args.join(', ')})`;\n case 'catch':\n return `v.fallback(${inner}, ${args.join(', ')})`;\n case 'readonly':\n return `v.readonly(${inner})`;\n case 'transform':\n return `v.pipe(${inner}, v.transform(${args.join(', ')}))`;\n case 'refine':\n if (args.length >= 2) {\n return `v.pipe(${inner}, v.check(${args[0]}, ${args.slice(1).join(', ')}))`;\n }\n return `v.pipe(${inner}, v.check(${args.join(', ')}))`;\n case 'superRefine':\n this.warnings.push(\n `${filePath}:${lineNumber}: .superRefine() requires manual conversion to Valibot custom validation`,\n );\n return `v.pipe(${inner}, /* TODO: superRefine -> custom validation */ v.check(${args.join(', ')}))`;\n case 'brand':\n return `v.pipe(${inner}, v.brand(${args.join(', ')}))`;\n case 'describe':\n // Valibot doesn't have describe, skip it\n return inner;\n case 'pipe':\n return `v.pipe(${inner}, ${args.join(', ')})`;\n default:\n return inner;\n }\n }\n\n private applyObjectMethod(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'partial':\n return `v.partial(${inner})`;\n case 'required':\n return `v.required(${inner})`;\n case 'pick':\n return `v.pick(${inner}, ${args.join(', ')})`;\n case 'omit':\n return `v.omit(${inner}, ${args.join(', ')})`;\n case 'extend':\n case 'merge':\n return `v.merge([${inner}, ${args.join(', ')}])`;\n case 'passthrough':\n this.warnings.push(\n `${filePath}:${lineNumber}: .passthrough() — Valibot objects are loose by default, no action needed`,\n );\n return inner;\n case 'strict':\n return `v.strict(${inner})`;\n case 'strip':\n return inner; // Valibot strips unknown by default when using v.object\n case 'catchall':\n this.warnings.push(\n `${filePath}:${lineNumber}: .catchall() requires manual conversion to Valibot record or custom validation`,\n );\n return inner;\n case 'keyof':\n this.warnings.push(\n `${filePath}:${lineNumber}: .keyof() requires manual conversion to v.picklist(Object.keys(...))`,\n );\n return inner;\n default:\n return inner;\n }\n }\n\n private transformCallChainFallback(node: CallExpression): void {\n const text = node.getText();\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Simple regex-based fallback for chains we can't parse\n let transformed = text;\n\n // Replace z. with v.\n transformed = transformed.replace(/^z\\./, 'v.');\n\n // Basic type mappings\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bv\\\\.${zodName}\\\\(`, 'g');\n transformed = transformed.replace(regex, `${valibotName}(`);\n }\n\n this.warnings.push(\n `${filePath}:${lineNumber}: Complex Zod expression used fallback conversion — manual review recommended`,\n );\n\n node.replaceWithText(transformed);\n }\n}\n","/**\n * Zod -> Valibot method name mappings.\n *\n * Valibot uses a pipe-based API: v.pipe(v.string(), v.email(), v.minLength(5))\n * instead of Zod's fluent chain: z.string().email().min(5)\n *\n * Factory methods map directly. Validation methods become pipe arguments.\n */\n\n/** Zod factory -> Valibot factory */\nexport const FACTORY_MAPPINGS: Record<string, string> = {\n string: 'v.string',\n number: 'v.number',\n boolean: 'v.boolean',\n date: 'v.date',\n bigint: 'v.bigint',\n symbol: 'v.symbol',\n undefined: 'v.undefined_',\n null: 'v.null_',\n void: 'v.void_',\n any: 'v.any',\n unknown: 'v.unknown',\n never: 'v.never',\n nan: 'v.nan',\n literal: 'v.literal',\n enum: 'v.picklist',\n nativeEnum: 'v.enum_',\n array: 'v.array',\n object: 'v.object',\n record: 'v.record',\n tuple: 'v.tuple',\n union: 'v.union',\n discriminatedUnion: 'v.variant',\n intersection: 'v.intersect',\n lazy: 'v.lazy',\n promise: 'v.promise',\n instanceof: 'v.instance',\n};\n\n/** Zod chain methods -> Valibot pipe validators */\nexport const VALIDATION_MAPPINGS: Record<string, string | null> = {\n // String validations\n email: 'v.email',\n url: 'v.url',\n uuid: 'v.uuid',\n cuid: 'v.cuid2',\n cuid2: 'v.cuid2',\n ulid: 'v.ulid',\n regex: 'v.regex',\n ip: 'v.ip',\n datetime: 'v.isoDateTime',\n date: 'v.isoDate',\n time: 'v.isoTime',\n emoji: 'v.emoji',\n includes: 'v.includes',\n startsWith: 'v.startsWith',\n endsWith: 'v.endsWith',\n trim: 'v.trim',\n toLowerCase: 'v.toLowerCase',\n toUpperCase: 'v.toUpperCase',\n\n // Shared validations (string/number/array/date)\n min: 'v.minLength', // Will be context-sensitive\n max: 'v.maxLength', // Will be context-sensitive\n length: 'v.length',\n\n // Number validations\n gt: 'v.minValue',\n gte: 'v.minValue',\n lt: 'v.maxValue',\n lte: 'v.maxValue',\n int: 'v.integer',\n positive: 'v.minValue',\n negative: 'v.maxValue',\n nonnegative: 'v.minValue',\n nonpositive: 'v.maxValue',\n multipleOf: 'v.multipleOf',\n finite: 'v.finite',\n safe: 'v.safeInteger',\n\n // Array validations\n nonempty: 'v.nonEmpty',\n\n // Schema modifiers (not pipe validators)\n optional: null, // Handled specially\n nullable: null, // Handled specially\n nullish: null, // Handled specially\n default: null, // Handled specially\n catch: null, // Handled specially\n transform: null, // Handled specially\n refine: null, // Handled specially\n superRefine: null, // Handled specially\n brand: null, // Handled specially\n readonly: null, // Handled specially\n pipe: null, // Handled specially\n describe: null, // Handled specially\n\n // Object methods\n partial: null, // Handled specially\n required: null, // Handled specially\n pick: null, // Handled specially\n omit: null, // Handled specially\n extend: null, // Handled specially\n merge: null, // Handled specially\n passthrough: null, // Handled specially\n strict: null, // Handled specially\n strip: null, // Handled specially\n catchall: null, // Handled specially\n keyof: null, // Handled specially\n\n // Array methods\n element: null, // Part of factory\n};\n\n/** Zod number methods that need specific arg mapping to Valibot */\nexport const NUMBER_VALIDATION_MAPPINGS: Record<\n string,\n { name: string; args: (args: string[]) => string[] }\n> = {\n min: { name: 'v.minValue', args: (a) => a },\n max: { name: 'v.maxValue', args: (a) => a },\n gt: { name: 'v.minValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) + 1)] : a) },\n lt: { name: 'v.maxValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) - 1)] : a) },\n gte: { name: 'v.minValue', args: (a) => a },\n lte: { name: 'v.maxValue', args: (a) => a },\n positive: { name: 'v.minValue', args: () => ['1'] },\n negative: { name: 'v.maxValue', args: () => ['-1'] },\n nonnegative: { name: 'v.minValue', args: () => ['0'] },\n nonpositive: { name: 'v.maxValue', args: () => ['0'] },\n};\n\n/** Methods that wrap schemas (modifiers) */\nexport const MODIFIER_METHODS = new Set([\n 'optional',\n 'nullable',\n 'nullish',\n 'default',\n 'catch',\n 'readonly',\n 'brand',\n 'describe',\n 'transform',\n 'refine',\n 'superRefine',\n 'pipe',\n]);\n\n/** Object-specific methods */\nexport const OBJECT_METHODS = new Set([\n 'partial',\n 'required',\n 'pick',\n 'omit',\n 'extend',\n 'merge',\n 'passthrough',\n 'strict',\n 'strip',\n 'catchall',\n 'keyof',\n]);\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ZodToValibotTransformer } from './transformer.js';\n\nexport function createZodToValibotHandler(): TransformHandler {\n const transformer = new ZodToValibotTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\n\n/**\n * Reverse Valibot → Zod factory mappings.\n * Inverted from FACTORY_MAPPINGS in mappings.ts.\n */\nconst VALIBOT_TO_ZOD_FACTORY: Record<string, string> = {\n 'v.string': 'z.string',\n 'v.number': 'z.number',\n 'v.boolean': 'z.boolean',\n 'v.date': 'z.date',\n 'v.bigint': 'z.bigint',\n 'v.symbol': 'z.symbol',\n 'v.undefined_': 'z.undefined',\n 'v.null_': 'z.null',\n 'v.void_': 'z.void',\n 'v.any': 'z.any',\n 'v.unknown': 'z.unknown',\n 'v.never': 'z.never',\n 'v.nan': 'z.nan',\n 'v.literal': 'z.literal',\n 'v.picklist': 'z.enum',\n 'v.enum_': 'z.nativeEnum',\n 'v.array': 'z.array',\n 'v.object': 'z.object',\n 'v.record': 'z.record',\n 'v.tuple': 'z.tuple',\n 'v.union': 'z.union',\n 'v.variant': 'z.discriminatedUnion',\n 'v.intersect': 'z.intersection',\n 'v.lazy': 'z.lazy',\n 'v.promise': 'z.promise',\n 'v.instance': 'z.instanceof',\n};\n\n/**\n * Valibot pipe validator → Zod chain method mappings.\n */\nconst PIPE_TO_CHAIN: Record<string, string> = {\n 'v.email': '.email',\n 'v.url': '.url',\n 'v.uuid': '.uuid',\n 'v.cuid2': '.cuid2',\n 'v.ulid': '.ulid',\n 'v.regex': '.regex',\n 'v.ip': '.ip',\n 'v.isoDateTime': '.datetime',\n 'v.isoDate': '.date',\n 'v.isoTime': '.time',\n 'v.emoji': '.emoji',\n 'v.includes': '.includes',\n 'v.startsWith': '.startsWith',\n 'v.endsWith': '.endsWith',\n 'v.trim': '.trim',\n 'v.toLowerCase': '.toLowerCase',\n 'v.toUpperCase': '.toUpperCase',\n 'v.minLength': '.min',\n 'v.maxLength': '.max',\n 'v.length': '.length',\n 'v.minValue': '.min',\n 'v.maxValue': '.max',\n 'v.integer': '.int',\n 'v.finite': '.finite',\n 'v.safeInteger': '.safe',\n 'v.multipleOf': '.multipleOf',\n 'v.nonEmpty': '.nonempty',\n};\n\n/**\n * Valibot → Zod transformer.\n *\n * Converts Valibot's pipe-based API back to Zod's fluent method chain API.\n *\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n * Zod: z.string().email().min(5).max(100)\n *\n * Valibot: v.optional(v.string())\n * Zod: z.string().optional()\n *\n * Valibot: v.partial(v.object({ name: v.string() }))\n * Zod: z.object({ name: z.string() }).partial()\n */\nexport class ValibotToZodTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n // Text-based transformation (more robust for pipe-based API)\n let text = originalCode;\n\n text = this.transformImports(text);\n text = this.transformTypeHelpers(text);\n text = this.transformWrappers(text);\n text = this.transformPipeExpressions(text);\n text = this.transformFactories(text);\n\n sourceFile.replaceWithText(text);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n private transformImports(text: string): string {\n // Replace valibot imports with zod\n text = text.replace(\n /import\\s+\\*\\s+as\\s+v\\s+from\\s+['\"]valibot['\"]/g,\n \"import { z } from 'zod'\",\n );\n text = text.replace(/import\\s+\\{[^}]*\\}\\s+from\\s+['\"]valibot['\"]/g, \"import { z } from 'zod'\");\n return text;\n }\n\n private transformTypeHelpers(text: string): string {\n text = text.replace(/\\bv\\.InferOutput</g, 'z.infer<');\n text = text.replace(/\\bv\\.InferInput</g, 'z.input<');\n return text;\n }\n\n /**\n * Transform Valibot wrapper functions to Zod method chains.\n * v.optional(schema) → schema.optional()\n * v.nullable(schema) → schema.nullable()\n * v.nullish(schema) → schema.nullish()\n * v.readonly(schema) → schema.readonly()\n * v.partial(schema) → schema.partial()\n * v.required(schema) → schema.required()\n */\n private transformWrappers(text: string): string {\n // Two-arg wrappers first (more specific)\n const twoArgWrappers = [\n {\n prefix: 'v.optional',\n transform: (schema: string, value: string) => `${schema}.default(${value})`,\n },\n {\n prefix: 'v.fallback',\n transform: (schema: string, value: string) => `${schema}.catch(${value})`,\n },\n ];\n\n // Single-arg wrappers\n const singleArgWrappers = [\n { prefix: 'v.optional', suffix: '.optional()' },\n { prefix: 'v.nullable', suffix: '.nullable()' },\n { prefix: 'v.nullish', suffix: '.nullish()' },\n { prefix: 'v.readonly', suffix: '.readonly()' },\n { prefix: 'v.partial', suffix: '.partial()' },\n { prefix: 'v.required', suffix: '.required()' },\n { prefix: 'v.strict', suffix: '.strict()' },\n ];\n\n // Process two-arg wrappers first\n for (const { prefix, transform } of twoArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length >= 2) {\n return transform(args[0] ?? '', args[1] ?? '');\n }\n return null; // Not a two-arg call, skip\n });\n }\n\n // Process single-arg wrappers\n for (const { prefix, suffix } of singleArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length === 1) {\n return `${args[0] ?? ''}${suffix}`;\n }\n return null;\n });\n }\n\n return text;\n }\n\n /**\n * Replace wrapper calls using balanced parenthesis matching.\n */\n private replaceWrapperCall(\n text: string,\n prefix: string,\n replacer: (args: string[]) => string | null,\n ): string {\n const pattern = new RegExp(`\\\\b${prefix.replace('.', '\\\\.')}\\\\(`, 'g');\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pattern)) {\n const startIdx = (match.index ?? 0) + offset;\n const openParen = startIdx + prefix.length;\n\n // Find matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n const replacement = replacer(args);\n if (replacement === null) continue;\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + replacement + after;\n offset += replacement.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()\n */\n private transformPipeExpressions(text: string): string {\n // Match v.pipe(...) — use a simple approach for balanced parens\n const pipePattern = /\\bv\\.pipe\\(/g;\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pipePattern)) {\n const startIdx = (match.index ?? 0) + offset;\n const openParen = startIdx + 'v.pipe'.length;\n\n // Find the matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n if (args.length === 0) continue;\n\n // First arg is the factory, rest are pipe validators\n let zodExpr = args[0] ?? '';\n for (let j = 1; j < args.length; j++) {\n const validator = (args[j] ?? '').trim();\n zodExpr = this.convertPipeValidator(zodExpr, validator);\n }\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + zodExpr + after;\n offset += zodExpr.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Split arguments at top-level commas (not inside nested parens).\n */\n private splitTopLevelArgs(text: string): string[] {\n const args: string[] = [];\n let depth = 0;\n let current = '';\n\n for (const char of text) {\n if (char === '(' || char === '[' || char === '{') depth++;\n else if (char === ')' || char === ']' || char === '}') depth--;\n\n if (char === ',' && depth === 0) {\n args.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n args.push(current.trim());\n }\n\n return args;\n }\n\n private convertPipeValidator(base: string, validator: string): string {\n // Try known pipe-to-chain mappings\n for (const [valibotFn, zodMethod] of Object.entries(PIPE_TO_CHAIN)) {\n const fnCall = `${valibotFn}(`;\n if (validator.startsWith(fnCall)) {\n const argsStr = validator.substring(fnCall.length, validator.length - 1);\n return argsStr ? `${base}${zodMethod}(${argsStr})` : `${base}${zodMethod}()`;\n }\n // No-arg validators: v.email() matches exactly\n if (validator === `${valibotFn}()`) {\n return `${base}${zodMethod}()`;\n }\n }\n\n // v.transform(...) → .transform(...)\n if (validator.startsWith('v.transform(')) {\n const args = validator.substring('v.transform('.length, validator.length - 1);\n return `${base}.transform(${args})`;\n }\n\n // v.check(...) → .refine(...)\n if (validator.startsWith('v.check(')) {\n const args = validator.substring('v.check('.length, validator.length - 1);\n return `${base}.refine(${args})`;\n }\n\n // v.brand(...) → .brand(...)\n if (validator.startsWith('v.brand(')) {\n const args = validator.substring('v.brand('.length, validator.length - 1);\n return `${base}.brand(${args})`;\n }\n\n // Unknown validator — add TODO\n this.warnings.push(`Unknown Valibot pipe validator: ${validator} — kept as-is`);\n return `${base} /* TODO(schemashift): convert ${validator} */`;\n }\n\n private transformFactories(text: string): string {\n // Replace remaining v.factory() calls with z.factory()\n for (const [valibotFactory, zodFactory] of Object.entries(VALIBOT_TO_ZOD_FACTORY)) {\n const escaped = valibotFactory.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\(`, 'g');\n text = text.replace(regex, `${zodFactory}(`);\n }\n return text;\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ValibotToZodTransformer } from './valibot-to-zod-transformer.js';\n\nexport function createValibotToZodHandler(): TransformHandler {\n const transformer = new ValibotToZodTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n"],"mappings":"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","names":["result"]}
|
|
1
|
+
{"version":3,"sources":["../src/transformer.ts","../src/mappings.ts","../src/handler.ts","../src/valibot-to-zod-transformer.ts","../src/valibot-to-zod-handler.ts"],"sourcesContent":["import {\n isInsideStringLiteral,\n type MethodCallInfo,\n parseCallChain,\n type TransformError,\n type TransformResult,\n} from '@schemashift/core';\nimport { type CallExpression, Node, type SourceFile } from 'ts-morph';\nimport {\n FACTORY_MAPPINGS,\n MODIFIER_METHODS,\n NUMBER_VALIDATION_MAPPINGS,\n OBJECT_METHODS,\n VALIDATION_MAPPINGS,\n} from './mappings.js';\n\n/**\n * Zod to Valibot transformer.\n *\n * Converts Zod's fluent method chain API to Valibot's pipe-based API.\n *\n * Zod: z.string().email().min(5).max(100)\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n *\n * Zod: z.string().optional()\n * Valibot: v.optional(v.string())\n *\n * Zod: z.object({ name: z.string() }).partial()\n * Valibot: v.partial(v.object({ name: v.string() }))\n */\nexport class ZodToValibotTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n this.updateImports(sourceFile);\n this.transformTypeHelpers(sourceFile);\n this.transformSchemaExpressions(sourceFile);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n private updateImports(sourceFile: SourceFile): void {\n const zodImports = sourceFile\n .getImportDeclarations()\n .filter((imp) => imp.getModuleSpecifierValue() === 'zod');\n\n for (const imp of zodImports) {\n imp.setModuleSpecifier('valibot');\n\n const namespaceImport = imp.getNamespaceImport();\n const defaultImport = imp.getDefaultImport();\n const namedImports = imp.getNamedImports();\n\n if (namespaceImport) imp.removeNamespaceImport();\n if (defaultImport) imp.removeDefaultImport();\n if (namedImports.length > 0) imp.removeNamedImports();\n\n imp.setNamespaceImport('v');\n }\n }\n\n private transformTypeHelpers(sourceFile: SourceFile): void {\n const fullText = sourceFile.getFullText();\n let newText = fullText;\n newText = newText.replace(/\\bz\\.infer</g, 'v.InferOutput<');\n newText = newText.replace(/\\bz\\.input</g, 'v.InferInput<');\n newText = newText.replace(/\\bz\\.output</g, 'v.InferOutput<');\n if (newText !== fullText) {\n sourceFile.replaceWithText(newText);\n }\n }\n\n private transformSchemaExpressions(sourceFile: SourceFile): void {\n const nodesToTransform: CallExpression[] = [];\n\n sourceFile.forEachDescendant((node) => {\n if (Node.isCallExpression(node)) {\n if (isInsideStringLiteral(node)) return;\n\n const text = node.getText();\n if (text.startsWith('z.')) {\n nodesToTransform.push(node);\n }\n }\n });\n\n const outermost = this.filterOutermostNodes(nodesToTransform);\n outermost.sort((a, b) => b.getStart() - a.getStart());\n\n for (const node of outermost) {\n this.transformCallChain(node);\n }\n }\n\n private filterOutermostNodes(nodes: CallExpression[]): CallExpression[] {\n const result: CallExpression[] = [];\n for (const node of nodes) {\n let isChild = false;\n for (const other of nodes) {\n if (other === node) continue;\n if (other.getStart() <= node.getStart() && other.getEnd() >= node.getEnd()) {\n isChild = true;\n break;\n }\n }\n if (!isChild) result.push(node);\n }\n return result;\n }\n\n private transformCallChain(node: CallExpression): void {\n const chain = parseCallChain(node);\n\n if (!chain) {\n this.transformCallChainFallback(node);\n return;\n }\n\n if (chain.base !== 'z') return;\n\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Map the factory method\n const factoryMapping = FACTORY_MAPPINGS[chain.factoryMethod];\n if (!factoryMapping) {\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod factory z.${chain.factoryMethod}() — kept as-is`,\n );\n return;\n }\n\n // Determine the factory context for contextual mappings (string vs number vs array)\n const factoryType = chain.factoryMethod;\n\n // Categorize methods\n const pipeValidators: string[] = [];\n const modifiers: Array<{ name: string; args: string[] }> = [];\n const objectMethods: Array<{ name: string; args: string[] }> = [];\n\n for (const method of chain.methods) {\n const result = this.categorizeMethod(method, factoryType, filePath, lineNumber);\n if (result.type === 'pipe') {\n pipeValidators.push(result.code);\n } else if (result.type === 'modifier') {\n modifiers.push({ name: result.name, args: result.args });\n } else if (result.type === 'object') {\n objectMethods.push({ name: result.name, args: result.args });\n }\n // 'skip' type means the method is removed\n }\n\n // Build the Valibot expression\n let result: string;\n\n // Start with the factory call\n const factoryCall = `${factoryMapping}(${chain.factoryArgs.join(', ')})`;\n\n // If there are pipe validators, wrap in v.pipe()\n if (pipeValidators.length > 0) {\n result = `v.pipe(${factoryCall}, ${pipeValidators.join(', ')})`;\n } else {\n result = factoryCall;\n }\n\n // Apply object methods (wrapping)\n for (const objMethod of objectMethods) {\n result = this.applyObjectMethod(objMethod.name, objMethod.args, result, filePath, lineNumber);\n }\n\n // Apply modifiers (wrapping from inside out)\n for (const modifier of modifiers) {\n result = this.applyModifier(modifier.name, modifier.args, result, filePath, lineNumber);\n }\n\n // Post-process: transform any remaining nested z. references in the result\n result = this.transformNestedZodReferences(result);\n\n node.replaceWithText(result);\n }\n\n private transformNestedZodReferences(text: string): string {\n // Replace z.factoryName( with v.factoryName( for all known factories\n let result = text;\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bz\\\\.${zodName}\\\\(`, 'g');\n result = result.replace(regex, `${valibotName}(`);\n }\n return result;\n }\n\n private categorizeMethod(\n method: MethodCallInfo,\n factoryType: string,\n filePath: string,\n lineNumber: number,\n ):\n | { type: 'pipe'; code: string }\n | { type: 'modifier'; name: string; args: string[] }\n | { type: 'object'; name: string; args: string[] }\n | { type: 'skip' } {\n const { name, args } = method;\n\n // Check if it's a modifier (wrapping)\n if (MODIFIER_METHODS.has(name)) {\n return { type: 'modifier', name, args };\n }\n\n // Check if it's an object method\n if (OBJECT_METHODS.has(name)) {\n return { type: 'object', name, args };\n }\n\n // Check number-specific validations\n if (\n (factoryType === 'number' || factoryType === 'bigint') &&\n NUMBER_VALIDATION_MAPPINGS[name]\n ) {\n const mapping = NUMBER_VALIDATION_MAPPINGS[name];\n if (!mapping) return { type: 'skip' as const };\n const mappedArgs = mapping.args(args);\n return { type: 'pipe', code: `${mapping.name}(${mappedArgs.join(', ')})` };\n }\n\n // Check string-specific min/max -> minLength/maxLength\n if (factoryType === 'string' || factoryType === 'array') {\n if (name === 'min') {\n return { type: 'pipe', code: `v.minLength(${args.join(', ')})` };\n }\n if (name === 'max') {\n return { type: 'pipe', code: `v.maxLength(${args.join(', ')})` };\n }\n }\n\n // Check general validation mappings\n const validationMapping = VALIDATION_MAPPINGS[name];\n if (validationMapping === null) {\n // Should be handled by modifier/object checks above, but just in case\n return { type: 'skip' };\n }\n if (validationMapping) {\n return { type: 'pipe', code: `${validationMapping}(${args.join(', ')})` };\n }\n\n // Unknown method\n this.warnings.push(\n `${filePath}:${lineNumber}: Unknown Zod method .${name}() — kept as-is in pipe`,\n );\n return { type: 'pipe', code: `/* TODO: .${name}(${args.join(', ')}) */` };\n }\n\n private applyModifier(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'optional':\n return `v.optional(${inner})`;\n case 'nullable':\n return `v.nullable(${inner})`;\n case 'nullish':\n return `v.nullish(${inner})`;\n case 'default':\n return `v.optional(${inner}, ${args.join(', ')})`;\n case 'catch':\n return `v.fallback(${inner}, ${args.join(', ')})`;\n case 'readonly':\n return `v.readonly(${inner})`;\n case 'transform':\n return `v.pipe(${inner}, v.transform(${args.join(', ')}))`;\n case 'refine':\n if (args.length >= 2) {\n return `v.pipe(${inner}, v.check(${args[0]}, ${args.slice(1).join(', ')}))`;\n }\n return `v.pipe(${inner}, v.check(${args.join(', ')}))`;\n case 'superRefine':\n this.warnings.push(\n `${filePath}:${lineNumber}: .superRefine() requires manual conversion to Valibot custom validation`,\n );\n return `v.pipe(${inner}, /* TODO: superRefine -> custom validation */ v.check(${args.join(', ')}))`;\n case 'brand':\n return `v.pipe(${inner}, v.brand(${args.join(', ')}))`;\n case 'describe':\n // Valibot doesn't have describe, skip it\n return inner;\n case 'pipe':\n return `v.pipe(${inner}, ${args.join(', ')})`;\n default:\n return inner;\n }\n }\n\n private applyObjectMethod(\n name: string,\n args: string[],\n inner: string,\n filePath: string,\n lineNumber: number,\n ): string {\n switch (name) {\n case 'partial':\n return `v.partial(${inner})`;\n case 'required':\n return `v.required(${inner})`;\n case 'pick':\n return `v.pick(${inner}, ${args.join(', ')})`;\n case 'omit':\n return `v.omit(${inner}, ${args.join(', ')})`;\n case 'extend':\n case 'merge':\n return `v.merge([${inner}, ${args.join(', ')}])`;\n case 'passthrough':\n this.warnings.push(\n `${filePath}:${lineNumber}: .passthrough() — Valibot objects are loose by default, no action needed`,\n );\n return inner;\n case 'strict':\n return `v.strict(${inner})`;\n case 'strip':\n return inner; // Valibot strips unknown by default when using v.object\n case 'catchall':\n this.warnings.push(\n `${filePath}:${lineNumber}: .catchall() requires manual conversion to Valibot record or custom validation`,\n );\n return inner;\n case 'keyof':\n this.warnings.push(\n `${filePath}:${lineNumber}: .keyof() requires manual conversion to v.picklist(Object.keys(...))`,\n );\n return inner;\n default:\n return inner;\n }\n }\n\n private transformCallChainFallback(node: CallExpression): void {\n const text = node.getText();\n const filePath = node.getSourceFile().getFilePath();\n const lineNumber = node.getStartLineNumber();\n\n // Simple regex-based fallback for chains we can't parse\n let transformed = text;\n\n // Replace z. with v.\n transformed = transformed.replace(/^z\\./, 'v.');\n\n // Basic type mappings\n for (const [zodName, valibotName] of Object.entries(FACTORY_MAPPINGS)) {\n const regex = new RegExp(`\\\\bv\\\\.${zodName}\\\\(`, 'g');\n transformed = transformed.replace(regex, `${valibotName}(`);\n }\n\n this.warnings.push(\n `${filePath}:${lineNumber}: Complex Zod expression used fallback conversion — manual review recommended`,\n );\n\n node.replaceWithText(transformed);\n }\n}\n","/**\n * Zod -> Valibot method name mappings.\n *\n * Valibot uses a pipe-based API: v.pipe(v.string(), v.email(), v.minLength(5))\n * instead of Zod's fluent chain: z.string().email().min(5)\n *\n * Factory methods map directly. Validation methods become pipe arguments.\n */\n\n/** Zod factory -> Valibot factory */\nexport const FACTORY_MAPPINGS: Record<string, string> = {\n string: 'v.string',\n number: 'v.number',\n boolean: 'v.boolean',\n date: 'v.date',\n bigint: 'v.bigint',\n symbol: 'v.symbol',\n undefined: 'v.undefined_',\n null: 'v.null_',\n void: 'v.void_',\n any: 'v.any',\n unknown: 'v.unknown',\n never: 'v.never',\n nan: 'v.nan',\n literal: 'v.literal',\n enum: 'v.picklist',\n nativeEnum: 'v.enum_',\n array: 'v.array',\n object: 'v.object',\n record: 'v.record',\n tuple: 'v.tuple',\n union: 'v.union',\n discriminatedUnion: 'v.variant',\n intersection: 'v.intersect',\n lazy: 'v.lazy',\n promise: 'v.promise',\n instanceof: 'v.instance',\n};\n\n/** Zod chain methods -> Valibot pipe validators */\nexport const VALIDATION_MAPPINGS: Record<string, string | null> = {\n // String validations\n email: 'v.email',\n url: 'v.url',\n uuid: 'v.uuid',\n cuid: 'v.cuid2',\n cuid2: 'v.cuid2',\n ulid: 'v.ulid',\n regex: 'v.regex',\n ip: 'v.ip',\n datetime: 'v.isoDateTime',\n date: 'v.isoDate',\n time: 'v.isoTime',\n emoji: 'v.emoji',\n includes: 'v.includes',\n startsWith: 'v.startsWith',\n endsWith: 'v.endsWith',\n trim: 'v.trim',\n toLowerCase: 'v.toLowerCase',\n toUpperCase: 'v.toUpperCase',\n\n // Shared validations (string/number/array/date)\n min: 'v.minLength', // Will be context-sensitive\n max: 'v.maxLength', // Will be context-sensitive\n length: 'v.length',\n\n // Number validations\n gt: 'v.minValue',\n gte: 'v.minValue',\n lt: 'v.maxValue',\n lte: 'v.maxValue',\n int: 'v.integer',\n positive: 'v.minValue',\n negative: 'v.maxValue',\n nonnegative: 'v.minValue',\n nonpositive: 'v.maxValue',\n multipleOf: 'v.multipleOf',\n finite: 'v.finite',\n safe: 'v.safeInteger',\n\n // Array validations\n nonempty: 'v.nonEmpty',\n\n // Schema modifiers (not pipe validators)\n optional: null, // Handled specially\n nullable: null, // Handled specially\n nullish: null, // Handled specially\n default: null, // Handled specially\n catch: null, // Handled specially\n transform: null, // Handled specially\n refine: null, // Handled specially\n superRefine: null, // Handled specially\n brand: null, // Handled specially\n readonly: null, // Handled specially\n pipe: null, // Handled specially\n describe: null, // Handled specially\n\n // Object methods\n partial: null, // Handled specially\n required: null, // Handled specially\n pick: null, // Handled specially\n omit: null, // Handled specially\n extend: null, // Handled specially\n merge: null, // Handled specially\n passthrough: null, // Handled specially\n strict: null, // Handled specially\n strip: null, // Handled specially\n catchall: null, // Handled specially\n keyof: null, // Handled specially\n\n // Array methods\n element: null, // Part of factory\n};\n\n/** Zod number methods that need specific arg mapping to Valibot */\nexport const NUMBER_VALIDATION_MAPPINGS: Record<\n string,\n { name: string; args: (args: string[]) => string[] }\n> = {\n min: { name: 'v.minValue', args: (a) => a },\n max: { name: 'v.maxValue', args: (a) => a },\n gt: { name: 'v.minValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) + 1)] : a) },\n lt: { name: 'v.maxValue', args: (a) => (a.length > 0 ? [String(Number(a[0]) - 1)] : a) },\n gte: { name: 'v.minValue', args: (a) => a },\n lte: { name: 'v.maxValue', args: (a) => a },\n positive: { name: 'v.minValue', args: () => ['1'] },\n negative: { name: 'v.maxValue', args: () => ['-1'] },\n nonnegative: { name: 'v.minValue', args: () => ['0'] },\n nonpositive: { name: 'v.maxValue', args: () => ['0'] },\n};\n\n/** Methods that wrap schemas (modifiers) */\nexport const MODIFIER_METHODS = new Set([\n 'optional',\n 'nullable',\n 'nullish',\n 'default',\n 'catch',\n 'readonly',\n 'brand',\n 'describe',\n 'transform',\n 'refine',\n 'superRefine',\n 'pipe',\n]);\n\n/** Object-specific methods */\nexport const OBJECT_METHODS = new Set([\n 'partial',\n 'required',\n 'pick',\n 'omit',\n 'extend',\n 'merge',\n 'passthrough',\n 'strict',\n 'strip',\n 'catchall',\n 'keyof',\n]);\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ZodToValibotTransformer } from './transformer.js';\n\nexport function createZodToValibotHandler(): TransformHandler {\n const transformer = new ZodToValibotTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport { type ImportDeclaration, type SourceFile, SyntaxKind } from 'ts-morph';\n\n/**\n * Reverse Valibot → Zod factory mappings.\n * Inverted from FACTORY_MAPPINGS in mappings.ts.\n */\nconst VALIBOT_TO_ZOD_FACTORY: Record<string, string> = {\n 'v.string': 'z.string',\n 'v.number': 'z.number',\n 'v.boolean': 'z.boolean',\n 'v.date': 'z.date',\n 'v.bigint': 'z.bigint',\n 'v.symbol': 'z.symbol',\n 'v.undefined_': 'z.undefined',\n 'v.null_': 'z.null',\n 'v.void_': 'z.void',\n 'v.any': 'z.any',\n 'v.unknown': 'z.unknown',\n 'v.never': 'z.never',\n 'v.nan': 'z.nan',\n 'v.literal': 'z.literal',\n 'v.picklist': 'z.enum',\n 'v.enum_': 'z.nativeEnum',\n 'v.array': 'z.array',\n 'v.object': 'z.object',\n 'v.record': 'z.record',\n 'v.tuple': 'z.tuple',\n 'v.union': 'z.union',\n 'v.variant': 'z.discriminatedUnion',\n 'v.intersect': 'z.intersection',\n 'v.lazy': 'z.lazy',\n 'v.promise': 'z.promise',\n 'v.instance': 'z.instanceof',\n};\n\n/**\n * Valibot pipe validator → Zod chain method mappings.\n */\nconst PIPE_TO_CHAIN: Record<string, string> = {\n 'v.email': '.email',\n 'v.url': '.url',\n 'v.uuid': '.uuid',\n 'v.cuid2': '.cuid2',\n 'v.ulid': '.ulid',\n 'v.regex': '.regex',\n 'v.ip': '.ip',\n 'v.isoDateTime': '.datetime',\n 'v.isoDate': '.date',\n 'v.isoTime': '.time',\n 'v.emoji': '.emoji',\n 'v.includes': '.includes',\n 'v.startsWith': '.startsWith',\n 'v.endsWith': '.endsWith',\n 'v.trim': '.trim',\n 'v.toLowerCase': '.toLowerCase',\n 'v.toUpperCase': '.toUpperCase',\n 'v.minLength': '.min',\n 'v.maxLength': '.max',\n 'v.length': '.length',\n 'v.minValue': '.min',\n 'v.maxValue': '.max',\n 'v.integer': '.int',\n 'v.finite': '.finite',\n 'v.safeInteger': '.safe',\n 'v.multipleOf': '.multipleOf',\n 'v.nonEmpty': '.nonempty',\n};\n\n/**\n * Valibot → Zod transformer.\n *\n * Converts Valibot's pipe-based API back to Zod's fluent method chain API.\n * Uses AST-based import handling for safety, with text-based pipe expression\n * transformation for the complex pipe-to-chain conversions.\n *\n * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))\n * Zod: z.string().email().min(5).max(100)\n *\n * Valibot: v.optional(v.string())\n * Zod: z.string().optional()\n *\n * Valibot: v.partial(v.object({ name: v.string() }))\n * Zod: z.object({ name: z.string() }).partial()\n */\nexport class ValibotToZodTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n private stringLiteralRanges: Array<{ start: number; end: number }> = [];\n private commentRanges: Array<{ start: number; end: number }> = [];\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n this.stringLiteralRanges = [];\n this.commentRanges = [];\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n // Step 1: Collect protected ranges (strings, comments) from AST\n this.collectProtectedRanges(sourceFile);\n\n // Step 2: AST-based import rewriting\n this.transformImportsAST(sourceFile);\n\n // Step 3: Text-based transformations on the updated source\n let text = sourceFile.getFullText();\n\n text = this.transformTypeHelpers(text);\n text = this.transformWrappers(text);\n text = this.transformPipeExpressions(text);\n text = this.transformFactories(text);\n\n sourceFile.replaceWithText(text);\n\n return {\n success: this.errors.length === 0,\n filePath,\n originalCode,\n transformedCode: sourceFile.getFullText(),\n errors: this.errors,\n warnings: this.warnings,\n };\n } catch (error) {\n this.errors.push({\n message: error instanceof Error ? error.message : 'Unknown error',\n });\n return {\n success: false,\n filePath,\n originalCode,\n errors: this.errors,\n warnings: this.warnings,\n };\n }\n }\n\n /**\n * Collect string literal and comment ranges from the AST\n * so text-based transforms can avoid modifying them.\n */\n private collectProtectedRanges(sourceFile: SourceFile): void {\n this.stringLiteralRanges = [];\n this.commentRanges = [];\n\n // Collect string literals\n sourceFile.forEachDescendant((node) => {\n if (\n node.getKind() === SyntaxKind.StringLiteral ||\n node.getKind() === SyntaxKind.TemplateExpression ||\n node.getKind() === SyntaxKind.NoSubstitutionTemplateLiteral\n ) {\n this.stringLiteralRanges.push({\n start: node.getStart(),\n end: node.getEnd(),\n });\n }\n });\n\n // Collect comments via regex (ts-morph doesn't expose comments easily)\n const text = sourceFile.getFullText();\n const commentRegex = /\\/\\/[^\\n]*|\\/\\*[\\s\\S]*?\\*\\//g;\n for (const match of text.matchAll(commentRegex)) {\n if (match.index !== undefined) {\n this.commentRanges.push({\n start: match.index,\n end: match.index + match[0].length,\n });\n }\n }\n }\n\n /**\n * Check if a position is inside a protected range (string literal or comment).\n */\n private isProtected(position: number): boolean {\n for (const range of this.stringLiteralRanges) {\n if (position >= range.start && position < range.end) return true;\n }\n for (const range of this.commentRanges) {\n if (position >= range.start && position < range.end) return true;\n }\n return false;\n }\n\n /**\n * AST-based import transformation.\n * Replaces valibot imports with zod imports using the AST.\n */\n private transformImportsAST(sourceFile: SourceFile): void {\n const imports = sourceFile.getImportDeclarations();\n const valibotImports: ImportDeclaration[] = [];\n\n for (const imp of imports) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n if (moduleSpecifier === 'valibot') {\n valibotImports.push(imp);\n }\n }\n\n for (const imp of valibotImports) {\n imp.setModuleSpecifier('zod');\n\n // Replace namespace import (import * as v from 'valibot') with named import\n const namespaceImport = imp.getNamespaceImport();\n if (namespaceImport) {\n imp.removeNamespaceImport();\n imp.addNamedImport('z');\n } else {\n // Replace named imports with { z }\n const namedImports = imp.getNamedImports();\n for (const named of namedImports) {\n named.remove();\n }\n imp.addNamedImport('z');\n }\n }\n }\n\n private transformTypeHelpers(text: string): string {\n text = text.replace(/\\bv\\.InferOutput</g, 'z.infer<');\n text = text.replace(/\\bv\\.InferInput</g, 'z.input<');\n return text;\n }\n\n /**\n * Transform Valibot wrapper functions to Zod method chains.\n * v.optional(schema) → schema.optional()\n * v.nullable(schema) → schema.nullable()\n * v.nullish(schema) → schema.nullish()\n * v.readonly(schema) → schema.readonly()\n * v.partial(schema) → schema.partial()\n * v.required(schema) → schema.required()\n */\n private transformWrappers(text: string): string {\n // Two-arg wrappers first (more specific)\n const twoArgWrappers = [\n {\n prefix: 'v.optional',\n transform: (schema: string, value: string) => `${schema}.default(${value})`,\n },\n {\n prefix: 'v.fallback',\n transform: (schema: string, value: string) => `${schema}.catch(${value})`,\n },\n ];\n\n // Single-arg wrappers\n const singleArgWrappers = [\n { prefix: 'v.optional', suffix: '.optional()' },\n { prefix: 'v.nullable', suffix: '.nullable()' },\n { prefix: 'v.nullish', suffix: '.nullish()' },\n { prefix: 'v.readonly', suffix: '.readonly()' },\n { prefix: 'v.partial', suffix: '.partial()' },\n { prefix: 'v.required', suffix: '.required()' },\n { prefix: 'v.strict', suffix: '.strict()' },\n ];\n\n // Process two-arg wrappers first\n for (const { prefix, transform } of twoArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length >= 2) {\n return transform(args[0] ?? '', args[1] ?? '');\n }\n return null; // Not a two-arg call, skip\n });\n }\n\n // Process single-arg wrappers\n for (const { prefix, suffix } of singleArgWrappers) {\n text = this.replaceWrapperCall(text, prefix, (args) => {\n if (args.length === 1) {\n return `${args[0] ?? ''}${suffix}`;\n }\n return null;\n });\n }\n\n return text;\n }\n\n /**\n * Replace wrapper calls using balanced parenthesis matching.\n * Skips matches inside string literals and comments.\n */\n private replaceWrapperCall(\n text: string,\n prefix: string,\n replacer: (args: string[]) => string | null,\n ): string {\n const pattern = new RegExp(`\\\\b${prefix.replace('.', '\\\\.')}\\\\(`, 'g');\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pattern)) {\n const matchIdx = match.index ?? 0;\n\n // Skip if inside a protected range\n if (this.isProtected(matchIdx)) continue;\n\n const startIdx = matchIdx + offset;\n const openParen = startIdx + prefix.length;\n\n // Find matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n const replacement = replacer(args);\n if (replacement === null) continue;\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + replacement + after;\n offset += replacement.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()\n * Skips matches inside string literals and comments.\n */\n private transformPipeExpressions(text: string): string {\n const pipePattern = /\\bv\\.pipe\\(/g;\n let result = text;\n let offset = 0;\n\n for (const match of text.matchAll(pipePattern)) {\n const matchIdx = match.index ?? 0;\n\n // Skip if inside a protected range\n if (this.isProtected(matchIdx)) continue;\n\n const startIdx = matchIdx + offset;\n const openParen = startIdx + 'v.pipe'.length;\n\n // Find the matching close paren\n let depth = 1;\n let i = openParen + 1;\n const current = result;\n while (i < current.length && depth > 0) {\n if (current[i] === '(') depth++;\n else if (current[i] === ')') depth--;\n i++;\n }\n\n if (depth !== 0) continue;\n\n const innerContent = current.substring(openParen + 1, i - 1);\n const args = this.splitTopLevelArgs(innerContent);\n\n if (args.length === 0) continue;\n\n // First arg is the factory, rest are pipe validators\n let zodExpr = args[0] ?? '';\n for (let j = 1; j < args.length; j++) {\n const validator = (args[j] ?? '').trim();\n zodExpr = this.convertPipeValidator(zodExpr, validator);\n }\n\n const before = current.substring(0, startIdx);\n const after = current.substring(i);\n result = before + zodExpr + after;\n offset += zodExpr.length - (i - startIdx);\n }\n\n return result;\n }\n\n /**\n * Split arguments at top-level commas (not inside nested parens/brackets/braces).\n */\n private splitTopLevelArgs(text: string): string[] {\n const args: string[] = [];\n let depth = 0;\n let current = '';\n\n for (const char of text) {\n if (char === '(' || char === '[' || char === '{') depth++;\n else if (char === ')' || char === ']' || char === '}') depth--;\n\n if (char === ',' && depth === 0) {\n args.push(current.trim());\n current = '';\n } else {\n current += char;\n }\n }\n\n if (current.trim()) {\n args.push(current.trim());\n }\n\n return args;\n }\n\n private convertPipeValidator(base: string, validator: string): string {\n // Try known pipe-to-chain mappings\n for (const [valibotFn, zodMethod] of Object.entries(PIPE_TO_CHAIN)) {\n const fnCall = `${valibotFn}(`;\n if (validator.startsWith(fnCall)) {\n const argsStr = validator.substring(fnCall.length, validator.length - 1);\n return argsStr ? `${base}${zodMethod}(${argsStr})` : `${base}${zodMethod}()`;\n }\n // No-arg validators: v.email() matches exactly\n if (validator === `${valibotFn}()`) {\n return `${base}${zodMethod}()`;\n }\n }\n\n // v.transform(...) → .transform(...)\n if (validator.startsWith('v.transform(')) {\n const args = validator.substring('v.transform('.length, validator.length - 1);\n return `${base}.transform(${args})`;\n }\n\n // v.check(...) → .refine(...)\n if (validator.startsWith('v.check(')) {\n const args = validator.substring('v.check('.length, validator.length - 1);\n return `${base}.refine(${args})`;\n }\n\n // v.brand(...) → .brand(...)\n if (validator.startsWith('v.brand(')) {\n const args = validator.substring('v.brand('.length, validator.length - 1);\n return `${base}.brand(${args})`;\n }\n\n // Unknown validator — add TODO\n this.warnings.push(`Unknown Valibot pipe validator: ${validator} — kept as-is`);\n return `${base} /* TODO(schemashift): convert ${validator} */`;\n }\n\n private transformFactories(text: string): string {\n // Replace remaining v.factory() calls with z.factory()\n for (const [valibotFactory, zodFactory] of Object.entries(VALIBOT_TO_ZOD_FACTORY)) {\n const escaped = valibotFactory.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const regex = new RegExp(`\\\\b${escaped}\\\\(`, 'g');\n text = text.replace(regex, `${zodFactory}(`);\n }\n return text;\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ValibotToZodTransformer } from './valibot-to-zod-transformer.js';\n\nexport function createValibotToZodHandler(): TransformHandler {\n const transformer = new ValibotToZodTransformer();\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n return transformer.transform(sourceFile);\n },\n };\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EAEA;AAAA,OAGK;AACP,SAA8B,YAA6B;;;ACGpD,IAAM,mBAA2C;AAAA,EACtD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,MAAM;AAAA,EACN,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,OAAO;AAAA,EACP,oBAAoB;AAAA,EACpB,cAAc;AAAA,EACd,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY;AACd;AAGO,IAAM,sBAAqD;AAAA;AAAA,EAEhE,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM;AAAA,EACN,OAAO;AAAA,EACP,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,MAAM;AAAA,EACN,OAAO;AAAA,EACP,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,aAAa;AAAA,EACb,aAAa;AAAA;AAAA,EAGb,KAAK;AAAA;AAAA,EACL,KAAK;AAAA;AAAA,EACL,QAAQ;AAAA;AAAA,EAGR,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,UAAU;AAAA,EACV,UAAU;AAAA,EACV,aAAa;AAAA,EACb,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,MAAM;AAAA;AAAA,EAGN,UAAU;AAAA;AAAA,EAGV,UAAU;AAAA;AAAA,EACV,UAAU;AAAA;AAAA,EACV,SAAS;AAAA;AAAA,EACT,SAAS;AAAA;AAAA,EACT,OAAO;AAAA;AAAA,EACP,WAAW;AAAA;AAAA,EACX,QAAQ;AAAA;AAAA,EACR,aAAa;AAAA;AAAA,EACb,OAAO;AAAA;AAAA,EACP,UAAU;AAAA;AAAA,EACV,MAAM;AAAA;AAAA,EACN,UAAU;AAAA;AAAA;AAAA,EAGV,SAAS;AAAA;AAAA,EACT,UAAU;AAAA;AAAA,EACV,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,QAAQ;AAAA;AAAA,EACR,OAAO;AAAA;AAAA,EACP,aAAa;AAAA;AAAA,EACb,QAAQ;AAAA;AAAA,EACR,OAAO;AAAA;AAAA,EACP,UAAU;AAAA;AAAA,EACV,OAAO;AAAA;AAAA;AAAA,EAGP,SAAS;AAAA;AACX;AAGO,IAAM,6BAGT;AAAA,EACF,KAAK,EAAE,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE;AAAA,EAC1C,KAAK,EAAE,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE;AAAA,EAC1C,IAAI,EAAE,MAAM,cAAc,MAAM,CAAC,MAAO,EAAE,SAAS,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAG;AAAA,EACvF,IAAI,EAAE,MAAM,cAAc,MAAM,CAAC,MAAO,EAAE,SAAS,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAG;AAAA,EACvF,KAAK,EAAE,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE;AAAA,EAC1C,KAAK,EAAE,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE;AAAA,EAC1C,UAAU,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC,GAAG,EAAE;AAAA,EAClD,UAAU,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC,IAAI,EAAE;AAAA,EACnD,aAAa,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC,GAAG,EAAE;AAAA,EACrD,aAAa,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC,GAAG,EAAE;AACvD;AAGO,IAAM,mBAAmB,oBAAI,IAAI;AAAA,EACtC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGM,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;;;ADlIM,IAAM,0BAAN,MAA8B;AAAA,EAC3B,SAA2B,CAAC;AAAA,EAC5B,WAAqB,CAAC;AAAA,EAE9B,UAAU,YAAyC;AACjD,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,CAAC;AAEjB,UAAM,WAAW,WAAW,YAAY;AACxC,UAAM,eAAe,WAAW,YAAY;AAE5C,QAAI;AACF,WAAK,cAAc,UAAU;AAC7B,WAAK,qBAAqB,UAAU;AACpC,WAAK,2BAA2B,UAAU;AAE1C,aAAO;AAAA,QACL,SAAS,KAAK,OAAO,WAAW;AAAA,QAChC;AAAA,QACA;AAAA,QACA,iBAAiB,WAAW,YAAY;AAAA,QACxC,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,OAAO,KAAK;AAAA,QACf,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD,CAAC;AACD,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,cAAc,YAA8B;AAClD,UAAM,aAAa,WAChB,sBAAsB,EACtB,OAAO,CAAC,QAAQ,IAAI,wBAAwB,MAAM,KAAK;AAE1D,eAAW,OAAO,YAAY;AAC5B,UAAI,mBAAmB,SAAS;AAEhC,YAAM,kBAAkB,IAAI,mBAAmB;AAC/C,YAAM,gBAAgB,IAAI,iBAAiB;AAC3C,YAAM,eAAe,IAAI,gBAAgB;AAEzC,UAAI,gBAAiB,KAAI,sBAAsB;AAC/C,UAAI,cAAe,KAAI,oBAAoB;AAC3C,UAAI,aAAa,SAAS,EAAG,KAAI,mBAAmB;AAEpD,UAAI,mBAAmB,GAAG;AAAA,IAC5B;AAAA,EACF;AAAA,EAEQ,qBAAqB,YAA8B;AACzD,UAAM,WAAW,WAAW,YAAY;AACxC,QAAI,UAAU;AACd,cAAU,QAAQ,QAAQ,gBAAgB,gBAAgB;AAC1D,cAAU,QAAQ,QAAQ,gBAAgB,eAAe;AACzD,cAAU,QAAQ,QAAQ,iBAAiB,gBAAgB;AAC3D,QAAI,YAAY,UAAU;AACxB,iBAAW,gBAAgB,OAAO;AAAA,IACpC;AAAA,EACF;AAAA,EAEQ,2BAA2B,YAA8B;AAC/D,UAAM,mBAAqC,CAAC;AAE5C,eAAW,kBAAkB,CAAC,SAAS;AACrC,UAAI,KAAK,iBAAiB,IAAI,GAAG;AAC/B,YAAI,sBAAsB,IAAI,EAAG;AAEjC,cAAM,OAAO,KAAK,QAAQ;AAC1B,YAAI,KAAK,WAAW,IAAI,GAAG;AACzB,2BAAiB,KAAK,IAAI;AAAA,QAC5B;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,YAAY,KAAK,qBAAqB,gBAAgB;AAC5D,cAAU,KAAK,CAAC,GAAG,MAAM,EAAE,SAAS,IAAI,EAAE,SAAS,CAAC;AAEpD,eAAW,QAAQ,WAAW;AAC5B,WAAK,mBAAmB,IAAI;AAAA,IAC9B;AAAA,EACF;AAAA,EAEQ,qBAAqB,OAA2C;AACtE,UAAM,SAA2B,CAAC;AAClC,eAAW,QAAQ,OAAO;AACxB,UAAI,UAAU;AACd,iBAAW,SAAS,OAAO;AACzB,YAAI,UAAU,KAAM;AACpB,YAAI,MAAM,SAAS,KAAK,KAAK,SAAS,KAAK,MAAM,OAAO,KAAK,KAAK,OAAO,GAAG;AAC1E,oBAAU;AACV;AAAA,QACF;AAAA,MACF;AACA,UAAI,CAAC,QAAS,QAAO,KAAK,IAAI;AAAA,IAChC;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,mBAAmB,MAA4B;AACrD,UAAM,QAAQ,eAAe,IAAI;AAEjC,QAAI,CAAC,OAAO;AACV,WAAK,2BAA2B,IAAI;AACpC;AAAA,IACF;AAEA,QAAI,MAAM,SAAS,IAAK;AAExB,UAAM,WAAW,KAAK,cAAc,EAAE,YAAY;AAClD,UAAM,aAAa,KAAK,mBAAmB;AAG3C,UAAM,iBAAiB,iBAAiB,MAAM,aAAa;AAC3D,QAAI,CAAC,gBAAgB;AACnB,WAAK,SAAS;AAAA,QACZ,GAAG,QAAQ,IAAI,UAAU,2BAA2B,MAAM,aAAa;AAAA,MACzE;AACA;AAAA,IACF;AAGA,UAAM,cAAc,MAAM;AAG1B,UAAM,iBAA2B,CAAC;AAClC,UAAM,YAAqD,CAAC;AAC5D,UAAM,gBAAyD,CAAC;AAEhE,eAAW,UAAU,MAAM,SAAS;AAClC,YAAMA,UAAS,KAAK,iBAAiB,QAAQ,aAAa,UAAU,UAAU;AAC9E,UAAIA,QAAO,SAAS,QAAQ;AAC1B,uBAAe,KAAKA,QAAO,IAAI;AAAA,MACjC,WAAWA,QAAO,SAAS,YAAY;AACrC,kBAAU,KAAK,EAAE,MAAMA,QAAO,MAAM,MAAMA,QAAO,KAAK,CAAC;AAAA,MACzD,WAAWA,QAAO,SAAS,UAAU;AACnC,sBAAc,KAAK,EAAE,MAAMA,QAAO,MAAM,MAAMA,QAAO,KAAK,CAAC;AAAA,MAC7D;AAAA,IAEF;AAGA,QAAI;AAGJ,UAAM,cAAc,GAAG,cAAc,IAAI,MAAM,YAAY,KAAK,IAAI,CAAC;AAGrE,QAAI,eAAe,SAAS,GAAG;AAC7B,eAAS,UAAU,WAAW,KAAK,eAAe,KAAK,IAAI,CAAC;AAAA,IAC9D,OAAO;AACL,eAAS;AAAA,IACX;AAGA,eAAW,aAAa,eAAe;AACrC,eAAS,KAAK,kBAAkB,UAAU,MAAM,UAAU,MAAM,QAAQ,UAAU,UAAU;AAAA,IAC9F;AAGA,eAAW,YAAY,WAAW;AAChC,eAAS,KAAK,cAAc,SAAS,MAAM,SAAS,MAAM,QAAQ,UAAU,UAAU;AAAA,IACxF;AAGA,aAAS,KAAK,6BAA6B,MAAM;AAEjD,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA,EAEQ,6BAA6B,MAAsB;AAEzD,QAAI,SAAS;AACb,eAAW,CAAC,SAAS,WAAW,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACrE,YAAM,QAAQ,IAAI,OAAO,UAAU,OAAO,OAAO,GAAG;AACpD,eAAS,OAAO,QAAQ,OAAO,GAAG,WAAW,GAAG;AAAA,IAClD;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,iBACN,QACA,aACA,UACA,YAKmB;AACnB,UAAM,EAAE,MAAM,KAAK,IAAI;AAGvB,QAAI,iBAAiB,IAAI,IAAI,GAAG;AAC9B,aAAO,EAAE,MAAM,YAAY,MAAM,KAAK;AAAA,IACxC;AAGA,QAAI,eAAe,IAAI,IAAI,GAAG;AAC5B,aAAO,EAAE,MAAM,UAAU,MAAM,KAAK;AAAA,IACtC;AAGA,SACG,gBAAgB,YAAY,gBAAgB,aAC7C,2BAA2B,IAAI,GAC/B;AACA,YAAM,UAAU,2BAA2B,IAAI;AAC/C,UAAI,CAAC,QAAS,QAAO,EAAE,MAAM,OAAgB;AAC7C,YAAM,aAAa,QAAQ,KAAK,IAAI;AACpC,aAAO,EAAE,MAAM,QAAQ,MAAM,GAAG,QAAQ,IAAI,IAAI,WAAW,KAAK,IAAI,CAAC,IAAI;AAAA,IAC3E;AAGA,QAAI,gBAAgB,YAAY,gBAAgB,SAAS;AACvD,UAAI,SAAS,OAAO;AAClB,eAAO,EAAE,MAAM,QAAQ,MAAM,eAAe,KAAK,KAAK,IAAI,CAAC,IAAI;AAAA,MACjE;AACA,UAAI,SAAS,OAAO;AAClB,eAAO,EAAE,MAAM,QAAQ,MAAM,eAAe,KAAK,KAAK,IAAI,CAAC,IAAI;AAAA,MACjE;AAAA,IACF;AAGA,UAAM,oBAAoB,oBAAoB,IAAI;AAClD,QAAI,sBAAsB,MAAM;AAE9B,aAAO,EAAE,MAAM,OAAO;AAAA,IACxB;AACA,QAAI,mBAAmB;AACrB,aAAO,EAAE,MAAM,QAAQ,MAAM,GAAG,iBAAiB,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI;AAAA,IAC1E;AAGA,SAAK,SAAS;AAAA,MACZ,GAAG,QAAQ,IAAI,UAAU,yBAAyB,IAAI;AAAA,IACxD;AACA,WAAO,EAAE,MAAM,QAAQ,MAAM,aAAa,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO;AAAA,EAC1E;AAAA,EAEQ,cACN,MACA,MACA,OACA,UACA,YACQ;AACR,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,cAAc,KAAK;AAAA,MAC5B,KAAK;AACH,eAAO,cAAc,KAAK;AAAA,MAC5B,KAAK;AACH,eAAO,aAAa,KAAK;AAAA,MAC3B,KAAK;AACH,eAAO,cAAc,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,MAChD,KAAK;AACH,eAAO,cAAc,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,MAChD,KAAK;AACH,eAAO,cAAc,KAAK;AAAA,MAC5B,KAAK;AACH,eAAO,UAAU,KAAK,iBAAiB,KAAK,KAAK,IAAI,CAAC;AAAA,MACxD,KAAK;AACH,YAAI,KAAK,UAAU,GAAG;AACpB,iBAAO,UAAU,KAAK,aAAa,KAAK,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,KAAK,IAAI,CAAC;AAAA,QACzE;AACA,eAAO,UAAU,KAAK,aAAa,KAAK,KAAK,IAAI,CAAC;AAAA,MACpD,KAAK;AACH,aAAK,SAAS;AAAA,UACZ,GAAG,QAAQ,IAAI,UAAU;AAAA,QAC3B;AACA,eAAO,UAAU,KAAK,0DAA0D,KAAK,KAAK,IAAI,CAAC;AAAA,MACjG,KAAK;AACH,eAAO,UAAU,KAAK,aAAa,KAAK,KAAK,IAAI,CAAC;AAAA,MACpD,KAAK;AAEH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,UAAU,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,MAC5C;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,kBACN,MACA,MACA,OACA,UACA,YACQ;AACR,YAAQ,MAAM;AAAA,MACZ,KAAK;AACH,eAAO,aAAa,KAAK;AAAA,MAC3B,KAAK;AACH,eAAO,cAAc,KAAK;AAAA,MAC5B,KAAK;AACH,eAAO,UAAU,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,MAC5C,KAAK;AACH,eAAO,UAAU,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,MAC5C,KAAK;AAAA,MACL,KAAK;AACH,eAAO,YAAY,KAAK,KAAK,KAAK,KAAK,IAAI,CAAC;AAAA,MAC9C,KAAK;AACH,aAAK,SAAS;AAAA,UACZ,GAAG,QAAQ,IAAI,UAAU;AAAA,QAC3B;AACA,eAAO;AAAA,MACT,KAAK;AACH,eAAO,YAAY,KAAK;AAAA,MAC1B,KAAK;AACH,eAAO;AAAA;AAAA,MACT,KAAK;AACH,aAAK,SAAS;AAAA,UACZ,GAAG,QAAQ,IAAI,UAAU;AAAA,QAC3B;AACA,eAAO;AAAA,MACT,KAAK;AACH,aAAK,SAAS;AAAA,UACZ,GAAG,QAAQ,IAAI,UAAU;AAAA,QAC3B;AACA,eAAO;AAAA,MACT;AACE,eAAO;AAAA,IACX;AAAA,EACF;AAAA,EAEQ,2BAA2B,MAA4B;AAC7D,UAAM,OAAO,KAAK,QAAQ;AAC1B,UAAM,WAAW,KAAK,cAAc,EAAE,YAAY;AAClD,UAAM,aAAa,KAAK,mBAAmB;AAG3C,QAAI,cAAc;AAGlB,kBAAc,YAAY,QAAQ,QAAQ,IAAI;AAG9C,eAAW,CAAC,SAAS,WAAW,KAAK,OAAO,QAAQ,gBAAgB,GAAG;AACrE,YAAM,QAAQ,IAAI,OAAO,UAAU,OAAO,OAAO,GAAG;AACpD,oBAAc,YAAY,QAAQ,OAAO,GAAG,WAAW,GAAG;AAAA,IAC5D;AAEA,SAAK,SAAS;AAAA,MACZ,GAAG,QAAQ,IAAI,UAAU;AAAA,IAC3B;AAEA,SAAK,gBAAgB,WAAW;AAAA,EAClC;AACF;;;AEhYO,SAAS,4BAA8C;AAC5D,QAAM,cAAc,IAAI,wBAAwB;AAChD,SAAO;AAAA,IACL,UAAU,YAAwB,UAA6C;AAC7E,aAAO,YAAY,UAAU,UAAU;AAAA,IACzC;AAAA,EACF;AACF;;;ACVA,SAAkD,kBAAkB;AAMpE,IAAM,yBAAiD;AAAA,EACrD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,WAAW;AAAA,EACX,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa;AAAA,EACb,cAAc;AAAA,EACd,WAAW;AAAA,EACX,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,WAAW;AAAA,EACX,aAAa;AAAA,EACb,eAAe;AAAA,EACf,UAAU;AAAA,EACV,aAAa;AAAA,EACb,cAAc;AAChB;AAKA,IAAM,gBAAwC;AAAA,EAC5C,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,WAAW;AAAA,EACX,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,cAAc;AAAA,EACd,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,cAAc;AAAA,EACd,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,cAAc;AAChB;AAkBO,IAAM,0BAAN,MAA8B;AAAA,EAC3B,SAA2B,CAAC;AAAA,EAC5B,WAAqB,CAAC;AAAA,EACtB,sBAA6D,CAAC;AAAA,EAC9D,gBAAuD,CAAC;AAAA,EAEhE,UAAU,YAAyC;AACjD,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,CAAC;AACjB,SAAK,sBAAsB,CAAC;AAC5B,SAAK,gBAAgB,CAAC;AAEtB,UAAM,WAAW,WAAW,YAAY;AACxC,UAAM,eAAe,WAAW,YAAY;AAE5C,QAAI;AAEF,WAAK,uBAAuB,UAAU;AAGtC,WAAK,oBAAoB,UAAU;AAGnC,UAAI,OAAO,WAAW,YAAY;AAElC,aAAO,KAAK,qBAAqB,IAAI;AACrC,aAAO,KAAK,kBAAkB,IAAI;AAClC,aAAO,KAAK,yBAAyB,IAAI;AACzC,aAAO,KAAK,mBAAmB,IAAI;AAEnC,iBAAW,gBAAgB,IAAI;AAE/B,aAAO;AAAA,QACL,SAAS,KAAK,OAAO,WAAW;AAAA,QAChC;AAAA,QACA;AAAA,QACA,iBAAiB,WAAW,YAAY;AAAA,QACxC,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,MACjB;AAAA,IACF,SAAS,OAAO;AACd,WAAK,OAAO,KAAK;AAAA,QACf,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD,CAAC;AACD,aAAO;AAAA,QACL,SAAS;AAAA,QACT;AAAA,QACA;AAAA,QACA,QAAQ,KAAK;AAAA,QACb,UAAU,KAAK;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB,YAA8B;AAC3D,SAAK,sBAAsB,CAAC;AAC5B,SAAK,gBAAgB,CAAC;AAGtB,eAAW,kBAAkB,CAAC,SAAS;AACrC,UACE,KAAK,QAAQ,MAAM,WAAW,iBAC9B,KAAK,QAAQ,MAAM,WAAW,sBAC9B,KAAK,QAAQ,MAAM,WAAW,+BAC9B;AACA,aAAK,oBAAoB,KAAK;AAAA,UAC5B,OAAO,KAAK,SAAS;AAAA,UACrB,KAAK,KAAK,OAAO;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAGD,UAAM,OAAO,WAAW,YAAY;AACpC,UAAM,eAAe;AACrB,eAAW,SAAS,KAAK,SAAS,YAAY,GAAG;AAC/C,UAAI,MAAM,UAAU,QAAW;AAC7B,aAAK,cAAc,KAAK;AAAA,UACtB,OAAO,MAAM;AAAA,UACb,KAAK,MAAM,QAAQ,MAAM,CAAC,EAAE;AAAA,QAC9B,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,UAA2B;AAC7C,eAAW,SAAS,KAAK,qBAAqB;AAC5C,UAAI,YAAY,MAAM,SAAS,WAAW,MAAM,IAAK,QAAO;AAAA,IAC9D;AACA,eAAW,SAAS,KAAK,eAAe;AACtC,UAAI,YAAY,MAAM,SAAS,WAAW,MAAM,IAAK,QAAO;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,YAA8B;AACxD,UAAM,UAAU,WAAW,sBAAsB;AACjD,UAAM,iBAAsC,CAAC;AAE7C,eAAW,OAAO,SAAS;AACzB,YAAM,kBAAkB,IAAI,wBAAwB;AACpD,UAAI,oBAAoB,WAAW;AACjC,uBAAe,KAAK,GAAG;AAAA,MACzB;AAAA,IACF;AAEA,eAAW,OAAO,gBAAgB;AAChC,UAAI,mBAAmB,KAAK;AAG5B,YAAM,kBAAkB,IAAI,mBAAmB;AAC/C,UAAI,iBAAiB;AACnB,YAAI,sBAAsB;AAC1B,YAAI,eAAe,GAAG;AAAA,MACxB,OAAO;AAEL,cAAM,eAAe,IAAI,gBAAgB;AACzC,mBAAW,SAAS,cAAc;AAChC,gBAAM,OAAO;AAAA,QACf;AACA,YAAI,eAAe,GAAG;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,qBAAqB,MAAsB;AACjD,WAAO,KAAK,QAAQ,sBAAsB,UAAU;AACpD,WAAO,KAAK,QAAQ,qBAAqB,UAAU;AACnD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWQ,kBAAkB,MAAsB;AAE9C,UAAM,iBAAiB;AAAA,MACrB;AAAA,QACE,QAAQ;AAAA,QACR,WAAW,CAAC,QAAgB,UAAkB,GAAG,MAAM,YAAY,KAAK;AAAA,MAC1E;AAAA,MACA;AAAA,QACE,QAAQ;AAAA,QACR,WAAW,CAAC,QAAgB,UAAkB,GAAG,MAAM,UAAU,KAAK;AAAA,MACxE;AAAA,IACF;AAGA,UAAM,oBAAoB;AAAA,MACxB,EAAE,QAAQ,cAAc,QAAQ,cAAc;AAAA,MAC9C,EAAE,QAAQ,cAAc,QAAQ,cAAc;AAAA,MAC9C,EAAE,QAAQ,aAAa,QAAQ,aAAa;AAAA,MAC5C,EAAE,QAAQ,cAAc,QAAQ,cAAc;AAAA,MAC9C,EAAE,QAAQ,aAAa,QAAQ,aAAa;AAAA,MAC5C,EAAE,QAAQ,cAAc,QAAQ,cAAc;AAAA,MAC9C,EAAE,QAAQ,YAAY,QAAQ,YAAY;AAAA,IAC5C;AAGA,eAAW,EAAE,QAAQ,UAAU,KAAK,gBAAgB;AAClD,aAAO,KAAK,mBAAmB,MAAM,QAAQ,CAAC,SAAS;AACrD,YAAI,KAAK,UAAU,GAAG;AACpB,iBAAO,UAAU,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AAAA,QAC/C;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAGA,eAAW,EAAE,QAAQ,OAAO,KAAK,mBAAmB;AAClD,aAAO,KAAK,mBAAmB,MAAM,QAAQ,CAAC,SAAS;AACrD,YAAI,KAAK,WAAW,GAAG;AACrB,iBAAO,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,MAAM;AAAA,QAClC;AACA,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,mBACN,MACA,QACA,UACQ;AACR,UAAM,UAAU,IAAI,OAAO,MAAM,OAAO,QAAQ,KAAK,KAAK,CAAC,OAAO,GAAG;AACrE,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,eAAW,SAAS,KAAK,SAAS,OAAO,GAAG;AAC1C,YAAM,WAAW,MAAM,SAAS;AAGhC,UAAI,KAAK,YAAY,QAAQ,EAAG;AAEhC,YAAM,WAAW,WAAW;AAC5B,YAAM,YAAY,WAAW,OAAO;AAGpC,UAAI,QAAQ;AACZ,UAAI,IAAI,YAAY;AACpB,YAAM,UAAU;AAChB,aAAO,IAAI,QAAQ,UAAU,QAAQ,GAAG;AACtC,YAAI,QAAQ,CAAC,MAAM,IAAK;AAAA,iBACf,QAAQ,CAAC,MAAM,IAAK;AAC7B;AAAA,MACF;AAEA,UAAI,UAAU,EAAG;AAEjB,YAAM,eAAe,QAAQ,UAAU,YAAY,GAAG,IAAI,CAAC;AAC3D,YAAM,OAAO,KAAK,kBAAkB,YAAY;AAEhD,YAAM,cAAc,SAAS,IAAI;AACjC,UAAI,gBAAgB,KAAM;AAE1B,YAAM,SAAS,QAAQ,UAAU,GAAG,QAAQ;AAC5C,YAAM,QAAQ,QAAQ,UAAU,CAAC;AACjC,eAAS,SAAS,cAAc;AAChC,gBAAU,YAAY,UAAU,IAAI;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,yBAAyB,MAAsB;AACrD,UAAM,cAAc;AACpB,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,eAAW,SAAS,KAAK,SAAS,WAAW,GAAG;AAC9C,YAAM,WAAW,MAAM,SAAS;AAGhC,UAAI,KAAK,YAAY,QAAQ,EAAG;AAEhC,YAAM,WAAW,WAAW;AAC5B,YAAM,YAAY,WAAW,SAAS;AAGtC,UAAI,QAAQ;AACZ,UAAI,IAAI,YAAY;AACpB,YAAM,UAAU;AAChB,aAAO,IAAI,QAAQ,UAAU,QAAQ,GAAG;AACtC,YAAI,QAAQ,CAAC,MAAM,IAAK;AAAA,iBACf,QAAQ,CAAC,MAAM,IAAK;AAC7B;AAAA,MACF;AAEA,UAAI,UAAU,EAAG;AAEjB,YAAM,eAAe,QAAQ,UAAU,YAAY,GAAG,IAAI,CAAC;AAC3D,YAAM,OAAO,KAAK,kBAAkB,YAAY;AAEhD,UAAI,KAAK,WAAW,EAAG;AAGvB,UAAI,UAAU,KAAK,CAAC,KAAK;AACzB,eAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,cAAM,aAAa,KAAK,CAAC,KAAK,IAAI,KAAK;AACvC,kBAAU,KAAK,qBAAqB,SAAS,SAAS;AAAA,MACxD;AAEA,YAAM,SAAS,QAAQ,UAAU,GAAG,QAAQ;AAC5C,YAAM,QAAQ,QAAQ,UAAU,CAAC;AACjC,eAAS,SAAS,UAAU;AAC5B,gBAAU,QAAQ,UAAU,IAAI;AAAA,IAClC;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,MAAwB;AAChD,UAAM,OAAiB,CAAC;AACxB,QAAI,QAAQ;AACZ,QAAI,UAAU;AAEd,eAAW,QAAQ,MAAM;AACvB,UAAI,SAAS,OAAO,SAAS,OAAO,SAAS,IAAK;AAAA,eACzC,SAAS,OAAO,SAAS,OAAO,SAAS,IAAK;AAEvD,UAAI,SAAS,OAAO,UAAU,GAAG;AAC/B,aAAK,KAAK,QAAQ,KAAK,CAAC;AACxB,kBAAU;AAAA,MACZ,OAAO;AACL,mBAAW;AAAA,MACb;AAAA,IACF;AAEA,QAAI,QAAQ,KAAK,GAAG;AAClB,WAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,IAC1B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,MAAc,WAA2B;AAEpE,eAAW,CAAC,WAAW,SAAS,KAAK,OAAO,QAAQ,aAAa,GAAG;AAClE,YAAM,SAAS,GAAG,SAAS;AAC3B,UAAI,UAAU,WAAW,MAAM,GAAG;AAChC,cAAM,UAAU,UAAU,UAAU,OAAO,QAAQ,UAAU,SAAS,CAAC;AACvE,eAAO,UAAU,GAAG,IAAI,GAAG,SAAS,IAAI,OAAO,MAAM,GAAG,IAAI,GAAG,SAAS;AAAA,MAC1E;AAEA,UAAI,cAAc,GAAG,SAAS,MAAM;AAClC,eAAO,GAAG,IAAI,GAAG,SAAS;AAAA,MAC5B;AAAA,IACF;AAGA,QAAI,UAAU,WAAW,cAAc,GAAG;AACxC,YAAM,OAAO,UAAU,UAAU,eAAe,QAAQ,UAAU,SAAS,CAAC;AAC5E,aAAO,GAAG,IAAI,cAAc,IAAI;AAAA,IAClC;AAGA,QAAI,UAAU,WAAW,UAAU,GAAG;AACpC,YAAM,OAAO,UAAU,UAAU,WAAW,QAAQ,UAAU,SAAS,CAAC;AACxE,aAAO,GAAG,IAAI,WAAW,IAAI;AAAA,IAC/B;AAGA,QAAI,UAAU,WAAW,UAAU,GAAG;AACpC,YAAM,OAAO,UAAU,UAAU,WAAW,QAAQ,UAAU,SAAS,CAAC;AACxE,aAAO,GAAG,IAAI,UAAU,IAAI;AAAA,IAC9B;AAGA,SAAK,SAAS,KAAK,mCAAmC,SAAS,oBAAe;AAC9E,WAAO,GAAG,IAAI,kCAAkC,SAAS;AAAA,EAC3D;AAAA,EAEQ,mBAAmB,MAAsB;AAE/C,eAAW,CAAC,gBAAgB,UAAU,KAAK,OAAO,QAAQ,sBAAsB,GAAG;AACjF,YAAM,UAAU,eAAe,QAAQ,uBAAuB,MAAM;AACpE,YAAM,QAAQ,IAAI,OAAO,MAAM,OAAO,OAAO,GAAG;AAChD,aAAO,KAAK,QAAQ,OAAO,GAAG,UAAU,GAAG;AAAA,IAC7C;AACA,WAAO;AAAA,EACT;AACF;;;ACpcO,SAAS,4BAA8C;AAC5D,QAAM,cAAc,IAAI,wBAAwB;AAChD,SAAO;AAAA,IACL,UAAU,YAAwB,UAA6C;AAC7E,aAAO,YAAY,UAAU,UAAU;AAAA,IACzC;AAAA,EACF;AACF;","names":["result"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@schemashift/zod-valibot",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"description": "Zod to Valibot transformer for SchemaShift — converts fluent chain API to pipe-based API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"zod",
|
|
@@ -12,6 +12,11 @@
|
|
|
12
12
|
"typescript",
|
|
13
13
|
"pipe"
|
|
14
14
|
],
|
|
15
|
+
"author": "Joseph May",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"engines": {
|
|
18
|
+
"node": ">=22.0.0"
|
|
19
|
+
},
|
|
15
20
|
"type": "module",
|
|
16
21
|
"main": "./dist/index.cjs",
|
|
17
22
|
"module": "./dist/index.js",
|
|
@@ -37,7 +42,7 @@
|
|
|
37
42
|
"typecheck": "tsc --noEmit"
|
|
38
43
|
},
|
|
39
44
|
"dependencies": {
|
|
40
|
-
"@schemashift/core": "0.
|
|
45
|
+
"@schemashift/core": "0.11.0",
|
|
41
46
|
"ts-morph": "27.0.2"
|
|
42
47
|
},
|
|
43
48
|
"publishConfig": {
|