pocketbase-zod-schema 0.7.2 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +198 -25
  3. package/dist/cli/index.cjs +3740 -1233
  4. package/dist/cli/index.cjs.map +1 -1
  5. package/dist/cli/index.js +3737 -1232
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/migrate.cjs +3815 -1201
  8. package/dist/cli/migrate.cjs.map +1 -1
  9. package/dist/cli/migrate.js +3811 -1199
  10. package/dist/cli/migrate.js.map +1 -1
  11. package/dist/cli/utils/index.cjs +52 -13
  12. package/dist/cli/utils/index.cjs.map +1 -1
  13. package/dist/cli/utils/index.d.cts +46 -1
  14. package/dist/cli/utils/index.d.ts +46 -1
  15. package/dist/cli/utils/index.js +51 -13
  16. package/dist/cli/utils/index.js.map +1 -1
  17. package/dist/migration/analyzer.cjs +123 -42
  18. package/dist/migration/analyzer.cjs.map +1 -1
  19. package/dist/migration/analyzer.js +123 -42
  20. package/dist/migration/analyzer.js.map +1 -1
  21. package/dist/migration/diff.cjs +13 -0
  22. package/dist/migration/diff.cjs.map +1 -1
  23. package/dist/migration/diff.js +13 -0
  24. package/dist/migration/diff.js.map +1 -1
  25. package/dist/migration/engine.cjs +3263 -0
  26. package/dist/migration/engine.cjs.map +1 -0
  27. package/dist/migration/engine.d.cts +105 -0
  28. package/dist/migration/engine.d.ts +105 -0
  29. package/dist/migration/engine.js +3173 -0
  30. package/dist/migration/engine.js.map +1 -0
  31. package/dist/migration/generator.cjs +40 -18
  32. package/dist/migration/generator.cjs.map +1 -1
  33. package/dist/migration/generator.d.cts +45 -2
  34. package/dist/migration/generator.d.ts +45 -2
  35. package/dist/migration/generator.js +39 -19
  36. package/dist/migration/generator.js.map +1 -1
  37. package/dist/migration/index.cjs +3479 -1145
  38. package/dist/migration/index.cjs.map +1 -1
  39. package/dist/migration/index.d.cts +21 -4
  40. package/dist/migration/index.d.ts +21 -4
  41. package/dist/migration/index.js +3433 -1142
  42. package/dist/migration/index.js.map +1 -1
  43. package/dist/migration/snapshot.cjs +2200 -804
  44. package/dist/migration/snapshot.cjs.map +1 -1
  45. package/dist/migration/snapshot.d.cts +24 -66
  46. package/dist/migration/snapshot.d.ts +24 -66
  47. package/dist/migration/snapshot.js +2198 -801
  48. package/dist/migration/snapshot.js.map +1 -1
  49. package/dist/migration/utils/index.cjs +51 -9
  50. package/dist/migration/utils/index.cjs.map +1 -1
  51. package/dist/migration/utils/index.d.cts +1 -1
  52. package/dist/migration/utils/index.d.ts +1 -1
  53. package/dist/migration/utils/index.js +50 -10
  54. package/dist/migration/utils/index.js.map +1 -1
  55. package/dist/server.cjs +3837 -1248
  56. package/dist/server.cjs.map +1 -1
  57. package/dist/server.d.cts +6 -4
  58. package/dist/server.d.ts +6 -4
  59. package/dist/server.js +3791 -1245
  60. package/dist/server.js.map +1 -1
  61. package/dist/{type-mapper-Bu9qjCdd.d.cts → type-mapper-BSPTj8t5.d.cts} +23 -1
  62. package/dist/{type-mapper-JBaVuKE2.d.ts → type-mapper-D31WYDee.d.ts} +23 -1
  63. package/dist/types-B_MLb1Ob.d.ts +475 -0
  64. package/dist/types-upZBVMfb.d.cts +475 -0
  65. package/dist/verify-BF72n2df.d.ts +402 -0
  66. package/dist/verify-DTzYpiXX.d.cts +402 -0
  67. package/package.json +7 -1
@@ -1 +1 @@
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","migrationContent"],"mappings":"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","file":"snapshot.js","sourcesContent":["/**\n * Custom error classes for migration tool\n * Provides specific error types for better error handling and user feedback\n */\n\n/**\n * Base error class for all migration-related errors\n */\nexport class MigrationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MigrationError\";\n Object.setPrototypeOf(this, MigrationError.prototype);\n }\n}\n\n/**\n * Error thrown when schema parsing fails\n * Used when Zod schemas cannot be parsed or are invalid\n */\nexport class SchemaParsingError extends MigrationError {\n public readonly filePath?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, filePath?: string, originalError?: Error) {\n super(message);\n this.name = \"SchemaParsingError\";\n this.filePath = filePath;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SchemaParsingError.prototype);\n }\n\n /**\n * Creates a formatted error message with file path and original error details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.filePath) {\n parts.push(`\\nFile: ${this.filePath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when snapshot operations fail\n * Used for snapshot file read/write/parse errors\n */\nexport class SnapshotError extends MigrationError {\n public readonly snapshotPath?: string;\n public readonly operation?: \"read\" | \"write\" | \"parse\" | \"validate\";\n public readonly originalError?: Error;\n\n constructor(\n message: string,\n snapshotPath?: string,\n operation?: \"read\" | \"write\" | \"parse\" | \"validate\",\n originalError?: Error\n ) {\n super(message);\n this.name = \"SnapshotError\";\n this.snapshotPath = snapshotPath;\n this.operation = operation;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SnapshotError.prototype);\n }\n\n /**\n * Creates a formatted error message with snapshot path and operation details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.operation) {\n parts.push(`\\nOperation: ${this.operation}`);\n }\n\n if (this.snapshotPath) {\n parts.push(`\\nSnapshot: ${this.snapshotPath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when migration file generation fails\n * Used when migration files cannot be created or written\n */\nexport class MigrationGenerationError extends MigrationError {\n public readonly migrationPath?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, migrationPath?: string, originalError?: Error) {\n super(message);\n this.name = \"MigrationGenerationError\";\n this.migrationPath = migrationPath;\n this.originalError = originalError;\n Object.setPrototypeOf(this, MigrationGenerationError.prototype);\n }\n\n /**\n * Creates a formatted error message with migration path and original error details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.migrationPath) {\n parts.push(`\\nMigration: ${this.migrationPath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when file system operations fail\n * Used for directory creation, file permissions, disk space issues\n */\nexport class FileSystemError extends MigrationError {\n public readonly path?: string;\n public readonly operation?: \"read\" | \"write\" | \"create\" | \"delete\" | \"access\";\n public readonly code?: string;\n public readonly originalError?: Error;\n\n constructor(\n message: string,\n path?: string,\n operation?: \"read\" | \"write\" | \"create\" | \"delete\" | \"access\",\n code?: string,\n originalError?: Error\n ) {\n super(message);\n this.name = \"FileSystemError\";\n this.path = path;\n this.operation = operation;\n this.code = code;\n this.originalError = originalError;\n Object.setPrototypeOf(this, FileSystemError.prototype);\n }\n\n /**\n * Creates a formatted error message with path, operation, and error code details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.operation) {\n parts.push(`\\nOperation: ${this.operation}`);\n }\n\n if (this.path) {\n parts.push(`\\nPath: ${this.path}`);\n }\n\n if (this.code) {\n parts.push(`\\nError Code: ${this.code}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when configuration is invalid\n * Used for configuration file parsing, validation, and path resolution errors\n */\nexport class ConfigurationError extends MigrationError {\n public readonly configPath?: string;\n public readonly invalidFields?: string[];\n public readonly originalError?: Error;\n\n constructor(message: string, configPath?: string, invalidFields?: string[], originalError?: Error) {\n super(message);\n this.name = \"ConfigurationError\";\n this.configPath = configPath;\n this.invalidFields = invalidFields;\n this.originalError = originalError;\n Object.setPrototypeOf(this, ConfigurationError.prototype);\n }\n\n /**\n * Creates a formatted error message with configuration details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.configPath) {\n parts.push(`\\nConfiguration File: ${this.configPath}`);\n }\n\n if (this.invalidFields && this.invalidFields.length > 0) {\n parts.push(`\\nInvalid Fields: ${this.invalidFields.join(\", \")}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when CLI command usage is incorrect\n * Used for invalid arguments, missing required options, etc.\n */\nexport class CLIUsageError extends MigrationError {\n public readonly command?: string;\n public readonly suggestion?: string;\n\n constructor(message: string, command?: string, suggestion?: string) {\n super(message);\n this.name = \"CLIUsageError\";\n this.command = command;\n this.suggestion = suggestion;\n Object.setPrototypeOf(this, CLIUsageError.prototype);\n }\n\n /**\n * Creates a formatted error message with usage suggestions\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.command) {\n parts.push(`\\nCommand: ${this.command}`);\n }\n\n if (this.suggestion) {\n parts.push(`\\nSuggestion: ${this.suggestion}`);\n }\n\n return parts.join(\"\");\n }\n}\n","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"]}
1
+ {"version":3,"sources":["../../src/migration/errors.ts","../../src/migration/engine/fields.ts","../../src/migration/engine/fields-list.ts","../../src/migration/engine/collection.ts","../../src/migration/engine/expression.ts","../../src/migration/engine/dbx.ts","../../src/migration/engine/records.ts","../../src/migration/engine/data-api.ts","../../src/migration/engine/app.ts","../../src/migration/engine/unmarshal.ts","../../src/migration/engine/globals.ts","../../src/migration/engine/runner.ts","../../src/migration/engine/applied-migrations.ts","../../src/migration/engine/migration-plan.ts","../../src/schema/view.ts","../../src/migration/utils/type-mapper.ts","../../src/migration/pocketbase-converter.ts","../../src/migration/engine/store.ts","../../src/migration/engine/replayer.ts","../../src/migration/snapshot.ts"],"names":["path","negated","fs","fs2","path2","snapshot","SNAPSHOT_VERSION"],"mappings":"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","file":"snapshot.js","sourcesContent":["/**\n * Custom error classes for migration tool\n * Provides specific error types for better error handling and user feedback\n */\n\n/**\n * Base error class for all migration-related errors\n */\nexport class MigrationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MigrationError\";\n Object.setPrototypeOf(this, MigrationError.prototype);\n }\n}\n\n/**\n * Error thrown when schema parsing fails\n * Used when Zod schemas cannot be parsed or are invalid\n */\nexport class SchemaParsingError extends MigrationError {\n public readonly filePath?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, filePath?: string, originalError?: Error) {\n super(message);\n this.name = \"SchemaParsingError\";\n this.filePath = filePath;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SchemaParsingError.prototype);\n }\n\n /**\n * Creates a formatted error message with file path and original error details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.filePath) {\n parts.push(`\\nFile: ${this.filePath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when snapshot operations fail\n * Used for snapshot file read/write/parse errors\n */\nexport class SnapshotError extends MigrationError {\n public readonly snapshotPath?: string;\n public readonly operation?: \"read\" | \"write\" | \"parse\" | \"validate\";\n public readonly originalError?: Error;\n\n constructor(\n message: string,\n snapshotPath?: string,\n operation?: \"read\" | \"write\" | \"parse\" | \"validate\",\n originalError?: Error\n ) {\n super(message);\n this.name = \"SnapshotError\";\n this.snapshotPath = snapshotPath;\n this.operation = operation;\n this.originalError = originalError;\n Object.setPrototypeOf(this, SnapshotError.prototype);\n }\n\n /**\n * Creates a formatted error message with snapshot path and operation details\n */\n public getDetailedMessage(): string {\n const parts: string[] = [this.message];\n\n if (this.operation) {\n parts.push(`\\nOperation: ${this.operation}`);\n }\n\n if (this.snapshotPath) {\n parts.push(`\\nSnapshot: ${this.snapshotPath}`);\n }\n\n if (this.originalError) {\n parts.push(`\\nCause: ${this.originalError.message}`);\n }\n\n return parts.join(\"\");\n }\n}\n\n/**\n * Error thrown when the execution engine fails to run a migration file\n * Carries the file path and the phase that failed so the user can pinpoint\n * (and fix or exclude) the offending migration\n */\nexport class MigrationExecutionError extends MigrationError {\n public readonly filePath?: string;\n public readonly phase?: \"evaluate\" | \"up\" | \"down\";\n public readonly originalError?: Error;\n\n constructor(message: string, filePath?: string, phase?: \"evaluate\" | \"up\" | \"down\", originalError?: Error) {\n super(message);\n this.name = \"MigrationExecutionError\";\n this.filePath = filePath;\n this.phase = phase;\n this.originalError = originalError;\n Object.setPrototypeOf(this, MigrationExecutionError.prototype);\n }\n\n /**\n * Creates a formatted error message with file path and phase 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.phase) {\n parts.push(`\\nPhase: ${this.phase}`);\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 * Runtime field constructors matching the PocketBase JSVM globals\n *\n * In the PocketBase JSVM, migrations construct fields via `new Field({...})`\n * or typed constructors like `new TextField({...})`. Instances are plain\n * mutable objects; migrations freely assign properties after construction\n * (e.g. `field.max = 500`).\n *\n * The constructors deliberately add no default properties beyond `type`:\n * the resulting state must match what the migration file literally declares,\n * the same data the literal declares, materialized as a real object.\n */\n\n/**\n * Generic field constructor: `new Field({type: \"number\", ...})`.\n * PocketBase's own generated migrations use this form with an explicit type.\n */\nexport class Field {\n [key: string]: any;\n\n constructor(data: Record<string, any> = {}) {\n Object.assign(this, data);\n }\n}\n\nfunction typedField(type: string): new (data?: Record<string, any>) => Field {\n return class extends Field {\n constructor(data: Record<string, any> = {}) {\n super({ type, ...data });\n }\n };\n}\n\n// One constructor per PocketBase field type (see POCKETBASE_FIELD_TYPES)\nexport const TextField = typedField(\"text\");\nexport const EmailField = typedField(\"email\");\nexport const URLField = typedField(\"url\");\nexport const NumberField = typedField(\"number\");\nexport const BoolField = typedField(\"bool\");\nexport const DateField = typedField(\"date\");\nexport const SelectField = typedField(\"select\");\nexport const RelationField = typedField(\"relation\");\nexport const FileField = typedField(\"file\");\nexport const JSONField = typedField(\"json\");\nexport const EditorField = typedField(\"editor\");\nexport const GeoPointField = typedField(\"geoPoint\");\nexport const AutodateField = typedField(\"autodate\");\nexport const PasswordField = typedField(\"password\");\n\nexport const FIELD_CONSTRUCTORS: Record<string, new (data?: Record<string, any>) => Field> = {\n Field,\n TextField,\n EmailField,\n URLField,\n NumberField,\n BoolField,\n DateField,\n SelectField,\n RelationField,\n FileField,\n JSONField,\n EditorField,\n GeoPointField,\n AutodateField,\n PasswordField,\n};\n\n/**\n * Generates a field id in PocketBase's `<type><digits>` style when a\n * migration saves a field without one. PocketBase derives the digits from\n * crc32(name); a random suffix is sufficient here because diffing matches\n * fields by name, not id.\n */\nexport function generateRuntimeFieldId(type: string): string {\n let digits = \"\";\n for (let i = 0; i < 10; i++) {\n digits += Math.floor(Math.random() * 10).toString();\n }\n return `${type || \"field\"}${digits}`;\n}\n","/**\n * FieldsList — runtime equivalent of a PocketBase collection's `fields`\n *\n * Mirrors the methods the JSVM exposes on `collection.fields`:\n * add / addAt / removeById / removeByName / getById / getByName, plus\n * read-side iteration. Field entries are live objects — mutations through\n * getByName() are visible when the collection is saved, exactly like the\n * generator's `const f = collection.fields.getByName(\"x\"); f.max = 500;`\n * output expects.\n */\n\nimport { Field } from \"./fields\";\n\nexport class FieldsList {\n private items: Field[] = [];\n\n constructor(fields?: any[]) {\n if (Array.isArray(fields)) {\n for (const field of fields) {\n this.items.push(field instanceof Field ? field : new Field(field));\n }\n }\n }\n\n get length(): number {\n return this.items.length;\n }\n\n /**\n * Appends fields; a field whose id matches an existing entry replaces it\n * in place (position preserved), matching PocketBase upsert semantics.\n */\n add(...fields: any[]): void {\n for (const raw of fields) {\n const field = raw instanceof Field ? raw : new Field(raw);\n const existing = this.indexOfId(field.id);\n if (existing >= 0) {\n this.items[existing] = field;\n } else {\n this.items.push(field);\n }\n }\n }\n\n /**\n * Inserts fields at a position. A field with an already-present id is\n * moved: the old entry is removed first, then the field is inserted at\n * the requested position.\n */\n addAt(position: number, ...fields: any[]): void {\n let insertAt = Math.max(0, Math.min(position, this.items.length));\n for (const raw of fields) {\n const field = raw instanceof Field ? raw : new Field(raw);\n const existing = this.indexOfId(field.id);\n if (existing >= 0) {\n this.items.splice(existing, 1);\n if (existing < insertAt) {\n insertAt--;\n }\n }\n insertAt = Math.max(0, Math.min(insertAt, this.items.length));\n this.items.splice(insertAt, 0, field);\n insertAt++;\n }\n }\n\n removeById(id: string): void {\n const index = this.indexOfId(id);\n if (index >= 0) {\n this.items.splice(index, 1);\n }\n }\n\n removeByName(name: string): void {\n const index = this.items.findIndex((f) => f.name === name);\n if (index >= 0) {\n this.items.splice(index, 1);\n }\n }\n\n getById(id: string): Field | undefined {\n const index = this.indexOfId(id);\n return index >= 0 ? this.items[index] : undefined;\n }\n\n getByName(name: string): Field | undefined {\n return this.items.find((f) => f.name === name);\n }\n\n at(index: number): Field | undefined {\n return this.items.at(index);\n }\n\n find(predicate: (field: Field, index: number) => boolean): Field | undefined {\n return this.items.find(predicate);\n }\n\n filter(predicate: (field: Field, index: number) => boolean): Field[] {\n return this.items.filter(predicate);\n }\n\n map<T>(mapper: (field: Field, index: number) => T): T[] {\n return this.items.map(mapper);\n }\n\n forEach(callback: (field: Field, index: number) => void): void {\n this.items.forEach(callback);\n }\n\n [Symbol.iterator](): Iterator<Field> {\n return this.items[Symbol.iterator]();\n }\n\n /** Replaces the whole list (used by unmarshal({fields: [...]}, collection)) */\n replaceAll(fields: any[]): void {\n this.items = [];\n this.add(...fields);\n }\n\n /** Plain objects, in order */\n serialize(): Record<string, any>[] {\n return this.items.map((field) => ({ ...field }));\n }\n\n private indexOfId(id: unknown): number {\n if (typeof id !== \"string\" || id === \"\") {\n return -1;\n }\n return this.items.findIndex((f) => f.id === id);\n }\n}\n","/**\n * Runtime Collection class matching the PocketBase JSVM global\n *\n * `new Collection({...})` in a migration produces one of these. All data\n * properties are copied verbatim (auth options, templates, etc. survive a\n * snapshot import round-trip); `fields` becomes a live FieldsList and\n * `indexes` a real array so `push`/`findIndex`/`splice` work natively.\n *\n * No rule properties are defaulted: the serialized collection must contain\n * exactly what the migration declared, so engine output stays byte-parity\n * with static analysis of the same literals.\n */\n\nimport { FieldsList } from \"./fields-list\";\nimport type { RawCollection } from \"./types\";\n\n/**\n * Auth collections in real PocketBase always carry these system fields.\n * PocketBase injects the missing ones *when the collection is saved*\n * (`initDefaultFields`), not when the model is constructed — so this list is\n * applied by `ensureAuthSystemFields()` on the save path, never in the\n * constructor. Injecting on construction would also re-add them every time a\n * collection is rebuilt (`CollectionStore.clone()`), silently undoing a\n * migration that dropped one. Shapes and ids mirror what PocketBase\n * serializes into its own migration files.\n */\nconst AUTH_SYSTEM_FIELDS: RawCollection[] = [\n {\n autogeneratePattern: \"\",\n hidden: true,\n id: \"password901924565\",\n max: 0,\n min: 8,\n name: \"password\",\n pattern: \"\",\n presentable: false,\n required: true,\n system: true,\n type: \"password\",\n },\n {\n autogeneratePattern: \"[a-zA-Z0-9]{50}\",\n hidden: true,\n id: \"text2504183744\",\n max: 60,\n min: 30,\n name: \"tokenKey\",\n pattern: \"\",\n presentable: false,\n primaryKey: false,\n required: true,\n system: true,\n type: \"text\",\n },\n {\n exceptDomains: null,\n hidden: false,\n id: \"email3885137012\",\n name: \"email\",\n onlyDomains: null,\n presentable: false,\n required: true,\n system: true,\n type: \"email\",\n },\n {\n hidden: false,\n id: \"bool1547992806\",\n name: \"emailVisibility\",\n presentable: false,\n required: false,\n system: true,\n type: \"bool\",\n },\n {\n hidden: false,\n id: \"bool256245529\",\n name: \"verified\",\n presentable: false,\n required: false,\n system: true,\n type: \"bool\",\n },\n];\n\nexport function generateRuntimeCollectionId(): string {\n let digits = \"\";\n for (let i = 0; i < 10; i++) {\n digits += Math.floor(Math.random() * 10).toString();\n }\n return `pbc_${digits}`;\n}\n\nexport class Collection {\n [key: string]: any;\n\n id: string;\n name: string;\n type: string;\n system: boolean;\n fields: FieldsList;\n indexes: string[];\n\n constructor(data: RawCollection = {}) {\n const { fields, indexes, ...rest } = data;\n Object.assign(this, rest);\n\n this.id = typeof data.id === \"string\" && data.id !== \"\" ? data.id : generateRuntimeCollectionId();\n this.name = typeof data.name === \"string\" ? data.name : \"\";\n this.type = typeof data.type === \"string\" && data.type !== \"\" ? data.type : \"base\";\n this.system = data.system === true;\n this.fields = new FieldsList(Array.isArray(fields) ? fields : []);\n this.indexes = Array.isArray(indexes) ? [...indexes] : [];\n }\n\n /** PocketBase-shaped plain object (what a snapshot array entry looks like) */\n serialize(): RawCollection {\n const raw: RawCollection = {};\n for (const [key, value] of Object.entries(this)) {\n if (key === \"fields\" || key === \"indexes\") {\n continue;\n }\n raw[key] = value;\n }\n raw.fields = this.fields.serialize();\n raw.indexes = [...this.indexes];\n return raw;\n }\n}\n\n/**\n * PocketBase's `initDefaultFields` for auth collections: on save, any missing\n * system field is put back. Call this from the save path only — the resulting\n * collection is then stable across serialize/rebuild cycles, so replaying the\n * next migration file sees exactly what the previous one committed.\n */\nexport function ensureAuthSystemFields(collection: Collection): void {\n if (collection.type !== \"auth\") {\n return;\n }\n for (const systemField of AUTH_SYSTEM_FIELDS) {\n if (!collection.fields.getByName(systemField.name)) {\n collection.fields.add({ ...systemField });\n }\n }\n}\n","/**\n * Condition expressions — one evaluator for PocketBase filters and SQL WHERE\n *\n * Data migrations select records two ways: PocketBase's filter syntax\n * (`status = \"draft\" && views > 10`) and raw SQL through `$dbx`/`app.db()`\n * (`WHERE status = {:status}`). The two dialects overlap almost completely —\n * the same comparison operators over the same field/literal operands — so the\n * simulation parses both with one grammar and evaluates the result against a\n * record.\n *\n * Deliberately small: comparisons, `LIKE`/`~`, `IN`, `IS NULL`, `AND`/`OR`/\n * `NOT`, parentheses, and `{:name}` bindings. Anything outside that raises\n * `ExpressionError`, which the caller reports as an unsupported query rather\n * than silently matching the wrong rows.\n */\n\nexport class ExpressionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"ExpressionError\";\n Object.setPrototypeOf(this, ExpressionError.prototype);\n }\n}\n\n/** Resolves a field reference to the value stored on the row being tested */\nexport interface EvaluationContext {\n field: (name: string) => unknown;\n params?: Record<string, unknown>;\n}\n\nexport type Condition =\n | { kind: \"and\"; operands: Condition[] }\n | { kind: \"or\"; operands: Condition[] }\n | { kind: \"not\"; operand: Condition }\n | { kind: \"compare\"; operator: CompareOperator; left: Operand; right: Operand }\n | { kind: \"in\"; negated: boolean; left: Operand; values: Operand[] }\n | { kind: \"like\"; negated: boolean; left: Operand; pattern: Operand; implicitWildcards: boolean }\n | { kind: \"null\"; negated: boolean; operand: Operand }\n | { kind: \"between\"; negated: boolean; operand: Operand; from: Operand; to: Operand }\n | { kind: \"literal\"; value: boolean };\n\nexport type CompareOperator = \"=\" | \"!=\" | \">\" | \">=\" | \"<\" | \"<=\";\n\nexport type Operand =\n | { kind: \"field\"; name: string }\n | { kind: \"value\"; value: unknown }\n | { kind: \"param\"; name: string };\n\n// ---------------------------------------------------------------------------\n// Tokenizer\n// ---------------------------------------------------------------------------\n\ntype TokenType = \"identifier\" | \"number\" | \"string\" | \"param\" | \"operator\" | \"punct\";\n\ninterface Token {\n type: TokenType;\n value: string;\n position: number;\n}\n\nconst OPERATORS = [\"?!=\", \"!~\", \"?=\", \"?~\", \"!=\", \"<>\", \">=\", \"<=\", \"==\", \"&&\", \"||\", \"=\", \">\", \"<\", \"~\"];\n\nfunction tokenize(input: string): Token[] {\n const tokens: Token[] = [];\n let index = 0;\n\n while (index < input.length) {\n const char = input[index];\n\n if (/\\s/.test(char)) {\n index++;\n continue;\n }\n\n // {:name} — dbx/PocketBase parameter binding\n if (char === \"{\" && input[index + 1] === \":\") {\n const end = input.indexOf(\"}\", index);\n if (end === -1) {\n throw new ExpressionError(`Unterminated parameter placeholder at position ${index}`);\n }\n tokens.push({ type: \"param\", value: input.slice(index + 2, end).trim(), position: index });\n index = end + 1;\n continue;\n }\n\n if (char === \"'\" || char === '\"') {\n const { value, next } = readString(input, index);\n tokens.push({ type: \"string\", value, position: index });\n index = next;\n continue;\n }\n\n if (/[0-9]/.test(char) || (char === \".\" && /[0-9]/.test(input[index + 1] ?? \"\"))) {\n const match = /^[0-9]*\\.?[0-9]+(?:[eE][+-]?[0-9]+)?/.exec(input.slice(index));\n if (!match) {\n throw new ExpressionError(`Invalid number at position ${index}`);\n }\n tokens.push({ type: \"number\", value: match[0], position: index });\n index += match[0].length;\n continue;\n }\n\n // Identifiers may be qualified (table.column) or backtick/bracket quoted\n if (/[A-Za-z_`[]/.test(char)) {\n const { value, next } = readIdentifier(input, index);\n tokens.push({ type: \"identifier\", value, position: index });\n index = next;\n continue;\n }\n\n const operator = OPERATORS.find((candidate) => input.startsWith(candidate, index));\n if (operator) {\n tokens.push({ type: \"operator\", value: operator, position: index });\n index += operator.length;\n continue;\n }\n\n if (char === \"(\" || char === \")\" || char === \",\") {\n tokens.push({ type: \"punct\", value: char, position: index });\n index++;\n continue;\n }\n\n throw new ExpressionError(`Unexpected character ${JSON.stringify(char)} at position ${index}`);\n }\n\n return tokens;\n}\n\nfunction readString(input: string, start: number): { value: string; next: number } {\n const quote = input[start];\n let index = start + 1;\n let value = \"\";\n\n while (index < input.length) {\n const char = input[index];\n if (char === \"\\\\\" && index + 1 < input.length) {\n value += unescapeChar(input[index + 1]);\n index += 2;\n continue;\n }\n // SQL doubles the quote to escape it: 'it''s'\n if (char === quote && input[index + 1] === quote) {\n value += quote;\n index += 2;\n continue;\n }\n if (char === quote) {\n return { value, next: index + 1 };\n }\n value += char;\n index++;\n }\n\n throw new ExpressionError(`Unterminated string starting at position ${start}`);\n}\n\nfunction unescapeChar(char: string): string {\n switch (char) {\n case \"n\":\n return \"\\n\";\n case \"t\":\n return \"\\t\";\n case \"r\":\n return \"\\r\";\n default:\n return char;\n }\n}\n\nfunction readIdentifier(input: string, start: number): { value: string; next: number } {\n let index = start;\n let value = \"\";\n\n while (index < input.length) {\n const char = input[index];\n if (char === \"`\" || char === \"[\" || char === \"]\" || char === '\"') {\n // Quoted identifier segment: `my table`.`col`\n if (char === \"`\" || char === \"[\") {\n const closing = char === \"`\" ? \"`\" : \"]\";\n const end = input.indexOf(closing, index + 1);\n if (end === -1) {\n throw new ExpressionError(`Unterminated quoted identifier at position ${index}`);\n }\n value += input.slice(index + 1, end);\n index = end + 1;\n continue;\n }\n break;\n }\n if (/[A-Za-z0-9_.$]/.test(char)) {\n value += char;\n index++;\n continue;\n }\n break;\n }\n\n if (value === \"\") {\n throw new ExpressionError(`Invalid identifier at position ${start}`);\n }\n return { value, next: index };\n}\n\n// ---------------------------------------------------------------------------\n// Parser\n// ---------------------------------------------------------------------------\n\nconst KEYWORDS = new Set([\"and\", \"or\", \"not\", \"in\", \"is\", \"null\", \"like\", \"true\", \"false\", \"between\"]);\n\nclass Parser {\n private index = 0;\n\n constructor(private tokens: Token[]) {}\n\n parse(): Condition {\n if (this.tokens.length === 0) {\n return { kind: \"literal\", value: true };\n }\n const condition = this.parseOr();\n if (this.index < this.tokens.length) {\n const token = this.tokens[this.index];\n throw new ExpressionError(`Unexpected ${JSON.stringify(token.value)} at position ${token.position}`);\n }\n return condition;\n }\n\n private parseOr(): Condition {\n const operands = [this.parseAnd()];\n while (this.matchOperator(\"||\") || this.matchKeyword(\"or\")) {\n operands.push(this.parseAnd());\n }\n return operands.length === 1 ? operands[0] : { kind: \"or\", operands };\n }\n\n private parseAnd(): Condition {\n const operands = [this.parseNot()];\n while (this.matchOperator(\"&&\") || this.matchKeyword(\"and\")) {\n operands.push(this.parseNot());\n }\n return operands.length === 1 ? operands[0] : { kind: \"and\", operands };\n }\n\n private parseNot(): Condition {\n if (this.matchKeyword(\"not\")) {\n return { kind: \"not\", operand: this.parseNot() };\n }\n return this.parseComparison();\n }\n\n private parseComparison(): Condition {\n if (this.peekPunct(\"(\")) {\n // Only a parenthesized condition can start here; a parenthesized value\n // list is consumed by IN below\n this.index++;\n const condition = this.parseOr();\n this.expectPunct(\")\");\n return condition;\n }\n\n const left = this.parseOperand();\n\n if (this.matchKeyword(\"is\")) {\n const negated = this.matchKeyword(\"not\");\n this.expectKeyword(\"null\");\n return { kind: \"null\", negated, operand: left };\n }\n\n // Postfix negation: `status NOT IN (...)`, `title NOT LIKE 'x'`,\n // `n NOT BETWEEN 1 AND 5`. Nothing else may follow an operand.\n const negated = this.matchKeyword(\"not\");\n\n if (this.matchKeyword(\"in\")) {\n return { kind: \"in\", negated, left, values: this.parseValueList() };\n }\n\n if (this.matchKeyword(\"like\")) {\n return { kind: \"like\", negated, left, pattern: this.parseOperand(), implicitWildcards: false };\n }\n\n if (this.matchKeyword(\"between\")) {\n const from = this.parseOperand();\n this.expectKeyword(\"and\");\n return { kind: \"between\", negated, operand: left, from, to: this.parseOperand() };\n }\n\n if (negated) {\n const token = this.tokens[this.index];\n throw new ExpressionError(\n token\n ? `Expected IN, LIKE or BETWEEN after NOT at position ${token.position}`\n : \"Expected IN, LIKE or BETWEEN after NOT at end of expression\"\n );\n }\n\n const operator = this.peekOperator();\n if (!operator) {\n const token = this.tokens[this.index];\n throw new ExpressionError(\n token\n ? `Expected a comparison operator at position ${token.position}`\n : \"Expected a comparison operator at end of expression\"\n );\n }\n this.index++;\n\n switch (operator) {\n case \"~\":\n case \"?~\":\n return { kind: \"like\", negated: false, left, pattern: this.parseOperand(), implicitWildcards: true };\n case \"!~\":\n return { kind: \"like\", negated: true, left, pattern: this.parseOperand(), implicitWildcards: true };\n default:\n return { kind: \"compare\", operator: normalizeOperator(operator), left, right: this.parseOperand() };\n }\n }\n\n private parseValueList(): Operand[] {\n this.expectPunct(\"(\");\n const values: Operand[] = [];\n if (this.peekPunct(\")\")) {\n this.index++;\n return values;\n }\n values.push(this.parseOperand());\n while (this.peekPunct(\",\")) {\n this.index++;\n values.push(this.parseOperand());\n }\n this.expectPunct(\")\");\n return values;\n }\n\n parseOperand(): Operand {\n const token = this.tokens[this.index];\n if (!token) {\n throw new ExpressionError(\"Unexpected end of expression\");\n }\n this.index++;\n\n switch (token.type) {\n case \"string\":\n return { kind: \"value\", value: token.value };\n case \"number\":\n return { kind: \"value\", value: Number(token.value) };\n case \"param\":\n return { kind: \"param\", name: token.value };\n case \"identifier\": {\n const lowered = token.value.toLowerCase();\n if (lowered === \"true\" || lowered === \"false\") {\n return { kind: \"value\", value: lowered === \"true\" };\n }\n if (lowered === \"null\") {\n return { kind: \"value\", value: null };\n }\n return { kind: \"field\", name: token.value };\n }\n default:\n throw new ExpressionError(`Unexpected ${JSON.stringify(token.value)} at position ${token.position}`);\n }\n }\n\n private peekOperator(): string | null {\n const token = this.tokens[this.index];\n return token?.type === \"operator\" ? token.value : null;\n }\n\n private matchOperator(value: string): boolean {\n if (this.peekOperator() === value) {\n this.index++;\n return true;\n }\n return false;\n }\n\n private matchKeyword(keyword: string): boolean {\n const token = this.tokens[this.index];\n if (token?.type === \"identifier\" && token.value.toLowerCase() === keyword && KEYWORDS.has(keyword)) {\n this.index++;\n return true;\n }\n return false;\n }\n\n private expectKeyword(keyword: string): void {\n if (!this.matchKeyword(keyword)) {\n const token = this.tokens[this.index];\n throw new ExpressionError(\n `Expected ${keyword.toUpperCase()}${token ? ` at position ${token.position}` : \" at end of expression\"}`\n );\n }\n }\n\n private peekPunct(value: string): boolean {\n const token = this.tokens[this.index];\n return token?.type === \"punct\" && token.value === value;\n }\n\n private expectPunct(value: string): void {\n if (!this.peekPunct(value)) {\n const token = this.tokens[this.index];\n throw new ExpressionError(\n `Expected ${JSON.stringify(value)}${token ? ` at position ${token.position}` : \" at end of expression\"}`\n );\n }\n this.index++;\n }\n}\n\nfunction normalizeOperator(operator: string): CompareOperator {\n switch (operator) {\n case \"==\":\n case \"=\":\n case \"?=\":\n return \"=\";\n case \"!=\":\n case \"<>\":\n case \"?!=\":\n return \"!=\";\n default:\n return operator as CompareOperator;\n }\n}\n\n/** Parses a filter or SQL condition into an evaluable tree */\nexport function parseCondition(source: string): Condition {\n return new Parser(tokenize(source)).parse();\n}\n\n/** Parses a standalone value (a SET assignment or a VALUES entry) */\nexport function parseValueOperand(source: string): Operand {\n const tokens = tokenize(source);\n if (tokens.length === 0) {\n throw new ExpressionError(\"Expected a value\");\n }\n return new Parser(tokens).parseOperand();\n}\n\n// ---------------------------------------------------------------------------\n// Evaluation\n// ---------------------------------------------------------------------------\n\nexport function evaluateCondition(condition: Condition, context: EvaluationContext): boolean {\n switch (condition.kind) {\n case \"literal\":\n return condition.value;\n case \"and\":\n return condition.operands.every((operand) => evaluateCondition(operand, context));\n case \"or\":\n return condition.operands.some((operand) => evaluateCondition(operand, context));\n case \"not\":\n return !evaluateCondition(condition.operand, context);\n case \"null\": {\n const value = resolveOperand(condition.operand, context);\n const isNull = value === null || value === undefined;\n return condition.negated ? !isNull : isNull;\n }\n case \"in\": {\n const value = resolveOperand(condition.left, context);\n const matches = condition.values.some((candidate) => looseEquals(value, resolveOperand(candidate, context)));\n return condition.negated ? !matches : matches;\n }\n case \"like\": {\n const value = resolveOperand(condition.left, context);\n const pattern = resolveOperand(condition.pattern, context);\n const matches = matchesLike(value, pattern, condition.implicitWildcards);\n return condition.negated ? !matches : matches;\n }\n case \"between\": {\n const value = resolveOperand(condition.operand, context);\n const from = resolveOperand(condition.from, context);\n const to = resolveOperand(condition.to, context);\n const inRange = compareValues(value, from) >= 0 && compareValues(value, to) <= 0;\n return condition.negated ? !inRange : inRange;\n }\n case \"compare\": {\n const left = resolveOperand(condition.left, context);\n const right = resolveOperand(condition.right, context);\n switch (condition.operator) {\n case \"=\":\n return looseEquals(left, right);\n case \"!=\":\n return !looseEquals(left, right);\n case \">\":\n return compareValues(left, right) > 0;\n case \">=\":\n return compareValues(left, right) >= 0;\n case \"<\":\n return compareValues(left, right) < 0;\n case \"<=\":\n return compareValues(left, right) <= 0;\n }\n }\n }\n}\n\nexport function resolveOperand(operand: Operand, context: EvaluationContext): unknown {\n switch (operand.kind) {\n case \"value\":\n return operand.value;\n case \"field\":\n return context.field(operand.name);\n case \"param\": {\n const params = context.params ?? {};\n if (!(operand.name in params)) {\n throw new ExpressionError(`Missing bound parameter {:${operand.name}}`);\n }\n return params[operand.name];\n }\n }\n}\n\n/** Every field a condition reads, for callers that need to validate up front */\nexport function conditionFields(condition: Condition): string[] {\n const names = new Set<string>();\n const visitOperand = (operand: Operand) => {\n if (operand.kind === \"field\") {\n names.add(operand.name);\n }\n };\n\n const visit = (node: Condition) => {\n switch (node.kind) {\n case \"and\":\n case \"or\":\n node.operands.forEach(visit);\n break;\n case \"not\":\n visit(node.operand);\n break;\n case \"compare\":\n visitOperand(node.left);\n visitOperand(node.right);\n break;\n case \"in\":\n visitOperand(node.left);\n node.values.forEach(visitOperand);\n break;\n case \"like\":\n visitOperand(node.left);\n visitOperand(node.pattern);\n break;\n case \"between\":\n visitOperand(node.operand);\n visitOperand(node.from);\n visitOperand(node.to);\n break;\n case \"null\":\n visitOperand(node.operand);\n break;\n case \"literal\":\n break;\n }\n };\n\n visit(condition);\n return [...names];\n}\n\n/**\n * SQLite comparison semantics, narrowed to what migrations rely on: numbers\n * compare numerically even when one side arrived as a string, everything else\n * compares as text.\n */\nexport function looseEquals(left: unknown, right: unknown): boolean {\n if (left === null || left === undefined) {\n return right === null || right === undefined;\n }\n if (right === null || right === undefined) {\n return false;\n }\n if (typeof left === \"boolean\" || typeof right === \"boolean\") {\n return toBoolean(left) === toBoolean(right);\n }\n if (typeof left === \"number\" || typeof right === \"number\") {\n const leftNumber = Number(left);\n const rightNumber = Number(right);\n if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber)) {\n return leftNumber === rightNumber;\n }\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n return JSON.stringify(left) === JSON.stringify(right);\n }\n return String(left) === String(right);\n}\n\nexport function compareValues(left: unknown, right: unknown): number {\n if (left === null || left === undefined) {\n return right === null || right === undefined ? 0 : -1;\n }\n if (right === null || right === undefined) {\n return 1;\n }\n const leftNumber = Number(left);\n const rightNumber = Number(right);\n if (Number.isFinite(leftNumber) && Number.isFinite(rightNumber) && left !== \"\" && right !== \"\") {\n return leftNumber === rightNumber ? 0 : leftNumber < rightNumber ? -1 : 1;\n }\n const leftText = String(left);\n const rightText = String(right);\n return leftText === rightText ? 0 : leftText < rightText ? -1 : 1;\n}\n\n/**\n * Ordering used by every sort surface (`sort: \"-views\"` and SQL `ORDER BY`),\n * so the two agree on the same rows: equality is the filter's `=`, and the\n * ordering below it is SQLite-ish — numeric when both sides are numbers.\n */\nexport function compareForSort(left: unknown, right: unknown): number {\n if (looseEquals(left, right)) {\n return 0;\n }\n return compareValues(left, right) < 0 ? -1 : 1;\n}\n\nfunction toBoolean(value: unknown): boolean {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value !== 0;\n }\n if (typeof value === \"string\") {\n return value !== \"\" && value !== \"0\" && value.toLowerCase() !== \"false\";\n }\n return Boolean(value);\n}\n\n/**\n * SQL LIKE. `implicitWildcards` is PocketBase's `~`, which wraps the term in\n * `%` unless the term already contains a wildcard.\n */\nfunction matchesLike(value: unknown, pattern: unknown, implicitWildcards: boolean): boolean {\n if (value === null || value === undefined || pattern === null || pattern === undefined) {\n return false;\n }\n\n let text = String(pattern);\n if (implicitWildcards && !text.includes(\"%\") && !text.includes(\"_\")) {\n text = `%${text}%`;\n }\n\n const regex = new RegExp(`^${likeToRegexSource(text)}$`, \"is\");\n return regex.test(String(value));\n}\n\nfunction likeToRegexSource(pattern: string): string {\n let source = \"\";\n for (let index = 0; index < pattern.length; index++) {\n const char = pattern[index];\n if (char === \"\\\\\" && index + 1 < pattern.length) {\n source += escapeRegex(pattern[++index]);\n continue;\n }\n if (char === \"%\") {\n source += \"[\\\\s\\\\S]*\";\n continue;\n }\n if (char === \"_\") {\n source += \"[\\\\s\\\\S]\";\n continue;\n }\n source += escapeRegex(char);\n }\n return source;\n}\n\nfunction escapeRegex(char: string): string {\n return char.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n","/**\n * `$dbx` and `app.db()` simulation\n *\n * PocketBase exposes two query surfaces to a migration: `$dbx` expression\n * builders passed to the record finders, and `app.db().newQuery(sql)` for raw\n * SQL. Both are simulated against the in-memory record store (`records.ts`).\n *\n * The SQL support is a deliberate subset — SELECT / INSERT / UPDATE / DELETE\n * against a single collection table, with the condition grammar from\n * `expression.ts`. Anything beyond it raises `UnsupportedQueryError`, which\n * the caller turns into a warning (lenient) or a throw (strict): reporting\n * \"this query is not simulated\" is useful, quietly matching the wrong rows is\n * not.\n */\n\nimport {\n ExpressionError,\n compareForSort,\n evaluateCondition,\n parseCondition,\n parseValueOperand,\n resolveOperand,\n type Condition,\n type Operand,\n} from \"./expression\";\nimport type { RecordModel } from \"./records\";\n\nexport class UnsupportedQueryError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"UnsupportedQueryError\";\n Object.setPrototypeOf(this, UnsupportedQueryError.prototype);\n }\n}\n\n/** Marks the objects `$dbx.*` returns so the finders can recognize them */\nconst DBX_EXPRESSION = Symbol.for(\"pocketbase-zod-schema.dbxExpression\");\n\nexport interface DbxExpression {\n [DBX_EXPRESSION]: true;\n /** The SQL fragment, as `$dbx` would build it (for messages and debugging) */\n build(): string;\n matches(record: RecordModel): boolean;\n}\n\nexport function isDbxExpression(value: unknown): value is DbxExpression {\n return typeof value === \"object\" && value !== null && (value as Record<symbol, unknown>)[DBX_EXPRESSION] === true;\n}\n\nfunction expression(sql: string, matches: (record: RecordModel) => boolean): DbxExpression {\n return { [DBX_EXPRESSION]: true, build: () => sql, matches };\n}\n\n/** Evaluates a parsed condition against one record */\nexport function matchCondition(condition: Condition, record: RecordModel, params?: Record<string, unknown>): boolean {\n return evaluateCondition(condition, { field: (name) => readField(record, name), params });\n}\n\n/**\n * Column references may be qualified (`posts.status`) or quoted; the record\n * only knows the bare name.\n */\nexport function readField(record: RecordModel, name: string): unknown {\n const bare = name.includes(\".\") ? name.slice(name.lastIndexOf(\".\") + 1) : name;\n return record.get(bare);\n}\n\nfunction quoteLiteral(value: unknown): string {\n if (value === null || value === undefined) {\n return \"NULL\";\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n return `'${String(value).replace(/'/g, \"''\")}'`;\n}\n\n// ---------------------------------------------------------------------------\n// $dbx\n// ---------------------------------------------------------------------------\n\nexport function createDbx(): Record<string, unknown> {\n const exp = (raw: string, params: Record<string, unknown> = {}): DbxExpression => {\n const condition = parseCondition(raw);\n return expression(raw, (record) => matchCondition(condition, record, params));\n };\n\n const hashExp = (pairs: Record<string, unknown>): DbxExpression => {\n const entries = Object.entries(pairs ?? {});\n const sql = entries.map(([key, value]) => `${key}=${quoteLiteral(value)}`).join(\" AND \") || \"1=1\";\n return expression(sql, (record) => entries.every(([key, value]) => looseMatch(readField(record, key), value)));\n };\n\n const combine = (keyword: \"AND\" | \"OR\", operands: unknown[]): DbxExpression => {\n const expressions = operands.filter(isDbxExpression);\n const sql = expressions.map((operand) => `(${operand.build()})`).join(` ${keyword} `) || \"1=1\";\n return expression(sql, (record) =>\n keyword === \"AND\"\n ? expressions.every((operand) => operand.matches(record))\n : expressions.some((operand) => operand.matches(record))\n );\n };\n\n const inList = (column: string, values: unknown[], negated: boolean): DbxExpression => {\n const flat = values.flat();\n const sql = `${column} ${negated ? \"NOT IN\" : \"IN\"} (${flat.map(quoteLiteral).join(\", \")})`;\n return expression(sql, (record) => {\n const matched = flat.some((value) => looseMatch(readField(record, column), value));\n return negated ? !matched : matched;\n });\n };\n\n const like = (column: string, values: unknown[], negated: boolean, anyOf: boolean): DbxExpression => {\n const terms = values.flat().map((value) => String(value));\n const keyword = negated ? \"NOT LIKE\" : \"LIKE\";\n const sql = terms.map((term) => `${column} ${keyword} '%${term}%'`).join(anyOf ? \" OR \" : \" AND \") || \"1=1\";\n return expression(sql, (record) => {\n const text = String(readField(record, column) ?? \"\").toLowerCase();\n const test = (term: string) => text.includes(term.toLowerCase());\n const matched = anyOf ? terms.some(test) : terms.every(test);\n return negated ? !matched : matched;\n });\n };\n\n return {\n exp,\n hashExp,\n and: (...operands: unknown[]) => combine(\"AND\", operands),\n or: (...operands: unknown[]) => combine(\"OR\", operands),\n not: (operand: unknown) => {\n const inner = isDbxExpression(operand) ? operand : null;\n return expression(inner ? `NOT (${inner.build()})` : \"1=0\", (record) => !inner || !inner.matches(record));\n },\n in: (column: string, ...values: unknown[]) => inList(column, values, false),\n notIn: (column: string, ...values: unknown[]) => inList(column, values, true),\n like: (column: string, ...values: unknown[]) => like(column, values, false, false),\n notLike: (column: string, ...values: unknown[]) => like(column, values, true, false),\n orLike: (column: string, ...values: unknown[]) => like(column, values, false, true),\n between: (column: string, from: unknown, to: unknown) =>\n expression(`${column} BETWEEN ${quoteLiteral(from)} AND ${quoteLiteral(to)}`, (record) => {\n const value = readField(record, column);\n return compare(value, from) >= 0 && compare(value, to) <= 0;\n }),\n notBetween: (column: string, from: unknown, to: unknown) =>\n expression(`${column} NOT BETWEEN ${quoteLiteral(from)} AND ${quoteLiteral(to)}`, (record) => {\n const value = readField(record, column);\n return !(compare(value, from) >= 0 && compare(value, to) <= 0);\n }),\n };\n}\n\nfunction looseMatch(left: unknown, right: unknown): boolean {\n return evaluateCondition(\n { kind: \"compare\", operator: \"=\", left: { kind: \"value\", value: left }, right: { kind: \"value\", value: right } },\n { field: () => undefined }\n );\n}\n\nconst compare = compareForSort;\n\n// ---------------------------------------------------------------------------\n// SQL subset\n// ---------------------------------------------------------------------------\n\nexport type ParsedStatement =\n | {\n kind: \"select\";\n table: string;\n columns: string[];\n where?: Condition;\n order?: OrderTerm[];\n limit?: number;\n offset?: number;\n }\n | { kind: \"update\"; table: string; assignments: { column: string; value: Operand }[]; where?: Condition }\n | { kind: \"delete\"; table: string; where?: Condition }\n | { kind: \"insert\"; table: string; columns: string[]; values: Operand[] };\n\nexport interface OrderTerm {\n column: string;\n descending: boolean;\n}\n\nconst SELECT_PATTERN = /^SELECT\\s+(?<columns>[\\s\\S]+?)\\s+FROM\\s+(?<table>[`\"[\\]\\w.]+)(?<rest>[\\s\\S]*)$/i;\nconst UPDATE_PATTERN = /^UPDATE\\s+(?<table>[`\"[\\]\\w.]+)\\s+SET\\s+(?<rest>[\\s\\S]+)$/i;\nconst DELETE_PATTERN = /^DELETE\\s+FROM\\s+(?<table>[`\"[\\]\\w.]+)(?<rest>[\\s\\S]*)$/i;\nconst INSERT_PATTERN =\n /^INSERT\\s+INTO\\s+(?<table>[`\"[\\]\\w.]+)\\s*\\((?<columns>[^)]*)\\)\\s*VALUES\\s*\\((?<values>[\\s\\S]*)\\)\\s*$/i;\n\n/**\n * Parses one statement of the supported subset.\n *\n * @throws UnsupportedQueryError for anything outside it\n */\nexport function parseStatement(sql: string): ParsedStatement {\n const trimmed = sql.trim().replace(/;\\s*$/, \"\");\n\n const insert = INSERT_PATTERN.exec(trimmed);\n if (insert?.groups) {\n const columns = splitTopLevel(insert.groups.columns).map(unquoteIdentifier);\n const values = splitTopLevel(insert.groups.values).map((value) => parseOperandOrThrow(value, trimmed));\n if (columns.length !== values.length) {\n throw new UnsupportedQueryError(`INSERT column/value count mismatch: ${trimmed}`);\n }\n return { kind: \"insert\", table: unquoteIdentifier(insert.groups.table), columns, values };\n }\n\n const update = UPDATE_PATTERN.exec(trimmed);\n if (update?.groups) {\n const { clause, where } = splitWhere(update.groups.rest, trimmed);\n const assignments = splitTopLevel(clause).map((assignment) => {\n const separator = assignment.indexOf(\"=\");\n if (separator === -1) {\n throw new UnsupportedQueryError(`Unsupported SET assignment ${JSON.stringify(assignment)} in: ${trimmed}`);\n }\n return {\n column: unquoteIdentifier(assignment.slice(0, separator)),\n value: parseOperandOrThrow(assignment.slice(separator + 1), trimmed),\n };\n });\n return { kind: \"update\", table: unquoteIdentifier(update.groups.table), assignments, where };\n }\n\n const remove = DELETE_PATTERN.exec(trimmed);\n if (remove?.groups) {\n const { clause, where } = splitWhere(remove.groups.rest, trimmed);\n if (clause.trim() !== \"\") {\n throw new UnsupportedQueryError(`Unsupported DELETE clause ${JSON.stringify(clause.trim())} in: ${trimmed}`);\n }\n return { kind: \"delete\", table: unquoteIdentifier(remove.groups.table), where };\n }\n\n const select = SELECT_PATTERN.exec(trimmed);\n if (select?.groups) {\n const { clause, where, order, limit, offset } = splitSelectTail(select.groups.rest, trimmed);\n if (clause.trim() !== \"\") {\n throw new UnsupportedQueryError(`Unsupported SELECT clause ${JSON.stringify(clause.trim())} in: ${trimmed}`);\n }\n return {\n kind: \"select\",\n table: unquoteIdentifier(select.groups.table),\n columns: splitTopLevel(select.groups.columns).map((column) => unquoteIdentifier(stripAlias(column))),\n where,\n order,\n limit,\n offset,\n };\n }\n\n throw new UnsupportedQueryError(`Only single-table SELECT/INSERT/UPDATE/DELETE are simulated. Got: ${trimmed}`);\n}\n\n/** Runs a parsed statement over a collection's rows */\nexport interface StatementTarget {\n /** Records of the statement's table, in insertion order */\n rows: () => RecordModel[];\n insert: (values: Record<string, unknown>) => RecordModel;\n remove: (record: RecordModel) => void;\n persist: (record: RecordModel) => void;\n}\n\nexport interface StatementResult {\n /** Rows a SELECT produced, as plain objects */\n rows: Record<string, unknown>[];\n /** Rows an INSERT/UPDATE/DELETE touched */\n affected: number;\n}\n\nexport function executeStatement(\n statement: ParsedStatement,\n target: StatementTarget,\n params: Record<string, unknown>\n): StatementResult {\n const matching = (where?: Condition) =>\n target.rows().filter((record) => (where ? matchCondition(where, record, params) : true));\n\n switch (statement.kind) {\n case \"select\": {\n let rows = matching(statement.where);\n const order = statement.order;\n if (order?.length) {\n rows = [...rows].sort((a, b) => {\n for (const term of order) {\n const result = compare(readField(a, term.column), readField(b, term.column));\n if (result !== 0) {\n return term.descending ? -result : result;\n }\n }\n return 0;\n });\n }\n if (statement.offset !== undefined) {\n rows = rows.slice(statement.offset);\n }\n if (statement.limit !== undefined) {\n rows = rows.slice(0, statement.limit);\n }\n\n const selectAll = statement.columns.length === 0 || statement.columns.includes(\"*\");\n return {\n rows: rows.map((record) => {\n if (selectAll) {\n return record.export();\n }\n const projected: Record<string, unknown> = {};\n for (const column of statement.columns) {\n projected[column] = readField(record, column);\n }\n return projected;\n }),\n affected: 0,\n };\n }\n\n case \"update\": {\n const rows = matching(statement.where);\n for (const record of rows) {\n for (const assignment of statement.assignments) {\n record.set(\n assignment.column,\n resolveOperand(assignment.value, { field: (name) => readField(record, name), params })\n );\n }\n target.persist(record);\n }\n return { rows: [], affected: rows.length };\n }\n\n case \"delete\": {\n const rows = matching(statement.where);\n for (const record of rows) {\n target.remove(record);\n }\n return { rows: [], affected: rows.length };\n }\n\n case \"insert\": {\n const values: Record<string, unknown> = {};\n statement.columns.forEach((column, index) => {\n values[column] = resolveOperand(statement.values[index], { field: () => undefined, params });\n });\n target.insert(values);\n return { rows: [], affected: 1 };\n }\n }\n}\n\nfunction parseOperandOrThrow(source: string, sql: string): Operand {\n try {\n return parseValueOperand(source);\n } catch (error) {\n if (error instanceof ExpressionError) {\n throw new UnsupportedQueryError(`Unsupported value ${JSON.stringify(source.trim())} in: ${sql}`);\n }\n throw error;\n }\n}\n\nfunction parseConditionOrThrow(source: string, sql: string): Condition {\n try {\n return parseCondition(source);\n } catch (error) {\n if (error instanceof ExpressionError) {\n throw new UnsupportedQueryError(`Unsupported WHERE clause in ${sql}: ${error.message}`);\n }\n throw error;\n }\n}\n\nfunction splitWhere(rest: string, sql: string): { clause: string; where?: Condition } {\n const index = indexOfKeyword(rest, \"WHERE\");\n if (index === -1) {\n return { clause: rest };\n }\n return {\n clause: rest.slice(0, index),\n where: parseConditionOrThrow(rest.slice(index + \"WHERE\".length), sql),\n };\n}\n\nfunction splitSelectTail(\n rest: string,\n sql: string\n): { clause: string; where?: Condition; order?: OrderTerm[]; limit?: number; offset?: number } {\n let remainder = rest;\n let offset: number | undefined;\n let limit: number | undefined;\n let order: OrderTerm[] | undefined;\n\n const offsetIndex = indexOfKeyword(remainder, \"OFFSET\");\n if (offsetIndex !== -1) {\n offset = parseCount(remainder.slice(offsetIndex + \"OFFSET\".length), sql);\n remainder = remainder.slice(0, offsetIndex);\n }\n\n const limitIndex = indexOfKeyword(remainder, \"LIMIT\");\n if (limitIndex !== -1) {\n limit = parseCount(remainder.slice(limitIndex + \"LIMIT\".length), sql);\n remainder = remainder.slice(0, limitIndex);\n }\n\n const orderIndex = indexOfKeyword(remainder, \"ORDER BY\");\n if (orderIndex !== -1) {\n order = splitTopLevel(remainder.slice(orderIndex + \"ORDER BY\".length)).map((term) => {\n const parts = term.trim().split(/\\s+/);\n return {\n column: unquoteIdentifier(parts[0]),\n descending: (parts[1] ?? \"\").toUpperCase() === \"DESC\",\n };\n });\n remainder = remainder.slice(0, orderIndex);\n }\n\n const { clause, where } = splitWhere(remainder, sql);\n return { clause, where, order, limit, offset };\n}\n\nfunction parseCount(source: string, sql: string): number {\n const value = Number(source.trim());\n if (!Number.isInteger(value) || value < 0) {\n throw new UnsupportedQueryError(`Unsupported LIMIT/OFFSET ${JSON.stringify(source.trim())} in: ${sql}`);\n }\n return value;\n}\n\n/** Finds a keyword outside of quotes and parentheses */\nfunction indexOfKeyword(source: string, keyword: string): number {\n const upper = source.toUpperCase();\n const target = keyword.toUpperCase();\n let depth = 0;\n let quote: string | null = null;\n\n for (let index = 0; index < source.length; index++) {\n const char = source[index];\n if (quote) {\n if (char === \"\\\\\") {\n index++;\n } else if (char === quote) {\n quote = null;\n }\n continue;\n }\n if (char === \"'\" || char === '\"' || char === \"`\") {\n quote = char;\n continue;\n }\n if (char === \"(\") {\n depth++;\n continue;\n }\n if (char === \")\") {\n depth--;\n continue;\n }\n if (depth !== 0) {\n continue;\n }\n if (upper.startsWith(target, index) && isBoundary(source, index - 1) && isBoundary(source, index + target.length)) {\n return index;\n }\n }\n\n return -1;\n}\n\nfunction isBoundary(source: string, index: number): boolean {\n if (index < 0 || index >= source.length) {\n return true;\n }\n return !/[A-Za-z0-9_]/.test(source[index]);\n}\n\n/** Splits on commas that are not inside quotes or parentheses */\nfunction splitTopLevel(source: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n let depth = 0;\n let quote: string | null = null;\n\n for (let index = 0; index < source.length; index++) {\n const char = source[index];\n if (quote) {\n current += char;\n if (char === \"\\\\\" && index + 1 < source.length) {\n current += source[++index];\n } else if (char === quote) {\n quote = null;\n }\n continue;\n }\n if (char === \"'\" || char === '\"' || char === \"`\") {\n quote = char;\n current += char;\n continue;\n }\n if (char === \"(\") {\n depth++;\n } else if (char === \")\") {\n depth--;\n }\n if (char === \",\" && depth === 0) {\n parts.push(current);\n current = \"\";\n continue;\n }\n current += char;\n }\n\n if (current.trim() !== \"\") {\n parts.push(current);\n }\n return parts.map((part) => part.trim()).filter((part) => part !== \"\");\n}\n\nfunction stripAlias(column: string): string {\n return column.replace(/\\s+AS\\s+[\\s\\S]+$/i, \"\").trim();\n}\n\nfunction unquoteIdentifier(identifier: string): string {\n const trimmed = identifier.trim();\n const unquoted = trimmed.replace(/^[`\"[]/, \"\").replace(/[`\"\\]]$/, \"\");\n // Qualified names (`posts.status`) reduce to the column\n return unquoted.includes(\".\") ? unquoted.slice(unquoted.lastIndexOf(\".\") + 1) : unquoted;\n}\n","/**\n * Record simulation — an in-memory row store per collection\n *\n * Schema reconstruction never needs this: a migration that seeds or rewrites\n * data does not change the shape of a collection. It matters for the other\n * job the engine can do — running a hand-written data migration before it\n * touches production and seeing what it actually does.\n *\n * Enabled with `records: \"simulate\"`. Left off, `Record` and the data-layer\n * `app.*` methods stay the inert stubs they have always been, so schema-only\n * replay is unchanged.\n *\n * The store lives on `CollectionStore`, which means it inherits the runner's\n * transaction semantics for free: a migration that throws halfway through a\n * data rewrite leaves neither schema nor records behind.\n */\n\nimport type { Collection } from \"./collection\";\n\n/**\n * Fields PocketBase manages itself. `id` is generated on save; `created` and\n * `updated` are autodate columns the server stamps.\n */\nconst SYSTEM_RECORD_FIELDS = [\"id\", \"created\", \"updated\"];\n\n/** PocketBase record ids are 15 lowercase alphanumeric characters */\nexport function generateRecordId(): string {\n const alphabet = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let id = \"\";\n for (let index = 0; index < 15; index++) {\n id += alphabet[Math.floor(Math.random() * alphabet.length)];\n }\n return id;\n}\n\n/**\n * The `Record` global a migration sees. Mirrors `core.Record`'s JSVM surface:\n * `get`/`set` plus the typed getters, `load`, `publicExport`, `originalCopy`.\n *\n * Arbitrary property access (`record.title`) is deliberately *not* supported —\n * `core.Record` is a Go struct and does not support it either, so a migration\n * that relies on it would fail in PocketBase.\n */\nexport class RecordModel {\n private data: Record<string, unknown> = {};\n private original: Record<string, unknown> = {};\n private readonly owner: Collection;\n /** Set by setPassword(); PocketBase stores a hash, the simulation the value */\n private password?: string;\n\n constructor(collection: Collection, data: Record<string, unknown> = {}) {\n if (!collection || typeof collection !== \"object\" || typeof (collection as Collection).name !== \"string\") {\n throw new Error(\"[engine] new Record() expects a collection\");\n }\n this.owner = collection;\n this.load(data);\n this.original = { ...this.data };\n }\n\n get id(): string {\n return typeof this.data.id === \"string\" ? this.data.id : \"\";\n }\n\n set id(value: string) {\n this.data.id = value;\n }\n\n collection(): Collection {\n return this.owner;\n }\n\n /** PocketBase names a collection's table after the collection */\n tableName(): string {\n return this.owner.name;\n }\n\n get(key: string): unknown {\n return this.data[key];\n }\n\n set(key: string, value: unknown): void {\n this.data[key] = value;\n }\n\n getString(key: string): string {\n const value = this.get(key);\n if (value === null || value === undefined) {\n return \"\";\n }\n return typeof value === \"string\" ? value : String(value);\n }\n\n getBool(key: string): boolean {\n const value = this.get(key);\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value !== 0;\n }\n if (typeof value === \"string\") {\n return value !== \"\" && value !== \"0\" && value.toLowerCase() !== \"false\";\n }\n return Boolean(value);\n }\n\n getInt(key: string): number {\n const value = Number(this.get(key));\n return Number.isFinite(value) ? Math.trunc(value) : 0;\n }\n\n getFloat(key: string): number {\n const value = Number(this.get(key));\n return Number.isFinite(value) ? value : 0;\n }\n\n getDateTime(key: string): string {\n return this.getString(key);\n }\n\n getStringSlice(key: string): string[] {\n const value = this.get(key);\n if (Array.isArray(value)) {\n return value.map((entry) => (typeof entry === \"string\" ? entry : String(entry)));\n }\n if (typeof value === \"string\" && value !== \"\") {\n return [value];\n }\n return [];\n }\n\n /** Bulk assignment, as `record.load({...})` does in the JSVM */\n load(data: Record<string, unknown>): void {\n if (!data || typeof data !== \"object\") {\n return;\n }\n for (const [key, value] of Object.entries(data)) {\n this.data[key] = value;\n }\n }\n\n setPassword(password: string): void {\n this.password = password;\n this.data.password = password;\n }\n\n validatePassword(password: string): boolean {\n return this.password !== undefined && this.password === password;\n }\n\n /** The record as it was last read from (or written to) the store */\n originalCopy(): RecordModel {\n return new RecordModel(this.owner, { ...this.original });\n }\n\n /**\n * Deep, independent copy. `owner` rebinds the copy to another Collection\n * instance (what a transaction clone needs); everything the getters cannot\n * reach — the pre-modification `original` and the password `setPassword()`\n * stored — is carried over, so a copy behaves like the record it came from.\n */\n clone(owner: Collection = this.owner): RecordModel {\n const copy = new RecordModel(owner, structuredClone(this.data));\n copy.original = structuredClone(this.original);\n copy.password = this.password;\n return copy;\n }\n\n /** Plain object, the shape `publicExport()` returns in the JSVM */\n publicExport(): Record<string, unknown> {\n return { ...this.data };\n }\n\n /** Every stored value, including system columns */\n export(): Record<string, unknown> {\n return { ...this.data };\n }\n\n /** Called by the store once a save has committed */\n markPersisted(): void {\n this.original = { ...this.data };\n }\n\n /** Fields the record carries that the collection does not declare */\n undeclaredFields(): string[] {\n const declared = new Set<string>(SYSTEM_RECORD_FIELDS);\n for (const field of this.owner.fields) {\n if (typeof field.name === \"string\") {\n declared.add(field.name);\n }\n }\n return Object.keys(this.data).filter((key) => !declared.has(key));\n }\n}\n\n/**\n * Rows, keyed by collection id then record id. Insertion order is preserved\n * so unsorted queries come back the way they went in.\n */\nexport class RecordStore {\n private byCollection = new Map<string, Map<string, RecordModel>>();\n\n save(record: RecordModel): RecordModel {\n if (record.id === \"\") {\n record.id = generateRecordId();\n }\n const collection = record.collection();\n const rows = this.rowsFor(collection.id);\n rows.set(record.id, record);\n record.markPersisted();\n return record;\n }\n\n delete(record: RecordModel): boolean {\n return this.rowsFor(record.collection().id).delete(record.id);\n }\n\n deleteById(collectionId: string, recordId: string): boolean {\n return this.rowsFor(collectionId).delete(recordId);\n }\n\n getById(collectionId: string, recordId: string): RecordModel | undefined {\n return this.rowsFor(collectionId).get(recordId);\n }\n\n list(collectionId: string): RecordModel[] {\n return [...this.rowsFor(collectionId).values()];\n }\n\n count(collectionId: string): number {\n return this.rowsFor(collectionId).size;\n }\n\n /** Drops every row of a collection (what deleting the collection does) */\n dropCollection(collectionId: string): void {\n this.byCollection.delete(collectionId);\n }\n\n /** Every collection id that currently holds at least one record */\n collectionIds(): string[] {\n return [...this.byCollection.keys()].filter((id) => this.byCollection.get(id)!.size > 0);\n }\n\n /**\n * Deep copy. Records are rebound to the collections in `collections` so a\n * cloned record's `collection()` points at the cloned schema, not the one\n * the transaction started from.\n */\n clone(resolveCollection: (id: string) => Collection | undefined): RecordStore {\n const copy = new RecordStore();\n for (const [collectionId, rows] of this.byCollection.entries()) {\n const collection = resolveCollection(collectionId);\n if (!collection) {\n // The collection was dropped in this transaction; its rows go with it\n continue;\n }\n const copiedRows = new Map<string, RecordModel>();\n for (const [recordId, record] of rows.entries()) {\n copiedRows.set(recordId, record.clone(collection));\n }\n copy.byCollection.set(collectionId, copiedRows);\n }\n return copy;\n }\n\n /** Commit: adopt another store's rows */\n replaceWith(other: RecordStore): void {\n this.byCollection = new Map(other.byCollection);\n }\n\n private rowsFor(collectionId: string): Map<string, RecordModel> {\n let rows = this.byCollection.get(collectionId);\n if (!rows) {\n rows = new Map();\n this.byCollection.set(collectionId, rows);\n }\n return rows;\n }\n}\n","/**\n * The data-layer half of `app` — record finders and `app.db()`\n *\n * Installed on the simulated app only when `records: \"simulate\"` is set.\n * Without it these names fall through to the inert stubs, which is what\n * schema-only replay wants: a data migration should not be able to fail a\n * `generate` run over rows nobody is tracking.\n *\n * Finder semantics follow PocketBase: \"by id\" and \"first by ...\" throw\n * `sql: no rows in result set` on a miss, list finders return an empty array.\n * A migration that guards with try/catch behaves the same here as in\n * production.\n */\n\nimport type { Collection } from \"./collection\";\nimport {\n UnsupportedQueryError,\n executeStatement,\n isDbxExpression,\n matchCondition,\n parseStatement,\n readField,\n type DbxExpression,\n type StatementResult,\n} from \"./dbx\";\nimport { compareForSort, ExpressionError, parseCondition } from \"./expression\";\nimport { RecordModel } from \"./records\";\nimport type { CollectionStore } from \"./store\";\nimport type { EngineOptions, EngineWarning } from \"./types\";\n\nexport interface WarningSink {\n (warning: EngineWarning): void;\n}\n\n/** PocketBase's error text for a lookup that matched nothing */\nexport const NO_ROWS_ERROR = \"sql: no rows in result set\";\n\nexport interface DataApi {\n /** Methods to install on the simulated app */\n methods: Record<string, (...args: any[]) => unknown>;\n /**\n * Points `runInTransaction`'s callback argument at the app these methods\n * are installed on. Called once the proxy exists.\n */\n bindApp: (app: unknown) => void;\n}\n\nexport function createDataApi(store: CollectionStore, options: EngineOptions, warn: WarningSink): DataApi {\n const strict = options.strictness === \"strict\";\n\n /**\n * Accepts what PocketBase's finders accept: a name, an id, or a Collection.\n * A Collection is re-resolved through the store so the rows come from the\n * transaction's copy rather than whatever instance the caller held on to.\n */\n const resolveCollection = (target: unknown): Collection => {\n if (typeof target === \"string\") {\n const collection = store.getByNameOrId(target);\n if (collection) {\n return collection;\n }\n throw new Error(`${NO_ROWS_ERROR} (collection \"${target}\" not found)`);\n }\n\n if (target && typeof target === \"object\") {\n const candidate = target as Collection;\n const known =\n (typeof candidate.id === \"string\" ? store.getById(candidate.id) : undefined) ??\n (typeof candidate.name === \"string\" && candidate.name !== \"\" ? store.getByNameOrId(candidate.name) : undefined);\n if (known) {\n return known;\n }\n throw new Error(`${NO_ROWS_ERROR} (collection \"${candidate.name ?? candidate.id}\" not found)`);\n }\n\n throw new Error(\"[engine] expected a collection name, id, or Collection\");\n };\n\n const rowsOf = (target: unknown): RecordModel[] => store.records.list(resolveCollection(target).id);\n\n const applyExpressions = (records: RecordModel[], expressions: unknown[]): RecordModel[] => {\n const predicates = expressions.filter(isDbxExpression) as DbxExpression[];\n const ignored = expressions.length - predicates.length;\n if (ignored > 0) {\n warn({\n kind: \"unsupported-api\",\n api: \"$dbx\",\n message: `${ignored} query expression(s) were not built by $dbx and could not be evaluated; they were ignored`,\n });\n }\n return records.filter((record) => predicates.every((predicate) => predicate.matches(record)));\n };\n\n /**\n * PocketBase's `sort` string: comma-separated field names, `-` for\n * descending. An unknown field simply compares as undefined, the way a\n * missing column sorts in SQLite. Ordering is `compareForSort` — the same\n * comparator SQL `ORDER BY` uses, so numbers sort numerically.\n */\n const applySort = (records: RecordModel[], sort: unknown): RecordModel[] => {\n if (typeof sort !== \"string\" || sort.trim() === \"\") {\n return records;\n }\n const terms = sort\n .split(\",\")\n .map((term) => term.trim())\n .filter((term) => term !== \"\")\n .map((term) => ({ field: term.replace(/^[-+]/, \"\"), descending: term.startsWith(\"-\") }));\n\n return [...records].sort((a, b) => {\n for (const term of terms) {\n const result = compareForSort(readField(a, term.field), readField(b, term.field));\n if (result !== 0) {\n return term.descending ? -result : result;\n }\n }\n return 0;\n });\n };\n\n const filterRecords = (\n target: unknown,\n filter: unknown,\n sort?: unknown,\n limit?: unknown,\n offset?: unknown,\n params?: unknown\n ): RecordModel[] => {\n let records = rowsOf(target);\n\n if (typeof filter === \"string\" && filter.trim() !== \"\") {\n try {\n const condition = parseCondition(filter);\n const bound = (params && typeof params === \"object\" ? params : {}) as Record<string, unknown>;\n records = records.filter((record) => matchCondition(condition, record, bound));\n } catch (error) {\n if (!(error instanceof ExpressionError)) {\n throw error;\n }\n reportUnsupported(`filter ${JSON.stringify(filter)}: ${error.message}`);\n return [];\n }\n }\n\n records = applySort(records, sort);\n\n const start = typeof offset === \"number\" && offset > 0 ? offset : 0;\n const count = typeof limit === \"number\" && limit > 0 ? limit : undefined;\n records = records.slice(start, count === undefined ? undefined : start + count);\n\n return records;\n };\n\n function reportUnsupported(message: string): void {\n if (strict) {\n throw new UnsupportedQueryError(`[engine] ${message}`);\n }\n warn({ kind: \"unsupported-api\", api: \"app.db\", message: `${message}; the query was skipped` });\n }\n\n /** `app.db().newQuery(sql)` */\n const createQuery = (sql: unknown) => {\n let params: Record<string, unknown> = {};\n\n const run = (): StatementResult => {\n if (typeof sql !== \"string\") {\n reportUnsupported(\"newQuery() expects a SQL string\");\n return { rows: [], affected: 0 };\n }\n try {\n const statement = parseStatement(sql);\n const collection = resolveCollection(statement.table);\n return executeStatement(\n statement,\n {\n rows: () => store.records.list(collection.id),\n insert: (values) => store.records.save(new RecordModel(collection, values)),\n remove: (record) => store.records.delete(record),\n persist: (record) => store.records.save(record),\n },\n params\n );\n } catch (error) {\n if (error instanceof UnsupportedQueryError || error instanceof ExpressionError) {\n reportUnsupported(error.message);\n return { rows: [], affected: 0 };\n }\n throw error;\n }\n };\n\n const assignTo = (target: unknown, value: unknown): unknown => {\n if (target && typeof target === \"object\" && value && typeof value === \"object\") {\n Object.assign(target as Record<string, unknown>, value as Record<string, unknown>);\n return target;\n }\n return value;\n };\n\n const query = {\n bind(values: Record<string, unknown>) {\n params = { ...params, ...(values ?? {}) };\n return query;\n },\n execute() {\n const result = run();\n return { rowsAffected: () => result.affected, lastInsertId: () => 0 };\n },\n all(target?: unknown) {\n const rows = run().rows;\n return target === undefined ? rows : assignTo(target, rows);\n },\n one(target?: unknown) {\n const rows = run().rows;\n if (rows.length === 0) {\n throw new Error(NO_ROWS_ERROR);\n }\n return target === undefined ? rows[0] : assignTo(target, rows[0]);\n },\n row(target?: unknown) {\n return query.one(target);\n },\n };\n\n return query;\n };\n\n const methods: Record<string, (...args: any[]) => unknown> = {\n findRecordById(target: unknown, id: unknown) {\n const collection = resolveCollection(target);\n const record = store.records.getById(collection.id, String(id));\n if (!record) {\n throw new Error(`${NO_ROWS_ERROR} (record \"${String(id)}\" in \"${collection.name}\")`);\n }\n return record;\n },\n\n findRecordsByIds(target: unknown, ids: unknown, ...expressions: unknown[]) {\n const collection = resolveCollection(target);\n const wanted = Array.isArray(ids) ? ids.map((id) => String(id)) : [String(ids)];\n const found = wanted\n .map((id) => store.records.getById(collection.id, id))\n .filter((record): record is RecordModel => record !== undefined);\n return applyExpressions(found, expressions);\n },\n\n findAllRecords(target: unknown, ...expressions: unknown[]) {\n return applyExpressions(rowsOf(target), expressions);\n },\n\n findFirstRecordByData(target: unknown, key: unknown, value: unknown) {\n const match = rowsOf(target).find((record) =>\n matchCondition(\n {\n kind: \"compare\",\n operator: \"=\",\n left: { kind: \"field\", name: String(key) },\n right: { kind: \"value\", value },\n },\n record\n )\n );\n if (!match) {\n throw new Error(`${NO_ROWS_ERROR} (${String(key)}=${String(value)})`);\n }\n return match;\n },\n\n findRecordsByFilter(\n target: unknown,\n filter: unknown,\n sort?: unknown,\n limit?: unknown,\n offset?: unknown,\n params?: unknown\n ) {\n return filterRecords(target, filter, sort, limit, offset, params);\n },\n\n findFirstRecordByFilter(target: unknown, filter: unknown, params?: unknown) {\n const [first] = filterRecords(target, filter, undefined, 1, 0, params);\n if (!first) {\n throw new Error(`${NO_ROWS_ERROR} (${String(filter)})`);\n }\n return first;\n },\n\n findAuthRecordByEmail(target: unknown, email: unknown) {\n return methods.findFirstRecordByData(target, \"email\", email);\n },\n\n countRecords(target: unknown, ...expressions: unknown[]) {\n return applyExpressions(rowsOf(target), expressions).length;\n },\n\n db() {\n return { newQuery: (sql: unknown) => createQuery(sql) };\n },\n\n /**\n * PocketBase hands the callback a transactional app. Everything the\n * runner executes is already inside one transaction, so the callback\n * receives the same app; a throw still rolls the whole migration back.\n */\n runInTransaction(callback: unknown) {\n if (typeof callback === \"function\") {\n return (callback as (app: unknown) => unknown)(boundApp);\n }\n return undefined;\n },\n };\n\n let boundApp: unknown;\n\n return {\n methods,\n bindApp: (app: unknown) => {\n boundApp = app;\n },\n };\n}\n","/**\n * SimulatedApp — the `app` handed to a migration's up() function\n *\n * Implements the schema-level surface of PocketBase's transactional app\n * (findCollectionByNameOrId / save / delete / importCollections). Everything\n * else — record and query APIs like findRecordById, db(), etc. — is handled\n * by a strictness-controlled Proxy: lenient mode records a warning and\n * returns an inert no-op value so schema-only replay of hand-written data\n * migrations still succeeds; strict mode throws.\n *\n * With `records: \"simulate\"` those data-layer methods are real instead\n * (see `data-api.ts`), backed by the in-memory record store.\n */\n\nimport { Collection, ensureAuthSystemFields } from \"./collection\";\nimport { createDataApi } from \"./data-api\";\nimport { generateRuntimeFieldId } from \"./fields\";\nimport { RecordModel } from \"./records\";\nimport type { CollectionStore } from \"./store\";\nimport type { EngineOptions, EngineWarning, RawCollection } from \"./types\";\n\nexport interface WarningSink {\n (warning: EngineWarning): void;\n}\n\n/** Identifies the values `createInertStub` returns, which pretend to be anything */\nconst INERT_STUB = Symbol.for(\"pocketbase-zod-schema.inertStub\");\n\nexport function isInertStub(value: unknown): boolean {\n if (value === null || (typeof value !== \"object\" && typeof value !== \"function\")) {\n return false;\n }\n return (value as Record<symbol, unknown>)[INERT_STUB] === true;\n}\n\n/**\n * A callable, chainable, inert value returned by lenient stubs so chains\n * like `app.db().newQuery(\"...\").execute()` don't crash. Every call and\n * property access returns the stub itself; primitive coercion yields\n * neutral values.\n */\nexport function createInertStub(name: string, options: EngineOptions, warn: WarningSink): any {\n // Must be a full function (not an arrow) so the Proxy construct trap can\n // service `new Record()`-style calls\n const target = function inertStubTarget() {\n return undefined;\n };\n const stub: any = new Proxy(target, {\n get(_target, prop) {\n if (prop === INERT_STUB) {\n return true;\n }\n if (prop === Symbol.toPrimitive) {\n return () => \"\";\n }\n if (prop === \"toString\") {\n return () => \"\";\n }\n if (prop === \"valueOf\") {\n return () => 0;\n }\n // Not a thenable — await/then chains must not treat this as a promise\n if (prop === \"then\") {\n return undefined;\n }\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n return createInertStub(`${name}.${prop}`, options, warn);\n },\n apply() {\n if (options.strictness === \"strict\") {\n throw new Error(`[engine] ${name}() is not supported by the migration simulation engine (strict mode)`);\n }\n warn({\n kind: \"unsupported-api\",\n api: name,\n message: `${name}() is not simulated; call was a no-op`,\n });\n return stub;\n },\n construct() {\n if (options.strictness === \"strict\") {\n throw new Error(`[engine] new ${name}() is not supported by the migration simulation engine (strict mode)`);\n }\n warn({\n kind: \"unsupported-api\",\n api: name,\n message: `new ${name}() is not simulated; result is inert`,\n });\n return stub;\n },\n });\n return stub;\n}\n\nclass SimulatedAppImpl {\n constructor(\n private store: CollectionStore,\n private options: EngineOptions,\n private warn: WarningSink\n ) {}\n\n findCollectionByNameOrId(nameOrId: string): Collection {\n const collection = this.store.getByNameOrId(nameOrId);\n if (!collection) {\n // Matches the error PocketBase surfaces for a missing collection\n throw new Error(`sql: no rows in result set (collection \"${nameOrId}\" not found)`);\n }\n return collection;\n }\n\n save(model: any): void {\n // A record only reaches here with record simulation on; without it\n // `new Record()` produced an inert stub, handled below\n if (model instanceof RecordModel) {\n this.store.records.save(model);\n return;\n }\n if (this.skipInertModel(model, \"save\")) {\n return;\n }\n\n const collection = this.toCollection(model);\n if (!collection.name) {\n throw new Error(\"[engine] cannot save a collection without a name\");\n }\n // PocketBase restores missing auth system fields as part of the save\n ensureAuthSystemFields(collection);\n for (const field of collection.fields) {\n if (typeof field.id !== \"string\" || field.id === \"\") {\n field.id = generateRuntimeFieldId(typeof field.type === \"string\" ? field.type : \"\");\n }\n }\n this.store.upsert(collection);\n }\n\n delete(model: any): void {\n if (model instanceof RecordModel) {\n this.store.records.delete(model);\n return;\n }\n if (this.skipInertModel(model, \"delete\")) {\n return;\n }\n if (model instanceof Collection) {\n this.store.removeById(model.id);\n return;\n }\n if (typeof model === \"string\") {\n const collection = this.store.getByNameOrId(model);\n if (collection) {\n this.store.removeById(collection.id);\n }\n return;\n }\n if (model && typeof model.id === \"string\") {\n this.store.removeById(model.id);\n }\n }\n\n /**\n * `app.save(record)` in a data migration hands us whatever `new Record()`\n * produced. Without record simulation that is an inert stub, and treating\n * it as a collection would fail the whole replay over rows nobody is\n * tracking — so the call is reported and skipped, like every other\n * unsimulated data operation.\n */\n private skipInertModel(model: unknown, operation: string): boolean {\n if (!isInertStub(model)) {\n return false;\n }\n if (this.options.strictness === \"strict\") {\n throw new Error(`[engine] app.${operation}() received an unsimulated model (strict mode)`);\n }\n this.warn({\n kind: \"unsupported-api\",\n api: `app.${operation}`,\n message:\n `app.${operation}() was called with an unsimulated model; the call was a no-op. ` +\n `Set records: \"simulate\" to execute record operations.`,\n });\n return true;\n }\n\n /**\n * What native snapshot migrations call:\n * `return app.importCollections(snapshot, deleteMissing)`\n */\n importCollections(rawCollections: RawCollection[], deleteMissing = false): void {\n if (!Array.isArray(rawCollections)) {\n throw new Error(\"[engine] importCollections expects an array of collections\");\n }\n const imported = new Set<string>();\n for (const raw of rawCollections) {\n const collection = this.toCollection(raw);\n ensureAuthSystemFields(collection);\n this.store.upsert(collection);\n imported.add(collection.id);\n }\n if (deleteMissing) {\n for (const existing of this.store.list()) {\n if (!imported.has(existing.id)) {\n this.store.removeById(existing.id);\n }\n }\n }\n }\n\n private toCollection(model: any): Collection {\n if (model instanceof Collection) {\n return model;\n }\n if (model && typeof model === \"object\") {\n return new Collection(model);\n }\n throw new Error(\"[engine] expected a collection object\");\n }\n}\n\nexport type SimulatedApp = SimulatedAppImpl;\n\n/**\n * The data-layer surface installed alongside the app when record simulation\n * is on, so the sandbox can expose the same `Record` and `$dbx` objects the\n * app's finders return.\n */\nexport interface SimulatedAppBundle {\n app: SimulatedApp;\n /** Null when records are not simulated */\n data: ReturnType<typeof createDataApi> | null;\n}\n\nexport function createSimulatedAppBundle(\n store: CollectionStore,\n options: EngineOptions,\n warn: WarningSink\n): SimulatedAppBundle {\n const impl = new SimulatedAppImpl(store, options, warn);\n const data = options.records === \"simulate\" ? createDataApi(store, options, warn) : null;\n\n const app = new Proxy(impl, {\n get(target, prop, receiver) {\n if (prop in target || typeof prop === \"symbol\") {\n return Reflect.get(target, prop, receiver);\n }\n const name = String(prop);\n if (data && name in data.methods) {\n return data.methods[name];\n }\n return createInertStub(`app.${name}`, options, warn);\n },\n }) as SimulatedApp;\n\n data?.bindApp(app);\n\n return { app, data };\n}\n\nexport function createSimulatedApp(store: CollectionStore, options: EngineOptions, warn: WarningSink): SimulatedApp {\n return createSimulatedAppBundle(store, options, warn).app;\n}\n","/**\n * unmarshal(data, dst) — the PocketBase JSVM helper migrations use to merge\n * a JSON-shaped object into a collection (or any Go struct).\n *\n * Semantics follow Go's json.Unmarshal into an existing struct: plain\n * objects merge key by key, while arrays and scalars replace the target\n * value wholesale. `unmarshal({indexes: []}, collection)` therefore clears\n * the indexes list, which is exactly what PocketBase's generated down\n * migrations rely on.\n */\n\nimport { Collection } from \"./collection\";\nimport { FieldsList } from \"./fields-list\";\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return false;\n }\n // Cross-realm safe: vm-created literals have a foreign Object prototype\n const proto = Object.getPrototypeOf(value);\n return proto === null || Object.getPrototypeOf(proto) === null;\n}\n\nexport function unmarshal(data: unknown, dst: unknown): void {\n if (!isPlainObject(data) || dst === null || typeof dst !== \"object\") {\n return;\n }\n\n const target = dst as Record<string, any>;\n\n for (const [key, value] of Object.entries(data)) {\n if (key === \"fields\" && target instanceof Collection && Array.isArray(value)) {\n target.fields.replaceAll(value);\n continue;\n }\n if (key === \"fields\" && target.fields instanceof FieldsList && Array.isArray(value)) {\n target.fields.replaceAll(value);\n continue;\n }\n\n if (Array.isArray(value)) {\n target[key] = [...value];\n } else if (isPlainObject(value)) {\n if (isPlainObject(target[key])) {\n unmarshal(value, target[key]);\n } else {\n target[key] = {};\n unmarshal(value, target[key]);\n }\n } else {\n target[key] = value;\n }\n }\n}\n","/**\n * Sandbox globals for the migration execution context\n *\n * Recreates the PocketBase JSVM global surface a migration file sees:\n * migrate(), the Collection/Field constructors, unmarshal(), and the Go\n * binding globals ($app, $os, $dbx, ...). The sandbox contains NO Node\n * globals — no require, process, or fs — approximating goja, where none\n * of those exist either.\n */\n\nimport { Collection } from \"./collection\";\nimport { createInertStub, type SimulatedApp, type WarningSink } from \"./app\";\nimport { createDbx } from \"./dbx\";\nimport { FIELD_CONSTRUCTORS } from \"./fields\";\nimport { RecordModel } from \"./records\";\nimport { unmarshal } from \"./unmarshal\";\nimport type { EngineOptions } from \"./types\";\n\nexport interface MigrationRegistration {\n up?: (app: SimulatedApp) => unknown;\n down?: (app: SimulatedApp) => unknown;\n}\n\nexport interface SandboxHandles {\n sandbox: Record<string, any>;\n registrations: MigrationRegistration[];\n /** The runner points this at the current transactional app during up() */\n setCurrentApp: (app: SimulatedApp | null) => void;\n}\n\nconst STUBBED_GLOBALS = [\"$os\", \"$dbx\", \"$security\", \"$filesystem\", \"$http\", \"$mails\", \"$template\", \"Record\", \"DateTime\"];\n\nexport function buildSandbox(options: EngineOptions, warn: WarningSink): SandboxHandles {\n const registrations: MigrationRegistration[] = [];\n let currentApp: SimulatedApp | null = null;\n\n const consoleMethod =\n (level: string) =>\n (...args: unknown[]) => {\n warn({\n kind: \"console\",\n message: `console.${level}: ${args.map((arg) => stringifyArg(arg)).join(\" \")}`,\n });\n };\n\n const sandbox: Record<string, any> = {\n migrate(up?: MigrationRegistration[\"up\"], down?: MigrationRegistration[\"down\"]) {\n registrations.push({ up, down });\n },\n Collection,\n unmarshal,\n ...FIELD_CONSTRUCTORS,\n console: {\n log: consoleMethod(\"log\"),\n info: consoleMethod(\"info\"),\n warn: consoleMethod(\"warn\"),\n error: consoleMethod(\"error\"),\n debug: consoleMethod(\"debug\"),\n },\n };\n\n // Record and $dbx become real when record simulation is on; they hold no\n // state of their own, so the sandbox can own them for the whole file while\n // the store-bound half lives on the per-run app (see data-api.ts)\n const simulatesRecords = options.records === \"simulate\";\n\n for (const name of STUBBED_GLOBALS) {\n if (simulatesRecords && (name === \"Record\" || name === \"$dbx\")) {\n continue;\n }\n sandbox[name] = createInertStub(name, options, warn);\n }\n\n if (simulatesRecords) {\n sandbox.Record = RecordModel;\n sandbox.$dbx = createDbx();\n }\n\n // Some migrations use the global $app instead of the up() callback\n // argument; bind it to the same transactional app while up() runs\n Object.defineProperty(sandbox, \"$app\", {\n enumerable: true,\n get() {\n return currentApp ?? createInertStub(\"$app\", options, warn);\n },\n });\n\n return {\n sandbox,\n registrations,\n setCurrentApp(app) {\n currentApp = app;\n },\n };\n}\n\nfunction stringifyArg(arg: unknown): string {\n if (typeof arg === \"string\") {\n return arg;\n }\n try {\n return JSON.stringify(arg) ?? String(arg);\n } catch {\n return String(arg);\n }\n}\n","/**\n * Runner — executes one migration file against a CollectionStore\n *\n * Evaluation happens in a vm context built from the sandbox globals; the\n * file's migrate(up, down) call registers its closures. The requested\n * direction then runs transactionally: the store is cloned, the closure is\n * applied to the clone, and the clone replaces the store only on success.\n * The closure is invoked from inside the context (not host code) so the vm\n * timeout also bounds infinite loops within migration bodies.\n *\n * State reconstruction only ever runs `up`, which structurally rules out\n * replaying rollback statements as forward operations. `down` is executed on request (`executeMigrationDownSource`),\n * for rollback verification — see `verify.ts`. Downs run in reverse\n * registration order, mirroring how PocketBase rolls back.\n */\n\nimport * as fs from \"fs\";\nimport * as vm from \"vm\";\nimport { MigrationExecutionError } from \"../errors\";\nimport { createSimulatedApp } from \"./app\";\nimport { buildSandbox } from \"./globals\";\nimport type { CollectionStore } from \"./store\";\nimport type { EngineOptions, EngineWarning, MigrationDirection, MigrationExecutionResult } from \"./types\";\n\nconst DEFAULT_TIMEOUT_MS = 5000;\n\nexport function executeMigrationSource(\n source: string,\n store: CollectionStore,\n options: EngineOptions & { filename?: string } = {}\n): MigrationExecutionResult {\n return runMigrationSource(source, store, options, \"up\");\n}\n\nexport function executeMigrationFile(\n filePath: string,\n store: CollectionStore,\n options: EngineOptions = {}\n): MigrationExecutionResult {\n const source = fs.readFileSync(filePath, \"utf-8\");\n return executeMigrationSource(source, store, { ...options, filename: filePath });\n}\n\n/**\n * Runs the file's `down()` closures against the store, newest registration\n * first. A file that registers no `down` leaves the store untouched and\n * reports `applied: false`.\n */\nexport function executeMigrationDownSource(\n source: string,\n store: CollectionStore,\n options: EngineOptions & { filename?: string } = {}\n): MigrationExecutionResult {\n return runMigrationSource(source, store, options, \"down\");\n}\n\nexport function executeMigrationDownFile(\n filePath: string,\n store: CollectionStore,\n options: EngineOptions = {}\n): MigrationExecutionResult {\n const source = fs.readFileSync(filePath, \"utf-8\");\n return executeMigrationDownSource(source, store, { ...options, filename: filePath });\n}\n\nfunction runMigrationSource(\n source: string,\n store: CollectionStore,\n options: EngineOptions & { filename?: string },\n direction: MigrationDirection\n): MigrationExecutionResult {\n const filename = options.filename ?? \"<migration>\";\n const timeout = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const warnings: EngineWarning[] = [];\n const warn = (warning: EngineWarning) => {\n const withFile = { ...warning, file: warning.file ?? filename };\n warnings.push(withFile);\n options.onWarning?.(withFile);\n };\n\n const { sandbox, registrations, setCurrentApp } = buildSandbox(options, warn);\n const context = vm.createContext(sandbox);\n\n try {\n new vm.Script(source, { filename }).runInContext(context, { timeout });\n } catch (error) {\n throw new MigrationExecutionError(\n `Failed to evaluate migration file: ${error instanceof Error ? error.message : String(error)}`,\n filename,\n \"evaluate\",\n error instanceof Error ? error : undefined\n );\n }\n\n sandbox.__engineRegistrations__ = registrations;\n\n // Rollback undoes the most recent registration first\n const order = registrations.map((_, index) => index);\n if (direction === \"down\") {\n order.reverse();\n }\n\n let applied = false;\n for (const index of order) {\n const closure = registrations[index]?.[direction];\n if (typeof closure !== \"function\") {\n continue;\n }\n\n const tx = store.clone();\n const app = createSimulatedApp(tx, options, warn);\n sandbox.__engineApp__ = app;\n setCurrentApp(app);\n\n try {\n vm.runInContext(`__engineRegistrations__[${index}].${direction}(__engineApp__)`, context, { timeout });\n } catch (error) {\n throw new MigrationExecutionError(\n `Migration ${direction}() failed: ${error instanceof Error ? error.message : String(error)}`,\n filename,\n direction,\n error instanceof Error ? error : undefined\n );\n } finally {\n setCurrentApp(null);\n delete sandbox.__engineApp__;\n }\n\n store.replaceWith(tx);\n applied = true;\n }\n\n return { file: filename, direction, applied, warnings };\n}\n","/**\n * `_migrations` table awareness\n *\n * PocketBase records every migration it has run in an internal `_migrations`\n * table (`file` TEXT PRIMARY KEY, `applied` INTEGER). Replay that assumes\n * every file on disk is applied reconstructs a state the database may never\n * have been in: a file added but not yet run, or a file deleted from disk\n * after it ran, both produce silent drift.\n *\n * This module reads that table so replay can start from an actual checkpoint,\n * and so `status --verify` can name the difference between disk and database.\n *\n * The read is done with Node's built-in `node:sqlite` (Node >= 22.5), fetched\n * through `process.getBuiltinModule` so neither the ESM nor the CJS bundle\n * carries a hard dependency on it. `pb_data/data.db` is opened **read-only**;\n * a running PocketBase instance is never disturbed.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\n/** PocketBase's internal table of applied migrations */\nexport const APPLIED_MIGRATIONS_TABLE = \"_migrations\";\n\n/** PocketBase's SQLite database file inside a pb_data directory */\nexport const POCKETBASE_DATABASE_FILENAME = \"data.db\";\n\nexport interface AppliedMigration {\n /** Filename as PocketBase recorded it, e.g. \"1712345678_created_Posts.js\" */\n file: string;\n /** Unix seconds from `_migrations.applied`, when the column has a value */\n applied?: number;\n}\n\nexport interface AppliedMigrationsSource {\n /** Where the list came from — a database path, or a caller-supplied label */\n origin: string;\n /** Every row, in application order */\n entries: AppliedMigration[];\n /**\n * Entries PocketBase's own Go core migrations contributed (`*.go`). They\n * never correspond to a file in a pb_migrations directory, so they are\n * kept separate from `entries` rather than reported as missing.\n */\n coreEntries: AppliedMigration[];\n}\n\n/**\n * Raised when an applied-migrations list was requested but could not be read.\n * Callers that treat the list as optional should catch this and fall back to\n * \"assume everything on disk is applied\".\n */\nexport class AppliedMigrationsError extends Error {\n public readonly source?: string;\n public readonly originalError?: Error;\n\n constructor(message: string, source?: string, originalError?: Error) {\n super(message);\n this.name = \"AppliedMigrationsError\";\n this.source = source;\n this.originalError = originalError;\n Object.setPrototypeOf(this, AppliedMigrationsError.prototype);\n }\n}\n\n/**\n * Builds a source from an explicit list of filenames (paths are reduced to\n * their basename, so a caller can pass either).\n */\nexport function appliedMigrationsFromList(files: string[], origin = \"<list>\"): AppliedMigrationsSource {\n const entries: AppliedMigration[] = [];\n const coreEntries: AppliedMigration[] = [];\n\n for (const file of files) {\n const entry: AppliedMigration = { file: path.basename(file) };\n (isCoreMigration(entry.file) ? coreEntries : entries).push(entry);\n }\n\n return { origin, entries, coreEntries };\n}\n\n/**\n * The pb_data directory PocketBase uses alongside a pb_migrations directory.\n * Both live under the PocketBase working directory, so pb_data is a sibling.\n */\nexport function defaultDataDirectory(migrationsPath: string): string {\n return path.resolve(path.dirname(path.resolve(migrationsPath)), \"pb_data\");\n}\n\n/**\n * Resolves a user-supplied pb_data path (directory or database file) to the\n * SQLite file to open. Returns null when nothing usable exists.\n */\nexport function resolveDatabasePath(dataPathOrFile: string): string | null {\n const resolved = path.resolve(dataPathOrFile);\n if (!fs.existsSync(resolved)) {\n return null;\n }\n if (fs.statSync(resolved).isDirectory()) {\n const candidate = path.join(resolved, POCKETBASE_DATABASE_FILENAME);\n return fs.existsSync(candidate) ? candidate : null;\n }\n return resolved;\n}\n\n/**\n * Reads `_migrations` out of a PocketBase SQLite database.\n *\n * @param dataPathOrFile - A pb_data directory or a data.db file\n * @throws AppliedMigrationsError when the runtime, file, or table is unusable\n */\nexport function readAppliedMigrations(dataPathOrFile: string): AppliedMigrationsSource {\n const databasePath = resolveDatabasePath(dataPathOrFile);\n if (!databasePath) {\n throw new AppliedMigrationsError(\n `No PocketBase database found at ${path.resolve(dataPathOrFile)}. ` +\n `Expected a data.db file, or a pb_data directory containing one.`,\n dataPathOrFile\n );\n }\n\n const sqlite = loadSqliteModule();\n if (!sqlite) {\n throw new AppliedMigrationsError(\n `Reading the _migrations table requires Node's built-in node:sqlite module (Node >= 22.5). ` +\n `This process runs ${process.version}. Pass the applied migrations explicitly instead.`,\n databasePath\n );\n }\n\n let database: { prepare: (sql: string) => { all: () => unknown[] }; close: () => void };\n try {\n database = withoutSqliteExperimentalWarning(() => new sqlite.DatabaseSync(databasePath, { readOnly: true }));\n } catch (error) {\n throw new AppliedMigrationsError(\n `Failed to open ${databasePath}: ${errorMessage(error)}`,\n databasePath,\n error instanceof Error ? error : undefined\n );\n }\n\n try {\n const rows = database\n .prepare(`SELECT file, applied FROM ${APPLIED_MIGRATIONS_TABLE} ORDER BY applied ASC, file ASC`)\n .all() as { file?: unknown; applied?: unknown }[];\n\n const entries: AppliedMigration[] = [];\n const coreEntries: AppliedMigration[] = [];\n\n for (const row of rows) {\n if (typeof row?.file !== \"string\" || row.file === \"\") {\n continue;\n }\n const entry: AppliedMigration = { file: row.file };\n const applied = Number(row.applied);\n if (Number.isFinite(applied) && applied > 0) {\n entry.applied = applied;\n }\n (isCoreMigration(entry.file) ? coreEntries : entries).push(entry);\n }\n\n return { origin: databasePath, entries, coreEntries };\n } catch (error) {\n if (error instanceof AppliedMigrationsError) {\n throw error;\n }\n throw new AppliedMigrationsError(\n `Failed to read the ${APPLIED_MIGRATIONS_TABLE} table from ${databasePath}: ${errorMessage(error)}`,\n databasePath,\n error instanceof Error ? error : undefined\n );\n } finally {\n try {\n database.close();\n } catch {\n // A close failure cannot invalidate rows already read\n }\n }\n}\n\n/**\n * Best-effort read: returns null instead of throwing when there is simply no\n * database to read (the common case for a checkout that has never run\n * PocketBase). Genuine failures — an unreadable file, a missing table, a\n * runtime without node:sqlite — still throw, because silently assuming\n * \"everything is applied\" is the drift this module exists to catch.\n */\nexport function readAppliedMigrationsIfPresent(dataPathOrFile: string): AppliedMigrationsSource | null {\n if (!resolveDatabasePath(dataPathOrFile)) {\n return null;\n }\n return readAppliedMigrations(dataPathOrFile);\n}\n\n/**\n * PocketBase's own Go core migrations are recorded in `_migrations` alongside\n * JS ones. They have no counterpart on disk in a pb_migrations directory.\n */\nfunction isCoreMigration(file: string): boolean {\n return !file.endsWith(\".js\");\n}\n\ninterface SqliteModule {\n DatabaseSync: new (\n path: string,\n options?: { readOnly?: boolean }\n ) => { prepare: (sql: string) => { all: () => unknown[] }; close: () => void };\n}\n\n/**\n * Loads node:sqlite without a static import, so the module keeps working on\n * runtimes that do not ship it (the rest of the engine does not need it).\n */\nfunction loadSqliteModule(): SqliteModule | null {\n const getBuiltinModule = (process as NodeJS.Process & { getBuiltinModule?: (id: string) => unknown })\n .getBuiltinModule;\n if (typeof getBuiltinModule !== \"function\") {\n return null;\n }\n try {\n const module = withoutSqliteExperimentalWarning(() => getBuiltinModule(\"node:sqlite\") as SqliteModule | undefined);\n return module && typeof module.DatabaseSync === \"function\" ? module : null;\n } catch {\n return null;\n }\n}\n\n/**\n * node:sqlite emits an ExperimentalWarning on load and on open. Reading a\n * read-only table is a bounded, deliberate use of it, and a CLI that prints a\n * Node warning every time someone runs `status --verify` is just noise —\n * so the warning is dropped for the duration of the call, and only that one.\n */\nfunction withoutSqliteExperimentalWarning<T>(operation: () => T): T {\n const original = process.emitWarning;\n\n process.emitWarning = ((warning: unknown, ...rest: unknown[]) => {\n const name = typeof warning === \"object\" && warning !== null ? (warning as Error).name : rest[0];\n const message = typeof warning === \"string\" ? warning : ((warning as Error)?.message ?? \"\");\n if (name === \"ExperimentalWarning\" && /sqlite/i.test(message)) {\n return;\n }\n (original as (...args: unknown[]) => void).call(process, warning, ...rest);\n }) as typeof process.emitWarning;\n\n try {\n return operation();\n } finally {\n process.emitWarning = original;\n }\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","/**\n * Replay planning — which migration files reconstruct the current state\n *\n * Without knowledge of PocketBase's `_migrations` table, replay assumes every\n * file on disk has been applied. That is right for the common case and wrong\n * in exactly the situations that matter: a migration written but not yet run,\n * or a file removed from disk after it ran. Both produce a reconstructed state\n * the database was never in, and therefore a wrong diff.\n *\n * Given an applied-migrations list (see `applied-migrations.ts`), this module\n * turns a pb_migrations directory into a plan:\n *\n * - `filesToReplay` — the applied prefix, starting at the newest *applied*\n * snapshot, which is the checkpoint replay should start from\n * - `pending` — on disk, never applied\n * - `missing` — applied, no longer on disk\n * - `outOfOrder` — pending files whose timestamp sits behind an already\n * applied one, so they will be applied out of authoring order\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport type { AppliedMigrationsSource } from \"./applied-migrations\";\nimport { appliedMigrationsFromList } from \"./applied-migrations\";\n\n/**\n * Extracts the timestamp prefix from a migration filename.\n * Migration files are named `[timestamp]_[description].js`.\n *\n * @param filename - Migration filename (basename, not a path)\n * @returns Timestamp as a number, or null when the name is not prefixed\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/** A migration file discovered on disk */\nexport interface DiscoveredMigration {\n /** Absolute path */\n path: string;\n /** Basename, which is what `_migrations.file` stores */\n name: string;\n timestamp: number;\n /** PocketBase's own `*_collections_snapshot.js` files */\n isSnapshot: boolean;\n}\n\nexport interface MigrationPlan {\n /** The snapshot the replay starts from, when the directory has one */\n snapshotFile: string | null;\n /** Absolute paths to execute, in timestamp order */\n filesToReplay: string[];\n /** Basenames present on disk but absent from `_migrations` */\n pending: string[];\n /** Basenames recorded in `_migrations` with no file on disk */\n missing: string[];\n /**\n * Basenames from `pending` whose timestamp precedes an already-applied\n * migration. PocketBase will still run them, but after migrations authored\n * later — so the state they produce depends on apply order.\n */\n outOfOrder: string[];\n /** False when no applied list was supplied: every file is assumed applied */\n appliedKnown: boolean;\n /** Where the applied list came from, when there was one */\n appliedOrigin?: string;\n /** Number of JS migrations recorded as applied */\n appliedCount: number;\n /** True when disk and `_migrations` agree exactly */\n inSync: boolean;\n}\n\nexport interface PlanOptions {\n /**\n * The applied-migrations list. A plain array of filenames is accepted as a\n * shorthand. Omit (or pass null) to assume every file on disk is applied.\n */\n applied?: AppliedMigrationsSource | string[] | null;\n}\n\n/**\n * Lists every timestamped `.js` migration in a directory, in timestamp order.\n * Returns an empty list when the directory does not exist.\n */\nexport function discoverMigrations(migrationsPath: string): DiscoveredMigration[] {\n if (!fs.existsSync(migrationsPath) || !fs.statSync(migrationsPath).isDirectory()) {\n return [];\n }\n\n const discovered: DiscoveredMigration[] = [];\n for (const name of fs.readdirSync(migrationsPath)) {\n if (!name.endsWith(\".js\")) {\n continue;\n }\n const timestamp = extractTimestampFromFilename(name);\n if (timestamp === null) {\n continue;\n }\n discovered.push({\n path: path.join(migrationsPath, name),\n name,\n timestamp,\n isSnapshot: name.endsWith(\"_collections_snapshot.js\") || name.endsWith(\"_snapshot.js\"),\n });\n }\n\n // Ties broken by name so the order is stable across filesystems\n discovered.sort((a, b) => a.timestamp - b.timestamp || a.name.localeCompare(b.name));\n return discovered;\n}\n\n/**\n * Builds the replay plan for a migrations directory.\n *\n * Without an applied list this reproduces the directory's default replay\n * window — newest snapshot plus everything after it — so the plan is a\n * drop-in for the previous file selection.\n */\nexport function planMigrationReplay(migrationsPath: string, options: PlanOptions = {}): MigrationPlan {\n const discovered = discoverMigrations(migrationsPath);\n const applied = normalizeApplied(options.applied);\n\n if (!applied) {\n const snapshot = lastSnapshot(discovered);\n return {\n snapshotFile: snapshot?.path ?? null,\n filesToReplay: replayWindow(discovered, snapshot).map((migration) => migration.path),\n pending: [],\n missing: [],\n outOfOrder: [],\n appliedKnown: false,\n appliedCount: 0,\n inSync: true,\n };\n }\n\n const appliedNames = new Set(applied.entries.map((entry) => entry.file));\n const onDisk = new Set(discovered.map((migration) => migration.name));\n\n // Start from the newest snapshot that was actually applied: a snapshot\n // sitting on disk unapplied is not a checkpoint the database ever reached\n const snapshot = lastSnapshot(discovered.filter((migration) => appliedNames.has(migration.name)));\n const filesToReplay = replayWindow(discovered, snapshot)\n .filter((migration) => appliedNames.has(migration.name))\n .map((migration) => migration.path);\n\n const pendingMigrations = discovered.filter((migration) => !appliedNames.has(migration.name));\n const missing = applied.entries.filter((entry) => !onDisk.has(entry.file)).map((entry) => entry.file);\n\n const newestAppliedTimestamp = discovered\n .filter((migration) => appliedNames.has(migration.name))\n .reduce((newest, migration) => Math.max(newest, migration.timestamp), 0);\n const outOfOrder = pendingMigrations\n .filter((migration) => migration.timestamp < newestAppliedTimestamp)\n .map((migration) => migration.name);\n\n const pending = pendingMigrations.map((migration) => migration.name);\n\n return {\n snapshotFile: snapshot?.path ?? null,\n filesToReplay,\n pending,\n missing,\n outOfOrder,\n appliedKnown: true,\n appliedOrigin: applied.origin,\n appliedCount: applied.entries.length,\n inSync: pending.length === 0 && missing.length === 0,\n };\n}\n\n/**\n * The files a replay executes: the snapshot, then every non-snapshot\n * migration authored after it. Snapshots supersede everything before them,\n * so earlier files are never re-executed.\n */\nfunction replayWindow(discovered: DiscoveredMigration[], snapshot: DiscoveredMigration | null): DiscoveredMigration[] {\n if (!snapshot) {\n return discovered.filter((migration) => !migration.isSnapshot);\n }\n return [\n snapshot,\n ...discovered.filter((migration) => !migration.isSnapshot && migration.timestamp > snapshot.timestamp),\n ];\n}\n\nfunction lastSnapshot(discovered: DiscoveredMigration[]): DiscoveredMigration | null {\n let latest: DiscoveredMigration | null = null;\n for (const migration of discovered) {\n if (migration.isSnapshot) {\n latest = migration;\n }\n }\n return latest;\n}\n\nfunction normalizeApplied(applied: PlanOptions[\"applied\"]): AppliedMigrationsSource | null {\n if (!applied) {\n return null;\n }\n return Array.isArray(applied) ? appliedMigrationsFromList(applied) : applied;\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 * Zod to PocketBase type mapping utilities\n *\n * This module provides comprehensive mapping between Zod schema types\n * and PocketBase field types, including support for all PocketBase field types:\n * - text, email, url, editor\n * - number, bool\n * - date, autodate\n * - select (single/multiple)\n * - relation (single/multiple)\n * - file (single/multiple)\n * - json\n * - geoPoint\n */\n\nimport { z } from \"zod\";\nimport type { PocketBaseFieldType } from \"../types\";\nimport { extractFieldMetadata, FIELD_METADATA_KEY } from \"../../schema/fields\";\n\n// Re-export extractFieldMetadata from fields.ts for backward compatibility\nexport { extractFieldMetadata, FIELD_METADATA_KEY };\nexport type { FieldMetadata } from \"../../schema/fields\";\n\n/**\n * All supported PocketBase field types\n */\nexport const POCKETBASE_FIELD_TYPES: readonly PocketBaseFieldType[] = [\n \"text\",\n \"email\",\n \"url\",\n \"number\",\n \"bool\",\n \"date\",\n \"select\",\n \"relation\",\n \"file\",\n \"json\",\n \"editor\",\n \"geoPoint\",\n \"autodate\",\n \"password\",\n] as const;\n\n/**\n * Field type metadata for documentation and validation\n */\nexport interface FieldTypeInfo {\n type: PocketBaseFieldType;\n description: string;\n zodTypes: string[];\n supportsMultiple: boolean;\n}\n\n/**\n * Metadata about each PocketBase field type\n */\nexport const FIELD_TYPE_INFO: Record<PocketBaseFieldType, FieldTypeInfo> = {\n text: {\n type: \"text\",\n description: \"Plain text field\",\n zodTypes: [\"ZodString\"],\n supportsMultiple: false,\n },\n password: {\n type: \"password\",\n description: \"Password field (system)\",\n zodTypes: [\"ZodString\"],\n supportsMultiple: false,\n },\n email: {\n type: \"email\",\n description: \"Email address field with validation\",\n zodTypes: [\"ZodString with email()\"],\n supportsMultiple: false,\n },\n url: {\n type: \"url\",\n description: \"URL field with validation\",\n zodTypes: [\"ZodString with url()\"],\n supportsMultiple: false,\n },\n editor: {\n type: \"editor\",\n description: \"Rich text editor field\",\n zodTypes: [\"ZodString\"],\n supportsMultiple: false,\n },\n number: {\n type: \"number\",\n description: \"Numeric field (integer or float)\",\n zodTypes: [\"ZodNumber\"],\n supportsMultiple: false,\n },\n bool: {\n type: \"bool\",\n description: \"Boolean field\",\n zodTypes: [\"ZodBoolean\"],\n supportsMultiple: false,\n },\n date: {\n type: \"date\",\n description: \"Date/datetime field\",\n zodTypes: [\"ZodDate\", \"ZodString with datetime format\"],\n supportsMultiple: false,\n },\n autodate: {\n type: \"autodate\",\n description: \"Auto-managed date field (created/updated)\",\n zodTypes: [\"ZodString\"],\n supportsMultiple: false,\n },\n select: {\n type: \"select\",\n description: \"Single or multiple select from predefined values\",\n zodTypes: [\"ZodEnum\", \"ZodArray<ZodEnum>\"],\n supportsMultiple: true,\n },\n relation: {\n type: \"relation\",\n description: \"Reference to another collection\",\n zodTypes: [\"ZodString\", \"ZodArray<ZodString>\"],\n supportsMultiple: true,\n },\n file: {\n type: \"file\",\n description: \"File upload field\",\n zodTypes: [\"File\", \"ZodArray<File>\"],\n supportsMultiple: true,\n },\n json: {\n type: \"json\",\n description: \"JSON data field\",\n zodTypes: [\"ZodRecord\", \"ZodObject\", \"ZodArray\"],\n supportsMultiple: false,\n },\n geoPoint: {\n type: \"geoPoint\",\n description: \"Geographic coordinates (lon, lat)\",\n zodTypes: [\"ZodObject with lon/lat\"],\n supportsMultiple: false,\n },\n};\n\nfunction getChecks(zodType: z.ZodTypeAny): any[] {\n const def = (zodType as any).def ?? (zodType as any)._def;\n return (def?.checks ?? []) as any[];\n}\n\nfunction getJsonSchema(zodType: z.ZodTypeAny): any | null {\n try {\n const toJSONSchema = (zodType as any).toJSONSchema;\n return typeof toJSONSchema === \"function\" ? toJSONSchema.call(zodType) : null;\n } catch {\n return null;\n }\n}\n\n/**\n * Maps Zod string types to PocketBase field types\n */\nexport function mapZodStringType(zodType: z.ZodString): PocketBaseFieldType {\n const checks = getChecks(zodType);\n\n // Check for email validation\n const hasEmail = checks.some((check: any) => check.kind === \"email\" || check.def?.format === \"email\");\n if (hasEmail) {\n return \"email\";\n }\n\n // Check for URL validation\n const hasUrl = checks.some((check: any) => check.kind === \"url\" || check.def?.format === \"url\");\n if (hasUrl) {\n return \"url\";\n }\n\n // Check for datetime validation (could be date field)\n const hasDatetime = checks.some(\n (check: any) => check.kind === \"datetime\" || check.def?.format === \"datetime\" || check.def?.format === \"date-time\"\n );\n if (hasDatetime) {\n return \"date\";\n }\n\n // Default to text\n return \"text\";\n}\n\n/**\n * Maps Zod number types to PocketBase number type\n */\nexport function mapZodNumberType(_zodType: z.ZodNumber): PocketBaseFieldType {\n return \"number\";\n}\n\n/**\n * Maps Zod boolean types to PocketBase bool type\n */\nexport function mapZodBooleanType(_zodType: z.ZodBoolean): PocketBaseFieldType {\n return \"bool\";\n}\n\n/**\n * Maps Zod enum types to PocketBase select type\n */\nexport function mapZodEnumType(_zodType: z.ZodEnum<any>): PocketBaseFieldType {\n return \"select\";\n}\n\n/**\n * Maps Zod array types to appropriate PocketBase types\n * Arrays of strings could be relations or file fields depending on context\n */\nexport function mapZodArrayType(zodType: z.ZodArray<any>, _fieldName: string): PocketBaseFieldType {\n const elementType = zodType.element as z.ZodTypeAny;\n\n if (elementType instanceof z.ZodFile) {\n return \"file\";\n }\n\n // Array of strings - could be relation (will be determined by relation detector)\n if (elementType instanceof z.ZodString) {\n return \"relation\";\n }\n\n // Default to JSON for other array types\n return \"json\";\n}\n\n/**\n * Maps Zod date types to PocketBase date type\n */\nexport function mapZodDateType(_zodType: z.ZodDate): PocketBaseFieldType {\n return \"date\";\n}\n\n/**\n * Maps Zod record/object types to PocketBase JSON type\n */\nexport function mapZodRecordType(_zodType: z.ZodRecord | z.ZodObject<any>): PocketBaseFieldType {\n return \"json\";\n}\n\n/**\n * Main type mapping function that determines PocketBase field type from Zod type\n */\nexport function mapZodTypeToPocketBase(zodType: z.ZodTypeAny, fieldName: string): PocketBaseFieldType {\n const unwrappedType = unwrapZodType(zodType);\n\n // Check for metadata first (explicit type overrides)\n const metadata = extractFieldMetadata(unwrappedType.description);\n if (metadata && metadata.type) {\n return metadata.type;\n }\n\n if (unwrappedType instanceof z.ZodFile) {\n return \"file\";\n }\n\n // Map based on Zod type\n let type: PocketBaseFieldType = \"text\";\n\n if (unwrappedType instanceof z.ZodString) {\n type = mapZodStringType(unwrappedType);\n } else if (unwrappedType instanceof z.ZodNumber) {\n type = mapZodNumberType(unwrappedType);\n } else if (unwrappedType instanceof z.ZodBoolean) {\n type = mapZodBooleanType(unwrappedType);\n } else if (unwrappedType instanceof z.ZodEnum) {\n type = mapZodEnumType(unwrappedType);\n } else if (unwrappedType instanceof z.ZodArray) {\n type = mapZodArrayType(unwrappedType, fieldName);\n } else if (unwrappedType instanceof z.ZodDate) {\n type = mapZodDateType(unwrappedType);\n } else if (unwrappedType instanceof z.ZodRecord || unwrappedType instanceof z.ZodObject) {\n type = mapZodRecordType(unwrappedType);\n }\n\n return type;\n}\n\n/**\n * Extracts field options from Zod type (min, max, pattern, etc.)\n */\nexport function extractFieldOptions(zodType: z.ZodTypeAny): Record<string, any> {\n const options: Record<string, any> = {};\n\n const unwrappedType = unwrapZodType(zodType);\n const checks = getChecks(unwrappedType);\n\n // Extract string constraints\n if (unwrappedType instanceof z.ZodString) {\n for (const check of checks) {\n if (check.kind === \"min\") {\n options.min = check.value;\n }\n if (check.kind === \"max\") {\n options.max = check.value;\n }\n if (check.kind === \"regex\") {\n options.pattern = check.regex.source;\n }\n }\n\n if (options.min === undefined || options.max === undefined || options.pattern === undefined) {\n const schema = getJsonSchema(unwrappedType);\n if (schema) {\n if (options.min === undefined && typeof schema.minLength === \"number\") {\n options.min = schema.minLength;\n }\n if (options.max === undefined && typeof schema.maxLength === \"number\") {\n options.max = schema.maxLength;\n }\n if (options.pattern === undefined && typeof schema.pattern === \"string\") {\n options.pattern = schema.pattern;\n }\n }\n }\n }\n\n // Extract number constraints\n if (unwrappedType instanceof z.ZodNumber) {\n for (const check of checks) {\n if (check.kind === \"min\") {\n options.min = check.value;\n }\n if (check.kind === \"max\") {\n options.max = check.value;\n }\n }\n\n const schema = getJsonSchema(unwrappedType);\n if (schema) {\n if (options.min === undefined && typeof schema.minimum === \"number\") {\n options.min = schema.minimum;\n }\n if (options.max === undefined && typeof schema.maximum === \"number\") {\n options.max = schema.maximum;\n }\n }\n\n // `z.number().int()` is how an integer column is spelled in Zod; it maps\n // onto PocketBase's onlyInt, which the generator writes from noDecimal\n const isInteger =\n schema?.type === \"integer\" ||\n checks.some((check: any) => check.kind === \"int\" || String(check.def?.format ?? \"\").includes(\"int\"));\n if (isInteger) {\n options.noDecimal = true;\n }\n }\n\n // Extract enum values\n if (unwrappedType instanceof z.ZodEnum) {\n options.values = unwrappedType.options.map(String);\n }\n\n // Extract array constraints\n if (unwrappedType instanceof z.ZodArray) {\n const arrayChecks = getChecks(unwrappedType);\n for (const check of arrayChecks) {\n if (check.kind === \"min\") {\n options.minSelect = check.value;\n }\n if (check.kind === \"max\") {\n options.maxSelect = check.value;\n }\n }\n\n if (options.minSelect === undefined || options.maxSelect === undefined) {\n const schema = getJsonSchema(unwrappedType);\n if (schema) {\n if (options.minSelect === undefined && typeof schema.minItems === \"number\") {\n options.minSelect = schema.minItems;\n }\n if (options.maxSelect === undefined && typeof schema.maxItems === \"number\") {\n options.maxSelect = schema.maxItems;\n }\n }\n }\n }\n\n return options;\n}\n\n/**\n * Determines if a Zod field is required (not optional)\n */\nexport function isFieldRequired(zodType: z.ZodTypeAny): boolean {\n // Check if it's optional\n if (zodType instanceof z.ZodOptional) {\n return false;\n }\n\n // Check if it has a default value (makes it optional)\n if (zodType instanceof z.ZodDefault) {\n return false;\n }\n\n // Check for nullable (in PocketBase context, nullable means optional)\n if (zodType instanceof z.ZodNullable) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Unwraps a Zod type to get the inner type\n * Handles optional, nullable, and default wrappers\n */\nexport function unwrapZodType(zodType: z.ZodTypeAny): z.ZodTypeAny {\n let unwrapped = zodType;\n let previous = null;\n\n while (unwrapped !== previous) {\n previous = unwrapped;\n if (unwrapped instanceof z.ZodOptional) {\n unwrapped = unwrapped.unwrap() as z.ZodTypeAny;\n } else if (unwrapped instanceof z.ZodNullable) {\n unwrapped = unwrapped.unwrap() as z.ZodTypeAny;\n } else if (unwrapped instanceof z.ZodDefault) {\n unwrapped = unwrapped.unwrap() as z.ZodTypeAny;\n }\n }\n\n return unwrapped;\n}\n\n/**\n * Gets the default value from a Zod type if it has one\n */\nexport function getDefaultValue(zodType: z.ZodTypeAny): any {\n if (zodType instanceof z.ZodDefault) {\n return zodType.def.defaultValue;\n }\n return undefined;\n}\n\n/**\n * Checks if a Zod type is an array type\n */\nexport function isArrayType(zodType: z.ZodTypeAny): boolean {\n const unwrapped = unwrapZodType(zodType);\n return unwrapped instanceof z.ZodArray;\n}\n\n/**\n * Gets the element type of an array Zod type\n */\nexport function getArrayElementType(zodType: z.ZodTypeAny): z.ZodTypeAny | null {\n const unwrapped = unwrapZodType(zodType);\n if (unwrapped instanceof z.ZodArray) {\n return unwrapped.element as z.ZodTypeAny;\n }\n return null;\n}\n\n/**\n * Checks if a Zod type represents a geo point (object with lon/lat)\n */\nexport function isGeoPointType(zodType: z.ZodTypeAny): boolean {\n const unwrapped = unwrapZodType(zodType);\n if (!(unwrapped instanceof z.ZodObject)) {\n return false;\n }\n\n const shape = unwrapped.shape;\n const hasLon = \"lon\" in shape && shape.lon instanceof z.ZodNumber;\n const hasLat = \"lat\" in shape && shape.lat instanceof z.ZodNumber;\n\n return hasLon && hasLat;\n}\n\n/**\n * Complete field options extracted from a Zod type\n */\nexport interface ExtractedFieldOptions {\n min?: number;\n max?: number;\n pattern?: string;\n values?: string[];\n minSelect?: number;\n maxSelect?: number;\n mimeTypes?: string[];\n maxSize?: number;\n thumbs?: string[];\n}\n\n/**\n * Extracts comprehensive field options from Zod type\n * Includes all constraints that can be mapped to PocketBase field options\n */\nexport function extractComprehensiveFieldOptions(zodType: z.ZodTypeAny): ExtractedFieldOptions {\n const options: ExtractedFieldOptions = {};\n const unwrapped = unwrapZodType(zodType);\n const checks = getChecks(unwrapped);\n\n // Extract string constraints\n if (unwrapped instanceof z.ZodString) {\n for (const check of checks) {\n if (check.kind === \"min\") {\n options.min = check.value;\n }\n if (check.kind === \"max\") {\n options.max = check.value;\n }\n if (check.kind === \"regex\") {\n options.pattern = check.regex.source;\n }\n }\n\n if (options.min === undefined || options.max === undefined || options.pattern === undefined) {\n const schema = getJsonSchema(unwrapped);\n if (schema) {\n if (options.min === undefined && typeof schema.minLength === \"number\") {\n options.min = schema.minLength;\n }\n if (options.max === undefined && typeof schema.maxLength === \"number\") {\n options.max = schema.maxLength;\n }\n if (options.pattern === undefined && typeof schema.pattern === \"string\") {\n options.pattern = schema.pattern;\n }\n }\n }\n }\n\n // Extract number constraints\n if (unwrapped instanceof z.ZodNumber) {\n for (const check of checks) {\n if (check.kind === \"min\") {\n options.min = check.value;\n }\n if (check.kind === \"max\") {\n options.max = check.value;\n }\n }\n\n if (options.min === undefined || options.max === undefined) {\n const schema = getJsonSchema(unwrapped);\n if (schema) {\n if (options.min === undefined && typeof schema.minimum === \"number\") {\n options.min = schema.minimum;\n }\n if (options.max === undefined && typeof schema.maximum === \"number\") {\n options.max = schema.maximum;\n }\n }\n }\n }\n\n // Extract enum values\n if (unwrapped instanceof z.ZodEnum) {\n options.values = unwrapped.options.map(String);\n }\n\n // Extract array constraints\n if (unwrapped instanceof z.ZodArray) {\n const arrayChecks = getChecks(unwrapped);\n for (const check of arrayChecks) {\n if (check.kind === \"min\") {\n options.minSelect = check.value;\n }\n if (check.kind === \"max\") {\n options.maxSelect = check.value;\n }\n }\n\n if (options.minSelect === undefined || options.maxSelect === undefined) {\n const schema = getJsonSchema(unwrapped);\n if (schema) {\n if (options.minSelect === undefined && typeof schema.minItems === \"number\") {\n options.minSelect = schema.minItems;\n }\n if (options.maxSelect === undefined && typeof schema.maxItems === \"number\") {\n options.maxSelect = schema.maxItems;\n }\n }\n }\n\n // Check for enum element type\n const elementType = unwrapped.element as z.ZodTypeAny;\n if (elementType instanceof z.ZodEnum) {\n options.values = elementType.options.map(String);\n }\n }\n\n return options;\n}\n\n\n\n/**\n * Options every PocketBase field carries, whatever its type\n */\nconst UNIVERSAL_FIELD_OPTIONS = [\"hidden\", \"presentable\", \"system\"] as const;\n\n/**\n * The options PocketBase actually stores per field type.\n *\n * Zod validators do not line up with PocketBase's option set: `z.string()\n * .email()` carries a regex that becomes `pattern`, but PocketBase's `email`\n * type has no `pattern` and drops it on save. Emitting one leaves the\n * migration file describing a collection the server never had — the file and\n * the database disagree from the moment it is applied.\n *\n * Keys are PocketBase's own, plus the internal aliases the generator\n * translates on the way out (`noDecimal` -> `onlyInt`).\n */\nconst SUPPORTED_FIELD_OPTIONS: Record<PocketBaseFieldType, readonly string[]> = {\n text: [\"min\", \"max\", \"pattern\", \"autogeneratePattern\", \"primaryKey\"],\n password: [\"min\", \"max\", \"pattern\", \"cost\"],\n email: [\"exceptDomains\", \"onlyDomains\"],\n url: [\"exceptDomains\", \"onlyDomains\"],\n editor: [\"convertURLs\", \"maxSize\"],\n number: [\"min\", \"max\", \"onlyInt\", \"noDecimal\"],\n bool: [],\n date: [\"min\", \"max\"],\n autodate: [\"onCreate\", \"onUpdate\"],\n select: [\"values\", \"maxSelect\"],\n file: [\"mimeTypes\", \"thumbs\", \"maxSelect\", \"maxSize\", \"protected\"],\n relation: [\"collectionId\", \"cascadeDelete\", \"minSelect\", \"maxSelect\"],\n json: [\"maxSize\"],\n geoPoint: [],\n};\n\n/**\n * The option keys a field of `fieldType` can carry — the same set the\n * generator is allowed to emit.\n *\n * The reader (`pocketbase-converter.extractFieldOptions`) uses this so that\n * every option the generator writes is read back on replay. A key that is\n * emitted but not read makes `compare()` see a modification on every run and\n * emit the same `updated_*` migration forever.\n *\n * @param fieldType - The PocketBase field type, if known\n * @returns The option keys readable for that type (every known key when the\n * type is unrecognized)\n */\nexport function getSupportedFieldOptionKeys(fieldType?: string): string[] {\n const typeSpecific =\n fieldType && fieldType in SUPPORTED_FIELD_OPTIONS\n ? SUPPORTED_FIELD_OPTIONS[fieldType as PocketBaseFieldType]\n : Object.values(SUPPORTED_FIELD_OPTIONS).flat();\n\n return [...new Set([...typeSpecific, ...UNIVERSAL_FIELD_OPTIONS])];\n}\n\n/**\n * Drops the options a PocketBase field type does not support.\n *\n * @param fieldType - The resolved PocketBase field type\n * @param options - Options collected from the Zod schema or field metadata\n * @returns The supported subset, or undefined when nothing is left\n */\nexport function filterSupportedFieldOptions(\n fieldType: PocketBaseFieldType,\n options: Record<string, any> | undefined\n): Record<string, any> | undefined {\n if (!options) {\n return options;\n }\n\n const supported = SUPPORTED_FIELD_OPTIONS[fieldType];\n if (!supported) {\n return options;\n }\n\n const allowed = new Set<string>([...supported, ...UNIVERSAL_FIELD_OPTIONS]);\n const filtered: Record<string, any> = {};\n\n for (const [key, value] of Object.entries(options)) {\n if (allowed.has(key)) {\n filtered[key] = value;\n }\n }\n\n return Object.keys(filtered).length > 0 ? filtered : undefined;\n}\n\n/**\n * Gets the PocketBase field type with additional context\n */\nexport interface FieldTypeResult {\n type: PocketBaseFieldType;\n isMultiple: boolean;\n options: ExtractedFieldOptions;\n}\n\n/**\n * Comprehensive type mapping that returns full field information\n */\nexport function getFieldTypeInfo(zodType: z.ZodTypeAny, fieldName: string): FieldTypeResult {\n const type = mapZodTypeToPocketBase(zodType, fieldName);\n const isMultiple = isArrayType(zodType);\n const options = extractComprehensiveFieldOptions(zodType);\n\n return {\n type,\n isMultiple,\n options,\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 type { CollectionSchema, FieldDefinition, SchemaSnapshot } from \"./types\";\nimport { getSupportedFieldOptionKeys } from \"./utils/type-mapper\";\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 field options from direct properties\n // These take precedence over nested options\n //\n // The key list is the generator's own whitelist: anything the generator can\n // write has to be readable here, or replay loses it and every `db:generate`\n // re-emits the same modification\n const directOptionKeys = getSupportedFieldOptionKeys(pbField.type);\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.collectionId;\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 an array of raw PocketBase-shaped collection objects (as found\n * in snapshot arrays or produced by the execution engine) to a SchemaSnapshot\n *\n * @param rawCollections - Raw PocketBase collection objects\n * @returns SchemaSnapshot with collections map\n */\nexport function rawCollectionsToSnapshot(rawCollections: any[]): SchemaSnapshot {\n const collections = new Map<string, CollectionSchema>();\n\n for (const pbCollection of rawCollections) {\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}\n","/**\n * CollectionStore — the in-memory database state migrations execute against\n *\n * Keyed by collection id (migrations reference collections by id, name, or\n * the `_pb_users_auth_` alias; renames must not orphan entries). Cloning\n * serializes to plain objects and rebuilds, giving transaction semantics:\n * the runner clones, applies a migration to the clone, and commits with\n * replaceWith() only on success.\n */\n\nimport { rawCollectionsToSnapshot } from \"../pocketbase-converter\";\nimport type { SchemaSnapshot } from \"../types\";\nimport { Collection } from \"./collection\";\nimport { RecordStore } from \"./records\";\nimport type { RawCollection } from \"./types\";\n\n/** PocketBase's fixed id for the default users auth collection */\nconst USERS_AUTH_ID = \"_pb_users_auth_\";\n\nexport class CollectionStore {\n private byId = new Map<string, Collection>();\n\n /**\n * Rows, when record simulation is enabled. Always present so clone/commit\n * carry data through the same transaction as the schema; empty and\n * effectively free when only schema is being replayed.\n */\n readonly records = new RecordStore();\n\n list(): Collection[] {\n return [...this.byId.values()];\n }\n\n getById(id: string): Collection | undefined {\n return this.byId.get(id);\n }\n\n getByNameOrId(nameOrId: string): Collection | undefined {\n const byId = this.byId.get(nameOrId);\n if (byId) {\n return byId;\n }\n for (const collection of this.byId.values()) {\n if (collection.name === nameOrId) {\n return collection;\n }\n }\n // The users auth collection is addressable by its fixed system id even\n // when a snapshot stored it under a different id, and vice versa\n if (nameOrId === USERS_AUTH_ID) {\n return this.getByNameOrId(\"users\");\n }\n return undefined;\n }\n\n upsert(collection: Collection): void {\n this.byId.set(collection.id, collection);\n }\n\n removeById(id: string): boolean {\n // Dropping a collection drops its table with it\n this.records.dropCollection(id);\n return this.byId.delete(id);\n }\n\n /** Deep, independent copy (rebuilds Collection/FieldsList instances) */\n clone(): CollectionStore {\n const copy = new CollectionStore();\n for (const collection of this.byId.values()) {\n copy.upsert(new Collection(structuredClone(collection.serialize())));\n }\n // Rows are rebound to the copied collections, so a record's collection()\n // sees the schema of the transaction it is running in\n copy.records.replaceWith(this.records.clone((id) => copy.getById(id)));\n return copy;\n }\n\n /** Commit: adopt another store's state */\n replaceWith(other: CollectionStore): void {\n this.byId = new Map(other.byId);\n this.records.replaceWith(other.records);\n }\n\n serialize(): RawCollection[] {\n return this.list().map((collection) => collection.serialize());\n }\n\n /** Convert to the internal schema model used by diff/compare */\n toSnapshot(): SchemaSnapshot {\n return rawCollectionsToSnapshot(this.serialize());\n }\n}\n","/**\n * Replayer — folds an ordered list of migration files into a final state\n *\n * Mirrors what PocketBase does on `migrate up`: execute each unapplied file\n * in timestamp order. State reconstruction starts from an empty store; a\n * native snapshot migration (app.importCollections) is just the first file.\n *\n * Which files that is comes from `planMigrationReplay`: by default the newest\n * snapshot plus everything after it, or — when an applied-migrations list is\n * supplied — only the files PocketBase has actually run, starting from the\n * newest applied snapshot.\n */\n\nimport { executeMigrationFile } from \"./runner\";\nimport { planMigrationReplay, type MigrationPlan, type PlanOptions } from \"./migration-plan\";\nimport { CollectionStore } from \"./store\";\nimport type { EngineOptions, EngineWarning, ReplayResult } from \"./types\";\n\nexport function replayMigrations(\n files: string[],\n options: EngineOptions & { initialStore?: CollectionStore; plan?: MigrationPlan } = {}\n): ReplayResult {\n const { initialStore, plan, ...engineOptions } = options;\n const store = initialStore ?? new CollectionStore();\n const warnings: EngineWarning[] = [];\n const filesExecuted: string[] = [];\n\n for (const file of files) {\n const result = executeMigrationFile(file, store, engineOptions);\n warnings.push(...result.warnings);\n filesExecuted.push(file);\n }\n\n return {\n snapshot: store.toSnapshot(),\n store,\n warnings,\n filesExecuted,\n plan: plan ?? null,\n };\n}\n\n/**\n * Replays a pb_migrations directory: the snapshot the state starts from,\n * then every migration after it, in timestamp order.\n *\n * Pass `applied` (from `readAppliedMigrations`) to replay only what PocketBase\n * has actually run — otherwise every file on disk is assumed applied.\n *\n * Returns null when there is nothing to replay (an empty database).\n */\nexport function replayMigrationsDirectory(\n migrationsPath: string,\n options: EngineOptions & PlanOptions = {}\n): ReplayResult | null {\n const { applied, ...engineOptions } = options;\n const plan = planMigrationReplay(migrationsPath, { applied });\n\n if (plan.filesToReplay.length === 0) {\n return null;\n }\n\n return replayMigrations(plan.filesToReplay, { ...engineOptions, plan });\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 { MigrationExecutionError, FileSystemError, SnapshotError } from \"./errors\";\nimport type { AppliedMigrationsSource } from \"./engine/applied-migrations\";\nimport { replayMigrations, replayMigrationsDirectory } from \"./engine/replayer\";\nimport type { EngineOptions } from \"./engine/types\";\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 * Options forwarded to the execution engine, which reconstructs state by\n * executing migration files in a simulated PocketBase JSVM.\n */\n engineOptions?: EngineOptions;\n\n /**\n * Migrations PocketBase has actually applied, read from its `_migrations`\n * table (see `readAppliedMigrations`). When supplied, replay starts from\n * the newest applied snapshot and stops at the applied set, so a migration\n * written but not yet run does not leak into the reconstructed state.\n */\n appliedMigrations?: AppliedMigrationsSource | string[] | null;\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\" | \"engineOptions\" | \"appliedMigrations\"> &\n Pick<SnapshotConfig, \"migrationsPath\" | \"engineOptions\" | \"appliedMigrations\"> = {\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 * Reconstructs the current database state: executes the snapshot migration and\n * every migration after it in a simulated PocketBase JSVM.\n *\n * A migration that cannot be executed fails hard — continuing past it would\n * silently reconstruct the wrong state and cause the generator to emit\n * incorrect diffs.\n *\n * @param config - Snapshot configuration (must include migrationsPath)\n * @returns SchemaSnapshot representing the current state, or null when there is\n * nothing to replay (an empty database)\n */\nexport function loadSnapshotWithMigrations(config: SnapshotConfig = {}): SchemaSnapshot | null {\n const migrationsPath = config.migrationsPath;\n\n if (!migrationsPath) {\n return null;\n }\n\n try {\n // File path instead of a directory (backward compatibility with tests):\n // execute just that one file\n if (fs.existsSync(migrationsPath) && fs.statSync(migrationsPath).isFile()) {\n return replayMigrations([migrationsPath], config.engineOptions).snapshot;\n }\n\n const result = replayMigrationsDirectory(migrationsPath, {\n ...config.engineOptions,\n applied: config.appliedMigrations,\n });\n return result ? result.snapshot : null;\n } catch (error) {\n if (error instanceof MigrationExecutionError) {\n throw new SnapshotError(\n `Failed to execute migration ${error.filePath ?? \"<unknown>\"}: ${error.message}`,\n error.filePath,\n \"parse\",\n error\n );\n }\n throw error;\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 executes the snapshot file, not the migrations\n * after it. Use loadSnapshotWithMigrations() for the current state.\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 // A file path is treated as a direct snapshot file path\n const snapshotPath =\n fs.existsSync(migrationsPath) && fs.statSync(migrationsPath).isFile()\n ? migrationsPath\n : findLatestSnapshot(migrationsPath);\n\n if (!snapshotPath) {\n // No snapshot found - return null (empty database)\n return null;\n }\n\n try {\n return replayMigrations([snapshotPath], config.engineOptions).snapshot;\n } catch (error) {\n console.warn(`Failed to load snapshot from ${snapshotPath}: ${error}`);\n return null;\n }\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 // Execute the migration to reconstruct the state it defines\n return replayMigrations([migrationPath]).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 * 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 * 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"]}