@schemashift/zod-valibot 0.8.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @schemashift/zod-valibot
2
2
 
3
- Zod to Valibot transformer for SchemaShift. Converts Zod's fluent method chain API to Valibot's pipe-based API with AST-based transformations.
3
+ Zod Valibot transformer for SchemaShift. Supports both forward (Zod Valibot) and backward (Valibot Zod) migrations.
4
4
 
5
5
  **Tier:** Pro
6
6
 
@@ -13,13 +13,42 @@ npm install @schemashift/zod-valibot
13
13
  ## Usage
14
14
 
15
15
  ```typescript
16
- import { createZodToValibotHandler } from '@schemashift/zod-valibot';
16
+ import { createZodToValibotHandler, createValibotToZodHandler } from '@schemashift/zod-valibot';
17
17
  import { TransformEngine } from '@schemashift/core';
18
18
 
19
19
  const engine = new TransformEngine();
20
20
  engine.registerHandler('zod', 'valibot', createZodToValibotHandler());
21
+ engine.registerHandler('valibot', 'zod', createValibotToZodHandler()); // Backward migration (Pro+)
21
22
  ```
22
23
 
24
+ ### Backward Migration: Valibot → Zod
25
+
26
+ Text-based transformer that converts Valibot schemas to Zod equivalents:
27
+
28
+ | Valibot | Zod |
29
+ |---------|-----|
30
+ | `v.object({...})` | `z.object({...})` |
31
+ | `v.string()` | `z.string()` |
32
+ | `v.number()` | `z.number()` |
33
+ | `v.boolean()` | `z.boolean()` |
34
+ | `v.date()` | `z.date()` |
35
+ | `v.array(s)` | `z.array(s)` |
36
+ | `v.picklist([...])` | `z.enum([...])` |
37
+ | `v.union([...])` | `z.union([...])` |
38
+ | `v.literal(val)` | `z.literal(val)` |
39
+ | `v.optional(s)` | `s.optional()` |
40
+ | `v.nullable(s)` | `s.nullable()` |
41
+ | `v.nullish(s)` | `s.nullish()` |
42
+ | `v.pipe(s, ...)` | Unwrapped with validations chained |
43
+ | `v.check(fn, msg)` | `.refine(fn, msg)` |
44
+ | `v.transform(fn)` | `.transform(fn)` |
45
+ | `v.brand(name)` | `.brand(name)` |
46
+ | `v.partial(s)` | `s.partial()` |
47
+ | `v.pick(s, [...])` | `s.pick({...})` |
48
+ | `v.omit(s, [...])` | `s.omit({...})` |
49
+
50
+ **Tier:** Pro+
51
+
23
52
  ## API Model Difference
24
53
 
25
54
  Zod uses a fluent **method chain** API:
package/dist/index.cjs CHANGED
@@ -25,7 +25,9 @@ __export(index_exports, {
25
25
  NUMBER_VALIDATION_MAPPINGS: () => NUMBER_VALIDATION_MAPPINGS,
26
26
  OBJECT_METHODS: () => OBJECT_METHODS,
27
27
  VALIDATION_MAPPINGS: () => VALIDATION_MAPPINGS,
28
+ ValibotToZodTransformer: () => ValibotToZodTransformer,
28
29
  ZodToValibotTransformer: () => ZodToValibotTransformer,
30
+ createValibotToZodHandler: () => createValibotToZodHandler,
29
31
  createZodToValibotHandler: () => createZodToValibotHandler
30
32
  });
31
33
  module.exports = __toCommonJS(index_exports);
@@ -472,6 +474,293 @@ function createZodToValibotHandler() {
472
474
  }
473
475
  };
474
476
  }
477
+
478
+ // src/valibot-to-zod-transformer.ts
479
+ var VALIBOT_TO_ZOD_FACTORY = {
480
+ "v.string": "z.string",
481
+ "v.number": "z.number",
482
+ "v.boolean": "z.boolean",
483
+ "v.date": "z.date",
484
+ "v.bigint": "z.bigint",
485
+ "v.symbol": "z.symbol",
486
+ "v.undefined_": "z.undefined",
487
+ "v.null_": "z.null",
488
+ "v.void_": "z.void",
489
+ "v.any": "z.any",
490
+ "v.unknown": "z.unknown",
491
+ "v.never": "z.never",
492
+ "v.nan": "z.nan",
493
+ "v.literal": "z.literal",
494
+ "v.picklist": "z.enum",
495
+ "v.enum_": "z.nativeEnum",
496
+ "v.array": "z.array",
497
+ "v.object": "z.object",
498
+ "v.record": "z.record",
499
+ "v.tuple": "z.tuple",
500
+ "v.union": "z.union",
501
+ "v.variant": "z.discriminatedUnion",
502
+ "v.intersect": "z.intersection",
503
+ "v.lazy": "z.lazy",
504
+ "v.promise": "z.promise",
505
+ "v.instance": "z.instanceof"
506
+ };
507
+ var PIPE_TO_CHAIN = {
508
+ "v.email": ".email",
509
+ "v.url": ".url",
510
+ "v.uuid": ".uuid",
511
+ "v.cuid2": ".cuid2",
512
+ "v.ulid": ".ulid",
513
+ "v.regex": ".regex",
514
+ "v.ip": ".ip",
515
+ "v.isoDateTime": ".datetime",
516
+ "v.isoDate": ".date",
517
+ "v.isoTime": ".time",
518
+ "v.emoji": ".emoji",
519
+ "v.includes": ".includes",
520
+ "v.startsWith": ".startsWith",
521
+ "v.endsWith": ".endsWith",
522
+ "v.trim": ".trim",
523
+ "v.toLowerCase": ".toLowerCase",
524
+ "v.toUpperCase": ".toUpperCase",
525
+ "v.minLength": ".min",
526
+ "v.maxLength": ".max",
527
+ "v.length": ".length",
528
+ "v.minValue": ".min",
529
+ "v.maxValue": ".max",
530
+ "v.integer": ".int",
531
+ "v.finite": ".finite",
532
+ "v.safeInteger": ".safe",
533
+ "v.multipleOf": ".multipleOf",
534
+ "v.nonEmpty": ".nonempty"
535
+ };
536
+ var ValibotToZodTransformer = class {
537
+ errors = [];
538
+ warnings = [];
539
+ transform(sourceFile) {
540
+ this.errors = [];
541
+ this.warnings = [];
542
+ const filePath = sourceFile.getFilePath();
543
+ const originalCode = sourceFile.getFullText();
544
+ try {
545
+ let text = originalCode;
546
+ text = this.transformImports(text);
547
+ text = this.transformTypeHelpers(text);
548
+ text = this.transformWrappers(text);
549
+ text = this.transformPipeExpressions(text);
550
+ text = this.transformFactories(text);
551
+ sourceFile.replaceWithText(text);
552
+ return {
553
+ success: this.errors.length === 0,
554
+ filePath,
555
+ originalCode,
556
+ transformedCode: sourceFile.getFullText(),
557
+ errors: this.errors,
558
+ warnings: this.warnings
559
+ };
560
+ } catch (error) {
561
+ this.errors.push({
562
+ message: error instanceof Error ? error.message : "Unknown error"
563
+ });
564
+ return {
565
+ success: false,
566
+ filePath,
567
+ originalCode,
568
+ errors: this.errors,
569
+ warnings: this.warnings
570
+ };
571
+ }
572
+ }
573
+ transformImports(text) {
574
+ text = text.replace(
575
+ /import\s+\*\s+as\s+v\s+from\s+['"]valibot['"]/g,
576
+ "import { z } from 'zod'"
577
+ );
578
+ text = text.replace(/import\s+\{[^}]*\}\s+from\s+['"]valibot['"]/g, "import { z } from 'zod'");
579
+ return text;
580
+ }
581
+ transformTypeHelpers(text) {
582
+ text = text.replace(/\bv\.InferOutput</g, "z.infer<");
583
+ text = text.replace(/\bv\.InferInput</g, "z.input<");
584
+ return text;
585
+ }
586
+ /**
587
+ * Transform Valibot wrapper functions to Zod method chains.
588
+ * v.optional(schema) → schema.optional()
589
+ * v.nullable(schema) → schema.nullable()
590
+ * v.nullish(schema) → schema.nullish()
591
+ * v.readonly(schema) → schema.readonly()
592
+ * v.partial(schema) → schema.partial()
593
+ * v.required(schema) → schema.required()
594
+ */
595
+ transformWrappers(text) {
596
+ const twoArgWrappers = [
597
+ {
598
+ prefix: "v.optional",
599
+ transform: (schema, value) => `${schema}.default(${value})`
600
+ },
601
+ {
602
+ prefix: "v.fallback",
603
+ transform: (schema, value) => `${schema}.catch(${value})`
604
+ }
605
+ ];
606
+ const singleArgWrappers = [
607
+ { prefix: "v.optional", suffix: ".optional()" },
608
+ { prefix: "v.nullable", suffix: ".nullable()" },
609
+ { prefix: "v.nullish", suffix: ".nullish()" },
610
+ { prefix: "v.readonly", suffix: ".readonly()" },
611
+ { prefix: "v.partial", suffix: ".partial()" },
612
+ { prefix: "v.required", suffix: ".required()" },
613
+ { prefix: "v.strict", suffix: ".strict()" }
614
+ ];
615
+ for (const { prefix, transform } of twoArgWrappers) {
616
+ text = this.replaceWrapperCall(text, prefix, (args) => {
617
+ if (args.length >= 2) {
618
+ return transform(args[0] ?? "", args[1] ?? "");
619
+ }
620
+ return null;
621
+ });
622
+ }
623
+ for (const { prefix, suffix } of singleArgWrappers) {
624
+ text = this.replaceWrapperCall(text, prefix, (args) => {
625
+ if (args.length === 1) {
626
+ return `${args[0] ?? ""}${suffix}`;
627
+ }
628
+ return null;
629
+ });
630
+ }
631
+ return text;
632
+ }
633
+ /**
634
+ * Replace wrapper calls using balanced parenthesis matching.
635
+ */
636
+ replaceWrapperCall(text, prefix, replacer) {
637
+ const pattern = new RegExp(`\\b${prefix.replace(".", "\\.")}\\(`, "g");
638
+ let result = text;
639
+ let offset = 0;
640
+ for (const match of text.matchAll(pattern)) {
641
+ const startIdx = (match.index ?? 0) + offset;
642
+ const openParen = startIdx + prefix.length;
643
+ let depth = 1;
644
+ let i = openParen + 1;
645
+ const current = result;
646
+ while (i < current.length && depth > 0) {
647
+ if (current[i] === "(") depth++;
648
+ else if (current[i] === ")") depth--;
649
+ i++;
650
+ }
651
+ if (depth !== 0) continue;
652
+ const innerContent = current.substring(openParen + 1, i - 1);
653
+ const args = this.splitTopLevelArgs(innerContent);
654
+ const replacement = replacer(args);
655
+ if (replacement === null) continue;
656
+ const before = current.substring(0, startIdx);
657
+ const after = current.substring(i);
658
+ result = before + replacement + after;
659
+ offset += replacement.length - (i - startIdx);
660
+ }
661
+ return result;
662
+ }
663
+ /**
664
+ * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
665
+ */
666
+ transformPipeExpressions(text) {
667
+ const pipePattern = /\bv\.pipe\(/g;
668
+ let result = text;
669
+ let offset = 0;
670
+ for (const match of text.matchAll(pipePattern)) {
671
+ const startIdx = (match.index ?? 0) + offset;
672
+ const openParen = startIdx + "v.pipe".length;
673
+ let depth = 1;
674
+ let i = openParen + 1;
675
+ const current = result;
676
+ while (i < current.length && depth > 0) {
677
+ if (current[i] === "(") depth++;
678
+ else if (current[i] === ")") depth--;
679
+ i++;
680
+ }
681
+ if (depth !== 0) continue;
682
+ const innerContent = current.substring(openParen + 1, i - 1);
683
+ const args = this.splitTopLevelArgs(innerContent);
684
+ if (args.length === 0) continue;
685
+ let zodExpr = args[0] ?? "";
686
+ for (let j = 1; j < args.length; j++) {
687
+ const validator = (args[j] ?? "").trim();
688
+ zodExpr = this.convertPipeValidator(zodExpr, validator);
689
+ }
690
+ const before = current.substring(0, startIdx);
691
+ const after = current.substring(i);
692
+ result = before + zodExpr + after;
693
+ offset += zodExpr.length - (i - startIdx);
694
+ }
695
+ return result;
696
+ }
697
+ /**
698
+ * Split arguments at top-level commas (not inside nested parens).
699
+ */
700
+ splitTopLevelArgs(text) {
701
+ const args = [];
702
+ let depth = 0;
703
+ let current = "";
704
+ for (const char of text) {
705
+ if (char === "(" || char === "[" || char === "{") depth++;
706
+ else if (char === ")" || char === "]" || char === "}") depth--;
707
+ if (char === "," && depth === 0) {
708
+ args.push(current.trim());
709
+ current = "";
710
+ } else {
711
+ current += char;
712
+ }
713
+ }
714
+ if (current.trim()) {
715
+ args.push(current.trim());
716
+ }
717
+ return args;
718
+ }
719
+ convertPipeValidator(base, validator) {
720
+ for (const [valibotFn, zodMethod] of Object.entries(PIPE_TO_CHAIN)) {
721
+ const fnCall = `${valibotFn}(`;
722
+ if (validator.startsWith(fnCall)) {
723
+ const argsStr = validator.substring(fnCall.length, validator.length - 1);
724
+ return argsStr ? `${base}${zodMethod}(${argsStr})` : `${base}${zodMethod}()`;
725
+ }
726
+ if (validator === `${valibotFn}()`) {
727
+ return `${base}${zodMethod}()`;
728
+ }
729
+ }
730
+ if (validator.startsWith("v.transform(")) {
731
+ const args = validator.substring("v.transform(".length, validator.length - 1);
732
+ return `${base}.transform(${args})`;
733
+ }
734
+ if (validator.startsWith("v.check(")) {
735
+ const args = validator.substring("v.check(".length, validator.length - 1);
736
+ return `${base}.refine(${args})`;
737
+ }
738
+ if (validator.startsWith("v.brand(")) {
739
+ const args = validator.substring("v.brand(".length, validator.length - 1);
740
+ return `${base}.brand(${args})`;
741
+ }
742
+ this.warnings.push(`Unknown Valibot pipe validator: ${validator} \u2014 kept as-is`);
743
+ return `${base} /* TODO(schemashift): convert ${validator} */`;
744
+ }
745
+ transformFactories(text) {
746
+ for (const [valibotFactory, zodFactory] of Object.entries(VALIBOT_TO_ZOD_FACTORY)) {
747
+ const escaped = valibotFactory.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
748
+ const regex = new RegExp(`\\b${escaped}\\(`, "g");
749
+ text = text.replace(regex, `${zodFactory}(`);
750
+ }
751
+ return text;
752
+ }
753
+ };
754
+
755
+ // src/valibot-to-zod-handler.ts
756
+ function createValibotToZodHandler() {
757
+ const transformer = new ValibotToZodTransformer();
758
+ return {
759
+ transform(sourceFile, _options) {
760
+ return transformer.transform(sourceFile);
761
+ }
762
+ };
763
+ }
475
764
  // Annotate the CommonJS export names for ESM import in node:
476
765
  0 && (module.exports = {
477
766
  FACTORY_MAPPINGS,
@@ -479,7 +768,9 @@ function createZodToValibotHandler() {
479
768
  NUMBER_VALIDATION_MAPPINGS,
480
769
  OBJECT_METHODS,
481
770
  VALIDATION_MAPPINGS,
771
+ ValibotToZodTransformer,
482
772
  ZodToValibotTransformer,
773
+ createValibotToZodHandler,
483
774
  createZodToValibotHandler
484
775
  });
485
776
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/transformer.ts","../src/mappings.ts","../src/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';\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"],"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 { 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"]}
package/dist/index.d.cts CHANGED
@@ -55,4 +55,52 @@ declare class ZodToValibotTransformer {
55
55
  private transformCallChainFallback;
56
56
  }
57
57
 
58
- export { FACTORY_MAPPINGS, MODIFIER_METHODS, NUMBER_VALIDATION_MAPPINGS, OBJECT_METHODS, VALIDATION_MAPPINGS, ZodToValibotTransformer, createZodToValibotHandler };
58
+ declare function createValibotToZodHandler(): TransformHandler;
59
+
60
+ /**
61
+ * Valibot → Zod transformer.
62
+ *
63
+ * Converts Valibot's pipe-based API back to Zod's fluent method chain API.
64
+ *
65
+ * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))
66
+ * Zod: z.string().email().min(5).max(100)
67
+ *
68
+ * Valibot: v.optional(v.string())
69
+ * Zod: z.string().optional()
70
+ *
71
+ * Valibot: v.partial(v.object({ name: v.string() }))
72
+ * Zod: z.object({ name: z.string() }).partial()
73
+ */
74
+ declare class ValibotToZodTransformer {
75
+ private errors;
76
+ private warnings;
77
+ transform(sourceFile: SourceFile): TransformResult;
78
+ private transformImports;
79
+ private transformTypeHelpers;
80
+ /**
81
+ * Transform Valibot wrapper functions to Zod method chains.
82
+ * v.optional(schema) → schema.optional()
83
+ * v.nullable(schema) → schema.nullable()
84
+ * v.nullish(schema) → schema.nullish()
85
+ * v.readonly(schema) → schema.readonly()
86
+ * v.partial(schema) → schema.partial()
87
+ * v.required(schema) → schema.required()
88
+ */
89
+ private transformWrappers;
90
+ /**
91
+ * Replace wrapper calls using balanced parenthesis matching.
92
+ */
93
+ private replaceWrapperCall;
94
+ /**
95
+ * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
96
+ */
97
+ private transformPipeExpressions;
98
+ /**
99
+ * Split arguments at top-level commas (not inside nested parens).
100
+ */
101
+ private splitTopLevelArgs;
102
+ private convertPipeValidator;
103
+ private transformFactories;
104
+ }
105
+
106
+ export { FACTORY_MAPPINGS, MODIFIER_METHODS, NUMBER_VALIDATION_MAPPINGS, OBJECT_METHODS, VALIDATION_MAPPINGS, ValibotToZodTransformer, ZodToValibotTransformer, createValibotToZodHandler, createZodToValibotHandler };
package/dist/index.d.ts CHANGED
@@ -55,4 +55,52 @@ declare class ZodToValibotTransformer {
55
55
  private transformCallChainFallback;
56
56
  }
57
57
 
58
- export { FACTORY_MAPPINGS, MODIFIER_METHODS, NUMBER_VALIDATION_MAPPINGS, OBJECT_METHODS, VALIDATION_MAPPINGS, ZodToValibotTransformer, createZodToValibotHandler };
58
+ declare function createValibotToZodHandler(): TransformHandler;
59
+
60
+ /**
61
+ * Valibot → Zod transformer.
62
+ *
63
+ * Converts Valibot's pipe-based API back to Zod's fluent method chain API.
64
+ *
65
+ * Valibot: v.pipe(v.string(), v.email(), v.minLength(5), v.maxLength(100))
66
+ * Zod: z.string().email().min(5).max(100)
67
+ *
68
+ * Valibot: v.optional(v.string())
69
+ * Zod: z.string().optional()
70
+ *
71
+ * Valibot: v.partial(v.object({ name: v.string() }))
72
+ * Zod: z.object({ name: z.string() }).partial()
73
+ */
74
+ declare class ValibotToZodTransformer {
75
+ private errors;
76
+ private warnings;
77
+ transform(sourceFile: SourceFile): TransformResult;
78
+ private transformImports;
79
+ private transformTypeHelpers;
80
+ /**
81
+ * Transform Valibot wrapper functions to Zod method chains.
82
+ * v.optional(schema) → schema.optional()
83
+ * v.nullable(schema) → schema.nullable()
84
+ * v.nullish(schema) → schema.nullish()
85
+ * v.readonly(schema) → schema.readonly()
86
+ * v.partial(schema) → schema.partial()
87
+ * v.required(schema) → schema.required()
88
+ */
89
+ private transformWrappers;
90
+ /**
91
+ * Replace wrapper calls using balanced parenthesis matching.
92
+ */
93
+ private replaceWrapperCall;
94
+ /**
95
+ * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
96
+ */
97
+ private transformPipeExpressions;
98
+ /**
99
+ * Split arguments at top-level commas (not inside nested parens).
100
+ */
101
+ private splitTopLevelArgs;
102
+ private convertPipeValidator;
103
+ private transformFactories;
104
+ }
105
+
106
+ export { FACTORY_MAPPINGS, MODIFIER_METHODS, NUMBER_VALIDATION_MAPPINGS, OBJECT_METHODS, VALIDATION_MAPPINGS, ValibotToZodTransformer, ZodToValibotTransformer, createValibotToZodHandler, createZodToValibotHandler };
package/dist/index.js CHANGED
@@ -443,13 +443,302 @@ function createZodToValibotHandler() {
443
443
  }
444
444
  };
445
445
  }
446
+
447
+ // src/valibot-to-zod-transformer.ts
448
+ var VALIBOT_TO_ZOD_FACTORY = {
449
+ "v.string": "z.string",
450
+ "v.number": "z.number",
451
+ "v.boolean": "z.boolean",
452
+ "v.date": "z.date",
453
+ "v.bigint": "z.bigint",
454
+ "v.symbol": "z.symbol",
455
+ "v.undefined_": "z.undefined",
456
+ "v.null_": "z.null",
457
+ "v.void_": "z.void",
458
+ "v.any": "z.any",
459
+ "v.unknown": "z.unknown",
460
+ "v.never": "z.never",
461
+ "v.nan": "z.nan",
462
+ "v.literal": "z.literal",
463
+ "v.picklist": "z.enum",
464
+ "v.enum_": "z.nativeEnum",
465
+ "v.array": "z.array",
466
+ "v.object": "z.object",
467
+ "v.record": "z.record",
468
+ "v.tuple": "z.tuple",
469
+ "v.union": "z.union",
470
+ "v.variant": "z.discriminatedUnion",
471
+ "v.intersect": "z.intersection",
472
+ "v.lazy": "z.lazy",
473
+ "v.promise": "z.promise",
474
+ "v.instance": "z.instanceof"
475
+ };
476
+ var PIPE_TO_CHAIN = {
477
+ "v.email": ".email",
478
+ "v.url": ".url",
479
+ "v.uuid": ".uuid",
480
+ "v.cuid2": ".cuid2",
481
+ "v.ulid": ".ulid",
482
+ "v.regex": ".regex",
483
+ "v.ip": ".ip",
484
+ "v.isoDateTime": ".datetime",
485
+ "v.isoDate": ".date",
486
+ "v.isoTime": ".time",
487
+ "v.emoji": ".emoji",
488
+ "v.includes": ".includes",
489
+ "v.startsWith": ".startsWith",
490
+ "v.endsWith": ".endsWith",
491
+ "v.trim": ".trim",
492
+ "v.toLowerCase": ".toLowerCase",
493
+ "v.toUpperCase": ".toUpperCase",
494
+ "v.minLength": ".min",
495
+ "v.maxLength": ".max",
496
+ "v.length": ".length",
497
+ "v.minValue": ".min",
498
+ "v.maxValue": ".max",
499
+ "v.integer": ".int",
500
+ "v.finite": ".finite",
501
+ "v.safeInteger": ".safe",
502
+ "v.multipleOf": ".multipleOf",
503
+ "v.nonEmpty": ".nonempty"
504
+ };
505
+ var ValibotToZodTransformer = class {
506
+ errors = [];
507
+ warnings = [];
508
+ transform(sourceFile) {
509
+ this.errors = [];
510
+ this.warnings = [];
511
+ const filePath = sourceFile.getFilePath();
512
+ const originalCode = sourceFile.getFullText();
513
+ try {
514
+ let text = originalCode;
515
+ text = this.transformImports(text);
516
+ text = this.transformTypeHelpers(text);
517
+ text = this.transformWrappers(text);
518
+ text = this.transformPipeExpressions(text);
519
+ text = this.transformFactories(text);
520
+ sourceFile.replaceWithText(text);
521
+ return {
522
+ success: this.errors.length === 0,
523
+ filePath,
524
+ originalCode,
525
+ transformedCode: sourceFile.getFullText(),
526
+ errors: this.errors,
527
+ warnings: this.warnings
528
+ };
529
+ } catch (error) {
530
+ this.errors.push({
531
+ message: error instanceof Error ? error.message : "Unknown error"
532
+ });
533
+ return {
534
+ success: false,
535
+ filePath,
536
+ originalCode,
537
+ errors: this.errors,
538
+ warnings: this.warnings
539
+ };
540
+ }
541
+ }
542
+ transformImports(text) {
543
+ text = text.replace(
544
+ /import\s+\*\s+as\s+v\s+from\s+['"]valibot['"]/g,
545
+ "import { z } from 'zod'"
546
+ );
547
+ text = text.replace(/import\s+\{[^}]*\}\s+from\s+['"]valibot['"]/g, "import { z } from 'zod'");
548
+ return text;
549
+ }
550
+ transformTypeHelpers(text) {
551
+ text = text.replace(/\bv\.InferOutput</g, "z.infer<");
552
+ text = text.replace(/\bv\.InferInput</g, "z.input<");
553
+ return text;
554
+ }
555
+ /**
556
+ * Transform Valibot wrapper functions to Zod method chains.
557
+ * v.optional(schema) → schema.optional()
558
+ * v.nullable(schema) → schema.nullable()
559
+ * v.nullish(schema) → schema.nullish()
560
+ * v.readonly(schema) → schema.readonly()
561
+ * v.partial(schema) → schema.partial()
562
+ * v.required(schema) → schema.required()
563
+ */
564
+ transformWrappers(text) {
565
+ const twoArgWrappers = [
566
+ {
567
+ prefix: "v.optional",
568
+ transform: (schema, value) => `${schema}.default(${value})`
569
+ },
570
+ {
571
+ prefix: "v.fallback",
572
+ transform: (schema, value) => `${schema}.catch(${value})`
573
+ }
574
+ ];
575
+ const singleArgWrappers = [
576
+ { prefix: "v.optional", suffix: ".optional()" },
577
+ { prefix: "v.nullable", suffix: ".nullable()" },
578
+ { prefix: "v.nullish", suffix: ".nullish()" },
579
+ { prefix: "v.readonly", suffix: ".readonly()" },
580
+ { prefix: "v.partial", suffix: ".partial()" },
581
+ { prefix: "v.required", suffix: ".required()" },
582
+ { prefix: "v.strict", suffix: ".strict()" }
583
+ ];
584
+ for (const { prefix, transform } of twoArgWrappers) {
585
+ text = this.replaceWrapperCall(text, prefix, (args) => {
586
+ if (args.length >= 2) {
587
+ return transform(args[0] ?? "", args[1] ?? "");
588
+ }
589
+ return null;
590
+ });
591
+ }
592
+ for (const { prefix, suffix } of singleArgWrappers) {
593
+ text = this.replaceWrapperCall(text, prefix, (args) => {
594
+ if (args.length === 1) {
595
+ return `${args[0] ?? ""}${suffix}`;
596
+ }
597
+ return null;
598
+ });
599
+ }
600
+ return text;
601
+ }
602
+ /**
603
+ * Replace wrapper calls using balanced parenthesis matching.
604
+ */
605
+ replaceWrapperCall(text, prefix, replacer) {
606
+ const pattern = new RegExp(`\\b${prefix.replace(".", "\\.")}\\(`, "g");
607
+ let result = text;
608
+ let offset = 0;
609
+ for (const match of text.matchAll(pattern)) {
610
+ const startIdx = (match.index ?? 0) + offset;
611
+ const openParen = startIdx + prefix.length;
612
+ let depth = 1;
613
+ let i = openParen + 1;
614
+ const current = result;
615
+ while (i < current.length && depth > 0) {
616
+ if (current[i] === "(") depth++;
617
+ else if (current[i] === ")") depth--;
618
+ i++;
619
+ }
620
+ if (depth !== 0) continue;
621
+ const innerContent = current.substring(openParen + 1, i - 1);
622
+ const args = this.splitTopLevelArgs(innerContent);
623
+ const replacement = replacer(args);
624
+ if (replacement === null) continue;
625
+ const before = current.substring(0, startIdx);
626
+ const after = current.substring(i);
627
+ result = before + replacement + after;
628
+ offset += replacement.length - (i - startIdx);
629
+ }
630
+ return result;
631
+ }
632
+ /**
633
+ * Transform v.pipe(factory, ...validators) to factory.validator1().validator2()
634
+ */
635
+ transformPipeExpressions(text) {
636
+ const pipePattern = /\bv\.pipe\(/g;
637
+ let result = text;
638
+ let offset = 0;
639
+ for (const match of text.matchAll(pipePattern)) {
640
+ const startIdx = (match.index ?? 0) + offset;
641
+ const openParen = startIdx + "v.pipe".length;
642
+ let depth = 1;
643
+ let i = openParen + 1;
644
+ const current = result;
645
+ while (i < current.length && depth > 0) {
646
+ if (current[i] === "(") depth++;
647
+ else if (current[i] === ")") depth--;
648
+ i++;
649
+ }
650
+ if (depth !== 0) continue;
651
+ const innerContent = current.substring(openParen + 1, i - 1);
652
+ const args = this.splitTopLevelArgs(innerContent);
653
+ if (args.length === 0) continue;
654
+ let zodExpr = args[0] ?? "";
655
+ for (let j = 1; j < args.length; j++) {
656
+ const validator = (args[j] ?? "").trim();
657
+ zodExpr = this.convertPipeValidator(zodExpr, validator);
658
+ }
659
+ const before = current.substring(0, startIdx);
660
+ const after = current.substring(i);
661
+ result = before + zodExpr + after;
662
+ offset += zodExpr.length - (i - startIdx);
663
+ }
664
+ return result;
665
+ }
666
+ /**
667
+ * Split arguments at top-level commas (not inside nested parens).
668
+ */
669
+ splitTopLevelArgs(text) {
670
+ const args = [];
671
+ let depth = 0;
672
+ let current = "";
673
+ for (const char of text) {
674
+ if (char === "(" || char === "[" || char === "{") depth++;
675
+ else if (char === ")" || char === "]" || char === "}") depth--;
676
+ if (char === "," && depth === 0) {
677
+ args.push(current.trim());
678
+ current = "";
679
+ } else {
680
+ current += char;
681
+ }
682
+ }
683
+ if (current.trim()) {
684
+ args.push(current.trim());
685
+ }
686
+ return args;
687
+ }
688
+ convertPipeValidator(base, validator) {
689
+ for (const [valibotFn, zodMethod] of Object.entries(PIPE_TO_CHAIN)) {
690
+ const fnCall = `${valibotFn}(`;
691
+ if (validator.startsWith(fnCall)) {
692
+ const argsStr = validator.substring(fnCall.length, validator.length - 1);
693
+ return argsStr ? `${base}${zodMethod}(${argsStr})` : `${base}${zodMethod}()`;
694
+ }
695
+ if (validator === `${valibotFn}()`) {
696
+ return `${base}${zodMethod}()`;
697
+ }
698
+ }
699
+ if (validator.startsWith("v.transform(")) {
700
+ const args = validator.substring("v.transform(".length, validator.length - 1);
701
+ return `${base}.transform(${args})`;
702
+ }
703
+ if (validator.startsWith("v.check(")) {
704
+ const args = validator.substring("v.check(".length, validator.length - 1);
705
+ return `${base}.refine(${args})`;
706
+ }
707
+ if (validator.startsWith("v.brand(")) {
708
+ const args = validator.substring("v.brand(".length, validator.length - 1);
709
+ return `${base}.brand(${args})`;
710
+ }
711
+ this.warnings.push(`Unknown Valibot pipe validator: ${validator} \u2014 kept as-is`);
712
+ return `${base} /* TODO(schemashift): convert ${validator} */`;
713
+ }
714
+ transformFactories(text) {
715
+ for (const [valibotFactory, zodFactory] of Object.entries(VALIBOT_TO_ZOD_FACTORY)) {
716
+ const escaped = valibotFactory.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
717
+ const regex = new RegExp(`\\b${escaped}\\(`, "g");
718
+ text = text.replace(regex, `${zodFactory}(`);
719
+ }
720
+ return text;
721
+ }
722
+ };
723
+
724
+ // src/valibot-to-zod-handler.ts
725
+ function createValibotToZodHandler() {
726
+ const transformer = new ValibotToZodTransformer();
727
+ return {
728
+ transform(sourceFile, _options) {
729
+ return transformer.transform(sourceFile);
730
+ }
731
+ };
732
+ }
446
733
  export {
447
734
  FACTORY_MAPPINGS,
448
735
  MODIFIER_METHODS,
449
736
  NUMBER_VALIDATION_MAPPINGS,
450
737
  OBJECT_METHODS,
451
738
  VALIDATION_MAPPINGS,
739
+ ValibotToZodTransformer,
452
740
  ZodToValibotTransformer,
741
+ createValibotToZodHandler,
453
742
  createZodToValibotHandler
454
743
  };
455
744
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/transformer.ts","../src/mappings.ts","../src/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"],"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 { 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":";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;;;ACJA,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;AAgBO,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;AAEF,UAAI,OAAO;AAEX,aAAO,KAAK,iBAAiB,IAAI;AACjC,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,EAEQ,iBAAiB,MAAsB;AAE7C,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,IACF;AACA,WAAO,KAAK,QAAQ,gDAAgD,yBAAyB;AAC7F,WAAO;AAAA,EACT;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,EAKQ,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,YAAY,MAAM,SAAS,KAAK;AACtC,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,EAKQ,yBAAyB,MAAsB;AAErD,UAAM,cAAc;AACpB,QAAI,SAAS;AACb,QAAI,SAAS;AAEb,eAAW,SAAS,KAAK,SAAS,WAAW,GAAG;AAC9C,YAAM,YAAY,MAAM,SAAS,KAAK;AACtC,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;;;ACtWO,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.8.0",
3
+ "version": "0.9.0",
4
4
  "description": "Zod to Valibot transformer for SchemaShift — converts fluent chain API to pipe-based API",
5
5
  "keywords": [
6
6
  "zod",
@@ -37,7 +37,7 @@
37
37
  "typecheck": "tsc --noEmit"
38
38
  },
39
39
  "dependencies": {
40
- "@schemashift/core": "0.8.0",
40
+ "@schemashift/core": "0.9.0",
41
41
  "ts-morph": "27.0.2"
42
42
  },
43
43
  "publishConfig": {