@schemashift/core 0.11.0 → 0.13.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/analyzer.ts","../src/detect.ts","../src/approval.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/cross-field-patterns.ts","../src/dependency-graph.ts","../src/detailed-analyzer.ts","../src/drift-detector.ts","../src/form-resolver-migrator.ts","../src/governance.ts","../src/governance-fixer.ts","../src/governance-templates.ts","../src/graph-exporter.ts","../src/incremental.ts","../src/migration-templates.ts","../src/notifications.ts","../src/package-updater.ts","../src/performance-analyzer.ts","../src/plugin-loader.ts","../src/standard-schema.ts","../src/standard-schema-advisor.ts","../src/test-scaffolder.ts","../src/transform.ts","../src/type-dedup-detector.ts"],"sourcesContent":["export { type AnalysisResult, SchemaAnalyzer } from './analyzer.js';\nexport {\n type ApprovalDecision,\n ApprovalManager,\n type ApprovalStatus,\n type ApprovalSummary,\n type MigrationRequest,\n} from './approval.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 AuditEntryMetadata,\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 type CrossFieldPattern,\n conditionalValidation,\n dependentFields,\n mutuallyExclusive,\n requireIf,\n requireOneOf,\n suggestCrossFieldPattern,\n} from './cross-field-patterns.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 DriftDetector,\n type DriftModification,\n type DriftResult,\n type SchemaFileSnapshot,\n type SchemaSnapshot,\n} from './drift-detector.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 FixResult,\n type FixSummary,\n GovernanceFixer,\n} from './governance-fixer.js';\nexport {\n GOVERNANCE_TEMPLATES,\n type GovernanceTemplate,\n getGovernanceTemplate,\n getGovernanceTemplateNames,\n getGovernanceTemplatesByCategory,\n} from './governance-templates.js';\nexport {\n GraphExporter,\n type GraphExportOptions,\n type GraphNode,\n} from './graph-exporter.js';\nexport {\n type IncrementalState,\n IncrementalTracker,\n} from './incremental.js';\nexport {\n getAllMigrationTemplates,\n getMigrationTemplate,\n getMigrationTemplateNames,\n getMigrationTemplatesByCategory,\n type MigrationTemplate,\n type MigrationTemplateStep,\n type PackageChange,\n validateMigrationTemplate,\n} from './migration-templates.js';\nexport {\n type MigrationEvent,\n type MigrationEventType,\n type NotificationResult,\n type WebhookConfig,\n WebhookNotifier,\n} from './notifications.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 { StandardSchemaAdvisor, type StandardSchemaAdvisory } from './standard-schema-advisor.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 arktype: [/^arktype$/],\n superstruct: [/^superstruct$/],\n effect: [/^@effect\\/schema$/],\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","/**\n * Approval Workflow for SchemaShift\n *\n * Provides review gates before executing migrations on shared codebases.\n * Pending migrations are stored in `.schemashift/pending/`.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type ApprovalStatus = 'pending' | 'approved' | 'rejected';\n\nexport interface MigrationRequest {\n id: string;\n from: string;\n to: string;\n files: string[];\n requestedBy: string;\n requestedAt: string;\n status: ApprovalStatus;\n reviewedBy?: string;\n reviewedAt?: string;\n reason?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ApprovalDecision {\n requestId: string;\n status: 'approved' | 'rejected';\n reviewedBy: string;\n reason?: string;\n}\n\nexport interface ApprovalSummary {\n pending: number;\n approved: number;\n rejected: number;\n total: number;\n}\n\n/**\n * Manages migration approval workflows with file-based persistence.\n */\nexport class ApprovalManager {\n private pendingDir: string;\n\n constructor(projectPath: string) {\n this.pendingDir = join(projectPath, '.schemashift', 'pending');\n }\n\n /**\n * Create a new migration request for review.\n */\n createRequest(\n from: string,\n to: string,\n files: string[],\n requestedBy: string,\n metadata?: Record<string, unknown>,\n ): MigrationRequest {\n const id = `mig-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const request: MigrationRequest = {\n id,\n from,\n to,\n files,\n requestedBy,\n requestedAt: new Date().toISOString(),\n status: 'pending',\n metadata,\n };\n\n this.ensureDir();\n const filePath = join(this.pendingDir, `${id}.json`);\n writeFileSync(filePath, JSON.stringify(request, null, 2), 'utf-8');\n\n return request;\n }\n\n /**\n * Review (approve or reject) a pending migration request.\n */\n review(decision: ApprovalDecision): MigrationRequest {\n const request = this.getRequest(decision.requestId);\n if (!request) {\n throw new Error(`Migration request ${decision.requestId} not found`);\n }\n if (request.status !== 'pending') {\n throw new Error(`Migration request ${decision.requestId} is already ${request.status}`);\n }\n\n request.status = decision.status;\n request.reviewedBy = decision.reviewedBy;\n request.reviewedAt = new Date().toISOString();\n request.reason = decision.reason;\n\n const filePath = join(this.pendingDir, `${decision.requestId}.json`);\n writeFileSync(filePath, JSON.stringify(request, null, 2), 'utf-8');\n\n return request;\n }\n\n /**\n * Get a specific migration request by ID.\n */\n getRequest(id: string): MigrationRequest | null {\n const filePath = join(this.pendingDir, `${id}.json`);\n if (!existsSync(filePath)) {\n return null;\n }\n const content = readFileSync(filePath, 'utf-8');\n return JSON.parse(content) as MigrationRequest;\n }\n\n /**\n * List all migration requests, optionally filtered by status.\n */\n listRequests(status?: ApprovalStatus): MigrationRequest[] {\n if (!existsSync(this.pendingDir)) {\n return [];\n }\n\n const files = readdirSync(this.pendingDir).filter((f) => f.endsWith('.json'));\n const requests: MigrationRequest[] = [];\n\n for (const file of files) {\n const content = readFileSync(join(this.pendingDir, file), 'utf-8');\n const request = JSON.parse(content) as MigrationRequest;\n if (!status || request.status === status) {\n requests.push(request);\n }\n }\n\n return requests.sort(\n (a, b) => new Date(b.requestedAt).getTime() - new Date(a.requestedAt).getTime(),\n );\n }\n\n /**\n * Get summary counts of all requests.\n */\n getSummary(): ApprovalSummary {\n const all = this.listRequests();\n return {\n pending: all.filter((r) => r.status === 'pending').length,\n approved: all.filter((r) => r.status === 'approved').length,\n rejected: all.filter((r) => r.status === 'rejected').length,\n total: all.length,\n };\n }\n\n /**\n * Check if a migration has been approved.\n */\n isApproved(requestId: string): boolean {\n const request = this.getRequest(requestId);\n return request?.status === 'approved';\n }\n\n private ensureDir(): void {\n if (!existsSync(this.pendingDir)) {\n mkdirSync(this.pendingDir, { recursive: true });\n }\n }\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 AuditEntryMetadata {\n gitCommit?: string;\n gitBranch?: string;\n ciJobId?: string;\n ciProvider?: string;\n hostname?: string;\n nodeVersion?: string;\n schemashiftVersion?: string;\n}\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 metadata?: AuditEntryMetadata;\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 metadata?: AuditEntryMetadata;\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 metadata: params.metadata || this.collectMetadata(),\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 * Export audit log as JSON string.\n */\n exportJson(): string {\n const log = this.read();\n return JSON.stringify(log, null, 2);\n }\n\n /**\n * Export audit log as CSV string.\n */\n exportCsv(): string {\n const log = this.read();\n const headers = [\n 'timestamp',\n 'migrationId',\n 'filePath',\n 'action',\n 'from',\n 'to',\n 'success',\n 'warningCount',\n 'errorCount',\n 'riskScore',\n 'user',\n 'duration',\n ];\n const rows = log.entries.map((e) =>\n headers\n .map((h) => {\n const val = e[h as keyof AuditEntry];\n if (val === undefined || val === null) return '';\n return String(val).includes(',') ? `\"${String(val)}\"` : String(val);\n })\n .join(','),\n );\n return [headers.join(','), ...rows].join('\\n');\n }\n\n /**\n * Get entries filtered by date range.\n */\n getByDateRange(start: Date, end: Date): AuditEntry[] {\n const log = this.read();\n return log.entries.filter((e) => {\n const ts = new Date(e.timestamp);\n return ts >= start && ts <= end;\n });\n }\n\n /**\n * Clear the audit log.\n */\n clear(): void {\n this.write({ version: AUDIT_VERSION, entries: [] });\n }\n\n private collectMetadata(): AuditEntryMetadata {\n return {\n hostname: process.env.HOSTNAME || undefined,\n nodeVersion: process.version,\n ciJobId: process.env.CI_JOB_ID || process.env.GITHUB_RUN_ID || undefined,\n ciProvider: process.env.GITHUB_ACTIONS\n ? 'github'\n : process.env.GITLAB_CI\n ? 'gitlab'\n : process.env.CIRCLECI\n ? 'circleci'\n : process.env.JENKINS_URL\n ? 'jenkins'\n : undefined,\n gitBranch: process.env.GITHUB_REF_NAME || process.env.CI_COMMIT_BRANCH || undefined,\n gitCommit: process.env.GITHUB_SHA || process.env.CI_COMMIT_SHA || undefined,\n };\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 // Zod-based HTTP/API clients\n {\n package: 'zodios',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'Zodios uses Zod schemas for API contract definitions. Zod v4 type changes may break contracts.',\n suggestion: 'Upgrade Zodios to a Zod v4-compatible version and verify all API contracts.',\n severity: 'warning',\n upgradeCommand: 'npm install @zodios/core@latest',\n }),\n },\n {\n package: '@zodios/core',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n '@zodios/core uses Zod schemas for API contract definitions. Zod v4 type changes may break contracts.',\n suggestion:\n 'Upgrade @zodios/core to a Zod v4-compatible version and verify all API contracts.',\n severity: 'warning',\n upgradeCommand: 'npm install @zodios/core@latest',\n }),\n },\n {\n package: '@ts-rest/core',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n '@ts-rest/core uses Zod for contract definitions. Zod v4 type incompatibilities may break runtime validation.',\n suggestion: 'Upgrade @ts-rest/core to a version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install @ts-rest/core@latest',\n }),\n },\n {\n package: 'trpc-openapi',\n category: 'openapi',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'trpc-openapi needs a v4-compatible version for Zod v4.',\n suggestion: 'Check for a Zod v4-compatible version of trpc-openapi before upgrading.',\n severity: 'warning',\n upgradeCommand: 'npm install trpc-openapi@latest',\n }),\n },\n\n // Form data and URL state libraries\n {\n package: 'zod-form-data',\n category: 'form',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'zod-form-data relies on Zod v3 internals (_def) which moved to _zod.def in v4.',\n suggestion: 'Upgrade zod-form-data to a Zod v4-compatible version.',\n severity: 'error',\n upgradeCommand: 'npm install zod-form-data@latest',\n }),\n },\n {\n package: '@conform-to/zod',\n category: 'form',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: '@conform-to/zod may have Zod v4 compatibility issues.',\n suggestion: 'Upgrade @conform-to/zod to the latest version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install @conform-to/zod@latest',\n }),\n },\n {\n package: 'nuqs',\n category: 'validation-util',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'nuqs uses Zod for URL state parsing. Zod v4 changes may affect URL parameter validation.',\n suggestion: 'Upgrade nuqs to a version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install nuqs@latest',\n }),\n },\n\n // Server action / routing integrations\n {\n package: 'next-safe-action',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'next-safe-action uses Zod for input validation. Zod v4 type changes may break action definitions.',\n suggestion: 'Upgrade next-safe-action to the latest version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install next-safe-action@latest',\n }),\n },\n {\n package: '@tanstack/router',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n '@tanstack/router uses Zod for route parameter validation. Zod v4 changes may affect type inference.',\n suggestion: 'Upgrade @tanstack/router to a version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install @tanstack/router@latest',\n }),\n },\n {\n package: '@tanstack/react-query',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: '@tanstack/react-query may use Zod for query key/param validation via integrations.',\n suggestion: 'Verify any Zod-based query validation still works after the Zod v4 upgrade.',\n severity: 'info',\n }),\n },\n {\n package: 'fastify-type-provider-zod',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'fastify-type-provider-zod needs a Zod v4-compatible version.',\n suggestion: 'Upgrade fastify-type-provider-zod to a version supporting Zod v4.',\n severity: 'warning',\n upgradeCommand: 'npm install fastify-type-provider-zod@latest',\n }),\n },\n {\n package: 'zod-i18n-map',\n category: 'validation-util',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'zod-i18n-map uses Zod v3 error map format. Error messages changed in v4 (e.g., \"Required\" is now descriptive).',\n suggestion:\n 'Check for a Zod v4-compatible version of zod-i18n-map or update custom error maps.',\n severity: 'warning',\n upgradeCommand: 'npm install zod-i18n-map@latest',\n }),\n },\n {\n package: 'openapi-zod-client',\n category: 'openapi',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'openapi-zod-client generates Zod v3 schemas from OpenAPI specs. Generated code may need regeneration.',\n suggestion: 'Upgrade openapi-zod-client and regenerate schemas for Zod v4 compatibility.',\n severity: 'warning',\n upgradeCommand: 'npm install openapi-zod-client@latest',\n }),\n },\n\n // Schema library detection for cross-library migrations\n {\n package: '@effect/schema',\n category: 'validation-util',\n migrations: ['io-ts->zod'],\n check: () => ({\n issue:\n '@effect/schema detected — this is the successor to io-ts/fp-ts. Consider migrating to Effect Schema instead of Zod if you prefer FP patterns.',\n suggestion:\n 'If using fp-ts patterns heavily, consider Effect Schema as the migration target instead of Zod.',\n severity: 'info',\n }),\n },\n {\n package: 'arktype',\n category: 'validation-util',\n migrations: ['zod->valibot', 'zod-v3->v4'],\n check: (_version, migration) => {\n if (migration === 'zod->valibot') {\n return {\n issue:\n 'ArkType detected alongside Zod. Consider ArkType as a migration target — it offers 100x faster validation and Standard Schema support.',\n suggestion:\n 'Consider migrating to ArkType for performance-critical paths, or keep Zod for ecosystem compatibility.',\n severity: 'info',\n };\n }\n return {\n issue:\n 'ArkType detected alongside Zod. ArkType supports Standard Schema, making it interoperable with Zod v4.',\n suggestion: 'No action needed — ArkType and Zod v4 can coexist via Standard Schema.',\n severity: 'info',\n };\n },\n },\n {\n package: 'superstruct',\n category: 'validation-util',\n migrations: ['yup->zod', 'joi->zod'],\n check: () => ({\n issue:\n 'Superstruct detected in the project. Consider migrating Superstruct schemas to Zod as well for a unified validation approach.',\n suggestion: 'Use SchemaShift to migrate Superstruct schemas alongside Yup/Joi schemas.',\n severity: 'info',\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","/**\n * Cross-Field Validation Pattern Helpers\n *\n * Provides reusable patterns for common cross-field validation scenarios.\n * Generates `.superRefine()` code snippets for use during migration.\n */\n\nexport interface CrossFieldPattern {\n name: string;\n description: string;\n zodCode: string;\n}\n\n/**\n * Generate a `.superRefine()` snippet for conditional required fields.\n * When `conditionField` has a truthy value, `requiredField` becomes required.\n */\nexport function requireIf(conditionField: string, requiredField: string): CrossFieldPattern {\n return {\n name: `requireIf(${conditionField}, ${requiredField})`,\n description: `${requiredField} is required when ${conditionField} is truthy`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (data.${conditionField} && !data.${requiredField}) {`,\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: '${requiredField} is required when ${conditionField} is set',`,\n ` path: ['${requiredField}'],`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet requiring at least one of the given fields.\n */\nexport function requireOneOf(fields: string[]): CrossFieldPattern {\n const fieldList = fields.map((f) => `'${f}'`).join(', ');\n const conditions = fields.map((f) => `data.${f}`).join(' || ');\n return {\n name: `requireOneOf(${fields.join(', ')})`,\n description: `At least one of [${fields.join(', ')}] must be provided`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (!(${conditions})) {`,\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: 'At least one of [${fields.join(', ')}] is required',`,\n ` path: [${fieldList}],`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet for mutually exclusive fields.\n * Only one of the given fields can have a value at a time.\n */\nexport function mutuallyExclusive(fields: string[]): CrossFieldPattern {\n const checks = fields.map((f) => `(data.${f} ? 1 : 0)`).join(' + ');\n return {\n name: `mutuallyExclusive(${fields.join(', ')})`,\n description: `Only one of [${fields.join(', ')}] can be set at a time`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` const count = ${checks};`,\n ' if (count > 1) {',\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: 'Only one of [${fields.join(', ')}] can be set at a time',`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet for dependent fields.\n * When `primaryField` is set, all `dependentFields` become required.\n */\nexport function dependentFields(primaryField: string, dependents: string[]): CrossFieldPattern {\n const checks = dependents\n .map(\n (f) =>\n ` if (!data.${f}) {\\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: '${f} is required when ${primaryField} is set', path: ['${f}'] });\\n }`,\n )\n .join('\\n');\n return {\n name: `dependentFields(${primaryField} -> ${dependents.join(', ')})`,\n description: `When ${primaryField} is set, [${dependents.join(', ')}] are required`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (data.${primaryField}) {`,\n checks,\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet for conditional validation.\n * When `conditionField` equals `conditionValue`, apply validation on `targetField`.\n */\nexport function conditionalValidation(\n conditionField: string,\n conditionValue: string,\n targetField: string,\n validationMessage: string,\n): CrossFieldPattern {\n return {\n name: `conditionalValidation(${conditionField}=${conditionValue} -> ${targetField})`,\n description: `Validate ${targetField} when ${conditionField} equals ${conditionValue}`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (data.${conditionField} === ${conditionValue} && !data.${targetField}) {`,\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: '${validationMessage}',`,\n ` path: ['${targetField}'],`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Detect common cross-field patterns in Yup `.when()` calls and suggest Zod equivalents.\n */\nexport function suggestCrossFieldPattern(whenCode: string): CrossFieldPattern | null {\n // Pattern: .when('field', { is: true, then: ... })\n const booleanMatch = whenCode.match(/\\.when\\(['\"](\\w+)['\"]\\s*,\\s*\\{[^}]*is:\\s*true/);\n if (booleanMatch?.[1]) {\n const field = booleanMatch[1];\n return requireIf(field, 'targetField');\n }\n\n // Pattern: .when(['fieldA', 'fieldB'], ...)\n const multiFieldMatch = whenCode.match(/\\.when\\(\\[([^\\]]+)\\]/);\n if (multiFieldMatch?.[1]) {\n const fields = multiFieldMatch[1]\n .split(',')\n .map((f) => f.trim().replace(/['\"]/g, ''))\n .filter(Boolean);\n if (fields.length > 1) {\n return dependentFields(fields[0] ?? 'primary', fields.slice(1));\n }\n }\n\n return null;\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 { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface SchemaSnapshot {\n version: number;\n timestamp: string;\n projectPath: string;\n schemas: SchemaFileSnapshot[];\n}\n\nexport interface SchemaFileSnapshot {\n filePath: string;\n library: string;\n contentHash: string;\n schemaCount: number;\n schemaNames: string[];\n}\n\nexport interface DriftResult {\n hasDrift: boolean;\n added: SchemaFileSnapshot[];\n removed: SchemaFileSnapshot[];\n modified: DriftModification[];\n unchanged: number;\n totalFiles: number;\n snapshotTimestamp: string;\n}\n\nexport interface DriftModification {\n filePath: string;\n library: string;\n previousHash: string;\n currentHash: string;\n previousSchemaCount: number;\n currentSchemaCount: number;\n addedSchemas: string[];\n removedSchemas: string[];\n}\n\nconst SNAPSHOT_DIR = '.schemashift';\nconst SNAPSHOT_FILE = 'schema-snapshot.json';\nconst SNAPSHOT_VERSION = 1;\n\nexport class DriftDetector {\n private snapshotDir: string;\n private snapshotPath: string;\n\n constructor(projectPath: string) {\n this.snapshotDir = join(projectPath, SNAPSHOT_DIR);\n this.snapshotPath = join(this.snapshotDir, SNAPSHOT_FILE);\n }\n\n /**\n * Take a snapshot of the current schema state\n */\n snapshot(files: string[], projectPath: string): SchemaSnapshot {\n const schemas: SchemaFileSnapshot[] = [];\n\n for (const filePath of files) {\n if (!existsSync(filePath)) continue;\n\n const content = readFileSync(filePath, 'utf-8');\n const library = this.detectLibraryFromContent(content);\n\n if (library === 'unknown') continue;\n\n const schemaNames = this.extractSchemaNames(content);\n\n schemas.push({\n filePath: relative(projectPath, filePath),\n library,\n contentHash: this.hashContent(content),\n schemaCount: schemaNames.length,\n schemaNames,\n });\n }\n\n const snapshot: SchemaSnapshot = {\n version: SNAPSHOT_VERSION,\n timestamp: new Date().toISOString(),\n projectPath,\n schemas,\n };\n\n return snapshot;\n }\n\n /**\n * Save a snapshot to disk\n */\n saveSnapshot(snapshot: SchemaSnapshot): void {\n if (!existsSync(this.snapshotDir)) {\n mkdirSync(this.snapshotDir, { recursive: true });\n }\n writeFileSync(this.snapshotPath, JSON.stringify(snapshot, null, 2));\n }\n\n /**\n * Load saved snapshot from disk\n */\n loadSnapshot(): SchemaSnapshot | null {\n if (!existsSync(this.snapshotPath)) {\n return null;\n }\n try {\n const content = readFileSync(this.snapshotPath, 'utf-8');\n return JSON.parse(content) as SchemaSnapshot;\n } catch {\n return null;\n }\n }\n\n /**\n * Compare current state against saved snapshot\n */\n detect(currentFiles: string[], projectPath: string): DriftResult {\n const saved = this.loadSnapshot();\n if (!saved) {\n return {\n hasDrift: false,\n added: [],\n removed: [],\n modified: [],\n unchanged: 0,\n totalFiles: 0,\n snapshotTimestamp: '',\n };\n }\n\n const current = this.snapshot(currentFiles, projectPath);\n return this.compareSnapshots(saved, current);\n }\n\n /**\n * Compare two snapshots and return drift results\n */\n compareSnapshots(baseline: SchemaSnapshot, current: SchemaSnapshot): DriftResult {\n const baselineMap = new Map(baseline.schemas.map((s) => [s.filePath, s]));\n const currentMap = new Map(current.schemas.map((s) => [s.filePath, s]));\n\n const added: SchemaFileSnapshot[] = [];\n const removed: SchemaFileSnapshot[] = [];\n const modified: DriftModification[] = [];\n let unchanged = 0;\n\n // Find added and modified files\n for (const [path, currentFile] of currentMap) {\n const baselineFile = baselineMap.get(path);\n if (!baselineFile) {\n added.push(currentFile);\n } else if (currentFile.contentHash !== baselineFile.contentHash) {\n const addedSchemas = currentFile.schemaNames.filter(\n (n) => !baselineFile.schemaNames.includes(n),\n );\n const removedSchemas = baselineFile.schemaNames.filter(\n (n) => !currentFile.schemaNames.includes(n),\n );\n modified.push({\n filePath: path,\n library: currentFile.library,\n previousHash: baselineFile.contentHash,\n currentHash: currentFile.contentHash,\n previousSchemaCount: baselineFile.schemaCount,\n currentSchemaCount: currentFile.schemaCount,\n addedSchemas,\n removedSchemas,\n });\n } else {\n unchanged++;\n }\n }\n\n // Find removed files\n for (const [path, baselineFile] of baselineMap) {\n if (!currentMap.has(path)) {\n removed.push(baselineFile);\n }\n }\n\n return {\n hasDrift: added.length > 0 || removed.length > 0 || modified.length > 0,\n added,\n removed,\n modified,\n unchanged,\n totalFiles: currentMap.size,\n snapshotTimestamp: baseline.timestamp,\n };\n }\n\n private extractSchemaNames(content: string): string[] {\n const names: string[] = [];\n const pattern =\n /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:z\\.|yup\\.|Joi\\.|t\\.|v\\.|type\\(|object\\(|string\\(|S\\.)/g;\n for (const match of content.matchAll(pattern)) {\n if (match[1]) names.push(match[1]);\n }\n return names;\n }\n\n private detectLibraryFromContent(content: string): SchemaLibrary {\n if (/from\\s*['\"]zod['\"]/.test(content) || /\\bz\\./.test(content)) return 'zod';\n if (/from\\s*['\"]yup['\"]/.test(content) || /\\byup\\./.test(content)) return 'yup';\n if (/from\\s*['\"]joi['\"]/.test(content) || /\\bJoi\\./.test(content)) return 'joi';\n if (\n /from\\s*['\"]io-ts['\"]/.test(content) ||\n (/\\bt\\./.test(content) && /from\\s*['\"]io-ts/.test(content))\n )\n return 'io-ts';\n if (\n /from\\s*['\"]valibot['\"]/.test(content) ||\n (/\\bv\\./.test(content) && /from\\s*['\"]valibot/.test(content))\n )\n return 'valibot';\n if (/from\\s*['\"]arktype['\"]/.test(content)) return 'arktype' as SchemaLibrary;\n if (/from\\s*['\"]superstruct['\"]/.test(content)) return 'superstruct' as SchemaLibrary;\n if (/from\\s*['\"]@effect\\/schema['\"]/.test(content)) return 'effect' as SchemaLibrary;\n return 'unknown';\n }\n\n private hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\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 type { GovernanceViolation } from './governance.js';\n\nexport interface FixResult {\n success: boolean;\n fixedCode?: string;\n explanation: string;\n rule: string;\n lineNumber: number;\n}\n\nexport interface FixSummary {\n totalViolations: number;\n fixed: number;\n skipped: number;\n results: FixResult[];\n}\n\n/**\n * GovernanceFixer applies auto-fixes for governance violations.\n * Supports fixing: no-any-schemas, require-descriptions, require-max-length, naming-convention.\n */\nexport class GovernanceFixer {\n private defaultMaxLength = 10000;\n\n /**\n * Set the default max length appended by the require-max-length fix.\n */\n setDefaultMaxLength(length: number): void {\n this.defaultMaxLength = length;\n }\n\n /**\n * Check if a violation is auto-fixable.\n */\n canFix(violation: GovernanceViolation): boolean {\n return [\n 'no-any-schemas',\n 'require-descriptions',\n 'require-max-length',\n 'naming-convention',\n 'no-any',\n 'require-description',\n 'required-validations',\n 'require-safeParse',\n ].includes(violation.rule);\n }\n\n /**\n * Fix a single violation in a source file.\n * Returns the fixed code for the entire file.\n */\n fix(violation: GovernanceViolation, sourceCode: string): FixResult {\n switch (violation.rule) {\n case 'no-any-schemas':\n case 'no-any':\n return this.fixNoAny(violation, sourceCode);\n case 'require-descriptions':\n case 'require-description':\n return this.fixRequireDescription(violation, sourceCode);\n case 'require-max-length':\n case 'required-validations':\n return this.fixRequireMaxLength(violation, sourceCode);\n case 'naming-convention':\n return this.fixNamingConvention(violation, sourceCode);\n case 'require-safeParse':\n return this.fixRequireSafeParse(violation, sourceCode);\n default:\n return {\n success: false,\n explanation: `No auto-fix available for rule: ${violation.rule}`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n }\n\n /**\n * Fix all fixable violations in a source file.\n * Applies fixes from bottom to top to preserve line numbers.\n */\n fixAll(violations: GovernanceViolation[], sourceCode: string): FixSummary {\n const fixable = violations.filter((v) => this.canFix(v));\n const results: FixResult[] = [];\n let currentCode = sourceCode;\n let fixed = 0;\n\n // Sort violations by line number descending to fix from bottom up\n const sorted = [...fixable].sort((a, b) => b.lineNumber - a.lineNumber);\n\n for (const violation of sorted) {\n const result = this.fix(violation, currentCode);\n results.push(result);\n if (result.success && result.fixedCode) {\n currentCode = result.fixedCode;\n fixed++;\n }\n }\n\n return {\n totalViolations: violations.length,\n fixed,\n skipped: violations.length - fixed,\n results,\n };\n }\n\n private fixNoAny(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n let fixedLine = line;\n let explanation = '';\n\n if (/\\bz\\.any\\(\\)/.test(line)) {\n fixedLine = line.replace(/\\bz\\.any\\(\\)/, 'z.unknown()');\n explanation = 'Replaced z.any() with z.unknown() for type safety';\n } else if (/\\byup\\.mixed\\(\\)/.test(line)) {\n fixedLine = line.replace(/\\byup\\.mixed\\(\\)/, 'yup.mixed().required()');\n explanation = 'Added .required() constraint to yup.mixed()';\n } else if (/\\bt\\.any\\b/.test(line)) {\n fixedLine = line.replace(/\\bt\\.any\\b/, 't.unknown');\n explanation = 'Replaced t.any with t.unknown for type safety';\n } else if (/\\bv\\.any\\(\\)/.test(line)) {\n fixedLine = line.replace(/\\bv\\.any\\(\\)/, 'v.unknown()');\n explanation = 'Replaced v.any() with v.unknown() for type safety';\n } else {\n return {\n success: false,\n explanation: 'Could not identify any-type pattern to fix',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n lines[lineIndex] = fixedLine;\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixRequireDescription(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Find the end of the schema statement (look for semicolon)\n let endLineIndex = lineIndex;\n for (let i = lineIndex; i < lines.length && i < lineIndex + 20; i++) {\n if (lines[i]?.includes(';')) {\n endLineIndex = i;\n break;\n }\n }\n\n const endLine = lines[endLineIndex] ?? '';\n const schemaName = violation.schemaName || 'schema';\n const description = `${schemaName} schema`;\n\n // Insert .describe() before the semicolon\n const semicolonIndex = endLine.lastIndexOf(';');\n if (semicolonIndex >= 0) {\n lines[endLineIndex] =\n `${endLine.slice(0, semicolonIndex)}.describe('${description}')${endLine.slice(semicolonIndex)}`;\n } else {\n // No semicolon found, append to the line\n lines[endLineIndex] = `${endLine}.describe('${description}')`;\n }\n\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation: `Added .describe('${description}') to ${schemaName}`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixRequireMaxLength(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Find z.string() on this line or multi-line chain and add .max() after it\n if (/z\\.string\\(\\)/.test(line)) {\n lines[lineIndex] = line.replace(/z\\.string\\(\\)/, `z.string().max(${this.defaultMaxLength})`);\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation: `Added .max(${this.defaultMaxLength}) to string schema`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n return {\n success: false,\n explanation: 'Could not find z.string() pattern to fix on this line',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixNamingConvention(violation: GovernanceViolation, sourceCode: string): FixResult {\n const schemaName = violation.schemaName;\n if (!schemaName) {\n return {\n success: false,\n explanation: 'No schema name available for renaming',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Default: append \"Schema\" suffix\n const newName = schemaName.endsWith('Schema') ? schemaName : `${schemaName}Schema`;\n if (newName === schemaName) {\n return {\n success: false,\n explanation: 'Schema already matches naming convention',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Replace all references in the file\n const fixedCode = sourceCode.replace(new RegExp(`\\\\b${schemaName}\\\\b`, 'g'), newName);\n\n return {\n success: true,\n fixedCode,\n explanation: `Renamed \"${schemaName}\" to \"${newName}\"`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixRequireSafeParse(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n if (line.includes('.parse(') && !line.includes('.safeParse(')) {\n lines[lineIndex] = line.replace('.parse(', '.safeParse(');\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation: 'Replaced .parse() with .safeParse() for safer error handling',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n return {\n success: false,\n explanation: 'Could not find .parse() pattern to fix',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n}\n","import type { GovernanceRuleFunction, GovernanceViolation } from './governance.js';\n\n/**\n * Governance Rule Templates\n *\n * Pre-built governance rules for common enterprise policies.\n * These can be registered into the GovernanceEngine for quick setup.\n *\n * Template categories:\n * - Security: Prevent unsafe patterns (XSS, injection, DoS)\n * - Quality: Enforce code quality standards\n * - Compliance: Support SOX, HIPAA, GDPR requirements\n * - Performance: Prevent known performance pitfalls\n */\n\nexport interface GovernanceTemplate {\n name: string;\n description: string;\n category: 'security' | 'quality' | 'compliance' | 'performance';\n rule: GovernanceRuleFunction;\n}\n\n/**\n * All available governance rule templates\n */\nexport const GOVERNANCE_TEMPLATES: GovernanceTemplate[] = [\n {\n name: 'no-any-schemas',\n description:\n 'Disallow z.any(), yup.mixed() without constraints, and similar unrestricted types',\n category: 'security',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n const anyPatterns = [\n /\\bz\\.any\\(\\)/,\n /\\byup\\.mixed\\(\\)/,\n /\\bt\\.any\\b/,\n /\\bv\\.any\\(\\)/,\n /\\bunknown\\(\\)/,\n ];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n for (const pattern of anyPatterns) {\n if (pattern.test(line)) {\n violations.push({\n rule: 'no-any-schemas',\n message:\n 'Unrestricted type (any/mixed/unknown) found. Use a specific type with constraints.',\n filePath,\n lineNumber: i + 1,\n schemaName: '',\n severity: 'error',\n fixable: false,\n });\n }\n }\n }\n\n return violations;\n },\n },\n {\n name: 'require-descriptions',\n description: 'All exported schemas must have .describe() for documentation',\n category: 'quality',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n // Find exported schema definitions without .describe()\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (/export\\s+(const|let)\\s+\\w+.*=\\s*(z\\.|yup\\.)/.test(line)) {\n // Check if .describe() appears in the same statement\n let fullStatement = line;\n let j = i + 1;\n while (j < lines.length && !lines[j]?.includes(';') && j < i + 10) {\n fullStatement += lines[j] ?? '';\n j++;\n }\n if (j < lines.length) fullStatement += lines[j] ?? '';\n\n if (!fullStatement.includes('.describe(')) {\n const nameMatch = line.match(/(?:const|let)\\s+(\\w+)/);\n violations.push({\n rule: 'require-descriptions',\n message: `Exported schema ${nameMatch?.[1] || 'unknown'} should include .describe() for documentation.`,\n filePath,\n lineNumber: i + 1,\n schemaName: nameMatch?.[1] || '',\n severity: 'warning',\n fixable: true,\n });\n }\n }\n }\n\n return violations;\n },\n },\n {\n name: 'max-nesting-depth',\n description: 'Limit schema nesting depth to prevent TypeScript performance issues',\n category: 'performance',\n rule: (sourceFile, config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const maxDepth = (config.threshold as number) || 5;\n\n // Count max nesting by tracking parentheses/braces depth\n const lines = text.split('\\n');\n let currentDepth = 0;\n let maxFoundDepth = 0;\n let deepestLine = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n for (const char of line) {\n if (char === '(' || char === '{' || char === '[') {\n currentDepth++;\n if (currentDepth > maxFoundDepth) {\n maxFoundDepth = currentDepth;\n deepestLine = i + 1;\n }\n }\n if (char === ')' || char === '}' || char === ']') {\n currentDepth = Math.max(0, currentDepth - 1);\n }\n }\n }\n\n if (maxFoundDepth > maxDepth) {\n violations.push({\n rule: 'max-nesting-depth',\n message: `Schema nesting depth ${maxFoundDepth} exceeds maximum of ${maxDepth}. Consider breaking into smaller schemas.`,\n filePath,\n lineNumber: deepestLine,\n schemaName: '',\n severity: 'warning',\n fixable: false,\n });\n }\n\n return violations;\n },\n },\n {\n name: 'no-deprecated-methods',\n description: 'Flag usage of deprecated schema methods',\n category: 'quality',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n const deprecatedPatterns: Array<{ pattern: RegExp; message: string }> = [\n {\n pattern: /\\.deepPartial\\(\\)/,\n message: '.deepPartial() is removed in Zod v4. Use recursive .partial() instead.',\n },\n {\n pattern: /\\.strip\\(\\)/,\n message: '.strip() is deprecated. Use z.strictObject() or explicit stripping.',\n },\n {\n pattern: /z\\.promise\\(/,\n message: 'z.promise() is deprecated in Zod v4. Use native Promise types.',\n },\n {\n pattern: /z\\.ostring\\(\\)/,\n message: 'z.ostring() is removed in Zod v4. Use z.string().optional().',\n },\n {\n pattern: /z\\.onumber\\(\\)/,\n message: 'z.onumber() is removed in Zod v4. Use z.number().optional().',\n },\n {\n pattern: /z\\.oboolean\\(\\)/,\n message: 'z.oboolean() is removed in Zod v4. Use z.boolean().optional().',\n },\n {\n pattern: /z\\.preprocess\\(/,\n message: 'z.preprocess() is removed in Zod v4. Use z.coerce.* instead.',\n },\n ];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n for (const { pattern, message } of deprecatedPatterns) {\n if (pattern.test(line)) {\n violations.push({\n rule: 'no-deprecated-methods',\n message,\n filePath,\n lineNumber: i + 1,\n schemaName: '',\n severity: 'warning',\n fixable: false,\n });\n }\n }\n }\n\n return violations;\n },\n },\n {\n name: 'naming-convention',\n description: 'Enforce schema naming pattern (e.g., must end with Schema)',\n category: 'quality',\n rule: (sourceFile, config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n const pattern = new RegExp((config.pattern as string) || '.*Schema$');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // Match const/let assignments that look like schema definitions\n const match = line.match(\n /(?:const|let)\\s+(\\w+)\\s*=\\s*(?:z\\.|yup\\.|Joi\\.|t\\.|v\\.|type\\(|object\\(|string\\()/,\n );\n if (match?.[1] && !pattern.test(match[1])) {\n violations.push({\n rule: 'naming-convention',\n message: `Schema \"${match[1]}\" does not match naming pattern ${pattern.source}.`,\n filePath,\n lineNumber: i + 1,\n schemaName: match[1],\n severity: 'warning',\n fixable: false,\n });\n }\n }\n\n return violations;\n },\n },\n {\n name: 'require-max-length',\n description: 'String schemas must have .max() to prevent DoS via unbounded input',\n category: 'security',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // Check for z.string() without .max()\n if (/z\\.string\\(\\)/.test(line) && !line.includes('.max(') && !line.includes('.length(')) {\n // Also check next few lines for multi-line chains\n let fullChain = line;\n let j = i + 1;\n while (j < lines.length && j < i + 5 && /^\\s*\\./.test(lines[j] ?? '')) {\n fullChain += lines[j] ?? '';\n j++;\n }\n\n if (!fullChain.includes('.max(') && !fullChain.includes('.length(')) {\n violations.push({\n rule: 'require-max-length',\n message:\n 'String schema should have .max() to prevent unbounded input (DoS protection).',\n filePath,\n lineNumber: i + 1,\n schemaName: '',\n severity: 'warning',\n fixable: true,\n });\n }\n }\n }\n\n return violations;\n },\n },\n];\n\n/**\n * Get a governance template by name\n */\nexport function getGovernanceTemplate(name: string): GovernanceTemplate | undefined {\n return GOVERNANCE_TEMPLATES.find((t) => t.name === name);\n}\n\n/**\n * Get all templates for a category\n */\nexport function getGovernanceTemplatesByCategory(\n category: GovernanceTemplate['category'],\n): GovernanceTemplate[] {\n return GOVERNANCE_TEMPLATES.filter((t) => t.category === category);\n}\n\n/**\n * Get all available template names\n */\nexport function getGovernanceTemplateNames(): string[] {\n return GOVERNANCE_TEMPLATES.map((t) => t.name);\n}\n","import type { DependencyGraphResult } from './dependency-graph.js';\n\nexport interface GraphNode {\n filePath: string;\n shortPath: string;\n schemaLibrary?: string;\n schemaCount: number;\n}\n\nexport interface GraphExportOptions {\n /** Color-code nodes by schema library */\n colorByLibrary?: boolean;\n /** Highlight circular dependencies in red */\n highlightCircular?: boolean;\n /** Only show files using a specific library */\n filterLibrary?: string;\n /** File metadata for enriched graph display */\n nodeMetadata?: Map<string, { library?: string; schemaCount?: number }>;\n}\n\nconst LIBRARY_COLORS: Record<string, string> = {\n zod: '#3068B7',\n yup: '#32CD32',\n joi: '#FF6347',\n 'io-ts': '#9370DB',\n valibot: '#FF8C00',\n arktype: '#20B2AA',\n superstruct: '#DAA520',\n effect: '#6A5ACD',\n};\n\nconst LIBRARY_MERMAID_STYLES: Record<string, string> = {\n zod: 'fill:#3068B7,color:#fff',\n yup: 'fill:#32CD32,color:#000',\n joi: 'fill:#FF6347,color:#fff',\n 'io-ts': 'fill:#9370DB,color:#fff',\n valibot: 'fill:#FF8C00,color:#000',\n arktype: 'fill:#20B2AA,color:#fff',\n superstruct: 'fill:#DAA520,color:#000',\n effect: 'fill:#6A5ACD,color:#fff',\n};\n\n/**\n * Exports dependency graphs in DOT (Graphviz) and Mermaid formats.\n */\nexport class GraphExporter {\n /**\n * Export dependency graph as DOT format for Graphviz.\n */\n exportDot(graph: DependencyGraphResult, options: GraphExportOptions = {}): string {\n const lines: string[] = [];\n lines.push('digraph SchemaShiftDependencies {');\n lines.push(' rankdir=LR;');\n lines.push(' node [shape=box, style=filled, fontname=\"monospace\"];');\n lines.push(' edge [color=\"#666666\"];');\n lines.push('');\n\n // Collect circular dependency files for highlighting\n const circularFiles = new Set<string>();\n if (options.highlightCircular && graph.circularWarnings.length > 0) {\n for (const warning of graph.circularWarnings) {\n const match = warning.match(/Circular dependency: (.+)/);\n if (match?.[1]) {\n for (const part of match[1].split(' -> ')) {\n // Find full path matching short path\n for (const file of graph.sortedFiles) {\n if (file.endsWith(part.trim()) || this.shortenPath(file) === part.trim()) {\n circularFiles.add(file);\n }\n }\n }\n }\n }\n }\n\n // Add nodes\n for (const filePath of graph.sortedFiles) {\n const meta = options.nodeMetadata?.get(filePath);\n const library = meta?.library;\n\n if (options.filterLibrary && library !== options.filterLibrary) continue;\n\n const shortPath = this.shortenPath(filePath);\n const nodeId = this.toNodeId(filePath);\n const attrs: string[] = [];\n\n attrs.push(`label=\"${shortPath}\"`);\n\n if (circularFiles.has(filePath)) {\n attrs.push('color=\"#FF0000\"');\n attrs.push('penwidth=2');\n }\n\n if (options.colorByLibrary && library && LIBRARY_COLORS[library]) {\n attrs.push(`fillcolor=\"${LIBRARY_COLORS[library]}\"`);\n attrs.push('fontcolor=\"white\"');\n } else {\n attrs.push('fillcolor=\"#E8E8E8\"');\n }\n\n if (meta?.schemaCount) {\n attrs.push(`tooltip=\"${meta.schemaCount} schema(s)\"`);\n }\n\n lines.push(` ${nodeId} [${attrs.join(', ')}];`);\n }\n\n lines.push('');\n\n // Add edges\n const filterSet = options.filterLibrary\n ? new Set(\n graph.sortedFiles.filter((f) => {\n const meta = options.nodeMetadata?.get(f);\n return meta?.library === options.filterLibrary;\n }),\n )\n : undefined;\n\n for (const [file, deps] of graph.dependencies) {\n if (filterSet && !filterSet.has(file)) continue;\n const fromId = this.toNodeId(file);\n for (const dep of deps) {\n if (filterSet && !filterSet.has(dep)) continue;\n const toId = this.toNodeId(dep);\n const edgeAttrs: string[] = [];\n\n if (options.highlightCircular && circularFiles.has(file) && circularFiles.has(dep)) {\n edgeAttrs.push('color=\"#FF0000\"');\n edgeAttrs.push('penwidth=2');\n }\n\n lines.push(\n ` ${fromId} -> ${toId}${edgeAttrs.length > 0 ? ` [${edgeAttrs.join(', ')}]` : ''};`,\n );\n }\n }\n\n lines.push('}');\n return lines.join('\\n');\n }\n\n /**\n * Export dependency graph as Mermaid diagram syntax.\n */\n exportMermaid(graph: DependencyGraphResult, options: GraphExportOptions = {}): string {\n const lines: string[] = [];\n lines.push('graph LR');\n\n // Track styled nodes for library coloring\n const styledNodes = new Map<string, string>();\n\n // Add edges (nodes are created implicitly in Mermaid)\n for (const [file, deps] of graph.dependencies) {\n const meta = options.nodeMetadata?.get(file);\n if (options.filterLibrary && meta?.library !== options.filterLibrary) continue;\n\n const fromId = this.toMermaidId(file);\n const fromLabel = this.shortenPath(file);\n\n if (meta?.library) {\n styledNodes.set(fromId, meta.library);\n }\n\n if (deps.length === 0) {\n // Isolated node\n lines.push(` ${fromId}[\"${fromLabel}\"]`);\n }\n\n for (const dep of deps) {\n const depMeta = options.nodeMetadata?.get(dep);\n if (options.filterLibrary && depMeta?.library !== options.filterLibrary) continue;\n\n const toId = this.toMermaidId(dep);\n const toLabel = this.shortenPath(dep);\n\n if (depMeta?.library) {\n styledNodes.set(toId, depMeta.library);\n }\n\n lines.push(` ${fromId}[\"${fromLabel}\"] --> ${toId}[\"${toLabel}\"]`);\n }\n }\n\n // Add files without dependencies or dependents\n for (const file of graph.sortedFiles) {\n const meta = options.nodeMetadata?.get(file);\n if (options.filterLibrary && meta?.library !== options.filterLibrary) continue;\n\n const id = this.toMermaidId(file);\n if (!lines.some((l) => l.includes(id))) {\n lines.push(` ${id}[\"${this.shortenPath(file)}\"]`);\n if (meta?.library) {\n styledNodes.set(id, meta.library);\n }\n }\n }\n\n // Add style classes for library coloring\n if (options.colorByLibrary && styledNodes.size > 0) {\n lines.push('');\n const libraryGroups = new Map<string, string[]>();\n for (const [nodeId, library] of styledNodes) {\n const group = libraryGroups.get(library) ?? [];\n group.push(nodeId);\n libraryGroups.set(library, group);\n }\n\n for (const [library, nodeIds] of libraryGroups) {\n const style = LIBRARY_MERMAID_STYLES[library];\n if (style) {\n for (const nodeId of nodeIds) {\n lines.push(` style ${nodeId} ${style}`);\n }\n }\n }\n }\n\n return lines.join('\\n');\n }\n\n private shortenPath(filePath: string): string {\n const parts = filePath.split('/');\n return parts.slice(-2).join('/');\n }\n\n private toNodeId(filePath: string): string {\n return filePath\n .replace(/[^a-zA-Z0-9]/g, '_')\n .replace(/^_+/, '')\n .replace(/_+$/, '');\n }\n\n private toMermaidId(filePath: string): string {\n return filePath\n .replace(/[^a-zA-Z0-9]/g, '_')\n .replace(/^_+/, 'n_')\n .replace(/_+$/, '');\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","export interface MigrationTemplateStep {\n from: string;\n to: string;\n description: string;\n}\n\nexport interface MigrationPreCheck {\n description: string;\n command?: string;\n}\n\nexport interface MigrationPostStep {\n description: string;\n command?: string;\n}\n\nexport interface PackageChange {\n action: 'install' | 'remove' | 'upgrade';\n package: string;\n version?: string;\n}\n\nexport interface MigrationTemplate {\n name: string;\n description: string;\n category: 'form-migration' | 'framework-upgrade' | 'library-switch' | 'monorepo';\n migrationSteps: MigrationTemplateStep[];\n preChecks: MigrationPreCheck[];\n postSteps: MigrationPostStep[];\n packageChanges: PackageChange[];\n recommendedFlags: string[];\n estimatedEffort: 'trivial' | 'low' | 'moderate' | 'high';\n}\n\nconst BUILT_IN_TEMPLATES: MigrationTemplate[] = [\n {\n name: 'react-hook-form-yup-to-zod',\n description: 'Migrate React Hook Form project from Yup to Zod validation',\n category: 'form-migration',\n migrationSteps: [{ from: 'yup', to: 'zod', description: 'Convert Yup schemas to Zod schemas' }],\n preChecks: [\n { description: 'Ensure @hookform/resolvers is installed' },\n { description: 'Check for .when() conditional validations that need manual review' },\n ],\n postSteps: [\n {\n description: 'Update resolver imports: yupResolver → zodResolver',\n command: undefined,\n },\n {\n description: 'Run tests to verify form validation behavior',\n command: 'npm test',\n },\n {\n description: 'Remove Yup dependency if no longer used',\n command: 'npm uninstall yup',\n },\n ],\n packageChanges: [\n { action: 'install', package: 'zod', version: '^3.24.0' },\n { action: 'upgrade', package: '@hookform/resolvers', version: 'latest' },\n ],\n recommendedFlags: ['--cross-file', '--scaffold-tests', '--verbose'],\n estimatedEffort: 'moderate',\n },\n {\n name: 'trpc-zod-v3-to-v4',\n description: 'Upgrade tRPC project from Zod v3 to Zod v4',\n category: 'framework-upgrade',\n migrationSteps: [\n { from: 'zod-v3', to: 'v4', description: 'Upgrade Zod v3 schemas to v4 syntax' },\n ],\n preChecks: [\n { description: 'Check tRPC version — v11+ required for Zod v4 compatibility' },\n { description: 'Check zod-validation-error version — v5.0.0+ required' },\n { description: 'Run existing test suite to establish baseline', command: 'npm test' },\n ],\n postSteps: [\n {\n description: 'Update tRPC to v11 if not already',\n command: 'npm install @trpc/server@latest @trpc/client@latest',\n },\n {\n description: 'Update zod-validation-error if used',\n command: 'npm install zod-validation-error@^5.0.0',\n },\n { description: 'Review TODO(schemashift) comments for manual fixes' },\n { description: 'Run tests to verify tRPC router behavior', command: 'npm test' },\n ],\n packageChanges: [\n { action: 'upgrade', package: 'zod', version: '^3.25.0' },\n { action: 'upgrade', package: '@trpc/server', version: '^11.0.0' },\n ],\n recommendedFlags: ['--compat-check', '--scaffold-tests', '--verbose'],\n estimatedEffort: 'high',\n },\n {\n name: 'express-joi-to-zod',\n description: 'Migrate Express.js API validators from Joi to Zod',\n category: 'library-switch',\n migrationSteps: [{ from: 'joi', to: 'zod', description: 'Convert Joi schemas to Zod schemas' }],\n preChecks: [\n { description: 'Identify middleware using Joi validation' },\n { description: 'Check for Joi.extend() custom validators that need manual migration' },\n ],\n postSteps: [\n { description: 'Update Express middleware to use Zod schemas' },\n { description: 'Replace celebrate/express-validation with custom Zod middleware' },\n { description: 'Run API integration tests', command: 'npm test' },\n { description: 'Remove Joi dependency', command: 'npm uninstall joi' },\n ],\n packageChanges: [\n { action: 'install', package: 'zod', version: '^3.24.0' },\n { action: 'remove', package: 'celebrate' },\n ],\n recommendedFlags: ['--cross-file', '--verbose'],\n estimatedEffort: 'moderate',\n },\n {\n name: 'nextjs-form-migration',\n description: 'Migrate Next.js form validation from Yup/Formik to Zod/React Hook Form',\n category: 'form-migration',\n migrationSteps: [{ from: 'yup', to: 'zod', description: 'Convert Yup schemas to Zod schemas' }],\n preChecks: [\n { description: 'Identify all Formik form components' },\n { description: 'Check for server-side validation using Yup' },\n { description: 'Run existing tests to establish baseline', command: 'npm test' },\n ],\n postSteps: [\n { description: 'Replace Formik with React Hook Form + zodResolver' },\n { description: 'Update server actions to use Zod for validation' },\n {\n description: 'Install next-safe-action if using server actions',\n command: 'npm install next-safe-action',\n },\n { description: 'Run full test suite', command: 'npm test' },\n ],\n packageChanges: [\n { action: 'install', package: 'zod', version: '^3.24.0' },\n { action: 'install', package: 'react-hook-form', version: '^7.0.0' },\n { action: 'install', package: '@hookform/resolvers', version: 'latest' },\n ],\n recommendedFlags: ['--cross-file', '--scaffold-tests'],\n estimatedEffort: 'high',\n },\n {\n name: 'monorepo-staged-migration',\n description: 'Phased monorepo migration with incremental tracking',\n category: 'monorepo',\n migrationSteps: [\n { from: 'yup', to: 'zod', description: 'Convert shared packages first, then applications' },\n ],\n preChecks: [\n { description: 'Analyze monorepo workspace structure' },\n { description: 'Identify shared schema packages used by multiple apps' },\n { description: 'Ensure all packages build successfully', command: 'npm run build' },\n ],\n postSteps: [\n { description: 'Run incremental migration starting with leaf packages' },\n { description: 'Build all packages after each batch', command: 'npm run build' },\n { description: 'Run full test suite', command: 'npm test' },\n { description: 'Review cross-package type compatibility' },\n ],\n packageChanges: [],\n recommendedFlags: ['--cross-file', '--incremental', '--compat-check', '--audit'],\n estimatedEffort: 'high',\n },\n];\n\n/**\n * Get a migration template by name.\n */\nexport function getMigrationTemplate(name: string): MigrationTemplate | undefined {\n return BUILT_IN_TEMPLATES.find((t) => t.name === name);\n}\n\n/**\n * Get all available migration template names.\n */\nexport function getMigrationTemplateNames(): string[] {\n return BUILT_IN_TEMPLATES.map((t) => t.name);\n}\n\n/**\n * Get all templates for a specific category.\n */\nexport function getMigrationTemplatesByCategory(\n category: MigrationTemplate['category'],\n): MigrationTemplate[] {\n return BUILT_IN_TEMPLATES.filter((t) => t.category === category);\n}\n\n/**\n * Get all built-in migration templates.\n */\nexport function getAllMigrationTemplates(): MigrationTemplate[] {\n return [...BUILT_IN_TEMPLATES];\n}\n\n/**\n * Validate a custom migration template.\n */\nexport function validateMigrationTemplate(template: MigrationTemplate): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n if (!template.name || template.name.trim().length === 0) {\n errors.push('Template name is required');\n }\n\n if (!template.description || template.description.trim().length === 0) {\n errors.push('Template description is required');\n }\n\n if (!template.migrationSteps || template.migrationSteps.length === 0) {\n errors.push('At least one migration step is required');\n }\n\n for (const step of template.migrationSteps ?? []) {\n if (!step.from || !step.to) {\n errors.push(`Migration step must have from and to: ${JSON.stringify(step)}`);\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * Webhook Notification System for SchemaShift\n *\n * Sends migration event notifications to external services\n * (Slack, Teams, Zapier, custom webhooks, etc.)\n */\n\nexport type MigrationEventType =\n | 'migration_started'\n | 'migration_completed'\n | 'migration_failed'\n | 'governance_violation'\n | 'drift_detected';\n\nexport interface MigrationEvent {\n type: MigrationEventType;\n timestamp: string;\n project?: string;\n details: Record<string, unknown>;\n}\n\nexport interface NotificationResult {\n success: boolean;\n statusCode?: number;\n error?: string;\n}\n\nexport interface WebhookConfig {\n url: string;\n events?: MigrationEventType[];\n headers?: Record<string, string>;\n secret?: string;\n}\n\n/**\n * Compute HMAC-SHA256 signature for webhook payload verification.\n */\nasync function computeSignature(payload: string, secret: string): Promise<string> {\n const { createHmac } = await import('node:crypto');\n return createHmac('sha256', secret).update(payload).digest('hex');\n}\n\n/**\n * Send migration event notifications via webhooks.\n */\nexport class WebhookNotifier {\n private webhooks: WebhookConfig[];\n\n constructor(webhooks: WebhookConfig[]) {\n this.webhooks = webhooks;\n }\n\n /**\n * Create a migration event with current timestamp.\n */\n createEvent(\n type: MigrationEventType,\n details: Record<string, unknown>,\n project?: string,\n ): MigrationEvent {\n return {\n type,\n timestamp: new Date().toISOString(),\n project,\n details,\n };\n }\n\n /**\n * Send an event to all matching webhooks.\n */\n async send(event: MigrationEvent): Promise<NotificationResult[]> {\n const results: NotificationResult[] = [];\n\n for (const webhook of this.webhooks) {\n if (webhook.events && !webhook.events.includes(event.type)) {\n continue;\n }\n\n const result = await this.sendToWebhook(webhook, event);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Send event to a single webhook endpoint.\n */\n private async sendToWebhook(\n webhook: WebhookConfig,\n event: MigrationEvent,\n ): Promise<NotificationResult> {\n const payload = JSON.stringify(event);\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'SchemaShift-Webhook/1.0',\n ...webhook.headers,\n };\n\n if (webhook.secret) {\n const signature = await computeSignature(payload, webhook.secret);\n headers['X-SchemaShift-Signature'] = `sha256=${signature}`;\n }\n\n try {\n const response = await fetch(webhook.url, {\n method: 'POST',\n headers,\n body: payload,\n });\n\n return {\n success: response.ok,\n statusCode: response.status,\n error: response.ok ? undefined : `HTTP ${response.status}: ${response.statusText}`,\n };\n } catch (err) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /**\n * Convenience: send a migration_started event.\n */\n async notifyMigrationStarted(\n from: string,\n to: string,\n fileCount: number,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent('migration_started', { from, to, fileCount }, project);\n return this.send(event);\n }\n\n /**\n * Convenience: send a migration_completed event.\n */\n async notifyMigrationCompleted(\n from: string,\n to: string,\n fileCount: number,\n warningCount: number,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent(\n 'migration_completed',\n { from, to, fileCount, warningCount },\n project,\n );\n return this.send(event);\n }\n\n /**\n * Convenience: send a migration_failed event.\n */\n async notifyMigrationFailed(\n from: string,\n to: string,\n error: string,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent('migration_failed', { from, to, error }, project);\n return this.send(event);\n }\n\n /**\n * Convenience: send a governance_violation event.\n */\n async notifyGovernanceViolation(\n violationCount: number,\n rules: string[],\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent('governance_violation', { violationCount, rules }, project);\n return this.send(event);\n }\n\n /**\n * Convenience: send a drift_detected event.\n */\n async notifyDriftDetected(\n modifiedFiles: number,\n addedFiles: number,\n removedFiles: number,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent(\n 'drift_detected',\n { modifiedFiles, addedFiles, removedFiles },\n project,\n );\n return this.send(event);\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 { detectStandardSchema, type StandardSchemaInfo } from './standard-schema.js';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface StandardSchemaAdvisory {\n shouldConsiderAdapter: boolean;\n reason: string;\n adapterExample?: string;\n migrationAdvantages: string[];\n adapterAdvantages: string[];\n recommendation: 'migrate' | 'adapter' | 'either';\n}\n\nconst STANDARD_SCHEMA_LIBS = new Set<string>(['zod', 'valibot', 'arktype']);\n\n/**\n * Advises whether to do a full migration or use Standard Schema adapters.\n *\n * When both source and target libraries support Standard Schema 1.0,\n * users may not need a full migration — they can use adapters instead.\n */\nexport class StandardSchemaAdvisor {\n /**\n * Check if a schema library supports Standard Schema.\n */\n supportsStandardSchema(library: SchemaLibrary | string): boolean {\n return STANDARD_SCHEMA_LIBS.has(library);\n }\n\n /**\n * Generate advisory for a given migration path.\n */\n advise(from: SchemaLibrary | string, to: SchemaLibrary | string): StandardSchemaAdvisory {\n const fromSupports = this.supportsStandardSchema(from);\n const toSupports = this.supportsStandardSchema(to);\n\n if (!fromSupports && !toSupports) {\n return {\n shouldConsiderAdapter: false,\n reason: `Neither ${from} nor ${to} supports Standard Schema. Full migration is recommended.`,\n migrationAdvantages: [\n 'Complete type safety with target library',\n 'Access to target library ecosystem',\n 'No runtime adapter overhead',\n ],\n adapterAdvantages: [],\n recommendation: 'migrate',\n };\n }\n\n if (fromSupports && toSupports) {\n return {\n shouldConsiderAdapter: true,\n reason: `Both ${from} and ${to} support Standard Schema 1.0. You may be able to use adapters for ecosystem tools (tRPC, TanStack Form, etc.) instead of migrating all schemas.`,\n adapterExample: this.generateAdapterExample(from, to),\n migrationAdvantages: [\n 'Full target library API and ergonomics',\n 'Consistent codebase (single library)',\n 'Better IDE support for one library',\n 'Smaller bundle (avoid loading two libraries)',\n ],\n adapterAdvantages: [\n 'No code changes needed for existing schemas',\n 'Gradual migration possible',\n 'Ecosystem tools work with both libraries via Standard Schema',\n 'Lower risk — existing validation behavior preserved',\n ],\n recommendation: 'either',\n };\n }\n\n if (toSupports && !fromSupports) {\n return {\n shouldConsiderAdapter: false,\n reason: `${from} does not support Standard Schema, but ${to} does. Migrating to ${to} gives you Standard Schema interoperability.`,\n migrationAdvantages: [\n 'Standard Schema interoperability with ecosystem tools',\n 'Future-proof validation layer',\n `Access to ${to} API and type inference`,\n ],\n adapterAdvantages: [],\n recommendation: 'migrate',\n };\n }\n\n // fromSupports && !toSupports\n return {\n shouldConsiderAdapter: false,\n reason: `${from} supports Standard Schema but ${to} does not. Consider if you need the specific features of ${to} that justify losing Standard Schema interoperability.`,\n migrationAdvantages: [`Access to ${to}-specific features`],\n adapterAdvantages: [`Keeping ${from} preserves Standard Schema interoperability`],\n recommendation: 'migrate',\n };\n }\n\n /**\n * Analyze a project and provide advisory based on detected libraries.\n */\n adviseFromProject(\n projectPath: string,\n from: SchemaLibrary | string,\n to: SchemaLibrary | string,\n ): StandardSchemaAdvisory & { projectInfo: StandardSchemaInfo } {\n const projectInfo = detectStandardSchema(projectPath);\n const advisory = this.advise(from, to);\n return { ...advisory, projectInfo };\n }\n\n private generateAdapterExample(from: string, to: string): string {\n return [\n `// Instead of migrating all ${from} schemas to ${to},`,\n `// you can use Standard Schema adapters for ecosystem tools:`,\n `//`,\n `// Example with tRPC (v11+):`,\n `// tRPC accepts any Standard Schema-compatible schema.`,\n `// Both ${from} and ${to} schemas work without conversion:`,\n `//`,\n `// import { ${from}Schema } from './existing-${from}-schemas';`,\n `// import { ${to}Schema } from './new-${to}-schemas';`,\n `//`,\n `// const router = t.router({`,\n `// // Works with ${from} schema (Standard Schema compatible)`,\n `// getUser: t.procedure.input(${from}Schema).query(...)`,\n `// // Also works with ${to} schema`,\n `// createUser: t.procedure.input(${to}Schema).mutation(...)`,\n `// });`,\n ].join('\\n');\n }\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_node_fs","import_node_path","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_crypto","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"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/analyzer.ts","../src/detect.ts","../src/approval.ts","../src/constants.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/cross-field-patterns.ts","../src/dead-schema-detector.ts","../src/dependency-graph.ts","../src/detailed-analyzer.ts","../src/drift-detector.ts","../src/form-resolver-migrator.ts","../src/governance.ts","../src/governance-fixer.ts","../src/governance-templates.ts","../src/graph-exporter.ts","../src/import-deduplicator.ts","../src/incremental.ts","../src/migration-templates.ts","../src/notifications.ts","../src/package-updater.ts","../src/performance-analyzer.ts","../src/plugin-loader.ts","../src/schema-verifier.ts","../src/standard-schema.ts","../src/standard-schema-advisor.ts","../src/test-scaffolder.ts","../src/transform.ts","../src/type-dedup-detector.ts"],"sourcesContent":["export { type AnalysisResult, SchemaAnalyzer } from './analyzer.js';\nexport {\n type ApprovalDecision,\n ApprovalManager,\n type ApprovalStatus,\n type ApprovalSummary,\n type MigrationRequest,\n} from './approval.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 AuditEntryMetadata,\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 DurationEstimate,\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 AUDIT_LOG_FILE,\n BACKUP_DIR,\n CONFIG_FILE_NAMES,\n DEFAULT_CONFIG_FILE,\n INCREMENTAL_STATE_FILE,\n PENDING_DIR,\n SCHEMA_SNAPSHOT_FILE,\n SCHEMASHIFT_DIR,\n TESTS_DIR,\n} from './constants.js';\nexport {\n type CrossFieldPattern,\n conditionalValidation,\n dependentFields,\n mutuallyExclusive,\n requireIf,\n requireOneOf,\n suggestCrossFieldPattern,\n} from './cross-field-patterns.js';\nexport {\n DeadSchemaDetector,\n type DeadSchemaResult,\n type UnusedSchema,\n} from './dead-schema-detector.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 DriftDetector,\n type DriftModification,\n type DriftResult,\n type SchemaFileSnapshot,\n type SchemaSnapshot,\n} from './drift-detector.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 FixResult,\n type FixSummary,\n GovernanceFixer,\n} from './governance-fixer.js';\nexport {\n GOVERNANCE_TEMPLATES,\n type GovernanceTemplate,\n getGovernanceTemplate,\n getGovernanceTemplateNames,\n getGovernanceTemplatesByCategory,\n} from './governance-templates.js';\nexport {\n GraphExporter,\n type GraphExportOptions,\n type GraphNode,\n} from './graph-exporter.js';\nexport {\n type DuplicateImport,\n type DuplicateImportGroup,\n type ImportDeduplicationResult,\n ImportDeduplicator,\n} from './import-deduplicator.js';\nexport {\n type IncrementalState,\n IncrementalTracker,\n} from './incremental.js';\nexport {\n getAllMigrationTemplates,\n getMigrationTemplate,\n getMigrationTemplateNames,\n getMigrationTemplatesByCategory,\n type MigrationTemplate,\n type MigrationTemplateStep,\n type PackageChange,\n validateMigrationTemplate,\n} from './migration-templates.js';\nexport {\n type MigrationEvent,\n type MigrationEventType,\n type NotificationResult,\n type WebhookConfig,\n WebhookNotifier,\n type WebhookType,\n} from './notifications.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 {\n createVerificationReport,\n extractSchemaNames,\n formatVerificationReport,\n generateSamples,\n type SchemaVerificationResult,\n type VerificationMismatch,\n type VerificationReport,\n type VerificationSample,\n} from './schema-verifier.js';\nexport { detectStandardSchema, type StandardSchemaInfo } from './standard-schema.js';\nexport { StandardSchemaAdvisor, type StandardSchemaAdvisory } from './standard-schema-advisor.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 arktype: [/^arktype$/],\n superstruct: [/^superstruct$/],\n effect: [/^@effect\\/schema$/],\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","/**\n * Approval Workflow for SchemaShift\n *\n * Provides review gates before executing migrations on shared codebases.\n * Pending migrations are stored in `.schemashift/pending/`.\n */\n\nimport { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { PENDING_DIR, SCHEMASHIFT_DIR } from './constants.js';\n\nexport type ApprovalStatus = 'pending' | 'approved' | 'rejected';\n\nexport interface MigrationRequest {\n id: string;\n from: string;\n to: string;\n files: string[];\n requestedBy: string;\n requestedAt: string;\n status: ApprovalStatus;\n reviewedBy?: string;\n reviewedAt?: string;\n reason?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ApprovalDecision {\n requestId: string;\n status: 'approved' | 'rejected';\n reviewedBy: string;\n reason?: string;\n}\n\nexport interface ApprovalSummary {\n pending: number;\n approved: number;\n rejected: number;\n total: number;\n}\n\n/**\n * Manages migration approval workflows with file-based persistence.\n */\nexport class ApprovalManager {\n private pendingDir: string;\n\n constructor(projectPath: string) {\n this.pendingDir = join(projectPath, SCHEMASHIFT_DIR, PENDING_DIR);\n }\n\n /**\n * Create a new migration request for review.\n */\n createRequest(\n from: string,\n to: string,\n files: string[],\n requestedBy: string,\n metadata?: Record<string, unknown>,\n ): MigrationRequest {\n const id = `mig-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;\n const request: MigrationRequest = {\n id,\n from,\n to,\n files,\n requestedBy,\n requestedAt: new Date().toISOString(),\n status: 'pending',\n metadata,\n };\n\n this.ensureDir();\n const filePath = join(this.pendingDir, `${id}.json`);\n writeFileSync(filePath, JSON.stringify(request, null, 2), 'utf-8');\n\n return request;\n }\n\n /**\n * Review (approve or reject) a pending migration request.\n */\n review(decision: ApprovalDecision): MigrationRequest {\n const request = this.getRequest(decision.requestId);\n if (!request) {\n throw new Error(`Migration request ${decision.requestId} not found`);\n }\n if (request.status !== 'pending') {\n throw new Error(`Migration request ${decision.requestId} is already ${request.status}`);\n }\n\n request.status = decision.status;\n request.reviewedBy = decision.reviewedBy;\n request.reviewedAt = new Date().toISOString();\n request.reason = decision.reason;\n\n const filePath = join(this.pendingDir, `${decision.requestId}.json`);\n writeFileSync(filePath, JSON.stringify(request, null, 2), 'utf-8');\n\n return request;\n }\n\n /**\n * Get a specific migration request by ID.\n */\n getRequest(id: string): MigrationRequest | null {\n const filePath = join(this.pendingDir, `${id}.json`);\n if (!existsSync(filePath)) {\n return null;\n }\n try {\n const content = readFileSync(filePath, 'utf-8');\n const parsed: unknown = JSON.parse(content);\n if (!this.isValidRequest(parsed)) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n /**\n * List all migration requests, optionally filtered by status.\n */\n listRequests(status?: ApprovalStatus): MigrationRequest[] {\n if (!existsSync(this.pendingDir)) {\n return [];\n }\n\n const files = readdirSync(this.pendingDir).filter((f) => f.endsWith('.json'));\n const requests: MigrationRequest[] = [];\n\n for (const file of files) {\n try {\n const content = readFileSync(join(this.pendingDir, file), 'utf-8');\n const parsed: unknown = JSON.parse(content);\n if (!this.isValidRequest(parsed)) continue;\n if (!status || parsed.status === status) {\n requests.push(parsed);\n }\n } catch {\n // Skip corrupted request files\n }\n }\n\n return requests.sort(\n (a, b) => new Date(b.requestedAt).getTime() - new Date(a.requestedAt).getTime(),\n );\n }\n\n /**\n * Get summary counts of all requests.\n */\n getSummary(): ApprovalSummary {\n const all = this.listRequests();\n return {\n pending: all.filter((r) => r.status === 'pending').length,\n approved: all.filter((r) => r.status === 'approved').length,\n rejected: all.filter((r) => r.status === 'rejected').length,\n total: all.length,\n };\n }\n\n /**\n * Check if a migration has been approved.\n */\n isApproved(requestId: string): boolean {\n const request = this.getRequest(requestId);\n return request?.status === 'approved';\n }\n\n private isValidRequest(data: unknown): data is MigrationRequest {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n return (\n typeof obj.id === 'string' &&\n typeof obj.from === 'string' &&\n typeof obj.to === 'string' &&\n Array.isArray(obj.files) &&\n typeof obj.requestedBy === 'string' &&\n typeof obj.status === 'string' &&\n ['pending', 'approved', 'rejected'].includes(obj.status as string)\n );\n }\n\n private ensureDir(): void {\n if (!existsSync(this.pendingDir)) {\n mkdirSync(this.pendingDir, { recursive: true });\n }\n }\n}\n","/**\n * Centralized constants for SchemaShift paths and defaults.\n */\n\n/** Directory for SchemaShift state files (.schemashift/) */\nexport const SCHEMASHIFT_DIR = '.schemashift';\n\n/** Default backup directory name */\nexport const BACKUP_DIR = '.schemashift-backup';\n\n/** Config file search names (cosmiconfig) */\nexport const CONFIG_FILE_NAMES = [\n '.schemashiftrc',\n '.schemashiftrc.json',\n '.schemashiftrc.yaml',\n '.schemashiftrc.yml',\n '.schemashiftrc.js',\n '.schemashiftrc.cjs',\n] as const;\n\n/** Default config file name for init command */\nexport const DEFAULT_CONFIG_FILE = '.schemashiftrc.json';\n\n/** Incremental state file name (inside SCHEMASHIFT_DIR) */\nexport const INCREMENTAL_STATE_FILE = 'incremental.json';\n\n/** Audit log file name (inside SCHEMASHIFT_DIR) */\nexport const AUDIT_LOG_FILE = 'audit-log.json';\n\n/** Schema snapshot file name (inside SCHEMASHIFT_DIR) */\nexport const SCHEMA_SNAPSHOT_FILE = 'schema-snapshot.json';\n\n/** Pending approvals subdirectory (inside SCHEMASHIFT_DIR) */\nexport const PENDING_DIR = 'pending';\n\n/** Test scaffolding output subdirectory (inside SCHEMASHIFT_DIR) */\nexport const TESTS_DIR = 'tests';\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';\nimport { AUDIT_LOG_FILE, SCHEMASHIFT_DIR } from './constants.js';\n\nexport interface AuditEntryMetadata {\n gitCommit?: string;\n gitBranch?: string;\n ciJobId?: string;\n ciProvider?: string;\n hostname?: string;\n nodeVersion?: string;\n schemashiftVersion?: string;\n}\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 metadata?: AuditEntryMetadata;\n}\n\nexport interface AuditLog {\n version: number;\n entries: AuditEntry[];\n}\n\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, SCHEMASHIFT_DIR);\n this.logPath = join(this.logDir, AUDIT_LOG_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 metadata?: AuditEntryMetadata;\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 metadata: params.metadata || this.collectMetadata(),\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 const parsed: unknown = JSON.parse(content);\n if (!this.isValidAuditLog(parsed)) {\n return { version: AUDIT_VERSION, entries: [] };\n }\n return parsed;\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 * Export audit log as JSON string.\n */\n exportJson(): string {\n const log = this.read();\n return JSON.stringify(log, null, 2);\n }\n\n /**\n * Export audit log as CSV string.\n */\n exportCsv(): string {\n const log = this.read();\n const headers = [\n 'timestamp',\n 'migrationId',\n 'filePath',\n 'action',\n 'from',\n 'to',\n 'success',\n 'warningCount',\n 'errorCount',\n 'riskScore',\n 'user',\n 'duration',\n ];\n const rows = log.entries.map((e) =>\n headers\n .map((h) => {\n const val = e[h as keyof AuditEntry];\n if (val === undefined || val === null) return '';\n return String(val).includes(',') ? `\"${String(val)}\"` : String(val);\n })\n .join(','),\n );\n return [headers.join(','), ...rows].join('\\n');\n }\n\n /**\n * Get entries filtered by date range.\n */\n getByDateRange(start: Date, end: Date): AuditEntry[] {\n const log = this.read();\n return log.entries.filter((e) => {\n const ts = new Date(e.timestamp);\n return ts >= start && ts <= end;\n });\n }\n\n /**\n * Clear the audit log.\n */\n clear(): void {\n this.write({ version: AUDIT_VERSION, entries: [] });\n }\n\n /**\n * Export a compliance report in SOC2 or HIPAA format.\n */\n exportComplianceReport(format: 'soc2' | 'hipaa'): string {\n const log = this.read();\n const summary = this.getSummary();\n\n if (format === 'soc2') {\n return this.generateSoc2Report(log, summary);\n }\n return this.generateHipaaReport(log, summary);\n }\n\n private generateSoc2Report(\n log: AuditLog,\n summary: {\n totalMigrations: number;\n totalFiles: number;\n successCount: number;\n failureCount: number;\n migrationPaths: string[];\n },\n ): string {\n const sections: string[] = [];\n const now = new Date().toISOString();\n\n sections.push('# SOC2 Compliance Report — Schema Migration');\n sections.push(`Generated: ${now}`);\n sections.push('');\n sections.push('## Change Control Summary');\n sections.push(`- Total Migrations: ${summary.totalMigrations}`);\n sections.push(`- Total Files Processed: ${summary.totalFiles}`);\n sections.push(`- Successful: ${summary.successCount}`);\n sections.push(`- Failed: ${summary.failureCount}`);\n sections.push(`- Migration Paths: ${summary.migrationPaths.join(', ')}`);\n sections.push('');\n sections.push('## Change Control Entries');\n\n for (const entry of log.entries) {\n sections.push('');\n sections.push(`### ${entry.filePath}`);\n sections.push(`- Change ID: ${entry.migrationId}`);\n sections.push(`- Timestamp: ${entry.timestamp}`);\n sections.push(`- Action: ${entry.action}`);\n sections.push(`- Migration: ${entry.from} → ${entry.to}`);\n sections.push(`- Status: ${entry.success ? 'Success' : 'Failed'}`);\n sections.push(`- Implementer: ${entry.user || 'Unknown'}`);\n sections.push(`- Before Hash: ${entry.beforeHash}`);\n if (entry.afterHash) sections.push(`- After Hash: ${entry.afterHash}`);\n sections.push(`- Warnings: ${entry.warningCount}`);\n sections.push(`- Errors: ${entry.errorCount}`);\n if (entry.riskScore !== undefined) sections.push(`- Risk Score: ${entry.riskScore}`);\n if (entry.metadata?.ciProvider) sections.push(`- CI Provider: ${entry.metadata.ciProvider}`);\n if (entry.metadata?.gitCommit) sections.push(`- Git Commit: ${entry.metadata.gitCommit}`);\n if (entry.metadata?.gitBranch) sections.push(`- Git Branch: ${entry.metadata.gitBranch}`);\n }\n\n sections.push('');\n sections.push('## Rollback Procedure');\n sections.push('SchemaShift maintains automatic backups in `.schemashift/backups/`.');\n sections.push('Use `schemashift rollback [backupId]` to restore files from any backup.');\n sections.push('');\n\n return sections.join('\\n');\n }\n\n private generateHipaaReport(\n log: AuditLog,\n summary: {\n totalMigrations: number;\n totalFiles: number;\n successCount: number;\n failureCount: number;\n migrationPaths: string[];\n },\n ): string {\n const sections: string[] = [];\n const now = new Date().toISOString();\n\n sections.push('# HIPAA Compliance Audit Trail — Schema Migration');\n sections.push(`Generated: ${now}`);\n sections.push('');\n sections.push('## Data Transformation Summary');\n sections.push(`- Total Transformations: ${summary.totalFiles}`);\n sections.push(`- Successful: ${summary.successCount}`);\n sections.push(`- Failed: ${summary.failureCount}`);\n sections.push('');\n sections.push('## Integrity Verification');\n\n for (const entry of log.entries) {\n sections.push('');\n sections.push(`### ${entry.filePath}`);\n sections.push(`- Timestamp: ${entry.timestamp}`);\n sections.push(`- User: ${entry.user || 'Unknown'}`);\n sections.push(`- Action: ${entry.action} (${entry.from} → ${entry.to})`);\n sections.push(`- Integrity Before: SHA256:${entry.beforeHash}`);\n if (entry.afterHash) sections.push(`- Integrity After: SHA256:${entry.afterHash}`);\n sections.push(`- Status: ${entry.success ? 'Completed' : 'Failed'}`);\n if (entry.metadata?.hostname) sections.push(`- Host: ${entry.metadata.hostname}`);\n if (entry.metadata?.nodeVersion)\n sections.push(`- Runtime: Node.js ${entry.metadata.nodeVersion}`);\n }\n\n sections.push('');\n sections.push('## Access Control');\n const users = [...new Set(log.entries.map((e) => e.user).filter(Boolean))];\n sections.push(`- Users Who Performed Migrations: ${users.join(', ') || 'Unknown'}`);\n sections.push('');\n\n return sections.join('\\n');\n }\n\n private collectMetadata(): AuditEntryMetadata {\n return {\n hostname: process.env.HOSTNAME || undefined,\n nodeVersion: process.version,\n ciJobId: process.env.CI_JOB_ID || process.env.GITHUB_RUN_ID || undefined,\n ciProvider: process.env.GITHUB_ACTIONS\n ? 'github'\n : process.env.GITLAB_CI\n ? 'gitlab'\n : process.env.CIRCLECI\n ? 'circleci'\n : process.env.JENKINS_URL\n ? 'jenkins'\n : undefined,\n gitBranch: process.env.GITHUB_REF_NAME || process.env.CI_COMMIT_BRANCH || undefined,\n gitCommit: process.env.GITHUB_SHA || process.env.CI_COMMIT_SHA || undefined,\n };\n }\n\n private isValidAuditLog(data: unknown): data is AuditLog {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n if (typeof obj.version !== 'number') return false;\n if (!Array.isArray(obj.entries)) return false;\n return true;\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\nfunction parseMajorVersion(version: string): number {\n const match = version.match(/(\\d+)/);\n const num = match?.[1] ? Number.parseInt(match[1], 10) : 0;\n if (!Number.isFinite(num) || num < 0 || num > 999) return 0;\n return num;\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 major = parseMajorVersion(version);\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 major = parseMajorVersion(version);\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 // Zod-based HTTP/API clients\n {\n package: 'zodios',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'Zodios uses Zod schemas for API contract definitions. Zod v4 type changes may break contracts.',\n suggestion: 'Upgrade Zodios to a Zod v4-compatible version and verify all API contracts.',\n severity: 'warning',\n upgradeCommand: 'npm install @zodios/core@latest',\n }),\n },\n {\n package: '@zodios/core',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n '@zodios/core uses Zod schemas for API contract definitions. Zod v4 type changes may break contracts.',\n suggestion:\n 'Upgrade @zodios/core to a Zod v4-compatible version and verify all API contracts.',\n severity: 'warning',\n upgradeCommand: 'npm install @zodios/core@latest',\n }),\n },\n {\n package: '@ts-rest/core',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n '@ts-rest/core uses Zod for contract definitions. Zod v4 type incompatibilities may break runtime validation.',\n suggestion: 'Upgrade @ts-rest/core to a version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install @ts-rest/core@latest',\n }),\n },\n {\n package: 'trpc-openapi',\n category: 'openapi',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'trpc-openapi needs a v4-compatible version for Zod v4.',\n suggestion: 'Check for a Zod v4-compatible version of trpc-openapi before upgrading.',\n severity: 'warning',\n upgradeCommand: 'npm install trpc-openapi@latest',\n }),\n },\n\n // Form data and URL state libraries\n {\n package: 'zod-form-data',\n category: 'form',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'zod-form-data relies on Zod v3 internals (_def) which moved to _zod.def in v4.',\n suggestion: 'Upgrade zod-form-data to a Zod v4-compatible version.',\n severity: 'error',\n upgradeCommand: 'npm install zod-form-data@latest',\n }),\n },\n {\n package: '@conform-to/zod',\n category: 'form',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: '@conform-to/zod may have Zod v4 compatibility issues.',\n suggestion: 'Upgrade @conform-to/zod to the latest version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install @conform-to/zod@latest',\n }),\n },\n {\n package: 'nuqs',\n category: 'validation-util',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'nuqs uses Zod for URL state parsing. Zod v4 changes may affect URL parameter validation.',\n suggestion: 'Upgrade nuqs to a version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install nuqs@latest',\n }),\n },\n\n // Server action / routing integrations\n {\n package: 'next-safe-action',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'next-safe-action uses Zod for input validation. Zod v4 type changes may break action definitions.',\n suggestion: 'Upgrade next-safe-action to the latest version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install next-safe-action@latest',\n }),\n },\n {\n package: '@tanstack/router',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n '@tanstack/router uses Zod for route parameter validation. Zod v4 changes may affect type inference.',\n suggestion: 'Upgrade @tanstack/router to a version with Zod v4 support.',\n severity: 'warning',\n upgradeCommand: 'npm install @tanstack/router@latest',\n }),\n },\n {\n package: '@tanstack/react-query',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: '@tanstack/react-query may use Zod for query key/param validation via integrations.',\n suggestion: 'Verify any Zod-based query validation still works after the Zod v4 upgrade.',\n severity: 'info',\n }),\n },\n {\n package: 'fastify-type-provider-zod',\n category: 'api',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue: 'fastify-type-provider-zod needs a Zod v4-compatible version.',\n suggestion: 'Upgrade fastify-type-provider-zod to a version supporting Zod v4.',\n severity: 'warning',\n upgradeCommand: 'npm install fastify-type-provider-zod@latest',\n }),\n },\n {\n package: 'zod-i18n-map',\n category: 'validation-util',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'zod-i18n-map uses Zod v3 error map format. Error messages changed in v4 (e.g., \"Required\" is now descriptive).',\n suggestion:\n 'Check for a Zod v4-compatible version of zod-i18n-map or update custom error maps.',\n severity: 'warning',\n upgradeCommand: 'npm install zod-i18n-map@latest',\n }),\n },\n {\n package: 'openapi-zod-client',\n category: 'openapi',\n migrations: ['zod-v3->v4'],\n check: () => ({\n issue:\n 'openapi-zod-client generates Zod v3 schemas from OpenAPI specs. Generated code may need regeneration.',\n suggestion: 'Upgrade openapi-zod-client and regenerate schemas for Zod v4 compatibility.',\n severity: 'warning',\n upgradeCommand: 'npm install openapi-zod-client@latest',\n }),\n },\n\n // Schema library detection for cross-library migrations\n {\n package: '@effect/schema',\n category: 'validation-util',\n migrations: ['io-ts->zod'],\n check: () => ({\n issue:\n '@effect/schema detected — this is the successor to io-ts/fp-ts. Consider migrating to Effect Schema instead of Zod if you prefer FP patterns.',\n suggestion:\n 'If using fp-ts patterns heavily, consider Effect Schema as the migration target instead of Zod.',\n severity: 'info',\n }),\n },\n {\n package: 'arktype',\n category: 'validation-util',\n migrations: ['zod->valibot', 'zod-v3->v4'],\n check: (_version, migration) => {\n if (migration === 'zod->valibot') {\n return {\n issue:\n 'ArkType detected alongside Zod. Consider ArkType as a migration target — it offers 100x faster validation and Standard Schema support.',\n suggestion:\n 'Consider migrating to ArkType for performance-critical paths, or keep Zod for ecosystem compatibility.',\n severity: 'info',\n };\n }\n return {\n issue:\n 'ArkType detected alongside Zod. ArkType supports Standard Schema, making it interoperable with Zod v4.',\n suggestion: 'No action needed — ArkType and Zod v4 can coexist via Standard Schema.',\n severity: 'info',\n };\n },\n },\n {\n package: 'superstruct',\n category: 'validation-util',\n migrations: ['yup->zod', 'joi->zod'],\n check: () => ({\n issue:\n 'Superstruct detected in the project. Consider migrating Superstruct schemas to Zod as well for a unified validation approach.',\n suggestion: 'Use SchemaShift to migrate Superstruct schemas alongside Yup/Joi schemas.',\n severity: 'info',\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 major = parseMajorVersion(version);\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\nexport interface DurationEstimate {\n label: string;\n rangeMinutes: [number, number];\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 estimateDuration(estimate: ComplexityEstimate): DurationEstimate {\n const EFFORT_RANGES: Record<EffortLevel, { label: string; range: [number, number] }> = {\n trivial: { label: '1–5 minutes', range: [1, 5] },\n low: { label: '5–15 minutes', range: [5, 15] },\n moderate: { label: '15–45 minutes', range: [15, 45] },\n high: { label: '1–3 hours', range: [60, 180] },\n extreme: { label: '3–8 hours', range: [180, 480] },\n };\n\n const base = EFFORT_RANGES[estimate.effort];\n const fileMultiplier = Math.max(1, Math.log2(estimate.totalFiles + 1));\n const low = Math.round(base.range[0] * fileMultiplier);\n const high = Math.round(base.range[1] * fileMultiplier);\n\n if (high >= 120) {\n const lowHours = Math.round((low / 60) * 10) / 10;\n const highHours = Math.round((high / 60) * 10) / 10;\n return { label: `${lowHours}–${highHours} hours`, rangeMinutes: [low, high] };\n }\n\n return { label: `${low}–${high} minutes`, rangeMinutes: [low, high] };\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';\nimport { BACKUP_DIR } from './constants.js';\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: BACKUP_DIR },\n ...result?.config,\n };\n}\n","/**\n * Cross-Field Validation Pattern Helpers\n *\n * Provides reusable patterns for common cross-field validation scenarios.\n * Generates `.superRefine()` code snippets for use during migration.\n */\n\nexport interface CrossFieldPattern {\n name: string;\n description: string;\n zodCode: string;\n}\n\n/**\n * Generate a `.superRefine()` snippet for conditional required fields.\n * When `conditionField` has a truthy value, `requiredField` becomes required.\n */\nexport function requireIf(conditionField: string, requiredField: string): CrossFieldPattern {\n return {\n name: `requireIf(${conditionField}, ${requiredField})`,\n description: `${requiredField} is required when ${conditionField} is truthy`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (data.${conditionField} && !data.${requiredField}) {`,\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: '${requiredField} is required when ${conditionField} is set',`,\n ` path: ['${requiredField}'],`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet requiring at least one of the given fields.\n */\nexport function requireOneOf(fields: string[]): CrossFieldPattern {\n const fieldList = fields.map((f) => `'${f}'`).join(', ');\n const conditions = fields.map((f) => `data.${f}`).join(' || ');\n return {\n name: `requireOneOf(${fields.join(', ')})`,\n description: `At least one of [${fields.join(', ')}] must be provided`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (!(${conditions})) {`,\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: 'At least one of [${fields.join(', ')}] is required',`,\n ` path: [${fieldList}],`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet for mutually exclusive fields.\n * Only one of the given fields can have a value at a time.\n */\nexport function mutuallyExclusive(fields: string[]): CrossFieldPattern {\n const checks = fields.map((f) => `(data.${f} ? 1 : 0)`).join(' + ');\n return {\n name: `mutuallyExclusive(${fields.join(', ')})`,\n description: `Only one of [${fields.join(', ')}] can be set at a time`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` const count = ${checks};`,\n ' if (count > 1) {',\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: 'Only one of [${fields.join(', ')}] can be set at a time',`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet for dependent fields.\n * When `primaryField` is set, all `dependentFields` become required.\n */\nexport function dependentFields(primaryField: string, dependents: string[]): CrossFieldPattern {\n const checks = dependents\n .map(\n (f) =>\n ` if (!data.${f}) {\\n ctx.addIssue({ code: z.ZodIssueCode.custom, message: '${f} is required when ${primaryField} is set', path: ['${f}'] });\\n }`,\n )\n .join('\\n');\n return {\n name: `dependentFields(${primaryField} -> ${dependents.join(', ')})`,\n description: `When ${primaryField} is set, [${dependents.join(', ')}] are required`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (data.${primaryField}) {`,\n checks,\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Generate a `.superRefine()` snippet for conditional validation.\n * When `conditionField` equals `conditionValue`, apply validation on `targetField`.\n */\nexport function conditionalValidation(\n conditionField: string,\n conditionValue: string,\n targetField: string,\n validationMessage: string,\n): CrossFieldPattern {\n return {\n name: `conditionalValidation(${conditionField}=${conditionValue} -> ${targetField})`,\n description: `Validate ${targetField} when ${conditionField} equals ${conditionValue}`,\n zodCode: [\n '.superRefine((data, ctx) => {',\n ` if (data.${conditionField} === ${conditionValue} && !data.${targetField}) {`,\n ' ctx.addIssue({',\n ' code: z.ZodIssueCode.custom,',\n ` message: '${validationMessage}',`,\n ` path: ['${targetField}'],`,\n ' });',\n ' }',\n '})',\n ].join('\\n'),\n };\n}\n\n/**\n * Detect common cross-field patterns in Yup `.when()` calls and suggest Zod equivalents.\n */\nexport function suggestCrossFieldPattern(whenCode: string): CrossFieldPattern | null {\n // Pattern: .when('field', { is: true, then: ... })\n const booleanMatch = whenCode.match(/\\.when\\(['\"](\\w+)['\"]\\s*,\\s*\\{[^}]*is:\\s*true/);\n if (booleanMatch?.[1]) {\n const field = booleanMatch[1];\n return requireIf(field, 'targetField');\n }\n\n // Pattern: .when(['fieldA', 'fieldB'], ...)\n const multiFieldMatch = whenCode.match(/\\.when\\(\\[([^\\]]+)\\]/);\n if (multiFieldMatch?.[1]) {\n const fields = multiFieldMatch[1]\n .split(',')\n .map((f) => f.trim().replace(/['\"]/g, ''))\n .filter(Boolean);\n if (fields.length > 1) {\n return dependentFields(fields[0] ?? 'primary', fields.slice(1));\n }\n }\n\n return null;\n}\n","import type { SourceFile } from 'ts-morph';\n\nexport interface UnusedSchema {\n schemaName: string;\n filePath: string;\n lineNumber: number;\n}\n\nexport interface DeadSchemaResult {\n unusedSchemas: UnusedSchema[];\n totalSchemas: number;\n summary: string;\n}\n\n/**\n * Detects schema definitions that are never referenced elsewhere in the codebase.\n *\n * Scans for variable declarations that use schema library patterns (z., yup., Joi., etc.)\n * and checks if those variables are referenced in other files.\n */\nexport class DeadSchemaDetector {\n detect(sourceFiles: SourceFile[]): DeadSchemaResult {\n const schemas = this.collectSchemaDefinitions(sourceFiles);\n const unusedSchemas = this.findUnusedSchemas(schemas, sourceFiles);\n\n return {\n unusedSchemas,\n totalSchemas: schemas.length,\n summary:\n unusedSchemas.length > 0\n ? `Found ${unusedSchemas.length} unused schema(s) out of ${schemas.length} total that may be safely removed.`\n : `All ${schemas.length} schema(s) are referenced.`,\n };\n }\n\n private collectSchemaDefinitions(sourceFiles: SourceFile[]): UnusedSchema[] {\n const schemas: UnusedSchema[] = [];\n const schemaPattern =\n /(?:const|let|var|export\\s+(?:const|let|var))\\s+(\\w+)\\s*=\\s*(?:z\\.|yup\\.|Yup\\.|Joi\\.|t\\.|v\\.|type\\(|object\\(|string\\(|S\\.)/;\n\n for (const file of sourceFiles) {\n const text = file.getFullText();\n const lines = text.split('\\n');\n const filePath = file.getFilePath();\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line) continue;\n const match = schemaPattern.exec(line);\n if (match?.[1]) {\n schemas.push({\n schemaName: match[1],\n filePath,\n lineNumber: i + 1,\n });\n }\n }\n }\n\n return schemas;\n }\n\n private findUnusedSchemas(schemas: UnusedSchema[], sourceFiles: SourceFile[]): UnusedSchema[] {\n const fileContents = new Map<string, string>();\n for (const file of sourceFiles) {\n fileContents.set(file.getFilePath(), file.getFullText());\n }\n\n const unused: UnusedSchema[] = [];\n\n for (const schema of schemas) {\n const { schemaName, filePath } = schema;\n let referenceCount = 0;\n\n for (const [path, content] of fileContents) {\n const pattern = new RegExp(`\\\\b${schemaName}\\\\b`, 'g');\n const matches = content.match(pattern);\n const matchCount = matches?.length ?? 0;\n\n if (path === filePath) {\n // In the same file, the name appears at least once (the definition).\n // If it appears more than once, it's referenced.\n if (matchCount > 1) {\n referenceCount += matchCount - 1;\n }\n } else {\n referenceCount += matchCount;\n }\n }\n\n // Exported schemas count as \"used\"\n const fileContent = fileContents.get(filePath) ?? '';\n const exportPattern = new RegExp(\n `export\\\\s+(?:const|let|var)\\\\s+${schemaName}\\\\b|export\\\\s*\\\\{[^}]*\\\\b${schemaName}\\\\b`,\n );\n if (exportPattern.test(fileContent)) {\n referenceCount++;\n }\n\n if (referenceCount === 0) {\n unused.push(schema);\n }\n }\n\n return unused;\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 { createHash } from 'node:crypto';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { join, relative } from 'node:path';\nimport { SCHEMA_SNAPSHOT_FILE, SCHEMASHIFT_DIR } from './constants.js';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface SchemaSnapshot {\n version: number;\n timestamp: string;\n projectPath: string;\n schemas: SchemaFileSnapshot[];\n}\n\nexport interface SchemaFileSnapshot {\n filePath: string;\n library: string;\n contentHash: string;\n schemaCount: number;\n schemaNames: string[];\n}\n\nexport interface DriftResult {\n hasDrift: boolean;\n added: SchemaFileSnapshot[];\n removed: SchemaFileSnapshot[];\n modified: DriftModification[];\n unchanged: number;\n totalFiles: number;\n snapshotTimestamp: string;\n}\n\nexport interface DriftModification {\n filePath: string;\n library: string;\n previousHash: string;\n currentHash: string;\n previousSchemaCount: number;\n currentSchemaCount: number;\n addedSchemas: string[];\n removedSchemas: string[];\n}\n\nconst SNAPSHOT_VERSION = 1;\n\nexport class DriftDetector {\n private snapshotDir: string;\n private snapshotPath: string;\n\n constructor(projectPath: string) {\n this.snapshotDir = join(projectPath, SCHEMASHIFT_DIR);\n this.snapshotPath = join(this.snapshotDir, SCHEMA_SNAPSHOT_FILE);\n }\n\n /**\n * Take a snapshot of the current schema state\n */\n snapshot(files: string[], projectPath: string): SchemaSnapshot {\n const schemas: SchemaFileSnapshot[] = [];\n\n for (const filePath of files) {\n if (!existsSync(filePath)) continue;\n\n const content = readFileSync(filePath, 'utf-8');\n const library = this.detectLibraryFromContent(content);\n\n if (library === 'unknown') continue;\n\n const schemaNames = this.extractSchemaNames(content);\n\n schemas.push({\n filePath: relative(projectPath, filePath),\n library,\n contentHash: this.hashContent(content),\n schemaCount: schemaNames.length,\n schemaNames,\n });\n }\n\n const snapshot: SchemaSnapshot = {\n version: SNAPSHOT_VERSION,\n timestamp: new Date().toISOString(),\n projectPath,\n schemas,\n };\n\n return snapshot;\n }\n\n /**\n * Save a snapshot to disk\n */\n saveSnapshot(snapshot: SchemaSnapshot): void {\n if (!existsSync(this.snapshotDir)) {\n mkdirSync(this.snapshotDir, { recursive: true });\n }\n writeFileSync(this.snapshotPath, JSON.stringify(snapshot, null, 2));\n }\n\n /**\n * Load saved snapshot from disk\n */\n loadSnapshot(): SchemaSnapshot | null {\n if (!existsSync(this.snapshotPath)) {\n return null;\n }\n try {\n const content = readFileSync(this.snapshotPath, 'utf-8');\n return JSON.parse(content) as SchemaSnapshot;\n } catch {\n return null;\n }\n }\n\n /**\n * Compare current state against saved snapshot\n */\n detect(currentFiles: string[], projectPath: string): DriftResult {\n const saved = this.loadSnapshot();\n if (!saved) {\n return {\n hasDrift: false,\n added: [],\n removed: [],\n modified: [],\n unchanged: 0,\n totalFiles: 0,\n snapshotTimestamp: '',\n };\n }\n\n const current = this.snapshot(currentFiles, projectPath);\n return this.compareSnapshots(saved, current);\n }\n\n /**\n * Compare two snapshots and return drift results\n */\n compareSnapshots(baseline: SchemaSnapshot, current: SchemaSnapshot): DriftResult {\n const baselineMap = new Map(baseline.schemas.map((s) => [s.filePath, s]));\n const currentMap = new Map(current.schemas.map((s) => [s.filePath, s]));\n\n const added: SchemaFileSnapshot[] = [];\n const removed: SchemaFileSnapshot[] = [];\n const modified: DriftModification[] = [];\n let unchanged = 0;\n\n // Find added and modified files\n for (const [path, currentFile] of currentMap) {\n const baselineFile = baselineMap.get(path);\n if (!baselineFile) {\n added.push(currentFile);\n } else if (currentFile.contentHash !== baselineFile.contentHash) {\n const addedSchemas = currentFile.schemaNames.filter(\n (n) => !baselineFile.schemaNames.includes(n),\n );\n const removedSchemas = baselineFile.schemaNames.filter(\n (n) => !currentFile.schemaNames.includes(n),\n );\n modified.push({\n filePath: path,\n library: currentFile.library,\n previousHash: baselineFile.contentHash,\n currentHash: currentFile.contentHash,\n previousSchemaCount: baselineFile.schemaCount,\n currentSchemaCount: currentFile.schemaCount,\n addedSchemas,\n removedSchemas,\n });\n } else {\n unchanged++;\n }\n }\n\n // Find removed files\n for (const [path, baselineFile] of baselineMap) {\n if (!currentMap.has(path)) {\n removed.push(baselineFile);\n }\n }\n\n return {\n hasDrift: added.length > 0 || removed.length > 0 || modified.length > 0,\n added,\n removed,\n modified,\n unchanged,\n totalFiles: currentMap.size,\n snapshotTimestamp: baseline.timestamp,\n };\n }\n\n private extractSchemaNames(content: string): string[] {\n const names: string[] = [];\n const pattern =\n /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:z\\.|yup\\.|Joi\\.|t\\.|v\\.|type\\(|object\\(|string\\(|S\\.)/g;\n for (const match of content.matchAll(pattern)) {\n if (match[1]) names.push(match[1]);\n }\n return names;\n }\n\n private detectLibraryFromContent(content: string): SchemaLibrary {\n if (/from\\s*['\"]zod['\"]/.test(content) || /\\bz\\./.test(content)) return 'zod';\n if (/from\\s*['\"]yup['\"]/.test(content) || /\\byup\\./.test(content)) return 'yup';\n if (/from\\s*['\"]joi['\"]/.test(content) || /\\bJoi\\./.test(content)) return 'joi';\n if (\n /from\\s*['\"]io-ts['\"]/.test(content) ||\n (/\\bt\\./.test(content) && /from\\s*['\"]io-ts/.test(content))\n )\n return 'io-ts';\n if (\n /from\\s*['\"]valibot['\"]/.test(content) ||\n (/\\bv\\./.test(content) && /from\\s*['\"]valibot/.test(content))\n )\n return 'valibot';\n if (/from\\s*['\"]arktype['\"]/.test(content)) return 'arktype' as SchemaLibrary;\n if (/from\\s*['\"]superstruct['\"]/.test(content)) return 'superstruct' as SchemaLibrary;\n if (/from\\s*['\"]@effect\\/schema['\"]/.test(content)) return 'effect' as SchemaLibrary;\n return 'unknown';\n }\n\n private hashContent(content: string): string {\n return createHash('sha256').update(content).digest('hex').substring(0, 16);\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 const regex = this.safeRegExp(pattern);\n if (regex && !regex.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 safeRegExp(pattern: string): RegExp | null {\n if (pattern.length > 500) return null;\n try {\n return new RegExp(pattern);\n } catch {\n return null;\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 type { GovernanceViolation } from './governance.js';\n\nexport interface FixResult {\n success: boolean;\n fixedCode?: string;\n explanation: string;\n rule: string;\n lineNumber: number;\n}\n\nexport interface FixSummary {\n totalViolations: number;\n fixed: number;\n skipped: number;\n results: FixResult[];\n}\n\n/**\n * GovernanceFixer applies auto-fixes for governance violations.\n * Supports fixing: no-any-schemas, require-descriptions, require-max-length, naming-convention.\n */\nexport class GovernanceFixer {\n private defaultMaxLength = 10000;\n\n /**\n * Set the default max length appended by the require-max-length fix.\n */\n setDefaultMaxLength(length: number): void {\n this.defaultMaxLength = length;\n }\n\n /**\n * Check if a violation is auto-fixable.\n */\n canFix(violation: GovernanceViolation): boolean {\n return [\n 'no-any-schemas',\n 'require-descriptions',\n 'require-max-length',\n 'naming-convention',\n 'no-any',\n 'require-description',\n 'required-validations',\n 'require-safeParse',\n ].includes(violation.rule);\n }\n\n /**\n * Fix a single violation in a source file.\n * Returns the fixed code for the entire file.\n */\n fix(violation: GovernanceViolation, sourceCode: string): FixResult {\n switch (violation.rule) {\n case 'no-any-schemas':\n case 'no-any':\n return this.fixNoAny(violation, sourceCode);\n case 'require-descriptions':\n case 'require-description':\n return this.fixRequireDescription(violation, sourceCode);\n case 'require-max-length':\n case 'required-validations':\n return this.fixRequireMaxLength(violation, sourceCode);\n case 'naming-convention':\n return this.fixNamingConvention(violation, sourceCode);\n case 'require-safeParse':\n return this.fixRequireSafeParse(violation, sourceCode);\n default:\n return {\n success: false,\n explanation: `No auto-fix available for rule: ${violation.rule}`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n }\n\n /**\n * Fix all fixable violations in a source file.\n * Applies fixes from bottom to top to preserve line numbers.\n */\n fixAll(violations: GovernanceViolation[], sourceCode: string): FixSummary {\n const fixable = violations.filter((v) => this.canFix(v));\n const results: FixResult[] = [];\n let currentCode = sourceCode;\n let fixed = 0;\n\n // Sort violations by line number descending to fix from bottom up\n const sorted = [...fixable].sort((a, b) => b.lineNumber - a.lineNumber);\n\n for (const violation of sorted) {\n const result = this.fix(violation, currentCode);\n results.push(result);\n if (result.success && result.fixedCode) {\n currentCode = result.fixedCode;\n fixed++;\n }\n }\n\n return {\n totalViolations: violations.length,\n fixed,\n skipped: violations.length - fixed,\n results,\n };\n }\n\n private fixNoAny(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n let fixedLine = line;\n let explanation = '';\n\n if (/\\bz\\.any\\(\\)/.test(line)) {\n fixedLine = line.replace(/\\bz\\.any\\(\\)/, 'z.unknown()');\n explanation = 'Replaced z.any() with z.unknown() for type safety';\n } else if (/\\byup\\.mixed\\(\\)/.test(line)) {\n fixedLine = line.replace(/\\byup\\.mixed\\(\\)/, 'yup.mixed().required()');\n explanation = 'Added .required() constraint to yup.mixed()';\n } else if (/\\bt\\.any\\b/.test(line)) {\n fixedLine = line.replace(/\\bt\\.any\\b/, 't.unknown');\n explanation = 'Replaced t.any with t.unknown for type safety';\n } else if (/\\bv\\.any\\(\\)/.test(line)) {\n fixedLine = line.replace(/\\bv\\.any\\(\\)/, 'v.unknown()');\n explanation = 'Replaced v.any() with v.unknown() for type safety';\n } else {\n return {\n success: false,\n explanation: 'Could not identify any-type pattern to fix',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n lines[lineIndex] = fixedLine;\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixRequireDescription(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Find the end of the schema statement (look for semicolon)\n let endLineIndex = lineIndex;\n for (let i = lineIndex; i < lines.length && i < lineIndex + 20; i++) {\n if (lines[i]?.includes(';')) {\n endLineIndex = i;\n break;\n }\n }\n\n const endLine = lines[endLineIndex] ?? '';\n const schemaName = violation.schemaName || 'schema';\n const description = `${schemaName} schema`;\n\n // Insert .describe() before the semicolon\n const semicolonIndex = endLine.lastIndexOf(';');\n if (semicolonIndex >= 0) {\n lines[endLineIndex] =\n `${endLine.slice(0, semicolonIndex)}.describe('${description}')${endLine.slice(semicolonIndex)}`;\n } else {\n // No semicolon found, append to the line\n lines[endLineIndex] = `${endLine}.describe('${description}')`;\n }\n\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation: `Added .describe('${description}') to ${schemaName}`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixRequireMaxLength(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Find z.string() on this line or multi-line chain and add .max() after it\n if (/z\\.string\\(\\)/.test(line)) {\n lines[lineIndex] = line.replace(/z\\.string\\(\\)/, `z.string().max(${this.defaultMaxLength})`);\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation: `Added .max(${this.defaultMaxLength}) to string schema`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n return {\n success: false,\n explanation: 'Could not find z.string() pattern to fix on this line',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixNamingConvention(violation: GovernanceViolation, sourceCode: string): FixResult {\n const schemaName = violation.schemaName;\n if (!schemaName) {\n return {\n success: false,\n explanation: 'No schema name available for renaming',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Default: append \"Schema\" suffix\n const newName = schemaName.endsWith('Schema') ? schemaName : `${schemaName}Schema`;\n if (newName === schemaName) {\n return {\n success: false,\n explanation: 'Schema already matches naming convention',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n // Replace all references in the file\n const fixedCode = sourceCode.replace(new RegExp(`\\\\b${schemaName}\\\\b`, 'g'), newName);\n\n return {\n success: true,\n fixedCode,\n explanation: `Renamed \"${schemaName}\" to \"${newName}\"`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n private fixRequireSafeParse(violation: GovernanceViolation, sourceCode: string): FixResult {\n const lines = sourceCode.split('\\n');\n const lineIndex = violation.lineNumber - 1;\n const line = lines[lineIndex];\n if (!line) {\n return {\n success: false,\n explanation: `Line ${violation.lineNumber} not found`,\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n if (line.includes('.parse(') && !line.includes('.safeParse(')) {\n lines[lineIndex] = line.replace('.parse(', '.safeParse(');\n return {\n success: true,\n fixedCode: lines.join('\\n'),\n explanation: 'Replaced .parse() with .safeParse() for safer error handling',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n\n return {\n success: false,\n explanation: 'Could not find .parse() pattern to fix',\n rule: violation.rule,\n lineNumber: violation.lineNumber,\n };\n }\n}\n","import type { GovernanceRuleFunction, GovernanceViolation } from './governance.js';\n\n/**\n * Governance Rule Templates\n *\n * Pre-built governance rules for common enterprise policies.\n * These can be registered into the GovernanceEngine for quick setup.\n *\n * Template categories:\n * - Security: Prevent unsafe patterns (XSS, injection, DoS)\n * - Quality: Enforce code quality standards\n * - Compliance: Support SOX, HIPAA, GDPR requirements\n * - Performance: Prevent known performance pitfalls\n */\n\nexport interface GovernanceTemplate {\n name: string;\n description: string;\n category: 'security' | 'quality' | 'compliance' | 'performance';\n rule: GovernanceRuleFunction;\n}\n\n/**\n * All available governance rule templates\n */\nexport const GOVERNANCE_TEMPLATES: GovernanceTemplate[] = [\n {\n name: 'no-any-schemas',\n description:\n 'Disallow z.any(), yup.mixed() without constraints, and similar unrestricted types',\n category: 'security',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n const anyPatterns = [\n /\\bz\\.any\\(\\)/,\n /\\byup\\.mixed\\(\\)/,\n /\\bt\\.any\\b/,\n /\\bv\\.any\\(\\)/,\n /\\bunknown\\(\\)/,\n ];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n for (const pattern of anyPatterns) {\n if (pattern.test(line)) {\n violations.push({\n rule: 'no-any-schemas',\n message:\n 'Unrestricted type (any/mixed/unknown) found. Use a specific type with constraints.',\n filePath,\n lineNumber: i + 1,\n schemaName: '',\n severity: 'error',\n fixable: false,\n });\n }\n }\n }\n\n return violations;\n },\n },\n {\n name: 'require-descriptions',\n description: 'All exported schemas must have .describe() for documentation',\n category: 'quality',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n // Find exported schema definitions without .describe()\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n if (/export\\s+(const|let)\\s+\\w+.*=\\s*(z\\.|yup\\.)/.test(line)) {\n // Check if .describe() appears in the same statement\n let fullStatement = line;\n let j = i + 1;\n while (j < lines.length && !lines[j]?.includes(';') && j < i + 10) {\n fullStatement += lines[j] ?? '';\n j++;\n }\n if (j < lines.length) fullStatement += lines[j] ?? '';\n\n if (!fullStatement.includes('.describe(')) {\n const nameMatch = line.match(/(?:const|let)\\s+(\\w+)/);\n violations.push({\n rule: 'require-descriptions',\n message: `Exported schema ${nameMatch?.[1] || 'unknown'} should include .describe() for documentation.`,\n filePath,\n lineNumber: i + 1,\n schemaName: nameMatch?.[1] || '',\n severity: 'warning',\n fixable: true,\n });\n }\n }\n }\n\n return violations;\n },\n },\n {\n name: 'max-nesting-depth',\n description: 'Limit schema nesting depth to prevent TypeScript performance issues',\n category: 'performance',\n rule: (sourceFile, config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const maxDepth = (config.threshold as number) || 5;\n\n // Count max nesting by tracking parentheses/braces depth\n const lines = text.split('\\n');\n let currentDepth = 0;\n let maxFoundDepth = 0;\n let deepestLine = 0;\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n for (const char of line) {\n if (char === '(' || char === '{' || char === '[') {\n currentDepth++;\n if (currentDepth > maxFoundDepth) {\n maxFoundDepth = currentDepth;\n deepestLine = i + 1;\n }\n }\n if (char === ')' || char === '}' || char === ']') {\n currentDepth = Math.max(0, currentDepth - 1);\n }\n }\n }\n\n if (maxFoundDepth > maxDepth) {\n violations.push({\n rule: 'max-nesting-depth',\n message: `Schema nesting depth ${maxFoundDepth} exceeds maximum of ${maxDepth}. Consider breaking into smaller schemas.`,\n filePath,\n lineNumber: deepestLine,\n schemaName: '',\n severity: 'warning',\n fixable: false,\n });\n }\n\n return violations;\n },\n },\n {\n name: 'no-deprecated-methods',\n description: 'Flag usage of deprecated schema methods',\n category: 'quality',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n const deprecatedPatterns: Array<{ pattern: RegExp; message: string }> = [\n {\n pattern: /\\.deepPartial\\(\\)/,\n message: '.deepPartial() is removed in Zod v4. Use recursive .partial() instead.',\n },\n {\n pattern: /\\.strip\\(\\)/,\n message: '.strip() is deprecated. Use z.strictObject() or explicit stripping.',\n },\n {\n pattern: /z\\.promise\\(/,\n message: 'z.promise() is deprecated in Zod v4. Use native Promise types.',\n },\n {\n pattern: /z\\.ostring\\(\\)/,\n message: 'z.ostring() is removed in Zod v4. Use z.string().optional().',\n },\n {\n pattern: /z\\.onumber\\(\\)/,\n message: 'z.onumber() is removed in Zod v4. Use z.number().optional().',\n },\n {\n pattern: /z\\.oboolean\\(\\)/,\n message: 'z.oboolean() is removed in Zod v4. Use z.boolean().optional().',\n },\n {\n pattern: /z\\.preprocess\\(/,\n message: 'z.preprocess() is removed in Zod v4. Use z.coerce.* instead.',\n },\n ];\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n for (const { pattern, message } of deprecatedPatterns) {\n if (pattern.test(line)) {\n violations.push({\n rule: 'no-deprecated-methods',\n message,\n filePath,\n lineNumber: i + 1,\n schemaName: '',\n severity: 'warning',\n fixable: false,\n });\n }\n }\n }\n\n return violations;\n },\n },\n {\n name: 'naming-convention',\n description: 'Enforce schema naming pattern (e.g., must end with Schema)',\n category: 'quality',\n rule: (sourceFile, config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n const pattern = new RegExp((config.pattern as string) || '.*Schema$');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // Match const/let assignments that look like schema definitions\n const match = line.match(\n /(?:const|let)\\s+(\\w+)\\s*=\\s*(?:z\\.|yup\\.|Joi\\.|t\\.|v\\.|type\\(|object\\(|string\\()/,\n );\n if (match?.[1] && !pattern.test(match[1])) {\n violations.push({\n rule: 'naming-convention',\n message: `Schema \"${match[1]}\" does not match naming pattern ${pattern.source}.`,\n filePath,\n lineNumber: i + 1,\n schemaName: match[1],\n severity: 'warning',\n fixable: false,\n });\n }\n }\n\n return violations;\n },\n },\n {\n name: 'require-max-length',\n description: 'String schemas must have .max() to prevent DoS via unbounded input',\n category: 'security',\n rule: (sourceFile, _config) => {\n const violations: GovernanceViolation[] = [];\n const text = sourceFile.getFullText();\n const filePath = sourceFile.getFilePath();\n const lines = text.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // Check for z.string() without .max()\n if (/z\\.string\\(\\)/.test(line) && !line.includes('.max(') && !line.includes('.length(')) {\n // Also check next few lines for multi-line chains\n let fullChain = line;\n let j = i + 1;\n while (j < lines.length && j < i + 5 && /^\\s*\\./.test(lines[j] ?? '')) {\n fullChain += lines[j] ?? '';\n j++;\n }\n\n if (!fullChain.includes('.max(') && !fullChain.includes('.length(')) {\n violations.push({\n rule: 'require-max-length',\n message:\n 'String schema should have .max() to prevent unbounded input (DoS protection).',\n filePath,\n lineNumber: i + 1,\n schemaName: '',\n severity: 'warning',\n fixable: true,\n });\n }\n }\n }\n\n return violations;\n },\n },\n];\n\n/**\n * Get a governance template by name\n */\nexport function getGovernanceTemplate(name: string): GovernanceTemplate | undefined {\n return GOVERNANCE_TEMPLATES.find((t) => t.name === name);\n}\n\n/**\n * Get all templates for a category\n */\nexport function getGovernanceTemplatesByCategory(\n category: GovernanceTemplate['category'],\n): GovernanceTemplate[] {\n return GOVERNANCE_TEMPLATES.filter((t) => t.category === category);\n}\n\n/**\n * Get all available template names\n */\nexport function getGovernanceTemplateNames(): string[] {\n return GOVERNANCE_TEMPLATES.map((t) => t.name);\n}\n","import type { DependencyGraphResult } from './dependency-graph.js';\n\nexport interface GraphNode {\n filePath: string;\n shortPath: string;\n schemaLibrary?: string;\n schemaCount: number;\n}\n\nexport interface GraphExportOptions {\n /** Color-code nodes by schema library */\n colorByLibrary?: boolean;\n /** Highlight circular dependencies in red */\n highlightCircular?: boolean;\n /** Only show files using a specific library */\n filterLibrary?: string;\n /** File metadata for enriched graph display */\n nodeMetadata?: Map<string, { library?: string; schemaCount?: number }>;\n}\n\nconst LIBRARY_COLORS: Record<string, string> = {\n zod: '#3068B7',\n yup: '#32CD32',\n joi: '#FF6347',\n 'io-ts': '#9370DB',\n valibot: '#FF8C00',\n arktype: '#20B2AA',\n superstruct: '#DAA520',\n effect: '#6A5ACD',\n};\n\nconst LIBRARY_MERMAID_STYLES: Record<string, string> = {\n zod: 'fill:#3068B7,color:#fff',\n yup: 'fill:#32CD32,color:#000',\n joi: 'fill:#FF6347,color:#fff',\n 'io-ts': 'fill:#9370DB,color:#fff',\n valibot: 'fill:#FF8C00,color:#000',\n arktype: 'fill:#20B2AA,color:#fff',\n superstruct: 'fill:#DAA520,color:#000',\n effect: 'fill:#6A5ACD,color:#fff',\n};\n\n/**\n * Exports dependency graphs in DOT (Graphviz) and Mermaid formats.\n */\nexport class GraphExporter {\n /**\n * Export dependency graph as DOT format for Graphviz.\n */\n exportDot(graph: DependencyGraphResult, options: GraphExportOptions = {}): string {\n const lines: string[] = [];\n lines.push('digraph SchemaShiftDependencies {');\n lines.push(' rankdir=LR;');\n lines.push(' node [shape=box, style=filled, fontname=\"monospace\"];');\n lines.push(' edge [color=\"#666666\"];');\n lines.push('');\n\n // Collect circular dependency files for highlighting\n const circularFiles = new Set<string>();\n if (options.highlightCircular && graph.circularWarnings.length > 0) {\n for (const warning of graph.circularWarnings) {\n const match = warning.match(/Circular dependency: (.+)/);\n if (match?.[1]) {\n for (const part of match[1].split(' -> ')) {\n // Find full path matching short path\n for (const file of graph.sortedFiles) {\n if (file.endsWith(part.trim()) || this.shortenPath(file) === part.trim()) {\n circularFiles.add(file);\n }\n }\n }\n }\n }\n }\n\n // Add nodes\n for (const filePath of graph.sortedFiles) {\n const meta = options.nodeMetadata?.get(filePath);\n const library = meta?.library;\n\n if (options.filterLibrary && library !== options.filterLibrary) continue;\n\n const shortPath = this.shortenPath(filePath);\n const nodeId = this.toNodeId(filePath);\n const attrs: string[] = [];\n\n attrs.push(`label=\"${shortPath}\"`);\n\n if (circularFiles.has(filePath)) {\n attrs.push('color=\"#FF0000\"');\n attrs.push('penwidth=2');\n }\n\n if (options.colorByLibrary && library && LIBRARY_COLORS[library]) {\n attrs.push(`fillcolor=\"${LIBRARY_COLORS[library]}\"`);\n attrs.push('fontcolor=\"white\"');\n } else {\n attrs.push('fillcolor=\"#E8E8E8\"');\n }\n\n if (meta?.schemaCount) {\n attrs.push(`tooltip=\"${meta.schemaCount} schema(s)\"`);\n }\n\n lines.push(` ${nodeId} [${attrs.join(', ')}];`);\n }\n\n lines.push('');\n\n // Add edges\n const filterSet = options.filterLibrary\n ? new Set(\n graph.sortedFiles.filter((f) => {\n const meta = options.nodeMetadata?.get(f);\n return meta?.library === options.filterLibrary;\n }),\n )\n : undefined;\n\n for (const [file, deps] of graph.dependencies) {\n if (filterSet && !filterSet.has(file)) continue;\n const fromId = this.toNodeId(file);\n for (const dep of deps) {\n if (filterSet && !filterSet.has(dep)) continue;\n const toId = this.toNodeId(dep);\n const edgeAttrs: string[] = [];\n\n if (options.highlightCircular && circularFiles.has(file) && circularFiles.has(dep)) {\n edgeAttrs.push('color=\"#FF0000\"');\n edgeAttrs.push('penwidth=2');\n }\n\n lines.push(\n ` ${fromId} -> ${toId}${edgeAttrs.length > 0 ? ` [${edgeAttrs.join(', ')}]` : ''};`,\n );\n }\n }\n\n lines.push('}');\n return lines.join('\\n');\n }\n\n /**\n * Export dependency graph as Mermaid diagram syntax.\n */\n exportMermaid(graph: DependencyGraphResult, options: GraphExportOptions = {}): string {\n const lines: string[] = [];\n lines.push('graph LR');\n\n // Track styled nodes for library coloring\n const styledNodes = new Map<string, string>();\n\n // Add edges (nodes are created implicitly in Mermaid)\n for (const [file, deps] of graph.dependencies) {\n const meta = options.nodeMetadata?.get(file);\n if (options.filterLibrary && meta?.library !== options.filterLibrary) continue;\n\n const fromId = this.toMermaidId(file);\n const fromLabel = this.shortenPath(file);\n\n if (meta?.library) {\n styledNodes.set(fromId, meta.library);\n }\n\n if (deps.length === 0) {\n // Isolated node\n lines.push(` ${fromId}[\"${fromLabel}\"]`);\n }\n\n for (const dep of deps) {\n const depMeta = options.nodeMetadata?.get(dep);\n if (options.filterLibrary && depMeta?.library !== options.filterLibrary) continue;\n\n const toId = this.toMermaidId(dep);\n const toLabel = this.shortenPath(dep);\n\n if (depMeta?.library) {\n styledNodes.set(toId, depMeta.library);\n }\n\n lines.push(` ${fromId}[\"${fromLabel}\"] --> ${toId}[\"${toLabel}\"]`);\n }\n }\n\n // Add files without dependencies or dependents\n for (const file of graph.sortedFiles) {\n const meta = options.nodeMetadata?.get(file);\n if (options.filterLibrary && meta?.library !== options.filterLibrary) continue;\n\n const id = this.toMermaidId(file);\n if (!lines.some((l) => l.includes(id))) {\n lines.push(` ${id}[\"${this.shortenPath(file)}\"]`);\n if (meta?.library) {\n styledNodes.set(id, meta.library);\n }\n }\n }\n\n // Add style classes for library coloring\n if (options.colorByLibrary && styledNodes.size > 0) {\n lines.push('');\n const libraryGroups = new Map<string, string[]>();\n for (const [nodeId, library] of styledNodes) {\n const group = libraryGroups.get(library) ?? [];\n group.push(nodeId);\n libraryGroups.set(library, group);\n }\n\n for (const [library, nodeIds] of libraryGroups) {\n const style = LIBRARY_MERMAID_STYLES[library];\n if (style) {\n for (const nodeId of nodeIds) {\n lines.push(` style ${nodeId} ${style}`);\n }\n }\n }\n }\n\n return lines.join('\\n');\n }\n\n private shortenPath(filePath: string): string {\n const parts = filePath.split('/');\n return parts.slice(-2).join('/');\n }\n\n private toNodeId(filePath: string): string {\n return filePath\n .replace(/[^a-zA-Z0-9]/g, '_')\n .replace(/^_+/, '')\n .replace(/_+$/, '');\n }\n\n private toMermaidId(filePath: string): string {\n return filePath\n .replace(/[^a-zA-Z0-9]/g, '_')\n .replace(/^_+/, 'n_')\n .replace(/_+$/, '');\n }\n}\n","import type { SourceFile } from 'ts-morph';\n\nexport interface DuplicateImport {\n source: string;\n filePath: string;\n lineNumber: number;\n importedNames: string[];\n}\n\nexport interface DuplicateImportGroup {\n source: string;\n occurrences: DuplicateImport[];\n suggestion: string;\n}\n\nexport interface ImportDeduplicationResult {\n duplicateGroups: DuplicateImportGroup[];\n totalDuplicates: number;\n summary: string;\n}\n\n/**\n * Detects duplicate import declarations within individual files.\n *\n * After migration, files may end up with multiple import statements from the\n * same module (e.g., two `import { ... } from 'zod'` lines). This detector\n * identifies those cases and suggests merging them.\n */\nexport class ImportDeduplicator {\n detect(sourceFiles: SourceFile[]): ImportDeduplicationResult {\n const allGroups: DuplicateImportGroup[] = [];\n\n for (const file of sourceFiles) {\n const groups = this.findDuplicatesInFile(file);\n allGroups.push(...groups);\n }\n\n const totalDuplicates = allGroups.reduce((sum, g) => sum + g.occurrences.length, 0);\n\n return {\n duplicateGroups: allGroups,\n totalDuplicates,\n summary:\n allGroups.length > 0\n ? `Found ${allGroups.length} duplicate import group(s) across ${new Set(allGroups.map((g) => g.occurrences[0]?.filePath)).size} file(s). Merge them for cleaner imports.`\n : 'No duplicate imports found.',\n };\n }\n\n private findDuplicatesInFile(sourceFile: SourceFile): DuplicateImportGroup[] {\n const imports = sourceFile.getImportDeclarations();\n const filePath = sourceFile.getFilePath();\n\n // Group imports by module specifier\n const bySource = new Map<string, DuplicateImport[]>();\n\n for (const imp of imports) {\n const source = imp.getModuleSpecifierValue();\n const namedImports = imp.getNamedImports().map((n) => n.getName());\n const namespaceImport = imp.getNamespaceImport()?.getText();\n const defaultImport = imp.getDefaultImport()?.getText();\n\n const importedNames: string[] = [];\n if (defaultImport) importedNames.push(defaultImport);\n if (namespaceImport) importedNames.push(`* as ${namespaceImport}`);\n importedNames.push(...namedImports);\n\n if (importedNames.length === 0) continue;\n\n const entry: DuplicateImport = {\n source,\n filePath,\n lineNumber: imp.getStartLineNumber(),\n importedNames,\n };\n\n const existing = bySource.get(source);\n if (existing) {\n existing.push(entry);\n } else {\n bySource.set(source, [entry]);\n }\n }\n\n // Only return groups with more than one import from the same source\n const groups: DuplicateImportGroup[] = [];\n for (const [source, occurrences] of bySource) {\n if (occurrences.length <= 1) continue;\n\n const allNames = new Set<string>();\n for (const occ of occurrences) {\n for (const name of occ.importedNames) {\n allNames.add(name);\n }\n }\n\n const mergedNames = [...allNames].sort().join(', ');\n groups.push({\n source,\n occurrences,\n suggestion: `Merge into single import: import { ${mergedNames} } from '${source}';`,\n });\n }\n\n return groups;\n }\n}\n","import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { INCREMENTAL_STATE_FILE, SCHEMASHIFT_DIR } from './constants.js';\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\nexport class IncrementalTracker {\n private stateDir: string;\n private statePath: string;\n\n constructor(projectPath: string) {\n this.stateDir = join(projectPath, SCHEMASHIFT_DIR);\n this.statePath = join(this.stateDir, INCREMENTAL_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 const parsed: unknown = JSON.parse(readFileSync(this.statePath, 'utf-8'));\n if (!this.isValidState(parsed)) return null;\n return parsed;\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 /**\n * Get a canary batch — a percentage of remaining files, sorted simplest first.\n * Used for phased rollouts where you migrate a small batch, verify, then continue.\n */\n getCanaryBatch(percent: number, fileSizes?: Map<string, number>): string[] {\n const state = this.getState();\n if (!state) return [];\n\n const count = Math.max(1, Math.ceil(state.remainingFiles.length * (percent / 100)));\n\n if (fileSizes) {\n const sorted = [...state.remainingFiles].sort((a, b) => {\n return (fileSizes.get(a) ?? 0) - (fileSizes.get(b) ?? 0);\n });\n return sorted.slice(0, count);\n }\n\n return state.remainingFiles.slice(0, count);\n }\n\n clear(): void {\n if (existsSync(this.statePath)) {\n unlinkSync(this.statePath);\n }\n }\n\n private isValidState(data: unknown): data is IncrementalState {\n if (typeof data !== 'object' || data === null) return false;\n const obj = data as Record<string, unknown>;\n return (\n typeof obj.migrationId === 'string' &&\n typeof obj.from === 'string' &&\n typeof obj.to === 'string' &&\n typeof obj.startedAt === 'string' &&\n Array.isArray(obj.completedFiles) &&\n Array.isArray(obj.remainingFiles) &&\n Array.isArray(obj.failedFiles)\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","export interface MigrationTemplateStep {\n from: string;\n to: string;\n description: string;\n}\n\nexport interface MigrationPreCheck {\n description: string;\n command?: string;\n}\n\nexport interface MigrationPostStep {\n description: string;\n command?: string;\n}\n\nexport interface PackageChange {\n action: 'install' | 'remove' | 'upgrade';\n package: string;\n version?: string;\n}\n\nexport interface MigrationTemplate {\n name: string;\n description: string;\n category: 'form-migration' | 'framework-upgrade' | 'library-switch' | 'monorepo';\n migrationSteps: MigrationTemplateStep[];\n preChecks: MigrationPreCheck[];\n postSteps: MigrationPostStep[];\n packageChanges: PackageChange[];\n recommendedFlags: string[];\n estimatedEffort: 'trivial' | 'low' | 'moderate' | 'high';\n}\n\nconst BUILT_IN_TEMPLATES: MigrationTemplate[] = [\n {\n name: 'react-hook-form-yup-to-zod',\n description: 'Migrate React Hook Form project from Yup to Zod validation',\n category: 'form-migration',\n migrationSteps: [{ from: 'yup', to: 'zod', description: 'Convert Yup schemas to Zod schemas' }],\n preChecks: [\n { description: 'Ensure @hookform/resolvers is installed' },\n { description: 'Check for .when() conditional validations that need manual review' },\n ],\n postSteps: [\n {\n description: 'Update resolver imports: yupResolver → zodResolver',\n command: undefined,\n },\n {\n description: 'Run tests to verify form validation behavior',\n command: 'npm test',\n },\n {\n description: 'Remove Yup dependency if no longer used',\n command: 'npm uninstall yup',\n },\n ],\n packageChanges: [\n { action: 'install', package: 'zod', version: '^3.24.0' },\n { action: 'upgrade', package: '@hookform/resolvers', version: 'latest' },\n ],\n recommendedFlags: ['--cross-file', '--scaffold-tests', '--verbose'],\n estimatedEffort: 'moderate',\n },\n {\n name: 'trpc-zod-v3-to-v4',\n description: 'Upgrade tRPC project from Zod v3 to Zod v4',\n category: 'framework-upgrade',\n migrationSteps: [\n { from: 'zod-v3', to: 'v4', description: 'Upgrade Zod v3 schemas to v4 syntax' },\n ],\n preChecks: [\n { description: 'Check tRPC version — v11+ required for Zod v4 compatibility' },\n { description: 'Check zod-validation-error version — v5.0.0+ required' },\n { description: 'Run existing test suite to establish baseline', command: 'npm test' },\n ],\n postSteps: [\n {\n description: 'Update tRPC to v11 if not already',\n command: 'npm install @trpc/server@latest @trpc/client@latest',\n },\n {\n description: 'Update zod-validation-error if used',\n command: 'npm install zod-validation-error@^5.0.0',\n },\n { description: 'Review TODO(schemashift) comments for manual fixes' },\n { description: 'Run tests to verify tRPC router behavior', command: 'npm test' },\n ],\n packageChanges: [\n { action: 'upgrade', package: 'zod', version: '^3.25.0' },\n { action: 'upgrade', package: '@trpc/server', version: '^11.0.0' },\n ],\n recommendedFlags: ['--compat-check', '--scaffold-tests', '--verbose'],\n estimatedEffort: 'high',\n },\n {\n name: 'express-joi-to-zod',\n description: 'Migrate Express.js API validators from Joi to Zod',\n category: 'library-switch',\n migrationSteps: [{ from: 'joi', to: 'zod', description: 'Convert Joi schemas to Zod schemas' }],\n preChecks: [\n { description: 'Identify middleware using Joi validation' },\n { description: 'Check for Joi.extend() custom validators that need manual migration' },\n ],\n postSteps: [\n { description: 'Update Express middleware to use Zod schemas' },\n { description: 'Replace celebrate/express-validation with custom Zod middleware' },\n { description: 'Run API integration tests', command: 'npm test' },\n { description: 'Remove Joi dependency', command: 'npm uninstall joi' },\n ],\n packageChanges: [\n { action: 'install', package: 'zod', version: '^3.24.0' },\n { action: 'remove', package: 'celebrate' },\n ],\n recommendedFlags: ['--cross-file', '--verbose'],\n estimatedEffort: 'moderate',\n },\n {\n name: 'nextjs-form-migration',\n description: 'Migrate Next.js form validation from Yup/Formik to Zod/React Hook Form',\n category: 'form-migration',\n migrationSteps: [{ from: 'yup', to: 'zod', description: 'Convert Yup schemas to Zod schemas' }],\n preChecks: [\n { description: 'Identify all Formik form components' },\n { description: 'Check for server-side validation using Yup' },\n { description: 'Run existing tests to establish baseline', command: 'npm test' },\n ],\n postSteps: [\n { description: 'Replace Formik with React Hook Form + zodResolver' },\n { description: 'Update server actions to use Zod for validation' },\n {\n description: 'Install next-safe-action if using server actions',\n command: 'npm install next-safe-action',\n },\n { description: 'Run full test suite', command: 'npm test' },\n ],\n packageChanges: [\n { action: 'install', package: 'zod', version: '^3.24.0' },\n { action: 'install', package: 'react-hook-form', version: '^7.0.0' },\n { action: 'install', package: '@hookform/resolvers', version: 'latest' },\n ],\n recommendedFlags: ['--cross-file', '--scaffold-tests'],\n estimatedEffort: 'high',\n },\n {\n name: 'monorepo-staged-migration',\n description: 'Phased monorepo migration with incremental tracking',\n category: 'monorepo',\n migrationSteps: [\n { from: 'yup', to: 'zod', description: 'Convert shared packages first, then applications' },\n ],\n preChecks: [\n { description: 'Analyze monorepo workspace structure' },\n { description: 'Identify shared schema packages used by multiple apps' },\n { description: 'Ensure all packages build successfully', command: 'npm run build' },\n ],\n postSteps: [\n { description: 'Run incremental migration starting with leaf packages' },\n { description: 'Build all packages after each batch', command: 'npm run build' },\n { description: 'Run full test suite', command: 'npm test' },\n { description: 'Review cross-package type compatibility' },\n ],\n packageChanges: [],\n recommendedFlags: ['--cross-file', '--incremental', '--compat-check', '--audit'],\n estimatedEffort: 'high',\n },\n];\n\n/**\n * Get a migration template by name.\n */\nexport function getMigrationTemplate(name: string): MigrationTemplate | undefined {\n return BUILT_IN_TEMPLATES.find((t) => t.name === name);\n}\n\n/**\n * Get all available migration template names.\n */\nexport function getMigrationTemplateNames(): string[] {\n return BUILT_IN_TEMPLATES.map((t) => t.name);\n}\n\n/**\n * Get all templates for a specific category.\n */\nexport function getMigrationTemplatesByCategory(\n category: MigrationTemplate['category'],\n): MigrationTemplate[] {\n return BUILT_IN_TEMPLATES.filter((t) => t.category === category);\n}\n\n/**\n * Get all built-in migration templates.\n */\nexport function getAllMigrationTemplates(): MigrationTemplate[] {\n return [...BUILT_IN_TEMPLATES];\n}\n\n/**\n * Validate a custom migration template.\n */\nexport function validateMigrationTemplate(template: MigrationTemplate): {\n valid: boolean;\n errors: string[];\n} {\n const errors: string[] = [];\n\n if (!template.name || template.name.trim().length === 0) {\n errors.push('Template name is required');\n }\n\n if (!template.description || template.description.trim().length === 0) {\n errors.push('Template description is required');\n }\n\n if (!template.migrationSteps || template.migrationSteps.length === 0) {\n errors.push('At least one migration step is required');\n }\n\n for (const step of template.migrationSteps ?? []) {\n if (!step.from || !step.to) {\n errors.push(`Migration step must have from and to: ${JSON.stringify(step)}`);\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n","/**\n * Webhook Notification System for SchemaShift\n *\n * Sends migration event notifications to external services\n * (Slack, Teams, Zapier, custom webhooks, etc.)\n */\n\nexport type MigrationEventType =\n | 'migration_started'\n | 'migration_completed'\n | 'migration_failed'\n | 'governance_violation'\n | 'drift_detected';\n\nexport interface MigrationEvent {\n type: MigrationEventType;\n timestamp: string;\n project?: string;\n details: Record<string, unknown>;\n}\n\nexport interface NotificationResult {\n success: boolean;\n statusCode?: number;\n error?: string;\n}\n\nexport type WebhookType = 'generic' | 'slack' | 'teams';\n\nexport interface WebhookConfig {\n url: string;\n events?: MigrationEventType[];\n headers?: Record<string, string>;\n secret?: string;\n type?: WebhookType;\n timeoutMs?: number;\n}\n\n/**\n * Compute HMAC-SHA256 signature for webhook payload verification.\n */\nasync function computeSignature(payload: string, secret: string): Promise<string> {\n const { createHmac } = await import('node:crypto');\n return createHmac('sha256', secret).update(payload).digest('hex');\n}\n\n/**\n * Send migration event notifications via webhooks.\n */\nexport class WebhookNotifier {\n private webhooks: WebhookConfig[];\n\n constructor(webhooks: WebhookConfig[]) {\n this.webhooks = webhooks;\n }\n\n /**\n * Create a migration event with current timestamp.\n */\n createEvent(\n type: MigrationEventType,\n details: Record<string, unknown>,\n project?: string,\n ): MigrationEvent {\n return {\n type,\n timestamp: new Date().toISOString(),\n project,\n details,\n };\n }\n\n /**\n * Send an event to all matching webhooks.\n */\n async send(event: MigrationEvent): Promise<NotificationResult[]> {\n const results: NotificationResult[] = [];\n\n for (const webhook of this.webhooks) {\n if (webhook.events && !webhook.events.includes(event.type)) {\n continue;\n }\n\n const result = await this.sendToWebhook(webhook, event);\n results.push(result);\n }\n\n return results;\n }\n\n /**\n * Format event as Slack Block Kit message.\n */\n formatSlackPayload(event: MigrationEvent): Record<string, unknown> {\n const emoji = this.getEventEmoji(event.type);\n const title = this.getEventTitle(event.type);\n const details = event.details;\n\n const blocks: Array<Record<string, unknown>> = [\n {\n type: 'header',\n text: { type: 'plain_text', text: `${emoji} ${title}`, emoji: true },\n },\n {\n type: 'section',\n fields: Object.entries(details).map(([key, value]) => ({\n type: 'mrkdwn',\n text: `*${key}:* ${String(value)}`,\n })),\n },\n {\n type: 'context',\n elements: [\n {\n type: 'mrkdwn',\n text: `SchemaShift | ${event.timestamp}${event.project ? ` | ${event.project}` : ''}`,\n },\n ],\n },\n ];\n\n return { blocks };\n }\n\n /**\n * Format event as Microsoft Teams Adaptive Card.\n */\n formatTeamsPayload(event: MigrationEvent): Record<string, unknown> {\n const title = this.getEventTitle(event.type);\n const details = event.details;\n\n const facts = Object.entries(details).map(([key, value]) => ({\n title: key,\n value: String(value),\n }));\n\n return {\n type: 'message',\n attachments: [\n {\n contentType: 'application/vnd.microsoft.card.adaptive',\n content: {\n $schema: 'http://adaptivecards.io/schemas/adaptive-card.json',\n type: 'AdaptiveCard',\n version: '1.4',\n body: [\n {\n type: 'TextBlock',\n text: title,\n weight: 'Bolder',\n size: 'Medium',\n },\n {\n type: 'FactSet',\n facts,\n },\n {\n type: 'TextBlock',\n text: `SchemaShift | ${event.timestamp}`,\n isSubtle: true,\n size: 'Small',\n },\n ],\n },\n },\n ],\n };\n }\n\n private getEventEmoji(type: MigrationEventType): string {\n const emojis: Record<MigrationEventType, string> = {\n migration_started: '🔄',\n migration_completed: '✅',\n migration_failed: '❌',\n governance_violation: '⚠️',\n drift_detected: '🔍',\n };\n return emojis[type];\n }\n\n private getEventTitle(type: MigrationEventType): string {\n const titles: Record<MigrationEventType, string> = {\n migration_started: 'Migration Started',\n migration_completed: 'Migration Completed',\n migration_failed: 'Migration Failed',\n governance_violation: 'Governance Violation',\n drift_detected: 'Schema Drift Detected',\n };\n return titles[type];\n }\n\n /**\n * Send event to a single webhook endpoint.\n */\n private async sendToWebhook(\n webhook: WebhookConfig,\n event: MigrationEvent,\n ): Promise<NotificationResult> {\n let payload: string;\n\n if (webhook.type === 'slack') {\n payload = JSON.stringify(this.formatSlackPayload(event));\n } else if (webhook.type === 'teams') {\n payload = JSON.stringify(this.formatTeamsPayload(event));\n } else {\n payload = JSON.stringify(event);\n }\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'User-Agent': 'SchemaShift-Webhook/1.0',\n ...webhook.headers,\n };\n\n if (webhook.secret) {\n const signature = await computeSignature(payload, webhook.secret);\n headers['X-SchemaShift-Signature'] = `sha256=${signature}`;\n }\n\n const timeoutMs = webhook.timeoutMs ?? 10_000;\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(webhook.url, {\n method: 'POST',\n headers,\n body: payload,\n signal: controller.signal,\n });\n\n return {\n success: response.ok,\n statusCode: response.status,\n error: response.ok ? undefined : `HTTP ${response.status}: ${response.statusText}`,\n };\n } catch (err) {\n const message =\n err instanceof Error && err.name === 'AbortError'\n ? `Webhook request timed out after ${timeoutMs}ms`\n : err instanceof Error\n ? err.message\n : String(err);\n return {\n success: false,\n error: message,\n };\n } finally {\n clearTimeout(timeoutId);\n }\n }\n\n /**\n * Convenience: send a migration_started event.\n */\n async notifyMigrationStarted(\n from: string,\n to: string,\n fileCount: number,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent('migration_started', { from, to, fileCount }, project);\n return this.send(event);\n }\n\n /**\n * Convenience: send a migration_completed event.\n */\n async notifyMigrationCompleted(\n from: string,\n to: string,\n fileCount: number,\n warningCount: number,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent(\n 'migration_completed',\n { from, to, fileCount, warningCount },\n project,\n );\n return this.send(event);\n }\n\n /**\n * Convenience: send a migration_failed event.\n */\n async notifyMigrationFailed(\n from: string,\n to: string,\n error: string,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent('migration_failed', { from, to, error }, project);\n return this.send(event);\n }\n\n /**\n * Convenience: send a governance_violation event.\n */\n async notifyGovernanceViolation(\n violationCount: number,\n rules: string[],\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent('governance_violation', { violationCount, rules }, project);\n return this.send(event);\n }\n\n /**\n * Convenience: send a drift_detected event.\n */\n async notifyDriftDetected(\n modifiedFiles: number,\n addedFiles: number,\n removedFiles: number,\n project?: string,\n ): Promise<NotificationResult[]> {\n const event = this.createEvent(\n 'drift_detected',\n { modifiedFiles, addedFiles, removedFiles },\n project,\n );\n return this.send(event);\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","export interface VerificationSample {\n name: string;\n input: unknown;\n expectedValid: boolean;\n}\n\nexport interface SchemaVerificationResult {\n schemaName: string;\n filePath: string;\n totalSamples: number;\n matchingSamples: number;\n mismatches: VerificationMismatch[];\n parityScore: number;\n}\n\nexport interface VerificationMismatch {\n sampleName: string;\n input: unknown;\n sourceResult: { valid: boolean; error?: string };\n targetResult: { valid: boolean; error?: string };\n}\n\nexport interface VerificationReport {\n from: string;\n to: string;\n totalSchemas: number;\n results: SchemaVerificationResult[];\n overallParityScore: number;\n timestamp: string;\n}\n\nconst PRIMITIVE_SAMPLES: Record<string, VerificationSample[]> = {\n string: [\n { name: 'empty string', input: '', expectedValid: true },\n { name: 'normal string', input: 'hello world', expectedValid: true },\n { name: 'number as string', input: '12345', expectedValid: true },\n { name: 'null input', input: null, expectedValid: false },\n { name: 'number input', input: 42, expectedValid: false },\n { name: 'boolean input', input: true, expectedValid: false },\n { name: 'undefined input', input: undefined, expectedValid: false },\n ],\n number: [\n { name: 'zero', input: 0, expectedValid: true },\n { name: 'positive int', input: 42, expectedValid: true },\n { name: 'negative int', input: -1, expectedValid: true },\n { name: 'float', input: 3.14, expectedValid: true },\n { name: 'string input', input: 'hello', expectedValid: false },\n { name: 'null input', input: null, expectedValid: false },\n { name: 'NaN input', input: Number.NaN, expectedValid: false },\n ],\n boolean: [\n { name: 'true', input: true, expectedValid: true },\n { name: 'false', input: false, expectedValid: true },\n { name: 'string input', input: 'true', expectedValid: false },\n { name: 'number input', input: 1, expectedValid: false },\n { name: 'null input', input: null, expectedValid: false },\n ],\n date: [\n { name: 'valid date', input: new Date('2024-01-01'), expectedValid: true },\n { name: 'string input', input: '2024-01-01', expectedValid: false },\n { name: 'null input', input: null, expectedValid: false },\n ],\n};\n\nconst EMAIL_SAMPLES: VerificationSample[] = [\n { name: 'valid email', input: 'test@example.com', expectedValid: true },\n { name: 'invalid email', input: 'not-an-email', expectedValid: false },\n { name: 'empty string', input: '', expectedValid: false },\n];\n\nconst URL_SAMPLES: VerificationSample[] = [\n { name: 'valid url', input: 'https://example.com', expectedValid: true },\n { name: 'invalid url', input: 'not a url', expectedValid: false },\n];\n\nconst UUID_SAMPLES: VerificationSample[] = [\n { name: 'valid uuid', input: '550e8400-e29b-41d4-a716-446655440000', expectedValid: true },\n { name: 'invalid uuid', input: 'not-a-uuid', expectedValid: false },\n];\n\n/**\n * Extracts schema definition names from source file text.\n */\nexport function extractSchemaNames(sourceText: string): string[] {\n const schemas: string[] = [];\n const patterns = [\n /(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:z\\.|yup\\.|Joi\\.|v\\.|t\\.|S\\.|type\\(|object\\(|string\\()/g,\n /export\\s+(?:const|let|var)\\s+(\\w+)\\s*=\\s*(?:z\\.|yup\\.|Joi\\.|v\\.|t\\.|S\\.|type\\(|object\\(|string\\()/g,\n ];\n\n for (const pattern of patterns) {\n for (const match of sourceText.matchAll(pattern)) {\n const name = match[1];\n if (name && !schemas.includes(name)) {\n schemas.push(name);\n }\n }\n }\n\n return schemas;\n}\n\n/**\n * Generates test samples based on detected schema patterns.\n */\nexport function generateSamples(\n sourceText: string,\n schemaName: string,\n maxSamples: number,\n): VerificationSample[] {\n const samples: VerificationSample[] = [];\n\n const schemaBlock = extractSchemaBlock(sourceText, schemaName);\n if (!schemaBlock) return PRIMITIVE_SAMPLES.string?.slice(0, maxSamples) ?? [];\n\n if (/\\.email\\s*\\(/.test(schemaBlock)) {\n samples.push(...EMAIL_SAMPLES);\n }\n if (/\\.url\\s*\\(/.test(schemaBlock)) {\n samples.push(...URL_SAMPLES);\n }\n if (/\\.uuid\\s*\\(/.test(schemaBlock)) {\n samples.push(...UUID_SAMPLES);\n }\n\n if (/string\\s*\\(/.test(schemaBlock)) {\n samples.push(...(PRIMITIVE_SAMPLES.string ?? []));\n }\n if (/number\\s*\\(/.test(schemaBlock) || /\\.int\\s*\\(/.test(schemaBlock)) {\n samples.push(...(PRIMITIVE_SAMPLES.number ?? []));\n }\n if (/boolean\\s*\\(/.test(schemaBlock)) {\n samples.push(...(PRIMITIVE_SAMPLES.boolean ?? []));\n }\n if (/date\\s*\\(/.test(schemaBlock)) {\n samples.push(...(PRIMITIVE_SAMPLES.date ?? []));\n }\n\n if (/\\.optional\\s*\\(/.test(schemaBlock) || /optional\\s*\\(/.test(schemaBlock)) {\n samples.push({ name: 'undefined (optional)', input: undefined, expectedValid: true });\n }\n if (/\\.nullable\\s*\\(/.test(schemaBlock) || /nullable\\s*\\(/.test(schemaBlock)) {\n samples.push({ name: 'null (nullable)', input: null, expectedValid: true });\n }\n\n if (/\\.min\\s*\\(\\s*(\\d+)/.test(schemaBlock)) {\n const minMatch = schemaBlock.match(/\\.min\\s*\\(\\s*(\\d+)/);\n const minVal = minMatch ? Number.parseInt(minMatch[1] ?? '0', 10) : 0;\n samples.push({\n name: `below min (${minVal})`,\n input: minVal > 0 ? 'a'.repeat(minVal - 1) : '',\n expectedValid: false,\n });\n }\n\n const seen = new Set<string>();\n const unique: VerificationSample[] = [];\n for (const s of samples) {\n if (!seen.has(s.name)) {\n seen.add(s.name);\n unique.push(s);\n }\n }\n\n return unique.slice(0, maxSamples);\n}\n\nfunction extractSchemaBlock(sourceText: string, schemaName: string): string | null {\n const escapedName = schemaName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(\n `(?:const|let|var|export\\\\s+const)\\\\s+${escapedName}\\\\s*=\\\\s*([\\\\s\\\\S]*?)(?:;\\\\s*$|;\\\\s*(?:const|let|var|export|function|class|type|interface))`,\n 'm',\n );\n const match = sourceText.match(pattern);\n return match?.[1] ?? null;\n}\n\n/**\n * Creates a verification report comparing source and target schemas.\n */\nexport function createVerificationReport(\n from: string,\n to: string,\n results: SchemaVerificationResult[],\n): VerificationReport {\n const totalSchemas = results.length;\n const overallParityScore =\n totalSchemas > 0 ? results.reduce((sum, r) => sum + r.parityScore, 0) / totalSchemas : 100;\n\n return {\n from,\n to,\n totalSchemas,\n results,\n overallParityScore: Math.round(overallParityScore * 100) / 100,\n timestamp: new Date().toISOString(),\n };\n}\n\n/**\n * Format verification report for terminal output.\n */\nexport function formatVerificationReport(report: VerificationReport): string {\n const lines: string[] = [];\n lines.push(`\\nSchema Verification Report: ${report.from} → ${report.to}`);\n lines.push('─'.repeat(50));\n\n for (const result of report.results) {\n const icon = result.parityScore === 100 ? '✓' : result.parityScore >= 80 ? '⚠' : '✗';\n lines.push(\n ` ${icon} ${result.schemaName} — ${result.parityScore}% parity (${result.matchingSamples}/${result.totalSamples} samples)`,\n );\n\n for (const mismatch of result.mismatches) {\n lines.push(\n ` └─ ${mismatch.sampleName}: source=${mismatch.sourceResult.valid ? 'valid' : 'invalid'}, target=${mismatch.targetResult.valid ? 'valid' : 'invalid'}`,\n );\n }\n }\n\n lines.push('─'.repeat(50));\n lines.push(`Overall Parity: ${report.overallParityScore}%`);\n lines.push('');\n\n return lines.join('\\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 { detectStandardSchema, type StandardSchemaInfo } from './standard-schema.js';\nimport type { SchemaLibrary } from './types.js';\n\nexport interface StandardSchemaAdvisory {\n shouldConsiderAdapter: boolean;\n reason: string;\n adapterExample?: string;\n migrationAdvantages: string[];\n adapterAdvantages: string[];\n recommendation: 'migrate' | 'adapter' | 'either';\n}\n\nconst STANDARD_SCHEMA_LIBS = new Set<string>(['zod', 'valibot', 'arktype']);\n\n/**\n * Advises whether to do a full migration or use Standard Schema adapters.\n *\n * When both source and target libraries support Standard Schema 1.0,\n * users may not need a full migration — they can use adapters instead.\n */\nexport class StandardSchemaAdvisor {\n /**\n * Check if a schema library supports Standard Schema.\n */\n supportsStandardSchema(library: SchemaLibrary | string): boolean {\n return STANDARD_SCHEMA_LIBS.has(library);\n }\n\n /**\n * Generate advisory for a given migration path.\n */\n advise(from: SchemaLibrary | string, to: SchemaLibrary | string): StandardSchemaAdvisory {\n const fromSupports = this.supportsStandardSchema(from);\n const toSupports = this.supportsStandardSchema(to);\n\n if (!fromSupports && !toSupports) {\n return {\n shouldConsiderAdapter: false,\n reason: `Neither ${from} nor ${to} supports Standard Schema. Full migration is recommended.`,\n migrationAdvantages: [\n 'Complete type safety with target library',\n 'Access to target library ecosystem',\n 'No runtime adapter overhead',\n ],\n adapterAdvantages: [],\n recommendation: 'migrate',\n };\n }\n\n if (fromSupports && toSupports) {\n return {\n shouldConsiderAdapter: true,\n reason: `Both ${from} and ${to} support Standard Schema 1.0. You may be able to use adapters for ecosystem tools (tRPC, TanStack Form, etc.) instead of migrating all schemas.`,\n adapterExample: this.generateAdapterExample(from, to),\n migrationAdvantages: [\n 'Full target library API and ergonomics',\n 'Consistent codebase (single library)',\n 'Better IDE support for one library',\n 'Smaller bundle (avoid loading two libraries)',\n ],\n adapterAdvantages: [\n 'No code changes needed for existing schemas',\n 'Gradual migration possible',\n 'Ecosystem tools work with both libraries via Standard Schema',\n 'Lower risk — existing validation behavior preserved',\n ],\n recommendation: 'either',\n };\n }\n\n if (toSupports && !fromSupports) {\n return {\n shouldConsiderAdapter: false,\n reason: `${from} does not support Standard Schema, but ${to} does. Migrating to ${to} gives you Standard Schema interoperability.`,\n migrationAdvantages: [\n 'Standard Schema interoperability with ecosystem tools',\n 'Future-proof validation layer',\n `Access to ${to} API and type inference`,\n ],\n adapterAdvantages: [],\n recommendation: 'migrate',\n };\n }\n\n // fromSupports && !toSupports\n return {\n shouldConsiderAdapter: false,\n reason: `${from} supports Standard Schema but ${to} does not. Consider if you need the specific features of ${to} that justify losing Standard Schema interoperability.`,\n migrationAdvantages: [`Access to ${to}-specific features`],\n adapterAdvantages: [`Keeping ${from} preserves Standard Schema interoperability`],\n recommendation: 'migrate',\n };\n }\n\n /**\n * Analyze a project and provide advisory based on detected libraries.\n */\n adviseFromProject(\n projectPath: string,\n from: SchemaLibrary | string,\n to: SchemaLibrary | string,\n ): StandardSchemaAdvisory & { projectInfo: StandardSchemaInfo } {\n const projectInfo = detectStandardSchema(projectPath);\n const advisory = this.advise(from, to);\n return { ...advisory, projectInfo };\n }\n\n private generateAdapterExample(from: string, to: string): string {\n return [\n `// Instead of migrating all ${from} schemas to ${to},`,\n `// you can use Standard Schema adapters for ecosystem tools:`,\n `//`,\n `// Example with tRPC (v11+):`,\n `// tRPC accepts any Standard Schema-compatible schema.`,\n `// Both ${from} and ${to} schemas work without conversion:`,\n `//`,\n `// import { ${from}Schema } from './existing-${from}-schemas';`,\n `// import { ${to}Schema } from './new-${to}-schemas';`,\n `//`,\n `// const router = t.router({`,\n `// // Works with ${from} schema (Standard Schema compatible)`,\n `// getUser: t.procedure.input(${from}Schema).query(...)`,\n `// // Also works with ${to} schema`,\n `// createUser: t.procedure.input(${to}Schema).mutation(...)`,\n `// });`,\n ].join('\\n');\n }\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_node_fs","import_node_path","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_crypto","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"]}