@schemashift/zod-superstruct 0.10.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 ADDED
@@ -0,0 +1,114 @@
1
+ # @schemashift/zod-superstruct
2
+
3
+ Zod ↔ Superstruct transformer for SchemaShift. Supports both forward (Zod → Superstruct) and backward (Superstruct → Zod) migrations.
4
+
5
+ **Tier:** Pro+
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @schemashift/zod-superstruct
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ ```typescript
16
+ import { createZodToSuperstructHandler, createSuperstructToZodHandler } from '@schemashift/zod-superstruct';
17
+ import { TransformEngine } from '@schemashift/core';
18
+
19
+ const engine = new TransformEngine();
20
+ engine.registerHandler('zod', 'superstruct', createZodToSuperstructHandler());
21
+ engine.registerHandler('superstruct', 'zod', createSuperstructToZodHandler()); // Backward migration (Pro+)
22
+ ```
23
+
24
+ ## API Paradigm Difference
25
+
26
+ Zod uses a **namespaced chain** API:
27
+
28
+ ```typescript
29
+ z.object({ name: z.string().email(), age: z.number().int() })
30
+ ```
31
+
32
+ Superstruct uses **bare function** imports:
33
+
34
+ ```typescript
35
+ object({ name: refine(string(), "email", ...), age: integer() })
36
+ ```
37
+
38
+ ## Transformation Mappings
39
+
40
+ ### Imports
41
+
42
+ | Zod | Superstruct |
43
+ |-----|-------------|
44
+ | `import { z } from 'zod'` | `import { object, string, ... } from 'superstruct'` |
45
+
46
+ ### Factory Methods
47
+
48
+ | Zod | Superstruct |
49
+ |-----|-------------|
50
+ | `z.string()` | `string()` |
51
+ | `z.number()` | `number()` |
52
+ | `z.boolean()` | `boolean()` |
53
+ | `z.date()` | `date()` |
54
+ | `z.bigint()` | `bigint()` |
55
+ | `z.any()` | `any()` |
56
+ | `z.unknown()` | `unknown()` |
57
+ | `z.never()` | `never()` |
58
+ | `z.object({...})` | `object({...})` |
59
+ | `z.array(s)` | `array(s)` |
60
+ | `z.enum(["a", "b"])` | `enums(["a", "b"])` |
61
+ | `z.literal(42)` | `literal(42)` |
62
+ | `z.union([a, b])` | `union([a, b])` |
63
+ | `z.record(k, v)` | `record(k, v)` |
64
+ | `z.tuple([a, b])` | `tuple([a, b])` |
65
+ | `z.number().int()` | `integer()` |
66
+
67
+ ### Modifiers
68
+
69
+ | Zod | Superstruct |
70
+ |-----|-------------|
71
+ | `.optional()` | `optional(X)` |
72
+ | `.nullable()` | `nullable(X)` |
73
+
74
+ ### Type Helpers
75
+
76
+ | Zod | Superstruct |
77
+ |-----|-------------|
78
+ | `z.infer<typeof s>` | `Infer<typeof s>` |
79
+
80
+ ## Patterns Requiring Manual Review
81
+
82
+ ### `.discriminatedUnion()`
83
+
84
+ Superstruct has no discriminatedUnion. Use `union()` with explicit struct variants.
85
+
86
+ ### `.transform()` / `.preprocess()`
87
+
88
+ Superstruct uses `coerce()` for transforms:
89
+
90
+ ```typescript
91
+ // Zod
92
+ z.string().transform((s) => s.toUpperCase());
93
+
94
+ // Superstruct
95
+ coerce(string(), string(), (s) => s.toUpperCase());
96
+ ```
97
+
98
+ ### `define()` (Custom Validators)
99
+
100
+ ```typescript
101
+ // Superstruct
102
+ const Email = define('email', (v) => typeof v === 'string' && v.includes('@'));
103
+
104
+ // Zod
105
+ const Email = z.string().refine((v) => v.includes('@'));
106
+ ```
107
+
108
+ ### `.brand()`
109
+
110
+ Superstruct has no `.brand()` equivalent. Use `define()` with a branded type.
111
+
112
+ ## License
113
+
114
+ MIT
package/dist/index.cjs ADDED
@@ -0,0 +1,420 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ IMPORT_MAPPINGS: () => IMPORT_MAPPINGS,
24
+ MANUAL_REVIEW_PATTERNS: () => MANUAL_REVIEW_PATTERNS,
25
+ SUPERSTRUCT_REFINEMENT_TO_ZOD: () => SUPERSTRUCT_REFINEMENT_TO_ZOD,
26
+ SUPERSTRUCT_TO_ZOD_FACTORIES: () => SUPERSTRUCT_TO_ZOD_FACTORIES,
27
+ ZOD_TO_SUPERSTRUCT_FACTORIES: () => ZOD_TO_SUPERSTRUCT_FACTORIES,
28
+ ZOD_VALIDATION_TO_SUPERSTRUCT: () => ZOD_VALIDATION_TO_SUPERSTRUCT,
29
+ createSuperstructToZodHandler: () => createSuperstructToZodHandler,
30
+ createZodToSuperstructHandler: () => createZodToSuperstructHandler
31
+ });
32
+ module.exports = __toCommonJS(index_exports);
33
+
34
+ // src/mappings.ts
35
+ var ZOD_TO_SUPERSTRUCT_FACTORIES = {
36
+ "z.string()": "string()",
37
+ "z.number()": "number()",
38
+ "z.boolean()": "boolean()",
39
+ "z.date()": "date()",
40
+ "z.any()": "any()",
41
+ "z.unknown()": "unknown()",
42
+ "z.never()": "never()",
43
+ "z.bigint()": "bigint()",
44
+ "z.undefined()": "literal(undefined)",
45
+ "z.null()": "literal(null)",
46
+ "z.void()": "literal(undefined)",
47
+ "z.nan()": 'define("nan", (v) => Number.isNaN(v))'
48
+ };
49
+ var SUPERSTRUCT_TO_ZOD_FACTORIES = {
50
+ "string()": "z.string()",
51
+ "number()": "z.number()",
52
+ "boolean()": "z.boolean()",
53
+ "date()": "z.date()",
54
+ "any()": "z.any()",
55
+ "unknown()": "z.unknown()",
56
+ "never()": "z.never()",
57
+ "bigint()": "z.bigint()",
58
+ "integer()": "z.number().int()",
59
+ "func()": "z.function()",
60
+ "instance(Date)": "z.date()",
61
+ "instance(RegExp)": "z.instanceof(RegExp)"
62
+ };
63
+ var ZOD_VALIDATION_TO_SUPERSTRUCT = {
64
+ email: "pattern(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)",
65
+ url: "pattern(/^https?:\\/\\/.+/)",
66
+ uuid: "pattern(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)",
67
+ ip: "pattern(/^(?:\\d{1,3}\\.){3}\\d{1,3}$/)",
68
+ int: 'refine("integer", (v) => Number.isInteger(v))'
69
+ };
70
+ var SUPERSTRUCT_REFINEMENT_TO_ZOD = {
71
+ "size(string(), 1, Infinity)": "z.string().min(1)",
72
+ "nonempty(string())": "z.string().min(1)",
73
+ "nonempty(array())": "z.array().min(1)"
74
+ };
75
+ var IMPORT_MAPPINGS = {
76
+ zodToSuperstruct: {
77
+ from: "zod",
78
+ to: "superstruct",
79
+ zodImport: "z",
80
+ superstructImports: [
81
+ "object",
82
+ "string",
83
+ "number",
84
+ "boolean",
85
+ "date",
86
+ "array",
87
+ "optional",
88
+ "nullable",
89
+ "union",
90
+ "literal",
91
+ "enums",
92
+ "record",
93
+ "tuple",
94
+ "any",
95
+ "unknown",
96
+ "never",
97
+ "define",
98
+ "refine",
99
+ "coerce",
100
+ "bigint",
101
+ "type",
102
+ "assign",
103
+ "size",
104
+ "pattern",
105
+ "integer"
106
+ ]
107
+ },
108
+ superstructToZod: {
109
+ from: "superstruct",
110
+ to: "zod",
111
+ zodImport: "z"
112
+ }
113
+ };
114
+ var MANUAL_REVIEW_PATTERNS = [
115
+ "discriminatedUnion",
116
+ "superRefine",
117
+ "transform",
118
+ "preprocess",
119
+ "lazy",
120
+ "brand",
121
+ "catch",
122
+ "pipe",
123
+ "define",
124
+ "coerce",
125
+ "mask",
126
+ "create",
127
+ "assert",
128
+ "is"
129
+ ];
130
+
131
+ // src/superstruct-to-zod-transformer.ts
132
+ var SuperstructToZodTransformer = class {
133
+ errors = [];
134
+ warnings = [];
135
+ transform(sourceFile) {
136
+ this.errors = [];
137
+ this.warnings = [];
138
+ const filePath = sourceFile.getFilePath();
139
+ const originalCode = sourceFile.getFullText();
140
+ try {
141
+ let text = originalCode;
142
+ text = this.rewriteImports(text, filePath);
143
+ text = this.transformStructs(text, filePath);
144
+ text = this.transformTypeHelpers(text);
145
+ sourceFile.replaceWithText(text);
146
+ return {
147
+ success: this.errors.length === 0,
148
+ filePath,
149
+ originalCode,
150
+ transformedCode: sourceFile.getFullText(),
151
+ errors: this.errors,
152
+ warnings: this.warnings
153
+ };
154
+ } catch (error) {
155
+ this.errors.push({
156
+ message: error instanceof Error ? error.message : "Unknown error"
157
+ });
158
+ return {
159
+ success: false,
160
+ filePath,
161
+ originalCode,
162
+ errors: this.errors,
163
+ warnings: this.warnings
164
+ };
165
+ }
166
+ }
167
+ rewriteImports(text, filePath) {
168
+ text = text.replace(
169
+ /import\s*\{[^}]+\}\s*from\s*['"]superstruct['"]/g,
170
+ "import { z } from 'zod'"
171
+ );
172
+ text = text.replace(
173
+ /import\s+type\s*\{[^}]+\}\s*from\s*['"]superstruct['"]/g,
174
+ "import type { z } from 'zod'"
175
+ );
176
+ if (text.includes("define(")) {
177
+ this.warnings.push(
178
+ `${filePath}: Superstruct define() should be converted to z.custom() or z.refine().`
179
+ );
180
+ }
181
+ if (text.includes("coerce(")) {
182
+ this.warnings.push(
183
+ `${filePath}: Superstruct coerce() should be converted to z.preprocess() or z.coerce.*.`
184
+ );
185
+ }
186
+ if (text.includes("mask(")) {
187
+ this.warnings.push(
188
+ `${filePath}: Superstruct mask() (strip unknown keys) maps to z.object().strip() in Zod.`
189
+ );
190
+ }
191
+ return text;
192
+ }
193
+ transformStructs(text, filePath) {
194
+ for (const [ssFactory, zodFactory] of Object.entries(SUPERSTRUCT_TO_ZOD_FACTORIES)) {
195
+ const fnName = ssFactory.match(/^(\w+)\(/)?.[1];
196
+ if (fnName) {
197
+ const pattern = new RegExp(`(?<!\\.)\\b${this.escapeRegex(ssFactory)}`, "g");
198
+ text = text.replace(pattern, zodFactory);
199
+ }
200
+ }
201
+ text = text.replace(/(?<!\.)(?<!\w)\bobject\(/g, "z.object(");
202
+ text = text.replace(/(?<!\.)(?<!\w)\barray\(/g, "z.array(");
203
+ text = text.replace(/\boptional\(z\.(\w+)\(\)\)/g, "z.$1().optional()");
204
+ text = text.replace(/\boptional\((z\.\w+\([^)]*\)(?:\.\w+\([^)]*\))*)\)/g, "$1.optional()");
205
+ text = text.replace(/\bnullable\(z\.(\w+)\(\)\)/g, "z.$1().nullable()");
206
+ text = text.replace(/\bnullable\((z\.\w+\([^)]*\)(?:\.\w+\([^)]*\))*)\)/g, "$1.nullable()");
207
+ text = text.replace(/(?<!\.)(?<!\w)\benums\(/g, "z.enum(");
208
+ text = text.replace(/(?<!\.)(?<!\w)\bliteral\(/g, "z.literal(");
209
+ text = text.replace(/(?<!\.)(?<!\w)\bunion\(/g, "z.union(");
210
+ text = text.replace(/(?<!\.)(?<!\w)\brecord\(/g, "z.record(");
211
+ text = text.replace(/(?<!\.)(?<!\w)\btuple\(/g, "z.tuple(");
212
+ text = text.replace(/(?<!\.)(?<!\w)\binteger\(\)/g, "z.number().int()");
213
+ text = text.replace(/\brefine\((z\.[^,]+),\s*"[^"]*",\s*([^)]+)\)/g, "$1.refine($2)");
214
+ text = text.replace(/\bsize\(z\.string\(\),\s*(\d+),\s*Infinity\)/g, "z.string().min($1)");
215
+ text = text.replace(/\bsize\(z\.string\(\),\s*0,\s*(\d+)\)/g, "z.string().max($1)");
216
+ text = text.replace(/\bsize\(z\.string\(\),\s*(\d+),\s*(\d+)\)/g, "z.string().min($1).max($2)");
217
+ text = text.replace(/\bpattern\(z\.string\(\),\s*([^)]+)\)/g, "z.string().regex($1)");
218
+ if (text.includes("assign(")) {
219
+ this.warnings.push(
220
+ `${filePath}: Superstruct assign() should be converted to .merge() or .extend() in Zod.`
221
+ );
222
+ }
223
+ if (/(?<!\.)(?<!\w)\btype\(/.test(text)) {
224
+ this.warnings.push(
225
+ `${filePath}: Superstruct type() (all-optional object) should be converted to z.object({}).partial() in Zod.`
226
+ );
227
+ text = text.replace(/(?<!\.)(?<!\w)\btype\(\{/g, "z.object({");
228
+ }
229
+ return text;
230
+ }
231
+ transformTypeHelpers(text) {
232
+ text = text.replace(/\bInfer<typeof\s+(\w+)>/g, "z.infer<typeof $1>");
233
+ return text;
234
+ }
235
+ escapeRegex(str) {
236
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
237
+ }
238
+ };
239
+
240
+ // src/superstruct-to-zod-handler.ts
241
+ function createSuperstructToZodHandler() {
242
+ return {
243
+ transform(sourceFile, _options) {
244
+ const transformer = new SuperstructToZodTransformer();
245
+ return transformer.transform(sourceFile);
246
+ }
247
+ };
248
+ }
249
+
250
+ // src/zod-to-superstruct-transformer.ts
251
+ var ZodToSuperstructTransformer = class {
252
+ errors = [];
253
+ warnings = [];
254
+ usedImports = /* @__PURE__ */ new Set();
255
+ transform(sourceFile) {
256
+ this.errors = [];
257
+ this.warnings = [];
258
+ this.usedImports = /* @__PURE__ */ new Set();
259
+ const filePath = sourceFile.getFilePath();
260
+ const originalCode = sourceFile.getFullText();
261
+ try {
262
+ let text = originalCode;
263
+ text = this.transformSchemas(text, filePath);
264
+ text = this.transformTypeHelpers(text);
265
+ text = this.rewriteImports(text);
266
+ this.checkManualReviewPatterns(text, filePath);
267
+ sourceFile.replaceWithText(text);
268
+ return {
269
+ success: this.errors.length === 0,
270
+ filePath,
271
+ originalCode,
272
+ transformedCode: sourceFile.getFullText(),
273
+ errors: this.errors,
274
+ warnings: this.warnings
275
+ };
276
+ } catch (error) {
277
+ this.errors.push({
278
+ message: error instanceof Error ? error.message : "Unknown error"
279
+ });
280
+ return {
281
+ success: false,
282
+ filePath,
283
+ originalCode,
284
+ errors: this.errors,
285
+ warnings: this.warnings
286
+ };
287
+ }
288
+ }
289
+ rewriteImports(text) {
290
+ const imports = [...this.usedImports].sort();
291
+ text = text.replace(
292
+ /import\s*\{[^}]*\bz\b[^}]*\}\s*from\s*['"]zod['"]/g,
293
+ `import { ${imports.join(", ")} } from 'superstruct'`
294
+ );
295
+ text = text.replace(
296
+ /import\s*\*\s*as\s*z\s*from\s*['"]zod['"]/g,
297
+ `import { ${imports.join(", ")} } from 'superstruct'`
298
+ );
299
+ text = text.replace(
300
+ /import\s+type\s*\{[^}]*\}\s*from\s*['"]zod['"]/g,
301
+ `import type { Infer } from 'superstruct'`
302
+ );
303
+ return text;
304
+ }
305
+ transformSchemas(text, filePath) {
306
+ for (const [zodFactory, ssFactory] of Object.entries(ZOD_TO_SUPERSTRUCT_FACTORIES)) {
307
+ if (text.includes(zodFactory)) {
308
+ text = text.replace(new RegExp(this.escapeRegex(zodFactory), "g"), ssFactory);
309
+ const fnName = ssFactory.match(/^(\w+)\(/)?.[1];
310
+ if (fnName) this.usedImports.add(fnName);
311
+ }
312
+ }
313
+ text = text.replace(/\bz\.object\(/g, "object(");
314
+ this.usedImports.add("object");
315
+ text = text.replace(/\bz\.array\(/g, "array(");
316
+ this.usedImports.add("array");
317
+ text = text.replace(/(\w+\([^)]*\))\.optional\(\)/g, "optional($1)");
318
+ this.usedImports.add("optional");
319
+ text = text.replace(/(\w+\([^)]*\))\.nullable\(\)/g, "nullable($1)");
320
+ this.usedImports.add("nullable");
321
+ text = text.replace(/\bz\.enum\(/g, "enums(");
322
+ this.usedImports.add("enums");
323
+ text = text.replace(/\bz\.literal\(/g, "literal(");
324
+ this.usedImports.add("literal");
325
+ text = text.replace(/\bz\.union\(/g, "union(");
326
+ this.usedImports.add("union");
327
+ text = text.replace(/\bz\.record\(/g, "record(");
328
+ this.usedImports.add("record");
329
+ text = text.replace(/\bz\.tuple\(/g, "tuple(");
330
+ this.usedImports.add("tuple");
331
+ for (const [zodMethod, ssReplacement] of Object.entries(ZOD_VALIDATION_TO_SUPERSTRUCT)) {
332
+ const pattern = new RegExp(`string\\(\\)\\.${zodMethod}\\(\\)`, "g");
333
+ if (pattern.test(text)) {
334
+ text = text.replace(
335
+ pattern,
336
+ `${ssReplacement.startsWith("pattern") ? ssReplacement.replace("pattern(", "pattern(string(), ") : ssReplacement.replace("refine(", "refine(string(), ")}`
337
+ );
338
+ const fnName = ssReplacement.match(/^(\w+)\(/)?.[1];
339
+ if (fnName) this.usedImports.add(fnName);
340
+ this.usedImports.add("string");
341
+ }
342
+ }
343
+ text = text.replace(/string\(\)\.min\((\d+)\)/g, (_m, n) => {
344
+ this.usedImports.add("size");
345
+ this.usedImports.add("string");
346
+ return `size(string(), ${n}, Infinity)`;
347
+ });
348
+ text = text.replace(/string\(\)\.max\((\d+)\)/g, (_m, n) => {
349
+ this.usedImports.add("size");
350
+ this.usedImports.add("string");
351
+ return `size(string(), 0, ${n})`;
352
+ });
353
+ text = text.replace(/number\(\)\.int\(\)/g, "integer()");
354
+ this.usedImports.add("integer");
355
+ text = text.replace(/(\w+\([^)]*\))\.refine\(([^)]+)\)/g, (_m, schema, fn) => {
356
+ this.usedImports.add("refine");
357
+ return `refine(${schema}, "custom", ${fn})`;
358
+ });
359
+ if (/\bz\./.test(text)) {
360
+ this.warnings.push(
361
+ `${filePath}: Some Zod patterns could not be auto-transformed to Superstruct. Look for remaining z.* references and convert manually.`
362
+ );
363
+ }
364
+ return text;
365
+ }
366
+ transformTypeHelpers(text) {
367
+ text = text.replace(/z\.infer<typeof\s+(\w+)>/g, "Infer<typeof $1>");
368
+ text = text.replace(/z\.input<typeof\s+(\w+)>/g, "Infer<typeof $1>");
369
+ text = text.replace(/z\.output<typeof\s+(\w+)>/g, "Infer<typeof $1>");
370
+ return text;
371
+ }
372
+ checkManualReviewPatterns(text, filePath) {
373
+ for (const pattern of MANUAL_REVIEW_PATTERNS) {
374
+ if (text.includes(`.${pattern}(`) || text.includes(`z.${pattern}(`)) {
375
+ const guidance = this.getManualGuidance(pattern);
376
+ this.warnings.push(
377
+ `${filePath}: .${pattern}() requires manual conversion to Superstruct. ${guidance}`
378
+ );
379
+ }
380
+ }
381
+ }
382
+ getManualGuidance(pattern) {
383
+ const guidance = {
384
+ discriminatedUnion: "Superstruct has no discriminatedUnion. Use union() with explicit struct variants.",
385
+ superRefine: 'Use define() for custom validation: define("name", (value) => { ... }).',
386
+ transform: "Use coerce() for transforms: coerce(target, source, (value) => transformed).",
387
+ preprocess: "Use coerce() for preprocessing: coerce(target, source, (value) => preprocessed).",
388
+ lazy: "Use lazy() from superstruct for recursive types: lazy(() => myStruct).",
389
+ brand: "Superstruct has no brand() equivalent. Use define() with a branded type.",
390
+ catch: "Superstruct has no catch() equivalent. Handle defaults at the application level.",
391
+ pipe: "Superstruct has no pipe() equivalent. Use coerce() or define() instead."
392
+ };
393
+ return guidance[pattern] || "See Superstruct documentation for equivalent pattern.";
394
+ }
395
+ escapeRegex(str) {
396
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
397
+ }
398
+ };
399
+
400
+ // src/zod-to-superstruct-handler.ts
401
+ function createZodToSuperstructHandler() {
402
+ return {
403
+ transform(sourceFile, _options) {
404
+ const transformer = new ZodToSuperstructTransformer();
405
+ return transformer.transform(sourceFile);
406
+ }
407
+ };
408
+ }
409
+ // Annotate the CommonJS export names for ESM import in node:
410
+ 0 && (module.exports = {
411
+ IMPORT_MAPPINGS,
412
+ MANUAL_REVIEW_PATTERNS,
413
+ SUPERSTRUCT_REFINEMENT_TO_ZOD,
414
+ SUPERSTRUCT_TO_ZOD_FACTORIES,
415
+ ZOD_TO_SUPERSTRUCT_FACTORIES,
416
+ ZOD_VALIDATION_TO_SUPERSTRUCT,
417
+ createSuperstructToZodHandler,
418
+ createZodToSuperstructHandler
419
+ });
420
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/mappings.ts","../src/superstruct-to-zod-transformer.ts","../src/superstruct-to-zod-handler.ts","../src/zod-to-superstruct-transformer.ts","../src/zod-to-superstruct-handler.ts"],"sourcesContent":["export {\n IMPORT_MAPPINGS,\n MANUAL_REVIEW_PATTERNS,\n SUPERSTRUCT_REFINEMENT_TO_ZOD,\n SUPERSTRUCT_TO_ZOD_FACTORIES,\n ZOD_TO_SUPERSTRUCT_FACTORIES,\n ZOD_VALIDATION_TO_SUPERSTRUCT,\n} from './mappings.js';\nexport { createSuperstructToZodHandler } from './superstruct-to-zod-handler.js';\nexport { createZodToSuperstructHandler } from './zod-to-superstruct-handler.js';\n","/**\n * Zod ↔ Superstruct type mappings\n *\n * Superstruct uses function-based API similar to Zod but with different naming:\n * Zod: z.object({ name: z.string() })\n * Superstruct: object({ name: string() })\n *\n * Key differences:\n * - Superstruct uses bare function calls (no namespace prefix)\n * - Superstruct uses `define()` for custom validators\n * - Superstruct uses `coerce()` differently than Zod\n * - Superstruct validation returns [error, value] tuple\n */\n\n/** Zod factory → Superstruct factory */\nexport const ZOD_TO_SUPERSTRUCT_FACTORIES: Record<string, string> = {\n 'z.string()': 'string()',\n 'z.number()': 'number()',\n 'z.boolean()': 'boolean()',\n 'z.date()': 'date()',\n 'z.any()': 'any()',\n 'z.unknown()': 'unknown()',\n 'z.never()': 'never()',\n 'z.bigint()': 'bigint()',\n 'z.undefined()': 'literal(undefined)',\n 'z.null()': 'literal(null)',\n 'z.void()': 'literal(undefined)',\n 'z.nan()': 'define(\"nan\", (v) => Number.isNaN(v))',\n};\n\n/** Superstruct factory → Zod factory */\nexport const SUPERSTRUCT_TO_ZOD_FACTORIES: Record<string, string> = {\n 'string()': 'z.string()',\n 'number()': 'z.number()',\n 'boolean()': 'z.boolean()',\n 'date()': 'z.date()',\n 'any()': 'z.any()',\n 'unknown()': 'z.unknown()',\n 'never()': 'z.never()',\n 'bigint()': 'z.bigint()',\n 'integer()': 'z.number().int()',\n 'func()': 'z.function()',\n 'instance(Date)': 'z.date()',\n 'instance(RegExp)': 'z.instanceof(RegExp)',\n};\n\n/** Zod validations → Superstruct refinements */\nexport const ZOD_VALIDATION_TO_SUPERSTRUCT: Record<string, string> = {\n email: 'pattern(/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/)',\n url: 'pattern(/^https?:\\\\/\\\\/.+/)',\n uuid: 'pattern(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)',\n ip: 'pattern(/^(?:\\\\d{1,3}\\\\.){3}\\\\d{1,3}$/)',\n int: 'refine(\"integer\", (v) => Number.isInteger(v))',\n};\n\n/** Superstruct refinements → Zod validations */\nexport const SUPERSTRUCT_REFINEMENT_TO_ZOD: Record<string, string> = {\n 'size(string(), 1, Infinity)': 'z.string().min(1)',\n 'nonempty(string())': 'z.string().min(1)',\n 'nonempty(array())': 'z.array().min(1)',\n};\n\n/** Import mappings */\nexport const IMPORT_MAPPINGS = {\n zodToSuperstruct: {\n from: 'zod',\n to: 'superstruct',\n zodImport: 'z',\n superstructImports: [\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'array',\n 'optional',\n 'nullable',\n 'union',\n 'literal',\n 'enums',\n 'record',\n 'tuple',\n 'any',\n 'unknown',\n 'never',\n 'define',\n 'refine',\n 'coerce',\n 'bigint',\n 'type',\n 'assign',\n 'size',\n 'pattern',\n 'integer',\n ],\n },\n superstructToZod: {\n from: 'superstruct',\n to: 'zod',\n zodImport: 'z',\n },\n};\n\n/** Patterns requiring manual review */\nexport const MANUAL_REVIEW_PATTERNS = [\n 'discriminatedUnion',\n 'superRefine',\n 'transform',\n 'preprocess',\n 'lazy',\n 'brand',\n 'catch',\n 'pipe',\n 'define',\n 'coerce',\n 'mask',\n 'create',\n 'assert',\n 'is',\n];\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { SUPERSTRUCT_TO_ZOD_FACTORIES } from './mappings.js';\n\n/**\n * Superstruct → Zod Transformer (Backward Migration)\n *\n * Converts Superstruct structs to Zod schemas.\n * Superstruct: object({ name: string(), age: optional(number()) })\n * Zod: z.object({ name: z.string(), age: z.number().optional() })\n */\nexport class SuperstructToZodTransformer {\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 let text = originalCode;\n\n // Step 1: Rewrite imports\n text = this.rewriteImports(text, filePath);\n\n // Step 2: Transform struct definitions\n text = this.transformStructs(text, filePath);\n\n // Step 3: Transform type helpers\n text = this.transformTypeHelpers(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 rewriteImports(text: string, filePath: string): string {\n // import { object, string, ... } from 'superstruct' → import { z } from 'zod'\n text = text.replace(\n /import\\s*\\{[^}]+\\}\\s*from\\s*['\"]superstruct['\"]/g,\n \"import { z } from 'zod'\",\n );\n\n // import type { Infer, ... } from 'superstruct' → import type { z } from 'zod'\n text = text.replace(\n /import\\s+type\\s*\\{[^}]+\\}\\s*from\\s*['\"]superstruct['\"]/g,\n \"import type { z } from 'zod'\",\n );\n\n // Check for define() usage\n if (text.includes('define(')) {\n this.warnings.push(\n `${filePath}: Superstruct define() should be converted to z.custom() or z.refine().`,\n );\n }\n\n // Check for coerce() usage\n if (text.includes('coerce(')) {\n this.warnings.push(\n `${filePath}: Superstruct coerce() should be converted to z.preprocess() or z.coerce.*.`,\n );\n }\n\n // Check for mask() usage\n if (text.includes('mask(')) {\n this.warnings.push(\n `${filePath}: Superstruct mask() (strip unknown keys) maps to z.object().strip() in Zod.`,\n );\n }\n\n return text;\n }\n\n private transformStructs(text: string, filePath: string): string {\n // Transform simple factories: string() → z.string(), etc.\n for (const [ssFactory, zodFactory] of Object.entries(SUPERSTRUCT_TO_ZOD_FACTORIES)) {\n // Only match bare function calls (not method calls like x.string())\n const fnName = ssFactory.match(/^(\\w+)\\(/)?.[1];\n if (fnName) {\n const pattern = new RegExp(`(?<!\\\\.)\\\\b${this.escapeRegex(ssFactory)}`, 'g');\n text = text.replace(pattern, zodFactory);\n }\n }\n\n // Transform object({...}) → z.object({...})\n text = text.replace(/(?<!\\.)(?<!\\w)\\bobject\\(/g, 'z.object(');\n\n // Transform array(X) → z.array(X)\n text = text.replace(/(?<!\\.)(?<!\\w)\\barray\\(/g, 'z.array(');\n\n // Transform optional(X) → X.optional()\n // This is tricky — Superstruct wraps: optional(string()) → z.string().optional()\n text = text.replace(/\\boptional\\(z\\.(\\w+)\\(\\)\\)/g, 'z.$1().optional()');\n text = text.replace(/\\boptional\\((z\\.\\w+\\([^)]*\\)(?:\\.\\w+\\([^)]*\\))*)\\)/g, '$1.optional()');\n\n // Transform nullable(X) → X.nullable()\n text = text.replace(/\\bnullable\\(z\\.(\\w+)\\(\\)\\)/g, 'z.$1().nullable()');\n text = text.replace(/\\bnullable\\((z\\.\\w+\\([^)]*\\)(?:\\.\\w+\\([^)]*\\))*)\\)/g, '$1.nullable()');\n\n // Transform enums([\"a\", \"b\"]) → z.enum([\"a\", \"b\"])\n text = text.replace(/(?<!\\.)(?<!\\w)\\benums\\(/g, 'z.enum(');\n\n // Transform literal(X) → z.literal(X)\n text = text.replace(/(?<!\\.)(?<!\\w)\\bliteral\\(/g, 'z.literal(');\n\n // Transform union([...]) → z.union([...])\n text = text.replace(/(?<!\\.)(?<!\\w)\\bunion\\(/g, 'z.union(');\n\n // Transform record(k, v) → z.record(k, v)\n text = text.replace(/(?<!\\.)(?<!\\w)\\brecord\\(/g, 'z.record(');\n\n // Transform tuple([...]) → z.tuple([...])\n text = text.replace(/(?<!\\.)(?<!\\w)\\btuple\\(/g, 'z.tuple(');\n\n // Transform integer() → z.number().int()\n text = text.replace(/(?<!\\.)(?<!\\w)\\binteger\\(\\)/g, 'z.number().int()');\n\n // Transform refine(schema, name, fn) → schema.refine(fn)\n text = text.replace(/\\brefine\\((z\\.[^,]+),\\s*\"[^\"]*\",\\s*([^)]+)\\)/g, '$1.refine($2)');\n\n // Transform size(string(), min, max) → z.string().min(min).max(max)\n text = text.replace(/\\bsize\\(z\\.string\\(\\),\\s*(\\d+),\\s*Infinity\\)/g, 'z.string().min($1)');\n text = text.replace(/\\bsize\\(z\\.string\\(\\),\\s*0,\\s*(\\d+)\\)/g, 'z.string().max($1)');\n text = text.replace(/\\bsize\\(z\\.string\\(\\),\\s*(\\d+),\\s*(\\d+)\\)/g, 'z.string().min($1).max($2)');\n\n // Transform pattern(string(), regex) → z.string().regex(regex)\n text = text.replace(/\\bpattern\\(z\\.string\\(\\),\\s*([^)]+)\\)/g, 'z.string().regex($1)');\n\n // Transform assign(A, B) → A.merge(B) or A.extend(B.shape)\n if (text.includes('assign(')) {\n this.warnings.push(\n `${filePath}: Superstruct assign() should be converted to .merge() or .extend() in Zod.`,\n );\n }\n\n // Transform type({...}) → z.object({...}).partial()\n // Superstruct's type() makes all fields optional\n if (/(?<!\\.)(?<!\\w)\\btype\\(/.test(text)) {\n this.warnings.push(\n `${filePath}: Superstruct type() (all-optional object) should be converted to z.object({}).partial() in Zod.`,\n );\n text = text.replace(/(?<!\\.)(?<!\\w)\\btype\\(\\{/g, 'z.object({');\n }\n\n return text;\n }\n\n private transformTypeHelpers(text: string): string {\n // Infer<typeof schema> → z.infer<typeof schema>\n text = text.replace(/\\bInfer<typeof\\s+(\\w+)>/g, 'z.infer<typeof $1>');\n\n return text;\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { SuperstructToZodTransformer } from './superstruct-to-zod-transformer.js';\n\nexport function createSuperstructToZodHandler(): TransformHandler {\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n const transformer = new SuperstructToZodTransformer();\n return transformer.transform(sourceFile);\n },\n };\n}\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport {\n MANUAL_REVIEW_PATTERNS,\n ZOD_TO_SUPERSTRUCT_FACTORIES,\n ZOD_VALIDATION_TO_SUPERSTRUCT,\n} from './mappings.js';\n\n/**\n * Zod → Superstruct Transformer\n *\n * Converts Zod schemas to Superstruct structs.\n * Superstruct uses a function-based API without a namespace prefix:\n * Zod: z.object({ name: z.string().email() })\n * Superstruct: object({ name: refine(string(), \"email\", ...) })\n */\nexport class ZodToSuperstructTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n private usedImports = new Set<string>();\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n this.usedImports = new Set();\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n let text = originalCode;\n\n // Step 1: Transform schema definitions (before import rewriting to detect needed imports)\n text = this.transformSchemas(text, filePath);\n\n // Step 2: Transform type helpers\n text = this.transformTypeHelpers(text);\n\n // Step 3: Rewrite imports (after transforms, so we know which imports to add)\n text = this.rewriteImports(text);\n\n // Step 4: Check for manual review patterns\n this.checkManualReviewPatterns(text, filePath);\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 rewriteImports(text: string): string {\n // Collect all superstruct functions used\n const imports = [...this.usedImports].sort();\n\n // Replace zod import with superstruct import\n text = text.replace(\n /import\\s*\\{[^}]*\\bz\\b[^}]*\\}\\s*from\\s*['\"]zod['\"]/g,\n `import { ${imports.join(', ')} } from 'superstruct'`,\n );\n\n // Handle namespace import\n text = text.replace(\n /import\\s*\\*\\s*as\\s*z\\s*from\\s*['\"]zod['\"]/g,\n `import { ${imports.join(', ')} } from 'superstruct'`,\n );\n\n // Handle type imports\n text = text.replace(\n /import\\s+type\\s*\\{[^}]*\\}\\s*from\\s*['\"]zod['\"]/g,\n `import type { Infer } from 'superstruct'`,\n );\n\n return text;\n }\n\n private transformSchemas(text: string, filePath: string): string {\n // Transform simple factories\n for (const [zodFactory, ssFactory] of Object.entries(ZOD_TO_SUPERSTRUCT_FACTORIES)) {\n if (text.includes(zodFactory)) {\n text = text.replace(new RegExp(this.escapeRegex(zodFactory), 'g'), ssFactory);\n // Track imports needed\n const fnName = ssFactory.match(/^(\\w+)\\(/)?.[1];\n if (fnName) this.usedImports.add(fnName);\n }\n }\n\n // Transform z.object({...}) → object({...})\n text = text.replace(/\\bz\\.object\\(/g, 'object(');\n this.usedImports.add('object');\n\n // Transform z.array(X) → array(X)\n text = text.replace(/\\bz\\.array\\(/g, 'array(');\n this.usedImports.add('array');\n\n // Transform .optional() → optional(X)\n // This requires wrapping: X.optional() → optional(X)\n text = text.replace(/(\\w+\\([^)]*\\))\\.optional\\(\\)/g, 'optional($1)');\n this.usedImports.add('optional');\n\n // Transform .nullable() → nullable(X)\n text = text.replace(/(\\w+\\([^)]*\\))\\.nullable\\(\\)/g, 'nullable($1)');\n this.usedImports.add('nullable');\n\n // Transform z.enum([\"a\", \"b\"]) → enums([\"a\", \"b\"])\n text = text.replace(/\\bz\\.enum\\(/g, 'enums(');\n this.usedImports.add('enums');\n\n // Transform z.literal(X) → literal(X)\n text = text.replace(/\\bz\\.literal\\(/g, 'literal(');\n this.usedImports.add('literal');\n\n // Transform z.union([...]) → union([...])\n text = text.replace(/\\bz\\.union\\(/g, 'union(');\n this.usedImports.add('union');\n\n // Transform z.record(k, v) → record(k, v)\n text = text.replace(/\\bz\\.record\\(/g, 'record(');\n this.usedImports.add('record');\n\n // Transform z.tuple([...]) → tuple([...])\n text = text.replace(/\\bz\\.tuple\\(/g, 'tuple(');\n this.usedImports.add('tuple');\n\n // Transform string validations\n for (const [zodMethod, ssReplacement] of Object.entries(ZOD_VALIDATION_TO_SUPERSTRUCT)) {\n const pattern = new RegExp(`string\\\\(\\\\)\\\\.${zodMethod}\\\\(\\\\)`, 'g');\n if (pattern.test(text)) {\n text = text.replace(\n pattern,\n `${ssReplacement.startsWith('pattern') ? ssReplacement.replace('pattern(', 'pattern(string(), ') : ssReplacement.replace('refine(', 'refine(string(), ')}`,\n );\n const fnName = ssReplacement.match(/^(\\w+)\\(/)?.[1];\n if (fnName) this.usedImports.add(fnName);\n this.usedImports.add('string');\n }\n }\n\n // Transform .min()/.max()/.length() on strings\n text = text.replace(/string\\(\\)\\.min\\((\\d+)\\)/g, (_m, n) => {\n this.usedImports.add('size');\n this.usedImports.add('string');\n return `size(string(), ${n}, Infinity)`;\n });\n text = text.replace(/string\\(\\)\\.max\\((\\d+)\\)/g, (_m, n) => {\n this.usedImports.add('size');\n this.usedImports.add('string');\n return `size(string(), 0, ${n})`;\n });\n\n // Transform z.number().int() → integer()\n text = text.replace(/number\\(\\)\\.int\\(\\)/g, 'integer()');\n this.usedImports.add('integer');\n\n // Transform .refine() → refine()\n text = text.replace(/(\\w+\\([^)]*\\))\\.refine\\(([^)]+)\\)/g, (_m, schema, fn) => {\n this.usedImports.add('refine');\n return `refine(${schema}, \"custom\", ${fn})`;\n });\n\n // Check for remaining z.* patterns\n if (/\\bz\\./.test(text)) {\n this.warnings.push(\n `${filePath}: Some Zod patterns could not be auto-transformed to Superstruct. ` +\n 'Look for remaining z.* references and convert manually.',\n );\n }\n\n return text;\n }\n\n private transformTypeHelpers(text: string): string {\n // z.infer<typeof schema> → Infer<typeof schema>\n text = text.replace(/z\\.infer<typeof\\s+(\\w+)>/g, 'Infer<typeof $1>');\n text = text.replace(/z\\.input<typeof\\s+(\\w+)>/g, 'Infer<typeof $1>');\n text = text.replace(/z\\.output<typeof\\s+(\\w+)>/g, 'Infer<typeof $1>');\n\n return text;\n }\n\n private checkManualReviewPatterns(text: string, filePath: string): void {\n for (const pattern of MANUAL_REVIEW_PATTERNS) {\n if (text.includes(`.${pattern}(`) || text.includes(`z.${pattern}(`)) {\n const guidance = this.getManualGuidance(pattern);\n this.warnings.push(\n `${filePath}: .${pattern}() requires manual conversion to Superstruct. ${guidance}`,\n );\n }\n }\n }\n\n private getManualGuidance(pattern: string): string {\n const guidance: Record<string, string> = {\n discriminatedUnion:\n 'Superstruct has no discriminatedUnion. Use union() with explicit struct variants.',\n superRefine: 'Use define() for custom validation: define(\"name\", (value) => { ... }).',\n transform: 'Use coerce() for transforms: coerce(target, source, (value) => transformed).',\n preprocess:\n 'Use coerce() for preprocessing: coerce(target, source, (value) => preprocessed).',\n lazy: 'Use lazy() from superstruct for recursive types: lazy(() => myStruct).',\n brand: 'Superstruct has no brand() equivalent. Use define() with a branded type.',\n catch: 'Superstruct has no catch() equivalent. Handle defaults at the application level.',\n pipe: 'Superstruct has no pipe() equivalent. Use coerce() or define() instead.',\n };\n return guidance[pattern] || 'See Superstruct documentation for equivalent pattern.';\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ZodToSuperstructTransformer } from './zod-to-superstruct-transformer.js';\n\nexport function createZodToSuperstructHandler(): TransformHandler {\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n const transformer = new ZodToSuperstructTransformer();\n return transformer.transform(sourceFile);\n },\n };\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,45 @@
1
+ import { TransformHandler } from '@schemashift/core';
2
+
3
+ /**
4
+ * Zod ↔ Superstruct type mappings
5
+ *
6
+ * Superstruct uses function-based API similar to Zod but with different naming:
7
+ * Zod: z.object({ name: z.string() })
8
+ * Superstruct: object({ name: string() })
9
+ *
10
+ * Key differences:
11
+ * - Superstruct uses bare function calls (no namespace prefix)
12
+ * - Superstruct uses `define()` for custom validators
13
+ * - Superstruct uses `coerce()` differently than Zod
14
+ * - Superstruct validation returns [error, value] tuple
15
+ */
16
+ /** Zod factory → Superstruct factory */
17
+ declare const ZOD_TO_SUPERSTRUCT_FACTORIES: Record<string, string>;
18
+ /** Superstruct factory → Zod factory */
19
+ declare const SUPERSTRUCT_TO_ZOD_FACTORIES: Record<string, string>;
20
+ /** Zod validations → Superstruct refinements */
21
+ declare const ZOD_VALIDATION_TO_SUPERSTRUCT: Record<string, string>;
22
+ /** Superstruct refinements → Zod validations */
23
+ declare const SUPERSTRUCT_REFINEMENT_TO_ZOD: Record<string, string>;
24
+ /** Import mappings */
25
+ declare const IMPORT_MAPPINGS: {
26
+ zodToSuperstruct: {
27
+ from: string;
28
+ to: string;
29
+ zodImport: string;
30
+ superstructImports: string[];
31
+ };
32
+ superstructToZod: {
33
+ from: string;
34
+ to: string;
35
+ zodImport: string;
36
+ };
37
+ };
38
+ /** Patterns requiring manual review */
39
+ declare const MANUAL_REVIEW_PATTERNS: string[];
40
+
41
+ declare function createSuperstructToZodHandler(): TransformHandler;
42
+
43
+ declare function createZodToSuperstructHandler(): TransformHandler;
44
+
45
+ export { IMPORT_MAPPINGS, MANUAL_REVIEW_PATTERNS, SUPERSTRUCT_REFINEMENT_TO_ZOD, SUPERSTRUCT_TO_ZOD_FACTORIES, ZOD_TO_SUPERSTRUCT_FACTORIES, ZOD_VALIDATION_TO_SUPERSTRUCT, createSuperstructToZodHandler, createZodToSuperstructHandler };
@@ -0,0 +1,45 @@
1
+ import { TransformHandler } from '@schemashift/core';
2
+
3
+ /**
4
+ * Zod ↔ Superstruct type mappings
5
+ *
6
+ * Superstruct uses function-based API similar to Zod but with different naming:
7
+ * Zod: z.object({ name: z.string() })
8
+ * Superstruct: object({ name: string() })
9
+ *
10
+ * Key differences:
11
+ * - Superstruct uses bare function calls (no namespace prefix)
12
+ * - Superstruct uses `define()` for custom validators
13
+ * - Superstruct uses `coerce()` differently than Zod
14
+ * - Superstruct validation returns [error, value] tuple
15
+ */
16
+ /** Zod factory → Superstruct factory */
17
+ declare const ZOD_TO_SUPERSTRUCT_FACTORIES: Record<string, string>;
18
+ /** Superstruct factory → Zod factory */
19
+ declare const SUPERSTRUCT_TO_ZOD_FACTORIES: Record<string, string>;
20
+ /** Zod validations → Superstruct refinements */
21
+ declare const ZOD_VALIDATION_TO_SUPERSTRUCT: Record<string, string>;
22
+ /** Superstruct refinements → Zod validations */
23
+ declare const SUPERSTRUCT_REFINEMENT_TO_ZOD: Record<string, string>;
24
+ /** Import mappings */
25
+ declare const IMPORT_MAPPINGS: {
26
+ zodToSuperstruct: {
27
+ from: string;
28
+ to: string;
29
+ zodImport: string;
30
+ superstructImports: string[];
31
+ };
32
+ superstructToZod: {
33
+ from: string;
34
+ to: string;
35
+ zodImport: string;
36
+ };
37
+ };
38
+ /** Patterns requiring manual review */
39
+ declare const MANUAL_REVIEW_PATTERNS: string[];
40
+
41
+ declare function createSuperstructToZodHandler(): TransformHandler;
42
+
43
+ declare function createZodToSuperstructHandler(): TransformHandler;
44
+
45
+ export { IMPORT_MAPPINGS, MANUAL_REVIEW_PATTERNS, SUPERSTRUCT_REFINEMENT_TO_ZOD, SUPERSTRUCT_TO_ZOD_FACTORIES, ZOD_TO_SUPERSTRUCT_FACTORIES, ZOD_VALIDATION_TO_SUPERSTRUCT, createSuperstructToZodHandler, createZodToSuperstructHandler };
package/dist/index.js ADDED
@@ -0,0 +1,386 @@
1
+ // src/mappings.ts
2
+ var ZOD_TO_SUPERSTRUCT_FACTORIES = {
3
+ "z.string()": "string()",
4
+ "z.number()": "number()",
5
+ "z.boolean()": "boolean()",
6
+ "z.date()": "date()",
7
+ "z.any()": "any()",
8
+ "z.unknown()": "unknown()",
9
+ "z.never()": "never()",
10
+ "z.bigint()": "bigint()",
11
+ "z.undefined()": "literal(undefined)",
12
+ "z.null()": "literal(null)",
13
+ "z.void()": "literal(undefined)",
14
+ "z.nan()": 'define("nan", (v) => Number.isNaN(v))'
15
+ };
16
+ var SUPERSTRUCT_TO_ZOD_FACTORIES = {
17
+ "string()": "z.string()",
18
+ "number()": "z.number()",
19
+ "boolean()": "z.boolean()",
20
+ "date()": "z.date()",
21
+ "any()": "z.any()",
22
+ "unknown()": "z.unknown()",
23
+ "never()": "z.never()",
24
+ "bigint()": "z.bigint()",
25
+ "integer()": "z.number().int()",
26
+ "func()": "z.function()",
27
+ "instance(Date)": "z.date()",
28
+ "instance(RegExp)": "z.instanceof(RegExp)"
29
+ };
30
+ var ZOD_VALIDATION_TO_SUPERSTRUCT = {
31
+ email: "pattern(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/)",
32
+ url: "pattern(/^https?:\\/\\/.+/)",
33
+ uuid: "pattern(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)",
34
+ ip: "pattern(/^(?:\\d{1,3}\\.){3}\\d{1,3}$/)",
35
+ int: 'refine("integer", (v) => Number.isInteger(v))'
36
+ };
37
+ var SUPERSTRUCT_REFINEMENT_TO_ZOD = {
38
+ "size(string(), 1, Infinity)": "z.string().min(1)",
39
+ "nonempty(string())": "z.string().min(1)",
40
+ "nonempty(array())": "z.array().min(1)"
41
+ };
42
+ var IMPORT_MAPPINGS = {
43
+ zodToSuperstruct: {
44
+ from: "zod",
45
+ to: "superstruct",
46
+ zodImport: "z",
47
+ superstructImports: [
48
+ "object",
49
+ "string",
50
+ "number",
51
+ "boolean",
52
+ "date",
53
+ "array",
54
+ "optional",
55
+ "nullable",
56
+ "union",
57
+ "literal",
58
+ "enums",
59
+ "record",
60
+ "tuple",
61
+ "any",
62
+ "unknown",
63
+ "never",
64
+ "define",
65
+ "refine",
66
+ "coerce",
67
+ "bigint",
68
+ "type",
69
+ "assign",
70
+ "size",
71
+ "pattern",
72
+ "integer"
73
+ ]
74
+ },
75
+ superstructToZod: {
76
+ from: "superstruct",
77
+ to: "zod",
78
+ zodImport: "z"
79
+ }
80
+ };
81
+ var MANUAL_REVIEW_PATTERNS = [
82
+ "discriminatedUnion",
83
+ "superRefine",
84
+ "transform",
85
+ "preprocess",
86
+ "lazy",
87
+ "brand",
88
+ "catch",
89
+ "pipe",
90
+ "define",
91
+ "coerce",
92
+ "mask",
93
+ "create",
94
+ "assert",
95
+ "is"
96
+ ];
97
+
98
+ // src/superstruct-to-zod-transformer.ts
99
+ var SuperstructToZodTransformer = class {
100
+ errors = [];
101
+ warnings = [];
102
+ transform(sourceFile) {
103
+ this.errors = [];
104
+ this.warnings = [];
105
+ const filePath = sourceFile.getFilePath();
106
+ const originalCode = sourceFile.getFullText();
107
+ try {
108
+ let text = originalCode;
109
+ text = this.rewriteImports(text, filePath);
110
+ text = this.transformStructs(text, filePath);
111
+ text = this.transformTypeHelpers(text);
112
+ sourceFile.replaceWithText(text);
113
+ return {
114
+ success: this.errors.length === 0,
115
+ filePath,
116
+ originalCode,
117
+ transformedCode: sourceFile.getFullText(),
118
+ errors: this.errors,
119
+ warnings: this.warnings
120
+ };
121
+ } catch (error) {
122
+ this.errors.push({
123
+ message: error instanceof Error ? error.message : "Unknown error"
124
+ });
125
+ return {
126
+ success: false,
127
+ filePath,
128
+ originalCode,
129
+ errors: this.errors,
130
+ warnings: this.warnings
131
+ };
132
+ }
133
+ }
134
+ rewriteImports(text, filePath) {
135
+ text = text.replace(
136
+ /import\s*\{[^}]+\}\s*from\s*['"]superstruct['"]/g,
137
+ "import { z } from 'zod'"
138
+ );
139
+ text = text.replace(
140
+ /import\s+type\s*\{[^}]+\}\s*from\s*['"]superstruct['"]/g,
141
+ "import type { z } from 'zod'"
142
+ );
143
+ if (text.includes("define(")) {
144
+ this.warnings.push(
145
+ `${filePath}: Superstruct define() should be converted to z.custom() or z.refine().`
146
+ );
147
+ }
148
+ if (text.includes("coerce(")) {
149
+ this.warnings.push(
150
+ `${filePath}: Superstruct coerce() should be converted to z.preprocess() or z.coerce.*.`
151
+ );
152
+ }
153
+ if (text.includes("mask(")) {
154
+ this.warnings.push(
155
+ `${filePath}: Superstruct mask() (strip unknown keys) maps to z.object().strip() in Zod.`
156
+ );
157
+ }
158
+ return text;
159
+ }
160
+ transformStructs(text, filePath) {
161
+ for (const [ssFactory, zodFactory] of Object.entries(SUPERSTRUCT_TO_ZOD_FACTORIES)) {
162
+ const fnName = ssFactory.match(/^(\w+)\(/)?.[1];
163
+ if (fnName) {
164
+ const pattern = new RegExp(`(?<!\\.)\\b${this.escapeRegex(ssFactory)}`, "g");
165
+ text = text.replace(pattern, zodFactory);
166
+ }
167
+ }
168
+ text = text.replace(/(?<!\.)(?<!\w)\bobject\(/g, "z.object(");
169
+ text = text.replace(/(?<!\.)(?<!\w)\barray\(/g, "z.array(");
170
+ text = text.replace(/\boptional\(z\.(\w+)\(\)\)/g, "z.$1().optional()");
171
+ text = text.replace(/\boptional\((z\.\w+\([^)]*\)(?:\.\w+\([^)]*\))*)\)/g, "$1.optional()");
172
+ text = text.replace(/\bnullable\(z\.(\w+)\(\)\)/g, "z.$1().nullable()");
173
+ text = text.replace(/\bnullable\((z\.\w+\([^)]*\)(?:\.\w+\([^)]*\))*)\)/g, "$1.nullable()");
174
+ text = text.replace(/(?<!\.)(?<!\w)\benums\(/g, "z.enum(");
175
+ text = text.replace(/(?<!\.)(?<!\w)\bliteral\(/g, "z.literal(");
176
+ text = text.replace(/(?<!\.)(?<!\w)\bunion\(/g, "z.union(");
177
+ text = text.replace(/(?<!\.)(?<!\w)\brecord\(/g, "z.record(");
178
+ text = text.replace(/(?<!\.)(?<!\w)\btuple\(/g, "z.tuple(");
179
+ text = text.replace(/(?<!\.)(?<!\w)\binteger\(\)/g, "z.number().int()");
180
+ text = text.replace(/\brefine\((z\.[^,]+),\s*"[^"]*",\s*([^)]+)\)/g, "$1.refine($2)");
181
+ text = text.replace(/\bsize\(z\.string\(\),\s*(\d+),\s*Infinity\)/g, "z.string().min($1)");
182
+ text = text.replace(/\bsize\(z\.string\(\),\s*0,\s*(\d+)\)/g, "z.string().max($1)");
183
+ text = text.replace(/\bsize\(z\.string\(\),\s*(\d+),\s*(\d+)\)/g, "z.string().min($1).max($2)");
184
+ text = text.replace(/\bpattern\(z\.string\(\),\s*([^)]+)\)/g, "z.string().regex($1)");
185
+ if (text.includes("assign(")) {
186
+ this.warnings.push(
187
+ `${filePath}: Superstruct assign() should be converted to .merge() or .extend() in Zod.`
188
+ );
189
+ }
190
+ if (/(?<!\.)(?<!\w)\btype\(/.test(text)) {
191
+ this.warnings.push(
192
+ `${filePath}: Superstruct type() (all-optional object) should be converted to z.object({}).partial() in Zod.`
193
+ );
194
+ text = text.replace(/(?<!\.)(?<!\w)\btype\(\{/g, "z.object({");
195
+ }
196
+ return text;
197
+ }
198
+ transformTypeHelpers(text) {
199
+ text = text.replace(/\bInfer<typeof\s+(\w+)>/g, "z.infer<typeof $1>");
200
+ return text;
201
+ }
202
+ escapeRegex(str) {
203
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
204
+ }
205
+ };
206
+
207
+ // src/superstruct-to-zod-handler.ts
208
+ function createSuperstructToZodHandler() {
209
+ return {
210
+ transform(sourceFile, _options) {
211
+ const transformer = new SuperstructToZodTransformer();
212
+ return transformer.transform(sourceFile);
213
+ }
214
+ };
215
+ }
216
+
217
+ // src/zod-to-superstruct-transformer.ts
218
+ var ZodToSuperstructTransformer = class {
219
+ errors = [];
220
+ warnings = [];
221
+ usedImports = /* @__PURE__ */ new Set();
222
+ transform(sourceFile) {
223
+ this.errors = [];
224
+ this.warnings = [];
225
+ this.usedImports = /* @__PURE__ */ new Set();
226
+ const filePath = sourceFile.getFilePath();
227
+ const originalCode = sourceFile.getFullText();
228
+ try {
229
+ let text = originalCode;
230
+ text = this.transformSchemas(text, filePath);
231
+ text = this.transformTypeHelpers(text);
232
+ text = this.rewriteImports(text);
233
+ this.checkManualReviewPatterns(text, filePath);
234
+ sourceFile.replaceWithText(text);
235
+ return {
236
+ success: this.errors.length === 0,
237
+ filePath,
238
+ originalCode,
239
+ transformedCode: sourceFile.getFullText(),
240
+ errors: this.errors,
241
+ warnings: this.warnings
242
+ };
243
+ } catch (error) {
244
+ this.errors.push({
245
+ message: error instanceof Error ? error.message : "Unknown error"
246
+ });
247
+ return {
248
+ success: false,
249
+ filePath,
250
+ originalCode,
251
+ errors: this.errors,
252
+ warnings: this.warnings
253
+ };
254
+ }
255
+ }
256
+ rewriteImports(text) {
257
+ const imports = [...this.usedImports].sort();
258
+ text = text.replace(
259
+ /import\s*\{[^}]*\bz\b[^}]*\}\s*from\s*['"]zod['"]/g,
260
+ `import { ${imports.join(", ")} } from 'superstruct'`
261
+ );
262
+ text = text.replace(
263
+ /import\s*\*\s*as\s*z\s*from\s*['"]zod['"]/g,
264
+ `import { ${imports.join(", ")} } from 'superstruct'`
265
+ );
266
+ text = text.replace(
267
+ /import\s+type\s*\{[^}]*\}\s*from\s*['"]zod['"]/g,
268
+ `import type { Infer } from 'superstruct'`
269
+ );
270
+ return text;
271
+ }
272
+ transformSchemas(text, filePath) {
273
+ for (const [zodFactory, ssFactory] of Object.entries(ZOD_TO_SUPERSTRUCT_FACTORIES)) {
274
+ if (text.includes(zodFactory)) {
275
+ text = text.replace(new RegExp(this.escapeRegex(zodFactory), "g"), ssFactory);
276
+ const fnName = ssFactory.match(/^(\w+)\(/)?.[1];
277
+ if (fnName) this.usedImports.add(fnName);
278
+ }
279
+ }
280
+ text = text.replace(/\bz\.object\(/g, "object(");
281
+ this.usedImports.add("object");
282
+ text = text.replace(/\bz\.array\(/g, "array(");
283
+ this.usedImports.add("array");
284
+ text = text.replace(/(\w+\([^)]*\))\.optional\(\)/g, "optional($1)");
285
+ this.usedImports.add("optional");
286
+ text = text.replace(/(\w+\([^)]*\))\.nullable\(\)/g, "nullable($1)");
287
+ this.usedImports.add("nullable");
288
+ text = text.replace(/\bz\.enum\(/g, "enums(");
289
+ this.usedImports.add("enums");
290
+ text = text.replace(/\bz\.literal\(/g, "literal(");
291
+ this.usedImports.add("literal");
292
+ text = text.replace(/\bz\.union\(/g, "union(");
293
+ this.usedImports.add("union");
294
+ text = text.replace(/\bz\.record\(/g, "record(");
295
+ this.usedImports.add("record");
296
+ text = text.replace(/\bz\.tuple\(/g, "tuple(");
297
+ this.usedImports.add("tuple");
298
+ for (const [zodMethod, ssReplacement] of Object.entries(ZOD_VALIDATION_TO_SUPERSTRUCT)) {
299
+ const pattern = new RegExp(`string\\(\\)\\.${zodMethod}\\(\\)`, "g");
300
+ if (pattern.test(text)) {
301
+ text = text.replace(
302
+ pattern,
303
+ `${ssReplacement.startsWith("pattern") ? ssReplacement.replace("pattern(", "pattern(string(), ") : ssReplacement.replace("refine(", "refine(string(), ")}`
304
+ );
305
+ const fnName = ssReplacement.match(/^(\w+)\(/)?.[1];
306
+ if (fnName) this.usedImports.add(fnName);
307
+ this.usedImports.add("string");
308
+ }
309
+ }
310
+ text = text.replace(/string\(\)\.min\((\d+)\)/g, (_m, n) => {
311
+ this.usedImports.add("size");
312
+ this.usedImports.add("string");
313
+ return `size(string(), ${n}, Infinity)`;
314
+ });
315
+ text = text.replace(/string\(\)\.max\((\d+)\)/g, (_m, n) => {
316
+ this.usedImports.add("size");
317
+ this.usedImports.add("string");
318
+ return `size(string(), 0, ${n})`;
319
+ });
320
+ text = text.replace(/number\(\)\.int\(\)/g, "integer()");
321
+ this.usedImports.add("integer");
322
+ text = text.replace(/(\w+\([^)]*\))\.refine\(([^)]+)\)/g, (_m, schema, fn) => {
323
+ this.usedImports.add("refine");
324
+ return `refine(${schema}, "custom", ${fn})`;
325
+ });
326
+ if (/\bz\./.test(text)) {
327
+ this.warnings.push(
328
+ `${filePath}: Some Zod patterns could not be auto-transformed to Superstruct. Look for remaining z.* references and convert manually.`
329
+ );
330
+ }
331
+ return text;
332
+ }
333
+ transformTypeHelpers(text) {
334
+ text = text.replace(/z\.infer<typeof\s+(\w+)>/g, "Infer<typeof $1>");
335
+ text = text.replace(/z\.input<typeof\s+(\w+)>/g, "Infer<typeof $1>");
336
+ text = text.replace(/z\.output<typeof\s+(\w+)>/g, "Infer<typeof $1>");
337
+ return text;
338
+ }
339
+ checkManualReviewPatterns(text, filePath) {
340
+ for (const pattern of MANUAL_REVIEW_PATTERNS) {
341
+ if (text.includes(`.${pattern}(`) || text.includes(`z.${pattern}(`)) {
342
+ const guidance = this.getManualGuidance(pattern);
343
+ this.warnings.push(
344
+ `${filePath}: .${pattern}() requires manual conversion to Superstruct. ${guidance}`
345
+ );
346
+ }
347
+ }
348
+ }
349
+ getManualGuidance(pattern) {
350
+ const guidance = {
351
+ discriminatedUnion: "Superstruct has no discriminatedUnion. Use union() with explicit struct variants.",
352
+ superRefine: 'Use define() for custom validation: define("name", (value) => { ... }).',
353
+ transform: "Use coerce() for transforms: coerce(target, source, (value) => transformed).",
354
+ preprocess: "Use coerce() for preprocessing: coerce(target, source, (value) => preprocessed).",
355
+ lazy: "Use lazy() from superstruct for recursive types: lazy(() => myStruct).",
356
+ brand: "Superstruct has no brand() equivalent. Use define() with a branded type.",
357
+ catch: "Superstruct has no catch() equivalent. Handle defaults at the application level.",
358
+ pipe: "Superstruct has no pipe() equivalent. Use coerce() or define() instead."
359
+ };
360
+ return guidance[pattern] || "See Superstruct documentation for equivalent pattern.";
361
+ }
362
+ escapeRegex(str) {
363
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
364
+ }
365
+ };
366
+
367
+ // src/zod-to-superstruct-handler.ts
368
+ function createZodToSuperstructHandler() {
369
+ return {
370
+ transform(sourceFile, _options) {
371
+ const transformer = new ZodToSuperstructTransformer();
372
+ return transformer.transform(sourceFile);
373
+ }
374
+ };
375
+ }
376
+ export {
377
+ IMPORT_MAPPINGS,
378
+ MANUAL_REVIEW_PATTERNS,
379
+ SUPERSTRUCT_REFINEMENT_TO_ZOD,
380
+ SUPERSTRUCT_TO_ZOD_FACTORIES,
381
+ ZOD_TO_SUPERSTRUCT_FACTORIES,
382
+ ZOD_VALIDATION_TO_SUPERSTRUCT,
383
+ createSuperstructToZodHandler,
384
+ createZodToSuperstructHandler
385
+ };
386
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mappings.ts","../src/superstruct-to-zod-transformer.ts","../src/superstruct-to-zod-handler.ts","../src/zod-to-superstruct-transformer.ts","../src/zod-to-superstruct-handler.ts"],"sourcesContent":["/**\n * Zod ↔ Superstruct type mappings\n *\n * Superstruct uses function-based API similar to Zod but with different naming:\n * Zod: z.object({ name: z.string() })\n * Superstruct: object({ name: string() })\n *\n * Key differences:\n * - Superstruct uses bare function calls (no namespace prefix)\n * - Superstruct uses `define()` for custom validators\n * - Superstruct uses `coerce()` differently than Zod\n * - Superstruct validation returns [error, value] tuple\n */\n\n/** Zod factory → Superstruct factory */\nexport const ZOD_TO_SUPERSTRUCT_FACTORIES: Record<string, string> = {\n 'z.string()': 'string()',\n 'z.number()': 'number()',\n 'z.boolean()': 'boolean()',\n 'z.date()': 'date()',\n 'z.any()': 'any()',\n 'z.unknown()': 'unknown()',\n 'z.never()': 'never()',\n 'z.bigint()': 'bigint()',\n 'z.undefined()': 'literal(undefined)',\n 'z.null()': 'literal(null)',\n 'z.void()': 'literal(undefined)',\n 'z.nan()': 'define(\"nan\", (v) => Number.isNaN(v))',\n};\n\n/** Superstruct factory → Zod factory */\nexport const SUPERSTRUCT_TO_ZOD_FACTORIES: Record<string, string> = {\n 'string()': 'z.string()',\n 'number()': 'z.number()',\n 'boolean()': 'z.boolean()',\n 'date()': 'z.date()',\n 'any()': 'z.any()',\n 'unknown()': 'z.unknown()',\n 'never()': 'z.never()',\n 'bigint()': 'z.bigint()',\n 'integer()': 'z.number().int()',\n 'func()': 'z.function()',\n 'instance(Date)': 'z.date()',\n 'instance(RegExp)': 'z.instanceof(RegExp)',\n};\n\n/** Zod validations → Superstruct refinements */\nexport const ZOD_VALIDATION_TO_SUPERSTRUCT: Record<string, string> = {\n email: 'pattern(/^[^\\\\s@]+@[^\\\\s@]+\\\\.[^\\\\s@]+$/)',\n url: 'pattern(/^https?:\\\\/\\\\/.+/)',\n uuid: 'pattern(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)',\n ip: 'pattern(/^(?:\\\\d{1,3}\\\\.){3}\\\\d{1,3}$/)',\n int: 'refine(\"integer\", (v) => Number.isInteger(v))',\n};\n\n/** Superstruct refinements → Zod validations */\nexport const SUPERSTRUCT_REFINEMENT_TO_ZOD: Record<string, string> = {\n 'size(string(), 1, Infinity)': 'z.string().min(1)',\n 'nonempty(string())': 'z.string().min(1)',\n 'nonempty(array())': 'z.array().min(1)',\n};\n\n/** Import mappings */\nexport const IMPORT_MAPPINGS = {\n zodToSuperstruct: {\n from: 'zod',\n to: 'superstruct',\n zodImport: 'z',\n superstructImports: [\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'date',\n 'array',\n 'optional',\n 'nullable',\n 'union',\n 'literal',\n 'enums',\n 'record',\n 'tuple',\n 'any',\n 'unknown',\n 'never',\n 'define',\n 'refine',\n 'coerce',\n 'bigint',\n 'type',\n 'assign',\n 'size',\n 'pattern',\n 'integer',\n ],\n },\n superstructToZod: {\n from: 'superstruct',\n to: 'zod',\n zodImport: 'z',\n },\n};\n\n/** Patterns requiring manual review */\nexport const MANUAL_REVIEW_PATTERNS = [\n 'discriminatedUnion',\n 'superRefine',\n 'transform',\n 'preprocess',\n 'lazy',\n 'brand',\n 'catch',\n 'pipe',\n 'define',\n 'coerce',\n 'mask',\n 'create',\n 'assert',\n 'is',\n];\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { SUPERSTRUCT_TO_ZOD_FACTORIES } from './mappings.js';\n\n/**\n * Superstruct → Zod Transformer (Backward Migration)\n *\n * Converts Superstruct structs to Zod schemas.\n * Superstruct: object({ name: string(), age: optional(number()) })\n * Zod: z.object({ name: z.string(), age: z.number().optional() })\n */\nexport class SuperstructToZodTransformer {\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 let text = originalCode;\n\n // Step 1: Rewrite imports\n text = this.rewriteImports(text, filePath);\n\n // Step 2: Transform struct definitions\n text = this.transformStructs(text, filePath);\n\n // Step 3: Transform type helpers\n text = this.transformTypeHelpers(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 rewriteImports(text: string, filePath: string): string {\n // import { object, string, ... } from 'superstruct' → import { z } from 'zod'\n text = text.replace(\n /import\\s*\\{[^}]+\\}\\s*from\\s*['\"]superstruct['\"]/g,\n \"import { z } from 'zod'\",\n );\n\n // import type { Infer, ... } from 'superstruct' → import type { z } from 'zod'\n text = text.replace(\n /import\\s+type\\s*\\{[^}]+\\}\\s*from\\s*['\"]superstruct['\"]/g,\n \"import type { z } from 'zod'\",\n );\n\n // Check for define() usage\n if (text.includes('define(')) {\n this.warnings.push(\n `${filePath}: Superstruct define() should be converted to z.custom() or z.refine().`,\n );\n }\n\n // Check for coerce() usage\n if (text.includes('coerce(')) {\n this.warnings.push(\n `${filePath}: Superstruct coerce() should be converted to z.preprocess() or z.coerce.*.`,\n );\n }\n\n // Check for mask() usage\n if (text.includes('mask(')) {\n this.warnings.push(\n `${filePath}: Superstruct mask() (strip unknown keys) maps to z.object().strip() in Zod.`,\n );\n }\n\n return text;\n }\n\n private transformStructs(text: string, filePath: string): string {\n // Transform simple factories: string() → z.string(), etc.\n for (const [ssFactory, zodFactory] of Object.entries(SUPERSTRUCT_TO_ZOD_FACTORIES)) {\n // Only match bare function calls (not method calls like x.string())\n const fnName = ssFactory.match(/^(\\w+)\\(/)?.[1];\n if (fnName) {\n const pattern = new RegExp(`(?<!\\\\.)\\\\b${this.escapeRegex(ssFactory)}`, 'g');\n text = text.replace(pattern, zodFactory);\n }\n }\n\n // Transform object({...}) → z.object({...})\n text = text.replace(/(?<!\\.)(?<!\\w)\\bobject\\(/g, 'z.object(');\n\n // Transform array(X) → z.array(X)\n text = text.replace(/(?<!\\.)(?<!\\w)\\barray\\(/g, 'z.array(');\n\n // Transform optional(X) → X.optional()\n // This is tricky — Superstruct wraps: optional(string()) → z.string().optional()\n text = text.replace(/\\boptional\\(z\\.(\\w+)\\(\\)\\)/g, 'z.$1().optional()');\n text = text.replace(/\\boptional\\((z\\.\\w+\\([^)]*\\)(?:\\.\\w+\\([^)]*\\))*)\\)/g, '$1.optional()');\n\n // Transform nullable(X) → X.nullable()\n text = text.replace(/\\bnullable\\(z\\.(\\w+)\\(\\)\\)/g, 'z.$1().nullable()');\n text = text.replace(/\\bnullable\\((z\\.\\w+\\([^)]*\\)(?:\\.\\w+\\([^)]*\\))*)\\)/g, '$1.nullable()');\n\n // Transform enums([\"a\", \"b\"]) → z.enum([\"a\", \"b\"])\n text = text.replace(/(?<!\\.)(?<!\\w)\\benums\\(/g, 'z.enum(');\n\n // Transform literal(X) → z.literal(X)\n text = text.replace(/(?<!\\.)(?<!\\w)\\bliteral\\(/g, 'z.literal(');\n\n // Transform union([...]) → z.union([...])\n text = text.replace(/(?<!\\.)(?<!\\w)\\bunion\\(/g, 'z.union(');\n\n // Transform record(k, v) → z.record(k, v)\n text = text.replace(/(?<!\\.)(?<!\\w)\\brecord\\(/g, 'z.record(');\n\n // Transform tuple([...]) → z.tuple([...])\n text = text.replace(/(?<!\\.)(?<!\\w)\\btuple\\(/g, 'z.tuple(');\n\n // Transform integer() → z.number().int()\n text = text.replace(/(?<!\\.)(?<!\\w)\\binteger\\(\\)/g, 'z.number().int()');\n\n // Transform refine(schema, name, fn) → schema.refine(fn)\n text = text.replace(/\\brefine\\((z\\.[^,]+),\\s*\"[^\"]*\",\\s*([^)]+)\\)/g, '$1.refine($2)');\n\n // Transform size(string(), min, max) → z.string().min(min).max(max)\n text = text.replace(/\\bsize\\(z\\.string\\(\\),\\s*(\\d+),\\s*Infinity\\)/g, 'z.string().min($1)');\n text = text.replace(/\\bsize\\(z\\.string\\(\\),\\s*0,\\s*(\\d+)\\)/g, 'z.string().max($1)');\n text = text.replace(/\\bsize\\(z\\.string\\(\\),\\s*(\\d+),\\s*(\\d+)\\)/g, 'z.string().min($1).max($2)');\n\n // Transform pattern(string(), regex) → z.string().regex(regex)\n text = text.replace(/\\bpattern\\(z\\.string\\(\\),\\s*([^)]+)\\)/g, 'z.string().regex($1)');\n\n // Transform assign(A, B) → A.merge(B) or A.extend(B.shape)\n if (text.includes('assign(')) {\n this.warnings.push(\n `${filePath}: Superstruct assign() should be converted to .merge() or .extend() in Zod.`,\n );\n }\n\n // Transform type({...}) → z.object({...}).partial()\n // Superstruct's type() makes all fields optional\n if (/(?<!\\.)(?<!\\w)\\btype\\(/.test(text)) {\n this.warnings.push(\n `${filePath}: Superstruct type() (all-optional object) should be converted to z.object({}).partial() in Zod.`,\n );\n text = text.replace(/(?<!\\.)(?<!\\w)\\btype\\(\\{/g, 'z.object({');\n }\n\n return text;\n }\n\n private transformTypeHelpers(text: string): string {\n // Infer<typeof schema> → z.infer<typeof schema>\n text = text.replace(/\\bInfer<typeof\\s+(\\w+)>/g, 'z.infer<typeof $1>');\n\n return text;\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { SuperstructToZodTransformer } from './superstruct-to-zod-transformer.js';\n\nexport function createSuperstructToZodHandler(): TransformHandler {\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n const transformer = new SuperstructToZodTransformer();\n return transformer.transform(sourceFile);\n },\n };\n}\n","import type { TransformError, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport {\n MANUAL_REVIEW_PATTERNS,\n ZOD_TO_SUPERSTRUCT_FACTORIES,\n ZOD_VALIDATION_TO_SUPERSTRUCT,\n} from './mappings.js';\n\n/**\n * Zod → Superstruct Transformer\n *\n * Converts Zod schemas to Superstruct structs.\n * Superstruct uses a function-based API without a namespace prefix:\n * Zod: z.object({ name: z.string().email() })\n * Superstruct: object({ name: refine(string(), \"email\", ...) })\n */\nexport class ZodToSuperstructTransformer {\n private errors: TransformError[] = [];\n private warnings: string[] = [];\n private usedImports = new Set<string>();\n\n transform(sourceFile: SourceFile): TransformResult {\n this.errors = [];\n this.warnings = [];\n this.usedImports = new Set();\n\n const filePath = sourceFile.getFilePath();\n const originalCode = sourceFile.getFullText();\n\n try {\n let text = originalCode;\n\n // Step 1: Transform schema definitions (before import rewriting to detect needed imports)\n text = this.transformSchemas(text, filePath);\n\n // Step 2: Transform type helpers\n text = this.transformTypeHelpers(text);\n\n // Step 3: Rewrite imports (after transforms, so we know which imports to add)\n text = this.rewriteImports(text);\n\n // Step 4: Check for manual review patterns\n this.checkManualReviewPatterns(text, filePath);\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 rewriteImports(text: string): string {\n // Collect all superstruct functions used\n const imports = [...this.usedImports].sort();\n\n // Replace zod import with superstruct import\n text = text.replace(\n /import\\s*\\{[^}]*\\bz\\b[^}]*\\}\\s*from\\s*['\"]zod['\"]/g,\n `import { ${imports.join(', ')} } from 'superstruct'`,\n );\n\n // Handle namespace import\n text = text.replace(\n /import\\s*\\*\\s*as\\s*z\\s*from\\s*['\"]zod['\"]/g,\n `import { ${imports.join(', ')} } from 'superstruct'`,\n );\n\n // Handle type imports\n text = text.replace(\n /import\\s+type\\s*\\{[^}]*\\}\\s*from\\s*['\"]zod['\"]/g,\n `import type { Infer } from 'superstruct'`,\n );\n\n return text;\n }\n\n private transformSchemas(text: string, filePath: string): string {\n // Transform simple factories\n for (const [zodFactory, ssFactory] of Object.entries(ZOD_TO_SUPERSTRUCT_FACTORIES)) {\n if (text.includes(zodFactory)) {\n text = text.replace(new RegExp(this.escapeRegex(zodFactory), 'g'), ssFactory);\n // Track imports needed\n const fnName = ssFactory.match(/^(\\w+)\\(/)?.[1];\n if (fnName) this.usedImports.add(fnName);\n }\n }\n\n // Transform z.object({...}) → object({...})\n text = text.replace(/\\bz\\.object\\(/g, 'object(');\n this.usedImports.add('object');\n\n // Transform z.array(X) → array(X)\n text = text.replace(/\\bz\\.array\\(/g, 'array(');\n this.usedImports.add('array');\n\n // Transform .optional() → optional(X)\n // This requires wrapping: X.optional() → optional(X)\n text = text.replace(/(\\w+\\([^)]*\\))\\.optional\\(\\)/g, 'optional($1)');\n this.usedImports.add('optional');\n\n // Transform .nullable() → nullable(X)\n text = text.replace(/(\\w+\\([^)]*\\))\\.nullable\\(\\)/g, 'nullable($1)');\n this.usedImports.add('nullable');\n\n // Transform z.enum([\"a\", \"b\"]) → enums([\"a\", \"b\"])\n text = text.replace(/\\bz\\.enum\\(/g, 'enums(');\n this.usedImports.add('enums');\n\n // Transform z.literal(X) → literal(X)\n text = text.replace(/\\bz\\.literal\\(/g, 'literal(');\n this.usedImports.add('literal');\n\n // Transform z.union([...]) → union([...])\n text = text.replace(/\\bz\\.union\\(/g, 'union(');\n this.usedImports.add('union');\n\n // Transform z.record(k, v) → record(k, v)\n text = text.replace(/\\bz\\.record\\(/g, 'record(');\n this.usedImports.add('record');\n\n // Transform z.tuple([...]) → tuple([...])\n text = text.replace(/\\bz\\.tuple\\(/g, 'tuple(');\n this.usedImports.add('tuple');\n\n // Transform string validations\n for (const [zodMethod, ssReplacement] of Object.entries(ZOD_VALIDATION_TO_SUPERSTRUCT)) {\n const pattern = new RegExp(`string\\\\(\\\\)\\\\.${zodMethod}\\\\(\\\\)`, 'g');\n if (pattern.test(text)) {\n text = text.replace(\n pattern,\n `${ssReplacement.startsWith('pattern') ? ssReplacement.replace('pattern(', 'pattern(string(), ') : ssReplacement.replace('refine(', 'refine(string(), ')}`,\n );\n const fnName = ssReplacement.match(/^(\\w+)\\(/)?.[1];\n if (fnName) this.usedImports.add(fnName);\n this.usedImports.add('string');\n }\n }\n\n // Transform .min()/.max()/.length() on strings\n text = text.replace(/string\\(\\)\\.min\\((\\d+)\\)/g, (_m, n) => {\n this.usedImports.add('size');\n this.usedImports.add('string');\n return `size(string(), ${n}, Infinity)`;\n });\n text = text.replace(/string\\(\\)\\.max\\((\\d+)\\)/g, (_m, n) => {\n this.usedImports.add('size');\n this.usedImports.add('string');\n return `size(string(), 0, ${n})`;\n });\n\n // Transform z.number().int() → integer()\n text = text.replace(/number\\(\\)\\.int\\(\\)/g, 'integer()');\n this.usedImports.add('integer');\n\n // Transform .refine() → refine()\n text = text.replace(/(\\w+\\([^)]*\\))\\.refine\\(([^)]+)\\)/g, (_m, schema, fn) => {\n this.usedImports.add('refine');\n return `refine(${schema}, \"custom\", ${fn})`;\n });\n\n // Check for remaining z.* patterns\n if (/\\bz\\./.test(text)) {\n this.warnings.push(\n `${filePath}: Some Zod patterns could not be auto-transformed to Superstruct. ` +\n 'Look for remaining z.* references and convert manually.',\n );\n }\n\n return text;\n }\n\n private transformTypeHelpers(text: string): string {\n // z.infer<typeof schema> → Infer<typeof schema>\n text = text.replace(/z\\.infer<typeof\\s+(\\w+)>/g, 'Infer<typeof $1>');\n text = text.replace(/z\\.input<typeof\\s+(\\w+)>/g, 'Infer<typeof $1>');\n text = text.replace(/z\\.output<typeof\\s+(\\w+)>/g, 'Infer<typeof $1>');\n\n return text;\n }\n\n private checkManualReviewPatterns(text: string, filePath: string): void {\n for (const pattern of MANUAL_REVIEW_PATTERNS) {\n if (text.includes(`.${pattern}(`) || text.includes(`z.${pattern}(`)) {\n const guidance = this.getManualGuidance(pattern);\n this.warnings.push(\n `${filePath}: .${pattern}() requires manual conversion to Superstruct. ${guidance}`,\n );\n }\n }\n }\n\n private getManualGuidance(pattern: string): string {\n const guidance: Record<string, string> = {\n discriminatedUnion:\n 'Superstruct has no discriminatedUnion. Use union() with explicit struct variants.',\n superRefine: 'Use define() for custom validation: define(\"name\", (value) => { ... }).',\n transform: 'Use coerce() for transforms: coerce(target, source, (value) => transformed).',\n preprocess:\n 'Use coerce() for preprocessing: coerce(target, source, (value) => preprocessed).',\n lazy: 'Use lazy() from superstruct for recursive types: lazy(() => myStruct).',\n brand: 'Superstruct has no brand() equivalent. Use define() with a branded type.',\n catch: 'Superstruct has no catch() equivalent. Handle defaults at the application level.',\n pipe: 'Superstruct has no pipe() equivalent. Use coerce() or define() instead.',\n };\n return guidance[pattern] || 'See Superstruct documentation for equivalent pattern.';\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n}\n","import type { TransformHandler, TransformOptions, TransformResult } from '@schemashift/core';\nimport type { SourceFile } from 'ts-morph';\nimport { ZodToSuperstructTransformer } from './zod-to-superstruct-transformer.js';\n\nexport function createZodToSuperstructHandler(): TransformHandler {\n return {\n transform(sourceFile: SourceFile, _options: TransformOptions): TransformResult {\n const transformer = new ZodToSuperstructTransformer();\n return transformer.transform(sourceFile);\n },\n };\n}\n"],"mappings":";AAeO,IAAM,+BAAuD;AAAA,EAClE,cAAc;AAAA,EACd,cAAc;AAAA,EACd,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,eAAe;AAAA,EACf,aAAa;AAAA,EACb,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AACb;AAGO,IAAM,+BAAuD;AAAA,EAClE,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,SAAS;AAAA,EACT,aAAa;AAAA,EACb,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,oBAAoB;AACtB;AAGO,IAAM,gCAAwD;AAAA,EACnE,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,IAAI;AAAA,EACJ,KAAK;AACP;AAGO,IAAM,gCAAwD;AAAA,EACnE,+BAA+B;AAAA,EAC/B,sBAAsB;AAAA,EACtB,qBAAqB;AACvB;AAGO,IAAM,kBAAkB;AAAA,EAC7B,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,WAAW;AAAA,IACX,oBAAoB;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EACA,kBAAkB;AAAA,IAChB,MAAM;AAAA,IACN,IAAI;AAAA,IACJ,WAAW;AAAA,EACb;AACF;AAGO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AC5GO,IAAM,8BAAN,MAAkC;AAAA,EAC/B,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,UAAI,OAAO;AAGX,aAAO,KAAK,eAAe,MAAM,QAAQ;AAGzC,aAAO,KAAK,iBAAiB,MAAM,QAAQ;AAG3C,aAAO,KAAK,qBAAqB,IAAI;AAErC,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,eAAe,MAAc,UAA0B;AAE7D,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAGA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,WAAK,SAAS;AAAA,QACZ,GAAG,QAAQ;AAAA,MACb;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,WAAK,SAAS;AAAA,QACZ,GAAG,QAAQ;AAAA,MACb;AAAA,IACF;AAGA,QAAI,KAAK,SAAS,OAAO,GAAG;AAC1B,WAAK,SAAS;AAAA,QACZ,GAAG,QAAQ;AAAA,MACb;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAc,UAA0B;AAE/D,eAAW,CAAC,WAAW,UAAU,KAAK,OAAO,QAAQ,4BAA4B,GAAG;AAElF,YAAM,SAAS,UAAU,MAAM,UAAU,IAAI,CAAC;AAC9C,UAAI,QAAQ;AACV,cAAM,UAAU,IAAI,OAAO,cAAc,KAAK,YAAY,SAAS,CAAC,IAAI,GAAG;AAC3E,eAAO,KAAK,QAAQ,SAAS,UAAU;AAAA,MACzC;AAAA,IACF;AAGA,WAAO,KAAK,QAAQ,6BAA6B,WAAW;AAG5D,WAAO,KAAK,QAAQ,4BAA4B,UAAU;AAI1D,WAAO,KAAK,QAAQ,+BAA+B,mBAAmB;AACtE,WAAO,KAAK,QAAQ,uDAAuD,eAAe;AAG1F,WAAO,KAAK,QAAQ,+BAA+B,mBAAmB;AACtE,WAAO,KAAK,QAAQ,uDAAuD,eAAe;AAG1F,WAAO,KAAK,QAAQ,4BAA4B,SAAS;AAGzD,WAAO,KAAK,QAAQ,8BAA8B,YAAY;AAG9D,WAAO,KAAK,QAAQ,4BAA4B,UAAU;AAG1D,WAAO,KAAK,QAAQ,6BAA6B,WAAW;AAG5D,WAAO,KAAK,QAAQ,4BAA4B,UAAU;AAG1D,WAAO,KAAK,QAAQ,gCAAgC,kBAAkB;AAGtE,WAAO,KAAK,QAAQ,iDAAiD,eAAe;AAGpF,WAAO,KAAK,QAAQ,iDAAiD,oBAAoB;AACzF,WAAO,KAAK,QAAQ,0CAA0C,oBAAoB;AAClF,WAAO,KAAK,QAAQ,8CAA8C,4BAA4B;AAG9F,WAAO,KAAK,QAAQ,0CAA0C,sBAAsB;AAGpF,QAAI,KAAK,SAAS,SAAS,GAAG;AAC5B,WAAK,SAAS;AAAA,QACZ,GAAG,QAAQ;AAAA,MACb;AAAA,IACF;AAIA,QAAI,yBAAyB,KAAK,IAAI,GAAG;AACvC,WAAK,SAAS;AAAA,QACZ,GAAG,QAAQ;AAAA,MACb;AACA,aAAO,KAAK,QAAQ,6BAA6B,YAAY;AAAA,IAC/D;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,MAAsB;AAEjD,WAAO,KAAK,QAAQ,4BAA4B,oBAAoB;AAEpE,WAAO;AAAA,EACT;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IAAI,QAAQ,uBAAuB,MAAM;AAAA,EAClD;AACF;;;AC/KO,SAAS,gCAAkD;AAChE,SAAO;AAAA,IACL,UAAU,YAAwB,UAA6C;AAC7E,YAAM,cAAc,IAAI,4BAA4B;AACpD,aAAO,YAAY,UAAU,UAAU;AAAA,IACzC;AAAA,EACF;AACF;;;ACKO,IAAM,8BAAN,MAAkC;AAAA,EAC/B,SAA2B,CAAC;AAAA,EAC5B,WAAqB,CAAC;AAAA,EACtB,cAAc,oBAAI,IAAY;AAAA,EAEtC,UAAU,YAAyC;AACjD,SAAK,SAAS,CAAC;AACf,SAAK,WAAW,CAAC;AACjB,SAAK,cAAc,oBAAI,IAAI;AAE3B,UAAM,WAAW,WAAW,YAAY;AACxC,UAAM,eAAe,WAAW,YAAY;AAE5C,QAAI;AACF,UAAI,OAAO;AAGX,aAAO,KAAK,iBAAiB,MAAM,QAAQ;AAG3C,aAAO,KAAK,qBAAqB,IAAI;AAGrC,aAAO,KAAK,eAAe,IAAI;AAG/B,WAAK,0BAA0B,MAAM,QAAQ;AAE7C,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,eAAe,MAAsB;AAE3C,UAAM,UAAU,CAAC,GAAG,KAAK,WAAW,EAAE,KAAK;AAG3C,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,IAChC;AAGA,WAAO,KAAK;AAAA,MACV;AAAA,MACA,YAAY,QAAQ,KAAK,IAAI,CAAC;AAAA,IAChC;AAGA,WAAO,KAAK;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,iBAAiB,MAAc,UAA0B;AAE/D,eAAW,CAAC,YAAY,SAAS,KAAK,OAAO,QAAQ,4BAA4B,GAAG;AAClF,UAAI,KAAK,SAAS,UAAU,GAAG;AAC7B,eAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,YAAY,UAAU,GAAG,GAAG,GAAG,SAAS;AAE5E,cAAM,SAAS,UAAU,MAAM,UAAU,IAAI,CAAC;AAC9C,YAAI,OAAQ,MAAK,YAAY,IAAI,MAAM;AAAA,MACzC;AAAA,IACF;AAGA,WAAO,KAAK,QAAQ,kBAAkB,SAAS;AAC/C,SAAK,YAAY,IAAI,QAAQ;AAG7B,WAAO,KAAK,QAAQ,iBAAiB,QAAQ;AAC7C,SAAK,YAAY,IAAI,OAAO;AAI5B,WAAO,KAAK,QAAQ,iCAAiC,cAAc;AACnE,SAAK,YAAY,IAAI,UAAU;AAG/B,WAAO,KAAK,QAAQ,iCAAiC,cAAc;AACnE,SAAK,YAAY,IAAI,UAAU;AAG/B,WAAO,KAAK,QAAQ,gBAAgB,QAAQ;AAC5C,SAAK,YAAY,IAAI,OAAO;AAG5B,WAAO,KAAK,QAAQ,mBAAmB,UAAU;AACjD,SAAK,YAAY,IAAI,SAAS;AAG9B,WAAO,KAAK,QAAQ,iBAAiB,QAAQ;AAC7C,SAAK,YAAY,IAAI,OAAO;AAG5B,WAAO,KAAK,QAAQ,kBAAkB,SAAS;AAC/C,SAAK,YAAY,IAAI,QAAQ;AAG7B,WAAO,KAAK,QAAQ,iBAAiB,QAAQ;AAC7C,SAAK,YAAY,IAAI,OAAO;AAG5B,eAAW,CAAC,WAAW,aAAa,KAAK,OAAO,QAAQ,6BAA6B,GAAG;AACtF,YAAM,UAAU,IAAI,OAAO,kBAAkB,SAAS,UAAU,GAAG;AACnE,UAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,eAAO,KAAK;AAAA,UACV;AAAA,UACA,GAAG,cAAc,WAAW,SAAS,IAAI,cAAc,QAAQ,YAAY,oBAAoB,IAAI,cAAc,QAAQ,WAAW,mBAAmB,CAAC;AAAA,QAC1J;AACA,cAAM,SAAS,cAAc,MAAM,UAAU,IAAI,CAAC;AAClD,YAAI,OAAQ,MAAK,YAAY,IAAI,MAAM;AACvC,aAAK,YAAY,IAAI,QAAQ;AAAA,MAC/B;AAAA,IACF;AAGA,WAAO,KAAK,QAAQ,6BAA6B,CAAC,IAAI,MAAM;AAC1D,WAAK,YAAY,IAAI,MAAM;AAC3B,WAAK,YAAY,IAAI,QAAQ;AAC7B,aAAO,kBAAkB,CAAC;AAAA,IAC5B,CAAC;AACD,WAAO,KAAK,QAAQ,6BAA6B,CAAC,IAAI,MAAM;AAC1D,WAAK,YAAY,IAAI,MAAM;AAC3B,WAAK,YAAY,IAAI,QAAQ;AAC7B,aAAO,qBAAqB,CAAC;AAAA,IAC/B,CAAC;AAGD,WAAO,KAAK,QAAQ,wBAAwB,WAAW;AACvD,SAAK,YAAY,IAAI,SAAS;AAG9B,WAAO,KAAK,QAAQ,sCAAsC,CAAC,IAAI,QAAQ,OAAO;AAC5E,WAAK,YAAY,IAAI,QAAQ;AAC7B,aAAO,UAAU,MAAM,eAAe,EAAE;AAAA,IAC1C,CAAC;AAGD,QAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,WAAK,SAAS;AAAA,QACZ,GAAG,QAAQ;AAAA,MAEb;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,qBAAqB,MAAsB;AAEjD,WAAO,KAAK,QAAQ,6BAA6B,kBAAkB;AACnE,WAAO,KAAK,QAAQ,6BAA6B,kBAAkB;AACnE,WAAO,KAAK,QAAQ,8BAA8B,kBAAkB;AAEpE,WAAO;AAAA,EACT;AAAA,EAEQ,0BAA0B,MAAc,UAAwB;AACtE,eAAW,WAAW,wBAAwB;AAC5C,UAAI,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,KAAK,SAAS,KAAK,OAAO,GAAG,GAAG;AACnE,cAAM,WAAW,KAAK,kBAAkB,OAAO;AAC/C,aAAK,SAAS;AAAA,UACZ,GAAG,QAAQ,MAAM,OAAO,iDAAiD,QAAQ;AAAA,QACnF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kBAAkB,SAAyB;AACjD,UAAM,WAAmC;AAAA,MACvC,oBACE;AAAA,MACF,aAAa;AAAA,MACb,WAAW;AAAA,MACX,YACE;AAAA,MACF,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,MAAM;AAAA,IACR;AACA,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAAA,EAEQ,YAAY,KAAqB;AACvC,WAAO,IAAI,QAAQ,uBAAuB,MAAM;AAAA,EAClD;AACF;;;AC/NO,SAAS,gCAAkD;AAChE,SAAO;AAAA,IACL,UAAU,YAAwB,UAA6C;AAC7E,YAAM,cAAc,IAAI,4BAA4B;AACpD,aAAO,YAAY,UAAU,UAAU;AAAA,IACzC;AAAA,EACF;AACF;","names":[]}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@schemashift/zod-superstruct",
3
+ "version": "0.10.0",
4
+ "description": "Zod ↔ Superstruct transformer for SchemaShift",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "require": {
16
+ "types": "./dist/index.d.cts",
17
+ "default": "./dist/index.cjs"
18
+ }
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsup",
26
+ "test": "vitest run",
27
+ "typecheck": "tsc --noEmit"
28
+ },
29
+ "keywords": [
30
+ "schemashift",
31
+ "zod",
32
+ "superstruct",
33
+ "migration",
34
+ "codemod"
35
+ ],
36
+ "author": "Joseph May",
37
+ "license": "MIT",
38
+ "engines": {
39
+ "node": ">=22.0.0"
40
+ },
41
+ "dependencies": {
42
+ "@schemashift/core": "0.10.0",
43
+ "ts-morph": "27.0.2"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ }
48
+ }