@schemashift/core 0.2.0 → 0.7.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 +330 -41
- package/dist/index.cjs +1332 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +360 -11
- package/dist/index.d.ts +360 -11
- package/dist/index.js +1312 -1
- package/dist/index.js.map +1 -1
- package/package.json +18 -3
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/analyzer.ts","../src/detect.ts","../src/config.ts","../src/transform.ts"],"sourcesContent":["export { type AnalysisResult, SchemaAnalyzer } from './analyzer.js';\nexport {\n type CustomRule,\n loadConfig,\n type SchemaShiftConfig,\n} from './config.js';\nexport { detectSchemaLibrary } from './detect.js';\nexport { TransformEngine, type TransformHandler } from './transform.js';\nexport * from './types.js';\n","import { type Node, Project, type SourceFile, type VariableDeclaration } from 'ts-morph';\nimport { detectSchemaLibrary } from './detect.js';\nimport type { SchemaInfo, SchemaLibrary } from './types.js';\n\nexport interface AnalysisResult {\n schemas: SchemaInfo[];\n imports: Map<string, SchemaLibrary>;\n totalFiles: number;\n filesWithSchemas: number;\n}\n\nexport class SchemaAnalyzer {\n private project: Project;\n\n constructor(tsconfigPath?: string) {\n this.project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: !tsconfigPath,\n });\n }\n\n addSourceFiles(patterns: string[]): void {\n this.project.addSourceFilesAtPaths(patterns);\n }\n\n analyze(): AnalysisResult {\n const schemas: SchemaInfo[] = [];\n const imports = new Map<string, SchemaLibrary>();\n let filesWithSchemas = 0;\n\n for (const sourceFile of this.project.getSourceFiles()) {\n const fileSchemas = this.analyzeFile(sourceFile);\n if (fileSchemas.length > 0) {\n filesWithSchemas++;\n schemas.push(...fileSchemas);\n }\n\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n const lib = detectSchemaLibrary(moduleSpecifier);\n if (lib !== 'unknown') {\n imports.set(sourceFile.getFilePath(), lib);\n }\n }\n }\n\n return {\n schemas,\n imports,\n totalFiles: this.project.getSourceFiles().length,\n filesWithSchemas,\n };\n }\n\n private analyzeFile(sourceFile: SourceFile): SchemaInfo[] {\n const schemas: SchemaInfo[] = [];\n const filePath = sourceFile.getFilePath();\n const library = this.detectFileLibrary(sourceFile);\n\n if (library === 'unknown') return schemas;\n\n sourceFile.getVariableDeclarations().forEach((varDecl: VariableDeclaration) => {\n const initializer = varDecl.getInitializer();\n if (initializer && this.isSchemaExpression(initializer, library)) {\n schemas.push({\n name: varDecl.getName(),\n filePath,\n library,\n lineNumber: varDecl.getStartLineNumber(),\n code: varDecl.getText(),\n });\n }\n });\n\n return schemas;\n }\n\n private detectFileLibrary(sourceFile: SourceFile): SchemaLibrary {\n for (const imp of sourceFile.getImportDeclarations()) {\n const lib = detectSchemaLibrary(imp.getModuleSpecifierValue());\n if (lib !== 'unknown') return lib;\n }\n return 'unknown';\n }\n\n private isSchemaExpression(node: Node, library: SchemaLibrary): boolean {\n const text = node.getText();\n switch (library) {\n case 'zod':\n return text.includes('z.') || text.includes('zod.');\n case 'yup':\n return text.includes('yup.') || text.includes('Yup.');\n case 'joi':\n return text.includes('Joi.') || text.includes('joi.');\n case 'io-ts':\n return text.includes('t.') && node.getSourceFile().getText().includes(\"from 'io-ts'\");\n case 'valibot':\n return text.includes('v.') || text.includes('valibot.');\n default:\n return false;\n }\n }\n\n getProject(): Project {\n return this.project;\n }\n}\n","import type { SchemaLibrary } from './types.js';\n\nconst LIBRARY_PATTERNS: Record<SchemaLibrary, RegExp[]> = {\n zod: [/^zod$/, /^zod\\//],\n 'zod-v3': [/^zod$/], // Detected same as zod, version determined by package.json\n yup: [/^yup$/],\n joi: [/^joi$/, /^@hapi\\/joi$/],\n 'io-ts': [/^io-ts$/, /^io-ts\\//],\n valibot: [/^valibot$/],\n v4: [], // Target version, not detectable from imports\n unknown: [],\n};\n\nexport function detectSchemaLibrary(moduleSpecifier: string): SchemaLibrary {\n for (const [library, patterns] of Object.entries(LIBRARY_PATTERNS)) {\n if (library === 'unknown') continue;\n if (patterns.some((pattern) => pattern.test(moduleSpecifier))) {\n return library as SchemaLibrary;\n }\n }\n return 'unknown';\n}\n","import { cosmiconfig } from 'cosmiconfig';\n\nexport interface SchemaShiftConfig {\n // File patterns\n include: string[];\n exclude: string[];\n\n // Migration defaults\n defaultFrom?: string;\n defaultTo?: string;\n\n // Output\n outputDir?: string;\n reportFormat?: 'json' | 'html' | 'console';\n\n // Git integration\n git?: {\n enabled: boolean;\n createBranch?: boolean;\n branchPrefix?: string;\n autoCommit?: boolean;\n commitMessage?: string;\n };\n\n // Backup/Rollback\n backup?: {\n enabled: boolean;\n dir?: string;\n };\n\n // Custom rules\n customRules?: CustomRule[];\n\n // CI mode\n ci?: boolean;\n}\n\nexport interface CustomRule {\n name: string;\n description?: string;\n match: {\n library: string;\n method: string;\n pattern?: string;\n };\n transform: {\n method: string;\n args?: string[];\n warning?: string;\n };\n}\n\nexport async function loadConfig(configPath?: string): Promise<SchemaShiftConfig> {\n const explorer = cosmiconfig('schemashift', {\n searchPlaces: [\n '.schemashiftrc',\n '.schemashiftrc.json',\n '.schemashiftrc.yaml',\n '.schemashiftrc.yml',\n '.schemashiftrc.js',\n '.schemashiftrc.cjs',\n 'schemashift.config.js',\n 'schemashift.config.cjs',\n 'package.json',\n ],\n });\n\n const result = configPath ? await explorer.load(configPath) : await explorer.search();\n\n return {\n include: ['**/*.ts', '**/*.tsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/*.d.ts'],\n git: { enabled: false },\n backup: { enabled: true, dir: '.schemashift-backup' },\n ...result?.config,\n };\n}\n","import type { SourceFile } from 'ts-morph';\nimport type { SchemaLibrary, TransformOptions, TransformResult } from './types.js';\n\nexport interface TransformHandler {\n transform(sourceFile: SourceFile, options: TransformOptions): TransformResult;\n}\n\nexport class TransformEngine {\n private handlers = new Map<string, TransformHandler>();\n\n registerHandler(from: SchemaLibrary, to: SchemaLibrary, handler: TransformHandler): void {\n this.handlers.set(`${from}->${to}`, handler);\n }\n\n getHandler(from: SchemaLibrary, to: SchemaLibrary): TransformHandler | undefined {\n return this.handlers.get(`${from}->${to}`);\n }\n\n hasHandler(from: SchemaLibrary, to: SchemaLibrary): boolean {\n return this.handlers.has(`${from}->${to}`);\n }\n\n getSupportedPaths(): Array<{ from: SchemaLibrary; to: SchemaLibrary }> {\n return Array.from(this.handlers.keys()).map((key) => {\n const [from, to] = key.split('->') as [SchemaLibrary, SchemaLibrary];\n return { from, to };\n });\n }\n\n transform(\n sourceFile: SourceFile,\n from: SchemaLibrary,\n to: SchemaLibrary,\n options: TransformOptions,\n ): TransformResult {\n const handler = this.getHandler(from, to);\n if (!handler) {\n return {\n success: false,\n filePath: sourceFile.getFilePath(),\n originalCode: sourceFile.getFullText(),\n errors: [{ message: `No handler for ${from}->${to}` }],\n warnings: [],\n };\n }\n return handler.transform(sourceFile, options);\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/analyzer.ts","../src/detect.ts","../src/ast-utils.ts","../src/chain.ts","../src/compatibility.ts","../src/ecosystem.ts","../src/config.ts","../src/dependency-graph.ts","../src/detailed-analyzer.ts","../src/governance.ts","../src/incremental.ts","../src/package-updater.ts","../src/plugin-loader.ts","../src/standard-schema.ts","../src/transform.ts"],"sourcesContent":["export { type AnalysisResult, SchemaAnalyzer } from './analyzer.js';\nexport {\n buildCallChain,\n type CallChainInfo,\n isInsideComment,\n isInsideStringLiteral,\n type MethodCallInfo,\n parseCallChain,\n startsWithBase,\n transformMethodChain,\n} from './ast-utils.js';\nexport {\n type ChainResult,\n type ChainStep,\n type ChainStepResult,\n type ChainValidation,\n MigrationChain,\n} from './chain.js';\nexport {\n CompatibilityAnalyzer,\n type CompatibilityResult,\n type VersionIssue,\n} from './compatibility.js';\nexport {\n type CustomRule,\n type GovernanceRuleConfig,\n loadConfig,\n type SchemaShiftConfig,\n shouldSuppressWarning,\n validateConfig,\n type WarningSuppressionRule,\n} from './config.js';\nexport {\n type DependencyGraphResult,\n SchemaDependencyResolver,\n} from './dependency-graph.js';\nexport {\n type DetailedAnalysisResult,\n DetailedAnalyzer,\n type LibraryVersionInfo,\n type MigrationReadiness,\n type SchemaComplexity,\n} from './detailed-analyzer.js';\nexport { detectFormLibraries, detectSchemaLibrary, type FormLibraryDetection } from './detect.js';\nexport {\n EcosystemAnalyzer,\n type EcosystemIssue,\n type EcosystemReport,\n} from './ecosystem.js';\nexport {\n GovernanceEngine,\n type GovernanceResult,\n type GovernanceViolation,\n} from './governance.js';\nexport {\n type IncrementalState,\n IncrementalTracker,\n} from './incremental.js';\nexport {\n type PackageUpdatePlan,\n PackageUpdater,\n} from './package-updater.js';\nexport {\n PluginLoader,\n type PluginLoadResult,\n type SchemaShiftPlugin,\n} from './plugin-loader.js';\nexport { detectStandardSchema, type StandardSchemaInfo } from './standard-schema.js';\nexport { TransformEngine, type TransformHandler } from './transform.js';\nexport * from './types.js';\n","import { type Node, Project, type SourceFile, type VariableDeclaration } from 'ts-morph';\nimport { detectSchemaLibrary } from './detect.js';\nimport type { SchemaInfo, SchemaLibrary } from './types.js';\n\nexport interface AnalysisResult {\n schemas: SchemaInfo[];\n imports: Map<string, SchemaLibrary>;\n totalFiles: number;\n filesWithSchemas: number;\n}\n\nexport class SchemaAnalyzer {\n private project: Project;\n\n constructor(tsconfigPath?: string) {\n this.project = new Project({\n tsConfigFilePath: tsconfigPath,\n skipAddingFilesFromTsConfig: !tsconfigPath,\n });\n }\n\n addSourceFiles(patterns: string[]): void {\n this.project.addSourceFilesAtPaths(patterns);\n }\n\n analyze(): AnalysisResult {\n const schemas: SchemaInfo[] = [];\n const imports = new Map<string, SchemaLibrary>();\n let filesWithSchemas = 0;\n\n for (const sourceFile of this.project.getSourceFiles()) {\n const fileSchemas = this.analyzeFile(sourceFile);\n if (fileSchemas.length > 0) {\n filesWithSchemas++;\n schemas.push(...fileSchemas);\n }\n\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n const lib = detectSchemaLibrary(moduleSpecifier);\n if (lib !== 'unknown') {\n imports.set(sourceFile.getFilePath(), lib);\n }\n }\n }\n\n return {\n schemas,\n imports,\n totalFiles: this.project.getSourceFiles().length,\n filesWithSchemas,\n };\n }\n\n private analyzeFile(sourceFile: SourceFile): SchemaInfo[] {\n const schemas: SchemaInfo[] = [];\n const filePath = sourceFile.getFilePath();\n const library = this.detectFileLibrary(sourceFile);\n\n if (library === 'unknown') return schemas;\n\n sourceFile.getVariableDeclarations().forEach((varDecl: VariableDeclaration) => {\n const initializer = varDecl.getInitializer();\n if (initializer && this.isSchemaExpression(initializer, library)) {\n schemas.push({\n name: varDecl.getName(),\n filePath,\n library,\n lineNumber: varDecl.getStartLineNumber(),\n code: varDecl.getText(),\n });\n }\n });\n\n return schemas;\n }\n\n private detectFileLibrary(sourceFile: SourceFile): SchemaLibrary {\n for (const imp of sourceFile.getImportDeclarations()) {\n const lib = detectSchemaLibrary(imp.getModuleSpecifierValue());\n if (lib !== 'unknown') return lib;\n }\n return 'unknown';\n }\n\n private isSchemaExpression(node: Node, library: SchemaLibrary): boolean {\n const text = node.getText();\n switch (library) {\n case 'zod':\n return text.includes('z.') || text.includes('zod.');\n case 'yup':\n return text.includes('yup.') || text.includes('Yup.');\n case 'joi':\n return text.includes('Joi.') || text.includes('joi.');\n case 'io-ts':\n return text.includes('t.') && node.getSourceFile().getText().includes(\"from 'io-ts'\");\n case 'valibot':\n return text.includes('v.') || text.includes('valibot.');\n default:\n return false;\n }\n }\n\n getProject(): Project {\n return this.project;\n }\n}\n","import type { SourceFile } from 'ts-morph';\nimport type { SchemaLibrary } from './types.js';\n\nconst LIBRARY_PATTERNS: Record<SchemaLibrary, RegExp[]> = {\n zod: [/^zod$/, /^zod\\//],\n 'zod-v3': [/^zod$/], // Detected same as zod, version determined by package.json\n yup: [/^yup$/],\n joi: [/^joi$/, /^@hapi\\/joi$/],\n 'io-ts': [/^io-ts$/, /^io-ts\\//],\n valibot: [/^valibot$/],\n v4: [], // Target version, not detectable from imports\n unknown: [],\n};\n\nexport function detectSchemaLibrary(moduleSpecifier: string): SchemaLibrary {\n for (const [library, patterns] of Object.entries(LIBRARY_PATTERNS)) {\n if (library === 'unknown') continue;\n if (patterns.some((pattern) => pattern.test(moduleSpecifier))) {\n return library as SchemaLibrary;\n }\n }\n return 'unknown';\n}\n\nexport interface FormLibraryDetection {\n library: string;\n importPath: string;\n lineNumber: number;\n}\n\nconst FORM_LIBRARY_PATTERNS: Record<string, RegExp[]> = {\n 'react-hook-form': [/^react-hook-form$/, /^@hookform\\/resolvers/],\n formik: [/^formik$/],\n 'mantine-form': [/^@mantine\\/form$/],\n};\n\nexport function detectFormLibraries(sourceFile: SourceFile): FormLibraryDetection[] {\n const detections: FormLibraryDetection[] = [];\n\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n\n for (const [library, patterns] of Object.entries(FORM_LIBRARY_PATTERNS)) {\n if (patterns.some((pattern) => pattern.test(moduleSpecifier))) {\n detections.push({\n library,\n importPath: moduleSpecifier,\n lineNumber: imp.getStartLineNumber(),\n });\n }\n }\n }\n\n return detections;\n}\n","import { type CallExpression, type Node, Node as NodeUtils, type SourceFile } from 'ts-morph';\n\n/**\n * Represents a single method call in a chain.\n * e.g., `.email()` or `.min(5, 'Too short')`\n */\nexport interface MethodCallInfo {\n name: string;\n args: string[];\n node: CallExpression;\n}\n\n/**\n * Represents a full call chain like `yup.string().email().min(5)`.\n */\nexport interface CallChainInfo {\n /** The base expression before the first method, e.g., 'yup' or 'Joi' */\n base: string;\n /** The initial factory call, e.g., 'string' from `yup.string()` */\n factoryMethod: string;\n /** Arguments to the factory method */\n factoryArgs: string[];\n /** All chained method calls after the factory */\n methods: MethodCallInfo[];\n /** The outermost call expression node */\n rootNode: CallExpression;\n}\n\n/**\n * Parse a method call chain from the outermost CallExpression.\n *\n * Given `yup.string().email().min(5)`, returns:\n * ```\n * {\n * base: 'yup',\n * factoryMethod: 'string',\n * factoryArgs: [],\n * methods: [\n * { name: 'email', args: [] },\n * { name: 'min', args: ['5'] }\n * ]\n * }\n * ```\n *\n * Returns `undefined` if the node is not a recognizable method chain\n * (e.g., it's a standalone function call).\n */\nexport function parseCallChain(node: CallExpression): CallChainInfo | undefined {\n const methods: MethodCallInfo[] = [];\n let current: CallExpression = node;\n\n // Walk inward through the chain from outermost to innermost\n while (true) {\n const expression = current.getExpression();\n\n if (NodeUtils.isPropertyAccessExpression(expression)) {\n const methodName = expression.getName();\n const args = current.getArguments().map((a) => a.getText());\n const inner = expression.getExpression();\n\n // Check if the inner part is another call expression (continuing the chain)\n if (NodeUtils.isCallExpression(inner)) {\n methods.unshift({ name: methodName, args, node: current });\n current = inner;\n continue;\n }\n\n // Check if the inner part is a property access on an identifier (base.factory())\n if (NodeUtils.isPropertyAccessExpression(inner)) {\n const factoryName = inner.getName();\n const baseExpr = inner.getExpression();\n\n if (NodeUtils.isIdentifier(baseExpr)) {\n methods.unshift({ name: methodName, args, node: current });\n return {\n base: baseExpr.getText(),\n factoryMethod: factoryName,\n factoryArgs: current.getArguments().map((a) => a.getText()),\n methods,\n rootNode: node,\n };\n }\n\n // The base might be deeper — keep going\n methods.unshift({ name: methodName, args, node: current });\n current = inner as unknown as CallExpression;\n\n // If it's not a call expression, we need to handle this differently\n if (!NodeUtils.isCallExpression(current)) {\n // This is something like `z.object({...}).pick(...)` where the inner is PropertyAccess\n // Reconstruct from what we have\n break;\n }\n continue;\n }\n\n // Base case: identifier.method() — this is the factory call itself\n if (NodeUtils.isIdentifier(inner)) {\n return {\n base: inner.getText(),\n factoryMethod: methodName,\n factoryArgs: current.getArguments().map((a) => a.getText()),\n methods,\n rootNode: node,\n };\n }\n }\n\n // Not a method chain we can parse\n break;\n }\n\n return undefined;\n}\n\n/**\n * Build a method chain string from parts.\n *\n * ```ts\n * buildCallChain('z', 'string', [], [\n * { name: 'email', args: [] },\n * { name: 'min', args: ['5'] },\n * ])\n * // => 'z.string().email().min(5)'\n * ```\n */\nexport function buildCallChain(\n base: string,\n factoryMethod: string,\n factoryArgs: string[],\n methods: Array<{ name: string; args: string[] }>,\n): string {\n let result = `${base}.${factoryMethod}(${factoryArgs.join(', ')})`;\n\n for (const method of methods) {\n result += `.${method.name}(${method.args.join(', ')})`;\n }\n\n return result;\n}\n\n/**\n * Check whether a node is inside a string literal or template literal.\n */\nexport function isInsideStringLiteral(node: Node): boolean {\n let current = node.getParent();\n while (current) {\n if (\n NodeUtils.isStringLiteral(current) ||\n NodeUtils.isNoSubstitutionTemplateLiteral(current) ||\n NodeUtils.isTemplateExpression(current)\n ) {\n return true;\n }\n current = current.getParent();\n }\n return false;\n}\n\n/**\n * Check whether a node is inside a comment.\n * Since ts-morph's AST doesn't include comment nodes in the tree,\n * we check by position against leading/trailing comment ranges.\n */\nexport function isInsideComment(node: Node, sourceFile: SourceFile): boolean {\n const start = node.getStart();\n const fullText = sourceFile.getFullText();\n\n // Check if position falls within any single-line or multi-line comment\n let i = 0;\n while (i < fullText.length && i < start) {\n // Single-line comment\n if (fullText[i] === '/' && fullText[i + 1] === '/') {\n const endOfLine = fullText.indexOf('\\n', i);\n const end = endOfLine === -1 ? fullText.length : endOfLine;\n if (start >= i && start < end) return true;\n i = end + 1;\n continue;\n }\n\n // Multi-line comment\n if (fullText[i] === '/' && fullText[i + 1] === '*') {\n const end = fullText.indexOf('*/', i + 2);\n const commentEnd = end === -1 ? fullText.length : end + 2;\n if (start >= i && start < commentEnd) return true;\n i = commentEnd;\n continue;\n }\n\n // String literal — skip over (to avoid false matches inside strings)\n if (fullText[i] === \"'\" || fullText[i] === '\"' || fullText[i] === '`') {\n const quote = fullText[i];\n i++;\n while (i < fullText.length) {\n if (fullText[i] === '\\\\') {\n i += 2;\n continue;\n }\n if (fullText[i] === quote) {\n i++;\n break;\n }\n i++;\n }\n continue;\n }\n\n i++;\n }\n\n return false;\n}\n\n/**\n * Check if a call expression starts with a specific base identifier.\n * Traverses into the chain to find the root identifier.\n *\n * e.g., `startsWithBase(node, 'yup')` returns true for `yup.string().email()`\n */\nexport function startsWithBase(node: CallExpression, ...bases: string[]): boolean {\n const chain = parseCallChain(node);\n if (!chain) return false;\n return bases.includes(chain.base);\n}\n\n/**\n * Transform a method chain by applying a mapping function to each method.\n * Returns the rebuilt chain as a string, or undefined if no transformation was needed.\n *\n * The mapper receives each method and can return:\n * - `{ name, args }` to transform the method\n * - `null` to remove the method from the chain\n * - `undefined` to keep it unchanged\n * - An array to expand into multiple methods\n */\nexport function transformMethodChain(\n chain: CallChainInfo,\n newBase: string,\n factoryMapper: (method: string, args: string[]) => { name: string; args: string[] } | undefined,\n methodMapper: (\n method: MethodCallInfo,\n ) => { name: string; args: string[] } | { name: string; args: string[] }[] | null | undefined,\n): string {\n // Map factory method\n const mappedFactory = factoryMapper(chain.factoryMethod, chain.factoryArgs);\n const factory = mappedFactory || {\n name: chain.factoryMethod,\n args: chain.factoryArgs,\n };\n\n // Map each method in the chain\n const mappedMethods: Array<{ name: string; args: string[] }> = [];\n for (const method of chain.methods) {\n const mapped = methodMapper(method);\n if (mapped === null) {\n // Remove this method\n continue;\n }\n if (mapped === undefined) {\n // Keep unchanged\n mappedMethods.push({ name: method.name, args: method.args });\n } else if (Array.isArray(mapped)) {\n // Expand into multiple methods\n mappedMethods.push(...mapped);\n } else {\n mappedMethods.push(mapped);\n }\n }\n\n return buildCallChain(newBase, factory.name, factory.args, mappedMethods);\n}\n","import { Project } from 'ts-morph';\nimport type { TransformEngine } from './transform.js';\nimport type { SchemaLibrary, TransformResult } from './types.js';\n\nexport interface ChainStep {\n from: SchemaLibrary;\n to: SchemaLibrary;\n}\n\nexport interface ChainValidation {\n valid: boolean;\n errors: string[];\n steps: ChainStep[];\n}\n\nexport interface ChainStepResult {\n step: ChainStep;\n result: TransformResult;\n}\n\nexport interface ChainResult {\n success: boolean;\n steps: ChainStepResult[];\n finalCode?: string;\n errors: string[];\n}\n\nexport class MigrationChain {\n parseChain(chain: string): ChainStep[] {\n // \"yup->zod->valibot\" → [{from:'yup',to:'zod'}, {from:'zod',to:'valibot'}]\n const parts = chain.split('->');\n if (parts.length < 2) return [];\n\n const steps: ChainStep[] = [];\n for (let i = 0; i < parts.length - 1; i++) {\n const from = parts[i];\n const to = parts[i + 1];\n if (!from || !to) continue;\n steps.push({\n from: from as SchemaLibrary,\n to: to as SchemaLibrary,\n });\n }\n return steps;\n }\n\n validateChain(steps: ChainStep[], engine: TransformEngine): ChainValidation {\n const errors: string[] = [];\n\n if (steps.length === 0) {\n errors.push('No migration steps specified');\n return { valid: false, errors, steps };\n }\n\n if (steps.length < 2) {\n errors.push('Chain migration requires at least 2 steps. Use --from/--to for single step.');\n return { valid: false, errors, steps };\n }\n\n for (const step of steps) {\n if (!engine.hasHandler(step.from, step.to)) {\n errors.push(`No handler for step ${step.from}->${step.to}`);\n }\n }\n\n return { valid: errors.length === 0, errors, steps };\n }\n\n executeChain(\n sourceCode: string,\n filePath: string,\n steps: ChainStep[],\n engine: TransformEngine,\n ): ChainResult {\n const stepResults: ChainStepResult[] = [];\n const errors: string[] = [];\n let currentCode = sourceCode;\n\n for (const step of steps) {\n // Create a fresh in-memory project for each step\n const project = new Project({ useInMemoryFileSystem: true });\n const sourceFile = project.createSourceFile(filePath, currentCode);\n\n const result = engine.transform(sourceFile, step.from, step.to, {\n from: step.from,\n to: step.to,\n preserveComments: true,\n });\n\n stepResults.push({ step, result });\n\n if (!result.success) {\n errors.push(`Step ${step.from}->${step.to} failed: ${result.errors[0]?.message}`);\n return { success: false, steps: stepResults, errors };\n }\n\n if (result.transformedCode) {\n currentCode = result.transformedCode;\n }\n }\n\n return {\n success: true,\n steps: stepResults,\n finalCode: currentCode,\n errors,\n };\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { EcosystemAnalyzer, type EcosystemIssue } from './ecosystem.js';\n\nexport interface VersionIssue {\n library: string;\n detectedVersion: string;\n issue: string;\n suggestion: string;\n severity: 'info' | 'warning' | 'error';\n}\n\nexport interface CompatibilityResult {\n detectedVersions: Array<{ library: string; version: string }>;\n issues: VersionIssue[];\n ecosystemIssues: EcosystemIssue[];\n overallScore: number;\n}\n\n// Known version-specific breaking changes and issues\nconst KNOWN_ISSUES: Array<{\n library: string;\n versionPattern: RegExp;\n issue: string;\n suggestion: string;\n severity: VersionIssue['severity'];\n}> = [\n // Zod v3 -> v4 issues\n {\n library: 'zod',\n versionPattern: /^[~^]?3\\./,\n issue: 'Zod v3 uses .errors property which is renamed to .issues in v4',\n suggestion: 'Use zod-v3->v4 migration path to handle API changes',\n severity: 'warning',\n },\n {\n library: 'zod',\n versionPattern: /^[~^]?3\\./,\n issue: 'z.record() key type behavior changed in v4',\n suggestion: 'Ensure z.record() calls explicitly specify key type',\n severity: 'info',\n },\n {\n library: 'zod',\n versionPattern: /^[~^]?4\\./,\n issue: 'Zod v4 detected — already on latest major version',\n suggestion: 'No migration needed for Zod version upgrades',\n severity: 'info',\n },\n // Yup issues\n {\n library: 'yup',\n versionPattern: /^[~^]?0\\./,\n issue: 'Yup v0.x has different .transform() and .cast() behavior from v1.x',\n suggestion: 'Consider upgrading Yup to v1.x before migrating to Zod',\n severity: 'warning',\n },\n {\n library: 'yup',\n versionPattern: /^[~^]?1\\./,\n issue: 'Yup v1.x removed .transform() on mixed() and changed .cast() behavior',\n suggestion: 'Check for .transform() usage on mixed schemas — manual conversion may be needed',\n severity: 'info',\n },\n // Joi issues\n {\n library: 'joi',\n versionPattern: /^[~^]?17\\./,\n issue: \"Joi v17 changed .pattern() semantics and deprecated .allow('')\",\n suggestion: 'Review .pattern() and .allow() usages for v17-specific behavior',\n severity: 'info',\n },\n {\n library: 'joi',\n versionPattern: /^[~^]?(1[0-6])\\./,\n issue: 'Joi < v17 has significant API differences from modern versions',\n suggestion: 'Consider upgrading Joi before migrating to Zod',\n severity: 'warning',\n },\n // io-ts issues\n {\n library: 'io-ts',\n versionPattern: /^[~^]?2\\./,\n issue: 'io-ts v2.x uses Either monad patterns requiring manual conversion',\n suggestion: 'fp-ts Either handling (isRight/isLeft) needs conversion to try/catch with Zod',\n severity: 'warning',\n },\n // Valibot issues\n {\n library: 'valibot',\n versionPattern: /^[~^]?0\\./,\n issue: 'Valibot v0.x API may have breaking changes in v1.0',\n suggestion: 'Pin your Valibot version during migration to avoid API drift',\n severity: 'info',\n },\n];\n\nexport class CompatibilityAnalyzer {\n private ecosystemAnalyzer = new EcosystemAnalyzer();\n\n detectVersions(projectPath: string): Array<{ library: string; version: string }> {\n const versions: Array<{ library: string; version: string }> = [];\n const pkgPath = join(projectPath, 'package.json');\n\n if (!existsSync(pkgPath)) return versions;\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const knownLibs = ['zod', 'yup', 'joi', 'io-ts', 'valibot'];\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n\n for (const lib of knownLibs) {\n const ver = allDeps[lib];\n if (ver) {\n versions.push({ library: lib, version: ver });\n }\n }\n } catch {\n // Invalid package.json\n }\n\n return versions;\n }\n\n checkCompatibility(projectPath: string, from?: string, to?: string): CompatibilityResult {\n const detectedVersions = this.detectVersions(projectPath);\n const issues: VersionIssue[] = [];\n\n for (const detected of detectedVersions) {\n for (const known of KNOWN_ISSUES) {\n if (detected.library === known.library && known.versionPattern.test(detected.version)) {\n issues.push({\n library: detected.library,\n detectedVersion: detected.version,\n issue: known.issue,\n suggestion: known.suggestion,\n severity: known.severity,\n });\n }\n }\n }\n\n // Ecosystem analysis (if migration path is provided)\n let ecosystemIssues: EcosystemIssue[] = [];\n if (from && to) {\n const ecosystemReport = this.ecosystemAnalyzer.analyze(projectPath, from, to);\n ecosystemIssues = ecosystemReport.dependencies;\n }\n\n // Score: start at 100, subtract per issue severity\n const allIssues = [...issues.map((i) => i.severity), ...ecosystemIssues.map((i) => i.severity)];\n const errorCount = allIssues.filter((s) => s === 'error').length;\n const warningCount = allIssues.filter((s) => s === 'warning').length;\n const overallScore = Math.max(0, 100 - errorCount * 30 - warningCount * 10);\n\n return {\n detectedVersions,\n issues,\n ecosystemIssues,\n overallScore,\n };\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface EcosystemIssue {\n package: string;\n installedVersion: string;\n migration: string;\n issue: string;\n suggestion: string;\n severity: 'info' | 'warning' | 'error';\n category: 'orm' | 'form' | 'api' | 'validation-util' | 'openapi' | 'ui';\n}\n\nexport interface EcosystemReport {\n dependencies: EcosystemIssue[];\n warnings: string[];\n blockers: string[];\n}\n\ntype CheckResult = {\n issue: string;\n suggestion: string;\n severity: EcosystemIssue['severity'];\n} | null;\n\ninterface EcosystemRule {\n package: string;\n category: EcosystemIssue['category'];\n migrations: string[];\n check: (version: string, migration: string) => CheckResult;\n}\n\nconst ECOSYSTEM_RULES: EcosystemRule[] = [\n // ORM integrations\n {\n package: 'drizzle-zod',\n category: 'orm',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'drizzle-zod may not support Zod v4. Check for a compatible version before upgrading.',\n suggestion:\n 'Upgrade drizzle-zod to the latest version that supports Zod v4, or use --legacy-peer-deps.',\n severity: 'warning',\n }),\n },\n {\n package: 'zod-prisma',\n category: 'orm',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'zod-prisma generates Zod v3 schemas. Generated files will need regeneration after upgrading to Zod v4.',\n suggestion: 'Upgrade zod-prisma to a v4-compatible version and regenerate schemas.',\n severity: 'warning',\n }),\n },\n {\n package: 'zod-prisma-types',\n category: 'orm',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'zod-prisma-types generates Zod v3 schemas. Generated files will need regeneration.',\n suggestion: 'Check for a Zod v4-compatible version of zod-prisma-types.',\n severity: 'warning',\n }),\n },\n\n // API framework integrations\n {\n package: '@trpc/server',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: (version) => {\n const majorMatch = version.match(/(\\d+)/);\n const major = majorMatch?.[1] ? Number.parseInt(majorMatch[1], 10) : 0;\n if (major < 11) {\n return {\n issue: `tRPC v${major} expects Zod v3 types. A v3 ZodType is not assignable to a v4 ZodType.`,\n suggestion: 'Upgrade to tRPC v11+ which supports Zod v4 via Standard Schema.',\n severity: 'error',\n };\n }\n return {\n issue: 'tRPC v11+ supports Zod v4 via Standard Schema.',\n suggestion: 'No action required — tRPC v11 is compatible with Zod v4.',\n severity: 'info',\n };\n },\n },\n {\n package: 'trpc-ui',\n category: 'ui',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'trpc-ui breaks entirely with Zod v4 schemas.',\n suggestion: 'Check for a Zod v4-compatible version of trpc-ui before upgrading.',\n severity: 'error',\n }),\n },\n\n // Validation utilities\n {\n package: 'zod-validation-error',\n category: 'validation-util',\n migrations: ['zod-v3->v4'],\n check: (version) => {\n const majorMatch = version.match(/(\\d+)/);\n const major = majorMatch?.[1] ? Number.parseInt(majorMatch[1], 10) : 0;\n if (major < 4) {\n return {\n issue: `zod-validation-error v${major} is not compatible with Zod v4.`,\n suggestion: 'Upgrade zod-validation-error to v5.0.0+ for Zod v4 support.',\n severity: 'error',\n };\n }\n return null;\n },\n },\n\n // Form library integrations\n {\n package: '@hookform/resolvers',\n category: 'form',\n migrations: ['yup->zod', 'joi->zod', 'io-ts->zod', 'zod-v3->v4'],\n check: (_version: string, migration: string) => {\n if (migration === 'zod-v3->v4') {\n return {\n issue: '@hookform/resolvers zodResolver may need updating for Zod v4.',\n suggestion: 'Upgrade @hookform/resolvers to the latest version with Zod v4 support.',\n severity: 'warning',\n };\n }\n return {\n issue:\n '@hookform/resolvers will need its resolver import updated for the new schema library.',\n suggestion:\n 'Switch from the old resolver (e.g., yupResolver) to zodResolver from @hookform/resolvers/zod.',\n severity: 'warning',\n };\n },\n },\n {\n package: 'formik',\n category: 'form',\n migrations: ['yup->zod', 'joi->zod'],\n check: () => ({\n issue:\n 'Formik has native Yup integration. Migrating to Zod requires a validation adapter or switching to React Hook Form.',\n suggestion:\n 'Consider switching from Formik to React Hook Form with zodResolver, as Formik is no longer actively maintained.',\n severity: 'warning',\n }),\n },\n {\n package: '@mantine/form',\n category: 'form',\n migrations: ['yup->zod', 'joi->zod'],\n check: () => ({\n issue: '@mantine/form schema adapter will need updating after migration.',\n suggestion:\n 'Update @mantine/form validation to use the Zod adapter instead of the old library adapter.',\n severity: 'warning',\n }),\n },\n\n // OpenAPI integrations\n {\n package: 'zod-openapi',\n category: 'openapi',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'zod-openapi may not support Zod v4 yet.',\n suggestion: 'Check for a Zod v4-compatible version of zod-openapi.',\n severity: 'warning',\n }),\n },\n {\n package: '@asteasolutions/zod-to-openapi',\n category: 'openapi',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: '@asteasolutions/zod-to-openapi may not support Zod v4 yet.',\n suggestion: 'Check for a Zod v4-compatible version of @asteasolutions/zod-to-openapi.',\n severity: 'warning',\n }),\n },\n];\n\nexport class EcosystemAnalyzer {\n analyze(projectPath: string, from: string, to: string): EcosystemReport {\n const migration = `${from}->${to}`;\n const dependencies: EcosystemIssue[] = [];\n const warnings: string[] = [];\n const blockers: string[] = [];\n\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) {\n return { dependencies, warnings, blockers };\n }\n\n let allDeps: Record<string, string> = {};\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n } catch {\n return { dependencies, warnings, blockers };\n }\n\n for (const rule of ECOSYSTEM_RULES) {\n if (!rule.migrations.includes(migration)) continue;\n\n const installedVersion = allDeps[rule.package];\n if (!installedVersion) continue;\n\n const result = rule.check(installedVersion, migration);\n if (!result) continue;\n\n const issue: EcosystemIssue = {\n package: rule.package,\n installedVersion,\n migration,\n issue: result.issue,\n suggestion: result.suggestion,\n severity: result.severity,\n category: rule.category,\n };\n\n dependencies.push(issue);\n\n if (result.severity === 'error') {\n blockers.push(`${rule.package}@${installedVersion}: ${result.issue}`);\n } else if (result.severity === 'warning') {\n warnings.push(`${rule.package}@${installedVersion}: ${result.issue}`);\n }\n }\n\n return { dependencies, warnings, blockers };\n }\n}\n","import { cosmiconfig } from 'cosmiconfig';\n\nexport interface SchemaShiftConfig {\n // File patterns\n include: string[];\n exclude: string[];\n\n // Migration defaults\n defaultFrom?: string;\n defaultTo?: string;\n\n // Output\n outputDir?: string;\n reportFormat?: 'json' | 'html' | 'console';\n\n // Git integration\n git?: {\n enabled: boolean;\n createBranch?: boolean;\n branchPrefix?: string;\n autoCommit?: boolean;\n commitMessage?: string;\n };\n\n // Backup/Rollback\n backup?: {\n enabled: boolean;\n dir?: string;\n };\n\n // Custom rules\n customRules?: CustomRule[];\n\n // Warning suppression\n suppressWarnings?: WarningSuppressionRule[];\n\n // CI mode\n ci?: boolean;\n\n // Plugins (TEAM)\n plugins?: string[];\n\n // Governance (TEAM)\n governance?: {\n rules: Record<string, GovernanceRuleConfig>;\n failOnViolation?: boolean;\n };\n}\n\nexport interface GovernanceRuleConfig {\n enabled?: boolean;\n pattern?: string;\n threshold?: number;\n}\n\nexport interface WarningSuppressionRule {\n code: string;\n files?: string[];\n}\n\nexport interface CustomRule {\n name: string;\n description?: string;\n match: {\n library: string;\n method: string;\n pattern?: string;\n };\n transform: {\n method: string;\n args?: string[];\n warning?: string;\n };\n}\n\nexport function validateConfig(config: SchemaShiftConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n if (config.include && !Array.isArray(config.include)) {\n errors.push('\"include\" must be an array of glob patterns');\n }\n if (config.exclude && !Array.isArray(config.exclude)) {\n errors.push('\"exclude\" must be an array of glob patterns');\n }\n\n if (config.customRules) {\n for (const [i, rule] of config.customRules.entries()) {\n if (!rule.name) errors.push(`customRules[${i}]: \"name\" is required`);\n if (!rule.match?.library) errors.push(`customRules[${i}]: \"match.library\" is required`);\n if (!rule.match?.method) errors.push(`customRules[${i}]: \"match.method\" is required`);\n if (!rule.transform?.method) errors.push(`customRules[${i}]: \"transform.method\" is required`);\n }\n }\n\n if (config.suppressWarnings) {\n for (const [i, rule] of config.suppressWarnings.entries()) {\n if (!rule.code) errors.push(`suppressWarnings[${i}]: \"code\" is required`);\n if (rule.files && !Array.isArray(rule.files)) {\n errors.push(`suppressWarnings[${i}]: \"files\" must be an array`);\n }\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n\nexport function shouldSuppressWarning(\n warning: string,\n filePath: string,\n rules: WarningSuppressionRule[],\n): boolean {\n for (const rule of rules) {\n if (!warning.includes(rule.code)) continue;\n if (!rule.files || rule.files.length === 0) return true;\n if (rule.files.some((pattern) => filePath.includes(pattern))) return true;\n }\n return false;\n}\n\nexport async function loadConfig(configPath?: string): Promise<SchemaShiftConfig> {\n const explorer = cosmiconfig('schemashift', {\n searchPlaces: [\n '.schemashiftrc',\n '.schemashiftrc.json',\n '.schemashiftrc.yaml',\n '.schemashiftrc.yml',\n '.schemashiftrc.js',\n '.schemashiftrc.cjs',\n 'schemashift.config.js',\n 'schemashift.config.cjs',\n 'package.json',\n ],\n });\n\n const result = configPath ? await explorer.load(configPath) : await explorer.search();\n\n return {\n include: ['**/*.ts', '**/*.tsx'],\n exclude: ['**/node_modules/**', '**/dist/**', '**/*.d.ts'],\n git: { enabled: false },\n backup: { enabled: true, dir: '.schemashift-backup' },\n ...result?.config,\n };\n}\n","import type { Project, SourceFile } from 'ts-morph';\n\nexport interface DependencyGraphResult {\n /** Files sorted in dependency order (dependencies first) */\n sortedFiles: string[];\n /** Map of file -> files it depends on */\n dependencies: Map<string, string[]>;\n /** Circular dependency warnings */\n circularWarnings: string[];\n /** Total cross-file schema references */\n crossFileRefs: number;\n}\n\nexport class SchemaDependencyResolver {\n resolve(project: Project, filePaths: string[]): DependencyGraphResult {\n const fileSet = new Set(filePaths);\n const dependencies = new Map<string, string[]>();\n let crossFileRefs = 0;\n\n for (const filePath of filePaths) {\n const sourceFile = project.getSourceFile(filePath);\n if (!sourceFile) continue;\n\n const deps = this.findDependencies(sourceFile, fileSet);\n dependencies.set(filePath, deps);\n crossFileRefs += deps.length;\n }\n\n const circularWarnings = this.detectCycles(dependencies);\n const sortedFiles = this.topologicalSort(filePaths, dependencies);\n\n return {\n sortedFiles,\n dependencies,\n circularWarnings,\n crossFileRefs,\n };\n }\n\n private findDependencies(sourceFile: SourceFile, fileSet: Set<string>): string[] {\n const deps: string[] = [];\n const filePath = sourceFile.getFilePath();\n\n for (const imp of sourceFile.getImportDeclarations()) {\n const moduleSpecifier = imp.getModuleSpecifierValue();\n\n // Skip external packages\n if (!moduleSpecifier.startsWith('.') && !moduleSpecifier.startsWith('/')) continue;\n\n // Resolve the import to an actual file path\n const resolvedSourceFile = imp.getModuleSpecifierSourceFile();\n if (!resolvedSourceFile) continue;\n\n const resolvedPath = resolvedSourceFile.getFilePath();\n if (resolvedPath === filePath) continue;\n if (!fileSet.has(resolvedPath)) continue;\n\n if (!deps.includes(resolvedPath)) {\n deps.push(resolvedPath);\n }\n }\n\n return deps;\n }\n\n private detectCycles(dependencies: Map<string, string[]>): string[] {\n const warnings: string[] = [];\n const visited = new Set<string>();\n const inStack = new Set<string>();\n\n const dfs = (node: string, path: string[]): void => {\n if (inStack.has(node)) {\n const cycleStart = path.indexOf(node);\n const cycle = path.slice(cycleStart).concat(node);\n warnings.push(`Circular dependency: ${cycle.map(this.shortenPath).join(' -> ')}`);\n return;\n }\n if (visited.has(node)) return;\n\n visited.add(node);\n inStack.add(node);\n\n const deps = dependencies.get(node) || [];\n for (const dep of deps) {\n dfs(dep, [...path, node]);\n }\n\n inStack.delete(node);\n };\n\n for (const node of dependencies.keys()) {\n dfs(node, []);\n }\n\n return warnings;\n }\n\n private topologicalSort(filePaths: string[], dependencies: Map<string, string[]>): string[] {\n const visited = new Set<string>();\n const sorted: string[] = [];\n\n const visit = (node: string): void => {\n if (visited.has(node)) return;\n visited.add(node);\n\n const deps = dependencies.get(node) || [];\n for (const dep of deps) {\n visit(dep);\n }\n\n sorted.push(node);\n };\n\n for (const filePath of filePaths) {\n visit(filePath);\n }\n\n return sorted;\n }\n\n private shortenPath(filePath: string): string {\n const parts = filePath.split('/');\n return parts.slice(-2).join('/');\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Node, SourceFile, VariableDeclaration } from 'ts-morph';\nimport type { SchemaAnalyzer } from './analyzer.js';\nimport { detectSchemaLibrary } from './detect.js';\nimport type { SchemaInfo, SchemaLibrary } from './types.js';\n\nconst COMPLEXITY_CHAIN_WEIGHT = 2;\nconst COMPLEXITY_DEPTH_WEIGHT = 3;\nconst COMPLEXITY_VALIDATION_WEIGHT = 1;\nconst COMPLEXITY_MAX = 100;\nconst COMPLEXITY_LOW_THRESHOLD = 25;\nconst COMPLEXITY_MEDIUM_THRESHOLD = 50;\nconst COMPLEXITY_HIGH_THRESHOLD = 75;\n\nexport interface SchemaComplexity {\n schemaName: string;\n filePath: string;\n library: SchemaLibrary;\n lineNumber: number;\n chainLength: number;\n nestedDepth: number;\n validationCount: number;\n score: number;\n level: 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport interface MigrationReadiness {\n from: SchemaLibrary;\n to: SchemaLibrary;\n totalSchemas: number;\n supportedSchemas: number;\n unsupportedPatterns: string[];\n estimatedManualFixes: number;\n readinessPercent: number;\n riskLevel: 'low' | 'medium' | 'high' | 'critical';\n}\n\nexport interface LibraryVersionInfo {\n library: string;\n version: string;\n}\n\nexport interface DetailedAnalysisResult {\n complexities: SchemaComplexity[];\n averageComplexity: number;\n maxComplexity: number;\n libraryVersions: LibraryVersionInfo[];\n readiness?: MigrationReadiness;\n}\n\nexport class DetailedAnalyzer {\n analyzeComplexity(analyzer: SchemaAnalyzer): SchemaComplexity[] {\n const complexities: SchemaComplexity[] = [];\n\n for (const sourceFile of analyzer.getProject().getSourceFiles()) {\n const library = this.detectFileLibrary(sourceFile);\n if (library === 'unknown') continue;\n\n for (const varDecl of sourceFile.getVariableDeclarations()) {\n const initializer = varDecl.getInitializer();\n if (!initializer) continue;\n if (!this.isSchemaExpression(initializer, library)) continue;\n\n const complexity = this.computeComplexity(varDecl, sourceFile, library);\n complexities.push(complexity);\n }\n }\n\n return complexities;\n }\n\n analyzeReadiness(\n schemas: SchemaInfo[],\n from: SchemaLibrary,\n to: SchemaLibrary,\n supportedMethods: Set<string>,\n ): MigrationReadiness {\n let supportedSchemas = 0;\n const unsupportedPatterns: string[] = [];\n\n for (const schema of schemas) {\n if (schema.library !== from && schema.library !== 'unknown') continue;\n\n const methods = this.extractMethodNames(schema.code);\n const unsupported = methods.filter((m) => !supportedMethods.has(m));\n\n if (unsupported.length === 0) {\n supportedSchemas++;\n } else {\n for (const m of unsupported) {\n const pattern = `.${m}()`;\n if (!unsupportedPatterns.includes(pattern)) {\n unsupportedPatterns.push(pattern);\n }\n }\n }\n }\n\n const totalSchemas = schemas.filter(\n (s) => s.library === from || s.library === 'unknown',\n ).length;\n const readinessPercent =\n totalSchemas > 0 ? Math.round((supportedSchemas / totalSchemas) * 100) : 100;\n const estimatedManualFixes = totalSchemas - supportedSchemas;\n\n let riskLevel: MigrationReadiness['riskLevel'];\n if (readinessPercent >= 90) riskLevel = 'low';\n else if (readinessPercent >= 70) riskLevel = 'medium';\n else if (readinessPercent >= 50) riskLevel = 'high';\n else riskLevel = 'critical';\n\n return {\n from,\n to,\n totalSchemas,\n supportedSchemas,\n unsupportedPatterns,\n estimatedManualFixes,\n readinessPercent,\n riskLevel,\n };\n }\n\n detectLibraryVersions(projectPath: string): LibraryVersionInfo[] {\n const versions: LibraryVersionInfo[] = [];\n const pkgPath = join(projectPath, 'package.json');\n\n if (!existsSync(pkgPath)) return versions;\n\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n const knownLibs = ['zod', 'yup', 'joi', 'io-ts', 'valibot'];\n const allDeps = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n\n for (const lib of knownLibs) {\n const ver = allDeps[lib];\n if (ver) {\n versions.push({ library: lib, version: ver });\n }\n }\n } catch {\n // Invalid package.json — skip\n }\n\n return versions;\n }\n\n generateDetailedResult(\n complexities: SchemaComplexity[],\n projectPath: string,\n readiness?: MigrationReadiness,\n ): DetailedAnalysisResult {\n const scores = complexities.map((c) => c.score);\n const averageComplexity =\n scores.length > 0 ? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length) : 0;\n const maxComplexity = scores.length > 0 ? Math.max(...scores) : 0;\n\n return {\n complexities,\n averageComplexity,\n maxComplexity,\n libraryVersions: this.detectLibraryVersions(projectPath),\n readiness,\n };\n }\n\n private computeComplexity(\n varDecl: VariableDeclaration,\n sourceFile: SourceFile,\n library: SchemaLibrary,\n ): SchemaComplexity {\n const initializer = varDecl.getInitializer();\n if (!initializer) {\n return {\n schemaName: varDecl.getName(),\n filePath: sourceFile.getFilePath(),\n library,\n lineNumber: varDecl.getStartLineNumber(),\n chainLength: 0,\n nestedDepth: 0,\n validationCount: 0,\n score: 0,\n level: 'low' as const,\n };\n }\n const text = initializer.getText();\n\n const chainLength = this.countChainLength(text);\n const nestedDepth = this.countNestedDepth(text, library);\n const validationCount = this.countValidations(text);\n\n const rawScore =\n chainLength * COMPLEXITY_CHAIN_WEIGHT +\n nestedDepth * COMPLEXITY_DEPTH_WEIGHT +\n validationCount * COMPLEXITY_VALIDATION_WEIGHT;\n const score = Math.min(COMPLEXITY_MAX, rawScore);\n\n let level: SchemaComplexity['level'];\n if (score <= COMPLEXITY_LOW_THRESHOLD) level = 'low';\n else if (score <= COMPLEXITY_MEDIUM_THRESHOLD) level = 'medium';\n else if (score <= COMPLEXITY_HIGH_THRESHOLD) level = 'high';\n else level = 'critical';\n\n return {\n schemaName: varDecl.getName(),\n filePath: sourceFile.getFilePath(),\n library,\n lineNumber: varDecl.getStartLineNumber(),\n chainLength,\n nestedDepth,\n validationCount,\n score,\n level,\n };\n }\n\n private countChainLength(text: string): number {\n const methodPattern = /\\.\\w+\\(/g;\n const matches = text.match(methodPattern);\n return matches ? matches.length : 0;\n }\n\n private countNestedDepth(text: string, library: SchemaLibrary): number {\n const prefix = this.getLibraryPrefix(library);\n if (!prefix) return 0;\n\n const pattern = new RegExp(`\\\\b${this.escapeRegex(prefix)}\\\\.`, 'g');\n const matches = text.match(pattern);\n return matches ? Math.max(0, matches.length - 1) : 0;\n }\n\n private countValidations(text: string): number {\n const validationMethods = [\n 'min',\n 'max',\n 'email',\n 'url',\n 'uuid',\n 'regex',\n 'trim',\n 'length',\n 'positive',\n 'negative',\n 'int',\n 'integer',\n 'finite',\n 'nonnegative',\n 'nonpositive',\n 'required',\n 'optional',\n 'nullable',\n 'nullish',\n 'refine',\n 'superRefine',\n 'transform',\n 'nonempty',\n 'ip',\n 'cuid',\n 'startsWith',\n 'endsWith',\n 'includes',\n 'datetime',\n 'date',\n ];\n\n let count = 0;\n for (const method of validationMethods) {\n const pattern = new RegExp(`\\\\.${method}\\\\(`, 'g');\n const matches = text.match(pattern);\n if (matches) count += matches.length;\n }\n return count;\n }\n\n private extractMethodNames(code: string): string[] {\n const methodPattern = /\\.(\\w+)\\(/g;\n const methods: string[] = [];\n for (const match of code.matchAll(methodPattern)) {\n if (match[1]) methods.push(match[1]);\n }\n return methods;\n }\n\n private getLibraryPrefix(library: SchemaLibrary): string {\n switch (library) {\n case 'zod':\n case 'zod-v3':\n return 'z';\n case 'yup':\n return 'yup';\n case 'joi':\n return 'Joi';\n case 'io-ts':\n return 't';\n case 'valibot':\n return 'v';\n default:\n return '';\n }\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n }\n\n private detectFileLibrary(sourceFile: SourceFile): SchemaLibrary {\n for (const imp of sourceFile.getImportDeclarations()) {\n const lib = detectSchemaLibrary(imp.getModuleSpecifierValue());\n if (lib !== 'unknown') return lib;\n }\n return 'unknown';\n }\n\n private isSchemaExpression(node: Node, library: SchemaLibrary): boolean {\n const text = node.getText();\n switch (library) {\n case 'zod':\n return text.includes('z.') || text.includes('zod.');\n case 'yup':\n return text.includes('yup.') || text.includes('Yup.');\n case 'joi':\n return text.includes('Joi.') || text.includes('joi.');\n case 'io-ts':\n return text.includes('t.') && node.getSourceFile().getText().includes(\"from 'io-ts'\");\n case 'valibot':\n return text.includes('v.') || text.includes('valibot.');\n default:\n return false;\n }\n }\n}\n","import type { Project, SourceFile } from 'ts-morph';\nimport type { GovernanceRuleConfig } from './config.js';\nimport { detectSchemaLibrary } from './detect.js';\n\nexport interface GovernanceViolation {\n rule: string;\n message: string;\n filePath: string;\n lineNumber: number;\n schemaName: string;\n severity: 'warning' | 'error';\n fixable: boolean;\n}\n\nexport interface GovernanceResult {\n violations: GovernanceViolation[];\n filesScanned: number;\n schemasChecked: number;\n passed: boolean;\n}\n\nexport class GovernanceEngine {\n private rules: Map<string, GovernanceRuleConfig> = new Map();\n\n configure(rules: Record<string, GovernanceRuleConfig>): void {\n this.rules.clear();\n for (const [name, config] of Object.entries(rules)) {\n if (config.enabled !== false) {\n this.rules.set(name, config);\n }\n }\n }\n\n analyze(project: Project): GovernanceResult {\n const violations: GovernanceViolation[] = [];\n let schemasChecked = 0;\n let filesScanned = 0;\n\n for (const sourceFile of project.getSourceFiles()) {\n const library = this.detectFileLibrary(sourceFile);\n if (library === 'unknown') continue;\n filesScanned++;\n\n for (const varDecl of sourceFile.getVariableDeclarations()) {\n const initializer = varDecl.getInitializer();\n if (!initializer) continue;\n\n const text = initializer.getText();\n if (!this.isSchemaExpression(text, library)) continue;\n\n schemasChecked++;\n const filePath = sourceFile.getFilePath();\n const lineNumber = varDecl.getStartLineNumber();\n const schemaName = varDecl.getName();\n\n // Run each enabled rule\n if (this.rules.has('naming-convention')) {\n const config = this.rules.get('naming-convention') ?? {};\n const pattern = config.pattern || '.*Schema$';\n if (!new RegExp(pattern).test(schemaName)) {\n violations.push({\n rule: 'naming-convention',\n message: `Schema \"${schemaName}\" does not match naming pattern: ${pattern}`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'warning',\n fixable: true,\n });\n }\n }\n\n if (this.rules.has('max-complexity')) {\n const config = this.rules.get('max-complexity') ?? {};\n const threshold = config.threshold ?? 80;\n const chainLength = (text.match(/\\.\\w+\\(/g) || []).length;\n const complexity = chainLength * 5;\n if (complexity > threshold) {\n violations.push({\n rule: 'max-complexity',\n message: `Schema \"${schemaName}\" exceeds complexity threshold (${complexity} > ${threshold})`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'warning',\n fixable: false,\n });\n }\n }\n\n if (this.rules.has('no-any')) {\n if (text.includes('.any()')) {\n violations.push({\n rule: 'no-any',\n message: `Schema \"${schemaName}\" uses .any() — consider using a specific type`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'error',\n fixable: false,\n });\n }\n }\n\n if (this.rules.has('required-validations')) {\n // Check if string schemas have at least .max()\n if (text.includes('.string()') && !text.includes('.max(')) {\n violations.push({\n rule: 'required-validations',\n message: `Schema \"${schemaName}\" has string() without .max() — consider adding a max length`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'warning',\n fixable: true,\n });\n }\n }\n }\n }\n\n return {\n violations,\n filesScanned,\n schemasChecked,\n passed: violations.filter((v) => v.severity === 'error').length === 0,\n };\n }\n\n private detectFileLibrary(sourceFile: SourceFile): string {\n for (const imp of sourceFile.getImportDeclarations()) {\n const lib = detectSchemaLibrary(imp.getModuleSpecifierValue());\n if (lib !== 'unknown') return lib;\n }\n return 'unknown';\n }\n\n private isSchemaExpression(text: string, library: string): boolean {\n switch (library) {\n case 'zod':\n return text.includes('z.') || text.includes('zod.');\n case 'yup':\n return text.includes('yup.') || text.includes('Yup.');\n case 'joi':\n return text.includes('Joi.') || text.includes('joi.');\n case 'io-ts':\n return text.includes('t.');\n case 'valibot':\n return text.includes('v.') || text.includes('valibot.');\n default:\n return false;\n }\n }\n}\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface IncrementalState {\n migrationId: string;\n from: SchemaLibrary;\n to: SchemaLibrary;\n startedAt: string;\n completedFiles: string[];\n remainingFiles: string[];\n failedFiles: string[];\n}\n\nconst STATE_DIR = '.schemashift';\nconst STATE_FILE = 'incremental.json';\n\nexport class IncrementalTracker {\n private stateDir: string;\n private statePath: string;\n\n constructor(projectPath: string) {\n this.stateDir = join(projectPath, STATE_DIR);\n this.statePath = join(this.stateDir, STATE_FILE);\n }\n\n start(files: string[], from: SchemaLibrary, to: SchemaLibrary): IncrementalState {\n const state: IncrementalState = {\n migrationId: `incremental-${Date.now()}`,\n from,\n to,\n startedAt: new Date().toISOString(),\n completedFiles: [],\n remainingFiles: [...files],\n failedFiles: [],\n };\n\n this.saveState(state);\n return state;\n }\n\n markComplete(filePath: string): void {\n const state = this.getState();\n if (!state) return;\n\n state.remainingFiles = state.remainingFiles.filter((f) => f !== filePath);\n state.failedFiles = state.failedFiles.filter((f) => f !== filePath);\n if (!state.completedFiles.includes(filePath)) {\n state.completedFiles.push(filePath);\n }\n\n this.saveState(state);\n }\n\n markFailed(filePath: string): void {\n const state = this.getState();\n if (!state) return;\n\n state.remainingFiles = state.remainingFiles.filter((f) => f !== filePath);\n if (!state.failedFiles.includes(filePath)) {\n state.failedFiles.push(filePath);\n }\n\n this.saveState(state);\n }\n\n getState(): IncrementalState | null {\n if (!existsSync(this.statePath)) return null;\n\n try {\n return JSON.parse(readFileSync(this.statePath, 'utf-8')) as IncrementalState;\n } catch {\n return null;\n }\n }\n\n resume(): IncrementalState | null {\n return this.getState();\n }\n\n getNextBatch(batchSize: number): string[] {\n const state = this.getState();\n if (!state) return [];\n return state.remainingFiles.slice(0, batchSize);\n }\n\n getProgress(): {\n completed: number;\n remaining: number;\n failed: number;\n total: number;\n percent: number;\n } | null {\n const state = this.getState();\n if (!state) return null;\n\n const total =\n state.completedFiles.length + state.remainingFiles.length + state.failedFiles.length;\n const percent = total > 0 ? Math.round((state.completedFiles.length / total) * 100) : 0;\n\n return {\n completed: state.completedFiles.length,\n remaining: state.remainingFiles.length,\n failed: state.failedFiles.length,\n total,\n percent,\n };\n }\n\n clear(): void {\n if (existsSync(this.statePath)) {\n writeFileSync(this.statePath, '');\n }\n }\n\n private saveState(state: IncrementalState): void {\n if (!existsSync(this.stateDir)) {\n mkdirSync(this.stateDir, { recursive: true });\n }\n writeFileSync(this.statePath, JSON.stringify(state, null, 2));\n }\n}\n","import { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface PackageUpdatePlan {\n add: Record<string, string>;\n remove: string[];\n warnings: string[];\n}\n\n// Recommended target library versions for each migration path\nconst TARGET_VERSIONS: Record<string, Record<string, string>> = {\n 'yup->zod': { zod: '^3.24.0' },\n 'joi->zod': { zod: '^3.24.0' },\n 'io-ts->zod': { zod: '^3.24.0' },\n 'zod-v3->v4': { zod: '^4.0.0' },\n 'zod->valibot': { valibot: '^1.0.0' },\n};\n\n// Source libraries that could be removed after migration\nconst SOURCE_PACKAGES: Record<string, string[]> = {\n 'yup->zod': ['yup'],\n 'joi->zod': ['joi', '@hapi/joi'],\n 'io-ts->zod': ['io-ts', 'fp-ts'],\n 'zod->valibot': [], // zod might still be used elsewhere\n};\n\nexport class PackageUpdater {\n plan(projectPath: string, from: string, to: string): PackageUpdatePlan {\n const migration = `${from}->${to}`;\n const add: Record<string, string> = {};\n const remove: string[] = [];\n const warnings: string[] = [];\n\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) {\n warnings.push('No package.json found. Cannot plan dependency updates.');\n return { add, remove, warnings };\n }\n\n let pkg: {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n try {\n pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as typeof pkg;\n } catch {\n warnings.push('Could not parse package.json.');\n return { add, remove, warnings };\n }\n\n const allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n const targets = TARGET_VERSIONS[migration];\n\n if (targets) {\n for (const [name, version] of Object.entries(targets)) {\n const existing = allDeps[name];\n if (!existing) {\n add[name] = version;\n } else if (migration === 'zod-v3->v4') {\n // For Zod v3->v4, update the version\n add[name] = version;\n warnings.push(`zod will be updated from ${existing} to ${version}.`);\n }\n }\n }\n\n // Suggest source library removal (but don't auto-remove)\n const sources = SOURCE_PACKAGES[migration];\n if (sources) {\n for (const src of sources) {\n if (allDeps[src]) {\n remove.push(src);\n warnings.push(`${src} can be removed after verifying all schemas have been migrated.`);\n }\n }\n }\n\n return { add, remove, warnings };\n }\n\n apply(projectPath: string, plan: PackageUpdatePlan): void {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) return;\n\n const pkgText = readFileSync(pkgPath, 'utf-8');\n const pkg = JSON.parse(pkgText) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n\n if (!pkg.dependencies) pkg.dependencies = {};\n\n // Add new dependencies\n for (const [name, version] of Object.entries(plan.add)) {\n // If it exists in devDependencies, update there; otherwise add to dependencies\n if (pkg.devDependencies?.[name]) {\n pkg.devDependencies[name] = version;\n } else {\n pkg.dependencies[name] = version;\n }\n }\n\n // Note: We don't auto-remove source packages — that's manual\n // The plan.remove list is just for informational purposes\n\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`);\n }\n}\n","import type { CustomRule } from './config.js';\nimport type { TransformHandler } from './transform.js';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface SchemaShiftPlugin {\n name: string;\n version: string;\n handlers?: Array<{\n from: SchemaLibrary;\n to: SchemaLibrary;\n handler: TransformHandler;\n }>;\n rules?: CustomRule[];\n}\n\nexport interface PluginLoadResult {\n loaded: SchemaShiftPlugin[];\n errors: string[];\n}\n\nexport class PluginLoader {\n async loadPlugins(pluginPaths: string[]): Promise<PluginLoadResult> {\n const loaded: SchemaShiftPlugin[] = [];\n const errors: string[] = [];\n\n for (const pluginPath of pluginPaths) {\n try {\n const mod = (await import(pluginPath)) as {\n default?: SchemaShiftPlugin;\n } & SchemaShiftPlugin;\n const plugin = mod.default || mod;\n\n const validationError = this.validatePlugin(plugin, pluginPath);\n if (validationError) {\n errors.push(validationError);\n continue;\n }\n\n loaded.push(plugin);\n } catch (err) {\n errors.push(\n `Failed to load plugin ${pluginPath}: ${err instanceof Error ? err.message : 'Unknown error'}`,\n );\n }\n }\n\n return { loaded, errors };\n }\n\n private validatePlugin(plugin: unknown, path: string): string | undefined {\n if (!plugin || typeof plugin !== 'object') {\n return `Plugin ${path}: must export an object`;\n }\n\n const p = plugin as Record<string, unknown>;\n\n if (typeof p.name !== 'string' || !p.name) {\n return `Plugin ${path}: missing \"name\" property`;\n }\n\n if (typeof p.version !== 'string' || !p.version) {\n return `Plugin ${path}: missing \"version\" property`;\n }\n\n if (p.handlers && !Array.isArray(p.handlers)) {\n return `Plugin ${path}: \"handlers\" must be an array`;\n }\n\n if (p.rules && !Array.isArray(p.rules)) {\n return `Plugin ${path}: \"rules\" must be an array`;\n }\n\n return undefined;\n }\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface StandardSchemaInfo {\n detected: boolean;\n compatibleLibraries: Array<{ name: string; version: string }>;\n recommendation: string;\n}\n\n// Libraries that implement Standard Schema and their minimum compatible versions\nconst STANDARD_SCHEMA_LIBRARIES: Record<string, { minMajor: number; minMinor: number }> = {\n zod: { minMajor: 3, minMinor: 23 }, // Zod v3.23+ and v4+\n valibot: { minMajor: 1, minMinor: 0 }, // Valibot v1.0+\n arktype: { minMajor: 2, minMinor: 0 }, // ArkType v2.0+\n '@effect/schema': { minMajor: 0, minMinor: 0 }, // Effect Schema (any version)\n typebox: { minMajor: 0, minMinor: 34 }, // TypeBox v0.34+\n};\n\nfunction parseVersion(version: string): { major: number; minor: number } | null {\n const match = version.match(/(\\d+)\\.(\\d+)/);\n if (!match?.[1] || !match[2]) return null;\n return {\n major: Number.parseInt(match[1], 10),\n minor: Number.parseInt(match[2], 10),\n };\n}\n\nfunction isVersionCompatible(version: string, minMajor: number, minMinor: number): boolean {\n const parsed = parseVersion(version);\n if (!parsed) return false;\n if (parsed.major > minMajor) return true;\n if (parsed.major === minMajor && parsed.minor >= minMinor) return true;\n return false;\n}\n\nexport function detectStandardSchema(projectPath: string): StandardSchemaInfo {\n const pkgPath = join(projectPath, 'package.json');\n\n if (!existsSync(pkgPath)) {\n return { detected: false, compatibleLibraries: [], recommendation: '' };\n }\n\n let allDeps: Record<string, string> = {};\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n allDeps = { ...pkg.dependencies, ...pkg.devDependencies };\n } catch {\n return { detected: false, compatibleLibraries: [], recommendation: '' };\n }\n\n // Check for explicit Standard Schema dependency\n const hasExplicitStandardSchema = '@standard-schema/spec' in allDeps;\n\n // Check for compatible libraries\n const compatibleLibraries: Array<{ name: string; version: string }> = [];\n\n for (const [lib, { minMajor, minMinor }] of Object.entries(STANDARD_SCHEMA_LIBRARIES)) {\n const version = allDeps[lib];\n if (version && isVersionCompatible(version, minMajor, minMinor)) {\n compatibleLibraries.push({ name: lib, version });\n }\n }\n\n const detected = hasExplicitStandardSchema || compatibleLibraries.length > 0;\n\n let recommendation = '';\n if (detected && compatibleLibraries.length > 1) {\n recommendation =\n 'Multiple Standard Schema-compatible libraries detected. ' +\n 'These can interoperate through the Standard Schema interface, ' +\n 'reducing the need for library-specific adapters in tools like tRPC, TanStack Form, and TanStack Router.';\n } else if (detected && compatibleLibraries.length === 1) {\n recommendation =\n `${compatibleLibraries[0]?.name} supports Standard Schema, enabling interoperability with ` +\n 'ecosystem tools that adopt the Standard Schema interface (tRPC, TanStack Form, etc.).';\n } else if (hasExplicitStandardSchema) {\n recommendation =\n 'Standard Schema spec detected. Ensure your validation library supports Standard Schema for maximum interoperability.';\n }\n\n return { detected, compatibleLibraries, recommendation };\n}\n","import type { SourceFile } from 'ts-morph';\nimport type { SchemaLibrary, TransformOptions, TransformResult } from './types.js';\n\nexport interface TransformHandler {\n transform(sourceFile: SourceFile, options: TransformOptions): TransformResult;\n}\n\nexport class TransformEngine {\n private handlers = new Map<string, TransformHandler>();\n\n registerHandler(from: SchemaLibrary, to: SchemaLibrary, handler: TransformHandler): void {\n this.handlers.set(`${from}->${to}`, handler);\n }\n\n getHandler(from: SchemaLibrary, to: SchemaLibrary): TransformHandler | undefined {\n return this.handlers.get(`${from}->${to}`);\n }\n\n hasHandler(from: SchemaLibrary, to: SchemaLibrary): boolean {\n return this.handlers.has(`${from}->${to}`);\n }\n\n getSupportedPaths(): Array<{ from: SchemaLibrary; to: SchemaLibrary }> {\n return Array.from(this.handlers.keys()).map((key) => {\n const [from, to] = key.split('->') as [SchemaLibrary, SchemaLibrary];\n return { from, to };\n });\n }\n\n transform(\n sourceFile: SourceFile,\n from: SchemaLibrary,\n to: SchemaLibrary,\n options: TransformOptions,\n ): TransformResult {\n const handler = this.getHandler(from, to);\n if (!handler) {\n return {\n success: false,\n filePath: sourceFile.getFilePath(),\n originalCode: sourceFile.getFullText(),\n errors: [{ message: `No handler for ${from}->${to}` }],\n warnings: [],\n };\n }\n return handler.transform(sourceFile, options);\n }\n}\n"],"mappings":"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","names":["import_ts_morph","NodeUtils","import_ts_morph","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path","import_node_fs","import_node_path"]}
|