pocketbase-zod-schema 0.7.0 → 0.7.2

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.
Files changed (70) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cli/index.cjs +449 -50
  3. package/dist/cli/index.cjs.map +1 -1
  4. package/dist/cli/index.d.cts +1 -1
  5. package/dist/cli/index.d.ts +1 -1
  6. package/dist/cli/index.js +449 -50
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/cli/migrate.cjs +455 -53
  9. package/dist/cli/migrate.cjs.map +1 -1
  10. package/dist/cli/migrate.js +455 -53
  11. package/dist/cli/migrate.js.map +1 -1
  12. package/dist/cli/utils/index.cjs +8 -1
  13. package/dist/cli/utils/index.cjs.map +1 -1
  14. package/dist/cli/utils/index.d.cts +1 -1
  15. package/dist/cli/utils/index.d.ts +1 -1
  16. package/dist/cli/utils/index.js +8 -1
  17. package/dist/cli/utils/index.js.map +1 -1
  18. package/dist/index.cjs +90 -1
  19. package/dist/index.cjs.map +1 -1
  20. package/dist/index.d.cts +1 -1
  21. package/dist/index.d.ts +1 -1
  22. package/dist/index.js +87 -2
  23. package/dist/index.js.map +1 -1
  24. package/dist/migration/analyzer.cjs +87 -14
  25. package/dist/migration/analyzer.cjs.map +1 -1
  26. package/dist/migration/analyzer.d.cts +12 -4
  27. package/dist/migration/analyzer.d.ts +12 -4
  28. package/dist/migration/analyzer.js +87 -15
  29. package/dist/migration/analyzer.js.map +1 -1
  30. package/dist/migration/diff.cjs +64 -9
  31. package/dist/migration/diff.cjs.map +1 -1
  32. package/dist/migration/diff.d.cts +12 -2
  33. package/dist/migration/diff.d.ts +12 -2
  34. package/dist/migration/diff.js +64 -10
  35. package/dist/migration/diff.js.map +1 -1
  36. package/dist/migration/generator.cjs +206 -39
  37. package/dist/migration/generator.cjs.map +1 -1
  38. package/dist/migration/generator.d.cts +54 -2
  39. package/dist/migration/generator.d.ts +54 -2
  40. package/dist/migration/generator.js +203 -40
  41. package/dist/migration/generator.js.map +1 -1
  42. package/dist/migration/index.cjs +501 -63
  43. package/dist/migration/index.cjs.map +1 -1
  44. package/dist/migration/index.d.cts +2 -2
  45. package/dist/migration/index.d.ts +2 -2
  46. package/dist/migration/index.js +501 -63
  47. package/dist/migration/index.js.map +1 -1
  48. package/dist/migration/snapshot.cjs +147 -1
  49. package/dist/migration/snapshot.cjs.map +1 -1
  50. package/dist/migration/snapshot.d.cts +3 -1
  51. package/dist/migration/snapshot.d.ts +3 -1
  52. package/dist/migration/snapshot.js +147 -1
  53. package/dist/migration/snapshot.js.map +1 -1
  54. package/dist/migration/utils/index.d.cts +1 -1
  55. package/dist/migration/utils/index.d.ts +1 -1
  56. package/dist/schema.cjs +90 -1
  57. package/dist/schema.cjs.map +1 -1
  58. package/dist/schema.d.cts +128 -2
  59. package/dist/schema.d.ts +128 -2
  60. package/dist/schema.js +87 -2
  61. package/dist/schema.js.map +1 -1
  62. package/dist/server.cjs +545 -65
  63. package/dist/server.cjs.map +1 -1
  64. package/dist/server.d.cts +2 -2
  65. package/dist/server.d.ts +2 -2
  66. package/dist/server.js +542 -66
  67. package/dist/server.js.map +1 -1
  68. package/dist/{types-CWHV6ATd.d.cts → types-CnzfX6JH.d.cts} +20 -2
  69. package/dist/{types-C2nGWHLV.d.ts → types-Do3jyFBm.d.ts} +20 -2
  70. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/migration/errors.ts","../../src/migration/pocketbase-converter.ts","../../src/migration/migration-parser.ts","../../src/migration/snapshot.ts"],"names":["path","fs","match","SNAPSHOT_VERSION","path2","fs2","migrationContent"],"mappings":"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","file":"snapshot.cjs","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 * PocketBase Format Converter\n * Converts PocketBase collection objects to our internal CollectionSchema format\n *\n * This module handles conversion between PocketBase's native collection format\n * (as found in migration files and snapshots) and our internal schema representation.\n */\n\nimport { SnapshotError } from \"./errors\";\nimport type { CollectionSchema, FieldDefinition, SchemaSnapshot } from \"./types\";\n\nconst SNAPSHOT_VERSION = \"1.0.0\";\n\n/**\n * Resolves a collection ID to a collection name\n * Uses known constants and parses migration expressions to resolve IDs\n *\n * @param collectionId - The collection ID to resolve\n * @returns The collection name, or the original ID if it can't be resolved\n */\nexport function resolveCollectionIdToName(collectionId: string): string {\n // Special case: _pb_users_auth_ is the constant for users collection\n if (collectionId === \"_pb_users_auth_\") {\n return \"users\";\n }\n\n // Try to extract collection name from expressions like app.findCollectionByNameOrId(\"Name\").id\n const nameMatch = collectionId.match(/app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/);\n if (nameMatch) {\n return nameMatch[1];\n }\n\n // If we can't resolve it, return the original ID\n // This will cause a comparison issue, but it's better than failing\n return collectionId;\n}\n\n/**\n * Extracts field options from a PocketBase field object\n * Options can be placed directly on the field or in a nested options object\n * Direct properties take precedence over nested options\n *\n * @param pbField - PocketBase field object\n * @returns Merged options object\n */\nfunction extractFieldOptions(pbField: any): Record<string, any> {\n const options: Record<string, any> = {};\n\n // Start with nested options if present\n if (pbField.options && typeof pbField.options === \"object\") {\n Object.assign(options, pbField.options);\n }\n\n // Extract common field options from direct properties\n // These take precedence over nested options\n const directOptionKeys = [\n \"min\",\n \"max\",\n \"pattern\",\n \"noDecimal\", // text/number fields (legacy, PocketBase uses onlyInt)\n \"onlyInt\", // number fields (PocketBase uses this instead of noDecimal)\n \"values\",\n \"maxSelect\", // select fields\n \"mimeTypes\",\n \"maxSize\",\n \"thumbs\",\n \"protected\", // file fields\n \"onCreate\",\n \"onUpdate\", // autodate fields\n \"exceptDomains\",\n \"onlyDomains\", // email/url fields\n ];\n\n for (const key of directOptionKeys) {\n if (pbField[key] !== undefined) {\n options[key] = pbField[key];\n }\n }\n\n return options;\n}\n\n/**\n * Converts a PocketBase field object to FieldDefinition format\n *\n * @param pbField - PocketBase field object\n * @returns FieldDefinition object\n */\nexport function convertPocketBaseField(pbField: any): FieldDefinition {\n const field: any = {\n name: pbField.name,\n id: pbField.id,\n type: pbField.type,\n required: pbField.required || false,\n };\n\n // Extract options from both direct properties and nested options object\n field.options = extractFieldOptions(pbField);\n\n // Convert onlyInt to noDecimal for number fields (PocketBase uses onlyInt, but our schema uses noDecimal)\n if (pbField.type === \"number\" && field.options.onlyInt !== undefined) {\n field.options.noDecimal = field.options.onlyInt;\n delete field.options.onlyInt;\n }\n\n // Handle relation fields\n if (pbField.type === \"relation\") {\n // Support both formats: collectionId directly on field or in options\n const collectionId = pbField.collectionId || pbField.options?.collectionId || \"\";\n // Resolve collectionId to collection name\n // collectionId is a system field (like _pb_users_auth_), not the collection name\n // We need to resolve it to the actual collection name for comparison\n const collectionName = resolveCollectionIdToName(collectionId || \"\");\n field.relation = {\n collection: collectionName,\n cascadeDelete: pbField.cascadeDelete ?? pbField.options?.cascadeDelete ?? false,\n maxSelect: pbField.maxSelect ?? pbField.options?.maxSelect,\n minSelect: pbField.minSelect ?? pbField.options?.minSelect,\n displayFields: pbField.displayFields ?? pbField.options?.displayFields ?? null,\n };\n\n // Remove relation-specific properties from options\n // These belong in the relation object, not options\n delete field.options.maxSelect;\n delete field.options.minSelect;\n delete field.options.cascadeDelete;\n delete field.options.displayFields;\n }\n\n // Clean up empty options object, but preserve values for select fields\n // If options only contains values for a select field, keep it\n const hasOnlyValues = Object.keys(field.options).length === 1 && field.options.values !== undefined;\n if (Object.keys(field.options).length === 0) {\n delete field.options;\n } else if (pbField.type === \"select\" && hasOnlyValues) {\n // Keep options object if it only contains values for a select field\n // This ensures values are preserved for comparison\n }\n\n return field as FieldDefinition;\n}\n\n/**\n * Converts a PocketBase collection object to CollectionSchema format\n *\n * @param pbCollection - PocketBase collection object from migration file\n * @returns CollectionSchema object\n */\nexport function convertPocketBaseCollection(pbCollection: any): CollectionSchema {\n const fields: any[] = [];\n\n // System field names that should always be excluded\n const systemFieldNames = [\"id\", \"created\", \"updated\", \"collectionId\", \"collectionName\", \"expand\"];\n\n // Convert PocketBase fields to our FieldDefinition format\n if (pbCollection.fields && Array.isArray(pbCollection.fields)) {\n for (const pbField of pbCollection.fields) {\n // Skip system fields by checking both the system flag and field name\n // Some PocketBase exports mark created/updated as system: false\n if (pbField.system || systemFieldNames.includes(pbField.name)) {\n // For auth collections, we want to keep the system fields (email, password, etc.)\n // These are marked as system: true in PocketBase, but we need them in our schema\n // to match the CLI behavior which includes them in the fields array\n const isAuthSystemField =\n pbCollection.type === \"auth\" &&\n [\"email\", \"emailVisibility\", \"verified\", \"password\", \"tokenKey\"].includes(pbField.name);\n\n if (!isAuthSystemField) {\n continue;\n }\n }\n\n const field = convertPocketBaseField(pbField);\n fields.push(field);\n }\n }\n\n const schema: CollectionSchema = {\n name: pbCollection.name,\n type: pbCollection.type || \"base\",\n fields,\n };\n\n // Preserve collection ID if present (needed for relation resolution)\n if (pbCollection.id) {\n schema.id = pbCollection.id;\n }\n\n // Add indexes if present\n if (pbCollection.indexes && Array.isArray(pbCollection.indexes)) {\n schema.indexes = pbCollection.indexes;\n }\n\n // Add rules/permissions\n // Check if any rule properties exist on the collection object\n const hasAnyRule =\n pbCollection.listRule !== undefined ||\n pbCollection.viewRule !== undefined ||\n pbCollection.createRule !== undefined ||\n pbCollection.updateRule !== undefined ||\n pbCollection.deleteRule !== undefined ||\n pbCollection.manageRule !== undefined;\n\n if (hasAnyRule) {\n const rules: any = {};\n // Include rules even if they're null (null is a valid value)\n if (pbCollection.listRule !== undefined) rules.listRule = pbCollection.listRule;\n if (pbCollection.viewRule !== undefined) rules.viewRule = pbCollection.viewRule;\n if (pbCollection.createRule !== undefined) rules.createRule = pbCollection.createRule;\n if (pbCollection.updateRule !== undefined) rules.updateRule = pbCollection.updateRule;\n if (pbCollection.deleteRule !== undefined) rules.deleteRule = pbCollection.deleteRule;\n if (pbCollection.manageRule !== undefined) rules.manageRule = pbCollection.manageRule;\n\n schema.rules = rules;\n // Also set permissions to match rules (they're the same thing)\n schema.permissions = { ...rules };\n }\n\n return schema;\n}\n\n/**\n * Converts PocketBase migration format to SchemaSnapshot\n * Extracts the snapshot array from the migration file content\n *\n * @param migrationContent - Raw migration file content\n * @returns SchemaSnapshot with collections map\n */\nexport function convertPocketBaseMigration(migrationContent: string): SchemaSnapshot {\n try {\n // Extract the snapshot array from the migration file\n // The format is: migrate((app) => { const snapshot = [...]; ... })\n const snapshotMatch = migrationContent.match(/const\\s+snapshot\\s*=\\s*(\\[[\\s\\S]*?\\]);/);\n\n if (!snapshotMatch) {\n throw new Error(\"Could not find snapshot array in migration file\");\n }\n\n // Parse the snapshot array as JSON\n // We need to evaluate it as JavaScript since it's not pure JSON\n const snapshotArrayStr = snapshotMatch[1];\n let snapshotArray: any[];\n\n try {\n // Use Function constructor to safely evaluate the array\n // This is safer than eval() and works for our use case\n snapshotArray = new Function(`return ${snapshotArrayStr}`)();\n } catch (parseError) {\n throw new Error(`Failed to parse snapshot array: ${parseError}`);\n }\n\n if (!Array.isArray(snapshotArray)) {\n throw new Error(\"Snapshot is not an array\");\n }\n\n // Convert each collection to our format\n const collections = new Map<string, CollectionSchema>();\n\n for (const pbCollection of snapshotArray) {\n if (!pbCollection.name) {\n console.warn(\"Skipping collection without name\");\n continue;\n }\n\n const schema = convertPocketBaseCollection(pbCollection);\n collections.set(pbCollection.name, schema);\n }\n\n return {\n version: SNAPSHOT_VERSION,\n timestamp: new Date().toISOString(),\n collections,\n };\n } catch (error) {\n throw new SnapshotError(\n `Failed to convert PocketBase migration: ${error instanceof Error ? error.message : String(error)}`,\n undefined,\n \"parse\",\n error instanceof Error ? error : undefined\n );\n }\n}\n","/**\n * Migration File Parser\n * Parses PocketBase migration files to extract collection operations\n *\n * This module handles parsing migration files to extract:\n * - Collection creations (new Collection(...))\n * - Collection deletions (app.delete(...))\n * - Field modifications (field.property = value)\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { convertPocketBaseCollection, convertPocketBaseField } from \"./pocketbase-converter\";\nimport type { CollectionSchema, FieldDefinition } from \"./types\";\n\nexport interface ParsedCollectionUpdate {\n collectionName: string;\n fieldsToAdd: FieldDefinition[];\n fieldsToRemove: string[]; // names\n fieldsToUpdate: {\n fieldName: string;\n changes: Record<string, any>; // property -> value\n }[];\n indexesToAdd: string[];\n indexesToRemove: string[];\n rulesToUpdate: Record<string, string | null>;\n}\n\n/**\n * Extracts timestamp from migration filename\n * Migration files are named: [timestamp]_[description].js\n *\n * @param filename - Migration filename\n * @returns Timestamp as number or null if not found\n */\nexport function extractTimestampFromFilename(filename: string): number | null {\n const match = filename.match(/^(\\d+)_/);\n if (match) {\n return parseInt(match[1], 10);\n }\n return null;\n}\n\n/**\n * Finds all migration files after a given snapshot timestamp\n * Excludes snapshot files themselves\n *\n * @param migrationsPath - Path to migrations directory\n * @param snapshotTimestamp - Timestamp of the snapshot file\n * @returns Array of migration file paths sorted by timestamp\n */\nexport function findMigrationsAfterSnapshot(migrationsPath: string, snapshotTimestamp: number): string[] {\n try {\n if (!fs.existsSync(migrationsPath)) {\n return [];\n }\n\n const files = fs.readdirSync(migrationsPath);\n const migrationFiles: { path: string; timestamp: number }[] = [];\n const timestampsSeen = new Set<number>();\n // const duplicates: string[] = [];\n\n for (const file of files) {\n // Skip snapshot files\n if (file.endsWith(\"_collections_snapshot.js\") || file.endsWith(\"_snapshot.js\")) {\n continue;\n }\n\n // Skip non-JS files\n if (!file.endsWith(\".js\")) {\n continue;\n }\n\n const timestamp = extractTimestampFromFilename(file);\n if (timestamp) {\n if (timestampsSeen.has(timestamp)) {\n console.warn(`Duplicate migration timestamp detected: ${timestamp} in file ${file}`);\n }\n timestampsSeen.add(timestamp);\n\n if (timestamp > snapshotTimestamp) {\n migrationFiles.push({\n path: path.join(migrationsPath, file),\n timestamp,\n });\n }\n }\n }\n\n // Sort by timestamp (ascending order)\n migrationFiles.sort((a, b) => a.timestamp - b.timestamp);\n\n return migrationFiles.map((f) => f.path);\n } catch (error) {\n console.warn(`Error finding migrations after snapshot: ${error}`);\n return [];\n }\n}\n\n/**\n * Helper function to parse collection operations from migration content\n *\n * @param content - Migration content (should be just the UP migration)\n * @returns Object with collections to create and collections to delete\n */\nfunction parseMigrationOperationsFromContent(content: string): {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n collectionsToUpdate: ParsedCollectionUpdate[];\n} {\n const collectionsToCreate: CollectionSchema[] = [];\n const collectionsToDelete: string[] = [];\n const collectionsToUpdate: ParsedCollectionUpdate[] = [];\n\n // Mock app object for eval\n const mockApp = {\n findCollectionByNameOrId: (name: string) => ({ id: name, name }),\n };\n\n // Helper to get or create update object\n const getUpdate = (name: string) => {\n let update = collectionsToUpdate.find((u) => u.collectionName === name);\n if (!update) {\n update = {\n collectionName: name,\n fieldsToAdd: [],\n fieldsToRemove: [],\n fieldsToUpdate: [],\n indexesToAdd: [],\n indexesToRemove: [],\n rulesToUpdate: {},\n };\n collectionsToUpdate.push(update);\n }\n return update;\n };\n\n try {\n // 1. Parse Creations: new Collection({...})\n let searchIndex = 0;\n while (true) {\n const collectionStart = content.indexOf(\"new Collection(\", searchIndex);\n if (collectionStart === -1) {\n break;\n }\n\n const openParen = collectionStart + \"new Collection(\".length;\n let objectContent = \"\";\n let i = openParen;\n\n // Extract object literal\n let braceCount = 0;\n let parenCount = 1;\n let inString = false;\n let stringChar = null;\n let objectStart = -1;\n\n // Skip whitespace to find the opening brace\n while (i < content.length && /\\s/.test(content[i])) {\n i++;\n }\n\n if (content[i] === \"{\") {\n objectStart = i;\n braceCount = 1;\n i++;\n\n while (i < content.length && (braceCount > 0 || parenCount > 0)) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"{\") braceCount++;\n if (char === \"}\") braceCount--;\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n }\n i++;\n }\n\n if (braceCount === 0) {\n objectContent = content.substring(objectStart, i - (parenCount === 0 ? 1 : 0));\n // Correctly substring: if we broke loop because braceCount is 0, i is at char AFTER '}'\n // But if parenCount also went to 0, we might be further.\n // Actually my logic above: i increments at end of loop.\n // If braceCount becomes 0, loop continues if parenCount > 0 (which it is, started at 1)\n // Wait, new Collection({...})\n // { ... } is inside ( ... )\n // So braceCount goes 1 -> ... -> 0.\n // parenCount stays 1.\n // Loop continues until parenCount 0? No, usually `new Collection({...})`\n // The loop condition is `braceCount > 0 || parenCount > 0`.\n // When '}' matches, braceCount becomes 0. parenCount is 1. Loop continues.\n // Next char is ')'. parenCount becomes 0. Loop stops.\n }\n } else {\n // No object literal?\n searchIndex = i + 1;\n continue;\n }\n\n if (objectContent) {\n // We need to extract just the object part, which ended when braceCount hit 0.\n // My loop logic is a bit combined.\n // Let's rely on the previous simpler logic but refined.\n // Actually, let's use the object content extraction from the previous implementation but wrapped in this loop\n }\n\n // Re-implementing the object extraction carefully\n i = openParen;\n // Skip whitespace\n while (i < content.length && /\\s/.test(content[i])) {\n i++;\n }\n\n if (content[i] !== \"{\") {\n searchIndex = i + 1;\n continue;\n }\n\n const startObj = i;\n let bCount = 1;\n i++;\n let inStr = false;\n let strChar = null;\n\n while (i < content.length && bCount > 0) {\n const char = content[i];\n const prev = i > 0 ? content[i - 1] : \"\";\n\n if (!inStr && (char === '\"' || char === \"'\")) {\n inStr = true;\n strChar = char;\n } else if (inStr && char === strChar && prev !== \"\\\\\") {\n inStr = false;\n strChar = null;\n }\n\n if (!inStr) {\n if (char === \"{\") bCount++;\n if (char === \"}\") bCount--;\n }\n i++;\n }\n\n if (bCount === 0) {\n const objStr = content.substring(startObj, i);\n try {\n // Pass mockApp as 'app' to the function\n const collectionObj = new Function(\"app\", `return ${objStr}`)(mockApp);\n if (collectionObj && collectionObj.name) {\n const schema = convertPocketBaseCollection(collectionObj);\n collectionsToCreate.push(schema);\n }\n } catch (e) {\n console.warn(\"Failed to parse collection object:\", e);\n }\n }\n searchIndex = i;\n }\n\n // 2. Parse Deletions\n const deleteMatches = content.matchAll(\n /app\\.delete\\s*\\(\\s*(?:collection_\\w+|app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\))\\s*\\)/g\n );\n for (const match of deleteMatches) {\n if (match[1]) {\n collectionsToDelete.push(match[1]);\n } else {\n // Variable lookup logic (simplified for now, assuming standard variable naming)\n // Assuming collection variables are tracked if I were parsing sequentially.\n // But here I'm using regex.\n // Let's try to extract name from variable name if it follows `collection_NAME`\n const varMatch = match[0].match(/collection_(\\w+)/);\n if (varMatch) {\n // Try to infer name (may not be accurate if variable name != collection name)\n // But usually generator uses `collection_NAME`\n // Can I look up the definition?\n // Not easily without full scan.\n // I'll stick to what was there: try to find definition.\n const varName = `collection_${varMatch[1]}`;\n const defRegex = new RegExp(\n `const\\\\s+${varName}\\\\s*=\\\\s*app\\\\.findCollectionByNameOrId\\\\([\"']([^\"']+)[\"']\\\\)(?:\\\\s*//\\\\s*([^\\\\n\\\\r;]+))?`\n );\n const defMatch = content.match(defRegex);\n if (defMatch) {\n const name = defMatch[2] ? defMatch[2].trim() : defMatch[1];\n collectionsToDelete.push(name);\n } else {\n // Try new Collection assignment\n // const newColRegex = new RegExp(\n // `const\\\\s+${varName}\\\\s*=\\\\s*new\\\\s+Collection\\\\(\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}\\\\s*\\\\)`\n // );\n // This is hard.\n }\n }\n }\n }\n\n // Also direct delete of variable\n // Check assignments: const col = app.findCollectionByNameOrId(\"name\"); app.delete(col);\n const varAssignments = new Map<string, string>();\n const assignmentMatches = content.matchAll(\n /const\\s+(\\w+)\\s*=\\s*app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)(?:[ \\t]*\\/\\/\\s*([^\\n\\r;]+))?/g\n );\n for (const match of assignmentMatches) {\n const name = match[3] ? match[3].trim() : match[2];\n varAssignments.set(match[1], name);\n }\n\n const varDeleteMatches = content.matchAll(/app\\.delete\\s*\\(\\s*(\\w+)\\s*\\)/g);\n for (const match of varDeleteMatches) {\n if (varAssignments.has(match[1])) {\n const name = varAssignments.get(match[1])!;\n if (!collectionsToDelete.includes(name)) {\n collectionsToDelete.push(name);\n }\n }\n }\n\n // 3. Parse Updates\n\n // Map of variable name -> { collectionName, type: 'collection' | 'field' | 'index', parentVar? }\n const variables = new Map<string, { type: \"collection\" | \"field\"; name: string; parentCollection?: string }>();\n\n // Initialize variables from assignments\n for (const [varName, colName] of varAssignments) {\n variables.set(varName, { type: \"collection\", name: colName });\n }\n\n // Find field variables: const field = col.fields.getByName(\"name\")\n const fieldAssignmentMatches = content.matchAll(\n /const\\s+(\\w+)\\s*=\\s*(\\w+)\\.fields\\.getByName\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g\n );\n for (const match of fieldAssignmentMatches) {\n const [_, fieldVar, colVar, fieldName] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n variables.set(fieldVar, {\n type: \"field\",\n name: fieldName,\n parentCollection: colInfo.name,\n });\n }\n }\n\n // 3a. fields.add and fields.addAt\n // Pattern: colVar.fields.add(new TypeField({...})) OR colVar.fields.addAt(index, new TypeField({...}))\n const addFieldMatches = content.matchAll(\n /(\\w+)\\.fields\\.(?:add|addAt)\\s*\\((?:\\s*\\d+\\s*,)?\\s*new\\s+\\w*Field\\s*\\(/g\n );\n for (const match of addFieldMatches) {\n const [fullMatch, colVar] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n // Extract the field definition object\n const startIdx = match.index! + fullMatch.length;\n // We need to find the object inside (...)\n // It usually looks like: new TextField({ ... })\n // So we are at start of `{` hopefully?\n // Actually `new TextField(` -> next char might be whitespace then `{`\n\n let j = startIdx;\n while (j < content.length && /\\s/.test(content[j])) j++;\n\n if (content[j] === \"{\") {\n // Extract object\n const objStart = j;\n let bCount = 1;\n j++;\n let inStr = false;\n let sChar = null;\n\n while (j < content.length && bCount > 0) {\n const char = content[j];\n const prev = j > 0 ? content[j - 1] : \"\";\n if (!inStr && (char === '\"' || char === \"'\")) {\n inStr = true;\n sChar = char;\n } else if (inStr && char === sChar && prev !== \"\\\\\") {\n inStr = false;\n sChar = null;\n }\n if (!inStr) {\n if (char === \"{\") bCount++;\n if (char === \"}\") bCount--;\n }\n j++;\n }\n\n if (bCount === 0) {\n const objStr = content.substring(objStart, j);\n // We also need the type. Regex `new (\\w+)Field`\n const typeMatch = fullMatch.match(/new\\s+(\\w*)Field/);\n // const fieldTypeStr = typeMatch ? typeMatch[1].toLowerCase() : \"text\"; // Default/Fallback\n\n try {\n // We need to inject the type into the object if it's not there,\n // or rely on convertPocketBaseField.\n // convertPocketBaseField expects `type` property.\n // But `new TextField({...})` usually doesn't have `type: 'text'` inside.\n // It's inferred from constructor.\n\n const rawObj = new Function(\"app\", `return ${objStr}`)(mockApp);\n\n // Map constructor name to type string if needed\n // Valid types: text, number, bool, email, url, date, select, json, file, relation\n const typeMap: Record<string, string> = {\n Text: \"text\",\n Number: \"number\",\n Bool: \"bool\",\n Email: \"email\",\n URL: \"url\",\n Date: \"date\",\n Select: \"select\",\n JSON: \"json\",\n File: \"file\",\n Relation: \"relation\",\n };\n const typePrefix = typeMatch ? typeMatch[1] : \"Text\";\n const inferredType = typeMap[typePrefix] || typePrefix.toLowerCase();\n\n if (!rawObj.type) rawObj.type = inferredType;\n\n const fieldDef = convertPocketBaseField(rawObj);\n getUpdate(colInfo.name).fieldsToAdd.push(fieldDef);\n } catch (e) {\n console.warn(\"Failed to parse field object:\", e);\n }\n }\n }\n }\n }\n\n // 3b. fields.removeByName\n const removeFieldMatches = content.matchAll(/(\\w+)\\.fields\\.removeByName\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g);\n for (const match of removeFieldMatches) {\n const [_, colVar, fieldName] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n getUpdate(colInfo.name).fieldsToRemove.push(fieldName);\n }\n }\n\n // 3c. Field updates: fieldVar.prop = value\n // We iterate over lines/statements or just generic assignment regex?\n // Assignment: `var.prop = value;`\n // Regex: `(\\w+)\\.(\\w+)\\s*=\\s*(.+?);`\n // Be careful with newlines and semicolons.\n const assignmentRegex = RegExp(`(\\\\w+)\\\\.([\\\\w.]+)\\\\s*=\\\\s*([^;]+);`, \"g\");\n const assignments = content.matchAll(assignmentRegex);\n for (const match of assignments) {\n const [_, varName, propPath, valueStr] = match;\n const varInfo = variables.get(varName);\n\n if (varInfo) {\n if (varInfo.type === \"field\") {\n // Update to a field\n const colName = varInfo.parentCollection!;\n const fieldName = varInfo.name;\n const update = getUpdate(colName);\n\n let fieldUpdate = update.fieldsToUpdate.find((f) => f.fieldName === fieldName);\n if (!fieldUpdate) {\n fieldUpdate = { fieldName, changes: {} };\n update.fieldsToUpdate.push(fieldUpdate);\n }\n\n try {\n // Parse value\n const value = new Function(\"app\", `return ${valueStr}`)(mockApp);\n fieldUpdate.changes[propPath] = value;\n } catch {\n // console.warn(\"Failed to parse value:\", valueStr);\n // Use string if eval fails?\n fieldUpdate.changes[propPath] = valueStr.trim();\n }\n } else if (varInfo.type === \"collection\") {\n // Update to collection (rules, indexes)\n const colName = varInfo.name;\n const update = getUpdate(colName);\n\n if (propPath === \"indexes\") {\n // ignore direct assignment to indexes for now, usually it's push/splice\n } else if (propPath.endsWith(\"Rule\")) {\n try {\n const value = new Function(\"app\", `return ${valueStr}`)(mockApp);\n update.rulesToUpdate[propPath] = value;\n } catch {\n update.rulesToUpdate[propPath] = valueStr.trim();\n }\n }\n }\n }\n }\n\n // 3d. Indexes push/splice\n // col.indexes.push(\"...\")\n const idxPushRegex = /(\\w+)\\.indexes\\.push\\s*\\(/g;\n let match;\n while ((match = idxPushRegex.exec(content)) !== null) {\n const colVar = match[1];\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n // Parse forward to find matching closing parenthesis\n let i = match.index + match[0].length;\n let parenCount = 1;\n let inString = false;\n let stringChar: string | null = null;\n const start = i;\n\n while (i < content.length && parenCount > 0) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n }\n i++;\n }\n\n if (parenCount === 0) {\n const valStr = content.substring(start, i - 1).trim();\n try {\n const val = new Function(`return ${valStr}`)();\n getUpdate(colInfo.name).indexesToAdd.push(val);\n } catch {\n console.warn(`Failed to parse index value: ${valStr}`);\n }\n }\n }\n }\n\n // col.indexes.splice(idx, 1) - this is hard because we need to know what index corresponds to.\n // The generator produces:\n // const idxVar = col.indexes.findIndex(idx => idx === \"...\");\n // if (idxVar !== -1) col.indexes.splice(idxVar, 1);\n // So we should look for the findIndex call to identify the index string being removed.\n const idxFindMatches = content.matchAll(\n /const\\s+(\\w+)\\s*=\\s*(\\w+)\\.indexes\\.findIndex\\s*\\(\\s*idx\\s*=>\\s*idx\\s*===\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*\\)/g\n );\n for (const match of idxFindMatches) {\n const [_, idxVar, colVar, idxStr] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n try {\n // idxStr contains the JavaScript string value (escape sequences already processed)\n getUpdate(colInfo.name).indexesToRemove.push(idxStr);\n } catch {\n console.warn(`Failed to parse index value: ${idxStr} ${idxVar} ${colVar}`);\n }\n }\n }\n } catch (error) {\n console.warn(`Failed to parse migration operations from content: ${error}`);\n }\n\n return { collectionsToCreate, collectionsToDelete, collectionsToUpdate };\n}\n\n/**\n * Parses a migration file to extract collection operations\n * Extracts collections created with `new Collection(...)` and collections deleted with `app.delete(...)`\n * Only parses the UP migration (first function), not the down migration\n *\n * @param migrationContent - Raw migration file content\n * @returns Object with collections to create and collections to delete\n */\nexport function parseMigrationOperations(migrationContent: string): {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n collectionsToUpdate: ParsedCollectionUpdate[];\n} {\n try {\n // Extract only the UP migration (first function argument to migrate())\n // Find the migrate call and extract the first function body\n const migrateMatch = migrationContent.match(/migrate\\s*\\(\\s*/);\n if (!migrateMatch) {\n // If we can't find the migrate pattern, try to parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n const startIndex = migrateMatch.index! + migrateMatch[0].length;\n\n // Find the opening paren of the first function\n let i = startIndex;\n let parenCount = 0;\n let foundFirstParen = false;\n\n while (i < migrationContent.length) {\n const char = migrationContent[i];\n if (char === \"(\") {\n parenCount++;\n foundFirstParen = true;\n i++;\n break;\n }\n i++;\n }\n\n if (!foundFirstParen) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Skip the function parameters: (app) => {\n let inString = false;\n let stringChar = null;\n let foundBrace = false;\n let braceStart = -1;\n\n while (i < migrationContent.length && !foundBrace) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"(\") parenCount++;\n if (char === \")\") {\n parenCount--;\n if (parenCount === 0) {\n // Found end of function parameters, look for =>\n i++;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length - 1 && migrationContent[i] === \"=\" && migrationContent[i + 1] === \">\") {\n i += 2;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length && migrationContent[i] === \"{\") {\n foundBrace = true;\n braceStart = i + 1;\n break;\n }\n }\n }\n }\n }\n i++;\n }\n\n if (!foundBrace || braceStart === -1) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Find the matching closing brace\n let braceCount = 1;\n i = braceStart;\n inString = false;\n stringChar = null;\n\n while (i < migrationContent.length && braceCount > 0) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"{\") braceCount++;\n if (char === \"}\") braceCount--;\n }\n\n i++;\n }\n\n if (braceCount === 0) {\n const upMigrationContent = migrationContent.substring(braceStart, i - 1);\n return parseMigrationOperationsFromContent(upMigrationContent);\n }\n\n // Fallback: parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n } catch (error) {\n console.warn(`Failed to parse migration operations: ${error}`);\n return { collectionsToCreate: [], collectionsToDelete: [], collectionsToUpdate: [] };\n }\n}\n","/**\n * Snapshot Manager\n * Handles saving and loading schema snapshots from JSON files\n *\n * This module provides a standalone, configurable snapshot manager that can be used\n * by consumer projects to manage schema snapshots. It focuses on JSON snapshot file\n * management, delegating migration file parsing and PocketBase format conversion\n * to specialized modules.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { FileSystemError, SnapshotError } from \"./errors\";\nimport {\n extractTimestampFromFilename,\n findMigrationsAfterSnapshot,\n parseMigrationOperations,\n type ParsedCollectionUpdate,\n} from \"./migration-parser\";\nimport { convertPocketBaseMigration } from \"./pocketbase-converter\";\nimport type { CollectionSchema, SchemaDefinition, SchemaSnapshot } from \"./types\";\n\nconst SNAPSHOT_VERSION = \"1.0.0\";\nconst DEFAULT_SNAPSHOT_FILENAME = \".migration-snapshot.json\";\n\n/**\n * Configuration for snapshot operations\n */\nexport interface SnapshotConfig {\n /**\n * Path to the snapshot file\n * Can be absolute or relative to workspaceRoot\n */\n snapshotPath?: string;\n\n /**\n * Workspace root directory for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * Path to the migrations directory for finding PocketBase snapshots\n */\n migrationsPath?: string;\n\n /**\n * Whether to auto-migrate old snapshot formats\n * Defaults to true\n */\n autoMigrate?: boolean;\n\n /**\n * Custom snapshot version for testing\n */\n version?: string;\n}\n\n/**\n * Snapshot format versions and their migration functions\n */\ninterface SnapshotMigration {\n fromVersion: string;\n toVersion: string;\n migrate: (data: any) => any;\n}\n\n/**\n * Registry of snapshot format migrations\n */\nconst SNAPSHOT_MIGRATIONS: SnapshotMigration[] = [\n // Add migrations here as the format evolves\n // Example:\n // {\n // fromVersion: '0.9.0',\n // toVersion: '1.0.0',\n // migrate: (data) => ({ ...data, newField: 'default' })\n // }\n];\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Omit<Required<SnapshotConfig>, \"migrationsPath\"> & { migrationsPath?: string } = {\n snapshotPath: DEFAULT_SNAPSHOT_FILENAME,\n workspaceRoot: process.cwd(),\n autoMigrate: true,\n version: SNAPSHOT_VERSION,\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config: SnapshotConfig = {}): typeof DEFAULT_CONFIG {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Gets the snapshot file path from configuration\n *\n * @param config - Snapshot configuration\n * @returns Absolute path to the snapshot file\n */\nexport function getSnapshotPath(config: SnapshotConfig = {}): string {\n const mergedConfig = mergeConfig(config);\n const workspaceRoot = mergedConfig.workspaceRoot;\n const snapshotFilename = mergedConfig.snapshotPath;\n\n // If snapshotPath is absolute, use it directly\n if (path.isAbsolute(snapshotFilename)) {\n return snapshotFilename;\n }\n\n // Otherwise, resolve relative to workspaceRoot\n return path.join(workspaceRoot, snapshotFilename);\n}\n\n/**\n * Checks if snapshot file exists\n *\n * @param config - Snapshot configuration\n * @returns True if snapshot file exists\n */\nexport function snapshotExists(config: SnapshotConfig = {}): boolean {\n try {\n const snapshotPath = getSnapshotPath(config);\n return fs.existsSync(snapshotPath);\n } catch {\n // If there's any error checking existence, treat as non-existent\n return false;\n }\n}\n\n/**\n * Handles file system errors with descriptive messages\n *\n * @param error - The error object\n * @param operation - The operation being performed\n * @param filePath - The file path involved\n * @throws SnapshotError or FileSystemError with descriptive message\n */\nfunction handleFileSystemError(error: any, operation: \"read\" | \"write\", filePath: string): never {\n const fsError = error as NodeJS.ErrnoException;\n\n if (fsError.code === \"ENOENT\") {\n throw new SnapshotError(`Snapshot file not found: ${filePath}`, filePath, operation, error);\n } else if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied ${operation === \"read\" ? \"reading\" : \"writing\"} snapshot file. Check file permissions.`,\n filePath,\n operation,\n fsError.code,\n error\n );\n } else if (fsError.code === \"ENOSPC\") {\n throw new FileSystemError(\n `No space left on device when ${operation === \"read\" ? \"reading\" : \"writing\"} snapshot file.`,\n filePath,\n operation,\n fsError.code,\n error\n );\n } else {\n throw new SnapshotError(`Failed to ${operation} snapshot file: ${error.message}`, filePath, operation, error);\n }\n}\n\n/**\n * Serializes a Map to a plain object for JSON serialization\n *\n * @param map - Map to serialize\n * @returns Plain object representation\n */\nfunction serializeMap<K extends string, V>(map: Map<K, V>): Record<K, V> {\n const obj: Record<string, V> = {};\n for (const [key, value] of map.entries()) {\n obj[key] = value;\n }\n return obj as Record<K, V>;\n}\n\n/**\n * Deserializes a plain object to a Map\n *\n * @param obj - Plain object to deserialize\n * @returns Map representation\n */\nfunction deserializeMap<K extends string, V>(obj: Record<K, V>): Map<K, V> {\n const map = new Map<K, V>();\n for (const [key, value] of Object.entries(obj)) {\n map.set(key as K, value as V);\n }\n return map;\n}\n\n/**\n * Serializes SchemaDefinition to JSON format\n * Converts Map to plain object for JSON compatibility\n *\n * @param schema - Schema definition to serialize\n * @returns JSON-serializable object\n */\nfunction serializeSchemaDefinition(schema: SchemaDefinition): any {\n return {\n collections: serializeMap(schema.collections),\n };\n}\n\n/**\n * Adds version and timestamp metadata to snapshot\n *\n * @param schema - Schema definition\n * @param config - Optional configuration with custom version\n * @returns Snapshot with metadata\n */\nfunction addSnapshotMetadata(schema: SchemaDefinition, config?: SnapshotConfig): any {\n const mergedConfig = mergeConfig(config);\n return {\n version: mergedConfig.version,\n timestamp: new Date().toISOString(),\n ...serializeSchemaDefinition(schema),\n };\n}\n\n/**\n * Saves schema snapshot to file\n * Serializes SchemaDefinition to JSON with version and timestamp metadata\n * Writes with pretty printing for readability\n *\n * @param schema - Schema definition to save\n * @param config - Snapshot configuration\n */\nexport function saveSnapshot(schema: SchemaDefinition, config: SnapshotConfig = {}): void {\n const snapshotPath = getSnapshotPath(config);\n\n try {\n // Ensure directory exists\n const snapshotDir = path.dirname(snapshotPath);\n if (!fs.existsSync(snapshotDir)) {\n fs.mkdirSync(snapshotDir, { recursive: true });\n }\n\n // Add metadata and serialize\n const snapshotData = addSnapshotMetadata(schema, config);\n\n // Write with pretty printing (2 spaces indentation)\n const jsonContent = JSON.stringify(snapshotData, null, 2);\n fs.writeFileSync(snapshotPath, jsonContent, \"utf-8\");\n } catch (error) {\n handleFileSystemError(error, \"write\", snapshotPath);\n }\n}\n\n/**\n * Parses JSON and validates snapshot format\n *\n * @param jsonContent - Raw JSON content\n * @param snapshotPath - Path to snapshot file (for error messages)\n * @returns Parsed snapshot data\n */\nfunction parseAndValidateSnapshot(jsonContent: string, snapshotPath: string): any {\n try {\n const data = JSON.parse(jsonContent);\n\n // Validate required fields\n if (!data.version) {\n throw new SnapshotError(\n \"Snapshot file is missing version field. The snapshot may be corrupted.\",\n snapshotPath,\n \"validate\"\n );\n }\n\n if (!data.timestamp) {\n throw new SnapshotError(\n \"Snapshot file is missing timestamp field. The snapshot may be corrupted.\",\n snapshotPath,\n \"validate\"\n );\n }\n\n if (!data.collections) {\n throw new SnapshotError(\n \"Snapshot file is missing collections field. The snapshot may be corrupted.\",\n snapshotPath,\n \"validate\"\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof SnapshotError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new SnapshotError(\n `Invalid JSON in snapshot file. The file may be corrupted or manually edited incorrectly.`,\n snapshotPath,\n \"parse\",\n error\n );\n }\n throw error;\n }\n}\n\n/**\n * Compares two version strings\n * Returns -1 if a < b, 0 if a == b, 1 if a > b\n */\nfunction compareVersions(a: string, b: string): number {\n const partsA = a.split(\".\").map(Number);\n const partsB = b.split(\".\").map(Number);\n\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const numA = partsA[i] || 0;\n const numB = partsB[i] || 0;\n\n if (numA < numB) return -1;\n if (numA > numB) return 1;\n }\n\n return 0;\n}\n\n/**\n * Migrates old snapshot formats to current version\n * Applies migrations in sequence from old version to current\n *\n * @param data - Parsed snapshot data\n * @param config - Optional configuration\n * @returns Migrated snapshot data\n */\nfunction migrateSnapshotFormat(data: any, config?: SnapshotConfig): any {\n const mergedConfig = mergeConfig(config);\n const currentVersion = data.version;\n const targetVersion = mergedConfig.version;\n\n // If versions match, no migration needed\n if (currentVersion === targetVersion) {\n return data;\n }\n\n // If auto-migrate is disabled, just return the data with a warning\n if (!mergedConfig.autoMigrate) {\n console.warn(\n `Snapshot version ${currentVersion} differs from current ${targetVersion}, but auto-migrate is disabled.`\n );\n return data;\n }\n\n // Find and apply migrations in sequence\n let migratedData = { ...data };\n let currentMigrationVersion = currentVersion;\n\n // Sort migrations by fromVersion\n const sortedMigrations = [...SNAPSHOT_MIGRATIONS].sort((a, b) => compareVersions(a.fromVersion, b.fromVersion));\n\n for (const migration of sortedMigrations) {\n if (compareVersions(currentMigrationVersion, migration.fromVersion) === 0) {\n console.log(`Migrating snapshot from ${migration.fromVersion} to ${migration.toVersion}...`);\n migratedData = migration.migrate(migratedData);\n migratedData.version = migration.toVersion;\n currentMigrationVersion = migration.toVersion;\n }\n }\n\n // If we couldn't migrate to the target version, log a warning\n if (compareVersions(currentMigrationVersion, targetVersion) !== 0) {\n console.warn(`Unknown snapshot version ${currentVersion}, attempting to load anyway...`);\n }\n\n return migratedData;\n}\n\n/**\n * Deserializes snapshot data to SchemaSnapshot\n *\n * @param data - Parsed and validated snapshot data\n * @returns SchemaSnapshot object\n */\nfunction deserializeSnapshot(data: any): SchemaSnapshot {\n return {\n version: data.version,\n timestamp: data.timestamp,\n collections: deserializeMap<string, CollectionSchema>(data.collections),\n };\n}\n\n/**\n * Loads schema snapshot from file\n * Reads snapshot file, parses JSON, validates format, and handles migrations\n *\n * @param config - Snapshot configuration\n * @returns SchemaSnapshot object\n * @throws Error if snapshot file doesn't exist or is invalid\n */\nexport function loadSnapshot(config: SnapshotConfig = {}): SchemaSnapshot {\n const snapshotPath = getSnapshotPath(config);\n\n try {\n // Read file\n const jsonContent = fs.readFileSync(snapshotPath, \"utf-8\");\n\n // Parse and validate\n const data = parseAndValidateSnapshot(jsonContent, snapshotPath);\n\n // Migrate format if needed\n const migratedData = migrateSnapshotFormat(data, config);\n\n // Deserialize to SchemaSnapshot\n return deserializeSnapshot(migratedData);\n } catch (error) {\n // If it's already a SnapshotError or FileSystemError, re-throw it\n if (error instanceof SnapshotError || error instanceof FileSystemError) {\n throw error;\n }\n\n // If file doesn't exist, throw specific error\n if ((error as any).code === \"ENOENT\") {\n throw new SnapshotError(\n `Snapshot file not found. This may be the first migration run.`,\n snapshotPath,\n \"read\",\n error as Error\n );\n }\n\n // Handle other file system errors\n handleFileSystemError(error, \"read\", snapshotPath);\n }\n}\n\n/**\n * Merges base schema with custom snapshot\n * Base schema collections are preserved, custom collections are added\n * Custom collections override base collections if they have the same name\n *\n * @param baseSnapshot - PocketBase base schema\n * @param customSnapshot - User's custom schema snapshot (may be null)\n * @returns Merged SchemaSnapshot\n */\nexport function mergeSnapshots(baseSnapshot: SchemaSnapshot, customSnapshot: SchemaSnapshot | null): SchemaSnapshot {\n // If no custom snapshot, return base snapshot\n if (!customSnapshot) {\n return baseSnapshot;\n }\n\n // Create a new collections map starting with base collections\n const mergedCollections = new Map<string, CollectionSchema>(baseSnapshot.collections);\n\n // Add or override with custom collections\n for (const [name, schema] of customSnapshot.collections.entries()) {\n mergedCollections.set(name, schema);\n }\n\n return {\n version: customSnapshot.version || baseSnapshot.version,\n timestamp: customSnapshot.timestamp || baseSnapshot.timestamp,\n collections: mergedCollections,\n };\n}\n\n/**\n * Finds the most recent snapshot file in the migrations directory\n * Identifies snapshot files by naming pattern (e.g., *_collections_snapshot.js)\n *\n * @param migrationsPath - Path to pb_migrations directory\n * @returns Path to most recent snapshot file or null if none exist\n */\nexport function findLatestSnapshot(migrationsPath: string): string | null {\n try {\n // Check if migrations directory exists\n if (!fs.existsSync(migrationsPath)) {\n return null;\n }\n\n // Read all files in migrations directory\n const files = fs.readdirSync(migrationsPath);\n\n // Filter for snapshot files (files ending with _collections_snapshot.js or _snapshot.js)\n const snapshotFiles = files.filter(\n (file) => file.endsWith(\"_collections_snapshot.js\") || file.endsWith(\"_snapshot.js\")\n );\n\n if (snapshotFiles.length === 0) {\n return null;\n }\n\n // Sort by filename (timestamp prefix) to get most recent\n // Snapshot files are named with timestamp prefix: [timestamp]_collections_snapshot.js\n snapshotFiles.sort().reverse();\n\n // Return full path to most recent snapshot\n const latestSnapshot = snapshotFiles[0];\n if (!latestSnapshot) {\n return null;\n }\n return path.join(migrationsPath, latestSnapshot);\n } catch (error) {\n // If there's any error reading directory, return null\n console.warn(`Error finding latest snapshot: ${error}`);\n return null;\n }\n}\n\n/**\n * Applies migration operations to a snapshot state\n * Creates new collections and deletes collections as specified\n *\n * @param snapshot - Base snapshot state\n * @param operations - Migration operations to apply\n * @returns Updated snapshot with operations applied\n */\nexport function applyMigrationOperations(\n snapshot: SchemaSnapshot,\n operations: {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n collectionsToUpdate: ParsedCollectionUpdate[];\n }\n): SchemaSnapshot {\n const updatedCollections = new Map(snapshot.collections);\n\n // Apply deletions first\n for (const collectionName of operations.collectionsToDelete) {\n updatedCollections.delete(collectionName);\n }\n\n // Apply creations\n for (const collection of operations.collectionsToCreate) {\n updatedCollections.set(collection.name, collection);\n }\n\n // Apply updates\n for (const update of operations.collectionsToUpdate) {\n const collection = updatedCollections.get(update.collectionName);\n if (collection) {\n // Add fields\n if (update.fieldsToAdd.length > 0) {\n for (const newField of update.fieldsToAdd) {\n // Check if field with same ID already exists (update/replace)\n const existingIndex = collection.fields.findIndex((f) => f.id === newField.id);\n if (newField.id && existingIndex !== -1) {\n collection.fields[existingIndex] = newField;\n } else {\n collection.fields.push(newField);\n }\n }\n }\n\n // Remove fields\n if (update.fieldsToRemove.length > 0) {\n collection.fields = collection.fields.filter((f) => !update.fieldsToRemove.includes(f.name));\n }\n\n // Update fields\n for (const fieldUpdate of update.fieldsToUpdate) {\n const field = collection.fields.find((f) => f.name === fieldUpdate.fieldName);\n if (field) {\n const topLevelFieldProps = [\"name\", \"type\", \"required\", \"unique\", \"system\", \"id\", \"presentable\"];\n\n for (const [key, value] of Object.entries(fieldUpdate.changes)) {\n if (key.startsWith(\"options.\")) {\n const optionKey = key.replace(\"options.\", \"\");\n if (!field.options) field.options = {};\n field.options[optionKey] = value;\n } else if (key.startsWith(\"relation.\")) {\n const relationKey = key.replace(\"relation.\", \"\");\n if (!field.relation && field.type === \"relation\") {\n // Should initialize relation object if missing but type is relation\n field.relation = { collection: \"\" };\n }\n if (field.relation) {\n (field.relation as any)[relationKey] = value;\n }\n } else if (topLevelFieldProps.includes(key)) {\n (field as any)[key] = value;\n } else {\n // It's likely an option (e.g. 'values', 'min', 'max') being set directly\n // as produced by the generator or PocketBase SDK\n if (!field.options) field.options = {};\n field.options[key] = value;\n }\n }\n }\n }\n\n // Indexes\n if (update.indexesToAdd.length > 0) {\n if (!collection.indexes) collection.indexes = [];\n collection.indexes.push(...update.indexesToAdd);\n }\n\n if (update.indexesToRemove.length > 0) {\n if (collection.indexes) {\n collection.indexes = collection.indexes.filter((idx) => !update.indexesToRemove.includes(idx));\n }\n }\n\n // Rules\n if (Object.keys(update.rulesToUpdate).length > 0) {\n if (!collection.rules) collection.rules = {};\n if (!collection.permissions) collection.permissions = {};\n\n for (const [key, value] of Object.entries(update.rulesToUpdate)) {\n // key is like 'listRule'\n // TS constraint: key must be one of the known rule types.\n // Since ParsedCollectionUpdate uses string key, we cast or check.\n (collection.rules as any)[key] = value;\n (collection.permissions as any)[key] = value;\n }\n }\n } else {\n console.warn(`Attempted to update non-existent collection: ${update.collectionName}`);\n }\n }\n\n return {\n ...snapshot,\n collections: updatedCollections,\n };\n}\n\n/**\n * Loads snapshot and applies all migrations that come after it\n * This gives us the current state of the database schema\n *\n * @param config - Snapshot configuration (must include migrationsPath)\n * @returns SchemaSnapshot object representing current state or null if snapshot doesn't exist\n */\nexport function loadSnapshotWithMigrations(config: SnapshotConfig = {}): SchemaSnapshot | null {\n const migrationsPath = config.migrationsPath;\n\n if (!migrationsPath) {\n return null;\n }\n\n // Check if migrationsPath is actually a file (for backward compatibility with tests)\n if (fs.existsSync(migrationsPath) && fs.statSync(migrationsPath).isFile()) {\n try {\n const migrationContent = fs.readFileSync(migrationsPath, \"utf-8\");\n return convertPocketBaseMigration(migrationContent);\n } catch (error) {\n console.warn(`Failed to load snapshot from ${migrationsPath}: ${error}`);\n return null;\n }\n }\n\n // It's a directory, find the latest snapshot\n const latestSnapshotPath = findLatestSnapshot(migrationsPath);\n\n if (!latestSnapshotPath) {\n // No snapshot found - return null (empty database)\n return null;\n }\n\n try {\n // Read and convert the PocketBase snapshot file\n const migrationContent = fs.readFileSync(latestSnapshotPath, \"utf-8\");\n let snapshot = convertPocketBaseMigration(migrationContent);\n\n // Extract timestamp from snapshot filename\n const snapshotFilename = path.basename(latestSnapshotPath);\n const snapshotTimestamp = extractTimestampFromFilename(snapshotFilename);\n\n if (snapshotTimestamp) {\n // Find all migration files after the snapshot\n const migrationFiles = findMigrationsAfterSnapshot(migrationsPath, snapshotTimestamp);\n\n // Apply each migration in order\n for (const migrationFile of migrationFiles) {\n try {\n const migrationContent = fs.readFileSync(migrationFile, \"utf-8\");\n const operations = parseMigrationOperations(migrationContent);\n snapshot = applyMigrationOperations(snapshot, operations);\n } catch (error) {\n console.warn(`Failed to apply migration ${migrationFile}: ${error}`);\n // Continue with other migrations even if one fails\n }\n }\n }\n\n return snapshot;\n } catch (error) {\n console.warn(`Failed to load snapshot from ${latestSnapshotPath}: ${error}`);\n return null;\n }\n}\n\n/**\n * Loads snapshot if it exists, returns null for first run\n * Convenience method that handles missing snapshot gracefully\n * Finds the most recent snapshot file from migrations directory\n * NOTE: This function only loads the snapshot, not migrations after it.\n * Use loadSnapshotWithMigrations() if you need the current state including migrations.\n *\n * @param config - Snapshot configuration (must include migrationsPath)\n * @returns SchemaSnapshot object or null if snapshot doesn't exist\n */\nexport function loadSnapshotIfExists(config: SnapshotConfig = {}): SchemaSnapshot | null {\n const migrationsPath = config.migrationsPath;\n\n if (!migrationsPath) {\n // No migrations path provided - return null\n return null;\n }\n\n // Check if migrationsPath is actually a file (for backward compatibility with tests)\n // If it's a file, treat it as a direct snapshot file path\n if (fs.existsSync(migrationsPath) && fs.statSync(migrationsPath).isFile()) {\n try {\n const migrationContent = fs.readFileSync(migrationsPath, \"utf-8\");\n return convertPocketBaseMigration(migrationContent);\n } catch (error) {\n console.warn(`Failed to load snapshot from ${migrationsPath}: ${error}`);\n return null;\n }\n }\n\n // It's a directory, find the latest snapshot\n const latestSnapshotPath = findLatestSnapshot(migrationsPath);\n\n if (latestSnapshotPath) {\n try {\n // Read and convert the PocketBase snapshot file\n const migrationContent = fs.readFileSync(latestSnapshotPath, \"utf-8\");\n return convertPocketBaseMigration(migrationContent);\n } catch (error) {\n console.warn(`Failed to load snapshot from ${latestSnapshotPath}: ${error}`);\n return null;\n }\n }\n\n // No snapshot found - return null (empty database)\n return null;\n}\n\n/**\n * Loads the base PocketBase schema from the initial migration file\n *\n * @param migrationPath - Path to pocketbase/pb_migrations/000000000_collections_snapshot.js\n * @returns SchemaSnapshot representing PocketBase's initial state\n * @throws SnapshotError if file not found or invalid format\n */\nexport function loadBaseMigration(migrationPath: string): SchemaSnapshot {\n try {\n // Check if file exists\n if (!fs.existsSync(migrationPath)) {\n throw new SnapshotError(\n `Base migration file not found: ${migrationPath}\\n\\n` +\n `This file should contain PocketBase's initial schema.\\n` +\n `Please ensure PocketBase is properly set up by running 'yarn setup'.\\n` +\n `If the file exists in a different location, update the configuration.`,\n migrationPath,\n \"read\"\n );\n }\n\n // Read the migration file\n const migrationContent = fs.readFileSync(migrationPath, \"utf-8\");\n\n // Convert to SchemaSnapshot\n const snapshot = convertPocketBaseMigration(migrationContent);\n\n return snapshot;\n } catch (error) {\n // If it's already a SnapshotError, re-throw it\n if (error instanceof SnapshotError) {\n throw error;\n }\n\n // Handle file system errors\n if ((error as any).code === \"ENOENT\") {\n throw new SnapshotError(\n `Base migration file not found: ${migrationPath}\\n\\n` +\n `This file should contain PocketBase's initial schema.\\n` +\n `Please ensure PocketBase is properly set up by running 'yarn setup'.`,\n migrationPath,\n \"read\",\n error as Error\n );\n }\n\n if ((error as any).code === \"EACCES\" || (error as any).code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied reading base migration file. Check file permissions.`,\n migrationPath,\n \"read\",\n (error as any).code,\n error as Error\n );\n }\n\n // Other errors\n throw new SnapshotError(\n `Failed to load base migration: ${error instanceof Error ? error.message : String(error)}`,\n migrationPath,\n \"read\",\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Gets the current snapshot version\n */\nexport function getSnapshotVersion(): string {\n return SNAPSHOT_VERSION;\n}\n\n/**\n * Validates a snapshot against the current version\n * Returns validation result with any issues found\n */\nexport function validateSnapshot(snapshot: SchemaSnapshot): { valid: boolean; issues: string[] } {\n const issues: string[] = [];\n\n // Check version\n if (!snapshot.version) {\n issues.push(\"Missing version field\");\n } else if (compareVersions(snapshot.version, SNAPSHOT_VERSION) > 0) {\n issues.push(`Snapshot version ${snapshot.version} is newer than supported version ${SNAPSHOT_VERSION}`);\n }\n\n // Check timestamp\n if (!snapshot.timestamp) {\n issues.push(\"Missing timestamp field\");\n }\n\n // Check collections\n if (!snapshot.collections) {\n issues.push(\"Missing collections field\");\n } else if (!(snapshot.collections instanceof Map)) {\n issues.push(\"Collections field is not a Map\");\n }\n\n return {\n valid: issues.length === 0,\n issues,\n };\n}\n\n/**\n * Re-exports convertPocketBaseMigration for backward compatibility\n */\nexport { convertPocketBaseMigration } from \"./pocketbase-converter\";\n\n/**\n * SnapshotManager class for object-oriented usage\n * Provides a stateful interface for snapshot management\n */\nexport class SnapshotManager {\n private config: SnapshotConfig;\n\n constructor(config: SnapshotConfig = {}) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Loads the current snapshot\n */\n loadSnapshot(): SchemaSnapshot {\n return loadSnapshot(this.config);\n }\n\n /**\n * Saves a schema as a snapshot\n */\n saveSnapshot(schema: SchemaDefinition): void {\n saveSnapshot(schema, this.config);\n }\n\n /**\n * Loads snapshot if it exists, returns null otherwise\n */\n loadSnapshotIfExists(): SchemaSnapshot | null {\n return loadSnapshotIfExists(this.config);\n }\n\n /**\n * Checks if a snapshot exists\n */\n snapshotExists(): boolean {\n return snapshotExists(this.config);\n }\n\n /**\n * Converts a PocketBase migration to a snapshot\n */\n convertPocketBaseMigration(content: string): SchemaSnapshot {\n return convertPocketBaseMigration(content);\n }\n\n /**\n * Gets the snapshot file path\n */\n getSnapshotPath(): string {\n return getSnapshotPath(this.config);\n }\n\n /**\n * Validates a snapshot\n */\n validateSnapshot(snapshot: SchemaSnapshot): { valid: boolean; issues: string[] } {\n return validateSnapshot(snapshot);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/migration/errors.ts","../../src/schema/view.ts","../../src/migration/pocketbase-converter.ts","../../src/migration/migration-parser.ts","../../src/migration/snapshot.ts"],"names":["path","fs","match","SNAPSHOT_VERSION","path2","fs2","migrationContent"],"mappings":"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","file":"snapshot.cjs","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","import { z } from \"zod\";\nimport type { RuleExpression } from \"../utils/permissions\";\nimport { defineCollection } from \"./base\";\n\n/**\n * Permission rules that apply to a view collection\n *\n * View collections are read-only: PocketBase rejects createRule, updateRule,\n * deleteRule and manageRule on them, so only the two read rules are accepted.\n */\nexport interface ViewPermissionSchema {\n /** Controls who can list/query the view's rows */\n listRule?: RuleExpression;\n\n /** Controls who can view an individual row */\n viewRule?: RuleExpression;\n}\n\n/**\n * Configuration options for defining a view collection\n */\nexport interface ViewCollectionConfig {\n /**\n * The name of the PocketBase collection\n */\n collectionName: string;\n\n /**\n * The Zod schema describing the shape of a row\n *\n * For views this is used for TypeScript type generation and application-side\n * parsing only - PocketBase derives the collection's actual fields from the\n * SQL query when the collection is saved.\n */\n schema: z.ZodObject<any>;\n\n /**\n * The SQL SELECT statement backing the view\n *\n * Use the `sql` tagged template for consistent formatting.\n */\n viewQuery: string;\n\n /**\n * Optional read permissions (listRule / viewRule)\n */\n permissions?: ViewPermissionSchema;\n}\n\n/**\n * Removes the common leading indentation from a multi-line string and trims\n * blank leading/trailing lines\n *\n * Keeps generated migrations stable when a query is re-indented in the source\n * file, since only the relative indentation is preserved. Also used when\n * reading a query back out of a migration file, where the generator has\n * indented it to fit the surrounding code.\n *\n * @param value - Raw multi-line string\n * @returns Dedented string\n */\nexport function dedentSql(value: string): string {\n const lines = value.replace(/\\r\\n/g, \"\\n\").split(\"\\n\");\n\n // Drop leading and trailing blank lines\n while (lines.length > 0 && lines[0].trim() === \"\") {\n lines.shift();\n }\n while (lines.length > 0 && lines[lines.length - 1].trim() === \"\") {\n lines.pop();\n }\n\n if (lines.length === 0) {\n return \"\";\n }\n\n // Find the smallest indentation across all non-blank lines\n let minIndent = Infinity;\n for (const line of lines) {\n if (line.trim() === \"\") continue;\n const indent = line.length - line.trimStart().length;\n if (indent < minIndent) {\n minIndent = indent;\n }\n }\n\n if (!Number.isFinite(minIndent) || minIndent === 0) {\n return lines.map((line) => line.trimEnd()).join(\"\\n\");\n }\n\n return lines.map((line) => line.slice(minIndent).trimEnd()).join(\"\\n\");\n}\n\n/**\n * Tagged template for SQL view queries\n *\n * Interpolates values, strips the common leading indentation and trims blank\n * leading/trailing lines. Returns a plain string, so a regular string literal\n * works anywhere `sql` does.\n *\n * @example\n * const query = sql`\n * SELECT p.id AS id, p.title AS title\n * FROM Projects p\n * `;\n * // \"SELECT p.id AS id, p.title AS title\\n FROM Projects p\"\n */\nexport function sql(strings: TemplateStringsArray, ...values: Array<string | number>): string {\n let result = \"\";\n\n for (let i = 0; i < strings.length; i++) {\n result += strings[i];\n if (i < values.length) {\n result += String(values[i]);\n }\n }\n\n return dedentSql(result);\n}\n\n/**\n * Strips SQL comments and leading whitespace so the first real token can be checked\n *\n * @param query - The SQL query\n * @returns The query with leading comments and whitespace removed\n */\nfunction stripLeadingComments(query: string): string {\n let remaining = query.trim();\n\n // Repeatedly strip line comments (-- ...) and block comments (/* ... */)\n while (remaining.length > 0) {\n if (remaining.startsWith(\"--\")) {\n const newline = remaining.indexOf(\"\\n\");\n remaining = newline === -1 ? \"\" : remaining.slice(newline + 1).trim();\n continue;\n }\n\n if (remaining.startsWith(\"/*\")) {\n const end = remaining.indexOf(\"*/\");\n remaining = end === -1 ? \"\" : remaining.slice(end + 2).trim();\n continue;\n }\n\n break;\n }\n\n return remaining;\n}\n\n/**\n * Validates a view query, throwing with an actionable message when it can't work\n *\n * @param collectionName - Collection name, used in error messages\n * @param viewQuery - The SQL query to validate\n */\nexport function validateViewQuery(collectionName: string, viewQuery: unknown): asserts viewQuery is string {\n if (typeof viewQuery !== \"string\" || viewQuery.trim() === \"\") {\n throw new Error(\n `View collection \"${collectionName}\" requires a non-empty viewQuery. ` +\n `Provide the SQL SELECT statement backing the view.`\n );\n }\n\n const body = stripLeadingComments(viewQuery);\n if (!/^(select|with)\\b/i.test(body)) {\n throw new Error(\n `View collection \"${collectionName}\" has an invalid viewQuery: it must start with SELECT or WITH. ` +\n `Received: ${body.slice(0, 40)}${body.length > 40 ? \"...\" : \"\"}`\n );\n }\n}\n\n/**\n * Defines a read-only PocketBase view collection backed by a SQL query\n *\n * PocketBase derives the collection's fields by running the query, so the Zod\n * schema only describes the shape for TypeScript types and application-side\n * parsing. Views cannot have indexes and only support listRule / viewRule.\n *\n * The generated migration creates the collection with `type: \"view\"` and the\n * query; changing the SQL later produces an in-place `viewQuery` update, which\n * keeps the collection id stable.\n *\n * @param config - View collection configuration\n * @returns The schema with view metadata attached\n *\n * @example\n * export default defineView({\n * collectionName: \"ProjectStats\",\n * schema: ProjectStatsSchema,\n * viewQuery: sql`\n * SELECT p.OwnerUser AS id,\n * p.OwnerUser AS OwnerUser,\n * COUNT(*) AS projectCount\n * FROM Projects p\n * GROUP BY p.OwnerUser\n * `,\n * permissions: {\n * listRule: \"OwnerUser = @request.auth.id\",\n * viewRule: \"OwnerUser = @request.auth.id\",\n * },\n * });\n *\n * @example\n * // Requirements PocketBase places on the query:\n * // - the outermost SELECT must expose an `id` column\n * // - a relation column must be selected bare (e.g. `p.OwnerUser AS OwnerUser`)\n * // from the outer table for PocketBase to infer it as a relation field\n * // - no top-level UNION (wrap unions in a subquery)\n */\nexport function defineView(config: ViewCollectionConfig): z.ZodObject<any> {\n const { collectionName, schema, viewQuery, permissions } = config;\n\n validateViewQuery(collectionName, viewQuery);\n\n return defineCollection({\n collectionName,\n schema,\n type: \"view\",\n viewQuery,\n // Write rules are always locked for views - PocketBase rejects anything else\n permissions: {\n listRule: permissions?.listRule ?? null,\n viewRule: permissions?.viewRule ?? null,\n createRule: null,\n updateRule: null,\n deleteRule: null,\n },\n });\n}\n","/**\n * PocketBase Format Converter\n * Converts PocketBase collection objects to our internal CollectionSchema format\n *\n * This module handles conversion between PocketBase's native collection format\n * (as found in migration files and snapshots) and our internal schema representation.\n */\n\nimport { dedentSql } from \"../schema/view\";\nimport { SnapshotError } from \"./errors\";\nimport type { CollectionSchema, FieldDefinition, SchemaSnapshot } from \"./types\";\n\nconst SNAPSHOT_VERSION = \"1.0.0\";\n\n/**\n * Resolves a collection ID to a collection name\n * Uses known constants and parses migration expressions to resolve IDs\n *\n * @param collectionId - The collection ID to resolve\n * @returns The collection name, or the original ID if it can't be resolved\n */\nexport function resolveCollectionIdToName(collectionId: string): string {\n // Special case: _pb_users_auth_ is the constant for users collection\n if (collectionId === \"_pb_users_auth_\") {\n return \"users\";\n }\n\n // Try to extract collection name from expressions like app.findCollectionByNameOrId(\"Name\").id\n const nameMatch = collectionId.match(/app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/);\n if (nameMatch) {\n return nameMatch[1];\n }\n\n // If we can't resolve it, return the original ID\n // This will cause a comparison issue, but it's better than failing\n return collectionId;\n}\n\n/**\n * Extracts field options from a PocketBase field object\n * Options can be placed directly on the field or in a nested options object\n * Direct properties take precedence over nested options\n *\n * @param pbField - PocketBase field object\n * @returns Merged options object\n */\nfunction extractFieldOptions(pbField: any): Record<string, any> {\n const options: Record<string, any> = {};\n\n // Start with nested options if present\n if (pbField.options && typeof pbField.options === \"object\") {\n Object.assign(options, pbField.options);\n }\n\n // Extract common field options from direct properties\n // These take precedence over nested options\n const directOptionKeys = [\n \"min\",\n \"max\",\n \"pattern\",\n \"noDecimal\", // text/number fields (legacy, PocketBase uses onlyInt)\n \"onlyInt\", // number fields (PocketBase uses this instead of noDecimal)\n \"values\",\n \"maxSelect\", // select fields\n \"mimeTypes\",\n \"maxSize\",\n \"thumbs\",\n \"protected\", // file fields\n \"onCreate\",\n \"onUpdate\", // autodate fields\n \"exceptDomains\",\n \"onlyDomains\", // email/url fields\n ];\n\n for (const key of directOptionKeys) {\n if (pbField[key] !== undefined) {\n options[key] = pbField[key];\n }\n }\n\n return options;\n}\n\n/**\n * Converts a PocketBase field object to FieldDefinition format\n *\n * @param pbField - PocketBase field object\n * @returns FieldDefinition object\n */\nexport function convertPocketBaseField(pbField: any): FieldDefinition {\n const field: any = {\n name: pbField.name,\n id: pbField.id,\n type: pbField.type,\n required: pbField.required || false,\n };\n\n // Extract options from both direct properties and nested options object\n field.options = extractFieldOptions(pbField);\n\n // Convert onlyInt to noDecimal for number fields (PocketBase uses onlyInt, but our schema uses noDecimal)\n if (pbField.type === \"number\" && field.options.onlyInt !== undefined) {\n field.options.noDecimal = field.options.onlyInt;\n delete field.options.onlyInt;\n }\n\n // Handle relation fields\n if (pbField.type === \"relation\") {\n // Support both formats: collectionId directly on field or in options\n const collectionId = pbField.collectionId || pbField.options?.collectionId || \"\";\n // Resolve collectionId to collection name\n // collectionId is a system field (like _pb_users_auth_), not the collection name\n // We need to resolve it to the actual collection name for comparison\n const collectionName = resolveCollectionIdToName(collectionId || \"\");\n field.relation = {\n collection: collectionName,\n cascadeDelete: pbField.cascadeDelete ?? pbField.options?.cascadeDelete ?? false,\n maxSelect: pbField.maxSelect ?? pbField.options?.maxSelect,\n minSelect: pbField.minSelect ?? pbField.options?.minSelect,\n displayFields: pbField.displayFields ?? pbField.options?.displayFields ?? null,\n };\n\n // Remove relation-specific properties from options\n // These belong in the relation object, not options\n delete field.options.maxSelect;\n delete field.options.minSelect;\n delete field.options.cascadeDelete;\n delete field.options.displayFields;\n }\n\n // Clean up empty options object, but preserve values for select fields\n // If options only contains values for a select field, keep it\n const hasOnlyValues = Object.keys(field.options).length === 1 && field.options.values !== undefined;\n if (Object.keys(field.options).length === 0) {\n delete field.options;\n } else if (pbField.type === \"select\" && hasOnlyValues) {\n // Keep options object if it only contains values for a select field\n // This ensures values are preserved for comparison\n }\n\n return field as FieldDefinition;\n}\n\n/**\n * Converts a PocketBase collection object to CollectionSchema format\n *\n * @param pbCollection - PocketBase collection object from migration file\n * @returns CollectionSchema object\n */\nexport function convertPocketBaseCollection(pbCollection: any): CollectionSchema {\n const fields: any[] = [];\n const isView = pbCollection.type === \"view\";\n\n // System field names that should always be excluded\n const systemFieldNames = [\"id\", \"created\", \"updated\", \"collectionId\", \"collectionName\", \"expand\"];\n\n // View collections have no stored fields - PocketBase derives them from the\n // view query, so anything present here is generated output, not schema\n // Convert PocketBase fields to our FieldDefinition format\n if (!isView && pbCollection.fields && Array.isArray(pbCollection.fields)) {\n for (const pbField of pbCollection.fields) {\n // Skip system fields by checking both the system flag and field name\n // Some PocketBase exports mark created/updated as system: false\n if (pbField.system || systemFieldNames.includes(pbField.name)) {\n // For auth collections, we want to keep the system fields (email, password, etc.)\n // These are marked as system: true in PocketBase, but we need them in our schema\n // to match the CLI behavior which includes them in the fields array\n const isAuthSystemField =\n pbCollection.type === \"auth\" &&\n [\"email\", \"emailVisibility\", \"verified\", \"password\", \"tokenKey\"].includes(pbField.name);\n\n if (!isAuthSystemField) {\n continue;\n }\n }\n\n const field = convertPocketBaseField(pbField);\n fields.push(field);\n }\n }\n\n const schema: CollectionSchema = {\n name: pbCollection.name,\n type: pbCollection.type || \"base\",\n fields,\n };\n\n // Preserve collection ID if present (needed for relation resolution)\n if (pbCollection.id) {\n schema.id = pbCollection.id;\n }\n\n // Preserve the SQL query backing a view collection\n // Dedented so a query indented to fit the migration file compares equal to\n // the one declared in the schema\n if (typeof pbCollection.viewQuery === \"string\") {\n schema.viewQuery = dedentSql(pbCollection.viewQuery);\n }\n\n // Add indexes if present\n if (pbCollection.indexes && Array.isArray(pbCollection.indexes)) {\n schema.indexes = pbCollection.indexes;\n }\n\n // Add rules/permissions\n // Check if any rule properties exist on the collection object\n const hasAnyRule =\n pbCollection.listRule !== undefined ||\n pbCollection.viewRule !== undefined ||\n pbCollection.createRule !== undefined ||\n pbCollection.updateRule !== undefined ||\n pbCollection.deleteRule !== undefined ||\n pbCollection.manageRule !== undefined;\n\n if (hasAnyRule) {\n const rules: any = {};\n // Include rules even if they're null (null is a valid value)\n if (pbCollection.listRule !== undefined) rules.listRule = pbCollection.listRule;\n if (pbCollection.viewRule !== undefined) rules.viewRule = pbCollection.viewRule;\n if (pbCollection.createRule !== undefined) rules.createRule = pbCollection.createRule;\n if (pbCollection.updateRule !== undefined) rules.updateRule = pbCollection.updateRule;\n if (pbCollection.deleteRule !== undefined) rules.deleteRule = pbCollection.deleteRule;\n if (pbCollection.manageRule !== undefined) rules.manageRule = pbCollection.manageRule;\n\n schema.rules = rules;\n // Also set permissions to match rules (they're the same thing)\n schema.permissions = { ...rules };\n }\n\n return schema;\n}\n\n/**\n * Converts PocketBase migration format to SchemaSnapshot\n * Extracts the snapshot array from the migration file content\n *\n * @param migrationContent - Raw migration file content\n * @returns SchemaSnapshot with collections map\n */\nexport function convertPocketBaseMigration(migrationContent: string): SchemaSnapshot {\n try {\n // Extract the snapshot array from the migration file\n // The format is: migrate((app) => { const snapshot = [...]; ... })\n const snapshotMatch = migrationContent.match(/const\\s+snapshot\\s*=\\s*(\\[[\\s\\S]*?\\]);/);\n\n if (!snapshotMatch) {\n throw new Error(\"Could not find snapshot array in migration file\");\n }\n\n // Parse the snapshot array as JSON\n // We need to evaluate it as JavaScript since it's not pure JSON\n const snapshotArrayStr = snapshotMatch[1];\n let snapshotArray: any[];\n\n try {\n // Use Function constructor to safely evaluate the array\n // This is safer than eval() and works for our use case\n snapshotArray = new Function(`return ${snapshotArrayStr}`)();\n } catch (parseError) {\n throw new Error(`Failed to parse snapshot array: ${parseError}`);\n }\n\n if (!Array.isArray(snapshotArray)) {\n throw new Error(\"Snapshot is not an array\");\n }\n\n // Convert each collection to our format\n const collections = new Map<string, CollectionSchema>();\n\n for (const pbCollection of snapshotArray) {\n if (!pbCollection.name) {\n console.warn(\"Skipping collection without name\");\n continue;\n }\n\n const schema = convertPocketBaseCollection(pbCollection);\n collections.set(pbCollection.name, schema);\n }\n\n return {\n version: SNAPSHOT_VERSION,\n timestamp: new Date().toISOString(),\n collections,\n };\n } catch (error) {\n throw new SnapshotError(\n `Failed to convert PocketBase migration: ${error instanceof Error ? error.message : String(error)}`,\n undefined,\n \"parse\",\n error instanceof Error ? error : undefined\n );\n }\n}\n","/**\n * Migration File Parser\n * Parses PocketBase migration files to extract collection operations\n *\n * This module handles parsing migration files to extract:\n * - Collection creations (new Collection(...))\n * - Collection deletions (app.delete(...))\n * - Field modifications (field.property = value)\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { dedentSql } from \"../schema/view\";\nimport { convertPocketBaseCollection, convertPocketBaseField } from \"./pocketbase-converter\";\nimport type { CollectionSchema, FieldDefinition } from \"./types\";\n\nexport interface ParsedCollectionUpdate {\n collectionName: string;\n fieldsToAdd: FieldDefinition[];\n fieldsToRemove: string[]; // names\n fieldsToUpdate: {\n fieldName: string;\n changes: Record<string, any>; // property -> value\n }[];\n indexesToAdd: string[];\n indexesToRemove: string[];\n rulesToUpdate: Record<string, string | null>;\n /** New SQL query for a view collection, when the migration updates one */\n viewQuery?: string;\n}\n\n/**\n * Extracts timestamp from migration filename\n * Migration files are named: [timestamp]_[description].js\n *\n * @param filename - Migration filename\n * @returns Timestamp as number or null if not found\n */\nexport function extractTimestampFromFilename(filename: string): number | null {\n const match = filename.match(/^(\\d+)_/);\n if (match) {\n return parseInt(match[1], 10);\n }\n return null;\n}\n\n/**\n * Finds all migration files after a given snapshot timestamp\n * Excludes snapshot files themselves\n *\n * @param migrationsPath - Path to migrations directory\n * @param snapshotTimestamp - Timestamp of the snapshot file\n * @returns Array of migration file paths sorted by timestamp\n */\nexport function findMigrationsAfterSnapshot(migrationsPath: string, snapshotTimestamp: number): string[] {\n try {\n if (!fs.existsSync(migrationsPath)) {\n return [];\n }\n\n const files = fs.readdirSync(migrationsPath);\n const migrationFiles: { path: string; timestamp: number }[] = [];\n const timestampsSeen = new Set<number>();\n // const duplicates: string[] = [];\n\n for (const file of files) {\n // Skip snapshot files\n if (file.endsWith(\"_collections_snapshot.js\") || file.endsWith(\"_snapshot.js\")) {\n continue;\n }\n\n // Skip non-JS files\n if (!file.endsWith(\".js\")) {\n continue;\n }\n\n const timestamp = extractTimestampFromFilename(file);\n if (timestamp) {\n if (timestampsSeen.has(timestamp)) {\n console.warn(`Duplicate migration timestamp detected: ${timestamp} in file ${file}`);\n }\n timestampsSeen.add(timestamp);\n\n if (timestamp > snapshotTimestamp) {\n migrationFiles.push({\n path: path.join(migrationsPath, file),\n timestamp,\n });\n }\n }\n }\n\n // Sort by timestamp (ascending order)\n migrationFiles.sort((a, b) => a.timestamp - b.timestamp);\n\n return migrationFiles.map((f) => f.path);\n } catch (error) {\n console.warn(`Error finding migrations after snapshot: ${error}`);\n return [];\n }\n}\n\n/**\n * Skips over a template literal starting at the given backtick\n *\n * View queries are emitted as backtick templates and routinely contain braces,\n * double quotes and apostrophes (in SQL comments), all of which would otherwise\n * desynchronize the object scanner.\n *\n * @param content - Full migration content\n * @param start - Index of the opening backtick\n * @returns Index just past the closing backtick (or end of content)\n */\nfunction skipTemplateLiteral(content: string, start: number): number {\n let i = start + 1;\n\n while (i < content.length) {\n const char = content[i];\n\n if (char === \"\\\\\") {\n // Skip the escaped character\n i += 2;\n continue;\n }\n\n if (char === \"`\") {\n return i + 1;\n }\n\n i++;\n }\n\n return i;\n}\n\n/**\n * Reverses the escaping applied when a value is emitted as a template literal\n *\n * @param raw - Template literal body (without the surrounding backticks)\n * @returns The original string\n */\nfunction unescapeTemplateLiteral(raw: string): string {\n return raw.replace(/\\\\(`|\\$\\{|\\\\)/g, \"$1\");\n}\n\n/**\n * Helper function to parse collection operations from migration content\n *\n * @param content - Migration content (should be just the UP migration)\n * @returns Object with collections to create and collections to delete\n */\nfunction parseMigrationOperationsFromContent(content: string): {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n collectionsToUpdate: ParsedCollectionUpdate[];\n} {\n const collectionsToCreate: CollectionSchema[] = [];\n const collectionsToDelete: string[] = [];\n const collectionsToUpdate: ParsedCollectionUpdate[] = [];\n\n // Mock app object for eval\n const mockApp = {\n findCollectionByNameOrId: (name: string) => ({ id: name, name }),\n };\n\n // Helper to get or create update object\n const getUpdate = (name: string) => {\n let update = collectionsToUpdate.find((u) => u.collectionName === name);\n if (!update) {\n update = {\n collectionName: name,\n fieldsToAdd: [],\n fieldsToRemove: [],\n fieldsToUpdate: [],\n indexesToAdd: [],\n indexesToRemove: [],\n rulesToUpdate: {},\n };\n collectionsToUpdate.push(update);\n }\n return update;\n };\n\n try {\n // 1. Parse Creations: new Collection({...})\n let searchIndex = 0;\n while (true) {\n const collectionStart = content.indexOf(\"new Collection(\", searchIndex);\n if (collectionStart === -1) {\n break;\n }\n\n const openParen = collectionStart + \"new Collection(\".length;\n let objectContent = \"\";\n let i = openParen;\n\n // Extract object literal\n let braceCount = 0;\n let parenCount = 1;\n let inString = false;\n let stringChar = null;\n let objectStart = -1;\n\n // Skip whitespace to find the opening brace\n while (i < content.length && /\\s/.test(content[i])) {\n i++;\n }\n\n if (content[i] === \"{\") {\n objectStart = i;\n braceCount = 1;\n i++;\n\n while (i < content.length && (braceCount > 0 || parenCount > 0)) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"{\") braceCount++;\n if (char === \"}\") braceCount--;\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n }\n i++;\n }\n\n if (braceCount === 0) {\n objectContent = content.substring(objectStart, i - (parenCount === 0 ? 1 : 0));\n // Correctly substring: if we broke loop because braceCount is 0, i is at char AFTER '}'\n // But if parenCount also went to 0, we might be further.\n // Actually my logic above: i increments at end of loop.\n // If braceCount becomes 0, loop continues if parenCount > 0 (which it is, started at 1)\n // Wait, new Collection({...})\n // { ... } is inside ( ... )\n // So braceCount goes 1 -> ... -> 0.\n // parenCount stays 1.\n // Loop continues until parenCount 0? No, usually `new Collection({...})`\n // The loop condition is `braceCount > 0 || parenCount > 0`.\n // When '}' matches, braceCount becomes 0. parenCount is 1. Loop continues.\n // Next char is ')'. parenCount becomes 0. Loop stops.\n }\n } else {\n // No object literal?\n searchIndex = i + 1;\n continue;\n }\n\n if (objectContent) {\n // We need to extract just the object part, which ended when braceCount hit 0.\n // My loop logic is a bit combined.\n // Let's rely on the previous simpler logic but refined.\n // Actually, let's use the object content extraction from the previous implementation but wrapped in this loop\n }\n\n // Re-implementing the object extraction carefully\n i = openParen;\n // Skip whitespace\n while (i < content.length && /\\s/.test(content[i])) {\n i++;\n }\n\n if (content[i] !== \"{\") {\n searchIndex = i + 1;\n continue;\n }\n\n const startObj = i;\n let bCount = 1;\n i++;\n let inStr = false;\n let strChar = null;\n\n while (i < content.length && bCount > 0) {\n const char = content[i];\n const prev = i > 0 ? content[i - 1] : \"\";\n\n // Template literals (used for view queries) can contain braces, quotes\n // and apostrophes, so skip over them wholesale\n if (!inStr && char === \"`\") {\n i = skipTemplateLiteral(content, i);\n continue;\n }\n\n if (!inStr && (char === '\"' || char === \"'\")) {\n inStr = true;\n strChar = char;\n } else if (inStr && char === strChar && prev !== \"\\\\\") {\n inStr = false;\n strChar = null;\n }\n\n if (!inStr) {\n if (char === \"{\") bCount++;\n if (char === \"}\") bCount--;\n }\n i++;\n }\n\n if (bCount === 0) {\n const objStr = content.substring(startObj, i);\n try {\n // Pass mockApp as 'app' to the function\n const collectionObj = new Function(\"app\", `return ${objStr}`)(mockApp);\n if (collectionObj && collectionObj.name) {\n const schema = convertPocketBaseCollection(collectionObj);\n collectionsToCreate.push(schema);\n }\n } catch (e) {\n console.warn(\"Failed to parse collection object:\", e);\n }\n }\n searchIndex = i;\n }\n\n // 2. Parse Deletions\n const deleteMatches = content.matchAll(\n /app\\.delete\\s*\\(\\s*(?:collection_\\w+|app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\))\\s*\\)/g\n );\n for (const match of deleteMatches) {\n if (match[1]) {\n collectionsToDelete.push(match[1]);\n } else {\n // Variable lookup logic (simplified for now, assuming standard variable naming)\n // Assuming collection variables are tracked if I were parsing sequentially.\n // But here I'm using regex.\n // Let's try to extract name from variable name if it follows `collection_NAME`\n const varMatch = match[0].match(/collection_(\\w+)/);\n if (varMatch) {\n // Try to infer name (may not be accurate if variable name != collection name)\n // But usually generator uses `collection_NAME`\n // Can I look up the definition?\n // Not easily without full scan.\n // I'll stick to what was there: try to find definition.\n const varName = `collection_${varMatch[1]}`;\n const defRegex = new RegExp(\n `const\\\\s+${varName}\\\\s*=\\\\s*app\\\\.findCollectionByNameOrId\\\\([\"']([^\"']+)[\"']\\\\)(?:\\\\s*//\\\\s*([^\\\\n\\\\r;]+))?`\n );\n const defMatch = content.match(defRegex);\n if (defMatch) {\n const name = defMatch[2] ? defMatch[2].trim() : defMatch[1];\n collectionsToDelete.push(name);\n } else {\n // Try new Collection assignment\n // const newColRegex = new RegExp(\n // `const\\\\s+${varName}\\\\s*=\\\\s*new\\\\s+Collection\\\\(\\\\s*\\\\{([\\\\s\\\\S]*?)\\\\}\\\\s*\\\\)`\n // );\n // This is hard.\n }\n }\n }\n }\n\n // Also direct delete of variable\n // Check assignments: const col = app.findCollectionByNameOrId(\"name\"); app.delete(col);\n const varAssignments = new Map<string, string>();\n const assignmentMatches = content.matchAll(\n /const\\s+(\\w+)\\s*=\\s*app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)(?:[ \\t]*\\/\\/\\s*([^\\n\\r;]+))?/g\n );\n for (const match of assignmentMatches) {\n const name = match[3] ? match[3].trim() : match[2];\n varAssignments.set(match[1], name);\n }\n\n const varDeleteMatches = content.matchAll(/app\\.delete\\s*\\(\\s*(\\w+)\\s*\\)/g);\n for (const match of varDeleteMatches) {\n if (varAssignments.has(match[1])) {\n const name = varAssignments.get(match[1])!;\n if (!collectionsToDelete.includes(name)) {\n collectionsToDelete.push(name);\n }\n }\n }\n\n // 3. Parse Updates\n\n // Map of variable name -> { collectionName, type: 'collection' | 'field' | 'index', parentVar? }\n const variables = new Map<string, { type: \"collection\" | \"field\"; name: string; parentCollection?: string }>();\n\n // Initialize variables from assignments\n for (const [varName, colName] of varAssignments) {\n variables.set(varName, { type: \"collection\", name: colName });\n }\n\n // Find field variables: const field = col.fields.getByName(\"name\")\n const fieldAssignmentMatches = content.matchAll(\n /const\\s+(\\w+)\\s*=\\s*(\\w+)\\.fields\\.getByName\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g\n );\n for (const match of fieldAssignmentMatches) {\n const [_, fieldVar, colVar, fieldName] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n variables.set(fieldVar, {\n type: \"field\",\n name: fieldName,\n parentCollection: colInfo.name,\n });\n }\n }\n\n // 3a. fields.add and fields.addAt\n // Pattern: colVar.fields.add(new TypeField({...})) OR colVar.fields.addAt(index, new TypeField({...}))\n const addFieldMatches = content.matchAll(\n /(\\w+)\\.fields\\.(?:add|addAt)\\s*\\((?:\\s*\\d+\\s*,)?\\s*new\\s+\\w*Field\\s*\\(/g\n );\n for (const match of addFieldMatches) {\n const [fullMatch, colVar] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n // Extract the field definition object\n const startIdx = match.index! + fullMatch.length;\n // We need to find the object inside (...)\n // It usually looks like: new TextField({ ... })\n // So we are at start of `{` hopefully?\n // Actually `new TextField(` -> next char might be whitespace then `{`\n\n let j = startIdx;\n while (j < content.length && /\\s/.test(content[j])) j++;\n\n if (content[j] === \"{\") {\n // Extract object\n const objStart = j;\n let bCount = 1;\n j++;\n let inStr = false;\n let sChar = null;\n\n while (j < content.length && bCount > 0) {\n const char = content[j];\n const prev = j > 0 ? content[j - 1] : \"\";\n if (!inStr && (char === '\"' || char === \"'\")) {\n inStr = true;\n sChar = char;\n } else if (inStr && char === sChar && prev !== \"\\\\\") {\n inStr = false;\n sChar = null;\n }\n if (!inStr) {\n if (char === \"{\") bCount++;\n if (char === \"}\") bCount--;\n }\n j++;\n }\n\n if (bCount === 0) {\n const objStr = content.substring(objStart, j);\n // We also need the type. Regex `new (\\w+)Field`\n const typeMatch = fullMatch.match(/new\\s+(\\w*)Field/);\n // const fieldTypeStr = typeMatch ? typeMatch[1].toLowerCase() : \"text\"; // Default/Fallback\n\n try {\n // We need to inject the type into the object if it's not there,\n // or rely on convertPocketBaseField.\n // convertPocketBaseField expects `type` property.\n // But `new TextField({...})` usually doesn't have `type: 'text'` inside.\n // It's inferred from constructor.\n\n const rawObj = new Function(\"app\", `return ${objStr}`)(mockApp);\n\n // Map constructor name to type string if needed\n // Valid types: text, number, bool, email, url, date, select, json, file, relation\n const typeMap: Record<string, string> = {\n Text: \"text\",\n Number: \"number\",\n Bool: \"bool\",\n Email: \"email\",\n URL: \"url\",\n Date: \"date\",\n Select: \"select\",\n JSON: \"json\",\n File: \"file\",\n Relation: \"relation\",\n };\n const typePrefix = typeMatch ? typeMatch[1] : \"Text\";\n const inferredType = typeMap[typePrefix] || typePrefix.toLowerCase();\n\n if (!rawObj.type) rawObj.type = inferredType;\n\n const fieldDef = convertPocketBaseField(rawObj);\n getUpdate(colInfo.name).fieldsToAdd.push(fieldDef);\n } catch (e) {\n console.warn(\"Failed to parse field object:\", e);\n }\n }\n }\n }\n }\n\n // 3b. fields.removeByName\n const removeFieldMatches = content.matchAll(/(\\w+)\\.fields\\.removeByName\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/g);\n for (const match of removeFieldMatches) {\n const [_, colVar, fieldName] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n getUpdate(colInfo.name).fieldsToRemove.push(fieldName);\n }\n }\n\n // 3c. Field updates: fieldVar.prop = value\n // We iterate over lines/statements or just generic assignment regex?\n // Assignment: `var.prop = value;`\n // Regex: `(\\w+)\\.(\\w+)\\s*=\\s*(.+?);`\n // Be careful with newlines and semicolons.\n const assignmentRegex = RegExp(`(\\\\w+)\\\\.([\\\\w.]+)\\\\s*=\\\\s*([^;]+);`, \"g\");\n const assignments = content.matchAll(assignmentRegex);\n for (const match of assignments) {\n const [_, varName, propPath, valueStr] = match;\n const varInfo = variables.get(varName);\n\n if (varInfo) {\n if (varInfo.type === \"field\") {\n // Update to a field\n const colName = varInfo.parentCollection!;\n const fieldName = varInfo.name;\n const update = getUpdate(colName);\n\n let fieldUpdate = update.fieldsToUpdate.find((f) => f.fieldName === fieldName);\n if (!fieldUpdate) {\n fieldUpdate = { fieldName, changes: {} };\n update.fieldsToUpdate.push(fieldUpdate);\n }\n\n try {\n // Parse value\n const value = new Function(\"app\", `return ${valueStr}`)(mockApp);\n fieldUpdate.changes[propPath] = value;\n } catch {\n // console.warn(\"Failed to parse value:\", valueStr);\n // Use string if eval fails?\n fieldUpdate.changes[propPath] = valueStr.trim();\n }\n } else if (varInfo.type === \"collection\") {\n // Update to collection (rules, indexes)\n const colName = varInfo.name;\n const update = getUpdate(colName);\n\n if (propPath === \"indexes\") {\n // ignore direct assignment to indexes for now, usually it's push/splice\n } else if (propPath.endsWith(\"Rule\")) {\n try {\n const value = new Function(\"app\", `return ${valueStr}`)(mockApp);\n update.rulesToUpdate[propPath] = value;\n } catch {\n update.rulesToUpdate[propPath] = valueStr.trim();\n }\n }\n }\n }\n }\n\n // 3c-2. View query updates: `collectionVar.viewQuery = `...`;`\n // Handled separately from the generic assignment regex above because the\n // SQL is a multi-line template literal that may contain semicolons\n const viewQueryRegex = /(\\w+)\\.viewQuery\\s*=\\s*/g;\n let viewQueryMatch;\n while ((viewQueryMatch = viewQueryRegex.exec(content)) !== null) {\n const varInfo = variables.get(viewQueryMatch[1]);\n if (!varInfo || varInfo.type !== \"collection\") continue;\n\n const valueStart = viewQueryMatch.index + viewQueryMatch[0].length;\n\n if (content[valueStart] === \"`\") {\n const end = skipTemplateLiteral(content, valueStart);\n const raw = content.substring(valueStart + 1, end - 1);\n // Undo the indentation the generator applied to fit the query into the code\n getUpdate(varInfo.name).viewQuery = dedentSql(unescapeTemplateLiteral(raw));\n viewQueryRegex.lastIndex = end;\n } else {\n // Plain string literal\n const terminator = content.indexOf(\";\", valueStart);\n const valueStr = content.substring(valueStart, terminator === -1 ? content.length : terminator);\n try {\n getUpdate(varInfo.name).viewQuery = dedentSql(new Function(\"app\", `return ${valueStr}`)(mockApp));\n } catch {\n getUpdate(varInfo.name).viewQuery = dedentSql(valueStr.trim());\n }\n }\n }\n\n // 3d. unmarshal({...}, collectionVar) — PocketBase-native grouped rule/permission updates\n const unmarshalRegex = /unmarshal\\s*\\(/g;\n let unmarshalMatch;\n while ((unmarshalMatch = unmarshalRegex.exec(content)) !== null) {\n let i = unmarshalMatch.index + unmarshalMatch[0].length;\n\n // Skip whitespace\n while (i < content.length && /\\s/.test(content[i])) i++;\n\n // Expect opening brace\n if (content[i] !== \"{\") continue;\n\n // Extract object literal using brace matching\n const objStart = i;\n let braceCount = 1;\n let inStr = false;\n let strChar: string | null = null;\n i++;\n while (i < content.length && braceCount > 0) {\n const ch = content[i];\n const prev = i > 0 ? content[i - 1] : \"\";\n // Template literals (view queries) can contain braces and apostrophes\n if (!inStr && ch === \"`\") { i = skipTemplateLiteral(content, i); continue; }\n if (!inStr && (ch === '\"' || ch === \"'\")) { inStr = true; strChar = ch; }\n else if (inStr && ch === strChar && prev !== \"\\\\\") { inStr = false; strChar = null; }\n if (!inStr) {\n if (ch === \"{\") braceCount++;\n if (ch === \"}\") braceCount--;\n }\n i++;\n }\n if (braceCount !== 0) continue;\n\n const objStr = content.substring(objStart, i);\n\n // Skip comma and whitespace, then read the collection variable name\n while (i < content.length && /[\\s,]/.test(content[i])) i++;\n const varStart = i;\n while (i < content.length && /\\w/.test(content[i])) i++;\n const colVarName = content.substring(varStart, i);\n\n const colInfo = variables.get(colVarName);\n if (!colInfo || colInfo.type !== \"collection\") continue;\n\n // Parse the object for *Rule keys\n const keyValRegex = /\"(\\w+Rule)\"\\s*:\\s*([^,}\\n]+)/g;\n let kvMatch;\n while ((kvMatch = keyValRegex.exec(objStr)) !== null) {\n const ruleKey = kvMatch[1];\n const valStr = kvMatch[2].trim();\n try {\n const value = new Function(\"app\", `return ${valStr}`)(mockApp);\n getUpdate(colInfo.name).rulesToUpdate[ruleKey] = value;\n } catch {\n getUpdate(colInfo.name).rulesToUpdate[ruleKey] = valStr;\n }\n }\n\n // Parse a viewQuery key, whose value is a multi-line template literal\n const viewQueryKey = objStr.match(/\"viewQuery\"\\s*:\\s*/);\n if (viewQueryKey) {\n const valueStart = viewQueryKey.index! + viewQueryKey[0].length;\n if (objStr[valueStart] === \"`\") {\n const end = skipTemplateLiteral(objStr, valueStart);\n const raw = objStr.substring(valueStart + 1, end - 1);\n getUpdate(colInfo.name).viewQuery = dedentSql(unescapeTemplateLiteral(raw));\n } else {\n const valStr = objStr.substring(valueStart).replace(/[,}\\s]+$/, \"\");\n try {\n getUpdate(colInfo.name).viewQuery = dedentSql(new Function(\"app\", `return ${valStr}`)(mockApp));\n } catch {\n getUpdate(colInfo.name).viewQuery = dedentSql(valStr);\n }\n }\n }\n }\n\n // 3e. Indexes push/splice\n // col.indexes.push(\"...\")\n const idxPushRegex = /(\\w+)\\.indexes\\.push\\s*\\(/g;\n let match;\n while ((match = idxPushRegex.exec(content)) !== null) {\n const colVar = match[1];\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n // Parse forward to find matching closing parenthesis\n let i = match.index + match[0].length;\n let parenCount = 1;\n let inString = false;\n let stringChar: string | null = null;\n const start = i;\n\n while (i < content.length && parenCount > 0) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n }\n i++;\n }\n\n if (parenCount === 0) {\n const valStr = content.substring(start, i - 1).trim();\n try {\n const val = new Function(`return ${valStr}`)();\n getUpdate(colInfo.name).indexesToAdd.push(val);\n } catch {\n console.warn(`Failed to parse index value: ${valStr}`);\n }\n }\n }\n }\n\n // col.indexes.splice(idx, 1) - this is hard because we need to know what index corresponds to.\n // The generator produces:\n // const idxVar = col.indexes.findIndex(idx => idx === \"...\");\n // if (idxVar !== -1) col.indexes.splice(idxVar, 1);\n // So we should look for the findIndex call to identify the index string being removed.\n const idxFindMatches = content.matchAll(\n /const\\s+(\\w+)\\s*=\\s*(\\w+)\\.indexes\\.findIndex\\s*\\(\\s*idx\\s*=>\\s*idx\\s*===\\s*\"((?:[^\"\\\\]|\\\\.)*)\"\\s*\\)/g\n );\n for (const match of idxFindMatches) {\n const [_, idxVar, colVar, idxStr] = match;\n const colInfo = variables.get(colVar);\n if (colInfo && colInfo.type === \"collection\") {\n try {\n // idxStr contains the JavaScript string value (escape sequences already processed)\n getUpdate(colInfo.name).indexesToRemove.push(idxStr);\n } catch {\n console.warn(`Failed to parse index value: ${idxStr} ${idxVar} ${colVar}`);\n }\n }\n }\n } catch (error) {\n console.warn(`Failed to parse migration operations from content: ${error}`);\n }\n\n return { collectionsToCreate, collectionsToDelete, collectionsToUpdate };\n}\n\n/**\n * Parses a migration file to extract collection operations\n * Extracts collections created with `new Collection(...)` and collections deleted with `app.delete(...)`\n * Only parses the UP migration (first function), not the down migration\n *\n * @param migrationContent - Raw migration file content\n * @returns Object with collections to create and collections to delete\n */\nexport function parseMigrationOperations(migrationContent: string): {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n collectionsToUpdate: ParsedCollectionUpdate[];\n} {\n try {\n // Extract only the UP migration (first function argument to migrate())\n // Find the migrate call and extract the first function body\n const migrateMatch = migrationContent.match(/migrate\\s*\\(\\s*/);\n if (!migrateMatch) {\n // If we can't find the migrate pattern, try to parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n const startIndex = migrateMatch.index! + migrateMatch[0].length;\n\n // Find the opening paren of the first function\n let i = startIndex;\n let parenCount = 0;\n let foundFirstParen = false;\n\n while (i < migrationContent.length) {\n const char = migrationContent[i];\n if (char === \"(\") {\n parenCount++;\n foundFirstParen = true;\n i++;\n break;\n }\n i++;\n }\n\n if (!foundFirstParen) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Skip the function parameters: (app) => {\n let inString = false;\n let stringChar = null;\n let foundBrace = false;\n let braceStart = -1;\n\n while (i < migrationContent.length && !foundBrace) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"(\") parenCount++;\n if (char === \")\") {\n parenCount--;\n if (parenCount === 0) {\n // Found end of function parameters, look for =>\n i++;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length - 1 && migrationContent[i] === \"=\" && migrationContent[i + 1] === \">\") {\n i += 2;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length && migrationContent[i] === \"{\") {\n foundBrace = true;\n braceStart = i + 1;\n break;\n }\n }\n }\n }\n }\n i++;\n }\n\n if (!foundBrace || braceStart === -1) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Find the matching closing brace\n let braceCount = 1;\n i = braceStart;\n inString = false;\n stringChar = null;\n\n while (i < migrationContent.length && braceCount > 0) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n // Template literals (view queries) can contain braces and apostrophes\n if (!inString && char === \"`\") {\n i = skipTemplateLiteral(migrationContent, i);\n continue;\n }\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"{\") braceCount++;\n if (char === \"}\") braceCount--;\n }\n\n i++;\n }\n\n if (braceCount === 0) {\n const upMigrationContent = migrationContent.substring(braceStart, i - 1);\n return parseMigrationOperationsFromContent(upMigrationContent);\n }\n\n // Fallback: parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n } catch (error) {\n console.warn(`Failed to parse migration operations: ${error}`);\n return { collectionsToCreate: [], collectionsToDelete: [], collectionsToUpdate: [] };\n }\n}\n","/**\n * Snapshot Manager\n * Handles saving and loading schema snapshots from JSON files\n *\n * This module provides a standalone, configurable snapshot manager that can be used\n * by consumer projects to manage schema snapshots. It focuses on JSON snapshot file\n * management, delegating migration file parsing and PocketBase format conversion\n * to specialized modules.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { FileSystemError, SnapshotError } from \"./errors\";\nimport {\n extractTimestampFromFilename,\n findMigrationsAfterSnapshot,\n parseMigrationOperations,\n type ParsedCollectionUpdate,\n} from \"./migration-parser\";\nimport { convertPocketBaseMigration } from \"./pocketbase-converter\";\nimport type { CollectionSchema, SchemaDefinition, SchemaSnapshot } from \"./types\";\n\nconst SNAPSHOT_VERSION = \"1.0.0\";\nconst DEFAULT_SNAPSHOT_FILENAME = \".migration-snapshot.json\";\n\n/**\n * Configuration for snapshot operations\n */\nexport interface SnapshotConfig {\n /**\n * Path to the snapshot file\n * Can be absolute or relative to workspaceRoot\n */\n snapshotPath?: string;\n\n /**\n * Workspace root directory for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * Path to the migrations directory for finding PocketBase snapshots\n */\n migrationsPath?: string;\n\n /**\n * Whether to auto-migrate old snapshot formats\n * Defaults to true\n */\n autoMigrate?: boolean;\n\n /**\n * Custom snapshot version for testing\n */\n version?: string;\n}\n\n/**\n * Snapshot format versions and their migration functions\n */\ninterface SnapshotMigration {\n fromVersion: string;\n toVersion: string;\n migrate: (data: any) => any;\n}\n\n/**\n * Registry of snapshot format migrations\n */\nconst SNAPSHOT_MIGRATIONS: SnapshotMigration[] = [\n // Add migrations here as the format evolves\n // Example:\n // {\n // fromVersion: '0.9.0',\n // toVersion: '1.0.0',\n // migrate: (data) => ({ ...data, newField: 'default' })\n // }\n];\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Omit<Required<SnapshotConfig>, \"migrationsPath\"> & { migrationsPath?: string } = {\n snapshotPath: DEFAULT_SNAPSHOT_FILENAME,\n workspaceRoot: process.cwd(),\n autoMigrate: true,\n version: SNAPSHOT_VERSION,\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config: SnapshotConfig = {}): typeof DEFAULT_CONFIG {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Gets the snapshot file path from configuration\n *\n * @param config - Snapshot configuration\n * @returns Absolute path to the snapshot file\n */\nexport function getSnapshotPath(config: SnapshotConfig = {}): string {\n const mergedConfig = mergeConfig(config);\n const workspaceRoot = mergedConfig.workspaceRoot;\n const snapshotFilename = mergedConfig.snapshotPath;\n\n // If snapshotPath is absolute, use it directly\n if (path.isAbsolute(snapshotFilename)) {\n return snapshotFilename;\n }\n\n // Otherwise, resolve relative to workspaceRoot\n return path.join(workspaceRoot, snapshotFilename);\n}\n\n/**\n * Checks if snapshot file exists\n *\n * @param config - Snapshot configuration\n * @returns True if snapshot file exists\n */\nexport function snapshotExists(config: SnapshotConfig = {}): boolean {\n try {\n const snapshotPath = getSnapshotPath(config);\n return fs.existsSync(snapshotPath);\n } catch {\n // If there's any error checking existence, treat as non-existent\n return false;\n }\n}\n\n/**\n * Handles file system errors with descriptive messages\n *\n * @param error - The error object\n * @param operation - The operation being performed\n * @param filePath - The file path involved\n * @throws SnapshotError or FileSystemError with descriptive message\n */\nfunction handleFileSystemError(error: any, operation: \"read\" | \"write\", filePath: string): never {\n const fsError = error as NodeJS.ErrnoException;\n\n if (fsError.code === \"ENOENT\") {\n throw new SnapshotError(`Snapshot file not found: ${filePath}`, filePath, operation, error);\n } else if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied ${operation === \"read\" ? \"reading\" : \"writing\"} snapshot file. Check file permissions.`,\n filePath,\n operation,\n fsError.code,\n error\n );\n } else if (fsError.code === \"ENOSPC\") {\n throw new FileSystemError(\n `No space left on device when ${operation === \"read\" ? \"reading\" : \"writing\"} snapshot file.`,\n filePath,\n operation,\n fsError.code,\n error\n );\n } else {\n throw new SnapshotError(`Failed to ${operation} snapshot file: ${error.message}`, filePath, operation, error);\n }\n}\n\n/**\n * Serializes a Map to a plain object for JSON serialization\n *\n * @param map - Map to serialize\n * @returns Plain object representation\n */\nfunction serializeMap<K extends string, V>(map: Map<K, V>): Record<K, V> {\n const obj: Record<string, V> = {};\n for (const [key, value] of map.entries()) {\n obj[key] = value;\n }\n return obj as Record<K, V>;\n}\n\n/**\n * Deserializes a plain object to a Map\n *\n * @param obj - Plain object to deserialize\n * @returns Map representation\n */\nfunction deserializeMap<K extends string, V>(obj: Record<K, V>): Map<K, V> {\n const map = new Map<K, V>();\n for (const [key, value] of Object.entries(obj)) {\n map.set(key as K, value as V);\n }\n return map;\n}\n\n/**\n * Serializes SchemaDefinition to JSON format\n * Converts Map to plain object for JSON compatibility\n *\n * @param schema - Schema definition to serialize\n * @returns JSON-serializable object\n */\nfunction serializeSchemaDefinition(schema: SchemaDefinition): any {\n return {\n collections: serializeMap(schema.collections),\n };\n}\n\n/**\n * Adds version and timestamp metadata to snapshot\n *\n * @param schema - Schema definition\n * @param config - Optional configuration with custom version\n * @returns Snapshot with metadata\n */\nfunction addSnapshotMetadata(schema: SchemaDefinition, config?: SnapshotConfig): any {\n const mergedConfig = mergeConfig(config);\n return {\n version: mergedConfig.version,\n timestamp: new Date().toISOString(),\n ...serializeSchemaDefinition(schema),\n };\n}\n\n/**\n * Saves schema snapshot to file\n * Serializes SchemaDefinition to JSON with version and timestamp metadata\n * Writes with pretty printing for readability\n *\n * @param schema - Schema definition to save\n * @param config - Snapshot configuration\n */\nexport function saveSnapshot(schema: SchemaDefinition, config: SnapshotConfig = {}): void {\n const snapshotPath = getSnapshotPath(config);\n\n try {\n // Ensure directory exists\n const snapshotDir = path.dirname(snapshotPath);\n if (!fs.existsSync(snapshotDir)) {\n fs.mkdirSync(snapshotDir, { recursive: true });\n }\n\n // Add metadata and serialize\n const snapshotData = addSnapshotMetadata(schema, config);\n\n // Write with pretty printing (2 spaces indentation)\n const jsonContent = JSON.stringify(snapshotData, null, 2);\n fs.writeFileSync(snapshotPath, jsonContent, \"utf-8\");\n } catch (error) {\n handleFileSystemError(error, \"write\", snapshotPath);\n }\n}\n\n/**\n * Parses JSON and validates snapshot format\n *\n * @param jsonContent - Raw JSON content\n * @param snapshotPath - Path to snapshot file (for error messages)\n * @returns Parsed snapshot data\n */\nfunction parseAndValidateSnapshot(jsonContent: string, snapshotPath: string): any {\n try {\n const data = JSON.parse(jsonContent);\n\n // Validate required fields\n if (!data.version) {\n throw new SnapshotError(\n \"Snapshot file is missing version field. The snapshot may be corrupted.\",\n snapshotPath,\n \"validate\"\n );\n }\n\n if (!data.timestamp) {\n throw new SnapshotError(\n \"Snapshot file is missing timestamp field. The snapshot may be corrupted.\",\n snapshotPath,\n \"validate\"\n );\n }\n\n if (!data.collections) {\n throw new SnapshotError(\n \"Snapshot file is missing collections field. The snapshot may be corrupted.\",\n snapshotPath,\n \"validate\"\n );\n }\n\n return data;\n } catch (error) {\n if (error instanceof SnapshotError) {\n throw error;\n }\n\n if (error instanceof SyntaxError) {\n throw new SnapshotError(\n `Invalid JSON in snapshot file. The file may be corrupted or manually edited incorrectly.`,\n snapshotPath,\n \"parse\",\n error\n );\n }\n throw error;\n }\n}\n\n/**\n * Compares two version strings\n * Returns -1 if a < b, 0 if a == b, 1 if a > b\n */\nfunction compareVersions(a: string, b: string): number {\n const partsA = a.split(\".\").map(Number);\n const partsB = b.split(\".\").map(Number);\n\n for (let i = 0; i < Math.max(partsA.length, partsB.length); i++) {\n const numA = partsA[i] || 0;\n const numB = partsB[i] || 0;\n\n if (numA < numB) return -1;\n if (numA > numB) return 1;\n }\n\n return 0;\n}\n\n/**\n * Migrates old snapshot formats to current version\n * Applies migrations in sequence from old version to current\n *\n * @param data - Parsed snapshot data\n * @param config - Optional configuration\n * @returns Migrated snapshot data\n */\nfunction migrateSnapshotFormat(data: any, config?: SnapshotConfig): any {\n const mergedConfig = mergeConfig(config);\n const currentVersion = data.version;\n const targetVersion = mergedConfig.version;\n\n // If versions match, no migration needed\n if (currentVersion === targetVersion) {\n return data;\n }\n\n // If auto-migrate is disabled, just return the data with a warning\n if (!mergedConfig.autoMigrate) {\n console.warn(\n `Snapshot version ${currentVersion} differs from current ${targetVersion}, but auto-migrate is disabled.`\n );\n return data;\n }\n\n // Find and apply migrations in sequence\n let migratedData = { ...data };\n let currentMigrationVersion = currentVersion;\n\n // Sort migrations by fromVersion\n const sortedMigrations = [...SNAPSHOT_MIGRATIONS].sort((a, b) => compareVersions(a.fromVersion, b.fromVersion));\n\n for (const migration of sortedMigrations) {\n if (compareVersions(currentMigrationVersion, migration.fromVersion) === 0) {\n console.log(`Migrating snapshot from ${migration.fromVersion} to ${migration.toVersion}...`);\n migratedData = migration.migrate(migratedData);\n migratedData.version = migration.toVersion;\n currentMigrationVersion = migration.toVersion;\n }\n }\n\n // If we couldn't migrate to the target version, log a warning\n if (compareVersions(currentMigrationVersion, targetVersion) !== 0) {\n console.warn(`Unknown snapshot version ${currentVersion}, attempting to load anyway...`);\n }\n\n return migratedData;\n}\n\n/**\n * Deserializes snapshot data to SchemaSnapshot\n *\n * @param data - Parsed and validated snapshot data\n * @returns SchemaSnapshot object\n */\nfunction deserializeSnapshot(data: any): SchemaSnapshot {\n return {\n version: data.version,\n timestamp: data.timestamp,\n collections: deserializeMap<string, CollectionSchema>(data.collections),\n };\n}\n\n/**\n * Loads schema snapshot from file\n * Reads snapshot file, parses JSON, validates format, and handles migrations\n *\n * @param config - Snapshot configuration\n * @returns SchemaSnapshot object\n * @throws Error if snapshot file doesn't exist or is invalid\n */\nexport function loadSnapshot(config: SnapshotConfig = {}): SchemaSnapshot {\n const snapshotPath = getSnapshotPath(config);\n\n try {\n // Read file\n const jsonContent = fs.readFileSync(snapshotPath, \"utf-8\");\n\n // Parse and validate\n const data = parseAndValidateSnapshot(jsonContent, snapshotPath);\n\n // Migrate format if needed\n const migratedData = migrateSnapshotFormat(data, config);\n\n // Deserialize to SchemaSnapshot\n return deserializeSnapshot(migratedData);\n } catch (error) {\n // If it's already a SnapshotError or FileSystemError, re-throw it\n if (error instanceof SnapshotError || error instanceof FileSystemError) {\n throw error;\n }\n\n // If file doesn't exist, throw specific error\n if ((error as any).code === \"ENOENT\") {\n throw new SnapshotError(\n `Snapshot file not found. This may be the first migration run.`,\n snapshotPath,\n \"read\",\n error as Error\n );\n }\n\n // Handle other file system errors\n handleFileSystemError(error, \"read\", snapshotPath);\n }\n}\n\n/**\n * Merges base schema with custom snapshot\n * Base schema collections are preserved, custom collections are added\n * Custom collections override base collections if they have the same name\n *\n * @param baseSnapshot - PocketBase base schema\n * @param customSnapshot - User's custom schema snapshot (may be null)\n * @returns Merged SchemaSnapshot\n */\nexport function mergeSnapshots(baseSnapshot: SchemaSnapshot, customSnapshot: SchemaSnapshot | null): SchemaSnapshot {\n // If no custom snapshot, return base snapshot\n if (!customSnapshot) {\n return baseSnapshot;\n }\n\n // Create a new collections map starting with base collections\n const mergedCollections = new Map<string, CollectionSchema>(baseSnapshot.collections);\n\n // Add or override with custom collections\n for (const [name, schema] of customSnapshot.collections.entries()) {\n mergedCollections.set(name, schema);\n }\n\n return {\n version: customSnapshot.version || baseSnapshot.version,\n timestamp: customSnapshot.timestamp || baseSnapshot.timestamp,\n collections: mergedCollections,\n };\n}\n\n/**\n * Finds the most recent snapshot file in the migrations directory\n * Identifies snapshot files by naming pattern (e.g., *_collections_snapshot.js)\n *\n * @param migrationsPath - Path to pb_migrations directory\n * @returns Path to most recent snapshot file or null if none exist\n */\nexport function findLatestSnapshot(migrationsPath: string): string | null {\n try {\n // Check if migrations directory exists\n if (!fs.existsSync(migrationsPath)) {\n return null;\n }\n\n // Read all files in migrations directory\n const files = fs.readdirSync(migrationsPath);\n\n // Filter for snapshot files (files ending with _collections_snapshot.js or _snapshot.js)\n const snapshotFiles = files.filter(\n (file) => file.endsWith(\"_collections_snapshot.js\") || file.endsWith(\"_snapshot.js\")\n );\n\n if (snapshotFiles.length === 0) {\n return null;\n }\n\n // Sort by filename (timestamp prefix) to get most recent\n // Snapshot files are named with timestamp prefix: [timestamp]_collections_snapshot.js\n snapshotFiles.sort().reverse();\n\n // Return full path to most recent snapshot\n const latestSnapshot = snapshotFiles[0];\n if (!latestSnapshot) {\n return null;\n }\n return path.join(migrationsPath, latestSnapshot);\n } catch (error) {\n // If there's any error reading directory, return null\n console.warn(`Error finding latest snapshot: ${error}`);\n return null;\n }\n}\n\n/**\n * Applies migration operations to a snapshot state\n * Creates new collections and deletes collections as specified\n *\n * @param snapshot - Base snapshot state\n * @param operations - Migration operations to apply\n * @returns Updated snapshot with operations applied\n */\nexport function applyMigrationOperations(\n snapshot: SchemaSnapshot,\n operations: {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n collectionsToUpdate: ParsedCollectionUpdate[];\n }\n): SchemaSnapshot {\n const updatedCollections = new Map(snapshot.collections);\n\n // Apply deletions first\n for (const collectionName of operations.collectionsToDelete) {\n updatedCollections.delete(collectionName);\n }\n\n // Apply creations\n for (const collection of operations.collectionsToCreate) {\n updatedCollections.set(collection.name, collection);\n }\n\n // Apply updates\n for (const update of operations.collectionsToUpdate) {\n const collection = updatedCollections.get(update.collectionName);\n if (collection) {\n // Add fields\n if (update.fieldsToAdd.length > 0) {\n for (const newField of update.fieldsToAdd) {\n // Check if field with same ID already exists (update/replace)\n const existingIndex = collection.fields.findIndex((f) => f.id === newField.id);\n if (newField.id && existingIndex !== -1) {\n collection.fields[existingIndex] = newField;\n } else {\n collection.fields.push(newField);\n }\n }\n }\n\n // Remove fields\n if (update.fieldsToRemove.length > 0) {\n collection.fields = collection.fields.filter((f) => !update.fieldsToRemove.includes(f.name));\n }\n\n // Update fields\n for (const fieldUpdate of update.fieldsToUpdate) {\n const field = collection.fields.find((f) => f.name === fieldUpdate.fieldName);\n if (field) {\n const topLevelFieldProps = [\"name\", \"type\", \"required\", \"unique\", \"system\", \"id\", \"presentable\"];\n\n for (const [key, value] of Object.entries(fieldUpdate.changes)) {\n if (key.startsWith(\"options.\")) {\n const optionKey = key.replace(\"options.\", \"\");\n if (!field.options) field.options = {};\n field.options[optionKey] = value;\n } else if (key.startsWith(\"relation.\")) {\n const relationKey = key.replace(\"relation.\", \"\");\n if (!field.relation && field.type === \"relation\") {\n // Should initialize relation object if missing but type is relation\n field.relation = { collection: \"\" };\n }\n if (field.relation) {\n (field.relation as any)[relationKey] = value;\n }\n } else if (topLevelFieldProps.includes(key)) {\n (field as any)[key] = value;\n } else {\n // It's likely an option (e.g. 'values', 'min', 'max') being set directly\n // as produced by the generator or PocketBase SDK\n if (!field.options) field.options = {};\n field.options[key] = value;\n }\n }\n }\n }\n\n // Indexes\n if (update.indexesToAdd.length > 0) {\n if (!collection.indexes) collection.indexes = [];\n collection.indexes.push(...update.indexesToAdd);\n }\n\n if (update.indexesToRemove.length > 0) {\n if (collection.indexes) {\n collection.indexes = collection.indexes.filter((idx) => !update.indexesToRemove.includes(idx));\n }\n }\n\n // View query (view collections only)\n if (update.viewQuery !== undefined) {\n collection.viewQuery = update.viewQuery;\n }\n\n // Rules\n if (Object.keys(update.rulesToUpdate).length > 0) {\n if (!collection.rules) collection.rules = {};\n if (!collection.permissions) collection.permissions = {};\n\n for (const [key, value] of Object.entries(update.rulesToUpdate)) {\n // key is like 'listRule'\n // TS constraint: key must be one of the known rule types.\n // Since ParsedCollectionUpdate uses string key, we cast or check.\n (collection.rules as any)[key] = value;\n (collection.permissions as any)[key] = value;\n }\n }\n } else {\n console.warn(`Attempted to update non-existent collection: ${update.collectionName}`);\n }\n }\n\n return {\n ...snapshot,\n collections: updatedCollections,\n };\n}\n\n/**\n * Loads snapshot and applies all migrations that come after it\n * This gives us the current state of the database schema\n *\n * @param config - Snapshot configuration (must include migrationsPath)\n * @returns SchemaSnapshot object representing current state or null if snapshot doesn't exist\n */\nexport function loadSnapshotWithMigrations(config: SnapshotConfig = {}): SchemaSnapshot | null {\n const migrationsPath = config.migrationsPath;\n\n if (!migrationsPath) {\n return null;\n }\n\n // Check if migrationsPath is actually a file (for backward compatibility with tests)\n if (fs.existsSync(migrationsPath) && fs.statSync(migrationsPath).isFile()) {\n try {\n const migrationContent = fs.readFileSync(migrationsPath, \"utf-8\");\n return convertPocketBaseMigration(migrationContent);\n } catch (error) {\n console.warn(`Failed to load snapshot from ${migrationsPath}: ${error}`);\n return null;\n }\n }\n\n // It's a directory, find the latest snapshot\n const latestSnapshotPath = findLatestSnapshot(migrationsPath);\n\n if (!latestSnapshotPath) {\n // No snapshot found - return null (empty database)\n return null;\n }\n\n try {\n // Read and convert the PocketBase snapshot file\n const migrationContent = fs.readFileSync(latestSnapshotPath, \"utf-8\");\n let snapshot = convertPocketBaseMigration(migrationContent);\n\n // Extract timestamp from snapshot filename\n const snapshotFilename = path.basename(latestSnapshotPath);\n const snapshotTimestamp = extractTimestampFromFilename(snapshotFilename);\n\n if (snapshotTimestamp) {\n // Find all migration files after the snapshot\n const migrationFiles = findMigrationsAfterSnapshot(migrationsPath, snapshotTimestamp);\n\n // Apply each migration in order\n for (const migrationFile of migrationFiles) {\n try {\n const migrationContent = fs.readFileSync(migrationFile, \"utf-8\");\n const operations = parseMigrationOperations(migrationContent);\n snapshot = applyMigrationOperations(snapshot, operations);\n } catch (error) {\n console.warn(`Failed to apply migration ${migrationFile}: ${error}`);\n // Continue with other migrations even if one fails\n }\n }\n }\n\n return snapshot;\n } catch (error) {\n console.warn(`Failed to load snapshot from ${latestSnapshotPath}: ${error}`);\n return null;\n }\n}\n\n/**\n * Loads snapshot if it exists, returns null for first run\n * Convenience method that handles missing snapshot gracefully\n * Finds the most recent snapshot file from migrations directory\n * NOTE: This function only loads the snapshot, not migrations after it.\n * Use loadSnapshotWithMigrations() if you need the current state including migrations.\n *\n * @param config - Snapshot configuration (must include migrationsPath)\n * @returns SchemaSnapshot object or null if snapshot doesn't exist\n */\nexport function loadSnapshotIfExists(config: SnapshotConfig = {}): SchemaSnapshot | null {\n const migrationsPath = config.migrationsPath;\n\n if (!migrationsPath) {\n // No migrations path provided - return null\n return null;\n }\n\n // Check if migrationsPath is actually a file (for backward compatibility with tests)\n // If it's a file, treat it as a direct snapshot file path\n if (fs.existsSync(migrationsPath) && fs.statSync(migrationsPath).isFile()) {\n try {\n const migrationContent = fs.readFileSync(migrationsPath, \"utf-8\");\n return convertPocketBaseMigration(migrationContent);\n } catch (error) {\n console.warn(`Failed to load snapshot from ${migrationsPath}: ${error}`);\n return null;\n }\n }\n\n // It's a directory, find the latest snapshot\n const latestSnapshotPath = findLatestSnapshot(migrationsPath);\n\n if (latestSnapshotPath) {\n try {\n // Read and convert the PocketBase snapshot file\n const migrationContent = fs.readFileSync(latestSnapshotPath, \"utf-8\");\n return convertPocketBaseMigration(migrationContent);\n } catch (error) {\n console.warn(`Failed to load snapshot from ${latestSnapshotPath}: ${error}`);\n return null;\n }\n }\n\n // No snapshot found - return null (empty database)\n return null;\n}\n\n/**\n * Loads the base PocketBase schema from the initial migration file\n *\n * @param migrationPath - Path to pocketbase/pb_migrations/000000000_collections_snapshot.js\n * @returns SchemaSnapshot representing PocketBase's initial state\n * @throws SnapshotError if file not found or invalid format\n */\nexport function loadBaseMigration(migrationPath: string): SchemaSnapshot {\n try {\n // Check if file exists\n if (!fs.existsSync(migrationPath)) {\n throw new SnapshotError(\n `Base migration file not found: ${migrationPath}\\n\\n` +\n `This file should contain PocketBase's initial schema.\\n` +\n `Please ensure PocketBase is properly set up by running 'yarn setup'.\\n` +\n `If the file exists in a different location, update the configuration.`,\n migrationPath,\n \"read\"\n );\n }\n\n // Read the migration file\n const migrationContent = fs.readFileSync(migrationPath, \"utf-8\");\n\n // Convert to SchemaSnapshot\n const snapshot = convertPocketBaseMigration(migrationContent);\n\n return snapshot;\n } catch (error) {\n // If it's already a SnapshotError, re-throw it\n if (error instanceof SnapshotError) {\n throw error;\n }\n\n // Handle file system errors\n if ((error as any).code === \"ENOENT\") {\n throw new SnapshotError(\n `Base migration file not found: ${migrationPath}\\n\\n` +\n `This file should contain PocketBase's initial schema.\\n` +\n `Please ensure PocketBase is properly set up by running 'yarn setup'.`,\n migrationPath,\n \"read\",\n error as Error\n );\n }\n\n if ((error as any).code === \"EACCES\" || (error as any).code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied reading base migration file. Check file permissions.`,\n migrationPath,\n \"read\",\n (error as any).code,\n error as Error\n );\n }\n\n // Other errors\n throw new SnapshotError(\n `Failed to load base migration: ${error instanceof Error ? error.message : String(error)}`,\n migrationPath,\n \"read\",\n error instanceof Error ? error : undefined\n );\n }\n}\n\n/**\n * Gets the current snapshot version\n */\nexport function getSnapshotVersion(): string {\n return SNAPSHOT_VERSION;\n}\n\n/**\n * Validates a snapshot against the current version\n * Returns validation result with any issues found\n */\nexport function validateSnapshot(snapshot: SchemaSnapshot): { valid: boolean; issues: string[] } {\n const issues: string[] = [];\n\n // Check version\n if (!snapshot.version) {\n issues.push(\"Missing version field\");\n } else if (compareVersions(snapshot.version, SNAPSHOT_VERSION) > 0) {\n issues.push(`Snapshot version ${snapshot.version} is newer than supported version ${SNAPSHOT_VERSION}`);\n }\n\n // Check timestamp\n if (!snapshot.timestamp) {\n issues.push(\"Missing timestamp field\");\n }\n\n // Check collections\n if (!snapshot.collections) {\n issues.push(\"Missing collections field\");\n } else if (!(snapshot.collections instanceof Map)) {\n issues.push(\"Collections field is not a Map\");\n }\n\n return {\n valid: issues.length === 0,\n issues,\n };\n}\n\n/**\n * Re-exports convertPocketBaseMigration for backward compatibility\n */\nexport { convertPocketBaseMigration } from \"./pocketbase-converter\";\n\n/**\n * SnapshotManager class for object-oriented usage\n * Provides a stateful interface for snapshot management\n */\nexport class SnapshotManager {\n private config: SnapshotConfig;\n\n constructor(config: SnapshotConfig = {}) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Loads the current snapshot\n */\n loadSnapshot(): SchemaSnapshot {\n return loadSnapshot(this.config);\n }\n\n /**\n * Saves a schema as a snapshot\n */\n saveSnapshot(schema: SchemaDefinition): void {\n saveSnapshot(schema, this.config);\n }\n\n /**\n * Loads snapshot if it exists, returns null otherwise\n */\n loadSnapshotIfExists(): SchemaSnapshot | null {\n return loadSnapshotIfExists(this.config);\n }\n\n /**\n * Checks if a snapshot exists\n */\n snapshotExists(): boolean {\n return snapshotExists(this.config);\n }\n\n /**\n * Converts a PocketBase migration to a snapshot\n */\n convertPocketBaseMigration(content: string): SchemaSnapshot {\n return convertPocketBaseMigration(content);\n }\n\n /**\n * Gets the snapshot file path\n */\n getSnapshotPath(): string {\n return getSnapshotPath(this.config);\n }\n\n /**\n * Validates a snapshot\n */\n validateSnapshot(snapshot: SchemaSnapshot): { valid: boolean; issues: string[] } {\n return validateSnapshot(snapshot);\n }\n}\n"]}