pocketbase-zod-schema 0.3.2 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/dist/cli/index.cjs +28 -6
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.d.cts +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +28 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/migrate.cjs +28 -6
- package/dist/cli/migrate.cjs.map +1 -1
- package/dist/cli/migrate.js +28 -6
- package/dist/cli/migrate.js.map +1 -1
- package/dist/cli/utils/index.d.cts +1 -1
- package/dist/cli/utils/index.d.ts +1 -1
- package/dist/index.cjs +42 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +42 -9
- package/dist/index.js.map +1 -1
- package/dist/migration/analyzer.d.cts +1 -1
- package/dist/migration/analyzer.d.ts +1 -1
- package/dist/migration/diff.cjs +10 -1
- package/dist/migration/diff.cjs.map +1 -1
- package/dist/migration/diff.d.cts +1 -1
- package/dist/migration/diff.d.ts +1 -1
- package/dist/migration/diff.js +10 -1
- package/dist/migration/diff.js.map +1 -1
- package/dist/migration/generator.cjs +32 -8
- package/dist/migration/generator.cjs.map +1 -1
- package/dist/migration/generator.d.cts +2 -2
- package/dist/migration/generator.d.ts +2 -2
- package/dist/migration/generator.js +32 -8
- package/dist/migration/generator.js.map +1 -1
- package/dist/migration/index.cjs +42 -9
- package/dist/migration/index.cjs.map +1 -1
- package/dist/migration/index.d.cts +1 -1
- package/dist/migration/index.d.ts +1 -1
- package/dist/migration/index.js +42 -9
- package/dist/migration/index.js.map +1 -1
- package/dist/migration/snapshot.d.cts +1 -1
- package/dist/migration/snapshot.d.ts +1 -1
- package/dist/{types-Dfp-NP2D.d.ts → types-BWhwQxG-.d.ts} +5 -0
- package/dist/{types-CVxPCgWX.d.cts → types-d0yBwHoN.d.cts} +5 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/migration/errors.ts","../../src/migration/generator.ts"],"names":["path"],"mappings":"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","file":"generator.js","sourcesContent":["/**\n * Custom error classes for migration tool\n * Provides specific error types for better error handling and user feedback\n */\n\n/**\n * Base error class for all migration-related errors\n */\nexport class MigrationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MigrationError\";\n Object.setPrototypeOf(this, MigrationError.prototype);\n }\n}\n\n/**\n * Error thrown when schema parsing fails\n * Used when Zod schemas cannot be parsed or are invalid\n */\nexport class SchemaParsingError extends MigrationError {\n public readonly filePath?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, filePath?: string, originalError?: Error) {\n super(message);\n this.name = \"SchemaParsingError\";\n this.filePath = filePath;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SchemaParsingError.prototype);\n }\n\n /**\n * Creates a formatted error message with file path and original error details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.filePath) {\n parts.push(`\\nFile: ${this.filePath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when snapshot operations fail\n * Used for snapshot file read/write/parse errors\n */\nexport class SnapshotError extends MigrationError {\n public readonly snapshotPath?: string;\n public readonly operation?: \"read\" | \"write\" | \"parse\" | \"validate\";\n public readonly originalError?: Error;\n\n constructor(\n message: string,\n snapshotPath?: string,\n operation?: \"read\" | \"write\" | \"parse\" | \"validate\",\n originalError?: Error\n ) {\n super(message);\n this.name = \"SnapshotError\";\n this.snapshotPath = snapshotPath;\n this.operation = operation;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SnapshotError.prototype);\n }\n\n /**\n * Creates a formatted error message with snapshot path and operation details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.operation) {\n parts.push(`\\nOperation: ${this.operation}`);\n }\n\n if (this.snapshotPath) {\n parts.push(`\\nSnapshot: ${this.snapshotPath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when migration file generation fails\n * Used when migration files cannot be created or written\n */\nexport class MigrationGenerationError extends MigrationError {\n public readonly migrationPath?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, migrationPath?: string, originalError?: Error) {\n super(message);\n this.name = \"MigrationGenerationError\";\n this.migrationPath = migrationPath;\n this.originalError = originalError;\n Object.setPrototypeOf(this, MigrationGenerationError.prototype);\n }\n\n /**\n * Creates a formatted error message with migration path and original error details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.migrationPath) {\n parts.push(`\\nMigration: ${this.migrationPath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when file system operations fail\n * Used for directory creation, file permissions, disk space issues\n */\nexport class FileSystemError extends MigrationError {\n public readonly path?: string;\n public readonly operation?: \"read\" | \"write\" | \"create\" | \"delete\" | \"access\";\n public readonly code?: string;\n public readonly originalError?: Error;\n\n constructor(\n message: string,\n path?: string,\n operation?: \"read\" | \"write\" | \"create\" | \"delete\" | \"access\",\n code?: string,\n originalError?: Error\n ) {\n super(message);\n this.name = \"FileSystemError\";\n this.path = path;\n this.operation = operation;\n this.code = code;\n this.originalError = originalError;\n Object.setPrototypeOf(this, FileSystemError.prototype);\n }\n\n /**\n * Creates a formatted error message with path, operation, and error code details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.operation) {\n parts.push(`\\nOperation: ${this.operation}`);\n }\n\n if (this.path) {\n parts.push(`\\nPath: ${this.path}`);\n }\n\n if (this.code) {\n parts.push(`\\nError Code: ${this.code}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n * Used for configuration file parsing, validation, and path resolution errors\n */\nexport class ConfigurationError extends MigrationError {\n public readonly configPath?: string;\n public readonly invalidFields?: string[];\n public readonly originalError?: Error;\n\n constructor(message: string, configPath?: string, invalidFields?: string[], originalError?: Error) {\n super(message);\n this.name = \"ConfigurationError\";\n this.configPath = configPath;\n this.invalidFields = invalidFields;\n this.originalError = originalError;\n Object.setPrototypeOf(this, ConfigurationError.prototype);\n }\n\n /**\n * Creates a formatted error message with configuration details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.configPath) {\n parts.push(`\\nConfiguration File: ${this.configPath}`);\n }\n\n if (this.invalidFields && this.invalidFields.length > 0) {\n parts.push(`\\nInvalid Fields: ${this.invalidFields.join(\", \")}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when CLI command usage is incorrect\n * Used for invalid arguments, missing required options, etc.\n */\nexport class CLIUsageError extends MigrationError {\n public readonly command?: string;\n public readonly suggestion?: string;\n\n constructor(message: string, command?: string, suggestion?: string) {\n super(message);\n this.name = \"CLIUsageError\";\n this.command = command;\n this.suggestion = suggestion;\n Object.setPrototypeOf(this, CLIUsageError.prototype);\n }\n\n /**\n * Creates a formatted error message with usage suggestions\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.command) {\n parts.push(`\\nCommand: ${this.command}`);\n }\n\n if (this.suggestion) {\n parts.push(`\\nSuggestion: ${this.suggestion}`);\n }\n\n return parts.join(\"\");\n }\n}\n","/**\n * Migration Generator component\n * Creates PocketBase migration files based on detected differences\n *\n * This module provides a standalone, configurable migration generator that can be used\n * by consumer projects to generate PocketBase-compatible migration files.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { FileSystemError, MigrationGenerationError } from \"./errors\";\nimport type { CollectionOperation, CollectionSchema, FieldDefinition, FieldModification, SchemaDiff } from \"./types\";\n\n/**\n * Configuration options for the migration generator\n */\nexport interface MigrationGeneratorConfig {\n /**\n * Directory to write migration files\n */\n migrationDir: string;\n\n /**\n * Workspace root for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * Custom timestamp generator function\n * Defaults to Unix timestamp in seconds\n */\n timestampGenerator?: () => string;\n\n /**\n * Custom migration file template\n * Use {{UP_CODE}} and {{DOWN_CODE}} placeholders\n */\n template?: string;\n\n /**\n * Whether to include type reference comment\n * Defaults to true\n */\n includeTypeReference?: boolean;\n\n /**\n * Path to types.d.ts file for reference comment\n * Defaults to '../pb_data/types.d.ts'\n */\n typesPath?: string;\n}\n\n/**\n * Default migration template\n */\nconst DEFAULT_TEMPLATE = `/// <reference path=\"{{TYPES_PATH}}\" />\nmigrate((app) => {\n{{UP_CODE}}\n}, (app) => {\n{{DOWN_CODE}}\n});\n`;\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Omit<Required<MigrationGeneratorConfig>, \"migrationDir\"> = {\n workspaceRoot: process.cwd(),\n timestampGenerator: () => Math.floor(Date.now() / 1000).toString(),\n template: DEFAULT_TEMPLATE,\n includeTypeReference: true,\n typesPath: \"../pb_data/types.d.ts\",\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config: MigrationGeneratorConfig): Required<MigrationGeneratorConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Resolves the migration directory path\n */\nfunction resolveMigrationDir(config: MigrationGeneratorConfig): string {\n const workspaceRoot = config.workspaceRoot || process.cwd();\n\n if (path.isAbsolute(config.migrationDir)) {\n return config.migrationDir;\n }\n\n return path.join(workspaceRoot, config.migrationDir);\n}\n\n/**\n * Generates a timestamp for migration filename\n * Format: Unix timestamp in seconds (e.g., 1687801090)\n *\n * @param config - Optional configuration with custom timestamp generator\n * @returns Timestamp string\n */\nexport function generateTimestamp(config?: MigrationGeneratorConfig): string {\n if (config?.timestampGenerator) {\n return config.timestampGenerator();\n }\n return Math.floor(Date.now() / 1000).toString();\n}\n\n/**\n * Splits a SchemaDiff into individual collection operations\n * Each operation will generate a separate migration file\n *\n * @param diff - Schema diff containing all changes\n * @param baseTimestamp - Base timestamp for the first operation\n * @returns Array of collection operations\n */\nexport function splitDiffByCollection(diff: SchemaDiff, baseTimestamp: string): CollectionOperation[] {\n const operations: CollectionOperation[] = [];\n let currentTimestamp = parseInt(baseTimestamp, 10);\n\n // Split collectionsToCreate into individual operations\n for (const collection of diff.collectionsToCreate) {\n operations.push({\n type: \"create\",\n collection: collection,\n timestamp: currentTimestamp.toString(),\n });\n currentTimestamp += 1; // Increment by 1 second\n }\n\n // Split collectionsToModify into individual operations\n for (const modification of diff.collectionsToModify) {\n operations.push({\n type: \"modify\",\n collection: modification.collection,\n modifications: modification,\n timestamp: currentTimestamp.toString(),\n });\n currentTimestamp += 1; // Increment by 1 second\n }\n\n // Split collectionsToDelete into individual operations\n for (const collection of diff.collectionsToDelete) {\n operations.push({\n type: \"delete\",\n collection: collection.name || collection, // Handle both object and string\n timestamp: currentTimestamp.toString(),\n });\n currentTimestamp += 1; // Increment by 1 second\n }\n\n return operations;\n}\n\n/**\n * Generates migration filename for a collection operation\n * Format: {timestamp}_{operation}_{collection_name}.js\n *\n * @param operation - Collection operation\n * @returns Migration filename\n */\nexport function generateCollectionMigrationFilename(operation: CollectionOperation): string {\n const timestamp = operation.timestamp;\n const operationType = operation.type === \"modify\" ? \"updated\" : operation.type === \"create\" ? \"created\" : \"deleted\";\n\n // Get collection name\n let collectionName: string;\n if (typeof operation.collection === \"string\") {\n collectionName = operation.collection;\n } else {\n collectionName = operation.collection.name;\n }\n\n // Sanitize collection name for filename (replace spaces and special chars with underscores)\n const sanitizedName = collectionName.replace(/[^a-zA-Z0-9_]/g, \"_\").toLowerCase();\n\n return `${timestamp}_${operationType}_${sanitizedName}.js`;\n}\n\n/**\n * Increments a timestamp by 1 second\n * Ensures sequential ordering of migration files\n *\n * @param timestamp - Current timestamp string\n * @returns Incremented timestamp string\n */\nexport function incrementTimestamp(timestamp: string): string {\n const currentTimestamp = parseInt(timestamp, 10);\n return (currentTimestamp + 1).toString();\n}\n\n/**\n * Generates a human-readable description from the diff\n * Creates a concise summary of the main changes\n *\n * @param diff - Schema diff containing all changes\n * @returns Description string for filename\n */\nexport function generateMigrationDescription(diff: SchemaDiff): string {\n const parts: string[] = [];\n\n // Summarize collection changes\n if (diff.collectionsToCreate.length > 0) {\n if (diff.collectionsToCreate.length === 1) {\n parts.push(`created_${diff.collectionsToCreate[0].name}`);\n } else {\n parts.push(`created_${diff.collectionsToCreate.length}_collections`);\n }\n }\n\n if (diff.collectionsToDelete.length > 0) {\n if (diff.collectionsToDelete.length === 1) {\n parts.push(`deleted_${diff.collectionsToDelete[0].name}`);\n } else {\n parts.push(`deleted_${diff.collectionsToDelete.length}_collections`);\n }\n }\n\n if (diff.collectionsToModify.length > 0) {\n if (diff.collectionsToModify.length === 1) {\n parts.push(`updated_${diff.collectionsToModify[0].collection}`);\n } else {\n parts.push(`updated_${diff.collectionsToModify.length}_collections`);\n }\n }\n\n // Default description if no changes\n if (parts.length === 0) {\n return \"no_changes\";\n }\n\n // Join parts with underscores and limit length\n let description = parts.join(\"_\");\n\n // Truncate if too long (keep under 100 chars for filename)\n if (description.length > 80) {\n description = description.substring(0, 77) + \"...\";\n }\n\n return description;\n}\n\n/**\n * Generates the migration filename\n * Format: {timestamp}_{description}.js\n *\n * @param diff - Schema diff containing all changes\n * @param config - Optional configuration\n * @returns Migration filename\n */\nexport function generateMigrationFilename(diff: SchemaDiff, config?: MigrationGeneratorConfig): string {\n const timestamp = generateTimestamp(config);\n const description = generateMigrationDescription(diff);\n\n return `${timestamp}_${description}.js`;\n}\n\n/**\n * Creates the migration file structure with up and down functions\n *\n * @param upCode - Code for the up migration\n * @param downCode - Code for the down migration\n * @param config - Optional configuration with custom template\n * @returns Complete migration file content\n */\nexport function createMigrationFileStructure(\n upCode: string,\n downCode: string,\n config?: MigrationGeneratorConfig\n): string {\n const mergedConfig = config ? mergeConfig(config) : DEFAULT_CONFIG;\n let template = mergedConfig.template;\n\n // Replace placeholders\n template = template.replace(\"{{TYPES_PATH}}\", mergedConfig.typesPath);\n template = template.replace(\"{{UP_CODE}}\", upCode);\n template = template.replace(\"{{DOWN_CODE}}\", downCode);\n\n // Remove type reference if disabled\n if (!mergedConfig.includeTypeReference) {\n template = template.replace(/\\/\\/\\/ <reference path=\"[^\"]*\" \\/>\\n?/, \"\");\n }\n\n return template;\n}\n\n/**\n * Writes migration file to the specified directory\n * Creates directory if it doesn't exist\n *\n * @param migrationDir - Directory to write migration file\n * @param filename - Migration filename\n * @param content - Migration file content\n * @returns Full path to the created migration file\n */\nexport function writeMigrationFile(migrationDir: string, filename: string, content: string): string {\n try {\n // Ensure migration directory exists\n if (!fs.existsSync(migrationDir)) {\n try {\n fs.mkdirSync(migrationDir, { recursive: true });\n } catch (error) {\n const fsError = error as NodeJS.ErrnoException;\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied creating migration directory. Check directory permissions.`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n throw new FileSystemError(\n `Failed to create migration directory: ${fsError.message}`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n }\n\n // Full path to migration file\n const filePath = path.join(migrationDir, filename);\n\n // Write migration file\n fs.writeFileSync(filePath, content, \"utf-8\");\n\n return filePath;\n } catch (error) {\n // If it's already a FileSystemError, re-throw it\n if (error instanceof FileSystemError) {\n throw error;\n }\n\n const fsError = error as NodeJS.ErrnoException;\n const filePath = path.join(migrationDir, filename);\n\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied writing migration file. Check file and directory permissions.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n } else if (fsError.code === \"ENOSPC\") {\n throw new FileSystemError(\n `No space left on device when writing migration file.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n }\n\n throw new MigrationGenerationError(`Failed to write migration file: ${fsError.message}`, filePath, error as Error);\n }\n}\n\n/**\n * Formats a value for JavaScript code generation\n * Handles strings, numbers, booleans, null, arrays, and objects\n *\n * @param value - Value to format\n * @returns Formatted string representation\n */\nfunction formatValue(value: any): string {\n if (value === null || value === undefined) {\n return \"null\";\n }\n\n if (typeof value === \"string\") {\n // Use JSON.stringify to properly escape all special characters\n return JSON.stringify(value);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n // Use JSON.stringify for arrays to properly handle all special characters\n // Then format with spaces after commas to match expected test output\n return JSON.stringify(value).replace(/\",\"/g, '\", \"');\n }\n\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\n .filter(([_k, v]) => v !== undefined) // Omit undefined values\n .map(([k, v]) => `${k}: ${formatValue(v)}`)\n .join(\", \");\n return `{ ${entries} }`;\n }\n\n return String(value);\n}\n\n/**\n * Generates field definition object for collection creation\n * Creates the field configuration object used in Collection constructor\n *\n * @param field - Field definition\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns Field definition object as string\n */\nexport function generateFieldDefinitionObject(field: FieldDefinition, collectionIdMap?: Map<string, string>): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add field type\n parts.push(` type: \"${field.type}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add explicit defaults for select fields\n if (field.type === \"select\") {\n // Always include maxSelect (default: 1)\n const maxSelect = field.options?.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include values array (default: [])\n const values = field.options?.values ?? [];\n parts.push(` values: ${formatValue(values)}`);\n }\n\n // Add options if present (excluding select-specific options already handled)\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n // Skip select-specific options as they're handled above\n if (field.type === \"select\" && (key === \"maxSelect\" || key === \"values\")) {\n continue;\n }\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation configuration if present\n if (field.relation) {\n // Use pre-generated collection ID from map if available\n // Otherwise fall back to runtime lookup (for existing collections not in the current diff)\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n let collectionIdValue: string;\n\n if (isUsersCollection) {\n // Special case: users collection always uses the constant\n collectionIdValue = '\"_pb_users_auth_\"';\n } else if (collectionIdMap && collectionIdMap.has(field.relation.collection)) {\n // Use pre-generated ID from map\n collectionIdValue = `\"${collectionIdMap.get(field.relation.collection)}\"`;\n } else {\n // Fall back to runtime lookup for existing collections\n collectionIdValue = `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n }\n\n parts.push(` collectionId: ${collectionIdValue}`);\n\n // Always include maxSelect (default: 1)\n const maxSelect = field.relation.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include minSelect (default: null)\n const minSelect = field.relation.minSelect ?? null;\n parts.push(` minSelect: ${minSelect}`);\n\n // Always include cascadeDelete (default: false)\n const cascadeDelete = field.relation.cascadeDelete ?? false;\n parts.push(` cascadeDelete: ${cascadeDelete}`);\n }\n\n return ` {\\n${parts.join(\",\\n\")},\\n }`;\n}\n\n/**\n * Generates fields array for collection creation\n *\n * @param fields - Array of field definitions\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns Fields array as string\n */\nexport function generateFieldsArray(fields: FieldDefinition[], collectionIdMap?: Map<string, string>): string {\n if (fields.length === 0) {\n return \"[]\";\n }\n\n const fieldObjects = fields.map((field) => generateFieldDefinitionObject(field, collectionIdMap));\n return `[\\n${fieldObjects.join(\",\\n\")},\\n ]`;\n}\n\n/**\n * Generates collection rules object\n *\n * @param rules - Collection rules\n * @returns Rules configuration as string\n */\nexport function generateCollectionRules(rules?: CollectionSchema[\"rules\"]): string {\n if (!rules) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (rules.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(rules.listRule)}`);\n }\n\n if (rules.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(rules.viewRule)}`);\n }\n\n if (rules.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(rules.createRule)}`);\n }\n\n if (rules.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(rules.updateRule)}`);\n }\n\n if (rules.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(rules.deleteRule)}`);\n }\n\n if (rules.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(rules.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates collection permissions object\n * Permissions are the same as rules but extracted from schema metadata\n *\n * @param permissions - Collection permissions\n * @returns Permissions configuration as string\n */\nexport function generateCollectionPermissions(permissions?: CollectionSchema[\"permissions\"]): string {\n if (!permissions) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (permissions.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(permissions.listRule)}`);\n }\n\n if (permissions.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(permissions.viewRule)}`);\n }\n\n if (permissions.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(permissions.createRule)}`);\n }\n\n if (permissions.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(permissions.updateRule)}`);\n }\n\n if (permissions.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(permissions.deleteRule)}`);\n }\n\n if (permissions.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(permissions.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates indexes array for collection creation\n *\n * @param indexes - Array of index definitions\n * @returns Indexes array as string\n */\nexport function generateIndexesArray(indexes?: string[]): string {\n if (!indexes || indexes.length === 0) {\n return \"[]\";\n }\n\n const indexStrings = indexes.map((idx) => JSON.stringify(idx));\n return `[\\n ${indexStrings.join(\",\\n \")},\\n ]`;\n}\n\n/**\n * Generates Collection constructor call for creating a new collection\n *\n * @param collection - Collection schema\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @returns JavaScript code for creating the collection\n */\n/**\n * Generates system fields that are required for all PocketBase collections\n * These fields (id, created, updated) must be explicitly included in migrations\n *\n * @returns Array of system field definitions\n */\nfunction getSystemFields(): FieldDefinition[] {\n return [\n // id field - primary key, auto-generated\n {\n name: \"id\",\n type: \"text\",\n required: true,\n options: {\n autogeneratePattern: \"[a-z0-9]{15}\",\n hidden: false,\n id: \"text3208210256\",\n max: 15,\n min: 15,\n pattern: \"^[a-z0-9]+$\",\n presentable: false,\n primaryKey: true,\n system: true,\n },\n },\n // created field - autodate, set on creation\n {\n name: \"created\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate2990389176\",\n onCreate: true,\n onUpdate: false,\n presentable: false,\n system: false,\n },\n },\n // updated field - autodate, set on creation and update\n {\n name: \"updated\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate3332085495\",\n onCreate: true,\n onUpdate: true,\n presentable: false,\n system: false,\n },\n },\n ];\n}\n\nexport function generateCollectionCreation(\n collection: CollectionSchema,\n varName: string = \"collection\",\n isLast: boolean = false,\n collectionIdMap?: Map<string, string>\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = new Collection({`);\n if (collection.id) {\n lines.push(` id: ${formatValue(collection.id)},`);\n }\n lines.push(` name: \"${collection.name}\",`);\n lines.push(` type: \"${collection.type}\",`);\n\n // Add permissions (preferred) or rules\n // Permissions take precedence if both are defined\n const permissionsCode = generateCollectionPermissions(collection.permissions);\n const rulesCode = generateCollectionRules(collection.rules);\n\n if (permissionsCode) {\n lines.push(` ${permissionsCode},`);\n } else if (rulesCode) {\n lines.push(` ${rulesCode},`);\n }\n\n // Prepend system fields (id, created, updated) to user-defined fields\n // These fields are required by PocketBase and must be explicitly included in migrations\n const systemFields = getSystemFields();\n const allFields = [...systemFields, ...collection.fields];\n\n // Add fields\n lines.push(` fields: ${generateFieldsArray(allFields, collectionIdMap)},`);\n\n // Add indexes\n lines.push(` indexes: ${generateIndexesArray(collection.indexes)},`);\n\n lines.push(` });`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${varName});` : ` app.save(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Gets the appropriate Field constructor name for a field type\n *\n * @param fieldType - PocketBase field type\n * @returns Field constructor name\n */\nfunction getFieldConstructorName(fieldType: string): string {\n const constructorMap: Record<string, string> = {\n text: \"TextField\",\n email: \"EmailField\",\n url: \"URLField\",\n number: \"NumberField\",\n bool: \"BoolField\",\n date: \"DateField\",\n select: \"SelectField\",\n relation: \"RelationField\",\n file: \"FileField\",\n json: \"JSONField\",\n };\n\n return constructorMap[fieldType] || \"TextField\";\n}\n\n/**\n * Generates field constructor options object\n *\n * @param field - Field definition\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns Options object as string\n */\nfunction generateFieldConstructorOptions(field: FieldDefinition, collectionIdMap?: Map<string, string>): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add explicit defaults for select fields\n if (field.type === \"select\") {\n // Always include maxSelect (default: 1)\n const maxSelect = field.options?.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include values array (default: [])\n const values = field.options?.values ?? [];\n parts.push(` values: ${formatValue(values)}`);\n }\n\n // Add options if present (excluding select-specific options already handled)\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n // Skip select-specific options as they're handled above\n if (field.type === \"select\" && (key === \"maxSelect\" || key === \"values\")) {\n continue;\n }\n // Convert noDecimal to onlyInt for number fields (PocketBase uses onlyInt)\n if (field.type === \"number\" && key === \"noDecimal\") {\n parts.push(` onlyInt: ${formatValue(value)}`);\n } else {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n }\n\n // Add relation-specific options\n if (field.relation && field.type === \"relation\") {\n // Use pre-generated collection ID from map if available\n // Otherwise fall back to runtime lookup (for existing collections not in the current diff)\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n let collectionIdValue: string;\n\n if (isUsersCollection) {\n // Special case: users collection always uses the constant\n collectionIdValue = '\"_pb_users_auth_\"';\n } else if (collectionIdMap && collectionIdMap.has(field.relation.collection)) {\n // Use pre-generated ID from map\n collectionIdValue = `\"${collectionIdMap.get(field.relation.collection)}\"`;\n } else {\n // Fall back to runtime lookup for existing collections\n collectionIdValue = `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n }\n\n parts.push(` collectionId: ${collectionIdValue}`);\n\n // Always include maxSelect (default: 1)\n const maxSelect = field.relation.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include minSelect (default: null)\n const minSelect = field.relation.minSelect ?? null;\n parts.push(` minSelect: ${minSelect}`);\n\n // Always include cascadeDelete (default: false)\n const cascadeDelete = field.relation.cascadeDelete ?? false;\n parts.push(` cascadeDelete: ${cascadeDelete}`);\n }\n\n return parts.join(\",\\n\");\n}\n\n/**\n * Generates code for adding a field to an existing collection\n * Uses the appropriate Field constructor based on field type\n *\n * @param collectionName - Name of the collection\n * @param field - Field definition to add\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns JavaScript code for adding the field\n */\nexport function generateFieldAddition(\n collectionName: string,\n field: FieldDefinition,\n varName?: string,\n isLast: boolean = false,\n collectionIdMap?: Map<string, string>\n): string {\n const lines: string[] = [];\n const constructorName = getFieldConstructorName(field.type);\n const collectionVar = varName || `collection_${collectionName}_${field.name}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.add(new ${constructorName}({`);\n lines.push(generateFieldConstructorOptions(field, collectionIdMap));\n lines.push(` }));`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for modifying an existing field\n * Updates field properties based on detected changes\n *\n * @param collectionName - Name of the collection\n * @param modification - Field modification details\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for modifying the field\n */\nexport function generateFieldModification(\n collectionName: string,\n modification: FieldModification,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${modification.fieldName}`;\n const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${modification.fieldName}\");`);\n lines.push(``);\n\n // Apply each change\n for (const change of modification.changes) {\n if (change.property.startsWith(\"options.\")) {\n // Handle nested options properties\n const optionKey = change.property.replace(\"options.\", \"\");\n // In PocketBase, field properties are set directly on the field, not in an options object\n lines.push(` ${fieldVar}.${optionKey} = ${formatValue(change.newValue)};`);\n } else if (change.property.startsWith(\"relation.\")) {\n // Handle nested relation properties\n const relationKey = change.property.replace(\"relation.\", \"\");\n\n if (relationKey === \"collection\") {\n // Special handling for collection ID\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = String(change.newValue).toLowerCase() === \"users\";\n const collectionIdValue = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${change.newValue}\").id`;\n lines.push(` ${fieldVar}.collectionId = ${collectionIdValue};`);\n } else {\n lines.push(` ${fieldVar}.${relationKey} = ${formatValue(change.newValue)};`);\n }\n } else {\n // Handle top-level properties\n lines.push(` ${fieldVar}.${change.property} = ${formatValue(change.newValue)};`);\n }\n }\n\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a field from a collection\n *\n * @param collectionName - Name of the collection\n * @param fieldName - Name of the field to delete\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the field\n */\nexport function generateFieldDeletion(\n collectionName: string,\n fieldName: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${fieldName}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.removeByName(\"${fieldName}\");`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for adding an index to a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for adding the index\n */\nfunction generateIndexAddition(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.indexes.push(${JSON.stringify(index)});`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for removing an index from a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for removing the index\n */\nfunction generateIndexRemoval(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n const indexVar = `${collectionVar}_indexToRemove`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${indexVar} = ${collectionVar}.indexes.findIndex(idx => idx === ${JSON.stringify(index)});`);\n lines.push(` if (${indexVar} !== -1) {`);\n lines.push(` ${collectionVar}.indexes.splice(${indexVar}, 1);`);\n lines.push(` }`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection rules\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of rule to update\n * @param newValue - New rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the rule\n */\nfunction generateRuleUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection permissions\n * Handles permission rule updates including manageRule for auth collections\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of permission rule to update\n * @param newValue - New permission rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the permission\n */\nexport function generatePermissionUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a collection\n *\n * @param collectionName - Name of the collection to delete\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the collection\n */\nfunction generateCollectionDeletion(\n collectionName: string,\n varName: string = \"collection\",\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(isLast ? ` return app.delete(${varName});` : ` app.delete(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates the up migration code for a single collection operation\n * Handles create, modify, and delete operations\n *\n * @param operation - Collection operation to generate migration for\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns JavaScript code for up migration\n */\nexport function generateOperationUpMigration(\n operation: CollectionOperation,\n collectionIdMap: Map<string, string>\n): string {\n const lines: string[] = [];\n\n if (operation.type === \"create\") {\n // Handle collection creation\n const collection = operation.collection as CollectionSchema;\n const varName = `collection_${collection.name}`;\n lines.push(generateCollectionCreation(collection, varName, true, collectionIdMap));\n } else if (operation.type === \"modify\") {\n // Handle collection modification\n const modification = operation.modifications!;\n const collectionName =\n typeof operation.collection === \"string\"\n ? operation.collection\n : (operation.collection?.name ?? modification.collection);\n\n let operationCount = 0;\n const totalOperations =\n modification.fieldsToAdd.length +\n modification.fieldsToModify.length +\n modification.fieldsToRemove.length +\n modification.indexesToAdd.length +\n modification.indexesToRemove.length +\n modification.rulesToUpdate.length +\n modification.permissionsToUpdate.length;\n\n // Add new fields\n for (const field of modification.fieldsToAdd) {\n operationCount++;\n const varName = `collection_${collectionName}_add_${field.name}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldAddition(collectionName, field, varName, isLast, collectionIdMap));\n if (!isLast) lines.push(\"\");\n }\n\n // Modify existing fields\n for (const fieldMod of modification.fieldsToModify) {\n operationCount++;\n const varName = `collection_${collectionName}_modify_${fieldMod.fieldName}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldModification(collectionName, fieldMod, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Remove fields\n for (const field of modification.fieldsToRemove) {\n operationCount++;\n const varName = `collection_${collectionName}_remove_${field.name}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldDeletion(collectionName, field.name, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Add indexes\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n operationCount++;\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_addidx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexAddition(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Remove indexes\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n operationCount++;\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_rmidx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexRemoval(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Update permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n for (const permission of modification.permissionsToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_perm_${permission.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.newValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n } else if (modification.rulesToUpdate.length > 0) {\n for (const rule of modification.rulesToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_rule_${rule.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.newValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n }\n } else if (operation.type === \"delete\") {\n // Handle collection deletion\n const collectionName = typeof operation.collection === \"string\" ? operation.collection : operation.collection.name;\n const varName = `collection_${collectionName}`;\n lines.push(generateCollectionDeletion(collectionName, varName, true));\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Generates the down migration code for a single collection operation\n * Reverts the operation (inverse of up migration)\n *\n * @param operation - Collection operation to generate rollback for\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns JavaScript code for down migration\n */\nexport function generateOperationDownMigration(\n operation: CollectionOperation,\n collectionIdMap: Map<string, string>\n): string {\n const lines: string[] = [];\n\n if (operation.type === \"create\") {\n // Rollback: delete the created collection\n const collection = operation.collection as CollectionSchema;\n const varName = `collection_${collection.name}`;\n lines.push(generateCollectionDeletion(collection.name, varName, true));\n } else if (operation.type === \"modify\") {\n // Rollback: revert all modifications\n const modification = operation.modifications!;\n const collectionName =\n typeof operation.collection === \"string\"\n ? operation.collection\n : (operation.collection?.name ?? modification.collection);\n\n let operationCount = 0;\n const totalOperations =\n modification.fieldsToAdd.length +\n modification.fieldsToModify.length +\n modification.fieldsToRemove.length +\n modification.indexesToAdd.length +\n modification.indexesToRemove.length +\n modification.rulesToUpdate.length +\n modification.permissionsToUpdate.length;\n\n // Revert permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n for (const permission of modification.permissionsToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_revert_perm_${permission.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.oldValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n } else if (modification.rulesToUpdate.length > 0) {\n for (const rule of modification.rulesToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_revert_rule_${rule.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.oldValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n }\n\n // Revert index removals (add them back)\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n operationCount++;\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_restore_idx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexAddition(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert index additions (remove them)\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n operationCount++;\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_revert_idx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexRemoval(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert field removals (add them back)\n for (const field of modification.fieldsToRemove) {\n operationCount++;\n const varName = `collection_${collectionName}_restore_${field.name}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldAddition(collectionName, field, varName, isLast, collectionIdMap));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert field modifications\n for (const fieldMod of modification.fieldsToModify) {\n operationCount++;\n // Create a reverse modification\n const reverseChanges = fieldMod.changes.map((change) => ({\n property: change.property,\n oldValue: change.newValue,\n newValue: change.oldValue,\n }));\n\n const reverseMod: FieldModification = {\n fieldName: fieldMod.fieldName,\n currentDefinition: fieldMod.newDefinition,\n newDefinition: fieldMod.currentDefinition,\n changes: reverseChanges,\n };\n\n const varName = `collection_${collectionName}_revert_${fieldMod.fieldName}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldModification(collectionName, reverseMod, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert field additions (remove them)\n for (const field of modification.fieldsToAdd) {\n operationCount++;\n const varName = `collection_${collectionName}_revert_add_${field.name}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldDeletion(collectionName, field.name, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n } else if (operation.type === \"delete\") {\n // Rollback: recreate the deleted collection\n const collection = operation.collection;\n if (typeof collection !== \"string\") {\n const varName = `collection_${collection.name}`;\n lines.push(generateCollectionCreation(collection, varName, true, collectionIdMap));\n }\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Generates the up migration function code\n * Applies all changes from the diff in the correct order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for up migration\n */\nexport function generateUpMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // UP MIGRATION`);\n lines.push(``);\n\n // Build collection ID map from collections being created\n // This map will be used to resolve relation field references\n const collectionIdMap = new Map<string, string>();\n for (const collection of diff.collectionsToCreate) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n\n // 1. Create new collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Create new collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_create`;\n lines.push(generateCollectionCreation(collection, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // 2. Modify existing collections\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Modify existing collections`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Add new fields\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Add fields to ${collectionName}`);\n for (const field of modification.fieldsToAdd) {\n const varName = `collection_${collectionName}_add_${field.name}`;\n lines.push(generateFieldAddition(collectionName, field, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // Modify existing fields\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Modify fields in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n const varName = `collection_${collectionName}_modify_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, fieldMod, varName));\n lines.push(``);\n }\n }\n\n // Remove fields\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Remove fields from ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_remove_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n\n // Add indexes\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Add indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_addidx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Remove indexes\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_rmidx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Update permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Update permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.newValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Update rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.newValue, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Delete collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_delete`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes detected`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Generates the down migration function code\n * Reverts all changes from the diff in reverse order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for down migration\n */\nexport function generateDownMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // DOWN MIGRATION (ROLLBACK)`);\n lines.push(``);\n\n // Build collection ID map from collections being created (for rollback)\n // This map will be used to resolve relation field references\n const collectionIdMap = new Map<string, string>();\n for (const collection of diff.collectionsToCreate) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n // Also include deleted collections that might have IDs\n for (const collection of diff.collectionsToDelete) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n\n // Reverse order: delete -> modify -> create\n\n // 1. Recreate deleted collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Recreate deleted collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_recreate`;\n lines.push(generateCollectionCreation(collection, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // 2. Revert modifications (in reverse order)\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Revert modifications`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Revert permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Revert permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_revert_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.oldValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Revert rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_revert_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.oldValue, varName));\n lines.push(``);\n }\n }\n\n // Revert index removals (add them back)\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Restore indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_restore_idx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert index additions (remove them)\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_revert_idx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert field removals (add them back)\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Restore fields to ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_restore_${field.name}`;\n lines.push(generateFieldAddition(collectionName, field, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // Revert field modifications\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Revert field modifications in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n // Create a reverse modification\n const reverseChanges = fieldMod.changes.map((change) => ({\n property: change.property,\n oldValue: change.newValue,\n newValue: change.oldValue,\n }));\n\n const reverseMod: FieldModification = {\n fieldName: fieldMod.fieldName,\n currentDefinition: fieldMod.newDefinition,\n newDefinition: fieldMod.currentDefinition,\n changes: reverseChanges,\n };\n\n const varName = `collection_${collectionName}_revert_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, reverseMod, varName));\n lines.push(``);\n }\n }\n\n // Revert field additions (remove them)\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Remove added fields from ${collectionName}`);\n for (const field of modification.fieldsToAdd) {\n const varName = `collection_${collectionName}_revert_add_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete created collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Delete created collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_rollback`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes to revert`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Main generation function\n * Generates migration files from schema diff (one file per collection operation)\n *\n * @param diff - Schema diff containing all changes\n * @param config - Migration generator configuration\n * @returns Array of paths to the generated migration files\n */\nexport function generate(diff: SchemaDiff, config: MigrationGeneratorConfig | string): string[] {\n // Support legacy string-only parameter (migration directory)\n const normalizedConfig: MigrationGeneratorConfig = typeof config === \"string\" ? { migrationDir: config } : config;\n\n try {\n const migrationDir = resolveMigrationDir(normalizedConfig);\n\n // Check if there are any changes\n const hasChanges =\n diff.collectionsToCreate.length > 0 || diff.collectionsToModify.length > 0 || diff.collectionsToDelete.length > 0;\n\n // If no changes, return empty array\n if (!hasChanges) {\n return [];\n }\n\n // Build collection ID map from collections being created\n const collectionIdMap = new Map<string, string>();\n for (const collection of diff.collectionsToCreate) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n // Also include deleted collections that might have IDs (for rollback)\n for (const collection of diff.collectionsToDelete) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n\n // Generate base timestamp\n const baseTimestamp = generateTimestamp(normalizedConfig);\n\n // Split diff into individual collection operations\n const operations = splitDiffByCollection(diff, baseTimestamp);\n\n // Generate migration file for each operation\n const filePaths: string[] = [];\n\n for (const operation of operations) {\n // Generate up and down migration code for this operation\n const upCode = generateOperationUpMigration(operation, collectionIdMap);\n const downCode = generateOperationDownMigration(operation, collectionIdMap);\n\n // Create migration file structure\n const content = createMigrationFileStructure(upCode, downCode, normalizedConfig);\n\n // Generate filename for this operation\n const filename = generateCollectionMigrationFilename(operation);\n\n // Write migration file\n const filePath = writeMigrationFile(migrationDir, filename, content);\n\n filePaths.push(filePath);\n }\n\n return filePaths;\n } catch (error) {\n // If it's already a MigrationGenerationError or FileSystemError, re-throw it\n if (error instanceof MigrationGenerationError || error instanceof FileSystemError) {\n throw error;\n }\n\n // Otherwise, wrap it in a MigrationGenerationError\n throw new MigrationGenerationError(\n `Failed to generate migration: ${error instanceof Error ? error.message : String(error)}`,\n normalizedConfig.migrationDir,\n error as Error\n );\n }\n}\n\n/**\n * MigrationGenerator class for object-oriented usage\n * Provides a stateful interface for migration generation\n */\nexport class MigrationGenerator {\n private config: Required<MigrationGeneratorConfig>;\n\n constructor(config: MigrationGeneratorConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Generates migration files from a schema diff\n * Returns array of file paths (one per collection operation)\n */\n generate(diff: SchemaDiff): string[] {\n return generate(diff, this.config);\n }\n\n /**\n * Generates the up migration code without writing to file\n */\n generateUpMigration(diff: SchemaDiff): string {\n return generateUpMigration(diff);\n }\n\n /**\n * Generates the down migration code without writing to file\n */\n generateDownMigration(diff: SchemaDiff): string {\n return generateDownMigration(diff);\n }\n\n /**\n * Generates a migration filename\n */\n generateMigrationFilename(diff: SchemaDiff): string {\n return generateMigrationFilename(diff, this.config);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/migration/errors.ts","../../src/migration/generator.ts"],"names":["path"],"mappings":"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","file":"generator.js","sourcesContent":["/**\n * Custom error classes for migration tool\n * Provides specific error types for better error handling and user feedback\n */\n\n/**\n * Base error class for all migration-related errors\n */\nexport class MigrationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MigrationError\";\n Object.setPrototypeOf(this, MigrationError.prototype);\n }\n}\n\n/**\n * Error thrown when schema parsing fails\n * Used when Zod schemas cannot be parsed or are invalid\n */\nexport class SchemaParsingError extends MigrationError {\n public readonly filePath?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, filePath?: string, originalError?: Error) {\n super(message);\n this.name = \"SchemaParsingError\";\n this.filePath = filePath;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SchemaParsingError.prototype);\n }\n\n /**\n * Creates a formatted error message with file path and original error details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.filePath) {\n parts.push(`\\nFile: ${this.filePath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when snapshot operations fail\n * Used for snapshot file read/write/parse errors\n */\nexport class SnapshotError extends MigrationError {\n public readonly snapshotPath?: string;\n public readonly operation?: \"read\" | \"write\" | \"parse\" | \"validate\";\n public readonly originalError?: Error;\n\n constructor(\n message: string,\n snapshotPath?: string,\n operation?: \"read\" | \"write\" | \"parse\" | \"validate\",\n originalError?: Error\n ) {\n super(message);\n this.name = \"SnapshotError\";\n this.snapshotPath = snapshotPath;\n this.operation = operation;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SnapshotError.prototype);\n }\n\n /**\n * Creates a formatted error message with snapshot path and operation details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.operation) {\n parts.push(`\\nOperation: ${this.operation}`);\n }\n\n if (this.snapshotPath) {\n parts.push(`\\nSnapshot: ${this.snapshotPath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when migration file generation fails\n * Used when migration files cannot be created or written\n */\nexport class MigrationGenerationError extends MigrationError {\n public readonly migrationPath?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, migrationPath?: string, originalError?: Error) {\n super(message);\n this.name = \"MigrationGenerationError\";\n this.migrationPath = migrationPath;\n this.originalError = originalError;\n Object.setPrototypeOf(this, MigrationGenerationError.prototype);\n }\n\n /**\n * Creates a formatted error message with migration path and original error details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.migrationPath) {\n parts.push(`\\nMigration: ${this.migrationPath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when file system operations fail\n * Used for directory creation, file permissions, disk space issues\n */\nexport class FileSystemError extends MigrationError {\n public readonly path?: string;\n public readonly operation?: \"read\" | \"write\" | \"create\" | \"delete\" | \"access\";\n public readonly code?: string;\n public readonly originalError?: Error;\n\n constructor(\n message: string,\n path?: string,\n operation?: \"read\" | \"write\" | \"create\" | \"delete\" | \"access\",\n code?: string,\n originalError?: Error\n ) {\n super(message);\n this.name = \"FileSystemError\";\n this.path = path;\n this.operation = operation;\n this.code = code;\n this.originalError = originalError;\n Object.setPrototypeOf(this, FileSystemError.prototype);\n }\n\n /**\n * Creates a formatted error message with path, operation, and error code details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.operation) {\n parts.push(`\\nOperation: ${this.operation}`);\n }\n\n if (this.path) {\n parts.push(`\\nPath: ${this.path}`);\n }\n\n if (this.code) {\n parts.push(`\\nError Code: ${this.code}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n * Used for configuration file parsing, validation, and path resolution errors\n */\nexport class ConfigurationError extends MigrationError {\n public readonly configPath?: string;\n public readonly invalidFields?: string[];\n public readonly originalError?: Error;\n\n constructor(message: string, configPath?: string, invalidFields?: string[], originalError?: Error) {\n super(message);\n this.name = \"ConfigurationError\";\n this.configPath = configPath;\n this.invalidFields = invalidFields;\n this.originalError = originalError;\n Object.setPrototypeOf(this, ConfigurationError.prototype);\n }\n\n /**\n * Creates a formatted error message with configuration details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.configPath) {\n parts.push(`\\nConfiguration File: ${this.configPath}`);\n }\n\n if (this.invalidFields && this.invalidFields.length > 0) {\n parts.push(`\\nInvalid Fields: ${this.invalidFields.join(\", \")}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when CLI command usage is incorrect\n * Used for invalid arguments, missing required options, etc.\n */\nexport class CLIUsageError extends MigrationError {\n public readonly command?: string;\n public readonly suggestion?: string;\n\n constructor(message: string, command?: string, suggestion?: string) {\n super(message);\n this.name = \"CLIUsageError\";\n this.command = command;\n this.suggestion = suggestion;\n Object.setPrototypeOf(this, CLIUsageError.prototype);\n }\n\n /**\n * Creates a formatted error message with usage suggestions\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.command) {\n parts.push(`\\nCommand: ${this.command}`);\n }\n\n if (this.suggestion) {\n parts.push(`\\nSuggestion: ${this.suggestion}`);\n }\n\n return parts.join(\"\");\n }\n}\n","/**\n * Migration Generator component\n * Creates PocketBase migration files based on detected differences\n *\n * This module provides a standalone, configurable migration generator that can be used\n * by consumer projects to generate PocketBase-compatible migration files.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { FileSystemError, MigrationGenerationError } from \"./errors\";\nimport type { CollectionOperation, CollectionSchema, FieldDefinition, FieldModification, SchemaDiff } from \"./types\";\n\n/**\n * Configuration options for the migration generator\n */\nexport interface MigrationGeneratorConfig {\n /**\n * Directory to write migration files\n */\n migrationDir: string;\n\n /**\n * Workspace root for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * Custom timestamp generator function\n * Defaults to Unix timestamp in seconds\n */\n timestampGenerator?: () => string;\n\n /**\n * Custom migration file template\n * Use {{UP_CODE}} and {{DOWN_CODE}} placeholders\n */\n template?: string;\n\n /**\n * Whether to include type reference comment\n * Defaults to true\n */\n includeTypeReference?: boolean;\n\n /**\n * Path to types.d.ts file for reference comment\n * Defaults to '../pb_data/types.d.ts'\n */\n typesPath?: string;\n}\n\n/**\n * Default migration template\n */\nconst DEFAULT_TEMPLATE = `/// <reference path=\"{{TYPES_PATH}}\" />\nmigrate((app) => {\n{{UP_CODE}}\n}, (app) => {\n{{DOWN_CODE}}\n});\n`;\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Omit<Required<MigrationGeneratorConfig>, \"migrationDir\"> = {\n workspaceRoot: process.cwd(),\n timestampGenerator: () => Math.floor(Date.now() / 1000).toString(),\n template: DEFAULT_TEMPLATE,\n includeTypeReference: true,\n typesPath: \"../pb_data/types.d.ts\",\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config: MigrationGeneratorConfig): Required<MigrationGeneratorConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Resolves the migration directory path\n */\nfunction resolveMigrationDir(config: MigrationGeneratorConfig): string {\n const workspaceRoot = config.workspaceRoot || process.cwd();\n\n if (path.isAbsolute(config.migrationDir)) {\n return config.migrationDir;\n }\n\n return path.join(workspaceRoot, config.migrationDir);\n}\n\n/**\n * Generates a timestamp for migration filename\n * Format: Unix timestamp in seconds (e.g., 1687801090)\n *\n * @param config - Optional configuration with custom timestamp generator\n * @returns Timestamp string\n */\nexport function generateTimestamp(config?: MigrationGeneratorConfig): string {\n if (config?.timestampGenerator) {\n return config.timestampGenerator();\n }\n return Math.floor(Date.now() / 1000).toString();\n}\n\n/**\n * Splits a SchemaDiff into individual collection operations\n * Each operation will generate a separate migration file\n *\n * @param diff - Schema diff containing all changes\n * @param baseTimestamp - Base timestamp for the first operation\n * @returns Array of collection operations\n */\nexport function splitDiffByCollection(diff: SchemaDiff, baseTimestamp: string): CollectionOperation[] {\n const operations: CollectionOperation[] = [];\n let currentTimestamp = parseInt(baseTimestamp, 10);\n\n // Split collectionsToCreate into individual operations\n for (const collection of diff.collectionsToCreate) {\n operations.push({\n type: \"create\",\n collection: collection,\n timestamp: currentTimestamp.toString(),\n });\n currentTimestamp += 1; // Increment by 1 second\n }\n\n // Split collectionsToModify into individual operations\n for (const modification of diff.collectionsToModify) {\n operations.push({\n type: \"modify\",\n collection: modification.collection,\n modifications: modification,\n timestamp: currentTimestamp.toString(),\n });\n currentTimestamp += 1; // Increment by 1 second\n }\n\n // Split collectionsToDelete into individual operations\n for (const collection of diff.collectionsToDelete) {\n operations.push({\n type: \"delete\",\n collection: collection.name || collection, // Handle both object and string\n timestamp: currentTimestamp.toString(),\n });\n currentTimestamp += 1; // Increment by 1 second\n }\n\n return operations;\n}\n\n/**\n * Generates migration filename for a collection operation\n * Format: {timestamp}_{operation}_{collection_name}.js\n *\n * @param operation - Collection operation\n * @returns Migration filename\n */\nexport function generateCollectionMigrationFilename(operation: CollectionOperation): string {\n const timestamp = operation.timestamp;\n const operationType = operation.type === \"modify\" ? \"updated\" : operation.type === \"create\" ? \"created\" : \"deleted\";\n\n // Get collection name\n let collectionName: string;\n if (typeof operation.collection === \"string\") {\n collectionName = operation.collection;\n } else {\n collectionName = operation.collection.name;\n }\n\n // Sanitize collection name for filename (replace spaces and special chars with underscores)\n const sanitizedName = collectionName.replace(/[^a-zA-Z0-9_]/g, \"_\").toLowerCase();\n\n return `${timestamp}_${operationType}_${sanitizedName}.js`;\n}\n\n/**\n * Increments a timestamp by 1 second\n * Ensures sequential ordering of migration files\n *\n * @param timestamp - Current timestamp string\n * @returns Incremented timestamp string\n */\nexport function incrementTimestamp(timestamp: string): string {\n const currentTimestamp = parseInt(timestamp, 10);\n return (currentTimestamp + 1).toString();\n}\n\n/**\n * Generates a human-readable description from the diff\n * Creates a concise summary of the main changes\n *\n * @param diff - Schema diff containing all changes\n * @returns Description string for filename\n */\nexport function generateMigrationDescription(diff: SchemaDiff): string {\n const parts: string[] = [];\n\n // Summarize collection changes\n if (diff.collectionsToCreate.length > 0) {\n if (diff.collectionsToCreate.length === 1) {\n parts.push(`created_${diff.collectionsToCreate[0].name}`);\n } else {\n parts.push(`created_${diff.collectionsToCreate.length}_collections`);\n }\n }\n\n if (diff.collectionsToDelete.length > 0) {\n if (diff.collectionsToDelete.length === 1) {\n parts.push(`deleted_${diff.collectionsToDelete[0].name}`);\n } else {\n parts.push(`deleted_${diff.collectionsToDelete.length}_collections`);\n }\n }\n\n if (diff.collectionsToModify.length > 0) {\n if (diff.collectionsToModify.length === 1) {\n parts.push(`updated_${diff.collectionsToModify[0].collection}`);\n } else {\n parts.push(`updated_${diff.collectionsToModify.length}_collections`);\n }\n }\n\n // Default description if no changes\n if (parts.length === 0) {\n return \"no_changes\";\n }\n\n // Join parts with underscores and limit length\n let description = parts.join(\"_\");\n\n // Truncate if too long (keep under 100 chars for filename)\n if (description.length > 80) {\n description = description.substring(0, 77) + \"...\";\n }\n\n return description;\n}\n\n/**\n * Generates the migration filename\n * Format: {timestamp}_{description}.js\n *\n * @param diff - Schema diff containing all changes\n * @param config - Optional configuration\n * @returns Migration filename\n */\nexport function generateMigrationFilename(diff: SchemaDiff, config?: MigrationGeneratorConfig): string {\n const timestamp = generateTimestamp(config);\n const description = generateMigrationDescription(diff);\n\n return `${timestamp}_${description}.js`;\n}\n\n/**\n * Creates the migration file structure with up and down functions\n *\n * @param upCode - Code for the up migration\n * @param downCode - Code for the down migration\n * @param config - Optional configuration with custom template\n * @returns Complete migration file content\n */\nexport function createMigrationFileStructure(\n upCode: string,\n downCode: string,\n config?: MigrationGeneratorConfig\n): string {\n const mergedConfig = config ? mergeConfig(config) : DEFAULT_CONFIG;\n let template = mergedConfig.template;\n\n // Replace placeholders\n template = template.replace(\"{{TYPES_PATH}}\", mergedConfig.typesPath);\n template = template.replace(\"{{UP_CODE}}\", upCode);\n template = template.replace(\"{{DOWN_CODE}}\", downCode);\n\n // Remove type reference if disabled\n if (!mergedConfig.includeTypeReference) {\n template = template.replace(/\\/\\/\\/ <reference path=\"[^\"]*\" \\/>\\n?/, \"\");\n }\n\n return template;\n}\n\n/**\n * Writes migration file to the specified directory\n * Creates directory if it doesn't exist\n *\n * @param migrationDir - Directory to write migration file\n * @param filename - Migration filename\n * @param content - Migration file content\n * @returns Full path to the created migration file\n */\nexport function writeMigrationFile(migrationDir: string, filename: string, content: string): string {\n try {\n // Ensure migration directory exists\n if (!fs.existsSync(migrationDir)) {\n try {\n fs.mkdirSync(migrationDir, { recursive: true });\n } catch (error) {\n const fsError = error as NodeJS.ErrnoException;\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied creating migration directory. Check directory permissions.`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n throw new FileSystemError(\n `Failed to create migration directory: ${fsError.message}`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n }\n\n // Full path to migration file\n const filePath = path.join(migrationDir, filename);\n\n // Write migration file\n fs.writeFileSync(filePath, content, \"utf-8\");\n\n return filePath;\n } catch (error) {\n // If it's already a FileSystemError, re-throw it\n if (error instanceof FileSystemError) {\n throw error;\n }\n\n const fsError = error as NodeJS.ErrnoException;\n const filePath = path.join(migrationDir, filename);\n\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied writing migration file. Check file and directory permissions.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n } else if (fsError.code === \"ENOSPC\") {\n throw new FileSystemError(\n `No space left on device when writing migration file.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n }\n\n throw new MigrationGenerationError(`Failed to write migration file: ${fsError.message}`, filePath, error as Error);\n }\n}\n\n/**\n * Formats a value for JavaScript code generation\n * Handles strings, numbers, booleans, null, arrays, and objects\n *\n * @param value - Value to format\n * @returns Formatted string representation\n */\nfunction formatValue(value: any): string {\n if (value === null || value === undefined) {\n return \"null\";\n }\n\n if (typeof value === \"string\") {\n // Use JSON.stringify to properly escape all special characters\n return JSON.stringify(value);\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n // Use JSON.stringify for arrays to properly handle all special characters\n // Then format with spaces after commas to match expected test output\n return JSON.stringify(value).replace(/\",\"/g, '\", \"');\n }\n\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\n .filter(([_k, v]) => v !== undefined) // Omit undefined values\n .map(([k, v]) => `${k}: ${formatValue(v)}`)\n .join(\", \");\n return `{ ${entries} }`;\n }\n\n return String(value);\n}\n\n/**\n * Generates field definition object for collection creation\n * Creates the field configuration object used in Collection constructor\n *\n * @param field - Field definition\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns Field definition object as string\n */\nexport function generateFieldDefinitionObject(field: FieldDefinition, collectionIdMap?: Map<string, string>): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add field type\n parts.push(` type: \"${field.type}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add explicit defaults for select fields\n if (field.type === \"select\") {\n // Always include maxSelect (default: 1)\n const maxSelect = field.options?.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include values array (default: [])\n const values = field.options?.values ?? [];\n parts.push(` values: ${formatValue(values)}`);\n }\n\n // Add options if present (excluding select-specific options already handled)\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n // Skip select-specific options as they're handled above\n if (field.type === \"select\" && (key === \"maxSelect\" || key === \"values\")) {\n continue;\n }\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation configuration if present\n if (field.relation) {\n // Use pre-generated collection ID from map if available\n // Otherwise fall back to runtime lookup (for existing collections not in the current diff)\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n let collectionIdValue: string;\n\n if (isUsersCollection) {\n // Special case: users collection always uses the constant\n collectionIdValue = '\"_pb_users_auth_\"';\n } else if (collectionIdMap && collectionIdMap.has(field.relation.collection)) {\n // Use pre-generated ID from map\n collectionIdValue = `\"${collectionIdMap.get(field.relation.collection)}\"`;\n } else {\n // Fall back to runtime lookup for existing collections\n collectionIdValue = `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n }\n\n parts.push(` collectionId: ${collectionIdValue}`);\n\n // Always include maxSelect (default: 1)\n const maxSelect = field.relation.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include minSelect (default: null)\n const minSelect = field.relation.minSelect ?? null;\n parts.push(` minSelect: ${minSelect}`);\n\n // Always include cascadeDelete (default: false)\n const cascadeDelete = field.relation.cascadeDelete ?? false;\n parts.push(` cascadeDelete: ${cascadeDelete}`);\n }\n\n return ` {\\n${parts.join(\",\\n\")},\\n }`;\n}\n\n/**\n * Generates fields array for collection creation\n *\n * @param fields - Array of field definitions\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns Fields array as string\n */\nexport function generateFieldsArray(fields: FieldDefinition[], collectionIdMap?: Map<string, string>): string {\n if (fields.length === 0) {\n return \"[]\";\n }\n\n const fieldObjects = fields.map((field) => generateFieldDefinitionObject(field, collectionIdMap));\n return `[\\n${fieldObjects.join(\",\\n\")},\\n ]`;\n}\n\n/**\n * Generates collection rules object\n *\n * @param rules - Collection rules\n * @returns Rules configuration as string\n */\nexport function generateCollectionRules(rules?: CollectionSchema[\"rules\"]): string {\n if (!rules) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (rules.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(rules.listRule)}`);\n }\n\n if (rules.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(rules.viewRule)}`);\n }\n\n if (rules.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(rules.createRule)}`);\n }\n\n if (rules.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(rules.updateRule)}`);\n }\n\n if (rules.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(rules.deleteRule)}`);\n }\n\n if (rules.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(rules.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates collection permissions object\n * Permissions are the same as rules but extracted from schema metadata\n *\n * @param permissions - Collection permissions\n * @returns Permissions configuration as string\n */\nexport function generateCollectionPermissions(permissions?: CollectionSchema[\"permissions\"]): string {\n if (!permissions) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (permissions.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(permissions.listRule)}`);\n }\n\n if (permissions.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(permissions.viewRule)}`);\n }\n\n if (permissions.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(permissions.createRule)}`);\n }\n\n if (permissions.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(permissions.updateRule)}`);\n }\n\n if (permissions.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(permissions.deleteRule)}`);\n }\n\n if (permissions.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(permissions.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates indexes array for collection creation\n *\n * @param indexes - Array of index definitions\n * @returns Indexes array as string\n */\nexport function generateIndexesArray(indexes?: string[]): string {\n if (!indexes || indexes.length === 0) {\n return \"[]\";\n }\n\n const indexStrings = indexes.map((idx) => JSON.stringify(idx));\n return `[\\n ${indexStrings.join(\",\\n \")},\\n ]`;\n}\n\n/**\n * Generates Collection constructor call for creating a new collection\n *\n * @param collection - Collection schema\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @returns JavaScript code for creating the collection\n */\n/**\n * Generates system fields that are required for all PocketBase collections\n * These fields (id, created, updated) must be explicitly included in migrations\n *\n * @returns Array of system field definitions\n */\nfunction getSystemFields(): FieldDefinition[] {\n return [\n // id field - primary key, auto-generated\n {\n name: \"id\",\n type: \"text\",\n required: true,\n options: {\n autogeneratePattern: \"[a-z0-9]{15}\",\n hidden: false,\n id: \"text3208210256\",\n max: 15,\n min: 15,\n pattern: \"^[a-z0-9]+$\",\n presentable: false,\n primaryKey: true,\n system: true,\n },\n },\n // created field - autodate, set on creation\n {\n name: \"created\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate2990389176\",\n onCreate: true,\n onUpdate: false,\n presentable: false,\n system: false,\n },\n },\n // updated field - autodate, set on creation and update\n {\n name: \"updated\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate3332085495\",\n onCreate: true,\n onUpdate: true,\n presentable: false,\n system: false,\n },\n },\n ];\n}\n\nexport function generateCollectionCreation(\n collection: CollectionSchema,\n varName: string = \"collection\",\n isLast: boolean = false,\n collectionIdMap?: Map<string, string>\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = new Collection({`);\n if (collection.id) {\n lines.push(` id: ${formatValue(collection.id)},`);\n }\n lines.push(` name: \"${collection.name}\",`);\n lines.push(` type: \"${collection.type}\",`);\n\n // Add permissions (preferred) or rules\n // Permissions take precedence if both are defined\n const permissionsCode = generateCollectionPermissions(collection.permissions);\n const rulesCode = generateCollectionRules(collection.rules);\n\n if (permissionsCode) {\n lines.push(` ${permissionsCode},`);\n } else if (rulesCode) {\n lines.push(` ${rulesCode},`);\n }\n\n // Prepend system fields (id, created, updated) to user-defined fields\n // These fields are required by PocketBase and must be explicitly included in migrations\n const systemFields = getSystemFields();\n const allFields = [...systemFields, ...collection.fields];\n\n // Add fields\n lines.push(` fields: ${generateFieldsArray(allFields, collectionIdMap)},`);\n\n // Add indexes\n lines.push(` indexes: ${generateIndexesArray(collection.indexes)},`);\n\n lines.push(` });`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${varName});` : ` app.save(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Gets the appropriate Field constructor name for a field type\n *\n * @param fieldType - PocketBase field type\n * @returns Field constructor name\n */\nfunction getFieldConstructorName(fieldType: string): string {\n const constructorMap: Record<string, string> = {\n text: \"TextField\",\n email: \"EmailField\",\n url: \"URLField\",\n number: \"NumberField\",\n bool: \"BoolField\",\n date: \"DateField\",\n select: \"SelectField\",\n relation: \"RelationField\",\n file: \"FileField\",\n json: \"JSONField\",\n };\n\n return constructorMap[fieldType] || \"TextField\";\n}\n\n/**\n * Generates field constructor options object\n *\n * @param field - Field definition\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns Options object as string\n */\nfunction generateFieldConstructorOptions(field: FieldDefinition, collectionIdMap?: Map<string, string>): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add explicit defaults for select fields\n if (field.type === \"select\") {\n // Always include maxSelect (default: 1)\n const maxSelect = field.options?.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include values array (default: [])\n const values = field.options?.values ?? [];\n parts.push(` values: ${formatValue(values)}`);\n }\n\n // Add options if present (excluding select-specific options already handled)\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n // Skip select-specific options as they're handled above\n if (field.type === \"select\" && (key === \"maxSelect\" || key === \"values\")) {\n continue;\n }\n // Convert noDecimal to onlyInt for number fields (PocketBase uses onlyInt)\n if (field.type === \"number\" && key === \"noDecimal\") {\n parts.push(` onlyInt: ${formatValue(value)}`);\n } else {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n }\n\n // Add relation-specific options\n if (field.relation && field.type === \"relation\") {\n // Use pre-generated collection ID from map if available\n // Otherwise fall back to runtime lookup (for existing collections not in the current diff)\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n let collectionIdValue: string;\n\n if (isUsersCollection) {\n // Special case: users collection always uses the constant\n collectionIdValue = '\"_pb_users_auth_\"';\n } else if (collectionIdMap && collectionIdMap.has(field.relation.collection)) {\n // Use pre-generated ID from map\n collectionIdValue = `\"${collectionIdMap.get(field.relation.collection)}\"`;\n } else {\n // Fall back to runtime lookup for existing collections\n collectionIdValue = `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n }\n\n parts.push(` collectionId: ${collectionIdValue}`);\n\n // Always include maxSelect (default: 1)\n const maxSelect = field.relation.maxSelect ?? 1;\n parts.push(` maxSelect: ${maxSelect}`);\n\n // Always include minSelect (default: null)\n const minSelect = field.relation.minSelect ?? null;\n parts.push(` minSelect: ${minSelect}`);\n\n // Always include cascadeDelete (default: false)\n const cascadeDelete = field.relation.cascadeDelete ?? false;\n parts.push(` cascadeDelete: ${cascadeDelete}`);\n }\n\n return parts.join(\",\\n\");\n}\n\n/**\n * Generates code for adding a field to an existing collection\n * Uses the appropriate Field constructor based on field type\n *\n * @param collectionName - Name of the collection\n * @param field - Field definition to add\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns JavaScript code for adding the field\n */\nexport function generateFieldAddition(\n collectionName: string,\n field: FieldDefinition,\n varName?: string,\n isLast: boolean = false,\n collectionIdMap?: Map<string, string>\n): string {\n const lines: string[] = [];\n const constructorName = getFieldConstructorName(field.type);\n const collectionVar = varName || `collection_${collectionName}_${field.name}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.add(new ${constructorName}({`);\n lines.push(generateFieldConstructorOptions(field, collectionIdMap));\n lines.push(` }));`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for modifying an existing field\n * Updates field properties based on detected changes\n *\n * @param collectionName - Name of the collection\n * @param modification - Field modification details\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for modifying the field\n */\nexport function generateFieldModification(\n collectionName: string,\n modification: FieldModification,\n varName?: string,\n isLast: boolean = false,\n collectionIdMap?: Map<string, string>\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${modification.fieldName}`;\n const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${modification.fieldName}\");`);\n lines.push(``);\n\n // Apply each change\n for (const change of modification.changes) {\n if (change.property.startsWith(\"options.\")) {\n // Handle nested options properties\n const optionKey = change.property.replace(\"options.\", \"\");\n // In PocketBase, field properties are set directly on the field, not in an options object\n lines.push(` ${fieldVar}.${optionKey} = ${formatValue(change.newValue)};`);\n } else if (change.property.startsWith(\"relation.\")) {\n // Handle nested relation properties\n const relationKey = change.property.replace(\"relation.\", \"\");\n\n if (relationKey === \"collection\") {\n // Special handling for collection ID\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = String(change.newValue).toLowerCase() === \"users\";\n let collectionIdValue: string;\n\n if (isUsersCollection) {\n collectionIdValue = '\"_pb_users_auth_\"';\n } else if (collectionIdMap && collectionIdMap.has(String(change.newValue))) {\n // Use pre-generated ID from map (for existing collections)\n collectionIdValue = `\"${collectionIdMap.get(String(change.newValue))}\"`;\n } else {\n // Fall back to runtime lookup (should not happen if snapshot is properly loaded)\n collectionIdValue = `app.findCollectionByNameOrId(\"${change.newValue}\").id`;\n }\n lines.push(` ${fieldVar}.collectionId = ${collectionIdValue};`);\n } else {\n lines.push(` ${fieldVar}.${relationKey} = ${formatValue(change.newValue)};`);\n }\n } else {\n // Handle top-level properties\n lines.push(` ${fieldVar}.${change.property} = ${formatValue(change.newValue)};`);\n }\n }\n\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a field from a collection\n *\n * @param collectionName - Name of the collection\n * @param fieldName - Name of the field to delete\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the field\n */\nexport function generateFieldDeletion(\n collectionName: string,\n fieldName: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${fieldName}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.removeByName(\"${fieldName}\");`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for adding an index to a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for adding the index\n */\nfunction generateIndexAddition(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.indexes.push(${JSON.stringify(index)});`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for removing an index from a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for removing the index\n */\nfunction generateIndexRemoval(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n const indexVar = `${collectionVar}_indexToRemove`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${indexVar} = ${collectionVar}.indexes.findIndex(idx => idx === ${JSON.stringify(index)});`);\n lines.push(` if (${indexVar} !== -1) {`);\n lines.push(` ${collectionVar}.indexes.splice(${indexVar}, 1);`);\n lines.push(` }`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection rules\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of rule to update\n * @param newValue - New rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the rule\n */\nfunction generateRuleUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection permissions\n * Handles permission rule updates including manageRule for auth collections\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of permission rule to update\n * @param newValue - New permission rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the permission\n */\nexport function generatePermissionUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a collection\n *\n * @param collectionName - Name of the collection to delete\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the collection\n */\nfunction generateCollectionDeletion(\n collectionName: string,\n varName: string = \"collection\",\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(isLast ? ` return app.delete(${varName});` : ` app.delete(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates the up migration code for a single collection operation\n * Handles create, modify, and delete operations\n *\n * @param operation - Collection operation to generate migration for\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns JavaScript code for up migration\n */\nexport function generateOperationUpMigration(\n operation: CollectionOperation,\n collectionIdMap: Map<string, string>\n): string {\n const lines: string[] = [];\n\n if (operation.type === \"create\") {\n // Handle collection creation\n const collection = operation.collection as CollectionSchema;\n const varName = `collection_${collection.name}`;\n lines.push(generateCollectionCreation(collection, varName, true, collectionIdMap));\n } else if (operation.type === \"modify\") {\n // Handle collection modification\n const modification = operation.modifications!;\n const collectionName =\n typeof operation.collection === \"string\"\n ? operation.collection\n : (operation.collection?.name ?? modification.collection);\n\n let operationCount = 0;\n const totalOperations =\n modification.fieldsToAdd.length +\n modification.fieldsToModify.length +\n modification.fieldsToRemove.length +\n modification.indexesToAdd.length +\n modification.indexesToRemove.length +\n modification.rulesToUpdate.length +\n modification.permissionsToUpdate.length;\n\n // Add new fields\n for (let i = 0; i < modification.fieldsToAdd.length; i++) {\n const field = modification.fieldsToAdd[i];\n operationCount++;\n const varName = `collection_${collectionName}_add_${field.name}_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldAddition(collectionName, field, varName, isLast, collectionIdMap));\n if (!isLast) lines.push(\"\");\n }\n\n // Modify existing fields\n for (const fieldMod of modification.fieldsToModify) {\n operationCount++;\n const varName = `collection_${collectionName}_modify_${fieldMod.fieldName}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldModification(collectionName, fieldMod, varName, isLast, collectionIdMap));\n if (!isLast) lines.push(\"\");\n }\n\n // Remove fields\n for (const field of modification.fieldsToRemove) {\n operationCount++;\n const varName = `collection_${collectionName}_remove_${field.name}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldDeletion(collectionName, field.name, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Add indexes\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n operationCount++;\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_addidx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexAddition(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Remove indexes\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n operationCount++;\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_rmidx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexRemoval(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Update permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n for (const permission of modification.permissionsToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_perm_${permission.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.newValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n } else if (modification.rulesToUpdate.length > 0) {\n for (const rule of modification.rulesToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_rule_${rule.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.newValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n }\n } else if (operation.type === \"delete\") {\n // Handle collection deletion\n const collectionName = typeof operation.collection === \"string\" ? operation.collection : operation.collection.name;\n const varName = `collection_${collectionName}`;\n lines.push(generateCollectionDeletion(collectionName, varName, true));\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Generates the down migration code for a single collection operation\n * Reverts the operation (inverse of up migration)\n *\n * @param operation - Collection operation to generate rollback for\n * @param collectionIdMap - Map of collection names to their pre-generated IDs\n * @returns JavaScript code for down migration\n */\nexport function generateOperationDownMigration(\n operation: CollectionOperation,\n collectionIdMap: Map<string, string>\n): string {\n const lines: string[] = [];\n\n if (operation.type === \"create\") {\n // Rollback: delete the created collection\n const collection = operation.collection as CollectionSchema;\n const varName = `collection_${collection.name}`;\n lines.push(generateCollectionDeletion(collection.name, varName, true));\n } else if (operation.type === \"modify\") {\n // Rollback: revert all modifications\n const modification = operation.modifications!;\n const collectionName =\n typeof operation.collection === \"string\"\n ? operation.collection\n : (operation.collection?.name ?? modification.collection);\n\n let operationCount = 0;\n const totalOperations =\n modification.fieldsToAdd.length +\n modification.fieldsToModify.length +\n modification.fieldsToRemove.length +\n modification.indexesToAdd.length +\n modification.indexesToRemove.length +\n modification.rulesToUpdate.length +\n modification.permissionsToUpdate.length;\n\n // Revert permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n for (const permission of modification.permissionsToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_revert_perm_${permission.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.oldValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n } else if (modification.rulesToUpdate.length > 0) {\n for (const rule of modification.rulesToUpdate) {\n operationCount++;\n const varName = `collection_${collectionName}_revert_rule_${rule.ruleType}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.oldValue, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n }\n\n // Revert index removals (add them back)\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n operationCount++;\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_restore_idx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexAddition(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert index additions (remove them)\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n operationCount++;\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_revert_idx_${i}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateIndexRemoval(collectionName, index, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert field removals (add them back)\n for (const field of modification.fieldsToRemove) {\n operationCount++;\n const varName = `collection_${collectionName}_restore_${field.name}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldAddition(collectionName, field, varName, isLast, collectionIdMap));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert field modifications\n for (const fieldMod of modification.fieldsToModify) {\n operationCount++;\n // Create a reverse modification\n const reverseChanges = fieldMod.changes.map((change) => ({\n property: change.property,\n oldValue: change.newValue,\n newValue: change.oldValue,\n }));\n\n const reverseMod: FieldModification = {\n fieldName: fieldMod.fieldName,\n currentDefinition: fieldMod.newDefinition,\n newDefinition: fieldMod.currentDefinition,\n changes: reverseChanges,\n };\n\n const varName = `collection_${collectionName}_revert_${fieldMod.fieldName}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldModification(collectionName, reverseMod, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n\n // Revert field additions (remove them)\n for (const field of modification.fieldsToAdd) {\n operationCount++;\n const varName = `collection_${collectionName}_revert_add_${field.name}`;\n const isLast = operationCount === totalOperations;\n lines.push(generateFieldDeletion(collectionName, field.name, varName, isLast));\n if (!isLast) lines.push(\"\");\n }\n } else if (operation.type === \"delete\") {\n // Rollback: recreate the deleted collection\n const collection = operation.collection;\n if (typeof collection !== \"string\") {\n const varName = `collection_${collection.name}`;\n lines.push(generateCollectionCreation(collection, varName, true, collectionIdMap));\n }\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Generates the up migration function code\n * Applies all changes from the diff in the correct order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for up migration\n */\nexport function generateUpMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // UP MIGRATION`);\n lines.push(``);\n\n // Build collection ID map from collections being created and existing collections\n // This map will be used to resolve relation field references\n const collectionIdMap = new Map<string, string>();\n for (const collection of diff.collectionsToCreate) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n // Add existing collection IDs from snapshot (for relation fields referencing existing collections)\n if (diff.existingCollectionIds) {\n for (const [name, id] of diff.existingCollectionIds) {\n collectionIdMap.set(name, id);\n }\n }\n\n // 1. Create new collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Create new collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_create`;\n lines.push(generateCollectionCreation(collection, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // 2. Modify existing collections\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Modify existing collections`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Add new fields\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Add fields to ${collectionName}`);\n for (let i = 0; i < modification.fieldsToAdd.length; i++) {\n const field = modification.fieldsToAdd[i];\n const varName = `collection_${collectionName}_add_${field.name}_${i}`;\n lines.push(generateFieldAddition(collectionName, field, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // Modify existing fields\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Modify fields in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n const varName = `collection_${collectionName}_modify_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, fieldMod, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // Remove fields\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Remove fields from ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_remove_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n\n // Add indexes\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Add indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_addidx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Remove indexes\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_rmidx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Update permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Update permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.newValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Update rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.newValue, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Delete collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_delete`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes detected`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Generates the down migration function code\n * Reverts all changes from the diff in reverse order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for down migration\n */\nexport function generateDownMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // DOWN MIGRATION (ROLLBACK)`);\n lines.push(``);\n\n // Build collection ID map from collections being created (for rollback)\n // This map will be used to resolve relation field references\n const collectionIdMap = new Map<string, string>();\n for (const collection of diff.collectionsToCreate) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n // Also include deleted collections that might have IDs\n for (const collection of diff.collectionsToDelete) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n // Add existing collection IDs from snapshot (for relation fields referencing existing collections)\n if (diff.existingCollectionIds) {\n for (const [name, id] of diff.existingCollectionIds) {\n collectionIdMap.set(name, id);\n }\n }\n\n // Reverse order: delete -> modify -> create\n\n // 1. Recreate deleted collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Recreate deleted collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_recreate`;\n lines.push(generateCollectionCreation(collection, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // 2. Revert modifications (in reverse order)\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Revert modifications`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Revert permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Revert permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_revert_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.oldValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Revert rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_revert_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.oldValue, varName));\n lines.push(``);\n }\n }\n\n // Revert index removals (add them back)\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Restore indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_restore_idx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert index additions (remove them)\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_revert_idx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert field removals (add them back)\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Restore fields to ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_restore_${field.name}`;\n lines.push(generateFieldAddition(collectionName, field, varName, false, collectionIdMap));\n lines.push(``);\n }\n }\n\n // Revert field modifications\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Revert field modifications in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n // Create a reverse modification\n const reverseChanges = fieldMod.changes.map((change) => ({\n property: change.property,\n oldValue: change.newValue,\n newValue: change.oldValue,\n }));\n\n const reverseMod: FieldModification = {\n fieldName: fieldMod.fieldName,\n currentDefinition: fieldMod.newDefinition,\n newDefinition: fieldMod.currentDefinition,\n changes: reverseChanges,\n };\n\n const varName = `collection_${collectionName}_revert_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, reverseMod, varName));\n lines.push(``);\n }\n }\n\n // Revert field additions (remove them)\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Remove added fields from ${collectionName}`);\n for (const field of modification.fieldsToAdd) {\n const varName = `collection_${collectionName}_revert_add_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete created collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Delete created collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_rollback`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes to revert`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Check if there's already a return statement in the code\n // If so, skip post-processing to avoid duplicate returns\n const hasReturnStatement = /return\\s+app\\.(save|delete)\\(/m.test(code);\n\n if (!hasReturnStatement) {\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n }\n\n return code;\n}\n\n/**\n * Main generation function\n * Generates migration files from schema diff (one file per collection operation)\n *\n * @param diff - Schema diff containing all changes\n * @param config - Migration generator configuration\n * @returns Array of paths to the generated migration files\n */\nexport function generate(diff: SchemaDiff, config: MigrationGeneratorConfig | string): string[] {\n // Support legacy string-only parameter (migration directory)\n const normalizedConfig: MigrationGeneratorConfig = typeof config === \"string\" ? { migrationDir: config } : config;\n\n try {\n const migrationDir = resolveMigrationDir(normalizedConfig);\n\n // Check if there are any changes\n const hasChanges =\n diff.collectionsToCreate.length > 0 || diff.collectionsToModify.length > 0 || diff.collectionsToDelete.length > 0;\n\n // If no changes, return empty array\n if (!hasChanges) {\n return [];\n }\n\n // Build collection ID map from collections being created\n const collectionIdMap = new Map<string, string>();\n for (const collection of diff.collectionsToCreate) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n // Also include deleted collections that might have IDs (for rollback)\n for (const collection of diff.collectionsToDelete) {\n if (collection.id) {\n collectionIdMap.set(collection.name, collection.id);\n }\n }\n // Add existing collection IDs from snapshot (for relation fields referencing existing collections)\n if (diff.existingCollectionIds) {\n for (const [name, id] of diff.existingCollectionIds) {\n collectionIdMap.set(name, id);\n }\n }\n\n // Generate base timestamp\n const baseTimestamp = generateTimestamp(normalizedConfig);\n\n // Split diff into individual collection operations\n const operations = splitDiffByCollection(diff, baseTimestamp);\n\n // Generate migration file for each operation\n const filePaths: string[] = [];\n\n for (const operation of operations) {\n // Generate up and down migration code for this operation\n const upCode = generateOperationUpMigration(operation, collectionIdMap);\n const downCode = generateOperationDownMigration(operation, collectionIdMap);\n\n // Create migration file structure\n const content = createMigrationFileStructure(upCode, downCode, normalizedConfig);\n\n // Generate filename for this operation\n const filename = generateCollectionMigrationFilename(operation);\n\n // Write migration file\n const filePath = writeMigrationFile(migrationDir, filename, content);\n\n filePaths.push(filePath);\n }\n\n return filePaths;\n } catch (error) {\n // If it's already a MigrationGenerationError or FileSystemError, re-throw it\n if (error instanceof MigrationGenerationError || error instanceof FileSystemError) {\n throw error;\n }\n\n // Otherwise, wrap it in a MigrationGenerationError\n throw new MigrationGenerationError(\n `Failed to generate migration: ${error instanceof Error ? error.message : String(error)}`,\n normalizedConfig.migrationDir,\n error as Error\n );\n }\n}\n\n/**\n * MigrationGenerator class for object-oriented usage\n * Provides a stateful interface for migration generation\n */\nexport class MigrationGenerator {\n private config: Required<MigrationGeneratorConfig>;\n\n constructor(config: MigrationGeneratorConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Generates migration files from a schema diff\n * Returns array of file paths (one per collection operation)\n */\n generate(diff: SchemaDiff): string[] {\n return generate(diff, this.config);\n }\n\n /**\n * Generates the up migration code without writing to file\n */\n generateUpMigration(diff: SchemaDiff): string {\n return generateUpMigration(diff);\n }\n\n /**\n * Generates the down migration code without writing to file\n */\n generateDownMigration(diff: SchemaDiff): string {\n return generateDownMigration(diff);\n }\n\n /**\n * Generates a migration filename\n */\n generateMigrationFilename(diff: SchemaDiff): string {\n return generateMigrationFilename(diff, this.config);\n }\n}\n"]}
|