@schemashift/core 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +102 -0
- package/dist/index.cjs +1570 -57
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +326 -1
- package/dist/index.d.ts +326 -1
- package/dist/index.js +1560 -57
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/analyzer.ts","../src/detect.ts","../src/ast-utils.ts","../src/audit-log.ts","../src/behavioral-warnings.ts","../src/bundle-estimator.ts","../src/chain.ts","../src/compatibility.ts","../src/ecosystem.ts","../src/complexity-estimator.ts","../src/config.ts","../src/dependency-graph.ts","../src/detailed-analyzer.ts","../src/form-resolver-migrator.ts","../src/governance.ts","../src/incremental.ts","../src/package-updater.ts","../src/performance-analyzer.ts","../src/plugin-loader.ts","../src/standard-schema.ts","../src/test-scaffolder.ts","../src/transform.ts","../src/type-dedup-detector.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 AuditEntry,\n type AuditLog,\n MigrationAuditLog,\n} from './audit-log.js';\nexport {\n type BehavioralAnalysisResult,\n type BehavioralCategory,\n type BehavioralWarning,\n BehavioralWarningAnalyzer,\n} from './behavioral-warnings.js';\nexport {\n BundleEstimator,\n type BundleSizeEstimate,\n type LibraryBundleInfo,\n} from './bundle-estimator.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 ComplexityEstimate,\n ComplexityEstimator,\n type ComplexityWarning,\n type EffortLevel,\n type FileComplexity,\n} from './complexity-estimator.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 computeParallelBatches,\n type DependencyGraphResult,\n type MonorepoInfo,\n type MonorepoPackage,\n MonorepoResolver,\n type ParallelBatch,\n SchemaDependencyResolver,\n type WorkspaceManager,\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 { FormResolverMigrator, type FormResolverResult } from './form-resolver-migrator.js';\nexport {\n GovernanceEngine,\n type GovernanceResult,\n type GovernanceRuleFunction,\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 type PerformanceAnalysisResult,\n PerformanceAnalyzer,\n type PerformanceCategory,\n type PerformanceWarning,\n} from './performance-analyzer.js';\nexport {\n PluginLoader,\n type PluginLoadResult,\n type SchemaShiftPlugin,\n} from './plugin-loader.js';\nexport { detectStandardSchema, type StandardSchemaInfo } from './standard-schema.js';\nexport {\n type ScaffoldedTest,\n TestScaffolder,\n type TestScaffoldResult,\n} from './test-scaffolder.js';\nexport { TransformEngine, type TransformHandler } from './transform.js';\nexport {\n type DuplicateTypeCandidate,\n TypeDedupDetector,\n type TypeDedupResult,\n} from './type-dedup-detector.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 { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport interface AuditEntry {\n timestamp: string;\n migrationId: string;\n filePath: string;\n action: 'transform' | 'rollback' | 'skip';\n from: string;\n to: string;\n success: boolean;\n beforeHash: string;\n afterHash?: string;\n warningCount: number;\n errorCount: number;\n riskScore?: number;\n user?: string;\n duration?: number;\n}\n\nexport interface AuditLog {\n version: number;\n entries: AuditEntry[];\n}\n\nconst AUDIT_DIR = '.schemashift';\nconst AUDIT_FILE = 'audit-log.json';\nconst AUDIT_VERSION = 1;\n\nexport class MigrationAuditLog {\n private logDir: string;\n private logPath: string;\n\n constructor(projectPath: string) {\n this.logDir = join(projectPath, AUDIT_DIR);\n this.logPath = join(this.logDir, AUDIT_FILE);\n }\n\n /**\n * Append a new entry to the audit log.\n */\n append(entry: AuditEntry): void {\n const log = this.read();\n log.entries.push(entry);\n this.write(log);\n }\n\n /**\n * Create an audit entry for a file transformation.\n */\n createEntry(params: {\n migrationId: string;\n filePath: string;\n from: string;\n to: string;\n originalCode: string;\n transformedCode?: string;\n success: boolean;\n warningCount: number;\n errorCount: number;\n riskScore?: number;\n duration?: number;\n }): AuditEntry {\n return {\n timestamp: new Date().toISOString(),\n migrationId: params.migrationId,\n filePath: params.filePath,\n action: 'transform',\n from: params.from,\n to: params.to,\n success: params.success,\n beforeHash: this.hashContent(params.originalCode),\n afterHash: params.transformedCode ? this.hashContent(params.transformedCode) : undefined,\n warningCount: params.warningCount,\n errorCount: params.errorCount,\n riskScore: params.riskScore,\n duration: params.duration,\n user: this.getCurrentUser(),\n };\n }\n\n /**\n * Read the current audit log.\n */\n read(): AuditLog {\n if (!existsSync(this.logPath)) {\n return { version: AUDIT_VERSION, entries: [] };\n }\n\n try {\n const content = readFileSync(this.logPath, 'utf-8');\n if (!content.trim()) {\n return { version: AUDIT_VERSION, entries: [] };\n }\n return JSON.parse(content) as AuditLog;\n } catch {\n return { version: AUDIT_VERSION, entries: [] };\n }\n }\n\n /**\n * Get entries for a specific migration.\n */\n getByMigration(migrationId: string): AuditEntry[] {\n const log = this.read();\n return log.entries.filter((e) => e.migrationId === migrationId);\n }\n\n /**\n * Get summary statistics for the audit log.\n */\n getSummary(): {\n totalMigrations: number;\n totalFiles: number;\n successCount: number;\n failureCount: number;\n migrationPaths: string[];\n } {\n const log = this.read();\n const migrationIds = new Set(log.entries.map((e) => e.migrationId));\n const migrationPaths = [...new Set(log.entries.map((e) => `${e.from}->${e.to}`))];\n\n return {\n totalMigrations: migrationIds.size,\n totalFiles: log.entries.length,\n successCount: log.entries.filter((e) => e.success).length,\n failureCount: log.entries.filter((e) => !e.success).length,\n migrationPaths,\n };\n }\n\n /**\n * Clear the audit log.\n */\n clear(): void {\n this.write({ version: AUDIT_VERSION, entries: [] });\n }\n\n private write(log: AuditLog): void {\n if (!existsSync(this.logDir)) {\n mkdirSync(this.logDir, { recursive: true });\n }\n writeFileSync(this.logPath, JSON.stringify(log, null, 2));\n }\n\n private hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\n }\n\n private getCurrentUser(): string | undefined {\n return process.env.USER || process.env.USERNAME || undefined;\n }\n}\n","import type { SourceFile } from 'ts-morph';\nimport { detectSchemaLibrary } from './detect.js';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface BehavioralWarning {\n category: BehavioralCategory;\n message: string;\n detail: string;\n filePath: string;\n lineNumber?: number;\n severity: 'info' | 'warning' | 'error';\n migration: string;\n}\n\nexport type BehavioralCategory =\n | 'type-coercion'\n | 'error-handling'\n | 'default-values'\n | 'error-format'\n | 'form-input'\n | 'validation-behavior'\n | 'null-handling';\n\nexport interface BehavioralAnalysisResult {\n warnings: BehavioralWarning[];\n migrationPath: string;\n summary: string;\n}\n\ninterface BehavioralRule {\n category: BehavioralCategory;\n migrations: string[];\n detect: (text: string, filePath: string) => BehavioralWarning[];\n}\n\nconst BEHAVIORAL_RULES: BehavioralRule[] = [\n // Yup -> Zod: Type coercion differences\n {\n category: 'type-coercion',\n migrations: ['yup->zod'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/yup\\.(number|date)\\s*\\(\\)/.test(text)) {\n warnings.push({\n category: 'type-coercion',\n message: 'Yup silently coerces types; Zod rejects mismatches.',\n detail:\n 'Yup\\'s number() accepts strings like \"42\" and coerces them. ' +\n \"Zod's number() rejects strings. Use z.coerce.number() for equivalent behavior, \" +\n 'especially for HTML form inputs which always return strings.',\n filePath,\n severity: 'warning',\n migration: 'yup->zod',\n });\n }\n return warnings;\n },\n },\n\n // Yup -> Zod: Form input string values\n {\n category: 'form-input',\n migrations: ['yup->zod'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n const hasFormImport = /yupResolver|useFormik|from\\s+['\"]formik['\"]|from\\s+['\"]@hookform/.test(\n text,\n );\n const hasNumberOrDate = /yup\\.(number|date)\\s*\\(\\)/.test(text);\n\n if (hasFormImport && hasNumberOrDate) {\n warnings.push({\n category: 'form-input',\n message: 'HTML inputs return strings — Zod will reject unless using z.coerce.*',\n detail:\n 'HTML <input type=\"number\"> returns strings. Yup coerces automatically, ' +\n 'but Zod requires explicit coercion. Use z.coerce.number() or ' +\n 'register({ valueAsNumber: true }) in React Hook Form.',\n filePath,\n severity: 'error',\n migration: 'yup->zod',\n });\n }\n return warnings;\n },\n },\n\n // Joi -> Zod: Error handling paradigm shift\n {\n category: 'error-handling',\n migrations: ['joi->zod'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/\\.validate\\s*\\(/.test(text) && /[Jj]oi/.test(text)) {\n warnings.push({\n category: 'error-handling',\n message: 'Joi .validate() returns { value, error }; Zod .parse() throws.',\n detail:\n 'Joi uses an inspection pattern: .validate() returns an object with value and error. ' +\n 'Zod .parse() throws a ZodError on failure. Use .safeParse() for a ' +\n 'non-throwing equivalent that returns { success, data, error }.',\n filePath,\n severity: 'warning',\n migration: 'joi->zod',\n });\n }\n return warnings;\n },\n },\n\n // Joi -> Zod: Null handling differences\n {\n category: 'null-handling',\n migrations: ['joi->zod'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/\\.allow\\s*\\(\\s*null\\s*\\)/.test(text)) {\n warnings.push({\n category: 'null-handling',\n message: 'Joi .allow(null) vs Zod .nullable() have subtle differences.',\n detail:\n 'Joi .allow(null) permits null alongside the base type. ' +\n 'Zod .nullable() wraps the type in a union with null. ' +\n 'Joi .allow(\"\", null) has no single Zod equivalent — use z.union() or .transform().',\n filePath,\n severity: 'info',\n migration: 'joi->zod',\n });\n }\n return warnings;\n },\n },\n\n // Zod v3 -> v4: Default value behavior change\n {\n category: 'default-values',\n migrations: ['zod-v3->v4'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/\\.default\\s*\\(/.test(text) && /\\.optional\\s*\\(\\)/.test(text)) {\n warnings.push({\n category: 'default-values',\n message: '.default() + .optional() behavior changed silently in Zod v4.',\n detail:\n 'In Zod v3, .default(val).optional() returned undefined when property was missing. ' +\n 'In Zod v4, it always returns the default value. This can cause unexpected ' +\n 'behavior in API responses and form handling.',\n filePath,\n severity: 'error',\n migration: 'zod-v3->v4',\n });\n }\n if (/\\.catch\\s*\\(/.test(text) && /\\.optional\\s*\\(\\)/.test(text)) {\n warnings.push({\n category: 'default-values',\n message: '.catch() + .optional() behavior changed in Zod v4.',\n detail:\n 'In Zod v4, object properties with .catch() that are .optional() ' +\n 'now always return the caught value, even when the property is missing from input.',\n filePath,\n severity: 'warning',\n migration: 'zod-v3->v4',\n });\n }\n return warnings;\n },\n },\n\n // Zod v3 -> v4: Error format differences\n {\n category: 'error-format',\n migrations: ['zod-v3->v4'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/ZodError/.test(text) && /instanceof\\s+Error/.test(text)) {\n warnings.push({\n category: 'error-format',\n message: 'ZodError no longer extends Error in Zod v4.',\n detail:\n 'In Zod v4, ZodError no longer extends Error. Code using ' +\n '\"instanceof Error\" to catch ZodErrors will silently miss them. ' +\n 'Use \"instanceof ZodError\" or z.isZodError() instead.',\n filePath,\n severity: 'error',\n migration: 'zod-v3->v4',\n });\n }\n return warnings;\n },\n },\n\n // Zod v3 -> v4: Validation behavior differences\n {\n category: 'validation-behavior',\n migrations: ['zod-v3->v4'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/\\.transform\\s*\\(/.test(text) && /\\.refine\\s*\\(/.test(text)) {\n warnings.push({\n category: 'validation-behavior',\n message: '.transform() after .refine() behavior changed in Zod v4.',\n detail:\n 'In Zod v4, .transform() after .refine() may execute even if ' +\n 'the refinement fails. Previously, transform was skipped on refinement failure.',\n filePath,\n severity: 'warning',\n migration: 'zod-v3->v4',\n });\n }\n return warnings;\n },\n },\n\n // Zod -> Valibot: Error handling differences\n {\n category: 'error-handling',\n migrations: ['zod->valibot'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/\\.parse\\s*\\(/.test(text) && /z\\./.test(text)) {\n warnings.push({\n category: 'error-handling',\n message: 'Zod .parse() throws ZodError; Valibot v.parse() throws ValiError.',\n detail:\n 'Error class and structure differ between Zod and Valibot. ' +\n 'ZodError has .issues array; ValiError has .issues with different structure. ' +\n 'Update all error handling code that inspects validation errors.',\n filePath,\n severity: 'warning',\n migration: 'zod->valibot',\n });\n }\n return warnings;\n },\n },\n\n // io-ts -> Zod: Either monad vs throw/safeParse\n {\n category: 'error-handling',\n migrations: ['io-ts->zod'],\n detect: (text, filePath) => {\n const warnings: BehavioralWarning[] = [];\n if (/\\bEither\\b/.test(text) || /\\b(fold|chain|map)\\s*\\(/.test(text)) {\n warnings.push({\n category: 'error-handling',\n message: 'io-ts uses Either monad for errors; Zod uses throw/safeParse.',\n detail:\n 'io-ts returns Either<Errors, T> (Right for success, Left for failure). ' +\n 'Zod .parse() throws, .safeParse() returns { success, data, error }. ' +\n 'All fold/chain/map patterns over Either must be rewritten.',\n filePath,\n severity: 'error',\n migration: 'io-ts->zod',\n });\n }\n return warnings;\n },\n },\n];\n\nexport class BehavioralWarningAnalyzer {\n analyze(\n sourceFiles: SourceFile[],\n from: SchemaLibrary,\n to: SchemaLibrary,\n ): BehavioralAnalysisResult {\n const migration = `${from}->${to}`;\n const warnings: BehavioralWarning[] = [];\n\n const applicableRules = BEHAVIORAL_RULES.filter((r) => r.migrations.includes(migration));\n\n for (const sourceFile of sourceFiles) {\n const filePath = sourceFile.getFilePath();\n const text = sourceFile.getFullText();\n\n // Only analyze files that use the source library\n const hasSourceLib = this.fileUsesLibrary(sourceFile, from);\n if (!hasSourceLib) continue;\n\n for (const rule of applicableRules) {\n const ruleWarnings = rule.detect(text, filePath);\n warnings.push(...ruleWarnings);\n }\n }\n\n const summary = this.generateSummary(warnings, migration);\n\n return { warnings, migrationPath: migration, summary };\n }\n\n private fileUsesLibrary(sourceFile: SourceFile, library: SchemaLibrary): boolean {\n for (const imp of sourceFile.getImportDeclarations()) {\n const detected = detectSchemaLibrary(imp.getModuleSpecifierValue());\n if (detected === library) return true;\n // Handle zod-v3 detection\n if (library === 'zod-v3' && detected === 'zod') return true;\n if (library === 'zod' && detected === 'zod') return true;\n }\n return false;\n }\n\n private generateSummary(warnings: BehavioralWarning[], migration: string): string {\n if (warnings.length === 0) {\n return `No behavioral differences detected for ${migration} migration.`;\n }\n\n const errorCount = warnings.filter((w) => w.severity === 'error').length;\n const warningCount = warnings.filter((w) => w.severity === 'warning').length;\n const infoCount = warnings.filter((w) => w.severity === 'info').length;\n\n const parts: string[] = [];\n if (errorCount > 0) parts.push(`${errorCount} critical`);\n if (warningCount > 0) parts.push(`${warningCount} warnings`);\n if (infoCount > 0) parts.push(`${infoCount} info`);\n\n return `Found ${warnings.length} behavioral difference(s) for ${migration}: ${parts.join(', ')}. Review before migrating.`;\n }\n}\n","import type { SourceFile } from 'ts-morph';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface BundleSizeEstimate {\n from: LibraryBundleInfo;\n to: LibraryBundleInfo;\n estimatedDelta: number;\n deltaPercent: number;\n summary: string;\n caveats: string[];\n}\n\nexport interface LibraryBundleInfo {\n library: string;\n minifiedGzipKb: number;\n treeShakable: boolean;\n estimatedUsedKb: number;\n}\n\n// Known minified + gzipped sizes (approximate, as of mid-2025)\nconst LIBRARY_SIZES: Record<string, { fullKb: number; baseKb: number; treeShakable: boolean }> = {\n zod: { fullKb: 14.0, baseKb: 14.0, treeShakable: false },\n 'zod-v3': { fullKb: 14.0, baseKb: 14.0, treeShakable: false },\n v4: { fullKb: 17.7, baseKb: 17.7, treeShakable: false },\n 'zod-v4': { fullKb: 17.7, baseKb: 17.7, treeShakable: false },\n 'zod-mini': { fullKb: 7.5, baseKb: 3.5, treeShakable: true },\n yup: { fullKb: 13.6, baseKb: 13.6, treeShakable: false },\n joi: { fullKb: 29.7, baseKb: 29.7, treeShakable: false },\n 'io-ts': { fullKb: 6.5, baseKb: 6.5, treeShakable: true },\n valibot: { fullKb: 5.8, baseKb: 1.4, treeShakable: true },\n};\n\n// Per-validator overhead for tree-shakable libraries (approximate kB)\nconst VALIDATOR_OVERHEAD: Record<string, number> = {\n valibot: 0.05,\n};\n\nconst COMMON_VALIDATORS = new Set([\n 'string',\n 'number',\n 'boolean',\n 'object',\n 'array',\n 'optional',\n 'nullable',\n 'enum',\n 'union',\n 'literal',\n 'date',\n 'email',\n 'url',\n 'uuid',\n 'min',\n 'max',\n 'regex',\n 'transform',\n 'refine',\n 'default',\n 'record',\n 'tuple',\n 'lazy',\n 'discriminatedUnion',\n 'intersection',\n 'partial',\n 'pick',\n 'omit',\n 'brand',\n 'pipe',\n]);\n\nexport class BundleEstimator {\n estimate(sourceFiles: SourceFile[], from: SchemaLibrary, to: SchemaLibrary): BundleSizeEstimate {\n const usedValidators = this.countUsedValidators(sourceFiles);\n const fromInfo = this.getLibraryInfo(from, usedValidators);\n const toInfo = this.getLibraryInfo(to, usedValidators);\n\n const estimatedDelta = toInfo.estimatedUsedKb - fromInfo.estimatedUsedKb;\n const deltaPercent =\n fromInfo.estimatedUsedKb > 0\n ? Math.round((estimatedDelta / fromInfo.estimatedUsedKb) * 100)\n : 0;\n\n const caveats = this.generateCaveats(from, to, usedValidators);\n const summary = this.generateSummary(fromInfo, toInfo, estimatedDelta, deltaPercent);\n\n return {\n from: fromInfo,\n to: toInfo,\n estimatedDelta,\n deltaPercent,\n summary,\n caveats,\n };\n }\n\n private countUsedValidators(sourceFiles: SourceFile[]): number {\n const usedSet = new Set<string>();\n\n for (const file of sourceFiles) {\n const text = file.getFullText();\n for (const validator of COMMON_VALIDATORS) {\n const pattern = new RegExp(`\\\\.${validator}\\\\s*[(<]`, 'g');\n if (pattern.test(text)) {\n usedSet.add(validator);\n }\n }\n }\n\n return usedSet.size;\n }\n\n private getLibraryInfo(library: SchemaLibrary, usedValidators: number): LibraryBundleInfo {\n // Map schema library types to our size database\n const sizeKey = library === 'zod-v3' ? 'zod' : library;\n const sizes = LIBRARY_SIZES[sizeKey] ?? { fullKb: 10.0, baseKb: 10.0, treeShakable: false };\n\n let estimatedUsedKb: number;\n\n if (sizes.treeShakable) {\n const overhead = VALIDATOR_OVERHEAD[sizeKey] ?? 0.05;\n estimatedUsedKb = Math.min(sizes.baseKb + usedValidators * overhead, sizes.fullKb);\n } else {\n estimatedUsedKb = sizes.fullKb;\n }\n\n return {\n library: sizeKey,\n minifiedGzipKb: sizes.fullKb,\n treeShakable: sizes.treeShakable,\n estimatedUsedKb: Math.round(estimatedUsedKb * 10) / 10,\n };\n }\n\n private generateCaveats(\n from: SchemaLibrary,\n to: SchemaLibrary,\n _usedValidators: number,\n ): string[] {\n const caveats: string[] = [\n 'Sizes are estimates based on minified+gzipped bundle analysis.',\n 'Actual impact depends on bundler configuration, tree-shaking, and code splitting.',\n ];\n\n if (to === 'valibot') {\n caveats.push(\n 'Valibot is fully tree-shakable — actual size depends on which validators you use.',\n );\n caveats.push(\n 'Some developers report smaller-than-expected savings (6kB or less) in real projects.',\n );\n }\n\n if (from === 'zod-v3' && (to as string) === 'v4') {\n caveats.push(\n 'Zod v4 is ~26% larger than v3 due to JIT compilation engine. Consider zod/mini for size-sensitive apps.',\n );\n }\n\n if (from === 'joi') {\n caveats.push(\n 'Joi is the largest schema library. Any migration will likely reduce bundle size.',\n );\n }\n\n return caveats;\n }\n\n private generateSummary(\n from: LibraryBundleInfo,\n to: LibraryBundleInfo,\n delta: number,\n deltaPercent: number,\n ): string {\n const direction = delta > 0 ? 'increase' : delta < 0 ? 'decrease' : 'no change';\n const absDelta = Math.abs(Math.round(delta * 10) / 10);\n\n return (\n `Estimated bundle ${direction}: ` +\n `${from.library} (${from.estimatedUsedKb}kB) → ${to.library} (${to.estimatedUsedKb}kB) ` +\n `= ${delta > 0 ? '+' : delta < 0 ? '-' : ''}${absDelta}kB (${deltaPercent > 0 ? '+' : ''}${deltaPercent}%)`\n );\n }\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 upgradeCommand?: string;\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 upgradeCommand?: string;\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 upgradeCommand: 'npm install drizzle-zod@latest',\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 upgradeCommand: 'npm install zod-prisma@latest',\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 upgradeCommand: 'npm install zod-prisma-types@latest',\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 upgradeCommand: 'npm install @trpc/server@latest',\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 upgradeCommand: 'npm install trpc-ui@latest',\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 upgradeCommand: 'npm install zod-validation-error@^5.0.0',\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 upgradeCommand: 'npm install @hookform/resolvers@latest',\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 upgradeCommand: 'npm install @hookform/resolvers@latest',\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 upgradeCommand: 'npm install zod-openapi@latest',\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 upgradeCommand: 'npm install @asteasolutions/zod-to-openapi@latest',\n }),\n },\n\n // AI/MCP integrations\n {\n package: '@modelcontextprotocol/sdk',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'MCP SDK may have Zod v4 compatibility issues. MCP servers typically expect Zod v3 schemas.',\n suggestion:\n 'Check MCP SDK release notes for Zod v4 support before upgrading. Consider staying on Zod v3 for MCP servers.',\n severity: 'warning',\n upgradeCommand: 'npm install @modelcontextprotocol/sdk@latest',\n }),\n },\n {\n package: '@openai/agents',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'OpenAI Agents SDK recommends pinning to zod@3.25.67 due to TS2589 errors with newer versions.',\n suggestion:\n 'Pin zod to 3.25.67 for OpenAI Agents SDK compatibility, or wait for an SDK update with Zod v4 support.',\n severity: 'error',\n }),\n },\n\n // Additional validation utilities\n {\n package: 'zod-to-json-schema',\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-to-json-schema v3 may not fully support Zod v4 schemas.',\n suggestion: 'Upgrade to zod-to-json-schema v4+ for full Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install zod-to-json-schema@latest',\n };\n }\n return null;\n },\n },\n {\n package: 'react-hook-form',\n category: 'form',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'React Hook Form with zodResolver may throw uncaught ZodError instead of populating formState.errors with Zod v4.',\n suggestion:\n 'Upgrade @hookform/resolvers to the latest version and test form validation thoroughly.',\n severity: 'warning',\n upgradeCommand: 'npm install @hookform/resolvers@latest react-hook-form@latest',\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 ...(result.upgradeCommand ? { upgradeCommand: result.upgradeCommand } : {}),\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 /**\n * Returns a list of npm install commands needed to resolve ecosystem issues.\n */\n getUpgradeCommands(report: EcosystemReport): string[] {\n const commands: string[] = [];\n const seen = new Set<string>();\n\n for (const dep of report.dependencies) {\n if (dep.upgradeCommand && !seen.has(dep.upgradeCommand)) {\n seen.add(dep.upgradeCommand);\n commands.push(dep.upgradeCommand);\n }\n }\n\n return commands;\n }\n}\n","import type { SourceFile } from 'ts-morph';\n\nexport type EffortLevel = 'trivial' | 'low' | 'moderate' | 'high' | 'extreme';\n\nexport interface ComplexityWarning {\n file: string;\n line?: number;\n message: string;\n severity: 'info' | 'warning' | 'error';\n}\n\nexport interface FileComplexity {\n filePath: string;\n schemaCount: number;\n advancedPatterns: string[];\n chainDepth: number;\n lineCount: number;\n}\n\nexport interface ComplexityEstimate {\n effort: EffortLevel;\n totalSchemas: number;\n totalFiles: number;\n advancedPatternCount: number;\n files: FileComplexity[];\n warnings: ComplexityWarning[];\n riskAreas: string[];\n}\n\nconst SCHEMA_FACTORY_PATTERN =\n /z\\.(object|string|number|boolean|array|enum|union|discriminatedUnion|intersection|lazy|tuple|record|literal|nativeEnum|any|unknown|void|null|undefined|never|date|bigint|symbol|function|promise|map|set|custom|preprocess|pipeline|brand|coerce)\\s*\\(/g;\n\nconst ADVANCED_PATTERNS: [RegExp, string][] = [\n [/z\\.discriminatedUnion\\s*\\(/g, 'discriminatedUnion'],\n [/z\\.intersection\\s*\\(/g, 'intersection'],\n [/z\\.lazy\\s*\\(/g, 'recursive'],\n [/\\.brand\\s*[<(]/g, 'branded'],\n [/\\.superRefine\\s*\\(/g, 'superRefine'],\n [/\\.transform\\s*\\(/g, 'transform'],\n [/\\.pipe\\s*\\(/g, 'pipe'],\n [/\\.refine\\s*\\(/g, 'refine'],\n];\n\nfunction countMatches(text: string, pattern: RegExp): number {\n pattern.lastIndex = 0;\n let count = 0;\n while (pattern.exec(text)) count++;\n return count;\n}\n\nfunction getMaxChainDepth(text: string): number {\n let maxDepth = 0;\n const lines = text.split('\\n');\n for (const line of lines) {\n const dotCalls = line.match(/\\.\\w+\\s*\\(/g);\n if (dotCalls && dotCalls.length > maxDepth) {\n maxDepth = dotCalls.length;\n }\n }\n return maxDepth;\n}\n\nexport class ComplexityEstimator {\n estimate(files: SourceFile[]): ComplexityEstimate {\n const fileResults: FileComplexity[] = [];\n const warnings: ComplexityWarning[] = [];\n const riskAreas: string[] = [];\n let totalSchemas = 0;\n let advancedPatternCount = 0;\n let hasDeepDiscriminatedUnions = false;\n\n for (const file of files) {\n const text = file.getFullText();\n const filePath = file.getFilePath();\n const lineCount = file.getEndLineNumber();\n\n const schemaCount = countMatches(text, new RegExp(SCHEMA_FACTORY_PATTERN.source, 'g'));\n totalSchemas += schemaCount;\n\n const advancedPatterns: string[] = [];\n for (const [pattern, name] of ADVANCED_PATTERNS) {\n const count = countMatches(text, new RegExp(pattern.source, 'g'));\n if (count > 0) {\n advancedPatterns.push(name);\n advancedPatternCount += count;\n }\n }\n\n const chainDepth = getMaxChainDepth(text);\n\n fileResults.push({ filePath, schemaCount, advancedPatterns, chainDepth, lineCount });\n\n if (lineCount > 500) {\n warnings.push({\n file: filePath,\n message: `Large file (${lineCount} lines) may be difficult to migrate in one pass`,\n severity: 'warning',\n });\n }\n\n if (schemaCount > 50) {\n warnings.push({\n file: filePath,\n message: `High schema density (${schemaCount} schemas) — consider splitting before migration`,\n severity: 'warning',\n });\n }\n\n if (chainDepth > 20) {\n warnings.push({\n file: filePath,\n message: `Long method chain (${chainDepth} calls) — higher transformation risk`,\n severity: 'warning',\n });\n }\n\n const duCount = countMatches(text, /z\\.discriminatedUnion\\s*\\(/g);\n if (duCount > 10) {\n hasDeepDiscriminatedUnions = true;\n warnings.push({\n file: filePath,\n message: `${duCount} discriminated unions — TypeScript TS2589 performance risk in Zod v4`,\n severity: 'error',\n });\n }\n\n if (advancedPatterns.includes('recursive')) {\n riskAreas.push(`Recursive schemas in ${filePath}`);\n }\n\n if (advancedPatterns.includes('branded')) {\n riskAreas.push(`Branded types in ${filePath}`);\n }\n }\n\n const effort = this.calculateEffort(\n totalSchemas,\n advancedPatternCount,\n hasDeepDiscriminatedUnions,\n );\n\n return {\n effort,\n totalSchemas,\n totalFiles: files.length,\n advancedPatternCount,\n files: fileResults,\n warnings,\n riskAreas,\n };\n }\n\n private calculateEffort(\n totalSchemas: number,\n advancedCount: number,\n hasDeepDU: boolean,\n ): EffortLevel {\n if (totalSchemas >= 500 && hasDeepDU) return 'extreme';\n if (totalSchemas >= 200 || advancedCount >= 20) return 'high';\n if (totalSchemas >= 50 || advancedCount >= 5) return 'moderate';\n if (totalSchemas >= 10) return 'low';\n return 'trivial';\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 { existsSync, readdirSync, readFileSync } from 'node:fs';\nimport { join, resolve } from 'node:path';\nimport 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\nexport interface MonorepoPackage {\n name: string;\n path: string;\n schemaLibrary?: string;\n dependencies: string[];\n}\n\nexport interface MonorepoInfo {\n isMonorepo: boolean;\n packages: MonorepoPackage[];\n suggestedOrder: string[];\n}\n\nconst SCHEMA_PACKAGES = new Set(['zod', 'yup', 'joi', 'io-ts', 'valibot', '@effect/schema']);\n\n/**\n * Groups monorepo packages into parallelizable batches.\n * Packages within the same batch have no dependencies on each other.\n * Batches must be executed in order (batch 0 first, then batch 1, etc.).\n */\nexport interface ParallelBatch {\n /** Batch index (0-based, execute in order) */\n index: number;\n /** Package names that can be processed in parallel */\n packages: string[];\n}\n\n/**\n * Computes parallel execution batches from a topological ordering.\n * Packages are grouped by their \"depth\" in the dependency graph — packages\n * at the same depth have no mutual dependencies and can run concurrently.\n */\nexport function computeParallelBatches(\n packages: MonorepoPackage[],\n suggestedOrder: string[],\n): ParallelBatch[] {\n const nameSet = new Set(packages.map((p) => p.name));\n const depMap = new Map<string, Set<string>>();\n for (const pkg of packages) {\n depMap.set(pkg.name, new Set(pkg.dependencies.filter((d) => nameSet.has(d))));\n }\n\n const depths = new Map<string, number>();\n\n const getDepth = (name: string, visited: Set<string>): number => {\n const cached = depths.get(name);\n if (cached !== undefined) return cached;\n if (visited.has(name)) return 0; // Circular dependency fallback\n visited.add(name);\n\n const deps = depMap.get(name) ?? new Set();\n let maxDepth = 0;\n for (const dep of deps) {\n maxDepth = Math.max(maxDepth, getDepth(dep, visited) + 1);\n }\n depths.set(name, maxDepth);\n return maxDepth;\n };\n\n for (const name of suggestedOrder) {\n getDepth(name, new Set());\n }\n\n // Group by depth\n const batchMap = new Map<number, string[]>();\n for (const name of suggestedOrder) {\n const depth = depths.get(name) ?? 0;\n const batch = batchMap.get(depth) ?? [];\n batch.push(name);\n batchMap.set(depth, batch);\n }\n\n // Convert to sorted array\n const batches: ParallelBatch[] = [];\n const sortedDepths = [...batchMap.keys()].sort((a, b) => a - b);\n for (const depth of sortedDepths) {\n const pkgs = batchMap.get(depth);\n if (pkgs) batches.push({ index: batches.length, packages: pkgs });\n }\n\n return batches;\n}\n\nexport type WorkspaceManager = 'npm' | 'pnpm' | 'yarn';\n\nexport class MonorepoResolver {\n detect(projectPath: string): boolean {\n // Check npm/yarn workspaces in package.json\n const pkgPath = join(projectPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n workspaces?: string[] | { packages: string[] };\n };\n if (pkg.workspaces) return true;\n } catch {\n // Continue checking other formats\n }\n }\n\n // Check pnpm-workspace.yaml\n if (existsSync(join(projectPath, 'pnpm-workspace.yaml'))) return true;\n\n return false;\n }\n\n /**\n * Detect which workspace manager is being used.\n */\n detectManager(projectPath: string): WorkspaceManager {\n if (existsSync(join(projectPath, 'pnpm-workspace.yaml'))) return 'pnpm';\n\n const pkgPath = join(projectPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n packageManager?: string;\n };\n if (pkg.packageManager?.startsWith('yarn')) return 'yarn';\n if (pkg.packageManager?.startsWith('pnpm')) return 'pnpm';\n } catch {\n // Fall through\n }\n }\n\n // Check for lock files\n if (existsSync(join(projectPath, 'pnpm-lock.yaml'))) return 'pnpm';\n if (existsSync(join(projectPath, 'yarn.lock'))) return 'yarn';\n\n return 'npm';\n }\n\n analyze(projectPath: string): MonorepoInfo {\n const pkgPath = join(projectPath, 'package.json');\n if (!existsSync(pkgPath)) {\n return { isMonorepo: false, packages: [], suggestedOrder: [] };\n }\n\n let workspaceGlobs: string[];\n try {\n workspaceGlobs = this.resolveWorkspaceGlobs(projectPath);\n if (workspaceGlobs.length === 0) {\n return { isMonorepo: false, packages: [], suggestedOrder: [] };\n }\n } catch {\n return { isMonorepo: false, packages: [], suggestedOrder: [] };\n }\n\n const packages: MonorepoPackage[] = [];\n const resolvedDirs = this.resolveWorkspaceDirs(projectPath, workspaceGlobs);\n\n for (const dir of resolvedDirs) {\n const wsPkgPath = join(dir, 'package.json');\n if (!existsSync(wsPkgPath)) continue;\n\n try {\n const wsPkg = JSON.parse(readFileSync(wsPkgPath, 'utf-8')) as {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n };\n if (!wsPkg.name) continue;\n\n const allDeps = { ...wsPkg.dependencies, ...wsPkg.devDependencies };\n const depNames = Object.keys(allDeps);\n\n const schemaLibrary = depNames.find((d) => SCHEMA_PACKAGES.has(d));\n\n packages.push({\n name: wsPkg.name,\n path: dir,\n schemaLibrary,\n dependencies: depNames,\n });\n } catch {\n // Expected when package.json is missing or malformed — skip this package\n }\n }\n\n const suggestedOrder = this.suggestOrder(packages);\n\n return { isMonorepo: true, packages, suggestedOrder };\n }\n\n private suggestOrder(packages: MonorepoPackage[]): string[] {\n const nameSet = new Set(packages.map((p) => p.name));\n const depMap = new Map<string, string[]>();\n\n for (const pkg of packages) {\n const internalDeps = pkg.dependencies.filter((d) => nameSet.has(d));\n depMap.set(pkg.name, internalDeps);\n }\n\n // Topological sort\n const visited = new Set<string>();\n const sorted: string[] = [];\n\n const visit = (name: string): void => {\n if (visited.has(name)) return;\n visited.add(name);\n for (const dep of depMap.get(name) ?? []) {\n visit(dep);\n }\n sorted.push(name);\n };\n\n for (const pkg of packages) {\n visit(pkg.name);\n }\n\n return sorted;\n }\n\n /**\n * Resolve workspace glob patterns from any supported format.\n * Supports: npm/yarn workspaces (package.json), pnpm-workspace.yaml\n */\n private resolveWorkspaceGlobs(projectPath: string): string[] {\n // Try pnpm-workspace.yaml first\n const pnpmPath = join(projectPath, 'pnpm-workspace.yaml');\n if (existsSync(pnpmPath)) {\n return this.parsePnpmWorkspace(pnpmPath);\n }\n\n // Try package.json workspaces\n const pkgPath = join(projectPath, 'package.json');\n if (existsSync(pkgPath)) {\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as {\n workspaces?: string[] | { packages: string[] };\n };\n if (pkg.workspaces) {\n return Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces.packages;\n }\n } catch {\n // Fall through\n }\n }\n\n return [];\n }\n\n /**\n * Parse pnpm-workspace.yaml to extract workspace package globs.\n * Simple YAML parsing for the common format:\n * ```\n * packages:\n * - 'packages/*'\n * - 'apps/*'\n * ```\n */\n private parsePnpmWorkspace(filePath: string): string[] {\n const content = readFileSync(filePath, 'utf-8');\n const globs: string[] = [];\n let inPackages = false;\n\n for (const line of content.split('\\n')) {\n const trimmed = line.trim();\n\n if (trimmed === 'packages:') {\n inPackages = true;\n continue;\n }\n\n // Stop parsing when we hit a new top-level key\n if (inPackages && /^\\w/.test(trimmed) && !trimmed.startsWith('-')) {\n break;\n }\n\n if (inPackages && trimmed.startsWith('-')) {\n // Extract the glob pattern, removing quotes and leading dash\n const pattern = trimmed.replace(/^-\\s*/, '').replace(/^['\"]|['\"]$/g, '');\n if (pattern) {\n globs.push(pattern);\n }\n }\n }\n\n return globs;\n }\n\n private resolveWorkspaceDirs(projectPath: string, globs: string[]): string[] {\n const dirs: string[] = [];\n for (const glob of globs) {\n // Handle simple patterns like \"packages/*\"\n const clean = glob.replace(/\\/?\\*$/, '');\n const base = resolve(projectPath, clean);\n if (!existsSync(base)) continue;\n\n // If it was a wildcard, list directories inside\n if (glob.endsWith('*')) {\n try {\n const entries = readdirSync(base, { withFileTypes: true });\n for (const entry of entries) {\n if (entry.isDirectory()) {\n dirs.push(join(base, entry.name));\n }\n }\n } catch {\n // Directory doesn't exist or isn't readable — skip this workspace glob\n }\n } else {\n dirs.push(base);\n }\n }\n return dirs;\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 { SourceFile } from 'ts-morph';\n\nexport interface FormResolverResult {\n success: boolean;\n transformedCode: string;\n changes: string[];\n warnings: string[];\n}\n\ninterface ResolverMapping {\n fromImport: string;\n toImport: string;\n fromResolver: string;\n toResolver: string;\n}\n\nconst RESOLVER_MAPPINGS: Record<string, ResolverMapping[]> = {\n 'yup->zod': [\n {\n fromImport: '@hookform/resolvers/yup',\n toImport: '@hookform/resolvers/zod',\n fromResolver: 'yupResolver',\n toResolver: 'zodResolver',\n },\n ],\n 'joi->zod': [\n {\n fromImport: '@hookform/resolvers/joi',\n toImport: '@hookform/resolvers/zod',\n fromResolver: 'joiResolver',\n toResolver: 'zodResolver',\n },\n ],\n 'zod->valibot': [\n {\n fromImport: '@hookform/resolvers/zod',\n toImport: '@hookform/resolvers/valibot',\n fromResolver: 'zodResolver',\n toResolver: 'valibotResolver',\n },\n ],\n};\n\nconst TODO_PATTERNS: { pattern: RegExp; comment: string }[] = [\n {\n pattern: /from\\s+['\"]formik['\"]/,\n comment:\n '/* TODO(schemashift): Formik is unmaintained. Consider migrating to React Hook Form with zodResolver */',\n },\n {\n pattern: /from\\s+['\"]@mantine\\/form['\"]/,\n comment: '/* TODO(schemashift): Update @mantine/form to use Zod schema adapter */',\n },\n];\n\nexport class FormResolverMigrator {\n migrate(sourceFile: SourceFile, from: string, to: string): FormResolverResult {\n const migration = `${from}->${to}`;\n let code = sourceFile.getFullText();\n const changes: string[] = [];\n const warnings: string[] = [];\n\n // Apply resolver import rewrites\n const mappings = RESOLVER_MAPPINGS[migration];\n if (mappings) {\n for (const mapping of mappings) {\n if (code.includes(mapping.fromImport)) {\n code = code.replaceAll(mapping.fromImport, mapping.toImport);\n code = code.replaceAll(mapping.fromResolver, mapping.toResolver);\n changes.push(\n `Replaced ${mapping.fromResolver} import from '${mapping.fromImport}' with ${mapping.toResolver} from '${mapping.toImport}'`,\n );\n }\n }\n }\n\n // Add TODO comments for complex cases\n const lines = code.split('\\n');\n const insertions: { index: number; comment: string }[] = [];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n for (const { pattern, comment } of TODO_PATTERNS) {\n if (pattern.test(line) && !code.includes(comment)) {\n insertions.push({ index: i, comment });\n warnings.push(comment.replace(/\\/\\*\\s*|\\s*\\*\\//g, '').trim());\n }\n }\n }\n\n // Insert in reverse to preserve indices\n for (let i = insertions.length - 1; i >= 0; i--) {\n const insertion = insertions[i];\n if (!insertion) continue;\n lines.splice(insertion.index, 0, insertion.comment);\n changes.push(`Added TODO comment for ${lines[insertion.index + 1]?.trim()}`);\n }\n\n if (insertions.length > 0) {\n code = lines.join('\\n');\n }\n\n return {\n success: true,\n transformedCode: code,\n changes,\n warnings,\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\n/**\n * Custom governance rule function interface.\n * Plugins can define rules as functions that receive a source file and config,\n * and return violations found.\n */\nexport type GovernanceRuleFunction = (\n sourceFile: SourceFile,\n config: GovernanceRuleConfig,\n) => GovernanceViolation[];\n\nexport class GovernanceEngine {\n private rules: Map<string, GovernanceRuleConfig> = new Map();\n private customRuleFunctions: Map<string, GovernanceRuleFunction> = 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 /**\n * Register a custom governance rule function.\n * Custom rules are executed per-file alongside built-in rules.\n */\n registerRule(name: string, fn: GovernanceRuleFunction): void {\n this.customRuleFunctions.set(name, fn);\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 if (this.rules.has('require-safeParse')) {\n if (text.includes('.parse(') && !text.includes('.safeParse(')) {\n violations.push({\n rule: 'require-safeParse',\n message: `Schema \"${schemaName}\" uses .parse() — prefer .safeParse() for safer error handling`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'warning',\n fixable: true,\n });\n }\n }\n\n if (this.rules.has('require-description')) {\n if (!text.includes('.describe(')) {\n violations.push({\n rule: 'require-description',\n message: `Schema \"${schemaName}\" missing .describe() — add a description for documentation`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'warning',\n fixable: true,\n });\n }\n }\n\n if (this.rules.has('no-coerce-in-api')) {\n if (/\\.coerce\\./.test(text)) {\n violations.push({\n rule: 'no-coerce-in-api',\n message: `Schema \"${schemaName}\" uses z.coerce.* — coercion in API validation is a security risk`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'error',\n fixable: false,\n });\n }\n }\n\n if (this.rules.has('require-max-length')) {\n if (text.includes('.string()') && !text.includes('.max(') && !text.includes('.length(')) {\n violations.push({\n rule: 'require-max-length',\n message: `Schema \"${schemaName}\" has string without max length — required for DoS prevention`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'error',\n fixable: true,\n });\n }\n }\n\n if (this.rules.has('max-nesting-depth')) {\n const config = this.rules.get('max-nesting-depth') ?? {};\n const maxDepth = config.threshold ?? 5;\n const depth = this.measureNestingDepth(text);\n if (depth > maxDepth) {\n violations.push({\n rule: 'max-nesting-depth',\n message: `Schema \"${schemaName}\" nesting depth (${depth}) exceeds limit (${maxDepth})`,\n filePath,\n lineNumber,\n schemaName,\n severity: 'warning',\n fixable: false,\n });\n }\n }\n }\n }\n\n // File-level checks (not per-schema)\n for (const sourceFile of project.getSourceFiles()) {\n const library = this.detectFileLibrary(sourceFile);\n if (library === 'unknown') continue;\n const filePath = sourceFile.getFilePath();\n const text = sourceFile.getFullText();\n\n if (this.rules.has('no-dynamic-schemas')) {\n const dynamicPatterns = this.detectDynamicSchemas(text, library);\n for (const lineNumber of dynamicPatterns) {\n violations.push({\n rule: 'no-dynamic-schemas',\n message: 'Schema created inside function body — move to module level for performance',\n filePath,\n lineNumber,\n schemaName: '(dynamic)',\n severity: 'warning',\n fixable: false,\n });\n }\n }\n }\n\n // Custom rule functions (registered via registerRule)\n for (const [ruleName, ruleFn] of this.customRuleFunctions) {\n const config = this.rules.get(ruleName);\n if (!config) continue; // Rule must be enabled via configure()\n\n for (const sourceFile of project.getSourceFiles()) {\n const library = this.detectFileLibrary(sourceFile);\n if (library === 'unknown') continue;\n\n const ruleViolations = ruleFn(sourceFile, config);\n violations.push(...ruleViolations);\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 measureNestingDepth(text: string): number {\n let maxDepth = 0;\n let current = 0;\n for (const char of text) {\n if (char === '(') {\n current++;\n if (current > maxDepth) maxDepth = current;\n } else if (char === ')') {\n current--;\n }\n }\n return maxDepth;\n }\n\n private detectDynamicSchemas(text: string, library: string): number[] {\n const lineNumbers: number[] = [];\n const prefix = this.getSchemaPrefix(library);\n if (!prefix) return lineNumbers;\n\n // Look for schema creation inside function bodies\n const lines = text.split('\\n');\n let insideFunction = 0;\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // Simple brace counting for function scope detection\n const opens = (line.match(/\\{/g) || []).length;\n const closes = (line.match(/\\}/g) || []).length;\n\n if (/(?:function\\s+\\w+|=>)\\s*\\{/.test(line)) {\n insideFunction += opens;\n insideFunction -= closes;\n continue;\n }\n\n insideFunction += opens - closes;\n\n if (insideFunction > 0 && line.includes(prefix)) {\n lineNumbers.push(i + 1);\n }\n }\n\n return lineNumbers;\n }\n\n private getSchemaPrefix(library: string): string | null {\n switch (library) {\n case 'zod':\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 null;\n }\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, unlinkSync, 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 unlinkSync(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 { SourceFile } from 'ts-morph';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface PerformanceWarning {\n category: PerformanceCategory;\n message: string;\n detail: string;\n filePath: string;\n lineNumber?: number;\n severity: 'info' | 'warning' | 'error';\n}\n\nexport type PerformanceCategory =\n | 'jit-overhead'\n | 'cold-start'\n | 'repeated-parsing'\n | 'schema-creation'\n | 'dynamic-schemas';\n\nexport interface PerformanceAnalysisResult {\n warnings: PerformanceWarning[];\n parseCallSites: number;\n dynamicSchemaCount: number;\n recommendation: string;\n summary: string;\n}\n\n/**\n * Analyzes performance implications of schema library migration.\n *\n * Key considerations:\n * - Zod v4 uses JIT compilation: 17x slower schema creation, 8x faster repeated parsing\n * - Valibot is ~2x faster than Zod v3, similar to v4 for runtime\n * - Serverless/edge: Zod v4 JIT penalizes cold starts\n * - Long-lived servers: Zod v4 JIT amortizes well over repeated parses\n */\nexport class PerformanceAnalyzer {\n analyze(\n sourceFiles: SourceFile[],\n from: SchemaLibrary,\n to: SchemaLibrary,\n ): PerformanceAnalysisResult {\n const warnings: PerformanceWarning[] = [];\n let parseCallSites = 0;\n let dynamicSchemaCount = 0;\n\n for (const file of sourceFiles) {\n const text = file.getFullText();\n const filePath = file.getFilePath();\n\n // Count .parse() and .safeParse() call sites\n const parseMatches = text.match(/\\.(parse|safeParse)\\s*\\(/g);\n if (parseMatches) {\n parseCallSites += parseMatches.length;\n }\n\n // Detect dynamic schema creation inside functions/components\n const dynamicResult = this.detectDynamicSchemas(text, filePath);\n dynamicSchemaCount += dynamicResult.count;\n warnings.push(...dynamicResult.warnings);\n\n // Migration-specific warnings\n this.addMigrationWarnings(text, filePath, from, to, warnings);\n }\n\n // Overall recommendation\n const recommendation = this.getRecommendation(from, to, parseCallSites, dynamicSchemaCount);\n\n const summary = this.generateSummary(warnings, parseCallSites, dynamicSchemaCount);\n\n return {\n warnings,\n parseCallSites,\n dynamicSchemaCount,\n recommendation,\n summary,\n };\n }\n\n private detectDynamicSchemas(\n text: string,\n filePath: string,\n ): { count: number; warnings: PerformanceWarning[] } {\n const warnings: PerformanceWarning[] = [];\n let count = 0;\n\n // Detect schemas created inside function bodies (not at module level)\n const functionBodyPattern =\n /(?:function\\s+\\w+\\s*\\([^)]*\\)|const\\s+\\w+\\s*=\\s*(?:async\\s+)?(?:\\([^)]*\\)|[a-zA-Z_]\\w*)\\s*=>)\\s*\\{[^}]*(?:z\\.|yup\\.|Joi\\.|v\\.)\\w+\\s*\\(/g;\n\n for (const match of text.matchAll(functionBodyPattern)) {\n count++;\n const lineNumber = text.substring(0, match.index).split('\\n').length;\n warnings.push({\n category: 'dynamic-schemas',\n message: 'Schema created inside function body — may cause performance issues with Zod v4.',\n detail:\n 'Zod v4 uses JIT compilation, making schema creation ~17x slower than v3. ' +\n 'Move schema definitions to module level to avoid re-creation on every call.',\n filePath,\n lineNumber,\n severity: 'warning',\n });\n }\n\n // Detect React component-level schemas (common anti-pattern)\n const reactComponentPattern =\n /(?:function\\s+[A-Z]\\w*\\s*\\([^)]*\\)|const\\s+[A-Z]\\w*\\s*[:=])[^{]*\\{[^}]*(?:z\\.|yup\\.|Joi\\.)\\w+\\s*\\(/g;\n for (const match of text.matchAll(reactComponentPattern)) {\n count++;\n const lineNumber = text.substring(0, match.index).split('\\n').length;\n warnings.push({\n category: 'schema-creation',\n message: 'Schema appears to be created inside a React component.',\n detail:\n 'Schemas created inside React components are re-created on every render. ' +\n 'Move schema definitions outside the component or wrap in useMemo(). ' +\n 'This is especially important for Zod v4 due to JIT compilation overhead.',\n filePath,\n lineNumber,\n severity: 'warning',\n });\n }\n\n return { count, warnings };\n }\n\n private addMigrationWarnings(\n text: string,\n filePath: string,\n from: SchemaLibrary,\n to: SchemaLibrary,\n warnings: PerformanceWarning[],\n ): void {\n const migration = `${from}->${to}`;\n\n // Zod v3 -> v4: JIT overhead warnings\n if (migration === 'zod-v3->v4') {\n // Detect serverless/edge environment indicators\n if (\n /edge-runtime|@vercel\\/edge|cloudflare.*workers|deno\\.serve|Deno\\.serve/i.test(text) ||\n /export\\s+const\\s+runtime\\s*=\\s*['\"]edge['\"]/i.test(text)\n ) {\n warnings.push({\n category: 'cold-start',\n message:\n 'Edge/serverless environment detected — Zod v4 JIT compilation increases cold start time.',\n detail:\n 'Zod v4 JIT trades slower schema creation for faster repeated parsing. ' +\n 'In serverless/edge environments with short-lived instances, the JIT cost ' +\n 'may not amortize. Consider Valibot or staying on Zod v3 for cold-start-sensitive code.',\n filePath,\n severity: 'warning',\n });\n }\n\n // High parse() volume = good for JIT\n const parseCount = (text.match(/\\.parse\\s*\\(/g) || []).length;\n if (parseCount > 10) {\n warnings.push({\n category: 'repeated-parsing',\n message: `High parse() usage (${parseCount} call sites) — Zod v4 JIT will benefit here.`,\n detail:\n 'Zod v4 JIT compilation makes repeated parsing ~8x faster. ' +\n 'This file has many parse() calls and will see performance improvement.',\n filePath,\n severity: 'info',\n });\n }\n }\n\n // Zod -> Valibot: generally faster\n if (migration === 'zod->valibot' && /\\.parse\\s*\\(/.test(text)) {\n warnings.push({\n category: 'repeated-parsing',\n message: 'Valibot parsing performance is comparable to Zod v4 for most schemas.',\n detail:\n 'Valibot v1+ offers similar runtime performance to Zod v4 with significantly ' +\n 'smaller bundle size. No JIT overhead means consistent performance across all environments.',\n filePath,\n severity: 'info',\n });\n }\n }\n\n private getRecommendation(\n from: SchemaLibrary,\n to: SchemaLibrary,\n parseCallSites: number,\n dynamicSchemaCount: number,\n ): string {\n const migration = `${from}->${to}`;\n\n if (migration === 'zod-v3->v4') {\n if (dynamicSchemaCount > 5) {\n return (\n 'Many dynamic schemas detected. Zod v4 JIT makes schema creation 17x slower. ' +\n 'Move schemas to module level before migrating, or consider Valibot for size-sensitive apps.'\n );\n }\n if (parseCallSites > 50) {\n return (\n 'High parse() volume detected. Zod v4 JIT will significantly benefit repeated parsing ' +\n '(up to 8x faster). Migration recommended for performance.'\n );\n }\n return 'Moderate usage detected. Zod v4 trades slower startup for faster runtime parsing.';\n }\n\n if (migration === 'zod->valibot') {\n return (\n 'Valibot offers similar runtime performance with significantly smaller bundle size. ' +\n 'Best suited for bundle-size-sensitive applications.'\n );\n }\n\n if (from === 'yup' || from === 'joi') {\n return `Migrating from ${from} to ${to} should have neutral or positive performance impact.`;\n }\n\n return 'Performance impact depends on usage patterns. Review warnings for details.';\n }\n\n private generateSummary(\n warnings: PerformanceWarning[],\n parseCallSites: number,\n dynamicSchemaCount: number,\n ): string {\n const parts: string[] = [];\n parts.push(`${parseCallSites} parse/safeParse call sites`);\n if (dynamicSchemaCount > 0) {\n parts.push(`${dynamicSchemaCount} dynamic schema creation sites`);\n }\n parts.push(`${warnings.length} performance warning(s)`);\n return parts.join(', ');\n }\n}\n","import type { CustomRule } from './config.js';\nimport type { GovernanceRuleFunction } from './governance.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 governanceRules?: Array<{\n name: string;\n fn: GovernanceRuleFunction;\n }>;\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 adoptionPath?: string;\n interopTools: 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: '', interopTools: [] };\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: '', interopTools: [] };\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 // Adoption path guidance\n let adoptionPath: string | undefined;\n if (detected && !hasExplicitStandardSchema) {\n adoptionPath =\n 'Install @standard-schema/spec for explicit Standard Schema support. ' +\n 'This enables library-agnostic validation consumers to accept your schemas ' +\n 'without depending on a specific library. ' +\n 'Run: npm install @standard-schema/spec';\n } else if (!detected) {\n adoptionPath =\n 'Consider migrating to a Standard Schema-compatible library (Zod v3.23+, Valibot v1+, ArkType v2+) ' +\n 'to future-proof your validation layer and reduce library lock-in.';\n }\n\n // Tools that support Standard Schema\n const interopTools = detected\n ? [\n 'tRPC v11+ (Standard Schema input validation)',\n 'TanStack Form (schema-agnostic validation)',\n 'TanStack Router (route parameter validation)',\n 'Hono (request validation middleware)',\n 'Conform (progressive form validation)',\n 'Nuxt (runtime config validation)',\n ]\n : [];\n\n return { detected, compatibleLibraries, recommendation, adoptionPath, interopTools };\n}\n","import type { SourceFile } from 'ts-morph';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface ScaffoldedTest {\n filePath: string;\n testCode: string;\n schemaCount: number;\n}\n\nexport interface TestScaffoldResult {\n tests: ScaffoldedTest[];\n totalSchemas: number;\n summary: string;\n}\n\n/**\n * Generates test files that validate pre/post migration behavior equivalence.\n *\n * For each schema file, generates a test that:\n * 1. Imports the schema\n * 2. Tests validation of sample data (valid + invalid)\n * 3. Verifies error behavior is consistent\n */\nexport class TestScaffolder {\n scaffold(sourceFiles: SourceFile[], from: SchemaLibrary, to: SchemaLibrary): TestScaffoldResult {\n const tests: ScaffoldedTest[] = [];\n let totalSchemas = 0;\n\n for (const file of sourceFiles) {\n const schemas = this.extractSchemaNames(file, from);\n if (schemas.length === 0) continue;\n\n totalSchemas += schemas.length;\n\n const testCode = this.generateTestFile(file, schemas, from, to);\n const filePath = file.getFilePath().replace(/\\.tsx?$/, '.migration-test.ts');\n\n tests.push({ filePath, testCode, schemaCount: schemas.length });\n }\n\n const summary =\n tests.length > 0\n ? `Generated ${tests.length} test file(s) covering ${totalSchemas} schema(s) for ${from}->${to} migration.`\n : 'No schemas found to generate tests for.';\n\n return { tests, totalSchemas, summary };\n }\n\n private extractSchemaNames(file: SourceFile, library: SchemaLibrary): string[] {\n const names: string[] = [];\n const prefixes = this.getLibraryPrefixes(library);\n\n for (const varDecl of file.getVariableDeclarations()) {\n const initializer = varDecl.getInitializer();\n if (!initializer) continue;\n\n const text = initializer.getText();\n if (prefixes.some((p) => text.startsWith(p))) {\n names.push(varDecl.getName());\n }\n }\n\n return names;\n }\n\n private getLibraryPrefixes(library: SchemaLibrary): string[] {\n switch (library) {\n case 'zod':\n case 'zod-v3':\n return ['z.', 'zod.'];\n case 'yup':\n return ['yup.', 'Yup.'];\n case 'joi':\n return ['Joi.', 'joi.'];\n case 'io-ts':\n return ['t.'];\n case 'valibot':\n return ['v.', 'valibot.'];\n default:\n return ['z.'];\n }\n }\n\n private generateTestFile(\n file: SourceFile,\n schemaNames: string[],\n from: SchemaLibrary,\n to: SchemaLibrary,\n ): string {\n const relativePath = file.getFilePath();\n const schemaImports = schemaNames.join(', ');\n\n const parseMethod = this.getParseMethod(to);\n const errorClass = this.getErrorClass(to);\n\n const testCases = schemaNames\n .map((name) => this.generateSchemaTests(name, to, parseMethod, errorClass))\n .join('\\n\\n');\n\n return `/**\n * Migration validation tests for ${from} -> ${to}\n * Auto-generated by SchemaShift\n *\n * These tests verify that schema behavior is preserved after migration.\n * Run before and after migration to ensure equivalence.\n *\n * Source: ${relativePath}\n */\nimport { describe, expect, it } from 'vitest';\nimport { ${schemaImports} } from '${relativePath.replace(/\\.ts$/, '.js')}';\n\ndescribe('Migration validation: ${relativePath}', () => {\n${testCases}\n});\n`;\n }\n\n private getParseMethod(to: SchemaLibrary): string {\n switch (to) {\n case 'valibot':\n return 'v.safeParse';\n default:\n return '.safeParse';\n }\n }\n\n private getErrorClass(to: SchemaLibrary): string {\n switch (to) {\n case 'valibot':\n return 'ValiError';\n case 'zod':\n case 'v4':\n return 'ZodError';\n default:\n return 'Error';\n }\n }\n\n private generateSchemaTests(\n schemaName: string,\n to: SchemaLibrary,\n _parseMethod: string,\n _errorClass: string,\n ): string {\n if (to === 'valibot') {\n return ` describe('${schemaName}', () => {\n it('should accept valid data', () => {\n // TODO(schemashift): Add valid test data for ${schemaName}\n // const result = v.safeParse(${schemaName}, validData);\n // expect(result.success).toBe(true);\n });\n\n it('should reject invalid data', () => {\n // TODO(schemashift): Add invalid test data for ${schemaName}\n // const result = v.safeParse(${schemaName}, invalidData);\n // expect(result.success).toBe(false);\n });\n\n it('should preserve error messages', () => {\n // TODO(schemashift): Verify custom error messages are preserved\n // const result = v.safeParse(${schemaName}, invalidData);\n // expect(result.issues?.[0]?.message).toContain('expected message');\n });\n });`;\n }\n\n return ` describe('${schemaName}', () => {\n it('should accept valid data', () => {\n // TODO(schemashift): Add valid test data for ${schemaName}\n // const result = ${schemaName}.safeParse(validData);\n // expect(result.success).toBe(true);\n });\n\n it('should reject invalid data', () => {\n // TODO(schemashift): Add invalid test data for ${schemaName}\n // const result = ${schemaName}.safeParse(invalidData);\n // expect(result.success).toBe(false);\n });\n\n it('should preserve error messages', () => {\n // TODO(schemashift): Verify custom error messages are preserved\n // const result = ${schemaName}.safeParse(invalidData);\n // expect(result.error?.issues[0]?.message).toContain('expected message');\n });\n });`;\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())\n .map((key) => {\n const parts = key.split('->');\n if (parts.length !== 2) return null;\n return { from: parts[0] as SchemaLibrary, to: parts[1] as SchemaLibrary };\n })\n .filter((entry): entry is { from: SchemaLibrary; to: SchemaLibrary } => entry !== null);\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","import { Node, type SourceFile } from 'ts-morph';\n\nexport interface DuplicateTypeCandidate {\n typeName: string;\n typeFilePath: string;\n typeLineNumber: number;\n schemaName: string;\n schemaFilePath: string;\n schemaLineNumber: number;\n matchedFields: string[];\n confidence: 'high' | 'medium' | 'low';\n suggestion: string;\n}\n\nexport interface TypeDedupResult {\n candidates: DuplicateTypeCandidate[];\n summary: string;\n}\n\n/**\n * Detects TypeScript interfaces/types that mirror schema shapes.\n *\n * In Joi and Yup codebases, developers often maintain duplicate type definitions\n * alongside schemas because those libraries don't infer TypeScript types.\n * After migrating to Zod, these duplicates can be replaced with z.infer<typeof schema>.\n */\nexport class TypeDedupDetector {\n detect(sourceFiles: SourceFile[]): TypeDedupResult {\n const typeDefinitions = this.collectTypeDefinitions(sourceFiles);\n const schemaDefinitions = this.collectSchemaDefinitions(sourceFiles);\n const candidates = this.findMatches(typeDefinitions, schemaDefinitions);\n\n const summary =\n candidates.length > 0\n ? `Found ${candidates.length} type definition(s) that may duplicate schema shapes. ` +\n 'After migration, replace with z.infer<typeof schema>.'\n : 'No duplicate type definitions detected.';\n\n return { candidates, summary };\n }\n\n private collectTypeDefinitions(sourceFiles: SourceFile[]): Array<{\n name: string;\n fields: string[];\n filePath: string;\n lineNumber: number;\n }> {\n const types: Array<{\n name: string;\n fields: string[];\n filePath: string;\n lineNumber: number;\n }> = [];\n\n for (const file of sourceFiles) {\n const filePath = file.getFilePath();\n\n for (const iface of file.getInterfaces()) {\n const fields = iface.getProperties().map((p) => p.getName());\n if (fields.length > 0) {\n types.push({\n name: iface.getName(),\n fields,\n filePath,\n lineNumber: iface.getStartLineNumber(),\n });\n }\n }\n\n for (const typeAlias of file.getTypeAliases()) {\n const typeNode = typeAlias.getTypeNode();\n if (!typeNode) continue;\n\n if (Node.isTypeLiteral(typeNode)) {\n const fields = typeNode.getProperties().map((p) => p.getName());\n if (fields.length > 0) {\n types.push({\n name: typeAlias.getName(),\n fields,\n filePath,\n lineNumber: typeAlias.getStartLineNumber(),\n });\n }\n }\n }\n }\n\n return types;\n }\n\n private collectSchemaDefinitions(sourceFiles: SourceFile[]): Array<{\n name: string;\n fields: string[];\n filePath: string;\n lineNumber: number;\n }> {\n const schemas: Array<{\n name: string;\n fields: string[];\n filePath: string;\n lineNumber: number;\n }> = [];\n\n for (const file of sourceFiles) {\n const filePath = file.getFilePath();\n\n for (const varDecl of file.getVariableDeclarations()) {\n const initializer = varDecl.getInitializer();\n if (!initializer) continue;\n\n const text = initializer.getText();\n\n const isSchema =\n /(?:z|zod|yup|Yup|Joi|joi|t|v|valibot)\\.object\\s*\\(/.test(text) ||\n /Joi\\.object\\s*\\(/.test(text);\n\n if (!isSchema) continue;\n\n const fields = this.extractSchemaFields(text);\n if (fields.length > 0) {\n schemas.push({\n name: varDecl.getName(),\n fields,\n filePath,\n lineNumber: varDecl.getStartLineNumber(),\n });\n }\n }\n }\n\n return schemas;\n }\n\n private extractSchemaFields(text: string): string[] {\n const fields: string[] = [];\n const fieldPattern = /\\b(\\w+)\\s*:\\s*(?:z|zod|yup|Yup|Joi|joi|t|v|valibot)\\./g;\n for (const match of text.matchAll(fieldPattern)) {\n if (match[1]) {\n fields.push(match[1]);\n }\n }\n return fields;\n }\n\n private findMatches(\n types: Array<{ name: string; fields: string[]; filePath: string; lineNumber: number }>,\n schemas: Array<{ name: string; fields: string[]; filePath: string; lineNumber: number }>,\n ): DuplicateTypeCandidate[] {\n const candidates: DuplicateTypeCandidate[] = [];\n\n for (const typeDef of types) {\n for (const schemaDef of schemas) {\n const matchedFields = this.getMatchedFields(typeDef.fields, schemaDef.fields);\n if (matchedFields.length < 2) continue;\n\n const typeFieldCount = typeDef.fields.length;\n const schemaFieldCount = schemaDef.fields.length;\n const matchRatio = matchedFields.length / Math.max(typeFieldCount, schemaFieldCount);\n\n let confidence: 'high' | 'medium' | 'low';\n if (matchRatio >= 0.8) {\n confidence = 'high';\n } else if (matchRatio >= 0.5) {\n confidence = 'medium';\n } else {\n confidence = 'low';\n }\n\n if (confidence === 'low' && !this.namesRelated(typeDef.name, schemaDef.name)) {\n continue;\n }\n\n candidates.push({\n typeName: typeDef.name,\n typeFilePath: typeDef.filePath,\n typeLineNumber: typeDef.lineNumber,\n schemaName: schemaDef.name,\n schemaFilePath: schemaDef.filePath,\n schemaLineNumber: schemaDef.lineNumber,\n matchedFields,\n confidence,\n suggestion:\n `Replace \"type/interface ${typeDef.name}\" with ` +\n `\"type ${typeDef.name} = z.infer<typeof ${schemaDef.name}>\" ` +\n `(${matchedFields.length}/${typeFieldCount} fields match).`,\n });\n }\n }\n\n candidates.sort((a, b) => {\n const confidenceOrder = { high: 0, medium: 1, low: 2 };\n const diff = confidenceOrder[a.confidence] - confidenceOrder[b.confidence];\n if (diff !== 0) return diff;\n return b.matchedFields.length - a.matchedFields.length;\n });\n\n return candidates;\n }\n\n private getMatchedFields(typeFields: string[], schemaFields: string[]): string[] {\n const schemaSet = new Set(schemaFields);\n return typeFields.filter((f) => schemaSet.has(f));\n }\n\n private namesRelated(typeName: string, schemaName: string): boolean {\n const normalize = (name: string) =>\n name.toLowerCase().replace(/schema|type|interface|i$/gi, '');\n return normalize(typeName) === normalize(schemaName);\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","import_node_fs","import_node_path","import_node_fs","import_node_path","import_ts_morph"]}
|