pocketbase-zod-schema 0.2.1 → 0.2.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 +14 -0
- package/dist/cli/index.cjs +94 -10
- package/dist/cli/index.cjs.map +1 -1
- package/dist/cli/index.js +94 -10
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/migrate.cjs +94 -10
- package/dist/cli/migrate.cjs.map +1 -1
- package/dist/cli/migrate.js +94 -10
- package/dist/cli/migrate.js.map +1 -1
- package/dist/index.cjs +100 -12
- 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 +100 -12
- package/dist/index.js.map +1 -1
- package/dist/migration/analyzer.cjs +36 -7
- package/dist/migration/analyzer.cjs.map +1 -1
- package/dist/migration/analyzer.d.cts +26 -3
- package/dist/migration/analyzer.d.ts +26 -3
- package/dist/migration/analyzer.js +36 -8
- package/dist/migration/analyzer.js.map +1 -1
- package/dist/migration/diff.cjs +7 -2
- package/dist/migration/diff.cjs.map +1 -1
- package/dist/migration/diff.js +7 -2
- package/dist/migration/diff.js.map +1 -1
- package/dist/migration/generator.cjs +52 -1
- package/dist/migration/generator.cjs.map +1 -1
- package/dist/migration/generator.d.cts +0 -7
- package/dist/migration/generator.d.ts +0 -7
- package/dist/migration/generator.js +52 -1
- package/dist/migration/generator.js.map +1 -1
- package/dist/migration/index.cjs +94 -10
- package/dist/migration/index.cjs.map +1 -1
- package/dist/migration/index.js +94 -10
- package/dist/migration/index.js.map +1 -1
- package/dist/migration/snapshot.cjs.map +1 -1
- package/dist/migration/snapshot.js.map +1 -1
- package/dist/mutator.cjs +9 -3
- package/dist/mutator.cjs.map +1 -1
- package/dist/mutator.d.cts +3 -1
- package/dist/mutator.d.ts +3 -1
- package/dist/mutator.js +9 -3
- package/dist/mutator.js.map +1 -1
- package/dist/schema.cjs +9 -3
- package/dist/schema.cjs.map +1 -1
- package/dist/schema.d.cts +32 -3
- package/dist/schema.d.ts +32 -3
- package/dist/schema.js +9 -3
- package/dist/schema.js.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/{user-DTJQIj4K.d.cts → user-BnFWg5tw.d.cts} +13 -1
- package/dist/{user-DTJQIj4K.d.ts → user-BnFWg5tw.d.ts} +13 -1
- 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 { 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 * 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 // Escape quotes and special characters\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\")}\"`;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((v) => formatValue(v)).join(\", \");\n return `[${items}]`;\n }\n\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\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 * @returns Field definition object as string\n */\nexport function generateFieldDefinitionObject(field: FieldDefinition): 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 options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation configuration if present\n if (field.relation) {\n // For relation fields, we need to resolve the collection ID\n // For now, we'll use a placeholder that needs to be resolved at runtime\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\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 * @returns Fields array as string\n */\nexport function generateFieldsArray(fields: FieldDefinition[]): string {\n if (fields.length === 0) {\n return \"[]\";\n }\n\n const fieldObjects = fields.map((field) => generateFieldDefinitionObject(field));\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) => `\"${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 */\nexport function generateCollectionCreation(\n collection: CollectionSchema,\n varName: string = \"collection\",\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = new Collection({`);\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 // Add fields\n lines.push(` fields: ${generateFieldsArray(collection.fields)},`);\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 * @returns Options object as string\n */\nfunction generateFieldConstructorOptions(field: FieldDefinition): 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 options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation-specific options\n if (field.relation && field.type === \"relation\") {\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\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 * @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): 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));\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 const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${fieldName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.remove(${fieldVar}.id);`);\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(\"${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 === \"${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 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 // 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));\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));\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 // 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 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 // 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));\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));\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 // 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 return code;\n}\n\n/**\n * Main generation function\n * Generates complete migration file from schema diff\n *\n * @param diff - Schema diff containing all changes\n * @param config - Migration generator configuration\n * @returns Path to the generated migration file\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 // Generate up and down migration code\n const upCode = generateUpMigration(diff);\n const downCode = generateDownMigration(diff);\n\n // Create migration file structure\n const content = createMigrationFileStructure(upCode, downCode, normalizedConfig);\n\n // Generate filename\n const filename = generateMigrationFilename(diff, normalizedConfig);\n\n // Write migration file\n const filePath = writeMigrationFile(migrationDir, filename, content);\n\n return filePath;\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 a migration file from a schema diff\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":";;;;;;AAQO,IAAM,cAAA,GAAN,MAAM,eAAA,SAAuB,KAAA,CAAM;AAAA,EACxC,YAAY,OAAA,EAAiB;AAC3B,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,gBAAA;AACZ,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,eAAA,CAAe,SAAS,CAAA;AAAA,EACtD;AACF,CAAA;AAqFO,IAAM,wBAAA,GAAN,MAAM,yBAAA,SAAiC,cAAA,CAAe;AAAA,EAC3C,aAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CAAY,OAAA,EAAiB,aAAA,EAAwB,aAAA,EAAuB;AAC1E,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,0BAAA;AACZ,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,yBAAA,CAAyB,SAAS,CAAA;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,GAA6B;AAClC,IAAA,MAAM,KAAA,GAAkB,CAAC,IAAA,CAAK,OAAO,CAAA;AAErC,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,WAAA,EAAgB,IAAA,CAAK,aAAa,CAAA,CAAE,CAAA;AAAA,IACjD;AAEA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,OAAA,EAAY,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACtB;AACF,CAAA;AAMO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,cAAA,CAAe;AAAA,EAClC,IAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,aAAA;AAAA,EAEhB,WAAA,CACE,OAAA,EACAA,KAAAA,EACA,SAAA,EACA,MACA,aAAA,EACA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAOA,KAAAA;AACZ,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AACjB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AACrB,IAAA,MAAA,CAAO,cAAA,CAAe,IAAA,EAAM,gBAAA,CAAgB,SAAS,CAAA;AAAA,EACvD;AAAA;AAAA;AAAA;AAAA,EAKO,kBAAA,GAA6B;AAClC,IAAA,MAAM,KAAA,GAAkB,CAAC,IAAA,CAAK,OAAO,CAAA;AAErC,IAAA,IAAI,KAAK,SAAA,EAAW;AAClB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,WAAA,EAAgB,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAAA,IAC7C;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MAAA,EAAW,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IACnC;AAEA,IAAA,IAAI,KAAK,IAAA,EAAM;AACb,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,YAAA,EAAiB,IAAA,CAAK,IAAI,CAAA,CAAE,CAAA;AAAA,IACzC;AAEA,IAAA,IAAI,KAAK,aAAA,EAAe;AACtB,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,OAAA,EAAY,IAAA,CAAK,aAAA,CAAc,OAAO,CAAA,CAAE,CAAA;AAAA,IACrD;AAEA,IAAA,OAAO,KAAA,CAAM,KAAK,EAAE,CAAA;AAAA,EACtB;AACF,CAAA;;;AC3HA,IAAM,gBAAA,GAAmB,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWzB,IAAM,cAAA,GAA2E;AAAA,EAC/E,aAAA,EAAe,QAAQ,GAAA,EAAI;AAAA,EAC3B,kBAAA,EAAoB,MAAM,IAAA,CAAK,KAAA,CAAM,KAAK,GAAA,EAAI,GAAI,GAAI,CAAA,CAAE,QAAA,EAAS;AAAA,EACjE,QAAA,EAAU,gBAAA;AAAA,EACV,oBAAA,EAAsB,IAAA;AAAA,EACtB,SAAA,EAAW;AACb,CAAA;AAKA,SAAS,YAAY,MAAA,EAAsE;AACzF,EAAA,OAAO;AAAA,IACL,GAAG,cAAA;AAAA,IACH,GAAG;AAAA,GACL;AACF;AAKA,SAAS,oBAAoB,MAAA,EAA0C;AACrE,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,aAAA,IAAiB,OAAA,CAAQ,GAAA,EAAI;AAE1D,EAAA,IAAS,IAAA,CAAA,UAAA,CAAW,MAAA,CAAO,YAAY,CAAA,EAAG;AACxC,IAAA,OAAO,MAAA,CAAO,YAAA;AAAA,EAChB;AAEA,EAAA,OAAY,IAAA,CAAA,IAAA,CAAK,aAAA,EAAe,MAAA,CAAO,YAAY,CAAA;AACrD;AASO,SAAS,kBAAkB,MAAA,EAA2C;AAC3E,EAAA,IAAI,QAAQ,kBAAA,EAAoB;AAC9B,IAAA,OAAO,OAAO,kBAAA,EAAmB;AAAA,EACnC;AACA,EAAA,OAAO,KAAK,KAAA,CAAM,IAAA,CAAK,KAAI,GAAI,GAAI,EAAE,QAAA,EAAS;AAChD;AASO,SAAS,6BAA6B,IAAA,EAA0B;AACrE,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,KAAW,CAAA,EAAG;AACzC,MAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,oBAAoB,CAAC,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,KAAW,CAAA,EAAG;AACzC,MAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,oBAAoB,CAAC,CAAA,CAAE,IAAI,CAAA,CAAE,CAAA;AAAA,IAC1D,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,KAAW,CAAA,EAAG;AACzC,MAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,IAAA,CAAK,oBAAoB,CAAC,CAAA,CAAE,UAAU,CAAA,CAAE,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,IAAA,CAAK,mBAAA,CAAoB,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,IACrE;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAO,YAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,GAAG,CAAA;AAGhC,EAAA,IAAI,WAAA,CAAY,SAAS,EAAA,EAAI;AAC3B,IAAA,WAAA,GAAc,WAAA,CAAY,SAAA,CAAU,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,EAC/C;AAEA,EAAA,OAAO,WAAA;AACT;AAUO,SAAS,yBAAA,CAA0B,MAAkB,MAAA,EAA2C;AACrG,EAAA,MAAM,SAAA,GAAY,kBAAkB,MAAM,CAAA;AAC1C,EAAA,MAAM,WAAA,GAAc,6BAA6B,IAAI,CAAA;AAErD,EAAA,OAAO,CAAA,EAAG,SAAS,CAAA,CAAA,EAAI,WAAW,CAAA,GAAA,CAAA;AACpC;AAUO,SAAS,4BAAA,CACd,MAAA,EACA,QAAA,EACA,MAAA,EACQ;AACR,EAAA,MAAM,YAAA,GAAe,MAAA,GAAS,WAAA,CAAY,MAAM,CAAA,GAAI,cAAA;AACpD,EAAA,IAAI,WAAW,YAAA,CAAa,QAAA;AAG5B,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,gBAAA,EAAkB,YAAA,CAAa,SAAS,CAAA;AACpE,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,aAAA,EAAe,MAAM,CAAA;AACjD,EAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,QAAQ,CAAA;AAGrD,EAAA,IAAI,CAAC,aAAa,oBAAA,EAAsB;AACtC,IAAA,QAAA,GAAW,QAAA,CAAS,OAAA,CAAQ,uCAAA,EAAyC,EAAE,CAAA;AAAA,EACzE;AAEA,EAAA,OAAO,QAAA;AACT;AAWO,SAAS,kBAAA,CAAmB,YAAA,EAAsB,QAAA,EAAkB,OAAA,EAAyB;AAClG,EAAA,IAAI;AAEF,IAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,YAAY,CAAA,EAAG;AAChC,MAAA,IAAI;AACF,QAAG,EAAA,CAAA,SAAA,CAAU,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,MAChD,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,OAAA,GAAU,KAAA;AAChB,QAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,SAAS,OAAA,EAAS;AACzD,UAAA,MAAM,IAAI,eAAA;AAAA,YACR,CAAA,4EAAA,CAAA;AAAA,YACA,YAAA;AAAA,YACA,QAAA;AAAA,YACA,OAAA,CAAQ,IAAA;AAAA,YACR;AAAA,WACF;AAAA,QACF;AACA,QAAA,MAAM,IAAI,eAAA;AAAA,UACR,CAAA,sCAAA,EAAyC,QAAQ,OAAO,CAAA,CAAA;AAAA,UACxD,YAAA;AAAA,UACA,QAAA;AAAA,UACA,OAAA,CAAQ,IAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,GAAgB,IAAA,CAAA,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AAGjD,IAAG,EAAA,CAAA,aAAA,CAAc,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAE3C,IAAA,OAAO,QAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,MAAM,OAAA,GAAU,KAAA;AAChB,IAAA,MAAM,QAAA,GAAgB,IAAA,CAAA,IAAA,CAAK,YAAA,EAAc,QAAQ,CAAA;AAEjD,IAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,QAAA,IAAY,OAAA,CAAQ,SAAS,OAAA,EAAS;AACzD,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,CAAA,+EAAA,CAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA,CAAQ,IAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AACpC,MAAA,MAAM,IAAI,eAAA;AAAA,QACR,CAAA,oDAAA,CAAA;AAAA,QACA,QAAA;AAAA,QACA,OAAA;AAAA,QACA,OAAA,CAAQ,IAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,wBAAA,CAAyB,CAAA,gCAAA,EAAmC,QAAQ,OAAO,CAAA,CAAA,EAAI,UAAU,KAAc,CAAA;AAAA,EACnH;AACF;AASA,SAAS,YAAY,KAAA,EAAoB;AACvC,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,CAAA,CAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAC,CAAA,CAAA,CAAA;AAAA,EACpF;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,OAAO,UAAU,SAAA,EAAW;AAC3D,IAAA,OAAO,OAAO,KAAK,CAAA;AAAA,EACrB;AAEA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,YAAY,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AACxD,IAAA,OAAO,IAAI,KAAK,CAAA,CAAA,CAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,OAAA,GAAU,OAAO,OAAA,CAAQ,KAAK,EACjC,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,MAAM,CAAA,EAAG,CAAC,KAAK,WAAA,CAAY,CAAC,CAAC,CAAA,CAAE,CAAA,CACzC,KAAK,IAAI,CAAA;AACZ,IAAA,OAAO,KAAK,OAAO,CAAA,EAAA,CAAA;AAAA,EACrB;AAEA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AASO,SAAS,8BAA8B,KAAA,EAAgC;AAC5E,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAGxC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAGxC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAmB,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAG9C,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC5C;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,MAAA,KAAA,CAAM,KAAK,CAAA,MAAA,EAAS,GAAG,KAAK,WAAA,CAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAClD;AAAA,EACF;AAGA,EAAA,IAAI,MAAM,QAAA,EAAU;AAIlB,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,QAAA,CAAS,UAAA,CAAW,aAAY,KAAM,OAAA;AACtE,IAAA,MAAM,0BAA0B,iBAAA,GAC5B,mBAAA,GACA,CAAA,8BAAA,EAAiC,KAAA,CAAM,SAAS,UAAU,CAAA,KAAA,CAAA;AAE9D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,uBAAuB,CAAA,CAAE,CAAA;AAE3D,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAA,KAAc,MAAA,EAAW;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAA,KAAc,MAAA,EAAW;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,CAAE,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,aAAA,KAAkB,MAAA,EAAW;AAC9C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,qBAAA,EAAwB,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,CAAE,CAAA;AAAA,IACnE;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AAAA,EAAU,KAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,KAAA,CAAA;AACpC;AAQO,SAAS,oBAAoB,MAAA,EAAmC;AACrE,EAAA,IAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AACvB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAe,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,6BAAA,CAA8B,KAAK,CAAC,CAAA;AAC/E,EAAA,OAAO,CAAA;AAAA,EAAM,YAAA,CAAa,IAAA,CAAK,KAAK,CAAC,CAAA;AAAA,GAAA,CAAA;AACvC;AAQO,SAAS,wBAAwB,KAAA,EAA2C;AACjF,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,KAAA,CAAM,aAAa,MAAA,EAAW;AAChC,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,WAAA,CAAY,KAAA,CAAM,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,KAAA,CAAM,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,KAAA,CAAM,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,KAAA,CAAM,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,KAAA,CAAM,eAAe,MAAA,EAAW;AAClC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,KAAA,CAAM,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EAC3D;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAC7B;AASO,SAAS,8BAA8B,WAAA,EAAuD;AACnG,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAO,EAAA;AAAA,EACT;AAEA,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,IAAI,WAAA,CAAY,aAAa,MAAA,EAAW;AACtC,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,WAAA,CAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAA,CAAY,aAAa,MAAA,EAAW;AACtC,IAAA,KAAA,CAAM,KAAK,CAAA,UAAA,EAAa,WAAA,CAAY,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAC7D;AAEA,EAAA,IAAI,WAAA,CAAY,eAAe,MAAA,EAAW;AACxC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,WAAA,CAAY,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,WAAA,CAAY,eAAe,MAAA,EAAW;AACxC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,WAAA,CAAY,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,WAAA,CAAY,eAAe,MAAA,EAAW;AACxC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,WAAA,CAAY,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,IAAI,WAAA,CAAY,eAAe,MAAA,EAAW;AACxC,IAAA,KAAA,CAAM,KAAK,CAAA,YAAA,EAAe,WAAA,CAAY,WAAA,CAAY,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,EACjE;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,SAAS,CAAA;AAC7B;AAQO,SAAS,qBAAqB,OAAA,EAA4B;AAC/D,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,eAAe,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAG,CAAA;AACpD,EAAA,OAAO,CAAA;AAAA,IAAA,EAAU,YAAA,CAAa,IAAA,CAAK,SAAS,CAAC,CAAA;AAAA,GAAA,CAAA;AAC/C;AAeA,SAAS,eAAA,GAAqC;AAC5C,EAAA,OAAO;AAAA;AAAA,IAEL;AAAA,MACE,IAAA,EAAM,IAAA;AAAA,MACN,IAAA,EAAM,MAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,QACP,mBAAA,EAAqB,cAAA;AAAA,QACrB,MAAA,EAAQ,KAAA;AAAA,QACR,EAAA,EAAI,gBAAA;AAAA,QACJ,GAAA,EAAK,EAAA;AAAA,QACL,GAAA,EAAK,EAAA;AAAA,QACL,OAAA,EAAS,aAAA;AAAA,QACT,WAAA,EAAa,KAAA;AAAA,QACb,UAAA,EAAY,IAAA;AAAA,QACZ,MAAA,EAAQ;AAAA;AACV,KACF;AAAA;AAAA,IAEA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,KAAA;AAAA,QACR,EAAA,EAAI,oBAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,KAAA;AAAA,QACV,WAAA,EAAa,KAAA;AAAA,QACb,MAAA,EAAQ;AAAA;AACV,KACF;AAAA;AAAA,IAEA;AAAA,MACE,IAAA,EAAM,SAAA;AAAA,MACN,IAAA,EAAM,UAAA;AAAA,MACN,QAAA,EAAU,IAAA;AAAA,MACV,OAAA,EAAS;AAAA,QACP,MAAA,EAAQ,KAAA;AAAA,QACR,EAAA,EAAI,oBAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,IAAA;AAAA,QACV,WAAA,EAAa,KAAA;AAAA,QACb,MAAA,EAAQ;AAAA;AACV;AACF,GACF;AACF;AAEO,SAAS,0BAAA,CACd,UAAA,EACA,OAAA,GAAkB,YAAA,EAClB,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,CAAA,mBAAA,CAAqB,CAAA;AAClD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAA,EAAA,CAAI,CAAA;AAC5C,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAA,EAAA,CAAI,CAAA;AAI5C,EAAA,MAAM,eAAA,GAAkB,6BAAA,CAA8B,UAAA,CAAW,WAAW,CAAA;AAC5E,EAAA,MAAM,SAAA,GAAY,uBAAA,CAAwB,UAAA,CAAW,KAAK,CAAA;AAE1D,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,eAAe,CAAA,CAAA,CAAG,CAAA;AAAA,EACtC,WAAW,SAAA,EAAW;AACpB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AAIA,EAAA,MAAM,eAAe,eAAA,EAAgB;AACrC,EAAA,MAAM,YAAY,CAAC,GAAG,YAAA,EAAc,GAAG,WAAW,MAAM,CAAA;AAGxD,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,mBAAA,CAAoB,SAAS,CAAC,CAAA,CAAA,CAAG,CAAA;AAG3D,EAAA,KAAA,CAAM,KAAK,CAAA,aAAA,EAAgB,oBAAA,CAAqB,UAAA,CAAW,OAAO,CAAC,CAAA,CAAA,CAAG,CAAA;AAEtE,EAAA,KAAA,CAAM,KAAK,CAAA,KAAA,CAAO,CAAA;AAClB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,OAAO,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,OAAO,CAAA,EAAA,CAAI,CAAA;AAEhF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAQA,SAAS,wBAAwB,SAAA,EAA2B;AAC1D,EAAA,MAAM,cAAA,GAAyC;AAAA,IAC7C,IAAA,EAAM,WAAA;AAAA,IACN,KAAA,EAAO,YAAA;AAAA,IACP,GAAA,EAAK,UAAA;AAAA,IACL,MAAA,EAAQ,aAAA;AAAA,IACR,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,MAAA,EAAQ,aAAA;AAAA,IACR,QAAA,EAAU,eAAA;AAAA,IACV,IAAA,EAAM,WAAA;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAEA,EAAA,OAAO,cAAA,CAAe,SAAS,CAAA,IAAK,WAAA;AACtC;AAQA,SAAS,gCAAgC,KAAA,EAAgC;AACvE,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,KAAA,CAAM,IAAI,CAAA,CAAA,CAAG,CAAA;AAGtC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,KAAA,CAAM,QAAQ,CAAA,CAAE,CAAA;AAG5C,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,EAAW;AAC9B,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,KAAA,CAAM,MAAM,CAAA,CAAE,CAAA;AAAA,EAC1C;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,MAAA,CAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1D,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,EAAG;AACxD,MAAA,KAAA,CAAM,KAAK,CAAA,IAAA,EAAO,GAAG,KAAK,WAAA,CAAY,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,IAChD;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,IAAA,KAAS,UAAA,EAAY;AAE/C,IAAA,MAAM,iBAAA,GAAoB,KAAA,CAAM,QAAA,CAAS,UAAA,CAAW,aAAY,KAAM,OAAA;AACtE,IAAA,MAAM,0BAA0B,iBAAA,GAC5B,mBAAA,GACA,CAAA,8BAAA,EAAiC,KAAA,CAAM,SAAS,UAAU,CAAA,KAAA,CAAA;AAE9D,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,kBAAA,EAAqB,uBAAuB,CAAA,CAAE,CAAA;AAEzD,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAA,KAAc,MAAA,EAAW;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,CAAE,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAA,KAAc,MAAA,EAAW;AAC1C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,CAAE,CAAA;AAAA,IACzD;AAEA,IAAA,IAAI,KAAA,CAAM,QAAA,CAAS,aAAA,KAAkB,MAAA,EAAW;AAC9C,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,KAAA,CAAM,QAAA,CAAS,aAAa,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AACzB;AAYO,SAAS,qBAAA,CACd,cAAA,EACA,KAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,eAAA,GAAkB,uBAAA,CAAwB,KAAA,CAAM,IAAI,CAAA;AAC1D,EAAA,MAAM,gBAAgB,OAAA,IAAW,CAAA,WAAA,EAAc,cAAc,CAAA,CAAA,EAAI,MAAM,IAAI,CAAA,CAAA;AAE3E,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC1F,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,aAAa,CAAA,gBAAA,EAAmB,eAAe,CAAA,EAAA,CAAI,CAAA;AACnE,EAAA,KAAA,CAAM,IAAA,CAAK,+BAAA,CAAgC,KAAK,CAAC,CAAA;AACjD,EAAA,KAAA,CAAM,KAAK,CAAA,MAAA,CAAQ,CAAA;AACnB,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,aAAa,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,aAAa,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAYO,SAAS,yBAAA,CACd,cAAA,EACA,YAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,gBAAgB,OAAA,IAAW,CAAA,WAAA,EAAc,cAAc,CAAA,CAAA,EAAI,aAAa,SAAS,CAAA,CAAA;AACvF,EAAA,MAAM,QAAA,GAAW,GAAG,aAAa,CAAA,MAAA,CAAA;AAEjC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAA,CAAK,WAAW,QAAQ,CAAA,GAAA,EAAM,aAAa,CAAA,mBAAA,EAAsB,YAAA,CAAa,SAAS,CAAA,GAAA,CAAK,CAAA;AAClG,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,KAAA,MAAW,MAAA,IAAU,aAAa,OAAA,EAAS;AACzC,IAAA,IAAI,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,UAAU,CAAA,EAAG;AAE1C,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,YAAY,EAAE,CAAA;AAExD,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,SAAS,MAAM,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC5E,CAAA,MAAA,IAAW,MAAA,CAAO,QAAA,CAAS,UAAA,CAAW,WAAW,CAAA,EAAG;AAElD,MAAA,MAAM,WAAA,GAAc,MAAA,CAAO,QAAA,CAAS,OAAA,CAAQ,aAAa,EAAE,CAAA;AAE3D,MAAA,IAAI,gBAAgB,YAAA,EAAc;AAGhC,QAAA,MAAM,oBAAoB,MAAA,CAAO,MAAA,CAAO,QAAQ,CAAA,CAAE,aAAY,KAAM,OAAA;AACpE,QAAA,MAAM,iBAAA,GAAoB,iBAAA,GACtB,mBAAA,GACA,CAAA,8BAAA,EAAiC,OAAO,QAAQ,CAAA,KAAA,CAAA;AACpD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,gBAAA,EAAmB,iBAAiB,CAAA,CAAA,CAAG,CAAA;AAAA,MACjE,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,WAAW,MAAM,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,MAC9E;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,EAAI,MAAA,CAAO,QAAQ,CAAA,GAAA,EAAM,WAAA,CAAY,MAAA,CAAO,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAClF;AAAA,EACF;AAEA,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,aAAa,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,aAAa,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAWO,SAAS,qBAAA,CACd,cAAA,EACA,SAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,aAAA,GAAgB,OAAA,IAAW,CAAA,WAAA,EAAc,cAAc,IAAI,SAAS,CAAA,CAAA;AAC1E,EAAA,MAAM,QAAA,GAAW,GAAG,aAAa,CAAA,MAAA,CAAA;AAEjC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC1F,EAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,QAAQ,MAAM,aAAa,CAAA,mBAAA,EAAsB,SAAS,CAAA,GAAA,CAAK,CAAA;AACrF,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,aAAa,CAAA,eAAA,EAAkB,QAAQ,CAAA,KAAA,CAAO,CAAA;AAC9D,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AACb,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,aAAa,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,aAAa,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAWA,SAAS,qBAAA,CACP,cAAA,EACA,KAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,aAAA,GAAgB,OAAA,IAAW,CAAA,WAAA,EAAc,cAAc,CAAA,IAAA,CAAA;AAE7D,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,aAAa,CAAA,eAAA,EAAkB,KAAK,CAAA,GAAA,CAAK,CAAA;AACzD,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,aAAa,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,aAAa,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAWA,SAAS,oBAAA,CACP,cAAA,EACA,KAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,aAAA,GAAgB,OAAA,IAAW,CAAA,WAAA,EAAc,cAAc,CAAA,IAAA,CAAA;AAC7D,EAAA,MAAM,QAAA,GAAW,GAAG,aAAa,CAAA,cAAA,CAAA;AAEjC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC1F,EAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,QAAQ,MAAM,aAAa,CAAA,mCAAA,EAAsC,KAAK,CAAA,GAAA,CAAK,CAAA;AACjG,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,MAAA,EAAS,QAAQ,CAAA,UAAA,CAAY,CAAA;AACxC,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,IAAA,EAAO,aAAa,CAAA,gBAAA,EAAmB,QAAQ,CAAA,KAAA,CAAO,CAAA;AACjE,EAAA,KAAA,CAAM,KAAK,CAAA,GAAA,CAAK,CAAA;AAChB,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,aAAa,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,aAAa,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAYA,SAAS,mBACP,cAAA,EACA,QAAA,EACA,QAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,aAAA,GAAgB,OAAA,IAAW,CAAA,WAAA,EAAc,cAAc,IAAI,QAAQ,CAAA,CAAA;AAEzE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,EAAM,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,aAAa,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,aAAa,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAaO,SAAS,yBACd,cAAA,EACA,QAAA,EACA,QAAA,EACA,OAAA,EACA,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,aAAA,GAAgB,OAAA,IAAW,CAAA,WAAA,EAAc,cAAc,IAAI,QAAQ,CAAA,CAAA;AAEzE,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AAC1F,EAAA,KAAA,CAAM,IAAA,CAAK,KAAK,aAAa,CAAA,CAAA,EAAI,QAAQ,CAAA,GAAA,EAAM,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA,CAAG,CAAA;AACvE,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,kBAAA,EAAqB,aAAa,CAAA,EAAA,CAAA,GAAO,CAAA,WAAA,EAAc,aAAa,CAAA,EAAA,CAAI,CAAA;AAE5F,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAUA,SAAS,0BAAA,CACP,cAAA,EACA,OAAA,GAAkB,YAAA,EAClB,SAAkB,KAAA,EACV;AACR,EAAA,MAAM,QAAkB,EAAC;AAEzB,EAAA,KAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,OAAO,CAAA,iCAAA,EAAoC,cAAc,CAAA,GAAA,CAAK,CAAA;AACpF,EAAA,KAAA,CAAM,KAAK,MAAA,GAAS,CAAA,oBAAA,EAAuB,OAAO,CAAA,EAAA,CAAA,GAAO,CAAA,aAAA,EAAgB,OAAO,CAAA,EAAA,CAAI,CAAA;AAEpF,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AASO,SAAS,oBAAoB,IAAA,EAA0B;AAC5D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,CAAA,iBAAA,CAAmB,CAAA;AAC9B,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAGb,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,2BAAA,CAA6B,CAAA;AACxC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA,EAAA,EAAK;AACxD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,CAAC,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAA,OAAA,CAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,0BAAA,CAA2B,UAAA,EAAY,OAAO,CAAC,CAAA;AAC1D,MAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACf;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,gCAAA,CAAkC,CAAA;AAC7C,IAAA,KAAA,MAAW,YAAA,IAAgB,KAAK,mBAAA,EAAqB;AACnD,MAAA,MAAM,iBAAiB,YAAA,CAAa,UAAA;AAEpC,MAAA,IAAI,YAAA,CAAa,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACvC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAsB,cAAc,CAAA,CAAE,CAAA;AACjD,QAAA,KAAA,MAAW,KAAA,IAAS,aAAa,WAAA,EAAa;AAC5C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,KAAA,EAAQ,MAAM,IAAI,CAAA,CAAA;AAC9D,UAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,cAAA,EAAgB,KAAA,EAAO,OAAO,CAAC,CAAA;AAChE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,cAAc,CAAA,CAAE,CAAA;AACpD,QAAA,KAAA,MAAW,QAAA,IAAY,aAAa,cAAA,EAAgB;AAClD,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,QAAA,EAAW,SAAS,SAAS,CAAA,CAAA;AACzE,UAAA,KAAA,CAAM,IAAA,CAAK,yBAAA,CAA0B,cAAA,EAAgB,QAAA,EAAU,OAAO,CAAC,CAAA;AACvE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2B,cAAc,CAAA,CAAE,CAAA;AACtD,QAAA,KAAA,MAAW,KAAA,IAAS,aAAa,cAAA,EAAgB;AAC/C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,QAAA,EAAW,MAAM,IAAI,CAAA,CAAA;AACjE,UAAA,KAAA,CAAM,KAAK,qBAAA,CAAsB,cAAA,EAAgB,KAAA,CAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AACrE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACxC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,oBAAA,EAAuB,cAAc,CAAA,CAAE,CAAA;AAClD,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AACzD,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,YAAA,CAAa,CAAC,CAAA;AACzC,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,QAAA,EAAW,CAAC,CAAA,CAAA;AACxD,UAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,cAAA,EAAgB,KAAA,EAAO,OAAO,CAAC,CAAA;AAChE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAC3C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,cAAc,CAAA,CAAE,CAAA;AACvD,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC5D,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,eAAA,CAAgB,CAAC,CAAA;AAC5C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,OAAA,EAAU,CAAC,CAAA,CAAA;AACvD,UAAA,KAAA,CAAM,IAAA,CAAK,oBAAA,CAAqB,cAAA,EAAgB,KAAA,EAAO,OAAO,CAAC,CAAA;AAC/D,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,mBAAA,IAAuB,YAAA,CAAa,mBAAA,CAAoB,SAAS,CAAA,EAAG;AACnF,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,4BAAA,EAA+B,cAAc,CAAA,CAAE,CAAA;AAC1D,QAAA,KAAA,MAAW,UAAA,IAAc,aAAa,mBAAA,EAAqB;AACzD,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,MAAA,EAAS,WAAW,QAAQ,CAAA,CAAA;AACxE,UAAA,KAAA,CAAM,IAAA,CAAK,yBAAyB,cAAA,EAAgB,UAAA,CAAW,UAAU,UAAA,CAAW,QAAA,EAAU,OAAO,CAAC,CAAA;AACtG,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAA,IAAW,YAAA,CAAa,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAChD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,cAAc,CAAA,CAAE,CAAA;AACpD,QAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,aAAA,EAAe;AAC7C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,MAAA,EAAS,KAAK,QAAQ,CAAA,CAAA;AAClE,UAAA,KAAA,CAAM,IAAA,CAAK,mBAAmB,cAAA,EAAgB,IAAA,CAAK,UAAU,IAAA,CAAK,QAAA,EAAU,OAAO,CAAC,CAAA;AACpF,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,uBAAA,CAAyB,CAAA;AACpC,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA,EAAA,EAAK;AACxD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,CAAC,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAA,OAAA,CAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,0BAAA,CAA2B,UAAA,CAAW,IAAA,EAAM,OAAO,CAAC,CAAA;AAC/D,MAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACf;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,KAAK,CAAA,wBAAA,CAA0B,CAAA;AACrC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAI1B,EAAA,MAAM,WAAA,GAAc,8BAAA;AACpB,EAAA,MAAM,aAAA,GAAgB,gCAAA;AAEtB,EAAA,MAAM,cAAc,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA;AAClD,EAAA,MAAM,gBAAgB,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,aAAa,CAAC,CAAA;AAGtD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,OAAO,CAAE,CAAA;AAAA,IACvE,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,OAAO,CAAE;AAAA,GAC7E,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAElC,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,IAAA,IAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAC7B,MAAA,IAAA,GACE,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,KAAM,CAAA,GACxC,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,GACjB,kBAAA,GACA,SAAA,CAAU,MAAM,CAAC,CAAA,GACjB,IAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,KAAA,GAAS,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,IACrE,CAAA,MAAO;AACL,MAAA,IAAA,GACE,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,KAAM,CAAA,GACxC,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,GACjB,oBAAA,GACA,SAAA,CAAU,MAAM,CAAC,CAAA,GACjB,IAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,KAAA,GAAS,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AASO,SAAS,sBAAsB,IAAA,EAA0B;AAC9D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,KAAA,CAAM,KAAK,CAAA,8BAAA,CAAgC,CAAA;AAC3C,EAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAKb,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,iCAAA,CAAmC,CAAA;AAC9C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA,EAAA,EAAK;AACxD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,CAAC,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAA,SAAA,CAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,0BAAA,CAA2B,UAAA,EAAY,OAAO,CAAC,CAAA;AAC1D,MAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACf;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,yBAAA,CAA2B,CAAA;AACtC,IAAA,KAAA,MAAW,YAAA,IAAgB,KAAK,mBAAA,EAAqB;AACnD,MAAA,MAAM,iBAAiB,YAAA,CAAa,UAAA;AAEpC,MAAA,IAAI,YAAA,CAAa,mBAAA,IAAuB,YAAA,CAAa,mBAAA,CAAoB,SAAS,CAAA,EAAG;AACnF,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,4BAAA,EAA+B,cAAc,CAAA,CAAE,CAAA;AAC1D,QAAA,KAAA,MAAW,UAAA,IAAc,aAAa,mBAAA,EAAqB;AACzD,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,aAAA,EAAgB,WAAW,QAAQ,CAAA,CAAA;AAC/E,UAAA,KAAA,CAAM,IAAA,CAAK,yBAAyB,cAAA,EAAgB,UAAA,CAAW,UAAU,UAAA,CAAW,QAAA,EAAU,OAAO,CAAC,CAAA;AACtG,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF,CAAA,MAAA,IAAW,YAAA,CAAa,aAAA,CAAc,MAAA,GAAS,CAAA,EAAG;AAChD,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,cAAc,CAAA,CAAE,CAAA;AACpD,QAAA,KAAA,MAAW,IAAA,IAAQ,aAAa,aAAA,EAAe;AAC7C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,aAAA,EAAgB,KAAK,QAAQ,CAAA,CAAA;AACzE,UAAA,KAAA,CAAM,IAAA,CAAK,mBAAmB,cAAA,EAAgB,IAAA,CAAK,UAAU,IAAA,CAAK,QAAA,EAAU,OAAO,CAAC,CAAA;AACpF,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,eAAA,CAAgB,MAAA,GAAS,CAAA,EAAG;AAC3C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,wBAAA,EAA2B,cAAc,CAAA,CAAE,CAAA;AACtD,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,eAAA,CAAgB,QAAQ,CAAA,EAAA,EAAK;AAC5D,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,eAAA,CAAgB,CAAC,CAAA;AAC5C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,aAAA,EAAgB,CAAC,CAAA,CAAA;AAC7D,UAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,cAAA,EAAgB,KAAA,EAAO,OAAO,CAAC,CAAA;AAChE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AACxC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAA4B,cAAc,CAAA,CAAE,CAAA;AACvD,QAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AACzD,UAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,YAAA,CAAa,CAAC,CAAA;AACzC,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,YAAA,EAAe,CAAC,CAAA,CAAA;AAC5D,UAAA,KAAA,CAAM,IAAA,CAAK,oBAAA,CAAqB,cAAA,EAAgB,KAAA,EAAO,OAAO,CAAC,CAAA;AAC/D,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,uBAAA,EAA0B,cAAc,CAAA,CAAE,CAAA;AACrD,QAAA,KAAA,MAAW,KAAA,IAAS,aAAa,cAAA,EAAgB;AAC/C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,SAAA,EAAY,MAAM,IAAI,CAAA,CAAA;AAClE,UAAA,KAAA,CAAM,IAAA,CAAK,qBAAA,CAAsB,cAAA,EAAgB,KAAA,EAAO,OAAO,CAAC,CAAA;AAChE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC1C,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,mCAAA,EAAsC,cAAc,CAAA,CAAE,CAAA;AACjE,QAAA,KAAA,MAAW,QAAA,IAAY,aAAa,cAAA,EAAgB;AAElD,UAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,MAAY;AAAA,YACvD,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,UAAU,MAAA,CAAO,QAAA;AAAA,YACjB,UAAU,MAAA,CAAO;AAAA,WACnB,CAAE,CAAA;AAEF,UAAA,MAAM,UAAA,GAAgC;AAAA,YACpC,WAAW,QAAA,CAAS,SAAA;AAAA,YACpB,mBAAmB,QAAA,CAAS,aAAA;AAAA,YAC5B,eAAe,QAAA,CAAS,iBAAA;AAAA,YACxB,OAAA,EAAS;AAAA,WACX;AAEA,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,QAAA,EAAW,SAAS,SAAS,CAAA,CAAA;AACzE,UAAA,KAAA,CAAM,IAAA,CAAK,yBAAA,CAA0B,cAAA,EAAgB,UAAA,EAAY,OAAO,CAAC,CAAA;AACzE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAGA,MAAA,IAAI,YAAA,CAAa,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG;AACvC,QAAA,KAAA,CAAM,IAAA,CAAK,CAAA,8BAAA,EAAiC,cAAc,CAAA,CAAE,CAAA;AAC5D,QAAA,KAAA,MAAW,KAAA,IAAS,aAAa,WAAA,EAAa;AAC5C,UAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,cAAc,CAAA,YAAA,EAAe,MAAM,IAAI,CAAA,CAAA;AACrE,UAAA,KAAA,CAAM,KAAK,qBAAA,CAAsB,cAAA,EAAgB,KAAA,CAAM,IAAA,EAAM,OAAO,CAAC,CAAA;AACrE,UAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,IAAA,CAAK,mBAAA,CAAoB,MAAA,GAAS,CAAA,EAAG;AACvC,IAAA,KAAA,CAAM,KAAK,CAAA,+BAAA,CAAiC,CAAA;AAC5C,IAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,mBAAA,CAAoB,QAAQ,CAAA,EAAA,EAAK;AACxD,MAAA,MAAM,UAAA,GAAa,IAAA,CAAK,mBAAA,CAAoB,CAAC,CAAA;AAC7C,MAAA,MAAM,OAAA,GAAU,CAAA,WAAA,EAAc,UAAA,CAAW,IAAI,CAAA,SAAA,CAAA;AAC7C,MAAA,KAAA,CAAM,IAAA,CAAK,0BAAA,CAA2B,UAAA,CAAW,IAAA,EAAM,OAAO,CAAC,CAAA;AAC/D,MAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,IACf;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,KAAK,CAAA,yBAAA,CAA2B,CAAA;AACtC,IAAA,KAAA,CAAM,KAAK,CAAA,CAAE,CAAA;AAAA,EACf;AAEA,EAAA,IAAI,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAI1B,EAAA,MAAM,WAAA,GAAc,8BAAA;AACpB,EAAA,MAAM,aAAA,GAAgB,gCAAA;AAEtB,EAAA,MAAM,cAAc,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA;AAClD,EAAA,MAAM,gBAAgB,CAAC,GAAG,IAAA,CAAK,QAAA,CAAS,aAAa,CAAC,CAAA;AAGtD,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAG,WAAA,CAAY,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,MAAA,EAAQ,KAAA,EAAO,CAAA,CAAE,OAAO,CAAE,CAAA;AAAA,IACvE,GAAG,aAAA,CAAc,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,KAAA,EAAO,CAAA,EAAG,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,CAAA,CAAE,OAAO,CAAE;AAAA,GAC7E,CAAE,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AAElC,EAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,IAAA,MAAM,SAAA,GAAY,WAAW,CAAC,CAAA;AAC9B,IAAA,IAAI,SAAA,CAAU,SAAS,MAAA,EAAQ;AAC7B,MAAA,IAAA,GACE,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,KAAM,CAAA,GACxC,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,GACjB,kBAAA,GACA,SAAA,CAAU,MAAM,CAAC,CAAA,GACjB,IAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,KAAA,GAAS,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,IACrE,CAAA,MAAO;AACL,MAAA,IAAA,GACE,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,SAAA,CAAU,KAAA,CAAM,KAAM,CAAA,GACxC,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,GACjB,oBAAA,GACA,SAAA,CAAU,MAAM,CAAC,CAAA,GACjB,IAAA,GACA,IAAA,CAAK,SAAA,CAAU,SAAA,CAAU,KAAA,CAAM,KAAA,GAAS,SAAA,CAAU,KAAA,CAAM,CAAC,CAAA,CAAE,MAAM,CAAA;AAAA,IACrE;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAUO,SAAS,QAAA,CAAS,MAAkB,MAAA,EAAmD;AAE5F,EAAA,MAAM,mBAA6C,OAAO,MAAA,KAAW,WAAW,EAAE,YAAA,EAAc,QAAO,GAAI,MAAA;AAE3G,EAAA,IAAI;AACF,IAAA,MAAM,YAAA,GAAe,oBAAoB,gBAAgB,CAAA;AAGzD,IAAA,MAAM,MAAA,GAAS,oBAAoB,IAAI,CAAA;AACvC,IAAA,MAAM,QAAA,GAAW,sBAAsB,IAAI,CAAA;AAG3C,IAAA,MAAM,OAAA,GAAU,4BAAA,CAA6B,MAAA,EAAQ,QAAA,EAAU,gBAAgB,CAAA;AAG/E,IAAA,MAAM,QAAA,GAAW,yBAAA,CAA0B,IAAA,EAAM,gBAAgB,CAAA;AAGjE,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,YAAA,EAAc,QAAA,EAAU,OAAO,CAAA;AAEnE,IAAA,OAAO,QAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,IAAI,KAAA,YAAiB,wBAAA,IAA4B,KAAA,YAAiB,eAAA,EAAiB;AACjF,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,MAAM,IAAI,wBAAA;AAAA,MACR,iCAAiC,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAA;AAAA,MACvF,gBAAA,CAAiB,YAAA;AAAA,MACjB;AAAA,KACF;AAAA,EACF;AACF;AAMO,IAAM,qBAAN,MAAyB;AAAA,EACtB,MAAA;AAAA,EAER,YAAY,MAAA,EAAkC;AAC5C,IAAA,IAAA,CAAK,MAAA,GAAS,YAAY,MAAM,CAAA;AAAA,EAClC;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,IAAA,EAA0B;AACjC,IAAA,OAAO,QAAA,CAAS,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,IAAA,EAA0B;AAC5C,IAAA,OAAO,oBAAoB,IAAI,CAAA;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,sBAAsB,IAAA,EAA0B;AAC9C,IAAA,OAAO,sBAAsB,IAAI,CAAA;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA,EAKA,0BAA0B,IAAA,EAA0B;AAClD,IAAA,OAAO,yBAAA,CAA0B,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA;AAAA,EACpD;AACF","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 { 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 * 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 // Escape quotes and special characters\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\")}\"`;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((v) => formatValue(v)).join(\", \");\n return `[${items}]`;\n }\n\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\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 * @returns Field definition object as string\n */\nexport function generateFieldDefinitionObject(field: FieldDefinition): 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 options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation configuration if present\n if (field.relation) {\n // For relation fields, we need to resolve the collection ID\n // For now, we'll use a placeholder that needs to be resolved at runtime\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\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 * @returns Fields array as string\n */\nexport function generateFieldsArray(fields: FieldDefinition[]): string {\n if (fields.length === 0) {\n return \"[]\";\n }\n\n const fieldObjects = fields.map((field) => generateFieldDefinitionObject(field));\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) => `\"${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): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = new Collection({`);\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)},`);\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 * @returns Options object as string\n */\nfunction generateFieldConstructorOptions(field: FieldDefinition): 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 options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation-specific options\n if (field.relation && field.type === \"relation\") {\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\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 * @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): 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));\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 const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${fieldName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.remove(${fieldVar}.id);`);\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(\"${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 === \"${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 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 // 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));\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));\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 // 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 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 // 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));\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));\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 // 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 return code;\n}\n\n/**\n * Main generation function\n * Generates complete migration file from schema diff\n *\n * @param diff - Schema diff containing all changes\n * @param config - Migration generator configuration\n * @returns Path to the generated migration file\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 // Generate up and down migration code\n const upCode = generateUpMigration(diff);\n const downCode = generateDownMigration(diff);\n\n // Create migration file structure\n const content = createMigrationFileStructure(upCode, downCode, normalizedConfig);\n\n // Generate filename\n const filename = generateMigrationFilename(diff, normalizedConfig);\n\n // Write migration file\n const filePath = writeMigrationFile(migrationDir, filename, content);\n\n return filePath;\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 a migration file from a schema diff\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"]}
|
package/dist/migration/index.cjs
CHANGED
|
@@ -30,7 +30,9 @@ var path__namespace = /*#__PURE__*/_interopNamespace(path);
|
|
|
30
30
|
id: zod.z.string().describe("unique id"),
|
|
31
31
|
collectionId: zod.z.string().describe("collection id"),
|
|
32
32
|
collectionName: zod.z.string().describe("collection name"),
|
|
33
|
-
expand: zod.z.record(zod.z.any()).describe("expandable fields")
|
|
33
|
+
expand: zod.z.record(zod.z.any()).describe("expandable fields"),
|
|
34
|
+
created: zod.z.string().describe("creation timestamp"),
|
|
35
|
+
updated: zod.z.string().describe("last update timestamp")
|
|
34
36
|
});
|
|
35
37
|
({
|
|
36
38
|
created: zod.z.string().describe("creation timestamp"),
|
|
@@ -1365,7 +1367,7 @@ var DEFAULT_CONFIG = {
|
|
|
1365
1367
|
"permission-templates.js"
|
|
1366
1368
|
],
|
|
1367
1369
|
includeExtensions: [".ts", ".js"],
|
|
1368
|
-
schemaPatterns: ["Schema", "InputSchema"],
|
|
1370
|
+
schemaPatterns: ["Schema", "InputSchema", "Collection"],
|
|
1369
1371
|
useCompiledFiles: true
|
|
1370
1372
|
};
|
|
1371
1373
|
function mergeConfig(config) {
|
|
@@ -1502,14 +1504,35 @@ function extractCollectionNameFromSchema(zodSchema) {
|
|
|
1502
1504
|
}
|
|
1503
1505
|
return null;
|
|
1504
1506
|
}
|
|
1505
|
-
function
|
|
1507
|
+
function extractCollectionTypeFromSchema(zodSchema) {
|
|
1508
|
+
if (!zodSchema.description) {
|
|
1509
|
+
return null;
|
|
1510
|
+
}
|
|
1511
|
+
try {
|
|
1512
|
+
const metadata = JSON.parse(zodSchema.description);
|
|
1513
|
+
if (metadata.type === "base" || metadata.type === "auth") {
|
|
1514
|
+
return metadata.type;
|
|
1515
|
+
}
|
|
1516
|
+
} catch {
|
|
1517
|
+
}
|
|
1518
|
+
return null;
|
|
1519
|
+
}
|
|
1520
|
+
function extractSchemaDefinitions(module, patterns = ["Schema", "InputSchema", "Collection"]) {
|
|
1506
1521
|
const result = {};
|
|
1522
|
+
if (module.default instanceof zod.z.ZodObject) {
|
|
1523
|
+
result.schema = module.default;
|
|
1524
|
+
}
|
|
1507
1525
|
for (const [key, value] of Object.entries(module)) {
|
|
1526
|
+
if (key === "default") continue;
|
|
1508
1527
|
if (value instanceof zod.z.ZodObject) {
|
|
1509
1528
|
if (patterns.includes("InputSchema") && key.endsWith("InputSchema")) {
|
|
1510
1529
|
result.inputSchema = value;
|
|
1511
|
-
} else if (
|
|
1512
|
-
|
|
1530
|
+
} else if (!result.schema) {
|
|
1531
|
+
if (patterns.includes("Collection") && key.endsWith("Collection")) {
|
|
1532
|
+
result.schema = value;
|
|
1533
|
+
} else if (patterns.includes("Schema") && key.endsWith("Schema") && !key.endsWith("InputSchema")) {
|
|
1534
|
+
result.schema = value;
|
|
1535
|
+
}
|
|
1513
1536
|
}
|
|
1514
1537
|
}
|
|
1515
1538
|
}
|
|
@@ -1598,8 +1621,13 @@ function extractIndexes(schema) {
|
|
|
1598
1621
|
}
|
|
1599
1622
|
function convertZodSchemaToCollectionSchema(collectionName, zodSchema) {
|
|
1600
1623
|
const rawFields = extractFieldDefinitions(zodSchema);
|
|
1601
|
-
const
|
|
1602
|
-
const
|
|
1624
|
+
const explicitType = extractCollectionTypeFromSchema(zodSchema);
|
|
1625
|
+
const collectionType = explicitType ?? (isAuthCollection(rawFields) ? "auth" : "base");
|
|
1626
|
+
let fields = rawFields.map(({ name, zodType }) => buildFieldDefinition(name, zodType));
|
|
1627
|
+
if (collectionType === "auth") {
|
|
1628
|
+
const authSystemFieldNames = ["email", "emailVisibility", "verified", "password", "tokenKey"];
|
|
1629
|
+
fields = fields.filter((field) => !authSystemFieldNames.includes(field.name));
|
|
1630
|
+
}
|
|
1603
1631
|
const indexes = extractIndexes(zodSchema) || [];
|
|
1604
1632
|
const permissionAnalyzer = new PermissionAnalyzer();
|
|
1605
1633
|
let permissions = void 0;
|
|
@@ -2583,9 +2611,14 @@ function matchCollectionsByName(currentSchema, previousSnapshot) {
|
|
|
2583
2611
|
if (!previousSnapshot) {
|
|
2584
2612
|
return matches;
|
|
2585
2613
|
}
|
|
2614
|
+
const previousCollectionsLower = /* @__PURE__ */ new Map();
|
|
2615
|
+
for (const [name, collection] of previousSnapshot.collections) {
|
|
2616
|
+
previousCollectionsLower.set(name.toLowerCase(), [name, collection]);
|
|
2617
|
+
}
|
|
2586
2618
|
for (const [collectionName, currentCollection] of currentSchema.collections) {
|
|
2587
|
-
const
|
|
2588
|
-
if (
|
|
2619
|
+
const previousEntry = previousCollectionsLower.get(collectionName.toLowerCase());
|
|
2620
|
+
if (previousEntry) {
|
|
2621
|
+
const [, previousCollection] = previousEntry;
|
|
2589
2622
|
matches.push([currentCollection, previousCollection]);
|
|
2590
2623
|
}
|
|
2591
2624
|
}
|
|
@@ -3323,6 +3356,55 @@ function generateIndexesArray(indexes) {
|
|
|
3323
3356
|
${indexStrings.join(",\n ")},
|
|
3324
3357
|
]`;
|
|
3325
3358
|
}
|
|
3359
|
+
function getSystemFields() {
|
|
3360
|
+
return [
|
|
3361
|
+
// id field - primary key, auto-generated
|
|
3362
|
+
{
|
|
3363
|
+
name: "id",
|
|
3364
|
+
type: "text",
|
|
3365
|
+
required: true,
|
|
3366
|
+
options: {
|
|
3367
|
+
autogeneratePattern: "[a-z0-9]{15}",
|
|
3368
|
+
hidden: false,
|
|
3369
|
+
id: "text3208210256",
|
|
3370
|
+
max: 15,
|
|
3371
|
+
min: 15,
|
|
3372
|
+
pattern: "^[a-z0-9]+$",
|
|
3373
|
+
presentable: false,
|
|
3374
|
+
primaryKey: true,
|
|
3375
|
+
system: true
|
|
3376
|
+
}
|
|
3377
|
+
},
|
|
3378
|
+
// created field - autodate, set on creation
|
|
3379
|
+
{
|
|
3380
|
+
name: "created",
|
|
3381
|
+
type: "autodate",
|
|
3382
|
+
required: true,
|
|
3383
|
+
options: {
|
|
3384
|
+
hidden: false,
|
|
3385
|
+
id: "autodate2990389176",
|
|
3386
|
+
onCreate: true,
|
|
3387
|
+
onUpdate: false,
|
|
3388
|
+
presentable: false,
|
|
3389
|
+
system: false
|
|
3390
|
+
}
|
|
3391
|
+
},
|
|
3392
|
+
// updated field - autodate, set on creation and update
|
|
3393
|
+
{
|
|
3394
|
+
name: "updated",
|
|
3395
|
+
type: "autodate",
|
|
3396
|
+
required: true,
|
|
3397
|
+
options: {
|
|
3398
|
+
hidden: false,
|
|
3399
|
+
id: "autodate3332085495",
|
|
3400
|
+
onCreate: true,
|
|
3401
|
+
onUpdate: true,
|
|
3402
|
+
presentable: false,
|
|
3403
|
+
system: false
|
|
3404
|
+
}
|
|
3405
|
+
}
|
|
3406
|
+
];
|
|
3407
|
+
}
|
|
3326
3408
|
function generateCollectionCreation(collection, varName = "collection", isLast = false) {
|
|
3327
3409
|
const lines = [];
|
|
3328
3410
|
lines.push(` const ${varName} = new Collection({`);
|
|
@@ -3335,7 +3417,9 @@ function generateCollectionCreation(collection, varName = "collection", isLast =
|
|
|
3335
3417
|
} else if (rulesCode) {
|
|
3336
3418
|
lines.push(` ${rulesCode},`);
|
|
3337
3419
|
}
|
|
3338
|
-
|
|
3420
|
+
const systemFields = getSystemFields();
|
|
3421
|
+
const allFields = [...systemFields, ...collection.fields];
|
|
3422
|
+
lines.push(` fields: ${generateFieldsArray(allFields)},`);
|
|
3339
3423
|
lines.push(` indexes: ${generateIndexesArray(collection.indexes)},`);
|
|
3340
3424
|
lines.push(` });`);
|
|
3341
3425
|
lines.push(``);
|