pocketbase-zod-schema 0.2.3 → 0.2.5

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 (71) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +209 -24
  3. package/dist/cli/index.cjs +34 -0
  4. package/dist/cli/index.cjs.map +1 -1
  5. package/dist/cli/index.d.cts +3 -1
  6. package/dist/cli/index.d.ts +3 -1
  7. package/dist/cli/index.js +34 -0
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/cli/migrate.cjs +34 -0
  10. package/dist/cli/migrate.cjs.map +1 -1
  11. package/dist/cli/migrate.js +34 -0
  12. package/dist/cli/migrate.js.map +1 -1
  13. package/dist/cli/utils/index.d.cts +3 -1
  14. package/dist/cli/utils/index.d.ts +3 -1
  15. package/dist/fields-YjcpBXVp.d.cts +348 -0
  16. package/dist/fields-YjcpBXVp.d.ts +348 -0
  17. package/dist/index.cjs +833 -694
  18. package/dist/index.cjs.map +1 -1
  19. package/dist/index.d.cts +3 -4
  20. package/dist/index.d.ts +3 -4
  21. package/dist/index.js +818 -687
  22. package/dist/index.js.map +1 -1
  23. package/dist/migration/analyzer.cjs +34 -0
  24. package/dist/migration/analyzer.cjs.map +1 -1
  25. package/dist/migration/analyzer.d.cts +2 -1
  26. package/dist/migration/analyzer.d.ts +2 -1
  27. package/dist/migration/analyzer.js +34 -0
  28. package/dist/migration/analyzer.js.map +1 -1
  29. package/dist/migration/diff.d.cts +3 -1
  30. package/dist/migration/diff.d.ts +3 -1
  31. package/dist/migration/generator.d.cts +3 -1
  32. package/dist/migration/generator.d.ts +3 -1
  33. package/dist/migration/index.cjs +36 -0
  34. package/dist/migration/index.cjs.map +1 -1
  35. package/dist/migration/index.d.cts +2 -1
  36. package/dist/migration/index.d.ts +2 -1
  37. package/dist/migration/index.js +35 -1
  38. package/dist/migration/index.js.map +1 -1
  39. package/dist/migration/snapshot.cjs.map +1 -1
  40. package/dist/migration/snapshot.d.cts +3 -1
  41. package/dist/migration/snapshot.d.ts +3 -1
  42. package/dist/migration/snapshot.js.map +1 -1
  43. package/dist/migration/utils/index.cjs +16 -0
  44. package/dist/migration/utils/index.cjs.map +1 -1
  45. package/dist/migration/utils/index.d.cts +2 -2
  46. package/dist/migration/utils/index.d.ts +2 -2
  47. package/dist/migration/utils/index.js +15 -1
  48. package/dist/migration/utils/index.js.map +1 -1
  49. package/dist/mutator.cjs +2 -98
  50. package/dist/mutator.cjs.map +1 -1
  51. package/dist/mutator.d.cts +4 -31
  52. package/dist/mutator.d.ts +4 -31
  53. package/dist/mutator.js +2 -98
  54. package/dist/mutator.js.map +1 -1
  55. package/dist/schema.cjs +200 -78
  56. package/dist/schema.cjs.map +1 -1
  57. package/dist/schema.d.cts +1 -1
  58. package/dist/schema.d.ts +1 -1
  59. package/dist/schema.js +186 -72
  60. package/dist/schema.js.map +1 -1
  61. package/dist/{types-z1Dkjg8m.d.ts → types-LFBGHl9Y.d.ts} +2 -2
  62. package/dist/{types-BbTgmg6H.d.cts → types-mhQXWNi3.d.cts} +2 -2
  63. package/package.json +1 -6
  64. package/dist/types.cjs +0 -4
  65. package/dist/types.cjs.map +0 -1
  66. package/dist/types.d.cts +0 -14
  67. package/dist/types.d.ts +0 -14
  68. package/dist/types.js +0 -3
  69. package/dist/types.js.map +0 -1
  70. package/dist/user-BnFWg5tw.d.cts +0 -161
  71. package/dist/user-BnFWg5tw.d.ts +0 -161
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/schema/base.ts","../../src/migration/errors.ts","../../src/utils/permission-templates.ts","../../src/migration/rule-validator.ts","../../src/migration/permission-analyzer.ts","../../src/migration/utils/pluralize.ts","../../src/migration/utils/relation-detector.ts","../../src/migration/utils/type-mapper.ts","../../src/migration/analyzer.ts","../../src/migration/pocketbase-converter.ts","../../src/migration/migration-parser.ts","../../src/migration/snapshot.ts","../../src/migration/diff.ts","../../src/migration/generator.ts"],"names":["z","path","isAuthCollection","fs","ext","fs2","path2","SNAPSHOT_VERSION","DEFAULT_CONFIG","mergeConfig","path3","fs3","migrationContent","path4","fs4"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\nimport type { PermissionSchema, PermissionTemplateConfig } from \"../utils/permissions\";\n\n/**\n * Base schema fields that PocketBase automatically adds to all records\n * These fields are managed by PocketBase and should not be set manually\n */\nexport const baseSchema = {\n id: z.string().describe(\"unique id\"),\n collectionId: z.string().describe(\"collection id\"),\n collectionName: z.string().describe(\"collection name\"),\n expand: z.record(z.any()).describe(\"expandable fields\"),\n created: z.string().describe(\"creation timestamp\"),\n updated: z.string().describe(\"last update timestamp\"),\n};\n\n/**\n * Extended base schema with timestamp fields\n * Includes created and updated autodate fields\n */\nexport const baseSchemaWithTimestamps = {\n ...baseSchema,\n created: z.string().describe(\"creation timestamp\"),\n updated: z.string().describe(\"last update timestamp\"),\n};\n\n/**\n * Base schema for image file collections\n * Extends base schema with thumbnail URL and image files array\n */\nexport const baseImageFileSchema = {\n ...baseSchema,\n thumbnailURL: z.string().optional(),\n imageFiles: z.array(z.string()),\n};\n\n/**\n * Input schema for image file uploads\n * Used in forms where users upload File objects\n * Requires Node.js 20+ or browser environment with File API\n */\nexport const inputImageFileSchema = {\n imageFiles: z.array(z.instanceof(File)),\n};\n\n/**\n * Helper constant for omitting image files from schemas\n * Used with Zod's .omit() method\n */\nexport const omitImageFilesSchema = {\n imageFiles: true,\n} as const;\n\n// ============================================================================\n// Common PocketBase Field Type Patterns\n// ============================================================================\n\n/**\n * Creates a text field schema with optional constraints\n * @param options - Optional constraints for the text field\n */\nexport function textField(options?: { min?: number; max?: number; pattern?: RegExp }) {\n let schema = z.string();\n if (options?.min !== undefined) schema = schema.min(options.min);\n if (options?.max !== undefined) schema = schema.max(options.max);\n if (options?.pattern !== undefined) schema = schema.regex(options.pattern);\n return schema;\n}\n\n/**\n * Creates an email field schema\n * Maps to PocketBase 'email' field type\n */\nexport function emailField() {\n return z.string().email();\n}\n\n/**\n * Creates a URL field schema\n * Maps to PocketBase 'url' field type\n */\nexport function urlField() {\n return z.string().url();\n}\n\n/**\n * Creates a number field schema with optional constraints\n * @param options - Optional constraints for the number field\n */\nexport function numberField(options?: { min?: number; max?: number }) {\n let schema = z.number();\n if (options?.min !== undefined) schema = schema.min(options.min);\n if (options?.max !== undefined) schema = schema.max(options.max);\n return schema;\n}\n\n/**\n * Creates a boolean field schema\n * Maps to PocketBase 'bool' field type\n */\nexport function boolField() {\n return z.boolean();\n}\n\n/**\n * Creates a date field schema\n * Maps to PocketBase 'date' field type\n */\nexport function dateField() {\n return z.date();\n}\n\n/**\n * Creates a select field schema from enum values\n * Maps to PocketBase 'select' field type\n * @param values - Array of allowed string values\n */\nexport function selectField<T extends [string, ...string[]]>(values: T) {\n return z.enum(values);\n}\n\n/**\n * Creates a JSON field schema\n * Maps to PocketBase 'json' field type\n * @param schema - Optional Zod schema for the JSON structure\n */\nexport function jsonField<T extends z.ZodTypeAny>(schema?: T) {\n return schema ?? z.record(z.any());\n}\n\n/**\n * Creates a single file field schema for form input\n * Maps to PocketBase 'file' field type with maxSelect=1\n * Requires Node.js 20+ or browser environment with File API\n */\nexport function fileField() {\n return z.instanceof(File);\n}\n\n/**\n * Creates a multiple file field schema for form input\n * Maps to PocketBase 'file' field type with maxSelect>1\n * Requires Node.js 20+ or browser environment with File API\n * @param options - Optional constraints for the file field\n */\nexport function filesField(options?: { min?: number; max?: number }) {\n let schema = z.array(z.instanceof(File));\n if (options?.min !== undefined) schema = schema.min(options.min);\n if (options?.max !== undefined) schema = schema.max(options.max);\n return schema;\n}\n\n// ============================================================================\n// Relation Field Helpers - Explicit Relationship Definitions\n// ============================================================================\n\n/**\n * Relation field configuration options\n */\nexport interface RelationConfig {\n /**\n * Target collection name (e.g., 'users', 'posts', 'tags')\n * This is the PocketBase collection that the relation points to\n */\n collection: string;\n\n /**\n * Whether to cascade delete related records when this record is deleted\n * @default false\n */\n cascadeDelete?: boolean;\n}\n\n/**\n * Multiple relation field configuration options\n */\nexport interface RelationsConfig extends RelationConfig {\n /**\n * Minimum number of relations required\n * @default 0\n */\n minSelect?: number;\n\n /**\n * Maximum number of relations allowed\n * @default 999\n */\n maxSelect?: number;\n}\n\n/**\n * Internal marker for relation metadata\n * Used by the analyzer to detect explicit relation definitions\n */\nconst RELATION_METADATA_KEY = \"__pocketbase_relation__\";\n\n/**\n * Creates a single relation field schema with explicit collection target\n * Maps to PocketBase 'relation' field type with maxSelect=1\n *\n * This is the recommended way to define relations - it's explicit and doesn't\n * rely on naming conventions.\n *\n * @param config - Relation configuration with target collection\n * @returns Zod string schema with relation metadata\n *\n * @example\n * // Single relation to users collection\n * const PostSchema = z.object({\n * title: z.string(),\n * author: RelationField({ collection: 'users' }),\n * });\n *\n * @example\n * // Relation with cascade delete\n * const CommentSchema = z.object({\n * content: z.string(),\n * post: RelationField({ collection: 'posts', cascadeDelete: true }),\n * });\n */\nexport function RelationField(config: RelationConfig) {\n const metadata = {\n [RELATION_METADATA_KEY]: {\n type: \"single\",\n collection: config.collection,\n cascadeDelete: config.cascadeDelete ?? false,\n maxSelect: 1,\n minSelect: 0,\n },\n };\n\n return z.string().describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a multiple relation field schema with explicit collection target\n * Maps to PocketBase 'relation' field type with maxSelect>1\n *\n * This is the recommended way to define multi-relations - it's explicit and\n * doesn't rely on naming conventions.\n *\n * @param config - Relations configuration with target collection and limits\n * @returns Zod array of strings schema with relation metadata\n *\n * @example\n * // Multiple relations to tags collection\n * const PostSchema = z.object({\n * title: z.string(),\n * tags: RelationsField({ collection: 'tags' }),\n * });\n *\n * @example\n * // Relations with min/max constraints\n * const ProjectSchema = z.object({\n * title: z.string(),\n * collaborators: RelationsField({\n * collection: 'users',\n * minSelect: 1,\n * maxSelect: 10,\n * }),\n * });\n */\nexport function RelationsField(config: RelationsConfig) {\n const metadata = {\n [RELATION_METADATA_KEY]: {\n type: \"multiple\",\n collection: config.collection,\n cascadeDelete: config.cascadeDelete ?? false,\n maxSelect: config.maxSelect ?? 999,\n minSelect: config.minSelect ?? 0,\n },\n };\n\n let schema = z.array(z.string());\n\n // Apply array constraints for Zod validation\n if (config.minSelect !== undefined) {\n schema = schema.min(config.minSelect);\n }\n if (config.maxSelect !== undefined) {\n schema = schema.max(config.maxSelect);\n }\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Extracts relation metadata from a Zod type's description\n * Used internally by the analyzer to detect explicit relation definitions\n *\n * @param description - The Zod type's description string\n * @returns Relation metadata if present, null otherwise\n */\nexport function extractRelationMetadata(description: string | undefined): {\n type: \"single\" | \"multiple\";\n collection: string;\n cascadeDelete: boolean;\n maxSelect: number;\n minSelect: number;\n} | null {\n if (!description) return null;\n\n try {\n const parsed = JSON.parse(description);\n if (parsed[RELATION_METADATA_KEY]) {\n return parsed[RELATION_METADATA_KEY];\n }\n } catch {\n // Not JSON, ignore\n }\n\n return null;\n}\n\n/**\n * Creates an editor field schema (rich text)\n * Maps to PocketBase 'editor' field type\n */\nexport function editorField() {\n return z.string();\n}\n\n/**\n * Creates a geo point field schema\n * Maps to PocketBase 'geoPoint' field type\n */\nexport function geoPointField() {\n return z.object({\n lon: z.number(),\n lat: z.number(),\n });\n}\n\n/**\n * Attach permission metadata to a Zod schema\n *\n * This helper function allows you to define PocketBase API rules alongside your\n * entity schema definitions. The permissions are stored as metadata using Zod's\n * describe() method and will be extracted during migration generation.\n *\n * @param schema - The Zod schema to attach permissions to\n * @param config - Either a PermissionTemplateConfig (for template-based permissions)\n * or a PermissionSchema (for custom permissions)\n * @returns The schema with permission metadata attached\n *\n * @example\n * // Using a template\n * const ProjectSchema = withPermissions(\n * z.object({ title: z.string(), User: z.string() }),\n * { template: 'owner-only', ownerField: 'User' }\n * );\n *\n * @example\n * // Using custom rules\n * const ProjectSchema = withPermissions(\n * z.object({ title: z.string() }),\n * { listRule: '@request.auth.id != \"\"', viewRule: '' }\n * );\n *\n * @example\n * // Using template with custom rule overrides\n * const ProjectSchema = withPermissions(\n * z.object({ title: z.string(), User: z.string() }),\n * {\n * template: 'owner-only',\n * ownerField: 'User',\n * customRules: { listRule: '@request.auth.id != \"\"' }\n * }\n * );\n */\nexport function withPermissions<T extends z.ZodTypeAny>(\n schema: T,\n config: PermissionTemplateConfig | PermissionSchema\n): T {\n // Create metadata object with permissions config directly\n // The PermissionAnalyzer will handle resolving templates vs direct schemas\n const metadata = {\n permissions: config,\n };\n\n // Attach permission metadata to schema using Zod's describe() method\n // The metadata is serialized as JSON and stored in the schema's description\n return schema.describe(JSON.stringify(metadata)) as T;\n}\n\n/**\n * Attach index definitions to a Zod schema\n *\n * This helper function allows you to define PocketBase indexes alongside your\n * entity schema definitions. The indexes are stored as metadata using Zod's\n * describe() method and will be extracted during migration generation.\n *\n * @param schema - The Zod schema to attach indexes to\n * @param indexes - Array of PocketBase index SQL statements\n * @returns The schema with index metadata attached\n *\n * @example\n * // Define indexes for a user schema\n * const UserSchema = withIndexes(\n * withPermissions(\n * z.object({ name: z.string(), email: z.string().email() }),\n * userPermissions\n * ),\n * [\n * 'CREATE UNIQUE INDEX idx_users_email ON users (email)',\n * 'CREATE INDEX idx_users_name ON users (name)'\n * ]\n * );\n *\n * @example\n * // Single index\n * const ProjectSchema = withIndexes(\n * ProjectDatabaseSchema,\n * ['CREATE INDEX idx_projects_status ON projects (status)']\n * );\n */\nexport function withIndexes<T extends z.ZodTypeAny>(schema: T, indexes: string[]): T {\n // Extract existing metadata if present\n let existingMetadata: any = {};\n\n if (schema.description) {\n try {\n existingMetadata = JSON.parse(schema.description);\n } catch {\n // If description is not JSON, ignore it\n }\n }\n\n // Merge indexes with existing metadata\n const metadata = {\n ...existingMetadata,\n indexes,\n };\n\n // Attach metadata to schema using Zod's describe() method\n return schema.describe(JSON.stringify(metadata)) as T;\n}\n\n/**\n * Configuration options for defining a collection\n */\nexport interface CollectionConfig {\n /**\n * The name of the PocketBase collection\n * This will be used when generating migrations\n */\n collectionName: string;\n\n /**\n * The Zod schema definition for the collection\n */\n schema: z.ZodObject<any>;\n\n /**\n * Optional permission configuration\n * Can be a template-based config or custom permission rules\n */\n permissions?: PermissionTemplateConfig | PermissionSchema;\n\n /**\n * Optional array of index SQL statements\n * Example: ['CREATE UNIQUE INDEX idx_users_email ON users (email)']\n */\n indexes?: string[];\n\n /**\n * Optional collection type\n * - \"base\": Standard collection (default)\n * - \"auth\": Authentication collection with system auth fields\n *\n * If not specified, the type will be auto-detected based on field presence\n * (collections with both email and password fields are detected as auth)\n */\n type?: \"base\" | \"auth\";\n\n /**\n * Future extensibility - additional options can be added here\n */\n [key: string]: unknown;\n}\n\n/**\n * High-level wrapper for defining a PocketBase collection with all metadata\n *\n * This is the recommended way to define collections as it provides a single\n * entry point for collection name, schema, permissions, indexes, and future features.\n *\n * @param config - Collection configuration object\n * @returns The schema with all metadata attached\n *\n * @example\n * // Recommended: Use default export for clarity\n * const PostCollection = defineCollection({\n * collectionName: \"posts\",\n * schema: z.object({\n * title: z.string(),\n * content: z.string(),\n * author: RelationField({ collection: \"users\" }),\n * }),\n * permissions: {\n * template: \"owner-only\",\n * ownerField: \"author\",\n * },\n * });\n * export default PostCollection;\n *\n * @example\n * // Also supported: Named export (backward compatible)\n * export const PostCollection = defineCollection({\n * collectionName: \"posts\",\n * schema: z.object({\n * title: z.string(),\n * content: z.string(),\n * author: RelationField({ collection: \"users\" }),\n * }),\n * permissions: {\n * template: \"owner-only\",\n * ownerField: \"author\",\n * },\n * });\n *\n * @example\n * // Collection with permissions and indexes\n * export const UserSchema = defineCollection({\n * collectionName: \"users\",\n * schema: z.object({\n * name: z.string(),\n * email: z.string().email(),\n * }),\n * permissions: {\n * listRule: \"id = @request.auth.id\",\n * viewRule: \"id = @request.auth.id\",\n * createRule: \"\",\n * updateRule: \"id = @request.auth.id\",\n * deleteRule: \"id = @request.auth.id\",\n * },\n * indexes: [\n * \"CREATE UNIQUE INDEX idx_users_email ON users (email)\",\n * ],\n * });\n *\n * @example\n * // Collection with template and custom rule overrides\n * export const ProjectSchema = defineCollection({\n * collectionName: \"projects\",\n * schema: z.object({\n * title: z.string(),\n * owner: RelationField({ collection: \"users\" }),\n * }),\n * permissions: {\n * template: \"owner-only\",\n * ownerField: \"owner\",\n * customRules: {\n * listRule: '@request.auth.id != \"\"',\n * },\n * },\n * });\n */\nexport function defineCollection(config: CollectionConfig): z.ZodObject<any> {\n const { collectionName, schema, permissions, indexes, type, ...futureOptions } = config;\n\n // Build metadata object\n const metadata: any = {\n collectionName,\n };\n\n // Add type if provided\n if (type) {\n metadata.type = type;\n }\n\n // Add permissions if provided\n if (permissions) {\n metadata.permissions = permissions;\n }\n\n // Add indexes if provided\n if (indexes) {\n metadata.indexes = indexes;\n }\n\n // Add any future options\n if (Object.keys(futureOptions).length > 0) {\n Object.assign(metadata, futureOptions);\n }\n\n // Attach all metadata to schema using Zod's describe() method\n return schema.describe(JSON.stringify(metadata)) as z.ZodObject<any>;\n}\n","/**\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 type { PermissionSchema, PermissionTemplateConfig, RuleExpression } from \"../utils/permissions\";\n\n/**\n * Predefined permission templates for common access control patterns\n */\nexport const PermissionTemplates = {\n /**\n * Public access - anyone can perform all operations\n */\n public: (): PermissionSchema => ({\n listRule: \"\",\n viewRule: \"\",\n createRule: \"\",\n updateRule: \"\",\n deleteRule: \"\",\n }),\n\n /**\n * Authenticated users only - requires valid authentication for all operations\n */\n authenticated: (): PermissionSchema => ({\n listRule: '@request.auth.id != \"\"',\n viewRule: '@request.auth.id != \"\"',\n createRule: '@request.auth.id != \"\"',\n updateRule: '@request.auth.id != \"\"',\n deleteRule: '@request.auth.id != \"\"',\n }),\n\n /**\n * Owner-only access - users can only manage their own records\n * @param ownerField - Name of the relation field pointing to user (default: 'User')\n */\n ownerOnly: (ownerField: string = \"User\"): PermissionSchema => ({\n listRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n viewRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n createRule: '@request.auth.id != \"\"',\n updateRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n deleteRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n }),\n\n /**\n * Admin/superuser only access\n * Assumes a 'role' field exists with 'admin' value\n * @param roleField - Name of the role field (default: 'role')\n */\n adminOnly: (roleField: string = \"role\"): PermissionSchema => ({\n listRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n viewRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n createRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n updateRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n deleteRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n }),\n\n /**\n * Public read, authenticated write\n * Anyone can list/view, but only authenticated users can create/update/delete\n */\n readPublic: (): PermissionSchema => ({\n listRule: \"\",\n viewRule: \"\",\n createRule: '@request.auth.id != \"\"',\n updateRule: '@request.auth.id != \"\"',\n deleteRule: '@request.auth.id != \"\"',\n }),\n\n /**\n * Locked access - only superusers can perform operations\n * All rules are set to null (locked)\n */\n locked: (): PermissionSchema => ({\n listRule: null,\n viewRule: null,\n createRule: null,\n updateRule: null,\n deleteRule: null,\n }),\n\n /**\n * Read-only authenticated - authenticated users can read, no write access\n */\n readOnlyAuthenticated: (): PermissionSchema => ({\n listRule: '@request.auth.id != \"\"',\n viewRule: '@request.auth.id != \"\"',\n createRule: null,\n updateRule: null,\n deleteRule: null,\n }),\n};\n\n/**\n * Resolve template configuration to concrete permission schema\n * @param config - Template configuration or direct permission schema\n * @returns Resolved permission schema with all rules defined\n */\nexport function resolveTemplate(config: PermissionTemplateConfig): PermissionSchema {\n let baseRules: PermissionSchema;\n\n switch (config.template) {\n case \"public\":\n baseRules = PermissionTemplates.public();\n break;\n case \"authenticated\":\n baseRules = PermissionTemplates.authenticated();\n break;\n case \"owner-only\":\n baseRules = PermissionTemplates.ownerOnly(config.ownerField);\n break;\n case \"admin-only\":\n baseRules = PermissionTemplates.adminOnly(config.roleField);\n break;\n case \"read-public\":\n baseRules = PermissionTemplates.readPublic();\n break;\n case \"custom\":\n baseRules = {};\n break;\n default: {\n // Exhaustive check - TypeScript will error if we miss a template type\n const _exhaustive: never = config.template;\n throw new Error(`Unknown template type: ${_exhaustive}`);\n }\n }\n\n // Merge with custom rules if provided (custom rules override template rules)\n return {\n ...baseRules,\n ...config.customRules,\n };\n}\n\n/**\n * Check if a configuration is a template config or direct permission schema\n * @param config - Configuration to check\n * @returns True if it's a template configuration\n */\nexport function isTemplateConfig(\n config: PermissionTemplateConfig | PermissionSchema\n): config is PermissionTemplateConfig {\n return \"template\" in config;\n}\n\n/**\n * Check if a configuration is a direct permission schema\n * @param config - Configuration to check\n * @returns True if it's a direct permission schema\n */\nexport function isPermissionSchema(config: PermissionTemplateConfig | PermissionSchema): config is PermissionSchema {\n return (\n \"listRule\" in config ||\n \"viewRule\" in config ||\n \"createRule\" in config ||\n \"updateRule\" in config ||\n \"deleteRule\" in config ||\n \"manageRule\" in config\n );\n}\n\n/**\n * Validation result for permission configuration\n */\nexport interface PermissionValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate a permission configuration\n * @param config - Permission configuration to validate\n * @param isAuthCollection - Whether this is for an auth collection\n * @returns Validation result\n */\nexport function validatePermissionConfig(\n config: PermissionTemplateConfig | PermissionSchema,\n isAuthCollection: boolean = false\n): PermissionValidationResult {\n const result: PermissionValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n };\n\n // Resolve to permission schema\n let permissions: PermissionSchema;\n if (isTemplateConfig(config)) {\n // Validate template config\n if (config.template === \"owner-only\" && !config.ownerField) {\n result.warnings.push(\"owner-only template without ownerField specified - using default 'User'\");\n }\n if (config.template === \"admin-only\" && !config.roleField) {\n result.warnings.push(\"admin-only template without roleField specified - using default 'role'\");\n }\n permissions = resolveTemplate(config);\n } else {\n permissions = config;\n }\n\n // Validate manageRule usage\n if (permissions.manageRule !== undefined && !isAuthCollection) {\n result.errors.push(\"manageRule is only valid for auth collections\");\n result.valid = false;\n }\n\n // Validate rule expressions\n const ruleTypes: (keyof PermissionSchema)[] = [\"listRule\", \"viewRule\", \"createRule\", \"updateRule\", \"deleteRule\"];\n if (isAuthCollection) {\n ruleTypes.push(\"manageRule\");\n }\n\n for (const ruleType of ruleTypes) {\n const rule = permissions[ruleType];\n if (rule !== undefined && rule !== null && rule !== \"\") {\n const ruleValidation = validateRuleExpression(rule);\n if (!ruleValidation.valid) {\n result.errors.push(`${ruleType}: ${ruleValidation.errors.join(\", \")}`);\n result.valid = false;\n }\n result.warnings.push(...ruleValidation.warnings.map((w) => `${ruleType}: ${w}`));\n }\n }\n\n return result;\n}\n\n/**\n * Validate a single rule expression for basic syntax\n * @param expression - Rule expression to validate\n * @returns Validation result\n */\nexport function validateRuleExpression(expression: RuleExpression): PermissionValidationResult {\n const result: PermissionValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n };\n\n // Null and empty string are always valid\n if (expression === null || expression === \"\") {\n return result;\n }\n\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of expression) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n result.errors.push(\"Unbalanced parentheses\");\n result.valid = false;\n return result;\n }\n }\n if (parenCount !== 0) {\n result.errors.push(\"Unbalanced parentheses\");\n result.valid = false;\n }\n\n // Check for common mistakes\n if (expression.includes(\"==\")) {\n result.warnings.push(\"Use '=' instead of '==' for equality comparison\");\n }\n\n // Check for valid @request references\n const requestRefs = expression.match(/@request\\.[a-zA-Z_][a-zA-Z0-9_.]*/g) || [];\n for (const ref of requestRefs) {\n const isValid =\n ref.startsWith(\"@request.auth.\") ||\n ref === \"@request.method\" ||\n ref === \"@request.context\" ||\n ref.startsWith(\"@request.body.\") ||\n ref.startsWith(\"@request.query.\") ||\n ref.startsWith(\"@request.headers.\");\n\n if (!isValid) {\n result.errors.push(`Invalid @request reference: '${ref}'`);\n result.valid = false;\n }\n }\n\n return result;\n}\n\n/**\n * Create a custom permission schema with type safety\n * @param permissions - Partial permission schema\n * @returns Complete permission schema with null defaults\n */\nexport function createPermissions(permissions: Partial<PermissionSchema>): PermissionSchema {\n return {\n listRule: permissions.listRule ?? null,\n viewRule: permissions.viewRule ?? null,\n createRule: permissions.createRule ?? null,\n updateRule: permissions.updateRule ?? null,\n deleteRule: permissions.deleteRule ?? null,\n manageRule: permissions.manageRule ?? null,\n };\n}\n\n/**\n * Merge multiple permission schemas, with later schemas taking precedence\n * @param schemas - Permission schemas to merge\n * @returns Merged permission schema\n */\nexport function mergePermissions(...schemas: Partial<PermissionSchema>[]): PermissionSchema {\n const merged: PermissionSchema = {\n listRule: null,\n viewRule: null,\n createRule: null,\n updateRule: null,\n deleteRule: null,\n manageRule: null,\n };\n\n for (const schema of schemas) {\n if (schema.listRule !== undefined) merged.listRule = schema.listRule;\n if (schema.viewRule !== undefined) merged.viewRule = schema.viewRule;\n if (schema.createRule !== undefined) merged.createRule = schema.createRule;\n if (schema.updateRule !== undefined) merged.updateRule = schema.updateRule;\n if (schema.deleteRule !== undefined) merged.deleteRule = schema.deleteRule;\n if (schema.manageRule !== undefined) merged.manageRule = schema.manageRule;\n }\n\n return merged;\n}\n","/**\n * Rule validator for PocketBase API rule expressions\n *\n * Validates permission rule expressions against PocketBase syntax rules,\n * including field references, @request references, and basic syntax validation.\n */\n\nimport type { APIRuleType, RuleExpression } from \"../utils/permissions\";\nimport type { FieldDefinition } from \"./types\";\n\n/**\n * Validation result for rule expressions\n */\nexport interface RuleValidationResult {\n /** Whether the rule expression is valid */\n valid: boolean;\n\n /** List of validation errors */\n errors: string[];\n\n /** List of validation warnings */\n warnings: string[];\n\n /** List of field references found in the expression */\n fieldReferences: string[];\n}\n\n/**\n * Rule expression validator\n *\n * Validates PocketBase API rule expressions for:\n * - Field reference existence and validity\n * - @request reference syntax\n * - Basic expression syntax (parentheses, operators)\n * - Auth collection specific rules (manageRule)\n */\nexport class RuleValidator {\n private fields: Map<string, FieldDefinition>;\n private collectionName: string;\n private isAuthCollection: boolean;\n\n constructor(collectionName: string, fields: FieldDefinition[], isAuthCollection: boolean = false) {\n this.collectionName = collectionName;\n this.fields = new Map(fields.map((f) => [f.name, f]));\n this.isAuthCollection = isAuthCollection;\n\n // Add system fields that are always available in PocketBase\n this.addSystemFields();\n }\n\n /**\n * Add system fields that are always available in PocketBase collections\n * These fields are automatically added by PocketBase and can be referenced in rules\n */\n private addSystemFields(): void {\n // Base system fields available in all collections\n const systemFields: FieldDefinition[] = [\n { name: \"id\", type: \"text\", required: true, options: {} },\n { name: \"created\", type: \"date\", required: true, options: {} },\n { name: \"updated\", type: \"date\", required: true, options: {} },\n { name: \"collectionId\", type: \"text\", required: true, options: {} },\n { name: \"collectionName\", type: \"text\", required: true, options: {} },\n ];\n\n // Auth collection specific system fields\n if (this.isAuthCollection) {\n systemFields.push(\n { name: \"email\", type: \"email\", required: true, options: {} },\n { name: \"emailVisibility\", type: \"bool\", required: false, options: {} },\n { name: \"verified\", type: \"bool\", required: false, options: {} },\n { name: \"tokenKey\", type: \"text\", required: true, options: {} },\n { name: \"password\", type: \"text\", required: true, options: {} }\n );\n }\n\n // Add system fields to the fields map (don't overwrite user-defined fields)\n for (const field of systemFields) {\n if (!this.fields.has(field.name)) {\n this.fields.set(field.name, field);\n }\n }\n }\n\n /**\n * Validate a rule expression\n *\n * @param ruleType - The type of rule being validated\n * @param expression - The rule expression to validate\n * @returns Validation result with errors, warnings, and field references\n */\n validate(ruleType: APIRuleType, expression: RuleExpression): RuleValidationResult {\n const result: RuleValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n fieldReferences: [],\n };\n\n // Null means locked (superuser only) - always valid\n if (expression === null) {\n return result;\n }\n\n // Empty string means public - always valid but warn\n if (expression === \"\") {\n result.warnings.push(`${ruleType} is public - anyone can perform this operation`);\n return result;\n }\n\n // Validate manageRule only for auth collections\n if (ruleType === \"manageRule\" && !this.isAuthCollection) {\n result.valid = false;\n result.errors.push(\"manageRule is only valid for auth collections\");\n return result;\n }\n\n // Extract and validate field references\n const fieldRefs = this.extractFieldReferences(expression);\n result.fieldReferences = fieldRefs;\n\n for (const fieldRef of fieldRefs) {\n this.validateFieldReference(fieldRef, result);\n }\n\n // Validate @request references\n this.validateRequestReferences(expression, result);\n\n // Validate syntax patterns\n this.validateSyntax(expression, result);\n\n return result;\n }\n\n /**\n * Extract field references from expression\n *\n * Matches field names that are not @request references.\n * Handles dot notation for relations: user.email, post.author.name\n *\n * @param expression - The rule expression\n * @returns Array of unique field references\n */\n private extractFieldReferences(expression: string): string[] {\n const refs: string[] = [];\n\n // First, remove string literals and @request references to avoid matching them\n let cleaned = expression.replace(/\"[^\"]*\"/g, '\"\"').replace(/'[^']*'/g, \"''\");\n cleaned = cleaned.replace(/@request\\.[a-zA-Z_][a-zA-Z0-9_.]*/g, \"\");\n\n // Match field names (not starting with @)\n // Handles dot notation for relations: user.email, post.author.name\n const fieldPattern = /(?:^|[^@\\w])([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)(?=[^a-zA-Z0-9_.]|$)/g;\n\n let match;\n while ((match = fieldPattern.exec(cleaned)) !== null) {\n const ref = match[1];\n // Exclude PocketBase keywords and operators\n if (!this.isKeyword(ref)) {\n refs.push(ref);\n }\n }\n\n return [...new Set(refs)]; // Remove duplicates\n }\n\n /**\n * Check if a word is a PocketBase keyword\n *\n * @param word - The word to check\n * @returns True if the word is a keyword\n */\n private isKeyword(word: string): boolean {\n const keywords = [\"true\", \"false\", \"null\", \"AND\", \"OR\", \"NOT\", \"LIKE\", \"IN\"];\n return keywords.includes(word.toUpperCase());\n }\n\n /**\n * Validate a field reference exists in schema\n *\n * Checks if the root field exists and validates relation chains.\n * For nested references, warns about potential issues since we can't\n * validate across collections without loading related schemas.\n *\n * @param fieldRef - The field reference to validate (e.g., \"user\" or \"user.email\")\n * @param result - The validation result to update\n */\n private validateFieldReference(fieldRef: string, result: RuleValidationResult): void {\n const parts = fieldRef.split(\".\");\n const rootField = parts[0];\n\n if (!this.fields.has(rootField)) {\n result.errors.push(`Field '${rootField}' does not exist in collection '${this.collectionName}'`);\n result.valid = false;\n return;\n }\n\n // For nested references, validate relation chain\n if (parts.length > 1) {\n const field = this.fields.get(rootField)!;\n if (field.type !== \"relation\") {\n result.errors.push(`Field '${rootField}' is not a relation field, cannot access nested property '${parts[1]}'`);\n result.valid = false;\n } else {\n // Note: We can't validate nested fields without loading related schemas\n // This would require cross-schema validation\n result.warnings.push(\n `Nested field reference '${fieldRef}' - ensure target collection has field '${parts.slice(1).join(\".\")}'`\n );\n }\n }\n }\n\n /**\n * Validate @request references\n *\n * Checks that @request references follow valid PocketBase patterns:\n * - @request.auth.* - authenticated user data\n * - @request.body.* - request body fields\n * - @request.query.* - query parameters\n * - @request.headers.* - request headers\n * - @request.method - HTTP method\n * - @request.context - execution context\n *\n * @param expression - The rule expression\n * @param result - The validation result to update\n */\n private validateRequestReferences(expression: string, result: RuleValidationResult): void {\n // Find all @request references\n const requestRefs = expression.match(/@request\\.[a-zA-Z_][a-zA-Z0-9_.]*/g) || [];\n\n for (const ref of requestRefs) {\n // Check if the reference starts with a valid pattern\n const isValid =\n ref.startsWith(\"@request.auth.\") ||\n ref === \"@request.method\" ||\n ref === \"@request.context\" ||\n ref.startsWith(\"@request.body.\") ||\n ref.startsWith(\"@request.query.\") ||\n ref.startsWith(\"@request.headers.\");\n\n if (!isValid) {\n result.errors.push(`Invalid @request reference: '${ref}'`);\n result.valid = false;\n }\n }\n }\n\n /**\n * Validate basic syntax patterns\n *\n * Checks for:\n * - Balanced parentheses\n * - Common operator mistakes (== instead of =)\n *\n * @param expression - The rule expression\n * @param result - The validation result to update\n */\n private validateSyntax(expression: string, result: RuleValidationResult): void {\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of expression) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n result.errors.push(\"Unbalanced parentheses in expression\");\n result.valid = false;\n return;\n }\n }\n if (parenCount !== 0) {\n result.errors.push(\"Unbalanced parentheses in expression\");\n result.valid = false;\n }\n\n // Warn about common mistakes\n if (expression.includes(\"==\")) {\n result.warnings.push(\"Use '=' instead of '==' for equality comparison in PocketBase rules\");\n }\n }\n}\n","/**\n * Permission analyzer for extracting and validating permissions from Zod schemas\n *\n * This module provides utilities to:\n * - Extract permission metadata from Zod schema descriptions\n * - Resolve template configurations to concrete permission schemas\n * - Validate permission rules against collection fields\n * - Merge permissions with default values\n */\n\nimport { resolveTemplate } from \"../utils/permission-templates\";\nimport type { APIRuleType, PermissionSchema, PermissionTemplateConfig } from \"../utils/permissions\";\nimport type { RuleValidationResult } from \"./rule-validator\";\nimport { RuleValidator } from \"./rule-validator\";\nimport type { FieldDefinition } from \"./types\";\n\n/**\n * Extract and analyze permissions from schema\n *\n * The PermissionAnalyzer class provides methods to work with permission\n * definitions attached to Zod schemas, including extraction, resolution,\n * validation, and normalization.\n */\nexport class PermissionAnalyzer {\n /**\n * Extract permission metadata from Zod schema description\n *\n * Zod schemas can have permission metadata attached via the describe() method.\n * This method parses the description and extracts the permission configuration.\n *\n * @param schemaDescription - The Zod schema description string\n * @returns Permission schema if found, null otherwise\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n * const permissions = analyzer.extractPermissions(schema.description);\n * ```\n */\n extractPermissions(schemaDescription: string | undefined): PermissionSchema | null {\n if (!schemaDescription) {\n return null;\n }\n\n try {\n const metadata = JSON.parse(schemaDescription);\n if (metadata.permissions) {\n return metadata.permissions;\n }\n } catch {\n // Not JSON or no permissions - this is expected for schemas without permissions\n return null;\n }\n\n return null;\n }\n\n /**\n * Resolve template configuration to concrete rules\n *\n * Takes either a template configuration or a direct permission schema\n * and returns a fully resolved permission schema with all rules defined.\n *\n * If the input is already a permission schema (has rule properties),\n * it's returned as-is. Otherwise, the template is resolved using the\n * template resolver.\n *\n * @param config - Template configuration or direct permission schema\n * @returns Resolved permission schema\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n *\n * // Resolve from template\n * const permissions = analyzer.resolvePermissions({\n * template: 'owner-only',\n * ownerField: 'User'\n * });\n *\n * // Or pass direct schema\n * const permissions = analyzer.resolvePermissions({\n * listRule: '@request.auth.id != \"\"',\n * viewRule: '@request.auth.id != \"\"'\n * });\n * ```\n */\n resolvePermissions(config: PermissionTemplateConfig | PermissionSchema): PermissionSchema {\n // If it's already a permission schema (has rule properties), return as-is\n if (\n \"listRule\" in config ||\n \"viewRule\" in config ||\n \"createRule\" in config ||\n \"updateRule\" in config ||\n \"deleteRule\" in config ||\n \"manageRule\" in config\n ) {\n return config as PermissionSchema;\n }\n\n // Otherwise resolve template\n return resolveTemplate(config as PermissionTemplateConfig);\n }\n\n /**\n * Validate all rules in a permission schema\n *\n * Validates each rule in the permission schema against the collection's\n * field definitions. Returns a map of validation results keyed by rule type.\n *\n * Only validates rules that are defined (not undefined). Undefined rules\n * are treated as null (locked) by default.\n *\n * @param collectionName - Name of the collection being validated\n * @param permissions - Permission schema to validate\n * @param fields - Collection field definitions\n * @param isAuthCollection - Whether this is an auth collection (allows manageRule)\n * @returns Map of validation results by rule type\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n * const results = analyzer.validatePermissions(\n * 'posts',\n * { listRule: '@request.auth.id != \"\"', viewRule: 'author = @request.auth.id' },\n * fields,\n * false\n * );\n *\n * for (const [ruleType, result] of results) {\n * if (!result.valid) {\n * console.error(`${ruleType} validation failed:`, result.errors);\n * }\n * }\n * ```\n */\n validatePermissions(\n collectionName: string,\n permissions: PermissionSchema,\n fields: FieldDefinition[],\n isAuthCollection: boolean = false\n ): Map<APIRuleType, RuleValidationResult> {\n const validator = new RuleValidator(collectionName, fields, isAuthCollection);\n const results = new Map<APIRuleType, RuleValidationResult>();\n\n // Define all possible rule types\n const ruleTypes: APIRuleType[] = [\"listRule\", \"viewRule\", \"createRule\", \"updateRule\", \"deleteRule\"];\n\n // Add manageRule for auth collections\n if (isAuthCollection) {\n ruleTypes.push(\"manageRule\");\n }\n\n // Validate each defined rule\n for (const ruleType of ruleTypes) {\n const expression = permissions[ruleType];\n if (expression !== undefined) {\n results.set(ruleType, validator.validate(ruleType, expression));\n }\n }\n\n return results;\n }\n\n /**\n * Merge permissions with defaults\n *\n * Ensures all rule types have a defined value. Undefined rules are set\n * to null (locked to superusers only), which is the PocketBase default.\n *\n * This is useful when generating migrations to ensure all rules are\n * explicitly set in the collection configuration.\n *\n * @param permissions - Permission schema (may have undefined rules)\n * @returns Permission schema with all rules defined (null if not specified)\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n * const merged = analyzer.mergeWithDefaults({\n * listRule: '@request.auth.id != \"\"'\n * // other rules undefined\n * });\n *\n * // Result:\n * // {\n * // listRule: '@request.auth.id != \"\"',\n * // viewRule: null,\n * // createRule: null,\n * // updateRule: null,\n * // deleteRule: null,\n * // manageRule: null\n * // }\n * ```\n */\n mergeWithDefaults(permissions: PermissionSchema): PermissionSchema {\n return {\n listRule: permissions.listRule ?? null,\n viewRule: permissions.viewRule ?? null,\n createRule: permissions.createRule ?? null,\n updateRule: permissions.updateRule ?? null,\n deleteRule: permissions.deleteRule ?? null,\n manageRule: permissions.manageRule ?? null,\n };\n }\n}\n","/**\n * Collection name pluralization utilities\n */\n\n/**\n * Special case pluralization rules\n * Maps singular forms to their plural forms\n */\nconst SPECIAL_CASES: Record<string, string> = {\n // Common irregular plurals\n person: \"people\",\n Person: \"People\",\n child: \"children\",\n Child: \"Children\",\n man: \"men\",\n Man: \"Men\",\n woman: \"women\",\n Woman: \"Women\",\n tooth: \"teeth\",\n Tooth: \"Teeth\",\n foot: \"feet\",\n Foot: \"Feet\",\n mouse: \"mice\",\n Mouse: \"Mice\",\n goose: \"geese\",\n Goose: \"Geese\",\n\n // Words ending in -y\n category: \"categories\",\n Category: \"Categories\",\n company: \"companies\",\n Company: \"Companies\",\n city: \"cities\",\n City: \"Cities\",\n country: \"countries\",\n Country: \"Countries\",\n story: \"stories\",\n Story: \"Stories\",\n party: \"parties\",\n Party: \"Parties\",\n family: \"families\",\n Family: \"Families\",\n activity: \"activities\",\n Activity: \"Activities\",\n priority: \"priorities\",\n Priority: \"Priorities\",\n\n // Words ending in -f or -fe\n life: \"lives\",\n Life: \"Lives\",\n wife: \"wives\",\n Wife: \"Wives\",\n knife: \"knives\",\n Knife: \"Knives\",\n leaf: \"leaves\",\n Leaf: \"Leaves\",\n shelf: \"shelves\",\n Shelf: \"Shelves\",\n half: \"halves\",\n Half: \"Halves\",\n\n // Words ending in -is\n analysis: \"analyses\",\n Analysis: \"Analyses\",\n basis: \"bases\",\n Basis: \"Bases\",\n crisis: \"crises\",\n Crisis: \"Crises\",\n thesis: \"theses\",\n Thesis: \"Theses\",\n\n // Words ending in -us\n cactus: \"cacti\",\n Cactus: \"Cacti\",\n focus: \"foci\",\n Focus: \"Foci\",\n fungus: \"fungi\",\n Fungus: \"Fungi\",\n nucleus: \"nuclei\",\n Nucleus: \"Nuclei\",\n radius: \"radii\",\n Radius: \"Radii\",\n\n // Words ending in -on\n phenomenon: \"phenomena\",\n Phenomenon: \"Phenomena\",\n criterion: \"criteria\",\n Criterion: \"Criteria\",\n\n // Words ending in -um\n datum: \"data\",\n Datum: \"Data\",\n medium: \"media\",\n Medium: \"Media\",\n curriculum: \"curricula\",\n Curriculum: \"Curricula\",\n\n // Unchanged plurals\n sheep: \"sheep\",\n Sheep: \"Sheep\",\n deer: \"deer\",\n Deer: \"Deer\",\n fish: \"fish\",\n Fish: \"Fish\",\n species: \"species\",\n Species: \"Species\",\n series: \"series\",\n Series: \"Series\",\n};\n\n/**\n * Pluralizes a singular noun to its plural form\n * Handles special cases and common English pluralization rules\n *\n * @param singular - The singular form of the noun\n * @returns The plural form of the noun\n */\nexport function pluralize(singular: string): string {\n // Check special cases first (before checking if already plural)\n if (SPECIAL_CASES[singular]) {\n return SPECIAL_CASES[singular];\n }\n\n // Check if it's already plural (ends with 's' and is longer than 3 chars)\n if (singular.length > 3 && singular.endsWith(\"s\") && !singular.endsWith(\"ss\")) {\n // Could already be plural, return as-is\n return singular;\n }\n\n // Preserve case for the transformation\n const lowerSingular = singular.toLowerCase();\n\n let plural: string;\n\n // Rule 1: Words ending in -s, -ss, -sh, -ch, -x, -z -> add -es\n if (/(?:s|ss|sh|ch|x|z)$/.test(lowerSingular)) {\n plural = singular + \"es\";\n }\n // Rule 2: Words ending in consonant + y -> change y to ies\n else if (/[^aeiou]y$/.test(lowerSingular)) {\n plural = singular.slice(0, -1) + \"ies\";\n }\n // Rule 3: Words ending in consonant + o -> add -es\n else if (/[^aeiou]o$/.test(lowerSingular)) {\n plural = singular + \"es\";\n }\n // Rule 4: Words ending in -f or -fe -> change to -ves\n else if (/fe?$/.test(lowerSingular)) {\n if (lowerSingular.endsWith(\"fe\")) {\n plural = singular.slice(0, -2) + \"ves\";\n } else {\n plural = singular.slice(0, -1) + \"ves\";\n }\n }\n // Rule 5: Default -> add -s\n else {\n plural = singular + \"s\";\n }\n\n return plural;\n}\n\n/**\n * Converts a singular entity name to a collection name\n * This is an alias for pluralize for better semantic clarity\n *\n * @param entityName - The singular entity name (e.g., \"User\", \"Project\")\n * @returns The collection name (e.g., \"Users\", \"Projects\")\n */\nexport function toCollectionName(entityName: string): string {\n return pluralize(entityName);\n}\n\n/**\n * Attempts to singularize a plural noun (reverse of pluralize)\n * Note: This is a best-effort implementation and may not handle all edge cases\n *\n * @param plural - The plural form of the noun\n * @returns The singular form of the noun\n */\nexport function singularize(plural: string): string {\n // Check reverse special cases\n for (const [singular, pluralForm] of Object.entries(SPECIAL_CASES)) {\n if (pluralForm === plural) {\n return singular;\n }\n }\n\n const lower = plural.toLowerCase();\n\n // Rule 1: Words ending in -ies -> change to -y\n if (lower.endsWith(\"ies\") && plural.length > 3) {\n return plural.slice(0, -3) + \"y\";\n }\n\n // Rule 2: Words ending in -ves -> change to -f or -fe\n if (lower.endsWith(\"ves\")) {\n // Try -fe first (more common)\n return plural.slice(0, -3) + \"fe\";\n }\n\n // Rule 3: Words ending in -ses, -shes, -ches, -xes, -zes -> remove -es\n if (/(?:ses|shes|ches|xes|zes)$/.test(lower)) {\n return plural.slice(0, -2);\n }\n\n // Rule 4: Words ending in -s -> remove -s\n if (lower.endsWith(\"s\") && plural.length > 1) {\n return plural.slice(0, -1);\n }\n\n // Default: return as-is\n return plural;\n}\n","/**\n * Relation field detection utilities\n */\n\nimport { z } from \"zod\";\nimport { pluralize } from \"./pluralize\";\n\n/**\n * Detects if a field is a single relation based on naming convention\n * Single relation: field name matches a collection name (e.g., \"User\" -> \"Users\" collection)\n */\nexport function isSingleRelationField(fieldName: string, zodType: z.ZodTypeAny): boolean {\n // Unwrap optional/nullable/default\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n // Must be a string type\n if (!(unwrappedType instanceof z.ZodString)) {\n return false;\n }\n\n // Field name should start with uppercase (convention for entity references)\n // and not be a common string field name\n const startsWithUppercase = /^[A-Z]/.test(fieldName);\n\n // Exclude common string fields that start with uppercase\n const commonStringFields = [\"Title\", \"Name\", \"Description\", \"Content\", \"Summary\", \"Status\", \"Type\"];\n const isCommonField = commonStringFields.includes(fieldName);\n\n return startsWithUppercase && !isCommonField;\n}\n\n/**\n * Detects if a field is a multiple relation based on naming convention\n * Multiple relation: field name is an array of strings ending with entity name\n * (e.g., \"SubscriberUsers\" -> \"Users\" collection)\n */\nexport function isMultipleRelationField(fieldName: string, zodType: z.ZodTypeAny): boolean {\n // Unwrap optional/nullable/default\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n // Must be an array type\n if (!(unwrappedType instanceof z.ZodArray)) {\n return false;\n }\n\n // Element type must be string\n const elementType = unwrappedType._def.type;\n if (!(elementType instanceof z.ZodString)) {\n return false;\n }\n\n // Field name should contain an uppercase letter (entity reference pattern)\n const hasUppercase = /[A-Z]/.test(fieldName);\n\n return hasUppercase;\n}\n\n/**\n * Resolves the target collection name from a relation field name\n * Examples:\n * - \"User\" -> \"Users\"\n * - \"SubscriberUsers\" -> \"Users\"\n * - \"Author\" -> \"Authors\"\n * - \"Category\" -> \"Categories\"\n */\nexport function resolveTargetCollection(fieldName: string): string {\n // For single relations, the field name is typically the entity name\n // For multiple relations, extract the entity name from the end\n\n // Check if field name ends with a known plural entity name\n // Common patterns: \"SubscriberUsers\", \"RelatedPosts\", \"Tags\"\n\n // Try to find the entity name by looking for uppercase letters\n const matches = fieldName.match(/[A-Z][a-z]+/g);\n\n if (!matches || matches.length === 0) {\n // Fallback: pluralize the entire field name\n return pluralize(fieldName);\n }\n\n // Take the last matched entity name (e.g., \"Users\" from \"SubscriberUsers\")\n const entityName = matches[matches.length - 1];\n\n // Pluralize the entity name to get collection name\n return pluralize(entityName);\n}\n\n/**\n * Detects if a field is any type of relation (single or multiple)\n */\nexport function isRelationField(fieldName: string, zodType: z.ZodTypeAny): boolean {\n return isSingleRelationField(fieldName, zodType) || isMultipleRelationField(fieldName, zodType);\n}\n\n/**\n * Gets the maximum number of relations allowed for a relation field\n * Returns 1 for single relations, or the max constraint for multiple relations\n */\nexport function getMaxSelect(fieldName: string, zodType: z.ZodTypeAny): number {\n if (isSingleRelationField(fieldName, zodType)) {\n return 1;\n }\n\n if (isMultipleRelationField(fieldName, zodType)) {\n // Unwrap to get to the array type\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodArray) {\n // Access the checks array from the array definition\n const arrayDef = unwrappedType._def;\n if (arrayDef.maxLength) {\n return arrayDef.maxLength.value;\n }\n // Default to 999 for multiple relations without explicit max\n return 999;\n }\n }\n\n return 1;\n}\n\n/**\n * Gets the minimum number of relations required for a relation field\n * Returns 0 as default for all relation fields (single or multiple)\n * PocketBase always expects minSelect to be defined for relation fields\n */\nexport function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number {\n // For single relations, always return 0\n if (isSingleRelationField(fieldName, zodType)) {\n return 0;\n }\n\n // For multiple relations, check for explicit min constraint\n if (isMultipleRelationField(fieldName, zodType)) {\n // Unwrap to get to the array type\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodArray) {\n // Access the minLength from the array definition\n const arrayDef = unwrappedType._def;\n if (arrayDef.minLength) {\n return arrayDef.minLength.value;\n }\n }\n }\n\n // Default to 0 for all relation fields\n return 0;\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\";\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] 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 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\n/**\n * Maps Zod string types to PocketBase field types\n */\nexport function mapZodStringType(zodType: z.ZodString): PocketBaseFieldType {\n const checks = (zodType as any)._def.checks || [];\n\n // Check for email validation\n const hasEmail = checks.some((check: any) => check.kind === \"email\");\n if (hasEmail) {\n return \"email\";\n }\n\n // Check for URL validation\n const hasUrl = checks.some((check: any) => check.kind === \"url\");\n if (hasUrl) {\n return \"url\";\n }\n\n // Check for datetime validation (could be date field)\n const hasDatetime = checks.some((check: any) => check.kind === \"datetime\");\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._def.type;\n\n // Check if it's an array of File instances (file upload)\n if (elementType instanceof z.ZodType) {\n const typeName = elementType._def.typeName;\n if (typeName === \"ZodType\" && (elementType as any)._def?.innerType?.name === \"File\") {\n return \"file\";\n }\n }\n\n // Check for instanceof File\n if (elementType._def?.typeName === \"ZodType\") {\n const checks = (elementType as any)._def?.checks || [];\n const isFileInstance = checks.some(\n (check: any) => check.kind === \"instanceof\" || (elementType as any)._def?.innerType?.name === \"File\"\n );\n if (isFileInstance) {\n return \"file\";\n }\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 // Handle optional and nullable types by unwrapping\n let unwrappedType = zodType;\n\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n // Check for ZodEffects (which is what z.instanceof() creates)\n if ((unwrappedType as any)._def?.typeName === \"ZodEffects\") {\n const effect = (unwrappedType as any)._def?.effect;\n\n // z.instanceof(File) creates a refinement effect\n // We need to check if this is a File instance check\n // The field name 'avatar', 'image', 'file', 'attachment' etc. are hints\n if (effect?.type === \"refinement\") {\n // Common file field names\n const fileFieldNames = [\"avatar\", \"image\", \"file\", \"attachment\", \"photo\", \"picture\", \"document\", \"upload\"];\n if (fileFieldNames.some((name) => fieldName.toLowerCase().includes(name))) {\n return \"file\";\n }\n }\n }\n\n // Check for instanceof File (z.instanceof(File)) - legacy check\n if ((unwrappedType as any)._def?.typeName === \"ZodType\") {\n const checks = (unwrappedType as any)._def?.checks || [];\n const innerType = (unwrappedType as any)._def?.innerType;\n\n // Check if it's instanceof File\n if (innerType?.name === \"File\" || checks.some((check: any) => check.kind === \"instanceof\")) {\n return \"file\";\n }\n }\n\n // Map based on Zod type\n if (unwrappedType instanceof z.ZodString) {\n return mapZodStringType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodNumber) {\n return mapZodNumberType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodBoolean) {\n return mapZodBooleanType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodEnum) {\n return mapZodEnumType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodArray) {\n return mapZodArrayType(unwrappedType, fieldName);\n }\n\n if (unwrappedType instanceof z.ZodDate) {\n return mapZodDateType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodRecord || unwrappedType instanceof z.ZodObject) {\n return mapZodRecordType(unwrappedType);\n }\n\n // Default to text for unknown types\n return \"text\";\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 // Unwrap optional/nullable/default\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n const checks = (unwrappedType as any)._def?.checks || [];\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\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\n // Extract enum values\n if (unwrappedType instanceof z.ZodEnum) {\n options.values = unwrappedType._def.values;\n }\n\n // Extract array constraints\n if (unwrappedType instanceof z.ZodArray) {\n const arrayChecks = (unwrappedType as any)._def?.checks || [];\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\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\n if (unwrapped instanceof z.ZodOptional) {\n unwrapped = unwrapped._def.innerType;\n }\n\n if (unwrapped instanceof z.ZodNullable) {\n unwrapped = unwrapped._def.innerType;\n }\n\n if (unwrapped instanceof z.ZodDefault) {\n unwrapped = unwrapped._def.innerType;\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._def.type;\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._def.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 = (unwrapped as any)._def?.checks || [];\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\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\n // Extract enum values\n if (unwrapped instanceof z.ZodEnum) {\n options.values = unwrapped._def.values;\n }\n\n // Extract array constraints\n if (unwrapped instanceof z.ZodArray) {\n const arrayDef = unwrapped._def;\n if (arrayDef.minLength) {\n options.minSelect = arrayDef.minLength.value;\n }\n if (arrayDef.maxLength) {\n options.maxSelect = arrayDef.maxLength.value;\n }\n\n // Check for enum element type\n const elementType = arrayDef.type;\n if (elementType instanceof z.ZodEnum) {\n options.values = elementType._def.values;\n }\n }\n\n return options;\n}\n\n/**\n * Determines if a field should be treated as an editor field\n * based on field name conventions\n */\nexport function isEditorField(fieldName: string): boolean {\n const editorFieldNames = [\n \"content\",\n \"body\",\n \"description\",\n \"bio\",\n \"about\",\n \"summary\",\n \"notes\",\n \"details\",\n \"html\",\n \"richtext\",\n \"editor\",\n ];\n return editorFieldNames.some((name) => fieldName.toLowerCase().includes(name));\n}\n\n/**\n * Determines if a field should be treated as a file field\n * based on field name conventions\n */\nexport function isFileFieldByName(fieldName: string): boolean {\n const fileFieldNames = [\n \"avatar\",\n \"image\",\n \"file\",\n \"attachment\",\n \"photo\",\n \"picture\",\n \"document\",\n \"upload\",\n \"thumbnail\",\n \"cover\",\n \"banner\",\n \"logo\",\n \"icon\",\n \"media\",\n ];\n return fileFieldNames.some((name) => fieldName.toLowerCase().includes(name));\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 * Schema Analyzer - Parses Zod schemas and extracts field definitions\n *\n * This module provides a standalone, configurable schema analyzer that can be used\n * by consumer projects to parse Zod schemas and convert them to PocketBase collection schemas.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { z } from \"zod\";\nimport { extractRelationMetadata } from \"../schema/base\";\nimport type { PermissionSchema } from \"../utils/permissions\";\nimport { FileSystemError, SchemaParsingError } from \"./errors\";\nimport { PermissionAnalyzer } from \"./permission-analyzer\";\nimport type { CollectionSchema, FieldDefinition, SchemaDefinition } from \"./types\";\nimport { toCollectionName } from \"./utils/pluralize\";\nimport { getMaxSelect, getMinSelect, isRelationField, resolveTargetCollection } from \"./utils/relation-detector\";\nimport { extractFieldOptions, isFieldRequired, mapZodTypeToPocketBase } from \"./utils/type-mapper\";\n\n// Register tsx loader for TypeScript file support\n// This allows dynamic imports of .ts files to work\nlet tsxLoaderRegistered = false;\nasync function ensureTsxLoader(): Promise<void> {\n if (tsxLoaderRegistered) return;\n\n try {\n // Import tsx/esm to register the TypeScript loader hooks\n // This enables dynamic imports of .ts files in Node.js ESM\n await import(\"tsx/esm\");\n tsxLoaderRegistered = true;\n } catch {\n // tsx is not available - will handle in importSchemaModule\n tsxLoaderRegistered = false;\n }\n}\n\n/**\n * Configuration options for schema discovery and parsing\n */\nexport interface SchemaAnalyzerConfig {\n /**\n * Directory containing schema files (source or compiled)\n * Can be absolute or relative to workspaceRoot\n */\n schemaDir: string;\n\n /**\n * Workspace root directory for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * File patterns to exclude from schema discovery\n * Defaults to ['base.ts', 'index.ts', 'permissions.ts', 'permission-templates.ts']\n */\n excludePatterns?: string[];\n\n /**\n * File extensions to include in schema discovery\n * Defaults to ['.ts', '.js']\n */\n includeExtensions?: string[];\n\n /**\n * Schema export name patterns to look for\n * Defaults to ['Schema', 'InputSchema']\n */\n schemaPatterns?: string[];\n\n /**\n * Whether to use compiled JavaScript files instead of TypeScript source\n * When true, looks for .js files; when false, looks for .ts files\n * Defaults to true (use compiled files for dynamic import)\n */\n useCompiledFiles?: boolean;\n\n /**\n * Custom path transformation function for converting source paths to import paths\n * Useful for monorepo setups where source and dist directories differ\n * If not provided, uses the schemaDir directly\n */\n pathTransformer?: (sourcePath: string) => string;\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Required<Omit<SchemaAnalyzerConfig, \"schemaDir\" | \"pathTransformer\">> = {\n workspaceRoot: process.cwd(),\n excludePatterns: [\n \"base.ts\",\n \"index.ts\",\n \"permissions.ts\",\n \"permission-templates.ts\",\n \"base.js\",\n \"index.js\",\n \"permissions.js\",\n \"permission-templates.js\",\n ],\n includeExtensions: [\".ts\", \".js\"],\n schemaPatterns: [\"Schema\", \"InputSchema\", \"Collection\"],\n useCompiledFiles: true,\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(\n config: SchemaAnalyzerConfig\n): Required<Omit<SchemaAnalyzerConfig, \"pathTransformer\">> & { pathTransformer?: (sourcePath: string) => string } {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n excludePatterns: config.excludePatterns || DEFAULT_CONFIG.excludePatterns,\n includeExtensions: config.includeExtensions || DEFAULT_CONFIG.includeExtensions,\n schemaPatterns: config.schemaPatterns || DEFAULT_CONFIG.schemaPatterns,\n };\n}\n\n/**\n * Resolves the schema directory path\n */\nfunction resolveSchemaDir(config: SchemaAnalyzerConfig): string {\n const workspaceRoot = config.workspaceRoot || process.cwd();\n\n if (path.isAbsolute(config.schemaDir)) {\n return config.schemaDir;\n }\n\n return path.join(workspaceRoot, config.schemaDir);\n}\n\n/**\n * Discovers schema files in the specified directory\n * Filters based on configuration patterns\n *\n * @param config - Schema analyzer configuration\n * @returns Array of schema file paths (without extension)\n */\nexport function discoverSchemaFiles(config: SchemaAnalyzerConfig | string): string[] {\n // Support legacy string-only parameter\n const normalizedConfig: SchemaAnalyzerConfig = typeof config === \"string\" ? { schemaDir: config } : config;\n\n const mergedConfig = mergeConfig(normalizedConfig);\n const schemaDir = resolveSchemaDir(normalizedConfig);\n\n try {\n if (!fs.existsSync(schemaDir)) {\n throw new FileSystemError(`Schema directory not found: ${schemaDir}`, schemaDir, \"access\", \"ENOENT\");\n }\n\n const files = fs.readdirSync(schemaDir);\n\n // Filter files based on configuration\n const schemaFiles = files.filter((file) => {\n // Check extension\n const hasValidExtension = mergedConfig.includeExtensions.some((ext) => file.endsWith(ext));\n if (!hasValidExtension) return false;\n\n // Check exclusion patterns\n const isExcluded = mergedConfig.excludePatterns.some((pattern) => {\n // Support both exact match and glob-like patterns\n if (pattern.includes(\"*\")) {\n const regex = new RegExp(\"^\" + pattern.replace(/\\*/g, \".*\") + \"$\");\n return regex.test(file);\n }\n return file === pattern;\n });\n if (isExcluded) return false;\n\n return true;\n });\n\n // Return full paths without extension (for dynamic import)\n return schemaFiles.map((file) => {\n const ext = mergedConfig.includeExtensions.find((ext) => file.endsWith(ext)) || \".ts\";\n return path.join(schemaDir, file.replace(new RegExp(`\\\\${ext}$`), \"\"));\n });\n } catch (error) {\n if (error instanceof FileSystemError) {\n throw error;\n }\n\n const fsError = error as NodeJS.ErrnoException;\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied reading schema directory: ${schemaDir}`,\n schemaDir,\n \"read\",\n fsError.code,\n error as Error\n );\n }\n\n throw new FileSystemError(\n `Failed to read schema directory: ${schemaDir}`,\n schemaDir,\n \"read\",\n fsError.code,\n error as Error\n );\n }\n}\n\n/**\n * Dynamically imports a schema module\n * Supports both JavaScript and TypeScript files using tsx\n *\n * @param filePath - Path to the schema file (without extension)\n * @param config - Optional configuration for path transformation\n * @returns The imported module\n */\nexport async function importSchemaModule(filePath: string, config?: SchemaAnalyzerConfig): Promise<any> {\n try {\n let importPath = filePath;\n\n // Apply path transformation if provided\n if (config?.pathTransformer) {\n importPath = config.pathTransformer(filePath);\n }\n\n // Determine the file extension to use\n // Try .js first (for compiled files), then .ts (for source files)\n let resolvedPath: string | null = null;\n const jsPath = `${importPath}.js`;\n const tsPath = `${importPath}.ts`;\n\n if (fs.existsSync(jsPath)) {\n resolvedPath = jsPath;\n } else if (fs.existsSync(tsPath)) {\n resolvedPath = tsPath;\n } else {\n // Default to .js extension for ESM import\n resolvedPath = jsPath;\n }\n\n // If it's a TypeScript file, ensure tsx loader is registered\n if (resolvedPath.endsWith(\".ts\")) {\n await ensureTsxLoader();\n\n // Check if tsx was successfully registered\n if (!tsxLoaderRegistered) {\n throw new SchemaParsingError(\n `Failed to import TypeScript schema file. The 'tsx' package is required to load TypeScript files.\\n` +\n `Please install tsx: npm install tsx (or yarn add tsx, or pnpm add tsx)\\n` +\n `Alternatively, compile your schema files to JavaScript first.`,\n filePath\n );\n }\n }\n\n // Convert to file URL for proper ESM import\n const fileUrl = new URL(`file://${path.resolve(resolvedPath)}`);\n\n // Use dynamic import to load the module\n // tsx/esm will handle TypeScript files automatically if registered\n const module = await import(fileUrl.href);\n return module;\n } catch (error) {\n // Check if we're trying to import a TypeScript file\n const tsPath = `${filePath}.ts`;\n const isTypeScriptFile = fs.existsSync(tsPath);\n\n if (isTypeScriptFile && error instanceof SchemaParsingError) {\n // Re-throw SchemaParsingError as-is (already has helpful message)\n throw error;\n }\n\n if (isTypeScriptFile) {\n throw new SchemaParsingError(\n `Failed to import TypeScript schema file. The 'tsx' package is required to load TypeScript files.\\n` +\n `Please install tsx: npm install tsx (or yarn add tsx, or pnpm add tsx)\\n` +\n `Alternatively, compile your schema files to JavaScript first.`,\n filePath,\n error as Error\n );\n }\n\n throw new SchemaParsingError(\n `Failed to import schema module. Make sure the schema files exist and are valid.`,\n filePath,\n error as Error\n );\n }\n}\n\n/**\n * Gets the collection name from a schema file path\n * Converts the filename (without extension) to a pluralized collection name\n *\n * @param filePath - Path to the schema file (with or without extension)\n * @returns The collection name\n */\nexport function getCollectionNameFromFile(filePath: string): string {\n // Remove both .ts and .js extensions if present\n const filename = path.basename(filePath).replace(/\\.(ts|js)$/, \"\");\n return toCollectionName(filename);\n}\n\n/**\n * Extracts the collection name from a Zod schema's metadata\n * Checks if the schema was created with defineCollection() which stores\n * the collection name in the schema description\n *\n * @param zodSchema - The Zod schema to extract collection name from\n * @returns The collection name if found in metadata, null otherwise\n */\nexport function extractCollectionNameFromSchema(zodSchema: z.ZodTypeAny): string | null {\n if (!zodSchema.description) {\n return null;\n }\n\n try {\n const metadata = JSON.parse(zodSchema.description);\n if (metadata.collectionName && typeof metadata.collectionName === \"string\") {\n return metadata.collectionName;\n }\n } catch {\n // Not JSON or no collectionName - this is expected for schemas without defineCollection\n }\n\n return null;\n}\n\n/**\n * Extracts the collection type from a Zod schema's metadata\n * Checks if the schema was created with defineCollection() which stores\n * the collection type in the schema description\n *\n * @param zodSchema - The Zod schema to extract collection type from\n * @returns The collection type (\"base\" | \"auth\") if found in metadata, null otherwise\n */\nexport function extractCollectionTypeFromSchema(zodSchema: z.ZodTypeAny): \"base\" | \"auth\" | null {\n if (!zodSchema.description) {\n return null;\n }\n\n try {\n const metadata = JSON.parse(zodSchema.description);\n if (metadata.type === \"base\" || metadata.type === \"auth\") {\n return metadata.type;\n }\n } catch {\n // Not JSON or no type - this is expected for schemas without explicit type\n }\n\n return null;\n}\n\n/**\n * Extracts Zod schema definitions from a module\n *\n * Detection priority (highest to lowest):\n * 1. Default export - recommended pattern for clarity and explicitness\n * 2. Named exports ending with \"Collection\" - contains metadata (indexes, permissions)\n * 3. Named exports ending with \"Schema\" - basic schema definitions\n * 4. Named exports ending with \"InputSchema\" - form input schemas\n *\n * @param module - The imported schema module\n * @param patterns - Schema name patterns to look for (default: ['Schema', 'InputSchema', 'Collection'])\n * @returns Object containing found schemas\n *\n * @example\n * // Recommended: Use default export\n * const UserCollection = defineCollection({ ... });\n * export default UserCollection;\n *\n * @example\n * // Also supported: Named export with pattern\n * export const UserCollection = defineCollection({ ... });\n */\nexport function extractSchemaDefinitions(\n module: any,\n patterns: string[] = [\"Schema\", \"InputSchema\", \"Collection\"]\n): { inputSchema?: z.ZodObject<any>; schema?: z.ZodObject<any> } {\n const result: { inputSchema?: z.ZodObject<any>; schema?: z.ZodObject<any> } = {};\n\n // Priority 1: Check for default export (highest priority, most explicit)\n // This allows each file to have one clear schema definition\n if (module.default instanceof z.ZodObject) {\n // Default export is always the primary schema\n result.schema = module.default as z.ZodObject<any>;\n // If we have a default export, we can return early as it takes precedence\n // But we still check for InputSchema for backward compatibility\n }\n\n // Priority 2: Look for named exports matching patterns (for backward compatibility)\n for (const [key, value] of Object.entries(module)) {\n // Skip default export as we already handled it\n if (key === \"default\") continue;\n\n // Check if it's a Zod schema\n if (value instanceof z.ZodObject) {\n // Check for InputSchema pattern (used for form validation)\n if (patterns.includes(\"InputSchema\") && key.endsWith(\"InputSchema\")) {\n result.inputSchema = value as z.ZodObject<any>;\n } else if (!result.schema) {\n // Only set schema if we haven't found one via default export\n if (patterns.includes(\"Collection\") && key.endsWith(\"Collection\")) {\n // Prefer Collection over Schema as it has metadata (indexes, permissions)\n result.schema = value as z.ZodObject<any>;\n } else if (patterns.includes(\"Schema\") && key.endsWith(\"Schema\") && !key.endsWith(\"InputSchema\")) {\n result.schema = value as z.ZodObject<any>;\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Identifies whether to use InputSchema or Schema pattern\n * Prefers Schema over InputSchema as it includes base fields\n *\n * @param schemas - Object containing inputSchema and/or schema\n * @returns The schema to use for collection definition\n */\nexport function selectSchemaForCollection(schemas: {\n inputSchema?: z.ZodObject<any>;\n schema?: z.ZodObject<any>;\n}): z.ZodObject<any> | null {\n // Prefer the full Schema over InputSchema as it includes base fields\n if (schemas.schema) {\n return schemas.schema;\n }\n\n if (schemas.inputSchema) {\n return schemas.inputSchema;\n }\n\n return null;\n}\n\n/**\n * Extracts field definitions from a Zod object schema\n * Filters out base schema fields (id, collectionId, created, updated, expand)\n *\n * @param zodSchema - The Zod object schema\n * @param excludeFields - Additional fields to exclude (default: base schema fields)\n * @returns Array of field names and their Zod types\n */\nexport function extractFieldDefinitions(\n zodSchema: z.ZodObject<any>,\n excludeFields?: string[]\n): Array<{ name: string; zodType: z.ZodTypeAny }> {\n const shape = zodSchema.shape;\n const fields: Array<{ name: string; zodType: z.ZodTypeAny }> = [];\n\n // Base schema fields to exclude (these are system fields in PocketBase)\n const baseFields = [\"id\", \"collectionId\", \"collectionName\", \"created\", \"updated\", \"expand\"];\n\n // Additional fields to exclude (image file handling fields)\n const defaultExcludeFields = [\"thumbnailURL\", \"imageFiles\"];\n\n // Combine all exclusions\n const allExclusions = new Set([...baseFields, ...defaultExcludeFields, ...(excludeFields || [])]);\n\n for (const [fieldName, zodType] of Object.entries(shape)) {\n // Skip excluded fields\n if (!allExclusions.has(fieldName)) {\n fields.push({ name: fieldName, zodType: zodType as z.ZodTypeAny });\n }\n }\n\n return fields;\n}\n\n/**\n * Detects if a collection is an auth collection\n * Auth collections have email and password fields\n *\n * @param fields - Array of field definitions\n * @returns True if the collection is an auth collection\n */\nexport function isAuthCollection(fields: Array<{ name: string; zodType: z.ZodTypeAny }>): boolean {\n const fieldNames = fields.map((f) => f.name.toLowerCase());\n\n // Auth collections must have both email and password fields\n const hasEmail = fieldNames.includes(\"email\");\n const hasPassword = fieldNames.includes(\"password\");\n\n return hasEmail && hasPassword;\n}\n\n/**\n * Extracts validation constraints from Zod type\n * Includes min, max, required, unique, and other options\n *\n * @param fieldName - The field name\n * @param zodType - The Zod type\n * @returns Field definition with constraints\n */\nexport function buildFieldDefinition(fieldName: string, zodType: z.ZodTypeAny): FieldDefinition {\n const fieldType = mapZodTypeToPocketBase(zodType, fieldName);\n const required = isFieldRequired(zodType);\n const options = extractFieldOptions(zodType);\n\n const fieldDef: FieldDefinition = {\n name: fieldName,\n type: fieldType,\n required,\n options,\n };\n\n // Check for explicit relation metadata first (from relation() or relations() helpers)\n const relationMetadata = extractRelationMetadata(zodType.description);\n\n if (relationMetadata) {\n // Explicit relation definition found\n fieldDef.type = \"relation\";\n fieldDef.relation = {\n collection: relationMetadata.collection,\n maxSelect: relationMetadata.maxSelect,\n minSelect: relationMetadata.minSelect,\n cascadeDelete: relationMetadata.cascadeDelete,\n };\n\n // Clear out string-specific options that don't apply to relation fields\n fieldDef.options = undefined;\n }\n // Fall back to naming convention detection for backward compatibility\n else if (isRelationField(fieldName, zodType)) {\n // Override type to 'relation' for relation fields\n fieldDef.type = \"relation\";\n\n const targetCollection = resolveTargetCollection(fieldName);\n const maxSelect = getMaxSelect(fieldName, zodType);\n const minSelect = getMinSelect(fieldName, zodType);\n\n fieldDef.relation = {\n collection: targetCollection,\n maxSelect,\n minSelect,\n cascadeDelete: false, // Default to false, can be configured later\n };\n\n // Clear out string-specific options that don't apply to relation fields\n // Options like 'min', 'max', 'pattern' are from string validation and don't apply to relations\n if (fieldDef.options) {\n const { min: _min, max: _max, pattern: _pattern, ...relationSafeOptions } = fieldDef.options;\n fieldDef.options = Object.keys(relationSafeOptions).length ? relationSafeOptions : undefined;\n }\n }\n\n return fieldDef;\n}\n\n/**\n * Extracts index definitions from a Zod schema\n * Parses the schema description metadata to find index definitions\n *\n * @param schema - Zod schema with index metadata\n * @returns Array of index SQL statements or undefined\n */\nexport function extractIndexes(schema: z.ZodTypeAny): string[] | undefined {\n // Try to extract indexes from schema description\n const schemaDescription = schema.description;\n\n if (!schemaDescription) {\n return undefined;\n }\n\n try {\n const metadata = JSON.parse(schemaDescription);\n\n // Check if indexes are present in metadata\n if (metadata.indexes && Array.isArray(metadata.indexes)) {\n return metadata.indexes;\n }\n } catch {\n // If description is not valid JSON, return undefined\n }\n\n return undefined;\n}\n\n/**\n * Converts a Zod schema to a CollectionSchema interface\n *\n * @param collectionName - The name of the collection\n * @param zodSchema - The Zod object schema\n * @returns CollectionSchema definition\n */\nexport function convertZodSchemaToCollectionSchema(\n collectionName: string,\n zodSchema: z.ZodObject<any>\n): CollectionSchema {\n // Extract field definitions from Zod schema\n const rawFields = extractFieldDefinitions(zodSchema);\n\n // Determine collection type (auth or base)\n // Prefer explicit type from metadata, fall back to field detection\n const explicitType = extractCollectionTypeFromSchema(zodSchema);\n const collectionType = explicitType ?? (isAuthCollection(rawFields) ? \"auth\" : \"base\");\n\n // Build field definitions with constraints\n let fields: FieldDefinition[] = rawFields.map(({ name, zodType }) => buildFieldDefinition(name, zodType));\n\n // Exclude auth system fields for auth collections (PocketBase adds them automatically)\n if (collectionType === \"auth\") {\n const authSystemFieldNames = [\"email\", \"emailVisibility\", \"verified\", \"password\", \"tokenKey\"];\n fields = fields.filter((field) => !authSystemFieldNames.includes(field.name));\n }\n\n // Extract indexes from schema\n const indexes = extractIndexes(zodSchema) || [];\n\n // Extract and validate permissions from schema\n const permissionAnalyzer = new PermissionAnalyzer();\n let permissions: PermissionSchema | undefined = undefined;\n\n // Try to extract permissions from schema description\n const schemaDescription = zodSchema.description;\n const extractedPermissions = permissionAnalyzer.extractPermissions(schemaDescription);\n\n if (extractedPermissions) {\n // Resolve template configurations to concrete rules\n const resolvedPermissions = permissionAnalyzer.resolvePermissions(extractedPermissions);\n\n // Validate permissions against collection fields\n const validationResults = permissionAnalyzer.validatePermissions(\n collectionName,\n resolvedPermissions,\n fields,\n collectionType === \"auth\"\n );\n\n // Log validation errors and warnings\n for (const [ruleType, result] of validationResults) {\n if (!result.valid) {\n console.error(`[${collectionName}] Permission validation failed for ${ruleType}:`);\n result.errors.forEach((error) => console.error(` - ${error}`));\n }\n\n if (result.warnings.length > 0) {\n console.warn(`[${collectionName}] Permission warnings for ${ruleType}:`);\n result.warnings.forEach((warning) => console.warn(` - ${warning}`));\n }\n }\n\n // Merge with defaults to ensure all rules are defined\n permissions = permissionAnalyzer.mergeWithDefaults(resolvedPermissions);\n }\n\n // Build collection schema\n // Use extracted permissions for rules, falling back to nulls\n const collectionSchema: CollectionSchema = {\n name: collectionName,\n type: collectionType,\n fields,\n indexes,\n rules: {\n listRule: permissions?.listRule ?? null,\n viewRule: permissions?.viewRule ?? null,\n createRule: permissions?.createRule ?? null,\n updateRule: permissions?.updateRule ?? null,\n deleteRule: permissions?.deleteRule ?? null,\n manageRule: permissions?.manageRule ?? null,\n },\n permissions,\n };\n\n return collectionSchema;\n}\n\n/**\n * Builds a complete SchemaDefinition from schema files\n * Main entry point for the Schema Analyzer\n *\n * @param config - Schema analyzer configuration or path to schema directory\n * @returns Complete SchemaDefinition with all collections\n */\nexport async function buildSchemaDefinition(config: SchemaAnalyzerConfig | string): Promise<SchemaDefinition> {\n // Support legacy string-only parameter\n const normalizedConfig: SchemaAnalyzerConfig = typeof config === \"string\" ? { schemaDir: config } : config;\n\n const mergedConfig = mergeConfig(normalizedConfig);\n const collections = new Map<string, CollectionSchema>();\n\n // Discover schema files\n const schemaFiles = discoverSchemaFiles(normalizedConfig);\n\n if (schemaFiles.length === 0) {\n const schemaDir = resolveSchemaDir(normalizedConfig);\n throw new SchemaParsingError(\n `No schema files found in ${schemaDir}. Make sure you have schema files in the directory.`,\n schemaDir\n );\n }\n\n // Process each schema file\n for (const filePath of schemaFiles) {\n try {\n let importPath = filePath;\n\n // Apply path transformation if provided (for monorepo setups)\n if (normalizedConfig.pathTransformer) {\n importPath = normalizedConfig.pathTransformer(filePath);\n } else if (mergedConfig.useCompiledFiles) {\n // Default transformation: convert /src/ to /dist/ for compiled files\n // This is a common pattern but can be overridden with pathTransformer\n const distPath = filePath.replace(/\\/src\\//, \"/dist/\");\n // Only use dist path if it actually exists (i.e., files are compiled)\n // Otherwise, fall back to source path for TypeScript files\n if (fs.existsSync(`${distPath}.js`) || fs.existsSync(`${distPath}.mjs`)) {\n importPath = distPath;\n } else {\n // Files aren't compiled, use source path\n importPath = filePath;\n }\n }\n\n // Import the module\n const module = await importSchemaModule(importPath, normalizedConfig);\n\n // Extract schema definitions\n const schemas = extractSchemaDefinitions(module, mergedConfig.schemaPatterns);\n\n // Select the appropriate schema\n const zodSchema = selectSchemaForCollection(schemas);\n\n if (!zodSchema) {\n console.warn(`No valid schema found in ${filePath}, skipping...`);\n continue;\n }\n\n // Get collection name - prefer metadata from defineCollection(), fall back to filename\n const collectionNameFromSchema = extractCollectionNameFromSchema(zodSchema);\n const collectionName = collectionNameFromSchema ?? getCollectionNameFromFile(filePath);\n\n // Convert to CollectionSchema\n const collectionSchema = convertZodSchemaToCollectionSchema(collectionName, zodSchema);\n\n // Add to collections map\n collections.set(collectionName, collectionSchema);\n } catch (error) {\n // If it's already a SchemaParsingError, re-throw it\n if (error instanceof SchemaParsingError) {\n throw error;\n }\n\n // Otherwise, wrap it in a SchemaParsingError\n throw new SchemaParsingError(\n `Error processing schema file: ${error instanceof Error ? error.message : String(error)}`,\n filePath,\n error as Error\n );\n }\n }\n\n return { collections };\n}\n\n/**\n * Parses schema files and returns SchemaDefinition\n * Alias for buildSchemaDefinition for better semantic clarity\n *\n * @param config - Schema analyzer configuration or path to schema directory\n * @returns Complete SchemaDefinition with all collections\n */\nexport async function parseSchemaFiles(config: SchemaAnalyzerConfig | string): Promise<SchemaDefinition> {\n return buildSchemaDefinition(config);\n}\n\n/**\n * Creates a SchemaAnalyzer instance with the given configuration\n * Provides an object-oriented interface for schema analysis\n */\nexport class SchemaAnalyzer {\n private config: Required<Omit<SchemaAnalyzerConfig, \"pathTransformer\">> & {\n pathTransformer?: (sourcePath: string) => string;\n };\n\n constructor(config: SchemaAnalyzerConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Discovers schema files in the configured directory\n */\n discoverSchemaFiles(): string[] {\n return discoverSchemaFiles(this.config);\n }\n\n /**\n * Parses all schema files and returns a SchemaDefinition\n */\n async parseSchemaFiles(): Promise<SchemaDefinition> {\n return buildSchemaDefinition(this.config);\n }\n\n /**\n * Converts a single Zod schema to a CollectionSchema\n */\n convertZodSchemaToCollectionSchema(name: string, schema: z.ZodObject<any>): CollectionSchema {\n return convertZodSchemaToCollectionSchema(name, schema);\n }\n}\n","/**\n * PocketBase Format Converter\n * Converts PocketBase collection objects to our internal CollectionSchema format\n *\n * This module handles conversion between PocketBase's native collection format\n * (as found in migration files and snapshots) and our internal schema representation.\n */\n\nimport { SnapshotError } from \"./errors\";\nimport type { CollectionSchema, 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 // Known PocketBase constants\n // Note: We return \"Users\" (title case) for consistency, but this should be\n // normalized during comparison to handle case differences\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 * Converts a PocketBase collection object to CollectionSchema format\n *\n * @param pbCollection - PocketBase collection object from migration file\n * @returns CollectionSchema object\n */\nexport function convertPocketBaseCollection(pbCollection: any): CollectionSchema {\n const fields: any[] = [];\n\n // System field names that should always be excluded\n const systemFieldNames = [\"id\", \"created\", \"updated\", \"collectionId\", \"collectionName\", \"expand\"];\n\n // Auth collection system field names\n const authSystemFieldNames = [\"email\", \"emailVisibility\", \"verified\", \"password\", \"tokenKey\"];\n\n // Convert PocketBase fields to our FieldDefinition format\n if (pbCollection.fields && Array.isArray(pbCollection.fields)) {\n for (const pbField of pbCollection.fields) {\n // Skip system fields by checking both the system flag and field name\n // Some PocketBase exports mark created/updated as system: false\n if (pbField.system || systemFieldNames.includes(pbField.name)) {\n continue;\n }\n\n // Skip auth system fields for auth collections\n if (pbCollection.type === \"auth\" && authSystemFieldNames.includes(pbField.name)) {\n continue;\n }\n\n const field: any = {\n name: pbField.name,\n type: pbField.type,\n required: pbField.required || false,\n };\n\n // Initialize options object\n field.options = pbField.options ? { ...pbField.options } : {};\n\n // Extract values for select/enum fields (values can be directly on field or in options)\n // This must be done before cleaning up empty options to ensure values are preserved\n if (pbField.type === \"select\") {\n // Check for values directly on the field first (common in migration files)\n if (pbField.values && Array.isArray(pbField.values)) {\n field.options.values = pbField.values;\n } else if (pbField.options?.values && Array.isArray(pbField.options.values)) {\n // Already in options, keep it\n field.options.values = pbField.options.values;\n }\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 };\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 fields.push(field);\n }\n }\n\n const schema: CollectionSchema = {\n name: pbCollection.name,\n type: pbCollection.type || \"base\",\n fields,\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 const rules: any = {};\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 if (Object.keys(rules).length > 0) {\n schema.rules = rules;\n // Also set permissions to match rules (they're the same thing)\n schema.permissions = { ...rules };\n }\n\n return schema;\n}\n\n/**\n * Converts PocketBase migration format to SchemaSnapshot\n * Extracts the snapshot array from the migration file content\n *\n * @param migrationContent - Raw migration file content\n * @returns SchemaSnapshot with collections map\n */\nexport function convertPocketBaseMigration(migrationContent: string): SchemaSnapshot {\n try {\n // Extract the snapshot array from the migration file\n // The format is: migrate((app) => { const snapshot = [...]; ... })\n const snapshotMatch = migrationContent.match(/const\\s+snapshot\\s*=\\s*(\\[[\\s\\S]*?\\]);/);\n\n if (!snapshotMatch) {\n throw new Error(\"Could not find snapshot array in migration file\");\n }\n\n // Parse the snapshot array as JSON\n // We need to evaluate it as JavaScript since it's not pure JSON\n const snapshotArrayStr = snapshotMatch[1];\n let snapshotArray: any[];\n\n try {\n // Use Function constructor to safely evaluate the array\n // This is safer than eval() and works for our use case\n snapshotArray = new Function(`return ${snapshotArrayStr}`)();\n } catch (parseError) {\n throw new Error(`Failed to parse snapshot array: ${parseError}`);\n }\n\n if (!Array.isArray(snapshotArray)) {\n throw new Error(\"Snapshot is not an array\");\n }\n\n // Convert each collection to our format\n const collections = new Map<string, CollectionSchema>();\n\n for (const pbCollection of snapshotArray) {\n if (!pbCollection.name) {\n console.warn(\"Skipping collection without name\");\n continue;\n }\n\n const schema = convertPocketBaseCollection(pbCollection);\n collections.set(pbCollection.name, schema);\n }\n\n return {\n version: SNAPSHOT_VERSION,\n timestamp: new Date().toISOString(),\n collections,\n };\n } catch (error) {\n throw new SnapshotError(\n `Failed to convert PocketBase migration: ${error instanceof Error ? error.message : String(error)}`,\n undefined,\n \"parse\",\n error instanceof Error ? error : undefined\n );\n }\n}\n","/**\n * Migration File Parser\n * Parses PocketBase migration files to extract collection operations\n *\n * This module handles parsing migration files to extract:\n * - Collection creations (new Collection(...))\n * - Collection deletions (app.delete(...))\n * - Field modifications (field.property = value)\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { convertPocketBaseCollection } from \"./pocketbase-converter\";\nimport type { CollectionSchema } from \"./types\";\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\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 && timestamp > snapshotTimestamp) {\n migrationFiles.push({\n path: path.join(migrationsPath, file),\n timestamp,\n });\n }\n }\n\n // Sort by timestamp (ascending order)\n migrationFiles.sort((a, b) => a.timestamp - b.timestamp);\n\n return migrationFiles.map((f) => f.path);\n } catch (error) {\n console.warn(`Error finding migrations after snapshot: ${error}`);\n return [];\n }\n}\n\n/**\n * Helper function to parse collection operations from migration content\n *\n * @param content - Migration content (should be just the UP migration)\n * @returns Object with collections to create and collections to delete\n */\nfunction parseMigrationOperationsFromContent(content: string): {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n} {\n const collectionsToCreate: CollectionSchema[] = [];\n const collectionsToDelete: string[] = [];\n\n try {\n // Extract collection definitions from `new Collection({...})`\n // Use a more robust approach: find all \"new Collection(\" and then parse until matching closing paren\n let searchIndex = 0;\n while (true) {\n const collectionStart = content.indexOf(\"new Collection(\", searchIndex);\n if (collectionStart === -1) {\n break;\n }\n\n // Find the opening brace after \"new Collection(\"\n const openParen = collectionStart + \"new Collection(\".length;\n let braceCount = 0;\n let parenCount = 1; // We're already inside the opening paren\n let inString = false;\n let stringChar = null;\n let i = openParen;\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 searchIndex = i + 1;\n continue;\n }\n\n const objectStart = i;\n braceCount = 1;\n i++;\n\n // Find the matching closing brace and paren\n while (i < content.length && (braceCount > 0 || parenCount > 0)) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n // Handle strings\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\n i++;\n }\n\n if (braceCount === 0 && parenCount === 0) {\n const objectContent = content.substring(objectStart, i - 1); // -1 to exclude the closing paren\n try {\n // Use Function constructor to parse the JavaScript object\n const collectionObj = new Function(`return ${objectContent}`)();\n if (collectionObj && collectionObj.name) {\n const schema = convertPocketBaseCollection(collectionObj);\n collectionsToCreate.push(schema);\n }\n } catch (error) {\n // Skip malformed collection definitions\n console.warn(`Failed to parse collection definition: ${error}`);\n }\n }\n\n searchIndex = i;\n }\n\n // Extract collection deletions from `app.delete(...)`\n // Look for patterns like: app.delete(collection_xxx) or app.delete(app.findCollectionByNameOrId(\"name\"))\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 we have a collection name from findCollectionByNameOrId, use it\n if (match[1]) {\n collectionsToDelete.push(match[1]);\n } else {\n // Try to find the collection name from the variable name\n // Look backwards for the collection variable definition\n const varNameMatch = match[0].match(/collection_(\\w+)/);\n if (varNameMatch) {\n // Try to find the collection name from the variable definition\n const varName = `collection_${varNameMatch[1]}`;\n // Search backwards from the delete call to find the variable definition\n const deleteIndex = content.indexOf(match[0]);\n const beforeDelete = content.substring(0, deleteIndex);\n const varDefMatch = beforeDelete.match(\n new RegExp(`const\\\\s+${varName}\\\\s*=\\\\s*new\\\\s+Collection\\\\(\\\\s*(\\\\{[\\\\s\\\\S]*?\\\\})\\\\s*\\\\)`, \"g\")\n );\n if (varDefMatch && varDefMatch.length > 0) {\n // Find the collection definition (get the last match closest to the delete)\n const collectionDefMatch = beforeDelete.match(\n new RegExp(`const\\\\s+${varName}\\\\s*=\\\\s*new\\\\s+Collection\\\\(\\\\s*(\\\\{[\\\\s\\\\S]*?\\\\})\\\\s*\\\\)`)\n );\n if (collectionDefMatch) {\n try {\n const collectionDefStr = collectionDefMatch[1];\n const collectionObj = new Function(`return ${collectionDefStr}`)();\n if (collectionObj && collectionObj.name) {\n collectionsToDelete.push(collectionObj.name);\n }\n } catch {\n // Skip if we can't parse\n }\n }\n }\n }\n }\n }\n\n // Also look for direct collection name in findCollectionByNameOrId followed by delete\n const findAndDeleteMatches = content.matchAll(\n /app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)[\\s\\S]*?app\\.delete/g\n );\n for (const match of findAndDeleteMatches) {\n collectionsToDelete.push(match[1]);\n }\n } catch (error) {\n console.warn(`Failed to parse migration operations from content: ${error}`);\n }\n\n return { collectionsToCreate, collectionsToDelete };\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} {\n try {\n // Extract only the UP migration (first function argument to migrate())\n // Find the migrate call and extract the first function body\n const migrateMatch = migrationContent.match(/migrate\\s*\\(\\s*/);\n if (!migrateMatch) {\n // If we can't find the migrate pattern, try to parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n const startIndex = migrateMatch.index! + migrateMatch[0].length;\n\n // Find the opening paren of the first function\n let i = startIndex;\n let parenCount = 0;\n let foundFirstParen = false;\n\n while (i < migrationContent.length) {\n const char = migrationContent[i];\n if (char === \"(\") {\n parenCount++;\n foundFirstParen = true;\n i++;\n break;\n }\n i++;\n }\n\n if (!foundFirstParen) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Skip the function parameters: (app) => {\n let inString = false;\n let stringChar = null;\n let foundBrace = false;\n let braceStart = -1;\n\n while (i < migrationContent.length && !foundBrace) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"(\") parenCount++;\n if (char === \")\") {\n parenCount--;\n if (parenCount === 0) {\n // Found end of function parameters, look for =>\n i++;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length - 1 && migrationContent[i] === \"=\" && migrationContent[i + 1] === \">\") {\n i += 2;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length && migrationContent[i] === \"{\") {\n foundBrace = true;\n braceStart = i + 1;\n break;\n }\n }\n }\n }\n }\n i++;\n }\n\n if (!foundBrace || braceStart === -1) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Find the matching closing brace\n let braceCount = 1;\n i = braceStart;\n inString = false;\n stringChar = null;\n\n while (i < migrationContent.length && braceCount > 0) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"{\") braceCount++;\n if (char === \"}\") braceCount--;\n }\n\n i++;\n }\n\n if (braceCount === 0) {\n const upMigrationContent = migrationContent.substring(braceStart, i - 1);\n return parseMigrationOperationsFromContent(upMigrationContent);\n }\n\n // Fallback: parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n } catch (error) {\n console.warn(`Failed to parse migration operations: ${error}`);\n return { collectionsToCreate: [], collectionsToDelete: [] };\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} 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 */\nfunction applyMigrationOperations(\n snapshot: SchemaSnapshot,\n operations: { collectionsToCreate: CollectionSchema[]; collectionsToDelete: string[] }\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/updates\n for (const collection of operations.collectionsToCreate) {\n updatedCollections.set(collection.name, collection);\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","/**\n * Diff Engine component\n * Compares current schema with previous snapshot and identifies changes\n *\n * This module provides a standalone, configurable diff engine that can be used\n * by consumer projects to compare schema definitions and detect changes.\n */\n\nimport type {\n APIRuleType,\n CollectionModification,\n CollectionSchema,\n FieldChange,\n FieldDefinition,\n FieldModification,\n PermissionChange,\n RuleUpdate,\n SchemaDefinition,\n SchemaDiff,\n SchemaSnapshot,\n} from \"./types\";\n\n/**\n * Configuration options for the diff engine\n */\nexport interface DiffEngineConfig {\n /**\n * Whether to warn on collection deletions\n * Defaults to true\n */\n warnOnDelete?: boolean;\n\n /**\n * Whether to require --force flag for destructive changes\n * Defaults to true\n */\n requireForceForDestructive?: boolean;\n\n /**\n * Severity threshold for requiring force flag\n * 'high' = only collection/field deletions and type changes\n * 'medium' = includes making fields required\n * 'low' = includes any constraint changes\n * Defaults to 'high'\n */\n severityThreshold?: \"high\" | \"medium\" | \"low\";\n\n /**\n * Custom system collections to exclude from diff\n * These collections will not be created or deleted\n */\n systemCollections?: string[];\n\n /**\n * Custom system fields to exclude from user collection diffs\n * These fields will not be included in fieldsToAdd for the users collection\n */\n usersSystemFields?: string[];\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Required<DiffEngineConfig> = {\n warnOnDelete: true,\n requireForceForDestructive: true,\n severityThreshold: \"high\",\n systemCollections: [\"_mfas\", \"_otps\", \"_externalAuths\", \"_authOrigins\", \"_superusers\"],\n usersSystemFields: [\"id\", \"password\", \"tokenKey\", \"email\", \"emailVisibility\", \"verified\", \"created\", \"updated\"],\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config?: DiffEngineConfig): Required<DiffEngineConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Destructive change information\n */\nexport interface DestructiveChange {\n type: \"collection_delete\" | \"field_delete\" | \"type_change\" | \"required_change\" | \"constraint_change\";\n severity: \"high\" | \"medium\" | \"low\";\n collection: string;\n field?: string;\n description: string;\n oldValue?: any;\n newValue?: any;\n}\n\n/**\n * Change summary for status reporting\n */\nexport interface ChangeSummary {\n totalChanges: number;\n collectionsToCreate: number;\n collectionsToDelete: number;\n collectionsToModify: number;\n fieldsToAdd: number;\n fieldsToRemove: number;\n fieldsToModify: number;\n indexChanges: number;\n ruleChanges: number;\n permissionChanges: number;\n destructiveChanges: DestructiveChange[];\n nonDestructiveChanges: string[];\n}\n\n/**\n * Checks if a collection is a PocketBase system collection\n * System collections are internal to PocketBase and should not be created or deleted\n *\n * @param collectionName - Name of the collection to check\n * @param config - Optional configuration with custom system collections\n * @returns True if the collection is a system collection\n */\nexport function isSystemCollection(collectionName: string, config?: DiffEngineConfig): boolean {\n const mergedConfig = mergeConfig(config);\n return mergedConfig.systemCollections.includes(collectionName);\n}\n\n/**\n * Returns the list of system field names for the users collection\n * These fields are automatically provided by PocketBase for auth collections\n * and should not be included when generating migrations for users collection extensions\n *\n * @param config - Optional configuration with custom system fields\n * @returns Set of system field names\n */\nexport function getUsersSystemFields(config?: DiffEngineConfig): Set<string> {\n const mergedConfig = mergeConfig(config);\n return new Set(mergedConfig.usersSystemFields);\n}\n\n/**\n * Filters system collections from a schema definition\n * Returns a new SchemaDefinition with only custom (non-system) collections\n *\n * @param schema - Schema definition to filter\n * @param config - Optional configuration\n * @returns Filtered SchemaDefinition without system collections\n */\nexport function filterSystemCollections(schema: SchemaDefinition, config?: DiffEngineConfig): SchemaDefinition {\n const filteredCollections = new Map<string, CollectionSchema>();\n\n for (const [collectionName, collectionSchema] of schema.collections) {\n if (!isSystemCollection(collectionName, config)) {\n filteredCollections.set(collectionName, collectionSchema);\n }\n }\n\n return {\n collections: filteredCollections,\n };\n}\n\n/**\n * Identifies new collections in schema that don't exist in snapshot\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @returns Array of new collections\n */\nexport function findNewCollections(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null\n): CollectionSchema[] {\n const newCollections: CollectionSchema[] = [];\n\n // If no previous snapshot, all collections are new\n if (!previousSnapshot) {\n return Array.from(currentSchema.collections.values());\n }\n\n // Find collections in current schema that don't exist in snapshot\n for (const [collectionName, collectionSchema] of currentSchema.collections) {\n if (!previousSnapshot.collections.has(collectionName)) {\n newCollections.push(collectionSchema);\n }\n }\n\n return newCollections;\n}\n\n/**\n * Identifies collections removed from schema (exist in snapshot but not in current schema)\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @returns Array of removed collections\n */\nexport function findRemovedCollections(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null\n): CollectionSchema[] {\n const removedCollections: CollectionSchema[] = [];\n\n // If no previous snapshot, nothing can be removed\n if (!previousSnapshot) {\n return removedCollections;\n }\n\n // Find collections in snapshot that don't exist in current schema\n for (const [collectionName, collectionSchema] of previousSnapshot.collections) {\n if (!currentSchema.collections.has(collectionName)) {\n removedCollections.push(collectionSchema);\n }\n }\n\n return removedCollections;\n}\n\n/**\n * Matches collections by name between current schema and snapshot\n * Returns pairs of [current, previous] for collections that exist in both\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @returns Array of matched collection pairs\n */\nexport function matchCollectionsByName(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null\n): Array<[CollectionSchema, CollectionSchema]> {\n const matches: Array<[CollectionSchema, CollectionSchema]> = [];\n\n // If no previous snapshot, no matches possible\n if (!previousSnapshot) {\n return matches;\n }\n\n // Create a case-insensitive lookup map for previous collections\n const previousCollectionsLower = new Map<string, [string, CollectionSchema]>();\n for (const [name, collection] of previousSnapshot.collections) {\n previousCollectionsLower.set(name.toLowerCase(), [name, collection]);\n }\n\n // Find collections that exist in both current and previous (case-insensitive)\n for (const [collectionName, currentCollection] of currentSchema.collections) {\n const previousEntry = previousCollectionsLower.get(collectionName.toLowerCase());\n\n if (previousEntry) {\n const [, previousCollection] = previousEntry;\n matches.push([currentCollection, previousCollection]);\n }\n }\n\n return matches;\n}\n\n/**\n * Identifies new fields in current collection that don't exist in previous\n *\n * @param currentFields - Current collection fields\n * @param previousFields - Previous collection fields\n * @returns Array of new fields\n */\nexport function findNewFields(currentFields: FieldDefinition[], previousFields: FieldDefinition[]): FieldDefinition[] {\n const newFields: FieldDefinition[] = [];\n const previousFieldNames = new Set(previousFields.map((f) => f.name));\n\n for (const currentField of currentFields) {\n if (!previousFieldNames.has(currentField.name)) {\n newFields.push(currentField);\n }\n }\n\n return newFields;\n}\n\n/**\n * Identifies fields removed from current collection (exist in previous but not in current)\n *\n * @param currentFields - Current collection fields\n * @param previousFields - Previous collection fields\n * @returns Array of removed fields\n */\nexport function findRemovedFields(\n currentFields: FieldDefinition[],\n previousFields: FieldDefinition[]\n): FieldDefinition[] {\n const removedFields: FieldDefinition[] = [];\n const currentFieldNames = new Set(currentFields.map((f) => f.name));\n\n for (const previousField of previousFields) {\n if (!currentFieldNames.has(previousField.name)) {\n removedFields.push(previousField);\n }\n }\n\n return removedFields;\n}\n\n/**\n * Matches fields by name between current and previous collections\n * Returns pairs of [current, previous] for fields that exist in both\n *\n * @param currentFields - Current collection fields\n * @param previousFields - Previous collection fields\n * @returns Array of matched field pairs\n */\nexport function matchFieldsByName(\n currentFields: FieldDefinition[],\n previousFields: FieldDefinition[]\n): Array<[FieldDefinition, FieldDefinition]> {\n const matches: Array<[FieldDefinition, FieldDefinition]> = [];\n\n // Create a map of previous fields by name for efficient lookup\n const previousFieldMap = new Map<string, FieldDefinition>();\n for (const previousField of previousFields) {\n previousFieldMap.set(previousField.name, previousField);\n }\n\n // Find matching fields\n for (const currentField of currentFields) {\n const previousField = previousFieldMap.get(currentField.name);\n\n if (previousField) {\n matches.push([currentField, previousField]);\n }\n }\n\n return matches;\n}\n\n/**\n * Compares two values for equality, handling deep object comparison\n *\n * @param a - First value\n * @param b - Second value\n * @returns True if values are equal\n */\nfunction areValuesEqual(a: any, b: any): boolean {\n // Handle null/undefined\n if (a === b) return true;\n if (a == null || b == null) return false;\n\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => areValuesEqual(val, b[idx]));\n }\n\n // Handle objects\n if (typeof a === \"object\" && typeof b === \"object\") {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => areValuesEqual(a[key], b[key]));\n }\n\n // Primitive comparison\n return a === b;\n}\n\n/**\n * Compares field types between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns FieldChange if types differ, null otherwise\n */\nexport function compareFieldTypes(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange | null {\n if (currentField.type !== previousField.type) {\n return {\n property: \"type\",\n oldValue: previousField.type,\n newValue: currentField.type,\n };\n }\n\n return null;\n}\n\n/**\n * Compares field constraints (required, unique) between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of FieldChange for constraint differences\n */\nexport function compareFieldConstraints(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange[] {\n const changes: FieldChange[] = [];\n\n // Compare required constraint\n if (currentField.required !== previousField.required) {\n changes.push({\n property: \"required\",\n oldValue: previousField.required,\n newValue: currentField.required,\n });\n }\n\n // Compare unique constraint\n if (currentField.unique !== previousField.unique) {\n changes.push({\n property: \"unique\",\n oldValue: previousField.unique,\n newValue: currentField.unique,\n });\n }\n\n return changes;\n}\n\n/**\n * Compares field options (min, max, pattern, etc.) between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of FieldChange for option differences\n */\nexport function compareFieldOptions(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange[] {\n const changes: FieldChange[] = [];\n\n const currentOptions = currentField.options || {};\n const previousOptions = previousField.options || {};\n\n // Get all unique option keys\n const allKeys = new Set([...Object.keys(currentOptions), ...Object.keys(previousOptions)]);\n\n // Compare each option\n for (const key of allKeys) {\n const currentValue = currentOptions[key];\n const previousValue = previousOptions[key];\n\n // Handle undefined values - if one is undefined and the other is not, that's a change\n // But if both are undefined, that's not a change\n if (currentValue === undefined && previousValue === undefined) {\n continue;\n }\n\n if (!areValuesEqual(currentValue, previousValue)) {\n changes.push({\n property: `options.${key}`,\n oldValue: previousValue,\n newValue: currentValue,\n });\n }\n }\n\n return changes;\n}\n\n/**\n * Compares relation configurations between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of FieldChange for relation differences\n */\nexport function compareRelationConfigurations(\n currentField: FieldDefinition,\n previousField: FieldDefinition\n): FieldChange[] {\n const changes: FieldChange[] = [];\n\n const currentRelation = currentField.relation;\n const previousRelation = previousField.relation;\n\n // If one has relation and other doesn't, that's a type change (handled elsewhere)\n if (!currentRelation && !previousRelation) {\n return changes;\n }\n\n if (!currentRelation || !previousRelation) {\n // This shouldn't happen if types match, but handle gracefully\n return changes;\n }\n\n // Compare relation properties\n // Note: collectionId should already be resolved to collection name during parsing\n // This normalization is just a safety net for edge cases\n const normalizeCollection = (collection: string): string => {\n if (!collection) return collection;\n\n // Handle known PocketBase constants\n if (collection === \"_pb_users_auth_\") {\n return \"Users\";\n }\n // Handle expressions that might not have been parsed correctly\n const nameMatch = collection.match(/app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/);\n if (nameMatch) {\n return nameMatch[1];\n }\n return collection;\n };\n\n const normalizedCurrent = normalizeCollection(currentRelation.collection);\n const normalizedPrevious = normalizeCollection(previousRelation.collection);\n\n // Only report a change if the normalized values differ\n // Use normalized values for comparison, but report original values in the change\n if (normalizedCurrent !== normalizedPrevious) {\n changes.push({\n property: \"relation.collection\",\n oldValue: normalizedPrevious, // Use normalized value for clarity\n newValue: normalizedCurrent, // Use normalized value for clarity\n });\n }\n\n if (currentRelation.cascadeDelete !== previousRelation.cascadeDelete) {\n changes.push({\n property: \"relation.cascadeDelete\",\n oldValue: previousRelation.cascadeDelete,\n newValue: currentRelation.cascadeDelete,\n });\n }\n\n if (currentRelation.maxSelect !== previousRelation.maxSelect) {\n changes.push({\n property: \"relation.maxSelect\",\n oldValue: previousRelation.maxSelect,\n newValue: currentRelation.maxSelect,\n });\n }\n\n if (currentRelation.minSelect !== previousRelation.minSelect) {\n changes.push({\n property: \"relation.minSelect\",\n oldValue: previousRelation.minSelect,\n newValue: currentRelation.minSelect,\n });\n }\n\n return changes;\n}\n\n/**\n * Detects all changes between two field definitions\n * Combines type, constraint, option, and relation changes\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of all detected changes\n */\nexport function detectFieldChanges(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange[] {\n const changes: FieldChange[] = [];\n\n // Compare types\n const typeChange = compareFieldTypes(currentField, previousField);\n if (typeChange) {\n changes.push(typeChange);\n }\n\n // Compare constraints\n changes.push(...compareFieldConstraints(currentField, previousField));\n\n // Compare options\n changes.push(...compareFieldOptions(currentField, previousField));\n\n // Compare relation configurations (if applicable)\n if (currentField.type === \"relation\" && previousField.type === \"relation\") {\n changes.push(...compareRelationConfigurations(currentField, previousField));\n }\n\n return changes;\n}\n\n/**\n * Compares indexes between current and previous collections\n *\n * @param currentIndexes - Current collection indexes\n * @param previousIndexes - Previous collection indexes\n * @returns Object with indexes to add and remove\n */\nfunction compareIndexes(\n currentIndexes: string[] = [],\n previousIndexes: string[] = []\n): { indexesToAdd: string[]; indexesToRemove: string[] } {\n const currentSet = new Set(currentIndexes);\n const previousSet = new Set(previousIndexes);\n\n const indexesToAdd = currentIndexes.filter((idx) => !previousSet.has(idx));\n const indexesToRemove = previousIndexes.filter((idx) => !currentSet.has(idx));\n\n return { indexesToAdd, indexesToRemove };\n}\n\n/**\n * Compares API rules between current and previous collections\n *\n * @param currentRules - Current collection rules\n * @param previousRules - Previous collection rules\n * @returns Array of rule updates\n */\nfunction compareRules(currentRules: CollectionSchema[\"rules\"], previousRules: CollectionSchema[\"rules\"]): RuleUpdate[] {\n const updates: RuleUpdate[] = [];\n\n const ruleTypes: Array<keyof NonNullable<CollectionSchema[\"rules\"]>> = [\n \"listRule\",\n \"viewRule\",\n \"createRule\",\n \"updateRule\",\n \"deleteRule\",\n \"manageRule\",\n ];\n\n for (const ruleType of ruleTypes) {\n const currentValue = currentRules?.[ruleType] ?? null;\n const previousValue = previousRules?.[ruleType] ?? null;\n\n if (currentValue !== previousValue) {\n updates.push({\n ruleType: ruleType as RuleUpdate[\"ruleType\"],\n oldValue: previousValue,\n newValue: currentValue,\n });\n }\n }\n\n return updates;\n}\n\n/**\n * Compares permissions between current and previous collections\n * Detects changes in permission rules defined in schema\n *\n * @param currentPermissions - Current collection permissions\n * @param previousPermissions - Previous collection permissions\n * @returns Array of permission changes\n */\nexport function comparePermissions(\n currentPermissions: CollectionSchema[\"permissions\"],\n previousPermissions: CollectionSchema[\"permissions\"]\n): PermissionChange[] {\n const changes: PermissionChange[] = [];\n\n const ruleTypes: APIRuleType[] = [\"listRule\", \"viewRule\", \"createRule\", \"updateRule\", \"deleteRule\", \"manageRule\"];\n\n for (const ruleType of ruleTypes) {\n const currentValue = currentPermissions?.[ruleType] ?? null;\n const previousValue = previousPermissions?.[ruleType] ?? null;\n\n // Compare permission values\n if (currentValue !== previousValue) {\n changes.push({\n ruleType,\n oldValue: previousValue,\n newValue: currentValue,\n });\n }\n }\n\n return changes;\n}\n\n/**\n * Compares fields between current and previous collections\n * Identifies new, removed, and modified fields\n * For the users collection, filters out system fields from fieldsToAdd\n *\n * @param currentCollection - Current collection schema\n * @param previousCollection - Previous collection schema\n * @param config - Optional configuration\n * @returns Object with field changes\n */\nfunction compareCollectionFields(\n currentCollection: CollectionSchema,\n previousCollection: CollectionSchema,\n config?: DiffEngineConfig\n): {\n fieldsToAdd: FieldDefinition[];\n fieldsToRemove: FieldDefinition[];\n fieldsToModify: FieldModification[];\n} {\n let fieldsToAdd = findNewFields(currentCollection.fields, previousCollection.fields);\n const fieldsToRemove = findRemovedFields(currentCollection.fields, previousCollection.fields);\n const fieldsToModify: FieldModification[] = [];\n\n // For users collection, filter out system fields from fieldsToAdd\n // System fields are automatically provided by PocketBase and should not be in migrations\n if (currentCollection.name === \"users\") {\n const systemFields = getUsersSystemFields(config);\n fieldsToAdd = fieldsToAdd.filter((field) => !systemFields.has(field.name));\n }\n\n // Check for modified fields\n const matchedFields = matchFieldsByName(currentCollection.fields, previousCollection.fields);\n\n for (const [currentField, previousField] of matchedFields) {\n const changes = detectFieldChanges(currentField, previousField);\n\n if (changes.length > 0) {\n fieldsToModify.push({\n fieldName: currentField.name,\n currentDefinition: previousField,\n newDefinition: currentField,\n changes,\n });\n }\n }\n\n return { fieldsToAdd, fieldsToRemove, fieldsToModify };\n}\n\n/**\n * Builds a CollectionModification for a matched collection pair\n *\n * @param currentCollection - Current collection schema\n * @param previousCollection - Previous collection schema\n * @param config - Optional configuration\n * @returns CollectionModification object\n */\nfunction buildCollectionModification(\n currentCollection: CollectionSchema,\n previousCollection: CollectionSchema,\n config?: DiffEngineConfig\n): CollectionModification {\n // Compare fields\n const { fieldsToAdd, fieldsToRemove, fieldsToModify } = compareCollectionFields(\n currentCollection,\n previousCollection,\n config\n );\n\n // Compare indexes\n const { indexesToAdd, indexesToRemove } = compareIndexes(currentCollection.indexes, previousCollection.indexes);\n\n // Compare rules\n const rulesToUpdate = compareRules(currentCollection.rules, previousCollection.rules);\n\n // Compare permissions\n const permissionsToUpdate = comparePermissions(currentCollection.permissions, previousCollection.permissions);\n\n return {\n collection: currentCollection.name,\n fieldsToAdd,\n fieldsToRemove,\n fieldsToModify,\n indexesToAdd,\n indexesToRemove,\n rulesToUpdate,\n permissionsToUpdate,\n };\n}\n\n/**\n * Checks if a collection modification has any actual changes\n *\n * @param modification - Collection modification to check\n * @returns True if there are any changes\n */\nfunction hasChanges(modification: CollectionModification): boolean {\n return (\n modification.fieldsToAdd.length > 0 ||\n modification.fieldsToRemove.length > 0 ||\n modification.fieldsToModify.length > 0 ||\n modification.indexesToAdd.length > 0 ||\n modification.indexesToRemove.length > 0 ||\n modification.rulesToUpdate.length > 0 ||\n modification.permissionsToUpdate.length > 0\n );\n}\n\n/**\n * Aggregates all detected changes into a SchemaDiff\n * Main entry point for diff comparison\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @param config - Optional configuration\n * @returns Complete SchemaDiff with all changes\n */\nexport function aggregateChanges(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null,\n config?: DiffEngineConfig\n): SchemaDiff {\n // Find new and removed collections\n const collectionsToCreate = findNewCollections(currentSchema, previousSnapshot);\n const collectionsToDelete = findRemovedCollections(currentSchema, previousSnapshot);\n\n // Filter out system collections from create and delete operations\n const filteredCollectionsToCreate = collectionsToCreate.filter(\n (collection) => !isSystemCollection(collection.name, config)\n );\n const filteredCollectionsToDelete = collectionsToDelete.filter(\n (collection) => !isSystemCollection(collection.name, config)\n );\n\n // Find modified collections\n const collectionsToModify: CollectionModification[] = [];\n const matchedCollections = matchCollectionsByName(currentSchema, previousSnapshot);\n\n for (const [currentCollection, previousCollection] of matchedCollections) {\n const modification = buildCollectionModification(currentCollection, previousCollection, config);\n\n // Only include if there are actual changes\n // Note: We allow modifications to the users collection (non-system)\n if (hasChanges(modification)) {\n collectionsToModify.push(modification);\n }\n }\n\n return {\n collectionsToCreate: filteredCollectionsToCreate,\n collectionsToDelete: filteredCollectionsToDelete,\n collectionsToModify,\n };\n}\n\n/**\n * Detects destructive changes in a schema diff\n * Returns detailed information about each destructive change\n *\n * @param diff - Schema diff to analyze\n * @param config - Optional configuration for severity thresholds\n * @returns Array of destructive changes with severity information\n */\nexport function detectDestructiveChanges(diff: SchemaDiff, config?: DiffEngineConfig): DestructiveChange[] {\n const destructiveChanges: DestructiveChange[] = [];\n const mergedConfig = mergeConfig(config);\n\n // Collection deletions are always high severity\n for (const collection of diff.collectionsToDelete) {\n destructiveChanges.push({\n type: \"collection_delete\",\n severity: \"high\",\n collection: collection.name,\n description: `Delete collection: ${collection.name}`,\n });\n }\n\n // Analyze modifications\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n\n // Field deletions are high severity\n for (const field of modification.fieldsToRemove) {\n destructiveChanges.push({\n type: \"field_delete\",\n severity: \"high\",\n collection: collectionName,\n field: field.name,\n description: `Delete field: ${collectionName}.${field.name}`,\n });\n }\n\n // Field modifications can be various severities\n for (const fieldMod of modification.fieldsToModify) {\n const typeChange = fieldMod.changes.find((c) => c.property === \"type\");\n const requiredChange = fieldMod.changes.find((c) => c.property === \"required\" && c.newValue === true);\n\n if (typeChange) {\n destructiveChanges.push({\n type: \"type_change\",\n severity: \"high\",\n collection: collectionName,\n field: fieldMod.fieldName,\n description: `Change field type: ${collectionName}.${fieldMod.fieldName} (${typeChange.oldValue} → ${typeChange.newValue})`,\n oldValue: typeChange.oldValue,\n newValue: typeChange.newValue,\n });\n }\n\n if (requiredChange && mergedConfig.severityThreshold !== \"high\") {\n destructiveChanges.push({\n type: \"required_change\",\n severity: \"medium\",\n collection: collectionName,\n field: fieldMod.fieldName,\n description: `Make field required: ${collectionName}.${fieldMod.fieldName}`,\n oldValue: false,\n newValue: true,\n });\n }\n\n // Other constraint changes at low severity\n if (mergedConfig.severityThreshold === \"low\") {\n const otherChanges = fieldMod.changes.filter((c) => c.property !== \"type\" && c.property !== \"required\");\n for (const change of otherChanges) {\n destructiveChanges.push({\n type: \"constraint_change\",\n severity: \"low\",\n collection: collectionName,\n field: fieldMod.fieldName,\n description: `Change constraint: ${collectionName}.${fieldMod.fieldName}.${change.property}`,\n oldValue: change.oldValue,\n newValue: change.newValue,\n });\n }\n }\n }\n }\n\n return destructiveChanges;\n}\n\n/**\n * Categorizes changes by severity\n * Returns object with destructive and non-destructive changes\n *\n * @param diff - Schema diff to categorize\n * @param config - Optional configuration\n * @returns Object with categorized changes\n */\nexport function categorizeChangesBySeverity(\n diff: SchemaDiff,\n _config?: DiffEngineConfig\n): {\n destructive: string[];\n nonDestructive: string[];\n} {\n const destructive: string[] = [];\n const nonDestructive: string[] = [];\n\n // Collection deletions are destructive\n for (const collection of diff.collectionsToDelete) {\n destructive.push(`Delete collection: ${collection.name}`);\n }\n\n // Collection creations are non-destructive\n for (const collection of diff.collectionsToCreate) {\n nonDestructive.push(`Create collection: ${collection.name}`);\n }\n\n // Analyze modifications\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n\n // Field deletions are destructive\n for (const field of modification.fieldsToRemove) {\n destructive.push(`Delete field: ${collectionName}.${field.name}`);\n }\n\n // Field additions are non-destructive\n for (const field of modification.fieldsToAdd) {\n nonDestructive.push(`Add field: ${collectionName}.${field.name}`);\n }\n\n // Field modifications can be destructive or non-destructive\n for (const fieldMod of modification.fieldsToModify) {\n const hasTypeChange = fieldMod.changes.some((c) => c.property === \"type\");\n const hasRequiredChange = fieldMod.changes.some((c) => c.property === \"required\" && c.newValue === true);\n\n if (hasTypeChange) {\n destructive.push(\n `Change field type: ${collectionName}.${fieldMod.fieldName} (${fieldMod.changes.find((c) => c.property === \"type\")?.oldValue} → ${fieldMod.changes.find((c) => c.property === \"type\")?.newValue})`\n );\n } else if (hasRequiredChange) {\n destructive.push(`Make field required: ${collectionName}.${fieldMod.fieldName}`);\n } else {\n nonDestructive.push(`Modify field: ${collectionName}.${fieldMod.fieldName}`);\n }\n }\n\n // Index changes are generally non-destructive\n for (const _index of modification.indexesToAdd) {\n nonDestructive.push(`Add index: ${collectionName}`);\n }\n\n for (const _index of modification.indexesToRemove) {\n nonDestructive.push(`Remove index: ${collectionName}`);\n }\n\n // Rule changes are non-destructive\n for (const rule of modification.rulesToUpdate) {\n nonDestructive.push(`Update rule: ${collectionName}.${rule.ruleType}`);\n }\n }\n\n return { destructive, nonDestructive };\n}\n\n/**\n * Generates a summary of all changes in a diff\n * Useful for status reporting and user feedback\n *\n * @param diff - Schema diff to summarize\n * @param config - Optional configuration\n * @returns Change summary with counts and details\n */\nexport function generateChangeSummary(diff: SchemaDiff, config?: DiffEngineConfig): ChangeSummary {\n const destructiveChanges = detectDestructiveChanges(diff, config);\n const { nonDestructive } = categorizeChangesBySeverity(diff, config);\n\n let fieldsToAdd = 0;\n let fieldsToRemove = 0;\n let fieldsToModify = 0;\n let indexChanges = 0;\n let ruleChanges = 0;\n let permissionChanges = 0;\n\n for (const modification of diff.collectionsToModify) {\n fieldsToAdd += modification.fieldsToAdd.length;\n fieldsToRemove += modification.fieldsToRemove.length;\n fieldsToModify += modification.fieldsToModify.length;\n indexChanges += modification.indexesToAdd.length + modification.indexesToRemove.length;\n ruleChanges += modification.rulesToUpdate.length;\n permissionChanges += modification.permissionsToUpdate.length;\n }\n\n return {\n totalChanges: diff.collectionsToCreate.length + diff.collectionsToDelete.length + diff.collectionsToModify.length,\n collectionsToCreate: diff.collectionsToCreate.length,\n collectionsToDelete: diff.collectionsToDelete.length,\n collectionsToModify: diff.collectionsToModify.length,\n fieldsToAdd,\n fieldsToRemove,\n fieldsToModify,\n indexChanges,\n ruleChanges,\n permissionChanges,\n destructiveChanges,\n nonDestructiveChanges: nonDestructive,\n };\n}\n\n/**\n * Checks if a diff requires the --force flag based on configuration\n *\n * @param diff - Schema diff to check\n * @param config - Configuration with severity threshold\n * @returns True if force flag is required\n */\nexport function requiresForceFlag(diff: SchemaDiff, config?: DiffEngineConfig): boolean {\n const mergedConfig = mergeConfig(config);\n\n if (!mergedConfig.requireForceForDestructive) {\n return false;\n }\n\n const destructiveChanges = detectDestructiveChanges(diff, config);\n\n // Filter by severity threshold\n const relevantChanges = destructiveChanges.filter((change) => {\n switch (mergedConfig.severityThreshold) {\n case \"high\":\n return change.severity === \"high\";\n case \"medium\":\n return change.severity === \"high\" || change.severity === \"medium\";\n case \"low\":\n return true;\n default:\n return change.severity === \"high\";\n }\n });\n\n return relevantChanges.length > 0;\n}\n\n/**\n * Main comparison function\n * Compares current schema with previous snapshot and returns complete diff\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot (null for first run)\n * @param config - Optional configuration\n * @returns Complete SchemaDiff with all detected changes\n */\nexport function compare(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null,\n config?: DiffEngineConfig\n): SchemaDiff {\n return aggregateChanges(currentSchema, previousSnapshot, config);\n}\n\n/**\n * DiffEngine class for object-oriented usage\n * Provides a stateful interface for schema comparison\n */\nexport class DiffEngine {\n private config: Required<DiffEngineConfig>;\n\n constructor(config?: DiffEngineConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Compares current schema with previous snapshot\n */\n compare(currentSchema: SchemaDefinition, previousSnapshot: SchemaSnapshot | null): SchemaDiff {\n return compare(currentSchema, previousSnapshot, this.config);\n }\n\n /**\n * Detects destructive changes in a diff\n */\n detectDestructiveChanges(diff: SchemaDiff): DestructiveChange[] {\n return detectDestructiveChanges(diff, this.config);\n }\n\n /**\n * Categorizes changes by severity\n */\n categorizeChangesBySeverity(diff: SchemaDiff): { destructive: string[]; nonDestructive: string[] } {\n return categorizeChangesBySeverity(diff, this.config);\n }\n\n /**\n * Generates a summary of changes\n */\n generateChangeSummary(diff: SchemaDiff): ChangeSummary {\n return generateChangeSummary(diff, this.config);\n }\n\n /**\n * Checks if force flag is required\n */\n requiresForceFlag(diff: SchemaDiff): boolean {\n return requiresForceFlag(diff, this.config);\n }\n}\n","/**\n * Migration Generator component\n * Creates PocketBase migration files based on detected differences\n *\n * This module provides a standalone, configurable migration generator that can be used\n * by consumer projects to generate PocketBase-compatible migration files.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { FileSystemError, MigrationGenerationError } from \"./errors\";\nimport type { CollectionSchema, FieldDefinition, FieldModification, SchemaDiff } from \"./types\";\n\n/**\n * Configuration options for the migration generator\n */\nexport interface MigrationGeneratorConfig {\n /**\n * Directory to write migration files\n */\n migrationDir: string;\n\n /**\n * Workspace root for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * Custom timestamp generator function\n * Defaults to Unix timestamp in seconds\n */\n timestampGenerator?: () => string;\n\n /**\n * Custom migration file template\n * Use {{UP_CODE}} and {{DOWN_CODE}} placeholders\n */\n template?: string;\n\n /**\n * Whether to include type reference comment\n * Defaults to true\n */\n includeTypeReference?: boolean;\n\n /**\n * Path to types.d.ts file for reference comment\n * Defaults to '../pb_data/types.d.ts'\n */\n typesPath?: string;\n}\n\n/**\n * Default migration template\n */\nconst DEFAULT_TEMPLATE = `/// <reference path=\"{{TYPES_PATH}}\" />\nmigrate((app) => {\n{{UP_CODE}}\n}, (app) => {\n{{DOWN_CODE}}\n});\n`;\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Omit<Required<MigrationGeneratorConfig>, \"migrationDir\"> = {\n workspaceRoot: process.cwd(),\n timestampGenerator: () => Math.floor(Date.now() / 1000).toString(),\n template: DEFAULT_TEMPLATE,\n includeTypeReference: true,\n typesPath: \"../pb_data/types.d.ts\",\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config: MigrationGeneratorConfig): Required<MigrationGeneratorConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Resolves the migration directory path\n */\nfunction resolveMigrationDir(config: MigrationGeneratorConfig): string {\n const workspaceRoot = config.workspaceRoot || process.cwd();\n\n if (path.isAbsolute(config.migrationDir)) {\n return config.migrationDir;\n }\n\n return path.join(workspaceRoot, config.migrationDir);\n}\n\n/**\n * Generates a timestamp for migration filename\n * Format: Unix timestamp in seconds (e.g., 1687801090)\n *\n * @param config - Optional configuration with custom timestamp generator\n * @returns Timestamp string\n */\nexport function generateTimestamp(config?: MigrationGeneratorConfig): string {\n if (config?.timestampGenerator) {\n return config.timestampGenerator();\n }\n return Math.floor(Date.now() / 1000).toString();\n}\n\n/**\n * Generates a human-readable description from the diff\n * Creates a concise summary of the main changes\n *\n * @param diff - Schema diff containing all changes\n * @returns Description string for filename\n */\nexport function generateMigrationDescription(diff: SchemaDiff): string {\n const parts: string[] = [];\n\n // Summarize collection changes\n if (diff.collectionsToCreate.length > 0) {\n if (diff.collectionsToCreate.length === 1) {\n parts.push(`created_${diff.collectionsToCreate[0].name}`);\n } else {\n parts.push(`created_${diff.collectionsToCreate.length}_collections`);\n }\n }\n\n if (diff.collectionsToDelete.length > 0) {\n if (diff.collectionsToDelete.length === 1) {\n parts.push(`deleted_${diff.collectionsToDelete[0].name}`);\n } else {\n parts.push(`deleted_${diff.collectionsToDelete.length}_collections`);\n }\n }\n\n if (diff.collectionsToModify.length > 0) {\n if (diff.collectionsToModify.length === 1) {\n parts.push(`updated_${diff.collectionsToModify[0].collection}`);\n } else {\n parts.push(`updated_${diff.collectionsToModify.length}_collections`);\n }\n }\n\n // Default description if no changes\n if (parts.length === 0) {\n return \"no_changes\";\n }\n\n // Join parts with underscores and limit length\n let description = parts.join(\"_\");\n\n // Truncate if too long (keep under 100 chars for filename)\n if (description.length > 80) {\n description = description.substring(0, 77) + \"...\";\n }\n\n return description;\n}\n\n/**\n * Generates the migration filename\n * Format: {timestamp}_{description}.js\n *\n * @param diff - Schema diff containing all changes\n * @param config - Optional configuration\n * @returns Migration filename\n */\nexport function generateMigrationFilename(diff: SchemaDiff, config?: MigrationGeneratorConfig): string {\n const timestamp = generateTimestamp(config);\n const description = generateMigrationDescription(diff);\n\n return `${timestamp}_${description}.js`;\n}\n\n/**\n * Creates the migration file structure with up and down functions\n *\n * @param upCode - Code for the up migration\n * @param downCode - Code for the down migration\n * @param config - Optional configuration with custom template\n * @returns Complete migration file content\n */\nexport function createMigrationFileStructure(\n upCode: string,\n downCode: string,\n config?: MigrationGeneratorConfig\n): string {\n const mergedConfig = config ? mergeConfig(config) : DEFAULT_CONFIG;\n let template = mergedConfig.template;\n\n // Replace placeholders\n template = template.replace(\"{{TYPES_PATH}}\", mergedConfig.typesPath);\n template = template.replace(\"{{UP_CODE}}\", upCode);\n template = template.replace(\"{{DOWN_CODE}}\", downCode);\n\n // Remove type reference if disabled\n if (!mergedConfig.includeTypeReference) {\n template = template.replace(/\\/\\/\\/ <reference path=\"[^\"]*\" \\/>\\n?/, \"\");\n }\n\n return template;\n}\n\n/**\n * Writes migration file to the specified directory\n * Creates directory if it doesn't exist\n *\n * @param migrationDir - Directory to write migration file\n * @param filename - Migration filename\n * @param content - Migration file content\n * @returns Full path to the created migration file\n */\nexport function writeMigrationFile(migrationDir: string, filename: string, content: string): string {\n try {\n // Ensure migration directory exists\n if (!fs.existsSync(migrationDir)) {\n try {\n fs.mkdirSync(migrationDir, { recursive: true });\n } catch (error) {\n const fsError = error as NodeJS.ErrnoException;\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied creating migration directory. Check directory permissions.`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n throw new FileSystemError(\n `Failed to create migration directory: ${fsError.message}`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n }\n\n // Full path to migration file\n const filePath = path.join(migrationDir, filename);\n\n // Write migration file\n fs.writeFileSync(filePath, content, \"utf-8\");\n\n return filePath;\n } catch (error) {\n // If it's already a FileSystemError, re-throw it\n if (error instanceof FileSystemError) {\n throw error;\n }\n\n const fsError = error as NodeJS.ErrnoException;\n const filePath = path.join(migrationDir, filename);\n\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied writing migration file. Check file and directory permissions.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n } else if (fsError.code === \"ENOSPC\") {\n throw new FileSystemError(\n `No space left on device when writing migration file.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n }\n\n throw new MigrationGenerationError(`Failed to write migration file: ${fsError.message}`, filePath, error as Error);\n }\n}\n\n/**\n * Formats a value for JavaScript code generation\n * Handles strings, numbers, booleans, null, arrays, and objects\n *\n * @param value - Value to format\n * @returns Formatted string representation\n */\nfunction formatValue(value: any): string {\n if (value === null || value === undefined) {\n return \"null\";\n }\n\n if (typeof value === \"string\") {\n // Escape quotes and special characters\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\")}\"`;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((v) => formatValue(v)).join(\", \");\n return `[${items}]`;\n }\n\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\n .map(([k, v]) => `${k}: ${formatValue(v)}`)\n .join(\", \");\n return `{ ${entries} }`;\n }\n\n return String(value);\n}\n\n/**\n * Generates field definition object for collection creation\n * Creates the field configuration object used in Collection constructor\n *\n * @param field - Field definition\n * @returns Field definition object as string\n */\nexport function generateFieldDefinitionObject(field: FieldDefinition): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add field type\n parts.push(` type: \"${field.type}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation configuration if present\n if (field.relation) {\n // For relation fields, we need to resolve the collection ID\n // For now, we'll use a placeholder that needs to be resolved at runtime\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\n }\n\n return ` {\\n${parts.join(\",\\n\")},\\n }`;\n}\n\n/**\n * Generates fields array for collection creation\n *\n * @param fields - Array of field definitions\n * @returns Fields array as string\n */\nexport function generateFieldsArray(fields: FieldDefinition[]): string {\n if (fields.length === 0) {\n return \"[]\";\n }\n\n const fieldObjects = fields.map((field) => generateFieldDefinitionObject(field));\n return `[\\n${fieldObjects.join(\",\\n\")},\\n ]`;\n}\n\n/**\n * Generates collection rules object\n *\n * @param rules - Collection rules\n * @returns Rules configuration as string\n */\nexport function generateCollectionRules(rules?: CollectionSchema[\"rules\"]): string {\n if (!rules) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (rules.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(rules.listRule)}`);\n }\n\n if (rules.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(rules.viewRule)}`);\n }\n\n if (rules.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(rules.createRule)}`);\n }\n\n if (rules.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(rules.updateRule)}`);\n }\n\n if (rules.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(rules.deleteRule)}`);\n }\n\n if (rules.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(rules.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates collection permissions object\n * Permissions are the same as rules but extracted from schema metadata\n *\n * @param permissions - Collection permissions\n * @returns Permissions configuration as string\n */\nexport function generateCollectionPermissions(permissions?: CollectionSchema[\"permissions\"]): string {\n if (!permissions) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (permissions.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(permissions.listRule)}`);\n }\n\n if (permissions.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(permissions.viewRule)}`);\n }\n\n if (permissions.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(permissions.createRule)}`);\n }\n\n if (permissions.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(permissions.updateRule)}`);\n }\n\n if (permissions.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(permissions.deleteRule)}`);\n }\n\n if (permissions.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(permissions.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates indexes array for collection creation\n *\n * @param indexes - Array of index definitions\n * @returns Indexes array as string\n */\nexport function generateIndexesArray(indexes?: string[]): string {\n if (!indexes || indexes.length === 0) {\n return \"[]\";\n }\n\n const indexStrings = indexes.map((idx) => `\"${idx}\"`);\n return `[\\n ${indexStrings.join(\",\\n \")},\\n ]`;\n}\n\n/**\n * Generates Collection constructor call for creating a new collection\n *\n * @param collection - Collection schema\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @returns JavaScript code for creating the collection\n */\n/**\n * Generates system fields that are required for all PocketBase collections\n * These fields (id, created, updated) must be explicitly included in migrations\n *\n * @returns Array of system field definitions\n */\nfunction getSystemFields(): FieldDefinition[] {\n return [\n // id field - primary key, auto-generated\n {\n name: \"id\",\n type: \"text\",\n required: true,\n options: {\n autogeneratePattern: \"[a-z0-9]{15}\",\n hidden: false,\n id: \"text3208210256\",\n max: 15,\n min: 15,\n pattern: \"^[a-z0-9]+$\",\n presentable: false,\n primaryKey: true,\n system: true,\n },\n },\n // created field - autodate, set on creation\n {\n name: \"created\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate2990389176\",\n onCreate: true,\n onUpdate: false,\n presentable: false,\n system: false,\n },\n },\n // updated field - autodate, set on creation and update\n {\n name: \"updated\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate3332085495\",\n onCreate: true,\n onUpdate: true,\n presentable: false,\n system: false,\n },\n },\n ];\n}\n\nexport function generateCollectionCreation(\n collection: CollectionSchema,\n varName: string = \"collection\",\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = new Collection({`);\n lines.push(` name: \"${collection.name}\",`);\n lines.push(` type: \"${collection.type}\",`);\n\n // Add permissions (preferred) or rules\n // Permissions take precedence if both are defined\n const permissionsCode = generateCollectionPermissions(collection.permissions);\n const rulesCode = generateCollectionRules(collection.rules);\n\n if (permissionsCode) {\n lines.push(` ${permissionsCode},`);\n } else if (rulesCode) {\n lines.push(` ${rulesCode},`);\n }\n\n // Prepend system fields (id, created, updated) to user-defined fields\n // These fields are required by PocketBase and must be explicitly included in migrations\n const systemFields = getSystemFields();\n const allFields = [...systemFields, ...collection.fields];\n\n // Add fields\n lines.push(` fields: ${generateFieldsArray(allFields)},`);\n\n // Add indexes\n lines.push(` indexes: ${generateIndexesArray(collection.indexes)},`);\n\n lines.push(` });`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${varName});` : ` app.save(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Gets the appropriate Field constructor name for a field type\n *\n * @param fieldType - PocketBase field type\n * @returns Field constructor name\n */\nfunction getFieldConstructorName(fieldType: string): string {\n const constructorMap: Record<string, string> = {\n text: \"TextField\",\n email: \"EmailField\",\n url: \"URLField\",\n number: \"NumberField\",\n bool: \"BoolField\",\n date: \"DateField\",\n select: \"SelectField\",\n relation: \"RelationField\",\n file: \"FileField\",\n json: \"JSONField\",\n };\n\n return constructorMap[fieldType] || \"TextField\";\n}\n\n/**\n * Generates field constructor options object\n *\n * @param field - Field definition\n * @returns Options object as string\n */\nfunction generateFieldConstructorOptions(field: FieldDefinition): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation-specific options\n if (field.relation && field.type === \"relation\") {\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\n }\n\n return parts.join(\",\\n\");\n}\n\n/**\n * Generates code for adding a field to an existing collection\n * Uses the appropriate Field constructor based on field type\n *\n * @param collectionName - Name of the collection\n * @param field - Field definition to add\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for adding the field\n */\nexport function generateFieldAddition(\n collectionName: string,\n field: FieldDefinition,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const constructorName = getFieldConstructorName(field.type);\n const collectionVar = varName || `collection_${collectionName}_${field.name}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.add(new ${constructorName}({`);\n lines.push(generateFieldConstructorOptions(field));\n lines.push(` }));`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for modifying an existing field\n * Updates field properties based on detected changes\n *\n * @param collectionName - Name of the collection\n * @param modification - Field modification details\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for modifying the field\n */\nexport function generateFieldModification(\n collectionName: string,\n modification: FieldModification,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${modification.fieldName}`;\n const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${modification.fieldName}\");`);\n lines.push(``);\n\n // Apply each change\n for (const change of modification.changes) {\n if (change.property.startsWith(\"options.\")) {\n // Handle nested options properties\n const optionKey = change.property.replace(\"options.\", \"\");\n // In PocketBase, field properties are set directly on the field, not in an options object\n lines.push(` ${fieldVar}.${optionKey} = ${formatValue(change.newValue)};`);\n } else if (change.property.startsWith(\"relation.\")) {\n // Handle nested relation properties\n const relationKey = change.property.replace(\"relation.\", \"\");\n\n if (relationKey === \"collection\") {\n // Special handling for collection ID\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = String(change.newValue).toLowerCase() === \"users\";\n const collectionIdValue = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${change.newValue}\").id`;\n lines.push(` ${fieldVar}.collectionId = ${collectionIdValue};`);\n } else {\n lines.push(` ${fieldVar}.${relationKey} = ${formatValue(change.newValue)};`);\n }\n } else {\n // Handle top-level properties\n lines.push(` ${fieldVar}.${change.property} = ${formatValue(change.newValue)};`);\n }\n }\n\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a field from a collection\n *\n * @param collectionName - Name of the collection\n * @param fieldName - Name of the field to delete\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the field\n */\nexport function generateFieldDeletion(\n collectionName: string,\n fieldName: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${fieldName}`;\n const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${fieldName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.remove(${fieldVar}.id);`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for adding an index to a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for adding the index\n */\nfunction generateIndexAddition(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.indexes.push(\"${index}\");`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for removing an index from a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for removing the index\n */\nfunction generateIndexRemoval(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n const indexVar = `${collectionVar}_indexToRemove`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${indexVar} = ${collectionVar}.indexes.findIndex(idx => idx === \"${index}\");`);\n lines.push(` if (${indexVar} !== -1) {`);\n lines.push(` ${collectionVar}.indexes.splice(${indexVar}, 1);`);\n lines.push(` }`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection rules\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of rule to update\n * @param newValue - New rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the rule\n */\nfunction generateRuleUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection permissions\n * Handles permission rule updates including manageRule for auth collections\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of permission rule to update\n * @param newValue - New permission rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the permission\n */\nexport function generatePermissionUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a collection\n *\n * @param collectionName - Name of the collection to delete\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the collection\n */\nfunction generateCollectionDeletion(\n collectionName: string,\n varName: string = \"collection\",\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(isLast ? ` return app.delete(${varName});` : ` app.delete(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates the up migration function code\n * Applies all changes from the diff in the correct order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for up migration\n */\nexport function generateUpMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // UP MIGRATION`);\n lines.push(``);\n\n // 1. Create new collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Create new collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_create`;\n lines.push(generateCollectionCreation(collection, varName));\n lines.push(``);\n }\n }\n\n // 2. Modify existing collections\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Modify existing collections`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Add new fields\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Add fields to ${collectionName}`);\n for (const field of modification.fieldsToAdd) {\n const varName = `collection_${collectionName}_add_${field.name}`;\n lines.push(generateFieldAddition(collectionName, field, varName));\n lines.push(``);\n }\n }\n\n // Modify existing fields\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Modify fields in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n const varName = `collection_${collectionName}_modify_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, fieldMod, varName));\n lines.push(``);\n }\n }\n\n // Remove fields\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Remove fields from ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_remove_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n\n // Add indexes\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Add indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_addidx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Remove indexes\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_rmidx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Update permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Update permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.newValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Update rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.newValue, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Delete collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_delete`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes detected`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n\n return code;\n}\n\n/**\n * Generates the down migration function code\n * Reverts all changes from the diff in reverse order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for down migration\n */\nexport function generateDownMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // DOWN MIGRATION (ROLLBACK)`);\n lines.push(``);\n\n // Reverse order: delete -> modify -> create\n\n // 1. Recreate deleted collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Recreate deleted collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_recreate`;\n lines.push(generateCollectionCreation(collection, varName));\n lines.push(``);\n }\n }\n\n // 2. Revert modifications (in reverse order)\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Revert modifications`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Revert permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Revert permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_revert_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.oldValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Revert rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_revert_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.oldValue, varName));\n lines.push(``);\n }\n }\n\n // Revert index removals (add them back)\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Restore indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_restore_idx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert index additions (remove them)\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_revert_idx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert field removals (add them back)\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Restore fields to ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_restore_${field.name}`;\n lines.push(generateFieldAddition(collectionName, field, varName));\n lines.push(``);\n }\n }\n\n // Revert field modifications\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Revert field modifications in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n // Create a reverse modification\n const reverseChanges = fieldMod.changes.map((change) => ({\n property: change.property,\n oldValue: change.newValue,\n newValue: change.oldValue,\n }));\n\n const reverseMod: FieldModification = {\n fieldName: fieldMod.fieldName,\n currentDefinition: fieldMod.newDefinition,\n newDefinition: fieldMod.currentDefinition,\n changes: reverseChanges,\n };\n\n const varName = `collection_${collectionName}_revert_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, reverseMod, varName));\n lines.push(``);\n }\n }\n\n // Revert field additions (remove them)\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Remove added fields from ${collectionName}`);\n for (const field of modification.fieldsToAdd) {\n const varName = `collection_${collectionName}_revert_add_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete created collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Delete created collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_rollback`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes to revert`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n\n return code;\n}\n\n/**\n * Main generation function\n * Generates complete migration file from schema diff\n *\n * @param diff - Schema diff containing all changes\n * @param config - Migration generator configuration\n * @returns Path to the generated migration file\n */\nexport function generate(diff: SchemaDiff, config: MigrationGeneratorConfig | string): string {\n // Support legacy string-only parameter (migration directory)\n const normalizedConfig: MigrationGeneratorConfig = typeof config === \"string\" ? { migrationDir: config } : config;\n\n try {\n const migrationDir = resolveMigrationDir(normalizedConfig);\n\n // Generate up and down migration code\n const upCode = generateUpMigration(diff);\n const downCode = generateDownMigration(diff);\n\n // Create migration file structure\n const content = createMigrationFileStructure(upCode, downCode, normalizedConfig);\n\n // Generate filename\n const filename = generateMigrationFilename(diff, normalizedConfig);\n\n // Write migration file\n const filePath = writeMigrationFile(migrationDir, filename, content);\n\n return filePath;\n } catch (error) {\n // If it's already a MigrationGenerationError or FileSystemError, re-throw it\n if (error instanceof MigrationGenerationError || error instanceof FileSystemError) {\n throw error;\n }\n\n // Otherwise, wrap it in a MigrationGenerationError\n throw new MigrationGenerationError(\n `Failed to generate migration: ${error instanceof Error ? error.message : String(error)}`,\n normalizedConfig.migrationDir,\n error as Error\n );\n }\n}\n\n/**\n * MigrationGenerator class for object-oriented usage\n * Provides a stateful interface for migration generation\n */\nexport class MigrationGenerator {\n private config: Required<MigrationGeneratorConfig>;\n\n constructor(config: MigrationGeneratorConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Generates a migration file from a schema diff\n */\n generate(diff: SchemaDiff): string {\n return generate(diff, this.config);\n }\n\n /**\n * Generates the up migration code without writing to file\n */\n generateUpMigration(diff: SchemaDiff): string {\n return generateUpMigration(diff);\n }\n\n /**\n * Generates the down migration code without writing to file\n */\n generateDownMigration(diff: SchemaDiff): string {\n return generateDownMigration(diff);\n }\n\n /**\n * Generates a migration filename\n */\n generateMigrationFilename(diff: SchemaDiff): string {\n return generateMigrationFilename(diff, this.config);\n }\n}\n"]}
1
+ {"version":3,"sources":["../../src/schema/base.ts","../../src/schema/fields.ts","../../src/migration/errors.ts","../../src/utils/permission-templates.ts","../../src/migration/rule-validator.ts","../../src/migration/permission-analyzer.ts","../../src/migration/utils/pluralize.ts","../../src/migration/utils/relation-detector.ts","../../src/migration/utils/type-mapper.ts","../../src/migration/analyzer.ts","../../src/migration/pocketbase-converter.ts","../../src/migration/migration-parser.ts","../../src/migration/snapshot.ts","../../src/migration/diff.ts","../../src/migration/generator.ts"],"names":["z","path","isAuthCollection","fs","ext","required","fieldDef","relationMetadata","fs2","path2","SNAPSHOT_VERSION","DEFAULT_CONFIG","mergeConfig","path3","fs3","migrationContent","path4","fs4"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\nimport type { PermissionSchema, PermissionTemplateConfig } from \"../utils/permissions\";\n\n/**\n * Base schema fields that PocketBase automatically adds to all records\n * These fields are managed by PocketBase and should not be set manually\n */\nexport const baseSchema = {\n id: z.string().describe(\"unique id\"),\n collectionId: z.string().describe(\"collection id\"),\n collectionName: z.string().describe(\"collection name\"),\n expand: z.record(z.any()).describe(\"expandable fields\"),\n created: z.string().describe(\"creation timestamp\"),\n updated: z.string().describe(\"last update timestamp\"),\n};\n\n/**\n * Extended base schema with timestamp fields\n * Includes created and updated autodate fields\n */\nexport const baseSchemaWithTimestamps = {\n ...baseSchema,\n created: z.string().describe(\"creation timestamp\"),\n updated: z.string().describe(\"last update timestamp\"),\n};\n\n/**\n * Base schema for image file collections\n * Extends base schema with thumbnail URL and image files array\n */\nexport const baseImageFileSchema = {\n ...baseSchema,\n thumbnailURL: z.string().optional(),\n imageFiles: z.array(z.string()),\n};\n\n/**\n * Input schema for image file uploads\n * Used in forms where users upload File objects\n * Requires Node.js 20+ or browser environment with File API\n */\nexport const inputImageFileSchema = {\n imageFiles: z.array(z.instanceof(File)),\n};\n\n/**\n * Helper constant for omitting image files from schemas\n * Used with Zod's .omit() method\n */\nexport const omitImageFilesSchema = {\n imageFiles: true,\n} as const;\n\n// ============================================================================\n// Common PocketBase Field Type Patterns\n// ============================================================================\n\n/**\n * Creates a text field schema with optional constraints\n * @param options - Optional constraints for the text field\n */\nexport function textField(options?: { min?: number; max?: number; pattern?: RegExp }) {\n let schema = z.string();\n if (options?.min !== undefined) schema = schema.min(options.min);\n if (options?.max !== undefined) schema = schema.max(options.max);\n if (options?.pattern !== undefined) schema = schema.regex(options.pattern);\n return schema;\n}\n\n/**\n * Creates an email field schema\n * Maps to PocketBase 'email' field type\n */\nexport function emailField() {\n return z.string().email();\n}\n\n/**\n * Creates a URL field schema\n * Maps to PocketBase 'url' field type\n */\nexport function urlField() {\n return z.string().url();\n}\n\n/**\n * Creates a number field schema with optional constraints\n * @param options - Optional constraints for the number field\n */\nexport function numberField(options?: { min?: number; max?: number }) {\n let schema = z.number();\n if (options?.min !== undefined) schema = schema.min(options.min);\n if (options?.max !== undefined) schema = schema.max(options.max);\n return schema;\n}\n\n/**\n * Creates a boolean field schema\n * Maps to PocketBase 'bool' field type\n */\nexport function boolField() {\n return z.boolean();\n}\n\n/**\n * Creates a date field schema\n * Maps to PocketBase 'date' field type\n */\nexport function dateField() {\n return z.date();\n}\n\n/**\n * Creates a select field schema from enum values\n * Maps to PocketBase 'select' field type\n * @param values - Array of allowed string values\n */\nexport function selectField<T extends [string, ...string[]]>(values: T) {\n return z.enum(values);\n}\n\n/**\n * Creates a JSON field schema\n * Maps to PocketBase 'json' field type\n * @param schema - Optional Zod schema for the JSON structure\n */\nexport function jsonField<T extends z.ZodTypeAny>(schema?: T) {\n return schema ?? z.record(z.any());\n}\n\n/**\n * Creates a single file field schema for form input\n * Maps to PocketBase 'file' field type with maxSelect=1\n * Requires Node.js 20+ or browser environment with File API\n */\nexport function fileField() {\n return z.instanceof(File);\n}\n\n/**\n * Creates a multiple file field schema for form input\n * Maps to PocketBase 'file' field type with maxSelect>1\n * Requires Node.js 20+ or browser environment with File API\n * @param options - Optional constraints for the file field\n */\nexport function filesField(options?: { min?: number; max?: number }) {\n let schema = z.array(z.instanceof(File));\n if (options?.min !== undefined) schema = schema.min(options.min);\n if (options?.max !== undefined) schema = schema.max(options.max);\n return schema;\n}\n\n// ============================================================================\n// Relation Field Helpers - Explicit Relationship Definitions\n// ============================================================================\n\n/**\n * Relation field configuration options\n */\nexport interface RelationConfig {\n /**\n * Target collection name (e.g., 'users', 'posts', 'tags')\n * This is the PocketBase collection that the relation points to\n */\n collection: string;\n\n /**\n * Whether to cascade delete related records when this record is deleted\n * @default false\n */\n cascadeDelete?: boolean;\n}\n\n/**\n * Multiple relation field configuration options\n */\nexport interface RelationsConfig extends RelationConfig {\n /**\n * Minimum number of relations required\n * @default 0\n */\n minSelect?: number;\n\n /**\n * Maximum number of relations allowed\n * @default 999\n */\n maxSelect?: number;\n}\n\n/**\n * Internal marker for relation metadata\n * Used by the analyzer to detect explicit relation definitions\n */\nconst RELATION_METADATA_KEY = \"__pocketbase_relation__\";\n\n/**\n * Creates a single relation field schema with explicit collection target\n * Maps to PocketBase 'relation' field type with maxSelect=1\n *\n * This is the recommended way to define relations - it's explicit and doesn't\n * rely on naming conventions.\n *\n * @param config - Relation configuration with target collection\n * @returns Zod string schema with relation metadata\n *\n * @example\n * // Single relation to users collection\n * const PostSchema = z.object({\n * title: z.string(),\n * author: RelationField({ collection: 'users' }),\n * });\n *\n * @example\n * // Relation with cascade delete\n * const CommentSchema = z.object({\n * content: z.string(),\n * post: RelationField({ collection: 'posts', cascadeDelete: true }),\n * });\n */\nexport function RelationField(config: RelationConfig) {\n const metadata = {\n [RELATION_METADATA_KEY]: {\n type: \"single\",\n collection: config.collection,\n cascadeDelete: config.cascadeDelete ?? false,\n maxSelect: 1,\n minSelect: 0,\n },\n };\n\n return z.string().describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a multiple relation field schema with explicit collection target\n * Maps to PocketBase 'relation' field type with maxSelect>1\n *\n * This is the recommended way to define multi-relations - it's explicit and\n * doesn't rely on naming conventions.\n *\n * @param config - Relations configuration with target collection and limits\n * @returns Zod array of strings schema with relation metadata\n *\n * @example\n * // Multiple relations to tags collection\n * const PostSchema = z.object({\n * title: z.string(),\n * tags: RelationsField({ collection: 'tags' }),\n * });\n *\n * @example\n * // Relations with min/max constraints\n * const ProjectSchema = z.object({\n * title: z.string(),\n * collaborators: RelationsField({\n * collection: 'users',\n * minSelect: 1,\n * maxSelect: 10,\n * }),\n * });\n */\nexport function RelationsField(config: RelationsConfig) {\n const metadata = {\n [RELATION_METADATA_KEY]: {\n type: \"multiple\",\n collection: config.collection,\n cascadeDelete: config.cascadeDelete ?? false,\n maxSelect: config.maxSelect ?? 999,\n minSelect: config.minSelect ?? 0,\n },\n };\n\n let schema = z.array(z.string());\n\n // Apply array constraints for Zod validation\n if (config.minSelect !== undefined) {\n schema = schema.min(config.minSelect);\n }\n if (config.maxSelect !== undefined) {\n schema = schema.max(config.maxSelect);\n }\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Extracts relation metadata from a Zod type's description\n * Used internally by the analyzer to detect explicit relation definitions\n *\n * @param description - The Zod type's description string\n * @returns Relation metadata if present, null otherwise\n */\nexport function extractRelationMetadata(description: string | undefined): {\n type: \"single\" | \"multiple\";\n collection: string;\n cascadeDelete: boolean;\n maxSelect: number;\n minSelect: number;\n} | null {\n if (!description) return null;\n\n try {\n const parsed = JSON.parse(description);\n if (parsed[RELATION_METADATA_KEY]) {\n return parsed[RELATION_METADATA_KEY];\n }\n } catch {\n // Not JSON, ignore\n }\n\n return null;\n}\n\n/**\n * Creates an editor field schema (rich text)\n * Maps to PocketBase 'editor' field type\n */\nexport function editorField() {\n return z.string();\n}\n\n/**\n * Creates a geo point field schema\n * Maps to PocketBase 'geoPoint' field type\n */\nexport function geoPointField() {\n return z.object({\n lon: z.number(),\n lat: z.number(),\n });\n}\n\n/**\n * Attach permission metadata to a Zod schema\n *\n * This helper function allows you to define PocketBase API rules alongside your\n * entity schema definitions. The permissions are stored as metadata using Zod's\n * describe() method and will be extracted during migration generation.\n *\n * @param schema - The Zod schema to attach permissions to\n * @param config - Either a PermissionTemplateConfig (for template-based permissions)\n * or a PermissionSchema (for custom permissions)\n * @returns The schema with permission metadata attached\n *\n * @example\n * // Using a template\n * const ProjectSchema = withPermissions(\n * z.object({ title: z.string(), User: z.string() }),\n * { template: 'owner-only', ownerField: 'User' }\n * );\n *\n * @example\n * // Using custom rules\n * const ProjectSchema = withPermissions(\n * z.object({ title: z.string() }),\n * { listRule: '@request.auth.id != \"\"', viewRule: '' }\n * );\n *\n * @example\n * // Using template with custom rule overrides\n * const ProjectSchema = withPermissions(\n * z.object({ title: z.string(), User: z.string() }),\n * {\n * template: 'owner-only',\n * ownerField: 'User',\n * customRules: { listRule: '@request.auth.id != \"\"' }\n * }\n * );\n */\nexport function withPermissions<T extends z.ZodTypeAny>(\n schema: T,\n config: PermissionTemplateConfig | PermissionSchema\n): T {\n // Create metadata object with permissions config directly\n // The PermissionAnalyzer will handle resolving templates vs direct schemas\n const metadata = {\n permissions: config,\n };\n\n // Attach permission metadata to schema using Zod's describe() method\n // The metadata is serialized as JSON and stored in the schema's description\n return schema.describe(JSON.stringify(metadata)) as T;\n}\n\n/**\n * Attach index definitions to a Zod schema\n *\n * This helper function allows you to define PocketBase indexes alongside your\n * entity schema definitions. The indexes are stored as metadata using Zod's\n * describe() method and will be extracted during migration generation.\n *\n * @param schema - The Zod schema to attach indexes to\n * @param indexes - Array of PocketBase index SQL statements\n * @returns The schema with index metadata attached\n *\n * @example\n * // Define indexes for a user schema\n * const UserSchema = withIndexes(\n * withPermissions(\n * z.object({ name: z.string(), email: z.string().email() }),\n * userPermissions\n * ),\n * [\n * 'CREATE UNIQUE INDEX idx_users_email ON users (email)',\n * 'CREATE INDEX idx_users_name ON users (name)'\n * ]\n * );\n *\n * @example\n * // Single index\n * const ProjectSchema = withIndexes(\n * ProjectDatabaseSchema,\n * ['CREATE INDEX idx_projects_status ON projects (status)']\n * );\n */\nexport function withIndexes<T extends z.ZodTypeAny>(schema: T, indexes: string[]): T {\n // Extract existing metadata if present\n let existingMetadata: any = {};\n\n if (schema.description) {\n try {\n existingMetadata = JSON.parse(schema.description);\n } catch {\n // If description is not JSON, ignore it\n }\n }\n\n // Merge indexes with existing metadata\n const metadata = {\n ...existingMetadata,\n indexes,\n };\n\n // Attach metadata to schema using Zod's describe() method\n return schema.describe(JSON.stringify(metadata)) as T;\n}\n\n/**\n * Configuration options for defining a collection\n */\nexport interface CollectionConfig {\n /**\n * The name of the PocketBase collection\n * This will be used when generating migrations\n */\n collectionName: string;\n\n /**\n * The Zod schema definition for the collection\n */\n schema: z.ZodObject<any>;\n\n /**\n * Optional permission configuration\n * Can be a template-based config or custom permission rules\n */\n permissions?: PermissionTemplateConfig | PermissionSchema;\n\n /**\n * Optional array of index SQL statements\n * Example: ['CREATE UNIQUE INDEX idx_users_email ON users (email)']\n */\n indexes?: string[];\n\n /**\n * Optional collection type\n * - \"base\": Standard collection (default)\n * - \"auth\": Authentication collection with system auth fields\n *\n * If not specified, the type will be auto-detected based on field presence\n * (collections with both email and password fields are detected as auth)\n */\n type?: \"base\" | \"auth\";\n\n /**\n * Future extensibility - additional options can be added here\n */\n [key: string]: unknown;\n}\n\n/**\n * High-level wrapper for defining a PocketBase collection with all metadata\n *\n * This is the recommended way to define collections as it provides a single\n * entry point for collection name, schema, permissions, indexes, and future features.\n *\n * @param config - Collection configuration object\n * @returns The schema with all metadata attached\n *\n * @example\n * // Recommended: Use default export for clarity\n * const PostCollection = defineCollection({\n * collectionName: \"posts\",\n * schema: z.object({\n * title: z.string(),\n * content: z.string(),\n * author: RelationField({ collection: \"users\" }),\n * }),\n * permissions: {\n * template: \"owner-only\",\n * ownerField: \"author\",\n * },\n * });\n * export default PostCollection;\n *\n * @example\n * // Also supported: Named export (backward compatible)\n * export const PostCollection = defineCollection({\n * collectionName: \"posts\",\n * schema: z.object({\n * title: z.string(),\n * content: z.string(),\n * author: RelationField({ collection: \"users\" }),\n * }),\n * permissions: {\n * template: \"owner-only\",\n * ownerField: \"author\",\n * },\n * });\n *\n * @example\n * // Collection with permissions and indexes\n * export const UserSchema = defineCollection({\n * collectionName: \"users\",\n * schema: z.object({\n * name: z.string(),\n * email: z.string().email(),\n * }),\n * permissions: {\n * listRule: \"id = @request.auth.id\",\n * viewRule: \"id = @request.auth.id\",\n * createRule: \"\",\n * updateRule: \"id = @request.auth.id\",\n * deleteRule: \"id = @request.auth.id\",\n * },\n * indexes: [\n * \"CREATE UNIQUE INDEX idx_users_email ON users (email)\",\n * ],\n * });\n *\n * @example\n * // Collection with template and custom rule overrides\n * export const ProjectSchema = defineCollection({\n * collectionName: \"projects\",\n * schema: z.object({\n * title: z.string(),\n * owner: RelationField({ collection: \"users\" }),\n * }),\n * permissions: {\n * template: \"owner-only\",\n * ownerField: \"owner\",\n * customRules: {\n * listRule: '@request.auth.id != \"\"',\n * },\n * },\n * });\n */\nexport function defineCollection(config: CollectionConfig): z.ZodObject<any> {\n const { collectionName, schema, permissions, indexes, type, ...futureOptions } = config;\n\n // Build metadata object\n const metadata: any = {\n collectionName,\n };\n\n // Add type if provided\n if (type) {\n metadata.type = type;\n }\n\n // Add permissions if provided\n if (permissions) {\n metadata.permissions = permissions;\n }\n\n // Add indexes if provided\n if (indexes) {\n metadata.indexes = indexes;\n }\n\n // Add any future options\n if (Object.keys(futureOptions).length > 0) {\n Object.assign(metadata, futureOptions);\n }\n\n // Attach all metadata to schema using Zod's describe() method\n return schema.describe(JSON.stringify(metadata)) as z.ZodObject<any>;\n}\n","import { z } from \"zod\";\n\n// ============================================================================\n// Field Metadata System\n// ============================================================================\n\n/**\n * Internal marker for field metadata\n * Used by the migration generator to detect explicit field type definitions\n */\nexport const FIELD_METADATA_KEY = \"__pocketbase_field__\";\n\n/**\n * PocketBase field types\n */\nexport type PocketBaseFieldType =\n | \"text\"\n | \"email\"\n | \"url\"\n | \"editor\"\n | \"number\"\n | \"bool\"\n | \"date\"\n | \"autodate\"\n | \"select\"\n | \"relation\"\n | \"file\"\n | \"json\"\n | \"geoPoint\";\n\n/**\n * Field metadata structure embedded in Zod schema descriptions\n */\nexport interface FieldMetadata {\n type: PocketBaseFieldType;\n options?: Record<string, any>;\n}\n\n/**\n * Extracts field metadata from a Zod type's description\n * Used by the migration generator to detect explicit field type definitions\n *\n * @param description - The Zod type's description string\n * @returns Field metadata if present, null otherwise\n *\n * @example\n * const schema = TextField({ min: 1, max: 100 });\n * const metadata = extractFieldMetadata(schema.description);\n * // Returns: { type: \"text\", options: { min: 1, max: 100 } }\n */\nexport function extractFieldMetadata(description: string | undefined): FieldMetadata | null {\n if (!description) return null;\n\n try {\n const parsed = JSON.parse(description);\n if (parsed[FIELD_METADATA_KEY]) {\n return parsed[FIELD_METADATA_KEY];\n }\n } catch {\n // Not JSON, ignore\n }\n\n return null;\n}\n\n// ============================================================================\n// Field Options Interfaces\n// ============================================================================\n\n/**\n * Text field configuration options\n */\nexport interface TextFieldOptions {\n /**\n * Minimum length constraint\n */\n min?: number;\n\n /**\n * Maximum length constraint\n */\n max?: number;\n\n /**\n * Pattern constraint (regex)\n */\n pattern?: RegExp | string;\n\n /**\n * Auto-generate pattern for automatic value generation\n * Example: \"[A-Z]{3}-[0-9]{6}\" generates values like \"ABC-123456\"\n */\n autogeneratePattern?: string;\n}\n\n/**\n * Number field configuration options\n */\nexport interface NumberFieldOptions {\n /**\n * Minimum value constraint\n */\n min?: number;\n\n /**\n * Maximum value constraint\n */\n max?: number;\n\n /**\n * Whether to disallow decimal values (integers only)\n */\n noDecimal?: boolean;\n}\n\n/**\n * Date field configuration options\n */\nexport interface DateFieldOptions {\n /**\n * Minimum date constraint\n */\n min?: Date | string;\n\n /**\n * Maximum date constraint\n */\n max?: Date | string;\n}\n\n/**\n * Autodate field configuration options\n */\nexport interface AutodateFieldOptions {\n /**\n * Set date automatically on record creation\n * @default false\n */\n onCreate?: boolean;\n\n /**\n * Update date automatically on record update\n * @default false\n */\n onUpdate?: boolean;\n}\n\n/**\n * Select field configuration options\n */\nexport interface SelectFieldOptions {\n /**\n * Maximum number of selections allowed\n * If > 1, enables multiple selection\n * @default 1\n */\n maxSelect?: number;\n}\n\n/**\n * File field configuration options\n */\nexport interface FileFieldOptions {\n /**\n * Allowed MIME types\n * Example: [\"image/*\", \"application/pdf\"]\n */\n mimeTypes?: string[];\n\n /**\n * Maximum file size in bytes\n */\n maxSize?: number;\n\n /**\n * Thumbnail sizes to generate\n * Example: [\"100x100\", \"200x200\"]\n */\n thumbs?: string[];\n\n /**\n * Whether the file is protected (requires auth to access)\n * @default false\n */\n protected?: boolean;\n}\n\n/**\n * Multiple files field configuration options\n */\nexport interface FilesFieldOptions extends FileFieldOptions {\n /**\n * Minimum number of files required\n */\n minSelect?: number;\n\n /**\n * Maximum number of files allowed\n */\n maxSelect?: number;\n}\n\n// ============================================================================\n// Field Helper Functions\n// ============================================================================\n\n/**\n * Creates a boolean field schema\n * Maps to PocketBase 'bool' field type\n *\n * @returns Zod boolean schema with PocketBase metadata\n *\n * @example\n * const ProductSchema = z.object({\n * active: BoolField(),\n * featured: BoolField().optional(),\n * });\n */\nexport function BoolField(): z.ZodBoolean {\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"bool\" as const,\n },\n };\n\n return z.boolean().describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a number field schema with optional constraints\n * Maps to PocketBase 'number' field type\n *\n * @param options - Optional constraints for the number field\n * @returns Zod number schema with PocketBase metadata\n *\n * @example\n * const ProductSchema = z.object({\n * price: NumberField({ min: 0 }),\n * quantity: NumberField({ min: 0, noDecimal: true }),\n * rating: NumberField({ min: 0, max: 5 }),\n * });\n */\nexport function NumberField(options?: NumberFieldOptions): z.ZodNumber {\n // Validate options\n if (options?.min !== undefined && options?.max !== undefined) {\n if (options.min > options.max) {\n throw new Error(\"NumberField: min cannot be greater than max\");\n }\n }\n\n // Create base schema\n let schema = z.number();\n\n // Apply Zod validations\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"number\" as const,\n options: options || {},\n },\n };\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a text field schema with optional constraints\n * Maps to PocketBase 'text' field type\n *\n * @param options - Optional constraints for the text field\n * @returns Zod string schema with PocketBase metadata\n *\n * @example\n * const ProductSchema = z.object({\n * name: TextField({ min: 1, max: 200 }),\n * sku: TextField({ autogeneratePattern: \"[A-Z]{3}-[0-9]{6}\" }),\n * description: TextField({ max: 1000 }),\n * });\n */\nexport function TextField(options?: TextFieldOptions): z.ZodString {\n // Validate options\n if (options?.min !== undefined && options?.max !== undefined) {\n if (options.min > options.max) {\n throw new Error(\"TextField: min cannot be greater than max\");\n }\n }\n\n // Create base schema\n let schema = z.string();\n\n // Apply Zod validations\n if (options?.min !== undefined) {\n schema = schema.min(options.min);\n }\n if (options?.max !== undefined) {\n schema = schema.max(options.max);\n }\n if (options?.pattern !== undefined) {\n const pattern = options.pattern instanceof RegExp ? options.pattern : new RegExp(options.pattern);\n schema = schema.regex(pattern);\n }\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"text\" as const,\n options: options || {},\n },\n };\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates an email field schema\n * Maps to PocketBase 'email' field type\n *\n * @returns Zod string schema with email validation and PocketBase metadata\n *\n * @example\n * const UserSchema = z.object({\n * email: EmailField(),\n * alternateEmail: EmailField().optional(),\n * });\n */\nexport function EmailField(): z.ZodString {\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"email\" as const,\n },\n };\n\n return z.string().email().describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a URL field schema\n * Maps to PocketBase 'url' field type\n *\n * @returns Zod string schema with URL validation and PocketBase metadata\n *\n * @example\n * const ProductSchema = z.object({\n * website: URLField(),\n * documentation: URLField().optional(),\n * });\n */\nexport function URLField(): z.ZodString {\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"url\" as const,\n },\n };\n\n return z.string().url().describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a rich text editor field schema\n * Maps to PocketBase 'editor' field type\n *\n * @returns Zod string schema with PocketBase metadata\n *\n * @example\n * const PostSchema = z.object({\n * content: EditorField(),\n * summary: EditorField().optional(),\n * });\n */\nexport function EditorField(): z.ZodString {\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"editor\" as const,\n },\n };\n\n return z.string().describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a date field schema with optional constraints\n * Maps to PocketBase 'date' field type\n *\n * @param options - Optional date constraints\n * @returns Zod string schema with PocketBase metadata\n *\n * @example\n * const EventSchema = z.object({\n * startDate: DateField(),\n * endDate: DateField({ min: new Date('2024-01-01') }),\n * releaseDate: DateField().optional(),\n * });\n */\nexport function DateField(options?: DateFieldOptions): z.ZodString {\n // Validate options\n if (options?.min !== undefined && options?.max !== undefined) {\n const minDate = typeof options.min === \"string\" ? new Date(options.min) : options.min;\n const maxDate = typeof options.max === \"string\" ? new Date(options.max) : options.max;\n if (minDate > maxDate) {\n throw new Error(\"DateField: min cannot be greater than max\");\n }\n }\n\n // Create base schema\n const schema = z.string();\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"date\" as const,\n options: options || {},\n },\n };\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates an autodate field schema with automatic timestamp management\n * Maps to PocketBase 'autodate' field type\n *\n * @param options - Optional autodate configuration\n * @returns Zod string schema with PocketBase metadata\n *\n * @example\n * const PostSchema = z.object({\n * createdAt: AutodateField({ onCreate: true }),\n * updatedAt: AutodateField({ onUpdate: true }),\n * publishedAt: AutodateField({ onCreate: true, onUpdate: false }),\n * });\n */\nexport function AutodateField(options?: AutodateFieldOptions): z.ZodString {\n const schema = z.string();\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"autodate\" as const,\n options: options || {},\n },\n };\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a select field schema from enum values\n * Maps to PocketBase 'select' field type\n *\n * @param values - Array of allowed string values\n * @param options - Optional select configuration\n * @returns Zod enum or array schema with PocketBase metadata\n *\n * @example\n * // Single select\n * const PostSchema = z.object({\n * status: SelectField([\"draft\", \"published\", \"archived\"]),\n * });\n *\n * @example\n * // Multiple select\n * const ProductSchema = z.object({\n * categories: SelectField([\"electronics\", \"clothing\", \"food\"], { maxSelect: 3 }),\n * });\n */\nexport function SelectField<T extends [string, ...string[]]>(\n values: T,\n options?: SelectFieldOptions\n): z.ZodEnum<T> | z.ZodArray<z.ZodEnum<T>> {\n const enumSchema = z.enum(values);\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"select\" as const,\n options: {\n values,\n maxSelect: options?.maxSelect ?? 1,\n },\n },\n };\n\n // Return array schema if maxSelect > 1\n if (options?.maxSelect && options.maxSelect > 1) {\n return z.array(enumSchema).describe(JSON.stringify(metadata));\n }\n\n return enumSchema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a single file field schema\n * Maps to PocketBase 'file' field type with maxSelect=1\n *\n * @param options - Optional file constraints\n * @returns Zod File schema with PocketBase metadata\n *\n * @example\n * const ProductSchema = z.object({\n * thumbnail: FileField({ mimeTypes: [\"image/*\"], maxSize: 5242880 }),\n * document: FileField({ mimeTypes: [\"application/pdf\"] }),\n * });\n */\nexport function FileField(options?: FileFieldOptions): z.ZodType<File> {\n const schema = z.instanceof(File);\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"file\" as const,\n options: options || {},\n },\n };\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a multiple files field schema\n * Maps to PocketBase 'file' field type with maxSelect>1\n *\n * @param options - Optional file constraints\n * @returns Zod array of File schema with PocketBase metadata\n *\n * @example\n * const ProductSchema = z.object({\n * images: FilesField({ mimeTypes: [\"image/*\"], maxSelect: 5 }),\n * attachments: FilesField({ minSelect: 1, maxSelect: 10 }),\n * });\n */\nexport function FilesField(options?: FilesFieldOptions): z.ZodArray<z.ZodType<File>> {\n // Validate options\n if (options?.minSelect !== undefined && options?.maxSelect !== undefined) {\n if (options.minSelect > options.maxSelect) {\n throw new Error(\"FilesField: minSelect cannot be greater than maxSelect\");\n }\n }\n\n let schema = z.array(z.instanceof(File));\n\n // Apply Zod validations\n if (options?.minSelect !== undefined) {\n schema = schema.min(options.minSelect);\n }\n if (options?.maxSelect !== undefined) {\n schema = schema.max(options.maxSelect);\n }\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"file\" as const,\n options: options || {},\n },\n };\n\n return schema.describe(JSON.stringify(metadata));\n}\n\n/**\n * Creates a JSON field schema with optional inner schema validation\n * Maps to PocketBase 'json' field type\n *\n * @param schema - Optional Zod schema for the JSON structure\n * @returns Zod schema with PocketBase metadata\n *\n * @example\n * // Any JSON\n * const ProductSchema = z.object({\n * metadata: JSONField(),\n * });\n *\n * @example\n * // Typed JSON\n * const ProductSchema = z.object({\n * settings: JSONField(z.object({\n * theme: z.string(),\n * notifications: z.boolean(),\n * })),\n * });\n */\nexport function JSONField<T extends z.ZodTypeAny>(schema?: T): T | z.ZodRecord<z.ZodString, z.ZodAny> {\n const baseSchema = schema ?? z.record(z.string(), z.any());\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"json\" as const,\n },\n };\n\n return baseSchema.describe(JSON.stringify(metadata)) as T | z.ZodRecord<z.ZodString, z.ZodAny>;\n}\n\n/**\n * Creates a geographic point field schema\n * Maps to PocketBase 'geoPoint' field type\n *\n * @returns Zod object schema with lon/lat fields and PocketBase metadata\n *\n * @example\n * const LocationSchema = z.object({\n * coordinates: GeoPointField(),\n * homeLocation: GeoPointField().optional(),\n * });\n */\nexport function GeoPointField(): z.ZodObject<{\n lon: z.ZodNumber;\n lat: z.ZodNumber;\n}> {\n const schema = z.object({\n lon: z.number(),\n lat: z.number(),\n });\n\n // Build metadata\n const metadata = {\n [FIELD_METADATA_KEY]: {\n type: \"geoPoint\" as const,\n },\n };\n\n return schema.describe(JSON.stringify(metadata));\n}\n","/**\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 type { PermissionSchema, PermissionTemplateConfig, RuleExpression } from \"../utils/permissions\";\n\n/**\n * Predefined permission templates for common access control patterns\n */\nexport const PermissionTemplates = {\n /**\n * Public access - anyone can perform all operations\n */\n public: (): PermissionSchema => ({\n listRule: \"\",\n viewRule: \"\",\n createRule: \"\",\n updateRule: \"\",\n deleteRule: \"\",\n }),\n\n /**\n * Authenticated users only - requires valid authentication for all operations\n */\n authenticated: (): PermissionSchema => ({\n listRule: '@request.auth.id != \"\"',\n viewRule: '@request.auth.id != \"\"',\n createRule: '@request.auth.id != \"\"',\n updateRule: '@request.auth.id != \"\"',\n deleteRule: '@request.auth.id != \"\"',\n }),\n\n /**\n * Owner-only access - users can only manage their own records\n * @param ownerField - Name of the relation field pointing to user (default: 'User')\n */\n ownerOnly: (ownerField: string = \"User\"): PermissionSchema => ({\n listRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n viewRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n createRule: '@request.auth.id != \"\"',\n updateRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n deleteRule: `@request.auth.id != \"\" && ${ownerField} = @request.auth.id`,\n }),\n\n /**\n * Admin/superuser only access\n * Assumes a 'role' field exists with 'admin' value\n * @param roleField - Name of the role field (default: 'role')\n */\n adminOnly: (roleField: string = \"role\"): PermissionSchema => ({\n listRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n viewRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n createRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n updateRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n deleteRule: `@request.auth.id != \"\" && @request.auth.${roleField} = \"admin\"`,\n }),\n\n /**\n * Public read, authenticated write\n * Anyone can list/view, but only authenticated users can create/update/delete\n */\n readPublic: (): PermissionSchema => ({\n listRule: \"\",\n viewRule: \"\",\n createRule: '@request.auth.id != \"\"',\n updateRule: '@request.auth.id != \"\"',\n deleteRule: '@request.auth.id != \"\"',\n }),\n\n /**\n * Locked access - only superusers can perform operations\n * All rules are set to null (locked)\n */\n locked: (): PermissionSchema => ({\n listRule: null,\n viewRule: null,\n createRule: null,\n updateRule: null,\n deleteRule: null,\n }),\n\n /**\n * Read-only authenticated - authenticated users can read, no write access\n */\n readOnlyAuthenticated: (): PermissionSchema => ({\n listRule: '@request.auth.id != \"\"',\n viewRule: '@request.auth.id != \"\"',\n createRule: null,\n updateRule: null,\n deleteRule: null,\n }),\n};\n\n/**\n * Resolve template configuration to concrete permission schema\n * @param config - Template configuration or direct permission schema\n * @returns Resolved permission schema with all rules defined\n */\nexport function resolveTemplate(config: PermissionTemplateConfig): PermissionSchema {\n let baseRules: PermissionSchema;\n\n switch (config.template) {\n case \"public\":\n baseRules = PermissionTemplates.public();\n break;\n case \"authenticated\":\n baseRules = PermissionTemplates.authenticated();\n break;\n case \"owner-only\":\n baseRules = PermissionTemplates.ownerOnly(config.ownerField);\n break;\n case \"admin-only\":\n baseRules = PermissionTemplates.adminOnly(config.roleField);\n break;\n case \"read-public\":\n baseRules = PermissionTemplates.readPublic();\n break;\n case \"custom\":\n baseRules = {};\n break;\n default: {\n // Exhaustive check - TypeScript will error if we miss a template type\n const _exhaustive: never = config.template;\n throw new Error(`Unknown template type: ${_exhaustive}`);\n }\n }\n\n // Merge with custom rules if provided (custom rules override template rules)\n return {\n ...baseRules,\n ...config.customRules,\n };\n}\n\n/**\n * Check if a configuration is a template config or direct permission schema\n * @param config - Configuration to check\n * @returns True if it's a template configuration\n */\nexport function isTemplateConfig(\n config: PermissionTemplateConfig | PermissionSchema\n): config is PermissionTemplateConfig {\n return \"template\" in config;\n}\n\n/**\n * Check if a configuration is a direct permission schema\n * @param config - Configuration to check\n * @returns True if it's a direct permission schema\n */\nexport function isPermissionSchema(config: PermissionTemplateConfig | PermissionSchema): config is PermissionSchema {\n return (\n \"listRule\" in config ||\n \"viewRule\" in config ||\n \"createRule\" in config ||\n \"updateRule\" in config ||\n \"deleteRule\" in config ||\n \"manageRule\" in config\n );\n}\n\n/**\n * Validation result for permission configuration\n */\nexport interface PermissionValidationResult {\n valid: boolean;\n errors: string[];\n warnings: string[];\n}\n\n/**\n * Validate a permission configuration\n * @param config - Permission configuration to validate\n * @param isAuthCollection - Whether this is for an auth collection\n * @returns Validation result\n */\nexport function validatePermissionConfig(\n config: PermissionTemplateConfig | PermissionSchema,\n isAuthCollection: boolean = false\n): PermissionValidationResult {\n const result: PermissionValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n };\n\n // Resolve to permission schema\n let permissions: PermissionSchema;\n if (isTemplateConfig(config)) {\n // Validate template config\n if (config.template === \"owner-only\" && !config.ownerField) {\n result.warnings.push(\"owner-only template without ownerField specified - using default 'User'\");\n }\n if (config.template === \"admin-only\" && !config.roleField) {\n result.warnings.push(\"admin-only template without roleField specified - using default 'role'\");\n }\n permissions = resolveTemplate(config);\n } else {\n permissions = config;\n }\n\n // Validate manageRule usage\n if (permissions.manageRule !== undefined && !isAuthCollection) {\n result.errors.push(\"manageRule is only valid for auth collections\");\n result.valid = false;\n }\n\n // Validate rule expressions\n const ruleTypes: (keyof PermissionSchema)[] = [\"listRule\", \"viewRule\", \"createRule\", \"updateRule\", \"deleteRule\"];\n if (isAuthCollection) {\n ruleTypes.push(\"manageRule\");\n }\n\n for (const ruleType of ruleTypes) {\n const rule = permissions[ruleType];\n if (rule !== undefined && rule !== null && rule !== \"\") {\n const ruleValidation = validateRuleExpression(rule);\n if (!ruleValidation.valid) {\n result.errors.push(`${ruleType}: ${ruleValidation.errors.join(\", \")}`);\n result.valid = false;\n }\n result.warnings.push(...ruleValidation.warnings.map((w) => `${ruleType}: ${w}`));\n }\n }\n\n return result;\n}\n\n/**\n * Validate a single rule expression for basic syntax\n * @param expression - Rule expression to validate\n * @returns Validation result\n */\nexport function validateRuleExpression(expression: RuleExpression): PermissionValidationResult {\n const result: PermissionValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n };\n\n // Null and empty string are always valid\n if (expression === null || expression === \"\") {\n return result;\n }\n\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of expression) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n result.errors.push(\"Unbalanced parentheses\");\n result.valid = false;\n return result;\n }\n }\n if (parenCount !== 0) {\n result.errors.push(\"Unbalanced parentheses\");\n result.valid = false;\n }\n\n // Check for common mistakes\n if (expression.includes(\"==\")) {\n result.warnings.push(\"Use '=' instead of '==' for equality comparison\");\n }\n\n // Check for valid @request references\n const requestRefs = expression.match(/@request\\.[a-zA-Z_][a-zA-Z0-9_.]*/g) || [];\n for (const ref of requestRefs) {\n const isValid =\n ref.startsWith(\"@request.auth.\") ||\n ref === \"@request.method\" ||\n ref === \"@request.context\" ||\n ref.startsWith(\"@request.body.\") ||\n ref.startsWith(\"@request.query.\") ||\n ref.startsWith(\"@request.headers.\");\n\n if (!isValid) {\n result.errors.push(`Invalid @request reference: '${ref}'`);\n result.valid = false;\n }\n }\n\n return result;\n}\n\n/**\n * Create a custom permission schema with type safety\n * @param permissions - Partial permission schema\n * @returns Complete permission schema with null defaults\n */\nexport function createPermissions(permissions: Partial<PermissionSchema>): PermissionSchema {\n return {\n listRule: permissions.listRule ?? null,\n viewRule: permissions.viewRule ?? null,\n createRule: permissions.createRule ?? null,\n updateRule: permissions.updateRule ?? null,\n deleteRule: permissions.deleteRule ?? null,\n manageRule: permissions.manageRule ?? null,\n };\n}\n\n/**\n * Merge multiple permission schemas, with later schemas taking precedence\n * @param schemas - Permission schemas to merge\n * @returns Merged permission schema\n */\nexport function mergePermissions(...schemas: Partial<PermissionSchema>[]): PermissionSchema {\n const merged: PermissionSchema = {\n listRule: null,\n viewRule: null,\n createRule: null,\n updateRule: null,\n deleteRule: null,\n manageRule: null,\n };\n\n for (const schema of schemas) {\n if (schema.listRule !== undefined) merged.listRule = schema.listRule;\n if (schema.viewRule !== undefined) merged.viewRule = schema.viewRule;\n if (schema.createRule !== undefined) merged.createRule = schema.createRule;\n if (schema.updateRule !== undefined) merged.updateRule = schema.updateRule;\n if (schema.deleteRule !== undefined) merged.deleteRule = schema.deleteRule;\n if (schema.manageRule !== undefined) merged.manageRule = schema.manageRule;\n }\n\n return merged;\n}\n","/**\n * Rule validator for PocketBase API rule expressions\n *\n * Validates permission rule expressions against PocketBase syntax rules,\n * including field references, @request references, and basic syntax validation.\n */\n\nimport type { APIRuleType, RuleExpression } from \"../utils/permissions\";\nimport type { FieldDefinition } from \"./types\";\n\n/**\n * Validation result for rule expressions\n */\nexport interface RuleValidationResult {\n /** Whether the rule expression is valid */\n valid: boolean;\n\n /** List of validation errors */\n errors: string[];\n\n /** List of validation warnings */\n warnings: string[];\n\n /** List of field references found in the expression */\n fieldReferences: string[];\n}\n\n/**\n * Rule expression validator\n *\n * Validates PocketBase API rule expressions for:\n * - Field reference existence and validity\n * - @request reference syntax\n * - Basic expression syntax (parentheses, operators)\n * - Auth collection specific rules (manageRule)\n */\nexport class RuleValidator {\n private fields: Map<string, FieldDefinition>;\n private collectionName: string;\n private isAuthCollection: boolean;\n\n constructor(collectionName: string, fields: FieldDefinition[], isAuthCollection: boolean = false) {\n this.collectionName = collectionName;\n this.fields = new Map(fields.map((f) => [f.name, f]));\n this.isAuthCollection = isAuthCollection;\n\n // Add system fields that are always available in PocketBase\n this.addSystemFields();\n }\n\n /**\n * Add system fields that are always available in PocketBase collections\n * These fields are automatically added by PocketBase and can be referenced in rules\n */\n private addSystemFields(): void {\n // Base system fields available in all collections\n const systemFields: FieldDefinition[] = [\n { name: \"id\", type: \"text\", required: true, options: {} },\n { name: \"created\", type: \"date\", required: true, options: {} },\n { name: \"updated\", type: \"date\", required: true, options: {} },\n { name: \"collectionId\", type: \"text\", required: true, options: {} },\n { name: \"collectionName\", type: \"text\", required: true, options: {} },\n ];\n\n // Auth collection specific system fields\n if (this.isAuthCollection) {\n systemFields.push(\n { name: \"email\", type: \"email\", required: true, options: {} },\n { name: \"emailVisibility\", type: \"bool\", required: false, options: {} },\n { name: \"verified\", type: \"bool\", required: false, options: {} },\n { name: \"tokenKey\", type: \"text\", required: true, options: {} },\n { name: \"password\", type: \"text\", required: true, options: {} }\n );\n }\n\n // Add system fields to the fields map (don't overwrite user-defined fields)\n for (const field of systemFields) {\n if (!this.fields.has(field.name)) {\n this.fields.set(field.name, field);\n }\n }\n }\n\n /**\n * Validate a rule expression\n *\n * @param ruleType - The type of rule being validated\n * @param expression - The rule expression to validate\n * @returns Validation result with errors, warnings, and field references\n */\n validate(ruleType: APIRuleType, expression: RuleExpression): RuleValidationResult {\n const result: RuleValidationResult = {\n valid: true,\n errors: [],\n warnings: [],\n fieldReferences: [],\n };\n\n // Null means locked (superuser only) - always valid\n if (expression === null) {\n return result;\n }\n\n // Empty string means public - always valid but warn\n if (expression === \"\") {\n result.warnings.push(`${ruleType} is public - anyone can perform this operation`);\n return result;\n }\n\n // Validate manageRule only for auth collections\n if (ruleType === \"manageRule\" && !this.isAuthCollection) {\n result.valid = false;\n result.errors.push(\"manageRule is only valid for auth collections\");\n return result;\n }\n\n // Extract and validate field references\n const fieldRefs = this.extractFieldReferences(expression);\n result.fieldReferences = fieldRefs;\n\n for (const fieldRef of fieldRefs) {\n this.validateFieldReference(fieldRef, result);\n }\n\n // Validate @request references\n this.validateRequestReferences(expression, result);\n\n // Validate syntax patterns\n this.validateSyntax(expression, result);\n\n return result;\n }\n\n /**\n * Extract field references from expression\n *\n * Matches field names that are not @request references.\n * Handles dot notation for relations: user.email, post.author.name\n *\n * @param expression - The rule expression\n * @returns Array of unique field references\n */\n private extractFieldReferences(expression: string): string[] {\n const refs: string[] = [];\n\n // First, remove string literals and @request references to avoid matching them\n let cleaned = expression.replace(/\"[^\"]*\"/g, '\"\"').replace(/'[^']*'/g, \"''\");\n cleaned = cleaned.replace(/@request\\.[a-zA-Z_][a-zA-Z0-9_.]*/g, \"\");\n\n // Match field names (not starting with @)\n // Handles dot notation for relations: user.email, post.author.name\n const fieldPattern = /(?:^|[^@\\w])([a-zA-Z_][a-zA-Z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z0-9_]*)*)(?=[^a-zA-Z0-9_.]|$)/g;\n\n let match;\n while ((match = fieldPattern.exec(cleaned)) !== null) {\n const ref = match[1];\n // Exclude PocketBase keywords and operators\n if (!this.isKeyword(ref)) {\n refs.push(ref);\n }\n }\n\n return [...new Set(refs)]; // Remove duplicates\n }\n\n /**\n * Check if a word is a PocketBase keyword\n *\n * @param word - The word to check\n * @returns True if the word is a keyword\n */\n private isKeyword(word: string): boolean {\n const keywords = [\"true\", \"false\", \"null\", \"AND\", \"OR\", \"NOT\", \"LIKE\", \"IN\"];\n return keywords.includes(word.toUpperCase());\n }\n\n /**\n * Validate a field reference exists in schema\n *\n * Checks if the root field exists and validates relation chains.\n * For nested references, warns about potential issues since we can't\n * validate across collections without loading related schemas.\n *\n * @param fieldRef - The field reference to validate (e.g., \"user\" or \"user.email\")\n * @param result - The validation result to update\n */\n private validateFieldReference(fieldRef: string, result: RuleValidationResult): void {\n const parts = fieldRef.split(\".\");\n const rootField = parts[0];\n\n if (!this.fields.has(rootField)) {\n result.errors.push(`Field '${rootField}' does not exist in collection '${this.collectionName}'`);\n result.valid = false;\n return;\n }\n\n // For nested references, validate relation chain\n if (parts.length > 1) {\n const field = this.fields.get(rootField)!;\n if (field.type !== \"relation\") {\n result.errors.push(`Field '${rootField}' is not a relation field, cannot access nested property '${parts[1]}'`);\n result.valid = false;\n } else {\n // Note: We can't validate nested fields without loading related schemas\n // This would require cross-schema validation\n result.warnings.push(\n `Nested field reference '${fieldRef}' - ensure target collection has field '${parts.slice(1).join(\".\")}'`\n );\n }\n }\n }\n\n /**\n * Validate @request references\n *\n * Checks that @request references follow valid PocketBase patterns:\n * - @request.auth.* - authenticated user data\n * - @request.body.* - request body fields\n * - @request.query.* - query parameters\n * - @request.headers.* - request headers\n * - @request.method - HTTP method\n * - @request.context - execution context\n *\n * @param expression - The rule expression\n * @param result - The validation result to update\n */\n private validateRequestReferences(expression: string, result: RuleValidationResult): void {\n // Find all @request references\n const requestRefs = expression.match(/@request\\.[a-zA-Z_][a-zA-Z0-9_.]*/g) || [];\n\n for (const ref of requestRefs) {\n // Check if the reference starts with a valid pattern\n const isValid =\n ref.startsWith(\"@request.auth.\") ||\n ref === \"@request.method\" ||\n ref === \"@request.context\" ||\n ref.startsWith(\"@request.body.\") ||\n ref.startsWith(\"@request.query.\") ||\n ref.startsWith(\"@request.headers.\");\n\n if (!isValid) {\n result.errors.push(`Invalid @request reference: '${ref}'`);\n result.valid = false;\n }\n }\n }\n\n /**\n * Validate basic syntax patterns\n *\n * Checks for:\n * - Balanced parentheses\n * - Common operator mistakes (== instead of =)\n *\n * @param expression - The rule expression\n * @param result - The validation result to update\n */\n private validateSyntax(expression: string, result: RuleValidationResult): void {\n // Check for balanced parentheses\n let parenCount = 0;\n for (const char of expression) {\n if (char === \"(\") parenCount++;\n if (char === \")\") parenCount--;\n if (parenCount < 0) {\n result.errors.push(\"Unbalanced parentheses in expression\");\n result.valid = false;\n return;\n }\n }\n if (parenCount !== 0) {\n result.errors.push(\"Unbalanced parentheses in expression\");\n result.valid = false;\n }\n\n // Warn about common mistakes\n if (expression.includes(\"==\")) {\n result.warnings.push(\"Use '=' instead of '==' for equality comparison in PocketBase rules\");\n }\n }\n}\n","/**\n * Permission analyzer for extracting and validating permissions from Zod schemas\n *\n * This module provides utilities to:\n * - Extract permission metadata from Zod schema descriptions\n * - Resolve template configurations to concrete permission schemas\n * - Validate permission rules against collection fields\n * - Merge permissions with default values\n */\n\nimport { resolveTemplate } from \"../utils/permission-templates\";\nimport type { APIRuleType, PermissionSchema, PermissionTemplateConfig } from \"../utils/permissions\";\nimport type { RuleValidationResult } from \"./rule-validator\";\nimport { RuleValidator } from \"./rule-validator\";\nimport type { FieldDefinition } from \"./types\";\n\n/**\n * Extract and analyze permissions from schema\n *\n * The PermissionAnalyzer class provides methods to work with permission\n * definitions attached to Zod schemas, including extraction, resolution,\n * validation, and normalization.\n */\nexport class PermissionAnalyzer {\n /**\n * Extract permission metadata from Zod schema description\n *\n * Zod schemas can have permission metadata attached via the describe() method.\n * This method parses the description and extracts the permission configuration.\n *\n * @param schemaDescription - The Zod schema description string\n * @returns Permission schema if found, null otherwise\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n * const permissions = analyzer.extractPermissions(schema.description);\n * ```\n */\n extractPermissions(schemaDescription: string | undefined): PermissionSchema | null {\n if (!schemaDescription) {\n return null;\n }\n\n try {\n const metadata = JSON.parse(schemaDescription);\n if (metadata.permissions) {\n return metadata.permissions;\n }\n } catch {\n // Not JSON or no permissions - this is expected for schemas without permissions\n return null;\n }\n\n return null;\n }\n\n /**\n * Resolve template configuration to concrete rules\n *\n * Takes either a template configuration or a direct permission schema\n * and returns a fully resolved permission schema with all rules defined.\n *\n * If the input is already a permission schema (has rule properties),\n * it's returned as-is. Otherwise, the template is resolved using the\n * template resolver.\n *\n * @param config - Template configuration or direct permission schema\n * @returns Resolved permission schema\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n *\n * // Resolve from template\n * const permissions = analyzer.resolvePermissions({\n * template: 'owner-only',\n * ownerField: 'User'\n * });\n *\n * // Or pass direct schema\n * const permissions = analyzer.resolvePermissions({\n * listRule: '@request.auth.id != \"\"',\n * viewRule: '@request.auth.id != \"\"'\n * });\n * ```\n */\n resolvePermissions(config: PermissionTemplateConfig | PermissionSchema): PermissionSchema {\n // If it's already a permission schema (has rule properties), return as-is\n if (\n \"listRule\" in config ||\n \"viewRule\" in config ||\n \"createRule\" in config ||\n \"updateRule\" in config ||\n \"deleteRule\" in config ||\n \"manageRule\" in config\n ) {\n return config as PermissionSchema;\n }\n\n // Otherwise resolve template\n return resolveTemplate(config as PermissionTemplateConfig);\n }\n\n /**\n * Validate all rules in a permission schema\n *\n * Validates each rule in the permission schema against the collection's\n * field definitions. Returns a map of validation results keyed by rule type.\n *\n * Only validates rules that are defined (not undefined). Undefined rules\n * are treated as null (locked) by default.\n *\n * @param collectionName - Name of the collection being validated\n * @param permissions - Permission schema to validate\n * @param fields - Collection field definitions\n * @param isAuthCollection - Whether this is an auth collection (allows manageRule)\n * @returns Map of validation results by rule type\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n * const results = analyzer.validatePermissions(\n * 'posts',\n * { listRule: '@request.auth.id != \"\"', viewRule: 'author = @request.auth.id' },\n * fields,\n * false\n * );\n *\n * for (const [ruleType, result] of results) {\n * if (!result.valid) {\n * console.error(`${ruleType} validation failed:`, result.errors);\n * }\n * }\n * ```\n */\n validatePermissions(\n collectionName: string,\n permissions: PermissionSchema,\n fields: FieldDefinition[],\n isAuthCollection: boolean = false\n ): Map<APIRuleType, RuleValidationResult> {\n const validator = new RuleValidator(collectionName, fields, isAuthCollection);\n const results = new Map<APIRuleType, RuleValidationResult>();\n\n // Define all possible rule types\n const ruleTypes: APIRuleType[] = [\"listRule\", \"viewRule\", \"createRule\", \"updateRule\", \"deleteRule\"];\n\n // Add manageRule for auth collections\n if (isAuthCollection) {\n ruleTypes.push(\"manageRule\");\n }\n\n // Validate each defined rule\n for (const ruleType of ruleTypes) {\n const expression = permissions[ruleType];\n if (expression !== undefined) {\n results.set(ruleType, validator.validate(ruleType, expression));\n }\n }\n\n return results;\n }\n\n /**\n * Merge permissions with defaults\n *\n * Ensures all rule types have a defined value. Undefined rules are set\n * to null (locked to superusers only), which is the PocketBase default.\n *\n * This is useful when generating migrations to ensure all rules are\n * explicitly set in the collection configuration.\n *\n * @param permissions - Permission schema (may have undefined rules)\n * @returns Permission schema with all rules defined (null if not specified)\n *\n * @example\n * ```typescript\n * const analyzer = new PermissionAnalyzer();\n * const merged = analyzer.mergeWithDefaults({\n * listRule: '@request.auth.id != \"\"'\n * // other rules undefined\n * });\n *\n * // Result:\n * // {\n * // listRule: '@request.auth.id != \"\"',\n * // viewRule: null,\n * // createRule: null,\n * // updateRule: null,\n * // deleteRule: null,\n * // manageRule: null\n * // }\n * ```\n */\n mergeWithDefaults(permissions: PermissionSchema): PermissionSchema {\n return {\n listRule: permissions.listRule ?? null,\n viewRule: permissions.viewRule ?? null,\n createRule: permissions.createRule ?? null,\n updateRule: permissions.updateRule ?? null,\n deleteRule: permissions.deleteRule ?? null,\n manageRule: permissions.manageRule ?? null,\n };\n }\n}\n","/**\n * Collection name pluralization utilities\n */\n\n/**\n * Special case pluralization rules\n * Maps singular forms to their plural forms\n */\nconst SPECIAL_CASES: Record<string, string> = {\n // Common irregular plurals\n person: \"people\",\n Person: \"People\",\n child: \"children\",\n Child: \"Children\",\n man: \"men\",\n Man: \"Men\",\n woman: \"women\",\n Woman: \"Women\",\n tooth: \"teeth\",\n Tooth: \"Teeth\",\n foot: \"feet\",\n Foot: \"Feet\",\n mouse: \"mice\",\n Mouse: \"Mice\",\n goose: \"geese\",\n Goose: \"Geese\",\n\n // Words ending in -y\n category: \"categories\",\n Category: \"Categories\",\n company: \"companies\",\n Company: \"Companies\",\n city: \"cities\",\n City: \"Cities\",\n country: \"countries\",\n Country: \"Countries\",\n story: \"stories\",\n Story: \"Stories\",\n party: \"parties\",\n Party: \"Parties\",\n family: \"families\",\n Family: \"Families\",\n activity: \"activities\",\n Activity: \"Activities\",\n priority: \"priorities\",\n Priority: \"Priorities\",\n\n // Words ending in -f or -fe\n life: \"lives\",\n Life: \"Lives\",\n wife: \"wives\",\n Wife: \"Wives\",\n knife: \"knives\",\n Knife: \"Knives\",\n leaf: \"leaves\",\n Leaf: \"Leaves\",\n shelf: \"shelves\",\n Shelf: \"Shelves\",\n half: \"halves\",\n Half: \"Halves\",\n\n // Words ending in -is\n analysis: \"analyses\",\n Analysis: \"Analyses\",\n basis: \"bases\",\n Basis: \"Bases\",\n crisis: \"crises\",\n Crisis: \"Crises\",\n thesis: \"theses\",\n Thesis: \"Theses\",\n\n // Words ending in -us\n cactus: \"cacti\",\n Cactus: \"Cacti\",\n focus: \"foci\",\n Focus: \"Foci\",\n fungus: \"fungi\",\n Fungus: \"Fungi\",\n nucleus: \"nuclei\",\n Nucleus: \"Nuclei\",\n radius: \"radii\",\n Radius: \"Radii\",\n\n // Words ending in -on\n phenomenon: \"phenomena\",\n Phenomenon: \"Phenomena\",\n criterion: \"criteria\",\n Criterion: \"Criteria\",\n\n // Words ending in -um\n datum: \"data\",\n Datum: \"Data\",\n medium: \"media\",\n Medium: \"Media\",\n curriculum: \"curricula\",\n Curriculum: \"Curricula\",\n\n // Unchanged plurals\n sheep: \"sheep\",\n Sheep: \"Sheep\",\n deer: \"deer\",\n Deer: \"Deer\",\n fish: \"fish\",\n Fish: \"Fish\",\n species: \"species\",\n Species: \"Species\",\n series: \"series\",\n Series: \"Series\",\n};\n\n/**\n * Pluralizes a singular noun to its plural form\n * Handles special cases and common English pluralization rules\n *\n * @param singular - The singular form of the noun\n * @returns The plural form of the noun\n */\nexport function pluralize(singular: string): string {\n // Check special cases first (before checking if already plural)\n if (SPECIAL_CASES[singular]) {\n return SPECIAL_CASES[singular];\n }\n\n // Check if it's already plural (ends with 's' and is longer than 3 chars)\n if (singular.length > 3 && singular.endsWith(\"s\") && !singular.endsWith(\"ss\")) {\n // Could already be plural, return as-is\n return singular;\n }\n\n // Preserve case for the transformation\n const lowerSingular = singular.toLowerCase();\n\n let plural: string;\n\n // Rule 1: Words ending in -s, -ss, -sh, -ch, -x, -z -> add -es\n if (/(?:s|ss|sh|ch|x|z)$/.test(lowerSingular)) {\n plural = singular + \"es\";\n }\n // Rule 2: Words ending in consonant + y -> change y to ies\n else if (/[^aeiou]y$/.test(lowerSingular)) {\n plural = singular.slice(0, -1) + \"ies\";\n }\n // Rule 3: Words ending in consonant + o -> add -es\n else if (/[^aeiou]o$/.test(lowerSingular)) {\n plural = singular + \"es\";\n }\n // Rule 4: Words ending in -f or -fe -> change to -ves\n else if (/fe?$/.test(lowerSingular)) {\n if (lowerSingular.endsWith(\"fe\")) {\n plural = singular.slice(0, -2) + \"ves\";\n } else {\n plural = singular.slice(0, -1) + \"ves\";\n }\n }\n // Rule 5: Default -> add -s\n else {\n plural = singular + \"s\";\n }\n\n return plural;\n}\n\n/**\n * Converts a singular entity name to a collection name\n * This is an alias for pluralize for better semantic clarity\n *\n * @param entityName - The singular entity name (e.g., \"User\", \"Project\")\n * @returns The collection name (e.g., \"Users\", \"Projects\")\n */\nexport function toCollectionName(entityName: string): string {\n return pluralize(entityName);\n}\n\n/**\n * Attempts to singularize a plural noun (reverse of pluralize)\n * Note: This is a best-effort implementation and may not handle all edge cases\n *\n * @param plural - The plural form of the noun\n * @returns The singular form of the noun\n */\nexport function singularize(plural: string): string {\n // Check reverse special cases\n for (const [singular, pluralForm] of Object.entries(SPECIAL_CASES)) {\n if (pluralForm === plural) {\n return singular;\n }\n }\n\n const lower = plural.toLowerCase();\n\n // Rule 1: Words ending in -ies -> change to -y\n if (lower.endsWith(\"ies\") && plural.length > 3) {\n return plural.slice(0, -3) + \"y\";\n }\n\n // Rule 2: Words ending in -ves -> change to -f or -fe\n if (lower.endsWith(\"ves\")) {\n // Try -fe first (more common)\n return plural.slice(0, -3) + \"fe\";\n }\n\n // Rule 3: Words ending in -ses, -shes, -ches, -xes, -zes -> remove -es\n if (/(?:ses|shes|ches|xes|zes)$/.test(lower)) {\n return plural.slice(0, -2);\n }\n\n // Rule 4: Words ending in -s -> remove -s\n if (lower.endsWith(\"s\") && plural.length > 1) {\n return plural.slice(0, -1);\n }\n\n // Default: return as-is\n return plural;\n}\n","/**\n * Relation field detection utilities\n */\n\nimport { z } from \"zod\";\nimport { pluralize } from \"./pluralize\";\n\n/**\n * Detects if a field is a single relation based on naming convention\n * Single relation: field name matches a collection name (e.g., \"User\" -> \"Users\" collection)\n */\nexport function isSingleRelationField(fieldName: string, zodType: z.ZodTypeAny): boolean {\n // Unwrap optional/nullable/default\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n // Must be a string type\n if (!(unwrappedType instanceof z.ZodString)) {\n return false;\n }\n\n // Field name should start with uppercase (convention for entity references)\n // and not be a common string field name\n const startsWithUppercase = /^[A-Z]/.test(fieldName);\n\n // Exclude common string fields that start with uppercase\n const commonStringFields = [\"Title\", \"Name\", \"Description\", \"Content\", \"Summary\", \"Status\", \"Type\"];\n const isCommonField = commonStringFields.includes(fieldName);\n\n return startsWithUppercase && !isCommonField;\n}\n\n/**\n * Detects if a field is a multiple relation based on naming convention\n * Multiple relation: field name is an array of strings ending with entity name\n * (e.g., \"SubscriberUsers\" -> \"Users\" collection)\n */\nexport function isMultipleRelationField(fieldName: string, zodType: z.ZodTypeAny): boolean {\n // Unwrap optional/nullable/default\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n // Must be an array type\n if (!(unwrappedType instanceof z.ZodArray)) {\n return false;\n }\n\n // Element type must be string\n const elementType = unwrappedType._def.type;\n if (!(elementType instanceof z.ZodString)) {\n return false;\n }\n\n // Field name should contain an uppercase letter (entity reference pattern)\n const hasUppercase = /[A-Z]/.test(fieldName);\n\n return hasUppercase;\n}\n\n/**\n * Resolves the target collection name from a relation field name\n * Examples:\n * - \"User\" -> \"Users\"\n * - \"SubscriberUsers\" -> \"Users\"\n * - \"Author\" -> \"Authors\"\n * - \"Category\" -> \"Categories\"\n */\nexport function resolveTargetCollection(fieldName: string): string {\n // For single relations, the field name is typically the entity name\n // For multiple relations, extract the entity name from the end\n\n // Check if field name ends with a known plural entity name\n // Common patterns: \"SubscriberUsers\", \"RelatedPosts\", \"Tags\"\n\n // Try to find the entity name by looking for uppercase letters\n const matches = fieldName.match(/[A-Z][a-z]+/g);\n\n if (!matches || matches.length === 0) {\n // Fallback: pluralize the entire field name\n return pluralize(fieldName);\n }\n\n // Take the last matched entity name (e.g., \"Users\" from \"SubscriberUsers\")\n const entityName = matches[matches.length - 1];\n\n // Pluralize the entity name to get collection name\n return pluralize(entityName);\n}\n\n/**\n * Detects if a field is any type of relation (single or multiple)\n */\nexport function isRelationField(fieldName: string, zodType: z.ZodTypeAny): boolean {\n return isSingleRelationField(fieldName, zodType) || isMultipleRelationField(fieldName, zodType);\n}\n\n/**\n * Gets the maximum number of relations allowed for a relation field\n * Returns 1 for single relations, or the max constraint for multiple relations\n */\nexport function getMaxSelect(fieldName: string, zodType: z.ZodTypeAny): number {\n if (isSingleRelationField(fieldName, zodType)) {\n return 1;\n }\n\n if (isMultipleRelationField(fieldName, zodType)) {\n // Unwrap to get to the array type\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodArray) {\n // Access the checks array from the array definition\n const arrayDef = unwrappedType._def;\n if (arrayDef.maxLength) {\n return arrayDef.maxLength.value;\n }\n // Default to 999 for multiple relations without explicit max\n return 999;\n }\n }\n\n return 1;\n}\n\n/**\n * Gets the minimum number of relations required for a relation field\n * Returns 0 as default for all relation fields (single or multiple)\n * PocketBase always expects minSelect to be defined for relation fields\n */\nexport function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number {\n // For single relations, always return 0\n if (isSingleRelationField(fieldName, zodType)) {\n return 0;\n }\n\n // For multiple relations, check for explicit min constraint\n if (isMultipleRelationField(fieldName, zodType)) {\n // Unwrap to get to the array type\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodArray) {\n // Access the minLength from the array definition\n const arrayDef = unwrappedType._def;\n if (arrayDef.minLength) {\n return arrayDef.minLength.value;\n }\n }\n }\n\n // Default to 0 for all relation fields\n return 0;\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\";\n\n// Re-export extractFieldMetadata from fields.ts for backward compatibility\nexport { extractFieldMetadata, FIELD_METADATA_KEY } from \"../../schema/fields\";\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] 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 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\n/**\n * Maps Zod string types to PocketBase field types\n */\nexport function mapZodStringType(zodType: z.ZodString): PocketBaseFieldType {\n const checks = (zodType as any)._def.checks || [];\n\n // Check for email validation\n const hasEmail = checks.some((check: any) => check.kind === \"email\");\n if (hasEmail) {\n return \"email\";\n }\n\n // Check for URL validation\n const hasUrl = checks.some((check: any) => check.kind === \"url\");\n if (hasUrl) {\n return \"url\";\n }\n\n // Check for datetime validation (could be date field)\n const hasDatetime = checks.some((check: any) => check.kind === \"datetime\");\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._def.type;\n\n // Check if it's an array of File instances (file upload)\n if (elementType instanceof z.ZodType) {\n const typeName = elementType._def.typeName;\n if (typeName === \"ZodType\" && (elementType as any)._def?.innerType?.name === \"File\") {\n return \"file\";\n }\n }\n\n // Check for instanceof File\n if (elementType._def?.typeName === \"ZodType\") {\n const checks = (elementType as any)._def?.checks || [];\n const isFileInstance = checks.some(\n (check: any) => check.kind === \"instanceof\" || (elementType as any)._def?.innerType?.name === \"File\"\n );\n if (isFileInstance) {\n return \"file\";\n }\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 // Handle optional and nullable types by unwrapping\n let unwrappedType = zodType;\n\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n // Check for ZodEffects (which is what z.instanceof() creates)\n if ((unwrappedType as any)._def?.typeName === \"ZodEffects\") {\n const effect = (unwrappedType as any)._def?.effect;\n\n // z.instanceof(File) creates a refinement effect\n // We need to check if this is a File instance check\n // The field name 'avatar', 'image', 'file', 'attachment' etc. are hints\n if (effect?.type === \"refinement\") {\n // Common file field names\n const fileFieldNames = [\"avatar\", \"image\", \"file\", \"attachment\", \"photo\", \"picture\", \"document\", \"upload\"];\n if (fileFieldNames.some((name) => fieldName.toLowerCase().includes(name))) {\n return \"file\";\n }\n }\n }\n\n // Check for instanceof File (z.instanceof(File)) - legacy check\n if ((unwrappedType as any)._def?.typeName === \"ZodType\") {\n const checks = (unwrappedType as any)._def?.checks || [];\n const innerType = (unwrappedType as any)._def?.innerType;\n\n // Check if it's instanceof File\n if (innerType?.name === \"File\" || checks.some((check: any) => check.kind === \"instanceof\")) {\n return \"file\";\n }\n }\n\n // Map based on Zod type\n if (unwrappedType instanceof z.ZodString) {\n return mapZodStringType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodNumber) {\n return mapZodNumberType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodBoolean) {\n return mapZodBooleanType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodEnum) {\n return mapZodEnumType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodArray) {\n return mapZodArrayType(unwrappedType, fieldName);\n }\n\n if (unwrappedType instanceof z.ZodDate) {\n return mapZodDateType(unwrappedType);\n }\n\n if (unwrappedType instanceof z.ZodRecord || unwrappedType instanceof z.ZodObject) {\n return mapZodRecordType(unwrappedType);\n }\n\n // Default to text for unknown types\n return \"text\";\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 // Unwrap optional/nullable/default\n let unwrappedType = zodType;\n if (zodType instanceof z.ZodOptional) {\n unwrappedType = zodType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodNullable) {\n unwrappedType = unwrappedType._def.innerType;\n }\n if (unwrappedType instanceof z.ZodDefault) {\n unwrappedType = unwrappedType._def.innerType;\n }\n\n const checks = (unwrappedType as any)._def?.checks || [];\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\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\n // Extract enum values\n if (unwrappedType instanceof z.ZodEnum) {\n options.values = unwrappedType._def.values;\n }\n\n // Extract array constraints\n if (unwrappedType instanceof z.ZodArray) {\n const arrayChecks = (unwrappedType as any)._def?.checks || [];\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\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\n if (unwrapped instanceof z.ZodOptional) {\n unwrapped = unwrapped._def.innerType;\n }\n\n if (unwrapped instanceof z.ZodNullable) {\n unwrapped = unwrapped._def.innerType;\n }\n\n if (unwrapped instanceof z.ZodDefault) {\n unwrapped = unwrapped._def.innerType;\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._def.type;\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._def.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 = (unwrapped as any)._def?.checks || [];\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\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\n // Extract enum values\n if (unwrapped instanceof z.ZodEnum) {\n options.values = unwrapped._def.values;\n }\n\n // Extract array constraints\n if (unwrapped instanceof z.ZodArray) {\n const arrayDef = unwrapped._def;\n if (arrayDef.minLength) {\n options.minSelect = arrayDef.minLength.value;\n }\n if (arrayDef.maxLength) {\n options.maxSelect = arrayDef.maxLength.value;\n }\n\n // Check for enum element type\n const elementType = arrayDef.type;\n if (elementType instanceof z.ZodEnum) {\n options.values = elementType._def.values;\n }\n }\n\n return options;\n}\n\n/**\n * Determines if a field should be treated as an editor field\n * based on field name conventions\n */\nexport function isEditorField(fieldName: string): boolean {\n const editorFieldNames = [\n \"content\",\n \"body\",\n \"description\",\n \"bio\",\n \"about\",\n \"summary\",\n \"notes\",\n \"details\",\n \"html\",\n \"richtext\",\n \"editor\",\n ];\n return editorFieldNames.some((name) => fieldName.toLowerCase().includes(name));\n}\n\n/**\n * Determines if a field should be treated as a file field\n * based on field name conventions\n */\nexport function isFileFieldByName(fieldName: string): boolean {\n const fileFieldNames = [\n \"avatar\",\n \"image\",\n \"file\",\n \"attachment\",\n \"photo\",\n \"picture\",\n \"document\",\n \"upload\",\n \"thumbnail\",\n \"cover\",\n \"banner\",\n \"logo\",\n \"icon\",\n \"media\",\n ];\n return fileFieldNames.some((name) => fieldName.toLowerCase().includes(name));\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 * Schema Analyzer - Parses Zod schemas and extracts field definitions\n *\n * This module provides a standalone, configurable schema analyzer that can be used\n * by consumer projects to parse Zod schemas and convert them to PocketBase collection schemas.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { z } from \"zod\";\nimport { extractRelationMetadata } from \"../schema/base\";\nimport { extractFieldMetadata } from \"../schema/fields\";\nimport type { PermissionSchema } from \"../utils/permissions\";\nimport { FileSystemError, SchemaParsingError } from \"./errors\";\nimport { PermissionAnalyzer } from \"./permission-analyzer\";\nimport type { CollectionSchema, FieldDefinition, SchemaDefinition } from \"./types\";\nimport { toCollectionName } from \"./utils/pluralize\";\nimport { getMaxSelect, getMinSelect, isRelationField, resolveTargetCollection } from \"./utils/relation-detector\";\nimport { extractFieldOptions, isFieldRequired, mapZodTypeToPocketBase } from \"./utils/type-mapper\";\n\n// Register tsx loader for TypeScript file support\n// This allows dynamic imports of .ts files to work\nlet tsxLoaderRegistered = false;\nasync function ensureTsxLoader(): Promise<void> {\n if (tsxLoaderRegistered) return;\n\n try {\n // Import tsx/esm to register the TypeScript loader hooks\n // This enables dynamic imports of .ts files in Node.js ESM\n await import(\"tsx/esm\");\n tsxLoaderRegistered = true;\n } catch {\n // tsx is not available - will handle in importSchemaModule\n tsxLoaderRegistered = false;\n }\n}\n\n/**\n * Configuration options for schema discovery and parsing\n */\nexport interface SchemaAnalyzerConfig {\n /**\n * Directory containing schema files (source or compiled)\n * Can be absolute or relative to workspaceRoot\n */\n schemaDir: string;\n\n /**\n * Workspace root directory for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * File patterns to exclude from schema discovery\n * Defaults to ['base.ts', 'index.ts', 'permissions.ts', 'permission-templates.ts']\n */\n excludePatterns?: string[];\n\n /**\n * File extensions to include in schema discovery\n * Defaults to ['.ts', '.js']\n */\n includeExtensions?: string[];\n\n /**\n * Schema export name patterns to look for\n * Defaults to ['Schema', 'InputSchema']\n */\n schemaPatterns?: string[];\n\n /**\n * Whether to use compiled JavaScript files instead of TypeScript source\n * When true, looks for .js files; when false, looks for .ts files\n * Defaults to true (use compiled files for dynamic import)\n */\n useCompiledFiles?: boolean;\n\n /**\n * Custom path transformation function for converting source paths to import paths\n * Useful for monorepo setups where source and dist directories differ\n * If not provided, uses the schemaDir directly\n */\n pathTransformer?: (sourcePath: string) => string;\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Required<Omit<SchemaAnalyzerConfig, \"schemaDir\" | \"pathTransformer\">> = {\n workspaceRoot: process.cwd(),\n excludePatterns: [\n \"base.ts\",\n \"index.ts\",\n \"permissions.ts\",\n \"permission-templates.ts\",\n \"base.js\",\n \"index.js\",\n \"permissions.js\",\n \"permission-templates.js\",\n ],\n includeExtensions: [\".ts\", \".js\"],\n schemaPatterns: [\"Schema\", \"InputSchema\", \"Collection\"],\n useCompiledFiles: true,\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(\n config: SchemaAnalyzerConfig\n): Required<Omit<SchemaAnalyzerConfig, \"pathTransformer\">> & { pathTransformer?: (sourcePath: string) => string } {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n excludePatterns: config.excludePatterns || DEFAULT_CONFIG.excludePatterns,\n includeExtensions: config.includeExtensions || DEFAULT_CONFIG.includeExtensions,\n schemaPatterns: config.schemaPatterns || DEFAULT_CONFIG.schemaPatterns,\n };\n}\n\n/**\n * Resolves the schema directory path\n */\nfunction resolveSchemaDir(config: SchemaAnalyzerConfig): string {\n const workspaceRoot = config.workspaceRoot || process.cwd();\n\n if (path.isAbsolute(config.schemaDir)) {\n return config.schemaDir;\n }\n\n return path.join(workspaceRoot, config.schemaDir);\n}\n\n/**\n * Discovers schema files in the specified directory\n * Filters based on configuration patterns\n *\n * @param config - Schema analyzer configuration\n * @returns Array of schema file paths (without extension)\n */\nexport function discoverSchemaFiles(config: SchemaAnalyzerConfig | string): string[] {\n // Support legacy string-only parameter\n const normalizedConfig: SchemaAnalyzerConfig = typeof config === \"string\" ? { schemaDir: config } : config;\n\n const mergedConfig = mergeConfig(normalizedConfig);\n const schemaDir = resolveSchemaDir(normalizedConfig);\n\n try {\n if (!fs.existsSync(schemaDir)) {\n throw new FileSystemError(`Schema directory not found: ${schemaDir}`, schemaDir, \"access\", \"ENOENT\");\n }\n\n const files = fs.readdirSync(schemaDir);\n\n // Filter files based on configuration\n const schemaFiles = files.filter((file) => {\n // Check extension\n const hasValidExtension = mergedConfig.includeExtensions.some((ext) => file.endsWith(ext));\n if (!hasValidExtension) return false;\n\n // Check exclusion patterns\n const isExcluded = mergedConfig.excludePatterns.some((pattern) => {\n // Support both exact match and glob-like patterns\n if (pattern.includes(\"*\")) {\n const regex = new RegExp(\"^\" + pattern.replace(/\\*/g, \".*\") + \"$\");\n return regex.test(file);\n }\n return file === pattern;\n });\n if (isExcluded) return false;\n\n return true;\n });\n\n // Return full paths without extension (for dynamic import)\n return schemaFiles.map((file) => {\n const ext = mergedConfig.includeExtensions.find((ext) => file.endsWith(ext)) || \".ts\";\n return path.join(schemaDir, file.replace(new RegExp(`\\\\${ext}$`), \"\"));\n });\n } catch (error) {\n if (error instanceof FileSystemError) {\n throw error;\n }\n\n const fsError = error as NodeJS.ErrnoException;\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied reading schema directory: ${schemaDir}`,\n schemaDir,\n \"read\",\n fsError.code,\n error as Error\n );\n }\n\n throw new FileSystemError(\n `Failed to read schema directory: ${schemaDir}`,\n schemaDir,\n \"read\",\n fsError.code,\n error as Error\n );\n }\n}\n\n/**\n * Dynamically imports a schema module\n * Supports both JavaScript and TypeScript files using tsx\n *\n * @param filePath - Path to the schema file (without extension)\n * @param config - Optional configuration for path transformation\n * @returns The imported module\n */\nexport async function importSchemaModule(filePath: string, config?: SchemaAnalyzerConfig): Promise<any> {\n try {\n let importPath = filePath;\n\n // Apply path transformation if provided\n if (config?.pathTransformer) {\n importPath = config.pathTransformer(filePath);\n }\n\n // Determine the file extension to use\n // Try .js first (for compiled files), then .ts (for source files)\n let resolvedPath: string | null = null;\n const jsPath = `${importPath}.js`;\n const tsPath = `${importPath}.ts`;\n\n if (fs.existsSync(jsPath)) {\n resolvedPath = jsPath;\n } else if (fs.existsSync(tsPath)) {\n resolvedPath = tsPath;\n } else {\n // Default to .js extension for ESM import\n resolvedPath = jsPath;\n }\n\n // If it's a TypeScript file, ensure tsx loader is registered\n if (resolvedPath.endsWith(\".ts\")) {\n await ensureTsxLoader();\n\n // Check if tsx was successfully registered\n if (!tsxLoaderRegistered) {\n throw new SchemaParsingError(\n `Failed to import TypeScript schema file. The 'tsx' package is required to load TypeScript files.\\n` +\n `Please install tsx: npm install tsx (or yarn add tsx, or pnpm add tsx)\\n` +\n `Alternatively, compile your schema files to JavaScript first.`,\n filePath\n );\n }\n }\n\n // Convert to file URL for proper ESM import\n const fileUrl = new URL(`file://${path.resolve(resolvedPath)}`);\n\n // Use dynamic import to load the module\n // tsx/esm will handle TypeScript files automatically if registered\n const module = await import(fileUrl.href);\n return module;\n } catch (error) {\n // Check if we're trying to import a TypeScript file\n const tsPath = `${filePath}.ts`;\n const isTypeScriptFile = fs.existsSync(tsPath);\n\n if (isTypeScriptFile && error instanceof SchemaParsingError) {\n // Re-throw SchemaParsingError as-is (already has helpful message)\n throw error;\n }\n\n if (isTypeScriptFile) {\n throw new SchemaParsingError(\n `Failed to import TypeScript schema file. The 'tsx' package is required to load TypeScript files.\\n` +\n `Please install tsx: npm install tsx (or yarn add tsx, or pnpm add tsx)\\n` +\n `Alternatively, compile your schema files to JavaScript first.`,\n filePath,\n error as Error\n );\n }\n\n throw new SchemaParsingError(\n `Failed to import schema module. Make sure the schema files exist and are valid.`,\n filePath,\n error as Error\n );\n }\n}\n\n/**\n * Gets the collection name from a schema file path\n * Converts the filename (without extension) to a pluralized collection name\n *\n * @param filePath - Path to the schema file (with or without extension)\n * @returns The collection name\n */\nexport function getCollectionNameFromFile(filePath: string): string {\n // Remove both .ts and .js extensions if present\n const filename = path.basename(filePath).replace(/\\.(ts|js)$/, \"\");\n return toCollectionName(filename);\n}\n\n/**\n * Extracts the collection name from a Zod schema's metadata\n * Checks if the schema was created with defineCollection() which stores\n * the collection name in the schema description\n *\n * @param zodSchema - The Zod schema to extract collection name from\n * @returns The collection name if found in metadata, null otherwise\n */\nexport function extractCollectionNameFromSchema(zodSchema: z.ZodTypeAny): string | null {\n if (!zodSchema.description) {\n return null;\n }\n\n try {\n const metadata = JSON.parse(zodSchema.description);\n if (metadata.collectionName && typeof metadata.collectionName === \"string\") {\n return metadata.collectionName;\n }\n } catch {\n // Not JSON or no collectionName - this is expected for schemas without defineCollection\n }\n\n return null;\n}\n\n/**\n * Extracts the collection type from a Zod schema's metadata\n * Checks if the schema was created with defineCollection() which stores\n * the collection type in the schema description\n *\n * @param zodSchema - The Zod schema to extract collection type from\n * @returns The collection type (\"base\" | \"auth\") if found in metadata, null otherwise\n */\nexport function extractCollectionTypeFromSchema(zodSchema: z.ZodTypeAny): \"base\" | \"auth\" | null {\n if (!zodSchema.description) {\n return null;\n }\n\n try {\n const metadata = JSON.parse(zodSchema.description);\n if (metadata.type === \"base\" || metadata.type === \"auth\") {\n return metadata.type;\n }\n } catch {\n // Not JSON or no type - this is expected for schemas without explicit type\n }\n\n return null;\n}\n\n/**\n * Extracts Zod schema definitions from a module\n *\n * Detection priority (highest to lowest):\n * 1. Default export - recommended pattern for clarity and explicitness\n * 2. Named exports ending with \"Collection\" - contains metadata (indexes, permissions)\n * 3. Named exports ending with \"Schema\" - basic schema definitions\n * 4. Named exports ending with \"InputSchema\" - form input schemas\n *\n * @param module - The imported schema module\n * @param patterns - Schema name patterns to look for (default: ['Schema', 'InputSchema', 'Collection'])\n * @returns Object containing found schemas\n *\n * @example\n * // Recommended: Use default export\n * const UserCollection = defineCollection({ ... });\n * export default UserCollection;\n *\n * @example\n * // Also supported: Named export with pattern\n * export const UserCollection = defineCollection({ ... });\n */\nexport function extractSchemaDefinitions(\n module: any,\n patterns: string[] = [\"Schema\", \"InputSchema\", \"Collection\"]\n): { inputSchema?: z.ZodObject<any>; schema?: z.ZodObject<any> } {\n const result: { inputSchema?: z.ZodObject<any>; schema?: z.ZodObject<any> } = {};\n\n // Priority 1: Check for default export (highest priority, most explicit)\n // This allows each file to have one clear schema definition\n if (module.default instanceof z.ZodObject) {\n // Default export is always the primary schema\n result.schema = module.default as z.ZodObject<any>;\n // If we have a default export, we can return early as it takes precedence\n // But we still check for InputSchema for backward compatibility\n }\n\n // Priority 2: Look for named exports matching patterns (for backward compatibility)\n for (const [key, value] of Object.entries(module)) {\n // Skip default export as we already handled it\n if (key === \"default\") continue;\n\n // Check if it's a Zod schema\n if (value instanceof z.ZodObject) {\n // Check for InputSchema pattern (used for form validation)\n if (patterns.includes(\"InputSchema\") && key.endsWith(\"InputSchema\")) {\n result.inputSchema = value as z.ZodObject<any>;\n } else if (!result.schema) {\n // Only set schema if we haven't found one via default export\n if (patterns.includes(\"Collection\") && key.endsWith(\"Collection\")) {\n // Prefer Collection over Schema as it has metadata (indexes, permissions)\n result.schema = value as z.ZodObject<any>;\n } else if (patterns.includes(\"Schema\") && key.endsWith(\"Schema\") && !key.endsWith(\"InputSchema\")) {\n result.schema = value as z.ZodObject<any>;\n }\n }\n }\n }\n\n return result;\n}\n\n/**\n * Identifies whether to use InputSchema or Schema pattern\n * Prefers Schema over InputSchema as it includes base fields\n *\n * @param schemas - Object containing inputSchema and/or schema\n * @returns The schema to use for collection definition\n */\nexport function selectSchemaForCollection(schemas: {\n inputSchema?: z.ZodObject<any>;\n schema?: z.ZodObject<any>;\n}): z.ZodObject<any> | null {\n // Prefer the full Schema over InputSchema as it includes base fields\n if (schemas.schema) {\n return schemas.schema;\n }\n\n if (schemas.inputSchema) {\n return schemas.inputSchema;\n }\n\n return null;\n}\n\n/**\n * Extracts field definitions from a Zod object schema\n * Filters out base schema fields (id, collectionId, created, updated, expand)\n *\n * @param zodSchema - The Zod object schema\n * @param excludeFields - Additional fields to exclude (default: base schema fields)\n * @returns Array of field names and their Zod types\n */\nexport function extractFieldDefinitions(\n zodSchema: z.ZodObject<any>,\n excludeFields?: string[]\n): Array<{ name: string; zodType: z.ZodTypeAny }> {\n const shape = zodSchema.shape;\n const fields: Array<{ name: string; zodType: z.ZodTypeAny }> = [];\n\n // Base schema fields to exclude (these are system fields in PocketBase)\n const baseFields = [\"id\", \"collectionId\", \"collectionName\", \"created\", \"updated\", \"expand\"];\n\n // Additional fields to exclude (image file handling fields)\n const defaultExcludeFields = [\"thumbnailURL\", \"imageFiles\"];\n\n // Combine all exclusions\n const allExclusions = new Set([...baseFields, ...defaultExcludeFields, ...(excludeFields || [])]);\n\n for (const [fieldName, zodType] of Object.entries(shape)) {\n // Skip excluded fields\n if (!allExclusions.has(fieldName)) {\n fields.push({ name: fieldName, zodType: zodType as z.ZodTypeAny });\n }\n }\n\n return fields;\n}\n\n/**\n * Detects if a collection is an auth collection\n * Auth collections have email and password fields\n *\n * @param fields - Array of field definitions\n * @returns True if the collection is an auth collection\n */\nexport function isAuthCollection(fields: Array<{ name: string; zodType: z.ZodTypeAny }>): boolean {\n const fieldNames = fields.map((f) => f.name.toLowerCase());\n\n // Auth collections must have both email and password fields\n const hasEmail = fieldNames.includes(\"email\");\n const hasPassword = fieldNames.includes(\"password\");\n\n return hasEmail && hasPassword;\n}\n\n/**\n * Extracts validation constraints from Zod type\n * Includes min, max, required, unique, and other options\n *\n * @param fieldName - The field name\n * @param zodType - The Zod type\n * @returns Field definition with constraints\n */\nexport function buildFieldDefinition(fieldName: string, zodType: z.ZodTypeAny): FieldDefinition {\n // Check for explicit field metadata first (from field helper functions)\n const fieldMetadata = extractFieldMetadata(zodType.description);\n\n if (fieldMetadata) {\n // Use explicit metadata from field helpers\n const required = isFieldRequired(zodType);\n\n const fieldDef: FieldDefinition = {\n name: fieldName,\n type: fieldMetadata.type,\n required,\n options: fieldMetadata.options,\n };\n\n // If it's a relation type from metadata, we still need to extract relation config\n if (fieldMetadata.type === \"relation\") {\n const relationMetadata = extractRelationMetadata(zodType.description);\n if (relationMetadata) {\n fieldDef.relation = {\n collection: relationMetadata.collection,\n maxSelect: relationMetadata.maxSelect,\n minSelect: relationMetadata.minSelect,\n cascadeDelete: relationMetadata.cascadeDelete,\n };\n }\n }\n\n return fieldDef;\n }\n\n // Fall back to existing type inference logic\n const fieldType = mapZodTypeToPocketBase(zodType, fieldName);\n const required = isFieldRequired(zodType);\n const options = extractFieldOptions(zodType);\n\n const fieldDef: FieldDefinition = {\n name: fieldName,\n type: fieldType,\n required,\n options,\n };\n\n // Check for explicit relation metadata first (from relation() or relations() helpers)\n const relationMetadata = extractRelationMetadata(zodType.description);\n\n if (relationMetadata) {\n // Explicit relation definition found\n fieldDef.type = \"relation\";\n fieldDef.relation = {\n collection: relationMetadata.collection,\n maxSelect: relationMetadata.maxSelect,\n minSelect: relationMetadata.minSelect,\n cascadeDelete: relationMetadata.cascadeDelete,\n };\n\n // Clear out string-specific options that don't apply to relation fields\n fieldDef.options = undefined;\n }\n // Fall back to naming convention detection for backward compatibility\n else if (isRelationField(fieldName, zodType)) {\n // Override type to 'relation' for relation fields\n fieldDef.type = \"relation\";\n\n const targetCollection = resolveTargetCollection(fieldName);\n const maxSelect = getMaxSelect(fieldName, zodType);\n const minSelect = getMinSelect(fieldName, zodType);\n\n fieldDef.relation = {\n collection: targetCollection,\n maxSelect,\n minSelect,\n cascadeDelete: false, // Default to false, can be configured later\n };\n\n // Clear out string-specific options that don't apply to relation fields\n // Options like 'min', 'max', 'pattern' are from string validation and don't apply to relations\n if (fieldDef.options) {\n const { min: _min, max: _max, pattern: _pattern, ...relationSafeOptions } = fieldDef.options;\n fieldDef.options = Object.keys(relationSafeOptions).length ? relationSafeOptions : undefined;\n }\n }\n\n return fieldDef;\n}\n\n/**\n * Extracts index definitions from a Zod schema\n * Parses the schema description metadata to find index definitions\n *\n * @param schema - Zod schema with index metadata\n * @returns Array of index SQL statements or undefined\n */\nexport function extractIndexes(schema: z.ZodTypeAny): string[] | undefined {\n // Try to extract indexes from schema description\n const schemaDescription = schema.description;\n\n if (!schemaDescription) {\n return undefined;\n }\n\n try {\n const metadata = JSON.parse(schemaDescription);\n\n // Check if indexes are present in metadata\n if (metadata.indexes && Array.isArray(metadata.indexes)) {\n return metadata.indexes;\n }\n } catch {\n // If description is not valid JSON, return undefined\n }\n\n return undefined;\n}\n\n/**\n * Converts a Zod schema to a CollectionSchema interface\n *\n * @param collectionName - The name of the collection\n * @param zodSchema - The Zod object schema\n * @returns CollectionSchema definition\n */\nexport function convertZodSchemaToCollectionSchema(\n collectionName: string,\n zodSchema: z.ZodObject<any>\n): CollectionSchema {\n // Extract field definitions from Zod schema\n const rawFields = extractFieldDefinitions(zodSchema);\n\n // Determine collection type (auth or base)\n // Prefer explicit type from metadata, fall back to field detection\n const explicitType = extractCollectionTypeFromSchema(zodSchema);\n const collectionType = explicitType ?? (isAuthCollection(rawFields) ? \"auth\" : \"base\");\n\n // Build field definitions with constraints\n let fields: FieldDefinition[] = rawFields.map(({ name, zodType }) => buildFieldDefinition(name, zodType));\n\n // Exclude auth system fields for auth collections (PocketBase adds them automatically)\n if (collectionType === \"auth\") {\n const authSystemFieldNames = [\"email\", \"emailVisibility\", \"verified\", \"password\", \"tokenKey\"];\n fields = fields.filter((field) => !authSystemFieldNames.includes(field.name));\n }\n\n // Extract indexes from schema\n const indexes = extractIndexes(zodSchema) || [];\n\n // Extract and validate permissions from schema\n const permissionAnalyzer = new PermissionAnalyzer();\n let permissions: PermissionSchema | undefined = undefined;\n\n // Try to extract permissions from schema description\n const schemaDescription = zodSchema.description;\n const extractedPermissions = permissionAnalyzer.extractPermissions(schemaDescription);\n\n if (extractedPermissions) {\n // Resolve template configurations to concrete rules\n const resolvedPermissions = permissionAnalyzer.resolvePermissions(extractedPermissions);\n\n // Validate permissions against collection fields\n const validationResults = permissionAnalyzer.validatePermissions(\n collectionName,\n resolvedPermissions,\n fields,\n collectionType === \"auth\"\n );\n\n // Log validation errors and warnings\n for (const [ruleType, result] of validationResults) {\n if (!result.valid) {\n console.error(`[${collectionName}] Permission validation failed for ${ruleType}:`);\n result.errors.forEach((error) => console.error(` - ${error}`));\n }\n\n if (result.warnings.length > 0) {\n console.warn(`[${collectionName}] Permission warnings for ${ruleType}:`);\n result.warnings.forEach((warning) => console.warn(` - ${warning}`));\n }\n }\n\n // Merge with defaults to ensure all rules are defined\n permissions = permissionAnalyzer.mergeWithDefaults(resolvedPermissions);\n }\n\n // Build collection schema\n // Use extracted permissions for rules, falling back to nulls\n const collectionSchema: CollectionSchema = {\n name: collectionName,\n type: collectionType,\n fields,\n indexes,\n rules: {\n listRule: permissions?.listRule ?? null,\n viewRule: permissions?.viewRule ?? null,\n createRule: permissions?.createRule ?? null,\n updateRule: permissions?.updateRule ?? null,\n deleteRule: permissions?.deleteRule ?? null,\n manageRule: permissions?.manageRule ?? null,\n },\n permissions,\n };\n\n return collectionSchema;\n}\n\n/**\n * Builds a complete SchemaDefinition from schema files\n * Main entry point for the Schema Analyzer\n *\n * @param config - Schema analyzer configuration or path to schema directory\n * @returns Complete SchemaDefinition with all collections\n */\nexport async function buildSchemaDefinition(config: SchemaAnalyzerConfig | string): Promise<SchemaDefinition> {\n // Support legacy string-only parameter\n const normalizedConfig: SchemaAnalyzerConfig = typeof config === \"string\" ? { schemaDir: config } : config;\n\n const mergedConfig = mergeConfig(normalizedConfig);\n const collections = new Map<string, CollectionSchema>();\n\n // Discover schema files\n const schemaFiles = discoverSchemaFiles(normalizedConfig);\n\n if (schemaFiles.length === 0) {\n const schemaDir = resolveSchemaDir(normalizedConfig);\n throw new SchemaParsingError(\n `No schema files found in ${schemaDir}. Make sure you have schema files in the directory.`,\n schemaDir\n );\n }\n\n // Process each schema file\n for (const filePath of schemaFiles) {\n try {\n let importPath = filePath;\n\n // Apply path transformation if provided (for monorepo setups)\n if (normalizedConfig.pathTransformer) {\n importPath = normalizedConfig.pathTransformer(filePath);\n } else if (mergedConfig.useCompiledFiles) {\n // Default transformation: convert /src/ to /dist/ for compiled files\n // This is a common pattern but can be overridden with pathTransformer\n const distPath = filePath.replace(/\\/src\\//, \"/dist/\");\n // Only use dist path if it actually exists (i.e., files are compiled)\n // Otherwise, fall back to source path for TypeScript files\n if (fs.existsSync(`${distPath}.js`) || fs.existsSync(`${distPath}.mjs`)) {\n importPath = distPath;\n } else {\n // Files aren't compiled, use source path\n importPath = filePath;\n }\n }\n\n // Import the module\n const module = await importSchemaModule(importPath, normalizedConfig);\n\n // Extract schema definitions\n const schemas = extractSchemaDefinitions(module, mergedConfig.schemaPatterns);\n\n // Select the appropriate schema\n const zodSchema = selectSchemaForCollection(schemas);\n\n if (!zodSchema) {\n console.warn(`No valid schema found in ${filePath}, skipping...`);\n continue;\n }\n\n // Get collection name - prefer metadata from defineCollection(), fall back to filename\n const collectionNameFromSchema = extractCollectionNameFromSchema(zodSchema);\n const collectionName = collectionNameFromSchema ?? getCollectionNameFromFile(filePath);\n\n // Convert to CollectionSchema\n const collectionSchema = convertZodSchemaToCollectionSchema(collectionName, zodSchema);\n\n // Add to collections map\n collections.set(collectionName, collectionSchema);\n } catch (error) {\n // If it's already a SchemaParsingError, re-throw it\n if (error instanceof SchemaParsingError) {\n throw error;\n }\n\n // Otherwise, wrap it in a SchemaParsingError\n throw new SchemaParsingError(\n `Error processing schema file: ${error instanceof Error ? error.message : String(error)}`,\n filePath,\n error as Error\n );\n }\n }\n\n return { collections };\n}\n\n/**\n * Parses schema files and returns SchemaDefinition\n * Alias for buildSchemaDefinition for better semantic clarity\n *\n * @param config - Schema analyzer configuration or path to schema directory\n * @returns Complete SchemaDefinition with all collections\n */\nexport async function parseSchemaFiles(config: SchemaAnalyzerConfig | string): Promise<SchemaDefinition> {\n return buildSchemaDefinition(config);\n}\n\n/**\n * Creates a SchemaAnalyzer instance with the given configuration\n * Provides an object-oriented interface for schema analysis\n */\nexport class SchemaAnalyzer {\n private config: Required<Omit<SchemaAnalyzerConfig, \"pathTransformer\">> & {\n pathTransformer?: (sourcePath: string) => string;\n };\n\n constructor(config: SchemaAnalyzerConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Discovers schema files in the configured directory\n */\n discoverSchemaFiles(): string[] {\n return discoverSchemaFiles(this.config);\n }\n\n /**\n * Parses all schema files and returns a SchemaDefinition\n */\n async parseSchemaFiles(): Promise<SchemaDefinition> {\n return buildSchemaDefinition(this.config);\n }\n\n /**\n * Converts a single Zod schema to a CollectionSchema\n */\n convertZodSchemaToCollectionSchema(name: string, schema: z.ZodObject<any>): CollectionSchema {\n return convertZodSchemaToCollectionSchema(name, schema);\n }\n}\n","/**\n * PocketBase Format Converter\n * Converts PocketBase collection objects to our internal CollectionSchema format\n *\n * This module handles conversion between PocketBase's native collection format\n * (as found in migration files and snapshots) and our internal schema representation.\n */\n\nimport { SnapshotError } from \"./errors\";\nimport type { CollectionSchema, 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 // Known PocketBase constants\n // Note: We return \"Users\" (title case) for consistency, but this should be\n // normalized during comparison to handle case differences\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 * Converts a PocketBase collection object to CollectionSchema format\n *\n * @param pbCollection - PocketBase collection object from migration file\n * @returns CollectionSchema object\n */\nexport function convertPocketBaseCollection(pbCollection: any): CollectionSchema {\n const fields: any[] = [];\n\n // System field names that should always be excluded\n const systemFieldNames = [\"id\", \"created\", \"updated\", \"collectionId\", \"collectionName\", \"expand\"];\n\n // Auth collection system field names\n const authSystemFieldNames = [\"email\", \"emailVisibility\", \"verified\", \"password\", \"tokenKey\"];\n\n // Convert PocketBase fields to our FieldDefinition format\n if (pbCollection.fields && Array.isArray(pbCollection.fields)) {\n for (const pbField of pbCollection.fields) {\n // Skip system fields by checking both the system flag and field name\n // Some PocketBase exports mark created/updated as system: false\n if (pbField.system || systemFieldNames.includes(pbField.name)) {\n continue;\n }\n\n // Skip auth system fields for auth collections\n if (pbCollection.type === \"auth\" && authSystemFieldNames.includes(pbField.name)) {\n continue;\n }\n\n const field: any = {\n name: pbField.name,\n type: pbField.type,\n required: pbField.required || false,\n };\n\n // Initialize options object\n field.options = pbField.options ? { ...pbField.options } : {};\n\n // Extract values for select/enum fields (values can be directly on field or in options)\n // This must be done before cleaning up empty options to ensure values are preserved\n if (pbField.type === \"select\") {\n // Check for values directly on the field first (common in migration files)\n if (pbField.values && Array.isArray(pbField.values)) {\n field.options.values = pbField.values;\n } else if (pbField.options?.values && Array.isArray(pbField.options.values)) {\n // Already in options, keep it\n field.options.values = pbField.options.values;\n }\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 };\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 fields.push(field);\n }\n }\n\n const schema: CollectionSchema = {\n name: pbCollection.name,\n type: pbCollection.type || \"base\",\n fields,\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 const rules: any = {};\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 if (Object.keys(rules).length > 0) {\n schema.rules = rules;\n // Also set permissions to match rules (they're the same thing)\n schema.permissions = { ...rules };\n }\n\n return schema;\n}\n\n/**\n * Converts PocketBase migration format to SchemaSnapshot\n * Extracts the snapshot array from the migration file content\n *\n * @param migrationContent - Raw migration file content\n * @returns SchemaSnapshot with collections map\n */\nexport function convertPocketBaseMigration(migrationContent: string): SchemaSnapshot {\n try {\n // Extract the snapshot array from the migration file\n // The format is: migrate((app) => { const snapshot = [...]; ... })\n const snapshotMatch = migrationContent.match(/const\\s+snapshot\\s*=\\s*(\\[[\\s\\S]*?\\]);/);\n\n if (!snapshotMatch) {\n throw new Error(\"Could not find snapshot array in migration file\");\n }\n\n // Parse the snapshot array as JSON\n // We need to evaluate it as JavaScript since it's not pure JSON\n const snapshotArrayStr = snapshotMatch[1];\n let snapshotArray: any[];\n\n try {\n // Use Function constructor to safely evaluate the array\n // This is safer than eval() and works for our use case\n snapshotArray = new Function(`return ${snapshotArrayStr}`)();\n } catch (parseError) {\n throw new Error(`Failed to parse snapshot array: ${parseError}`);\n }\n\n if (!Array.isArray(snapshotArray)) {\n throw new Error(\"Snapshot is not an array\");\n }\n\n // Convert each collection to our format\n const collections = new Map<string, CollectionSchema>();\n\n for (const pbCollection of snapshotArray) {\n if (!pbCollection.name) {\n console.warn(\"Skipping collection without name\");\n continue;\n }\n\n const schema = convertPocketBaseCollection(pbCollection);\n collections.set(pbCollection.name, schema);\n }\n\n return {\n version: SNAPSHOT_VERSION,\n timestamp: new Date().toISOString(),\n collections,\n };\n } catch (error) {\n throw new SnapshotError(\n `Failed to convert PocketBase migration: ${error instanceof Error ? error.message : String(error)}`,\n undefined,\n \"parse\",\n error instanceof Error ? error : undefined\n );\n }\n}\n","/**\n * Migration File Parser\n * Parses PocketBase migration files to extract collection operations\n *\n * This module handles parsing migration files to extract:\n * - Collection creations (new Collection(...))\n * - Collection deletions (app.delete(...))\n * - Field modifications (field.property = value)\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { convertPocketBaseCollection } from \"./pocketbase-converter\";\nimport type { CollectionSchema } from \"./types\";\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\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 && timestamp > snapshotTimestamp) {\n migrationFiles.push({\n path: path.join(migrationsPath, file),\n timestamp,\n });\n }\n }\n\n // Sort by timestamp (ascending order)\n migrationFiles.sort((a, b) => a.timestamp - b.timestamp);\n\n return migrationFiles.map((f) => f.path);\n } catch (error) {\n console.warn(`Error finding migrations after snapshot: ${error}`);\n return [];\n }\n}\n\n/**\n * Helper function to parse collection operations from migration content\n *\n * @param content - Migration content (should be just the UP migration)\n * @returns Object with collections to create and collections to delete\n */\nfunction parseMigrationOperationsFromContent(content: string): {\n collectionsToCreate: CollectionSchema[];\n collectionsToDelete: string[];\n} {\n const collectionsToCreate: CollectionSchema[] = [];\n const collectionsToDelete: string[] = [];\n\n try {\n // Extract collection definitions from `new Collection({...})`\n // Use a more robust approach: find all \"new Collection(\" and then parse until matching closing paren\n let searchIndex = 0;\n while (true) {\n const collectionStart = content.indexOf(\"new Collection(\", searchIndex);\n if (collectionStart === -1) {\n break;\n }\n\n // Find the opening brace after \"new Collection(\"\n const openParen = collectionStart + \"new Collection(\".length;\n let braceCount = 0;\n let parenCount = 1; // We're already inside the opening paren\n let inString = false;\n let stringChar = null;\n let i = openParen;\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 searchIndex = i + 1;\n continue;\n }\n\n const objectStart = i;\n braceCount = 1;\n i++;\n\n // Find the matching closing brace and paren\n while (i < content.length && (braceCount > 0 || parenCount > 0)) {\n const char = content[i];\n const prevChar = i > 0 ? content[i - 1] : \"\";\n\n // Handle strings\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\n i++;\n }\n\n if (braceCount === 0 && parenCount === 0) {\n const objectContent = content.substring(objectStart, i - 1); // -1 to exclude the closing paren\n try {\n // Use Function constructor to parse the JavaScript object\n const collectionObj = new Function(`return ${objectContent}`)();\n if (collectionObj && collectionObj.name) {\n const schema = convertPocketBaseCollection(collectionObj);\n collectionsToCreate.push(schema);\n }\n } catch (error) {\n // Skip malformed collection definitions\n console.warn(`Failed to parse collection definition: ${error}`);\n }\n }\n\n searchIndex = i;\n }\n\n // Extract collection deletions from `app.delete(...)`\n // Look for patterns like: app.delete(collection_xxx) or app.delete(app.findCollectionByNameOrId(\"name\"))\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 we have a collection name from findCollectionByNameOrId, use it\n if (match[1]) {\n collectionsToDelete.push(match[1]);\n } else {\n // Try to find the collection name from the variable name\n // Look backwards for the collection variable definition\n const varNameMatch = match[0].match(/collection_(\\w+)/);\n if (varNameMatch) {\n // Try to find the collection name from the variable definition\n const varName = `collection_${varNameMatch[1]}`;\n // Search backwards from the delete call to find the variable definition\n const deleteIndex = content.indexOf(match[0]);\n const beforeDelete = content.substring(0, deleteIndex);\n const varDefMatch = beforeDelete.match(\n new RegExp(`const\\\\s+${varName}\\\\s*=\\\\s*new\\\\s+Collection\\\\(\\\\s*(\\\\{[\\\\s\\\\S]*?\\\\})\\\\s*\\\\)`, \"g\")\n );\n if (varDefMatch && varDefMatch.length > 0) {\n // Find the collection definition (get the last match closest to the delete)\n const collectionDefMatch = beforeDelete.match(\n new RegExp(`const\\\\s+${varName}\\\\s*=\\\\s*new\\\\s+Collection\\\\(\\\\s*(\\\\{[\\\\s\\\\S]*?\\\\})\\\\s*\\\\)`)\n );\n if (collectionDefMatch) {\n try {\n const collectionDefStr = collectionDefMatch[1];\n const collectionObj = new Function(`return ${collectionDefStr}`)();\n if (collectionObj && collectionObj.name) {\n collectionsToDelete.push(collectionObj.name);\n }\n } catch {\n // Skip if we can't parse\n }\n }\n }\n }\n }\n }\n\n // Also look for direct collection name in findCollectionByNameOrId followed by delete\n const findAndDeleteMatches = content.matchAll(\n /app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)[\\s\\S]*?app\\.delete/g\n );\n for (const match of findAndDeleteMatches) {\n collectionsToDelete.push(match[1]);\n }\n } catch (error) {\n console.warn(`Failed to parse migration operations from content: ${error}`);\n }\n\n return { collectionsToCreate, collectionsToDelete };\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} {\n try {\n // Extract only the UP migration (first function argument to migrate())\n // Find the migrate call and extract the first function body\n const migrateMatch = migrationContent.match(/migrate\\s*\\(\\s*/);\n if (!migrateMatch) {\n // If we can't find the migrate pattern, try to parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n const startIndex = migrateMatch.index! + migrateMatch[0].length;\n\n // Find the opening paren of the first function\n let i = startIndex;\n let parenCount = 0;\n let foundFirstParen = false;\n\n while (i < migrationContent.length) {\n const char = migrationContent[i];\n if (char === \"(\") {\n parenCount++;\n foundFirstParen = true;\n i++;\n break;\n }\n i++;\n }\n\n if (!foundFirstParen) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Skip the function parameters: (app) => {\n let inString = false;\n let stringChar = null;\n let foundBrace = false;\n let braceStart = -1;\n\n while (i < migrationContent.length && !foundBrace) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"(\") parenCount++;\n if (char === \")\") {\n parenCount--;\n if (parenCount === 0) {\n // Found end of function parameters, look for =>\n i++;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length - 1 && migrationContent[i] === \"=\" && migrationContent[i + 1] === \">\") {\n i += 2;\n while (i < migrationContent.length && /\\s/.test(migrationContent[i])) {\n i++;\n }\n if (i < migrationContent.length && migrationContent[i] === \"{\") {\n foundBrace = true;\n braceStart = i + 1;\n break;\n }\n }\n }\n }\n }\n i++;\n }\n\n if (!foundBrace || braceStart === -1) {\n return parseMigrationOperationsFromContent(migrationContent);\n }\n\n // Find the matching closing brace\n let braceCount = 1;\n i = braceStart;\n inString = false;\n stringChar = null;\n\n while (i < migrationContent.length && braceCount > 0) {\n const char = migrationContent[i];\n const prevChar = i > 0 ? migrationContent[i - 1] : \"\";\n\n if (!inString && (char === '\"' || char === \"'\")) {\n inString = true;\n stringChar = char;\n } else if (inString && char === stringChar && prevChar !== \"\\\\\") {\n inString = false;\n stringChar = null;\n }\n\n if (!inString) {\n if (char === \"{\") braceCount++;\n if (char === \"}\") braceCount--;\n }\n\n i++;\n }\n\n if (braceCount === 0) {\n const upMigrationContent = migrationContent.substring(braceStart, i - 1);\n return parseMigrationOperationsFromContent(upMigrationContent);\n }\n\n // Fallback: parse the whole file\n return parseMigrationOperationsFromContent(migrationContent);\n } catch (error) {\n console.warn(`Failed to parse migration operations: ${error}`);\n return { collectionsToCreate: [], collectionsToDelete: [] };\n }\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} 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 */\nfunction applyMigrationOperations(\n snapshot: SchemaSnapshot,\n operations: { collectionsToCreate: CollectionSchema[]; collectionsToDelete: string[] }\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/updates\n for (const collection of operations.collectionsToCreate) {\n updatedCollections.set(collection.name, collection);\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","/**\n * Diff Engine component\n * Compares current schema with previous snapshot and identifies changes\n *\n * This module provides a standalone, configurable diff engine that can be used\n * by consumer projects to compare schema definitions and detect changes.\n */\n\nimport type {\n APIRuleType,\n CollectionModification,\n CollectionSchema,\n FieldChange,\n FieldDefinition,\n FieldModification,\n PermissionChange,\n RuleUpdate,\n SchemaDefinition,\n SchemaDiff,\n SchemaSnapshot,\n} from \"./types\";\n\n/**\n * Configuration options for the diff engine\n */\nexport interface DiffEngineConfig {\n /**\n * Whether to warn on collection deletions\n * Defaults to true\n */\n warnOnDelete?: boolean;\n\n /**\n * Whether to require --force flag for destructive changes\n * Defaults to true\n */\n requireForceForDestructive?: boolean;\n\n /**\n * Severity threshold for requiring force flag\n * 'high' = only collection/field deletions and type changes\n * 'medium' = includes making fields required\n * 'low' = includes any constraint changes\n * Defaults to 'high'\n */\n severityThreshold?: \"high\" | \"medium\" | \"low\";\n\n /**\n * Custom system collections to exclude from diff\n * These collections will not be created or deleted\n */\n systemCollections?: string[];\n\n /**\n * Custom system fields to exclude from user collection diffs\n * These fields will not be included in fieldsToAdd for the users collection\n */\n usersSystemFields?: string[];\n}\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Required<DiffEngineConfig> = {\n warnOnDelete: true,\n requireForceForDestructive: true,\n severityThreshold: \"high\",\n systemCollections: [\"_mfas\", \"_otps\", \"_externalAuths\", \"_authOrigins\", \"_superusers\"],\n usersSystemFields: [\"id\", \"password\", \"tokenKey\", \"email\", \"emailVisibility\", \"verified\", \"created\", \"updated\"],\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config?: DiffEngineConfig): Required<DiffEngineConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Destructive change information\n */\nexport interface DestructiveChange {\n type: \"collection_delete\" | \"field_delete\" | \"type_change\" | \"required_change\" | \"constraint_change\";\n severity: \"high\" | \"medium\" | \"low\";\n collection: string;\n field?: string;\n description: string;\n oldValue?: any;\n newValue?: any;\n}\n\n/**\n * Change summary for status reporting\n */\nexport interface ChangeSummary {\n totalChanges: number;\n collectionsToCreate: number;\n collectionsToDelete: number;\n collectionsToModify: number;\n fieldsToAdd: number;\n fieldsToRemove: number;\n fieldsToModify: number;\n indexChanges: number;\n ruleChanges: number;\n permissionChanges: number;\n destructiveChanges: DestructiveChange[];\n nonDestructiveChanges: string[];\n}\n\n/**\n * Checks if a collection is a PocketBase system collection\n * System collections are internal to PocketBase and should not be created or deleted\n *\n * @param collectionName - Name of the collection to check\n * @param config - Optional configuration with custom system collections\n * @returns True if the collection is a system collection\n */\nexport function isSystemCollection(collectionName: string, config?: DiffEngineConfig): boolean {\n const mergedConfig = mergeConfig(config);\n return mergedConfig.systemCollections.includes(collectionName);\n}\n\n/**\n * Returns the list of system field names for the users collection\n * These fields are automatically provided by PocketBase for auth collections\n * and should not be included when generating migrations for users collection extensions\n *\n * @param config - Optional configuration with custom system fields\n * @returns Set of system field names\n */\nexport function getUsersSystemFields(config?: DiffEngineConfig): Set<string> {\n const mergedConfig = mergeConfig(config);\n return new Set(mergedConfig.usersSystemFields);\n}\n\n/**\n * Filters system collections from a schema definition\n * Returns a new SchemaDefinition with only custom (non-system) collections\n *\n * @param schema - Schema definition to filter\n * @param config - Optional configuration\n * @returns Filtered SchemaDefinition without system collections\n */\nexport function filterSystemCollections(schema: SchemaDefinition, config?: DiffEngineConfig): SchemaDefinition {\n const filteredCollections = new Map<string, CollectionSchema>();\n\n for (const [collectionName, collectionSchema] of schema.collections) {\n if (!isSystemCollection(collectionName, config)) {\n filteredCollections.set(collectionName, collectionSchema);\n }\n }\n\n return {\n collections: filteredCollections,\n };\n}\n\n/**\n * Identifies new collections in schema that don't exist in snapshot\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @returns Array of new collections\n */\nexport function findNewCollections(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null\n): CollectionSchema[] {\n const newCollections: CollectionSchema[] = [];\n\n // If no previous snapshot, all collections are new\n if (!previousSnapshot) {\n return Array.from(currentSchema.collections.values());\n }\n\n // Find collections in current schema that don't exist in snapshot\n for (const [collectionName, collectionSchema] of currentSchema.collections) {\n if (!previousSnapshot.collections.has(collectionName)) {\n newCollections.push(collectionSchema);\n }\n }\n\n return newCollections;\n}\n\n/**\n * Identifies collections removed from schema (exist in snapshot but not in current schema)\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @returns Array of removed collections\n */\nexport function findRemovedCollections(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null\n): CollectionSchema[] {\n const removedCollections: CollectionSchema[] = [];\n\n // If no previous snapshot, nothing can be removed\n if (!previousSnapshot) {\n return removedCollections;\n }\n\n // Find collections in snapshot that don't exist in current schema\n for (const [collectionName, collectionSchema] of previousSnapshot.collections) {\n if (!currentSchema.collections.has(collectionName)) {\n removedCollections.push(collectionSchema);\n }\n }\n\n return removedCollections;\n}\n\n/**\n * Matches collections by name between current schema and snapshot\n * Returns pairs of [current, previous] for collections that exist in both\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @returns Array of matched collection pairs\n */\nexport function matchCollectionsByName(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null\n): Array<[CollectionSchema, CollectionSchema]> {\n const matches: Array<[CollectionSchema, CollectionSchema]> = [];\n\n // If no previous snapshot, no matches possible\n if (!previousSnapshot) {\n return matches;\n }\n\n // Create a case-insensitive lookup map for previous collections\n const previousCollectionsLower = new Map<string, [string, CollectionSchema]>();\n for (const [name, collection] of previousSnapshot.collections) {\n previousCollectionsLower.set(name.toLowerCase(), [name, collection]);\n }\n\n // Find collections that exist in both current and previous (case-insensitive)\n for (const [collectionName, currentCollection] of currentSchema.collections) {\n const previousEntry = previousCollectionsLower.get(collectionName.toLowerCase());\n\n if (previousEntry) {\n const [, previousCollection] = previousEntry;\n matches.push([currentCollection, previousCollection]);\n }\n }\n\n return matches;\n}\n\n/**\n * Identifies new fields in current collection that don't exist in previous\n *\n * @param currentFields - Current collection fields\n * @param previousFields - Previous collection fields\n * @returns Array of new fields\n */\nexport function findNewFields(currentFields: FieldDefinition[], previousFields: FieldDefinition[]): FieldDefinition[] {\n const newFields: FieldDefinition[] = [];\n const previousFieldNames = new Set(previousFields.map((f) => f.name));\n\n for (const currentField of currentFields) {\n if (!previousFieldNames.has(currentField.name)) {\n newFields.push(currentField);\n }\n }\n\n return newFields;\n}\n\n/**\n * Identifies fields removed from current collection (exist in previous but not in current)\n *\n * @param currentFields - Current collection fields\n * @param previousFields - Previous collection fields\n * @returns Array of removed fields\n */\nexport function findRemovedFields(\n currentFields: FieldDefinition[],\n previousFields: FieldDefinition[]\n): FieldDefinition[] {\n const removedFields: FieldDefinition[] = [];\n const currentFieldNames = new Set(currentFields.map((f) => f.name));\n\n for (const previousField of previousFields) {\n if (!currentFieldNames.has(previousField.name)) {\n removedFields.push(previousField);\n }\n }\n\n return removedFields;\n}\n\n/**\n * Matches fields by name between current and previous collections\n * Returns pairs of [current, previous] for fields that exist in both\n *\n * @param currentFields - Current collection fields\n * @param previousFields - Previous collection fields\n * @returns Array of matched field pairs\n */\nexport function matchFieldsByName(\n currentFields: FieldDefinition[],\n previousFields: FieldDefinition[]\n): Array<[FieldDefinition, FieldDefinition]> {\n const matches: Array<[FieldDefinition, FieldDefinition]> = [];\n\n // Create a map of previous fields by name for efficient lookup\n const previousFieldMap = new Map<string, FieldDefinition>();\n for (const previousField of previousFields) {\n previousFieldMap.set(previousField.name, previousField);\n }\n\n // Find matching fields\n for (const currentField of currentFields) {\n const previousField = previousFieldMap.get(currentField.name);\n\n if (previousField) {\n matches.push([currentField, previousField]);\n }\n }\n\n return matches;\n}\n\n/**\n * Compares two values for equality, handling deep object comparison\n *\n * @param a - First value\n * @param b - Second value\n * @returns True if values are equal\n */\nfunction areValuesEqual(a: any, b: any): boolean {\n // Handle null/undefined\n if (a === b) return true;\n if (a == null || b == null) return false;\n\n // Handle arrays\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((val, idx) => areValuesEqual(val, b[idx]));\n }\n\n // Handle objects\n if (typeof a === \"object\" && typeof b === \"object\") {\n const keysA = Object.keys(a);\n const keysB = Object.keys(b);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) => areValuesEqual(a[key], b[key]));\n }\n\n // Primitive comparison\n return a === b;\n}\n\n/**\n * Compares field types between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns FieldChange if types differ, null otherwise\n */\nexport function compareFieldTypes(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange | null {\n if (currentField.type !== previousField.type) {\n return {\n property: \"type\",\n oldValue: previousField.type,\n newValue: currentField.type,\n };\n }\n\n return null;\n}\n\n/**\n * Compares field constraints (required, unique) between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of FieldChange for constraint differences\n */\nexport function compareFieldConstraints(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange[] {\n const changes: FieldChange[] = [];\n\n // Compare required constraint\n if (currentField.required !== previousField.required) {\n changes.push({\n property: \"required\",\n oldValue: previousField.required,\n newValue: currentField.required,\n });\n }\n\n // Compare unique constraint\n if (currentField.unique !== previousField.unique) {\n changes.push({\n property: \"unique\",\n oldValue: previousField.unique,\n newValue: currentField.unique,\n });\n }\n\n return changes;\n}\n\n/**\n * Compares field options (min, max, pattern, etc.) between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of FieldChange for option differences\n */\nexport function compareFieldOptions(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange[] {\n const changes: FieldChange[] = [];\n\n const currentOptions = currentField.options || {};\n const previousOptions = previousField.options || {};\n\n // Get all unique option keys\n const allKeys = new Set([...Object.keys(currentOptions), ...Object.keys(previousOptions)]);\n\n // Compare each option\n for (const key of allKeys) {\n const currentValue = currentOptions[key];\n const previousValue = previousOptions[key];\n\n // Handle undefined values - if one is undefined and the other is not, that's a change\n // But if both are undefined, that's not a change\n if (currentValue === undefined && previousValue === undefined) {\n continue;\n }\n\n if (!areValuesEqual(currentValue, previousValue)) {\n changes.push({\n property: `options.${key}`,\n oldValue: previousValue,\n newValue: currentValue,\n });\n }\n }\n\n return changes;\n}\n\n/**\n * Compares relation configurations between current and previous\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of FieldChange for relation differences\n */\nexport function compareRelationConfigurations(\n currentField: FieldDefinition,\n previousField: FieldDefinition\n): FieldChange[] {\n const changes: FieldChange[] = [];\n\n const currentRelation = currentField.relation;\n const previousRelation = previousField.relation;\n\n // If one has relation and other doesn't, that's a type change (handled elsewhere)\n if (!currentRelation && !previousRelation) {\n return changes;\n }\n\n if (!currentRelation || !previousRelation) {\n // This shouldn't happen if types match, but handle gracefully\n return changes;\n }\n\n // Compare relation properties\n // Note: collectionId should already be resolved to collection name during parsing\n // This normalization is just a safety net for edge cases\n const normalizeCollection = (collection: string): string => {\n if (!collection) return collection;\n\n // Handle known PocketBase constants\n if (collection === \"_pb_users_auth_\") {\n return \"Users\";\n }\n // Handle expressions that might not have been parsed correctly\n const nameMatch = collection.match(/app\\.findCollectionByNameOrId\\s*\\(\\s*[\"']([^\"']+)[\"']\\s*\\)/);\n if (nameMatch) {\n return nameMatch[1];\n }\n return collection;\n };\n\n const normalizedCurrent = normalizeCollection(currentRelation.collection);\n const normalizedPrevious = normalizeCollection(previousRelation.collection);\n\n // Only report a change if the normalized values differ\n // Use normalized values for comparison, but report original values in the change\n if (normalizedCurrent !== normalizedPrevious) {\n changes.push({\n property: \"relation.collection\",\n oldValue: normalizedPrevious, // Use normalized value for clarity\n newValue: normalizedCurrent, // Use normalized value for clarity\n });\n }\n\n if (currentRelation.cascadeDelete !== previousRelation.cascadeDelete) {\n changes.push({\n property: \"relation.cascadeDelete\",\n oldValue: previousRelation.cascadeDelete,\n newValue: currentRelation.cascadeDelete,\n });\n }\n\n if (currentRelation.maxSelect !== previousRelation.maxSelect) {\n changes.push({\n property: \"relation.maxSelect\",\n oldValue: previousRelation.maxSelect,\n newValue: currentRelation.maxSelect,\n });\n }\n\n if (currentRelation.minSelect !== previousRelation.minSelect) {\n changes.push({\n property: \"relation.minSelect\",\n oldValue: previousRelation.minSelect,\n newValue: currentRelation.minSelect,\n });\n }\n\n return changes;\n}\n\n/**\n * Detects all changes between two field definitions\n * Combines type, constraint, option, and relation changes\n *\n * @param currentField - Current field definition\n * @param previousField - Previous field definition\n * @returns Array of all detected changes\n */\nexport function detectFieldChanges(currentField: FieldDefinition, previousField: FieldDefinition): FieldChange[] {\n const changes: FieldChange[] = [];\n\n // Compare types\n const typeChange = compareFieldTypes(currentField, previousField);\n if (typeChange) {\n changes.push(typeChange);\n }\n\n // Compare constraints\n changes.push(...compareFieldConstraints(currentField, previousField));\n\n // Compare options\n changes.push(...compareFieldOptions(currentField, previousField));\n\n // Compare relation configurations (if applicable)\n if (currentField.type === \"relation\" && previousField.type === \"relation\") {\n changes.push(...compareRelationConfigurations(currentField, previousField));\n }\n\n return changes;\n}\n\n/**\n * Compares indexes between current and previous collections\n *\n * @param currentIndexes - Current collection indexes\n * @param previousIndexes - Previous collection indexes\n * @returns Object with indexes to add and remove\n */\nfunction compareIndexes(\n currentIndexes: string[] = [],\n previousIndexes: string[] = []\n): { indexesToAdd: string[]; indexesToRemove: string[] } {\n const currentSet = new Set(currentIndexes);\n const previousSet = new Set(previousIndexes);\n\n const indexesToAdd = currentIndexes.filter((idx) => !previousSet.has(idx));\n const indexesToRemove = previousIndexes.filter((idx) => !currentSet.has(idx));\n\n return { indexesToAdd, indexesToRemove };\n}\n\n/**\n * Compares API rules between current and previous collections\n *\n * @param currentRules - Current collection rules\n * @param previousRules - Previous collection rules\n * @returns Array of rule updates\n */\nfunction compareRules(currentRules: CollectionSchema[\"rules\"], previousRules: CollectionSchema[\"rules\"]): RuleUpdate[] {\n const updates: RuleUpdate[] = [];\n\n const ruleTypes: Array<keyof NonNullable<CollectionSchema[\"rules\"]>> = [\n \"listRule\",\n \"viewRule\",\n \"createRule\",\n \"updateRule\",\n \"deleteRule\",\n \"manageRule\",\n ];\n\n for (const ruleType of ruleTypes) {\n const currentValue = currentRules?.[ruleType] ?? null;\n const previousValue = previousRules?.[ruleType] ?? null;\n\n if (currentValue !== previousValue) {\n updates.push({\n ruleType: ruleType as RuleUpdate[\"ruleType\"],\n oldValue: previousValue,\n newValue: currentValue,\n });\n }\n }\n\n return updates;\n}\n\n/**\n * Compares permissions between current and previous collections\n * Detects changes in permission rules defined in schema\n *\n * @param currentPermissions - Current collection permissions\n * @param previousPermissions - Previous collection permissions\n * @returns Array of permission changes\n */\nexport function comparePermissions(\n currentPermissions: CollectionSchema[\"permissions\"],\n previousPermissions: CollectionSchema[\"permissions\"]\n): PermissionChange[] {\n const changes: PermissionChange[] = [];\n\n const ruleTypes: APIRuleType[] = [\"listRule\", \"viewRule\", \"createRule\", \"updateRule\", \"deleteRule\", \"manageRule\"];\n\n for (const ruleType of ruleTypes) {\n const currentValue = currentPermissions?.[ruleType] ?? null;\n const previousValue = previousPermissions?.[ruleType] ?? null;\n\n // Compare permission values\n if (currentValue !== previousValue) {\n changes.push({\n ruleType,\n oldValue: previousValue,\n newValue: currentValue,\n });\n }\n }\n\n return changes;\n}\n\n/**\n * Compares fields between current and previous collections\n * Identifies new, removed, and modified fields\n * For the users collection, filters out system fields from fieldsToAdd\n *\n * @param currentCollection - Current collection schema\n * @param previousCollection - Previous collection schema\n * @param config - Optional configuration\n * @returns Object with field changes\n */\nfunction compareCollectionFields(\n currentCollection: CollectionSchema,\n previousCollection: CollectionSchema,\n config?: DiffEngineConfig\n): {\n fieldsToAdd: FieldDefinition[];\n fieldsToRemove: FieldDefinition[];\n fieldsToModify: FieldModification[];\n} {\n let fieldsToAdd = findNewFields(currentCollection.fields, previousCollection.fields);\n const fieldsToRemove = findRemovedFields(currentCollection.fields, previousCollection.fields);\n const fieldsToModify: FieldModification[] = [];\n\n // For users collection, filter out system fields from fieldsToAdd\n // System fields are automatically provided by PocketBase and should not be in migrations\n if (currentCollection.name === \"users\") {\n const systemFields = getUsersSystemFields(config);\n fieldsToAdd = fieldsToAdd.filter((field) => !systemFields.has(field.name));\n }\n\n // Check for modified fields\n const matchedFields = matchFieldsByName(currentCollection.fields, previousCollection.fields);\n\n for (const [currentField, previousField] of matchedFields) {\n const changes = detectFieldChanges(currentField, previousField);\n\n if (changes.length > 0) {\n fieldsToModify.push({\n fieldName: currentField.name,\n currentDefinition: previousField,\n newDefinition: currentField,\n changes,\n });\n }\n }\n\n return { fieldsToAdd, fieldsToRemove, fieldsToModify };\n}\n\n/**\n * Builds a CollectionModification for a matched collection pair\n *\n * @param currentCollection - Current collection schema\n * @param previousCollection - Previous collection schema\n * @param config - Optional configuration\n * @returns CollectionModification object\n */\nfunction buildCollectionModification(\n currentCollection: CollectionSchema,\n previousCollection: CollectionSchema,\n config?: DiffEngineConfig\n): CollectionModification {\n // Compare fields\n const { fieldsToAdd, fieldsToRemove, fieldsToModify } = compareCollectionFields(\n currentCollection,\n previousCollection,\n config\n );\n\n // Compare indexes\n const { indexesToAdd, indexesToRemove } = compareIndexes(currentCollection.indexes, previousCollection.indexes);\n\n // Compare rules\n const rulesToUpdate = compareRules(currentCollection.rules, previousCollection.rules);\n\n // Compare permissions\n const permissionsToUpdate = comparePermissions(currentCollection.permissions, previousCollection.permissions);\n\n return {\n collection: currentCollection.name,\n fieldsToAdd,\n fieldsToRemove,\n fieldsToModify,\n indexesToAdd,\n indexesToRemove,\n rulesToUpdate,\n permissionsToUpdate,\n };\n}\n\n/**\n * Checks if a collection modification has any actual changes\n *\n * @param modification - Collection modification to check\n * @returns True if there are any changes\n */\nfunction hasChanges(modification: CollectionModification): boolean {\n return (\n modification.fieldsToAdd.length > 0 ||\n modification.fieldsToRemove.length > 0 ||\n modification.fieldsToModify.length > 0 ||\n modification.indexesToAdd.length > 0 ||\n modification.indexesToRemove.length > 0 ||\n modification.rulesToUpdate.length > 0 ||\n modification.permissionsToUpdate.length > 0\n );\n}\n\n/**\n * Aggregates all detected changes into a SchemaDiff\n * Main entry point for diff comparison\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot\n * @param config - Optional configuration\n * @returns Complete SchemaDiff with all changes\n */\nexport function aggregateChanges(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null,\n config?: DiffEngineConfig\n): SchemaDiff {\n // Find new and removed collections\n const collectionsToCreate = findNewCollections(currentSchema, previousSnapshot);\n const collectionsToDelete = findRemovedCollections(currentSchema, previousSnapshot);\n\n // Filter out system collections from create and delete operations\n const filteredCollectionsToCreate = collectionsToCreate.filter(\n (collection) => !isSystemCollection(collection.name, config)\n );\n const filteredCollectionsToDelete = collectionsToDelete.filter(\n (collection) => !isSystemCollection(collection.name, config)\n );\n\n // Find modified collections\n const collectionsToModify: CollectionModification[] = [];\n const matchedCollections = matchCollectionsByName(currentSchema, previousSnapshot);\n\n for (const [currentCollection, previousCollection] of matchedCollections) {\n const modification = buildCollectionModification(currentCollection, previousCollection, config);\n\n // Only include if there are actual changes\n // Note: We allow modifications to the users collection (non-system)\n if (hasChanges(modification)) {\n collectionsToModify.push(modification);\n }\n }\n\n return {\n collectionsToCreate: filteredCollectionsToCreate,\n collectionsToDelete: filteredCollectionsToDelete,\n collectionsToModify,\n };\n}\n\n/**\n * Detects destructive changes in a schema diff\n * Returns detailed information about each destructive change\n *\n * @param diff - Schema diff to analyze\n * @param config - Optional configuration for severity thresholds\n * @returns Array of destructive changes with severity information\n */\nexport function detectDestructiveChanges(diff: SchemaDiff, config?: DiffEngineConfig): DestructiveChange[] {\n const destructiveChanges: DestructiveChange[] = [];\n const mergedConfig = mergeConfig(config);\n\n // Collection deletions are always high severity\n for (const collection of diff.collectionsToDelete) {\n destructiveChanges.push({\n type: \"collection_delete\",\n severity: \"high\",\n collection: collection.name,\n description: `Delete collection: ${collection.name}`,\n });\n }\n\n // Analyze modifications\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n\n // Field deletions are high severity\n for (const field of modification.fieldsToRemove) {\n destructiveChanges.push({\n type: \"field_delete\",\n severity: \"high\",\n collection: collectionName,\n field: field.name,\n description: `Delete field: ${collectionName}.${field.name}`,\n });\n }\n\n // Field modifications can be various severities\n for (const fieldMod of modification.fieldsToModify) {\n const typeChange = fieldMod.changes.find((c) => c.property === \"type\");\n const requiredChange = fieldMod.changes.find((c) => c.property === \"required\" && c.newValue === true);\n\n if (typeChange) {\n destructiveChanges.push({\n type: \"type_change\",\n severity: \"high\",\n collection: collectionName,\n field: fieldMod.fieldName,\n description: `Change field type: ${collectionName}.${fieldMod.fieldName} (${typeChange.oldValue} → ${typeChange.newValue})`,\n oldValue: typeChange.oldValue,\n newValue: typeChange.newValue,\n });\n }\n\n if (requiredChange && mergedConfig.severityThreshold !== \"high\") {\n destructiveChanges.push({\n type: \"required_change\",\n severity: \"medium\",\n collection: collectionName,\n field: fieldMod.fieldName,\n description: `Make field required: ${collectionName}.${fieldMod.fieldName}`,\n oldValue: false,\n newValue: true,\n });\n }\n\n // Other constraint changes at low severity\n if (mergedConfig.severityThreshold === \"low\") {\n const otherChanges = fieldMod.changes.filter((c) => c.property !== \"type\" && c.property !== \"required\");\n for (const change of otherChanges) {\n destructiveChanges.push({\n type: \"constraint_change\",\n severity: \"low\",\n collection: collectionName,\n field: fieldMod.fieldName,\n description: `Change constraint: ${collectionName}.${fieldMod.fieldName}.${change.property}`,\n oldValue: change.oldValue,\n newValue: change.newValue,\n });\n }\n }\n }\n }\n\n return destructiveChanges;\n}\n\n/**\n * Categorizes changes by severity\n * Returns object with destructive and non-destructive changes\n *\n * @param diff - Schema diff to categorize\n * @param config - Optional configuration\n * @returns Object with categorized changes\n */\nexport function categorizeChangesBySeverity(\n diff: SchemaDiff,\n _config?: DiffEngineConfig\n): {\n destructive: string[];\n nonDestructive: string[];\n} {\n const destructive: string[] = [];\n const nonDestructive: string[] = [];\n\n // Collection deletions are destructive\n for (const collection of diff.collectionsToDelete) {\n destructive.push(`Delete collection: ${collection.name}`);\n }\n\n // Collection creations are non-destructive\n for (const collection of diff.collectionsToCreate) {\n nonDestructive.push(`Create collection: ${collection.name}`);\n }\n\n // Analyze modifications\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n\n // Field deletions are destructive\n for (const field of modification.fieldsToRemove) {\n destructive.push(`Delete field: ${collectionName}.${field.name}`);\n }\n\n // Field additions are non-destructive\n for (const field of modification.fieldsToAdd) {\n nonDestructive.push(`Add field: ${collectionName}.${field.name}`);\n }\n\n // Field modifications can be destructive or non-destructive\n for (const fieldMod of modification.fieldsToModify) {\n const hasTypeChange = fieldMod.changes.some((c) => c.property === \"type\");\n const hasRequiredChange = fieldMod.changes.some((c) => c.property === \"required\" && c.newValue === true);\n\n if (hasTypeChange) {\n destructive.push(\n `Change field type: ${collectionName}.${fieldMod.fieldName} (${fieldMod.changes.find((c) => c.property === \"type\")?.oldValue} → ${fieldMod.changes.find((c) => c.property === \"type\")?.newValue})`\n );\n } else if (hasRequiredChange) {\n destructive.push(`Make field required: ${collectionName}.${fieldMod.fieldName}`);\n } else {\n nonDestructive.push(`Modify field: ${collectionName}.${fieldMod.fieldName}`);\n }\n }\n\n // Index changes are generally non-destructive\n for (const _index of modification.indexesToAdd) {\n nonDestructive.push(`Add index: ${collectionName}`);\n }\n\n for (const _index of modification.indexesToRemove) {\n nonDestructive.push(`Remove index: ${collectionName}`);\n }\n\n // Rule changes are non-destructive\n for (const rule of modification.rulesToUpdate) {\n nonDestructive.push(`Update rule: ${collectionName}.${rule.ruleType}`);\n }\n }\n\n return { destructive, nonDestructive };\n}\n\n/**\n * Generates a summary of all changes in a diff\n * Useful for status reporting and user feedback\n *\n * @param diff - Schema diff to summarize\n * @param config - Optional configuration\n * @returns Change summary with counts and details\n */\nexport function generateChangeSummary(diff: SchemaDiff, config?: DiffEngineConfig): ChangeSummary {\n const destructiveChanges = detectDestructiveChanges(diff, config);\n const { nonDestructive } = categorizeChangesBySeverity(diff, config);\n\n let fieldsToAdd = 0;\n let fieldsToRemove = 0;\n let fieldsToModify = 0;\n let indexChanges = 0;\n let ruleChanges = 0;\n let permissionChanges = 0;\n\n for (const modification of diff.collectionsToModify) {\n fieldsToAdd += modification.fieldsToAdd.length;\n fieldsToRemove += modification.fieldsToRemove.length;\n fieldsToModify += modification.fieldsToModify.length;\n indexChanges += modification.indexesToAdd.length + modification.indexesToRemove.length;\n ruleChanges += modification.rulesToUpdate.length;\n permissionChanges += modification.permissionsToUpdate.length;\n }\n\n return {\n totalChanges: diff.collectionsToCreate.length + diff.collectionsToDelete.length + diff.collectionsToModify.length,\n collectionsToCreate: diff.collectionsToCreate.length,\n collectionsToDelete: diff.collectionsToDelete.length,\n collectionsToModify: diff.collectionsToModify.length,\n fieldsToAdd,\n fieldsToRemove,\n fieldsToModify,\n indexChanges,\n ruleChanges,\n permissionChanges,\n destructiveChanges,\n nonDestructiveChanges: nonDestructive,\n };\n}\n\n/**\n * Checks if a diff requires the --force flag based on configuration\n *\n * @param diff - Schema diff to check\n * @param config - Configuration with severity threshold\n * @returns True if force flag is required\n */\nexport function requiresForceFlag(diff: SchemaDiff, config?: DiffEngineConfig): boolean {\n const mergedConfig = mergeConfig(config);\n\n if (!mergedConfig.requireForceForDestructive) {\n return false;\n }\n\n const destructiveChanges = detectDestructiveChanges(diff, config);\n\n // Filter by severity threshold\n const relevantChanges = destructiveChanges.filter((change) => {\n switch (mergedConfig.severityThreshold) {\n case \"high\":\n return change.severity === \"high\";\n case \"medium\":\n return change.severity === \"high\" || change.severity === \"medium\";\n case \"low\":\n return true;\n default:\n return change.severity === \"high\";\n }\n });\n\n return relevantChanges.length > 0;\n}\n\n/**\n * Main comparison function\n * Compares current schema with previous snapshot and returns complete diff\n *\n * @param currentSchema - Current schema definition\n * @param previousSnapshot - Previous schema snapshot (null for first run)\n * @param config - Optional configuration\n * @returns Complete SchemaDiff with all detected changes\n */\nexport function compare(\n currentSchema: SchemaDefinition,\n previousSnapshot: SchemaSnapshot | null,\n config?: DiffEngineConfig\n): SchemaDiff {\n return aggregateChanges(currentSchema, previousSnapshot, config);\n}\n\n/**\n * DiffEngine class for object-oriented usage\n * Provides a stateful interface for schema comparison\n */\nexport class DiffEngine {\n private config: Required<DiffEngineConfig>;\n\n constructor(config?: DiffEngineConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Compares current schema with previous snapshot\n */\n compare(currentSchema: SchemaDefinition, previousSnapshot: SchemaSnapshot | null): SchemaDiff {\n return compare(currentSchema, previousSnapshot, this.config);\n }\n\n /**\n * Detects destructive changes in a diff\n */\n detectDestructiveChanges(diff: SchemaDiff): DestructiveChange[] {\n return detectDestructiveChanges(diff, this.config);\n }\n\n /**\n * Categorizes changes by severity\n */\n categorizeChangesBySeverity(diff: SchemaDiff): { destructive: string[]; nonDestructive: string[] } {\n return categorizeChangesBySeverity(diff, this.config);\n }\n\n /**\n * Generates a summary of changes\n */\n generateChangeSummary(diff: SchemaDiff): ChangeSummary {\n return generateChangeSummary(diff, this.config);\n }\n\n /**\n * Checks if force flag is required\n */\n requiresForceFlag(diff: SchemaDiff): boolean {\n return requiresForceFlag(diff, this.config);\n }\n}\n","/**\n * Migration Generator component\n * Creates PocketBase migration files based on detected differences\n *\n * This module provides a standalone, configurable migration generator that can be used\n * by consumer projects to generate PocketBase-compatible migration files.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { FileSystemError, MigrationGenerationError } from \"./errors\";\nimport type { CollectionSchema, FieldDefinition, FieldModification, SchemaDiff } from \"./types\";\n\n/**\n * Configuration options for the migration generator\n */\nexport interface MigrationGeneratorConfig {\n /**\n * Directory to write migration files\n */\n migrationDir: string;\n\n /**\n * Workspace root for resolving relative paths\n * Defaults to process.cwd()\n */\n workspaceRoot?: string;\n\n /**\n * Custom timestamp generator function\n * Defaults to Unix timestamp in seconds\n */\n timestampGenerator?: () => string;\n\n /**\n * Custom migration file template\n * Use {{UP_CODE}} and {{DOWN_CODE}} placeholders\n */\n template?: string;\n\n /**\n * Whether to include type reference comment\n * Defaults to true\n */\n includeTypeReference?: boolean;\n\n /**\n * Path to types.d.ts file for reference comment\n * Defaults to '../pb_data/types.d.ts'\n */\n typesPath?: string;\n}\n\n/**\n * Default migration template\n */\nconst DEFAULT_TEMPLATE = `/// <reference path=\"{{TYPES_PATH}}\" />\nmigrate((app) => {\n{{UP_CODE}}\n}, (app) => {\n{{DOWN_CODE}}\n});\n`;\n\n/**\n * Default configuration values\n */\nconst DEFAULT_CONFIG: Omit<Required<MigrationGeneratorConfig>, \"migrationDir\"> = {\n workspaceRoot: process.cwd(),\n timestampGenerator: () => Math.floor(Date.now() / 1000).toString(),\n template: DEFAULT_TEMPLATE,\n includeTypeReference: true,\n typesPath: \"../pb_data/types.d.ts\",\n};\n\n/**\n * Merges user config with defaults\n */\nfunction mergeConfig(config: MigrationGeneratorConfig): Required<MigrationGeneratorConfig> {\n return {\n ...DEFAULT_CONFIG,\n ...config,\n };\n}\n\n/**\n * Resolves the migration directory path\n */\nfunction resolveMigrationDir(config: MigrationGeneratorConfig): string {\n const workspaceRoot = config.workspaceRoot || process.cwd();\n\n if (path.isAbsolute(config.migrationDir)) {\n return config.migrationDir;\n }\n\n return path.join(workspaceRoot, config.migrationDir);\n}\n\n/**\n * Generates a timestamp for migration filename\n * Format: Unix timestamp in seconds (e.g., 1687801090)\n *\n * @param config - Optional configuration with custom timestamp generator\n * @returns Timestamp string\n */\nexport function generateTimestamp(config?: MigrationGeneratorConfig): string {\n if (config?.timestampGenerator) {\n return config.timestampGenerator();\n }\n return Math.floor(Date.now() / 1000).toString();\n}\n\n/**\n * Generates a human-readable description from the diff\n * Creates a concise summary of the main changes\n *\n * @param diff - Schema diff containing all changes\n * @returns Description string for filename\n */\nexport function generateMigrationDescription(diff: SchemaDiff): string {\n const parts: string[] = [];\n\n // Summarize collection changes\n if (diff.collectionsToCreate.length > 0) {\n if (diff.collectionsToCreate.length === 1) {\n parts.push(`created_${diff.collectionsToCreate[0].name}`);\n } else {\n parts.push(`created_${diff.collectionsToCreate.length}_collections`);\n }\n }\n\n if (diff.collectionsToDelete.length > 0) {\n if (diff.collectionsToDelete.length === 1) {\n parts.push(`deleted_${diff.collectionsToDelete[0].name}`);\n } else {\n parts.push(`deleted_${diff.collectionsToDelete.length}_collections`);\n }\n }\n\n if (diff.collectionsToModify.length > 0) {\n if (diff.collectionsToModify.length === 1) {\n parts.push(`updated_${diff.collectionsToModify[0].collection}`);\n } else {\n parts.push(`updated_${diff.collectionsToModify.length}_collections`);\n }\n }\n\n // Default description if no changes\n if (parts.length === 0) {\n return \"no_changes\";\n }\n\n // Join parts with underscores and limit length\n let description = parts.join(\"_\");\n\n // Truncate if too long (keep under 100 chars for filename)\n if (description.length > 80) {\n description = description.substring(0, 77) + \"...\";\n }\n\n return description;\n}\n\n/**\n * Generates the migration filename\n * Format: {timestamp}_{description}.js\n *\n * @param diff - Schema diff containing all changes\n * @param config - Optional configuration\n * @returns Migration filename\n */\nexport function generateMigrationFilename(diff: SchemaDiff, config?: MigrationGeneratorConfig): string {\n const timestamp = generateTimestamp(config);\n const description = generateMigrationDescription(diff);\n\n return `${timestamp}_${description}.js`;\n}\n\n/**\n * Creates the migration file structure with up and down functions\n *\n * @param upCode - Code for the up migration\n * @param downCode - Code for the down migration\n * @param config - Optional configuration with custom template\n * @returns Complete migration file content\n */\nexport function createMigrationFileStructure(\n upCode: string,\n downCode: string,\n config?: MigrationGeneratorConfig\n): string {\n const mergedConfig = config ? mergeConfig(config) : DEFAULT_CONFIG;\n let template = mergedConfig.template;\n\n // Replace placeholders\n template = template.replace(\"{{TYPES_PATH}}\", mergedConfig.typesPath);\n template = template.replace(\"{{UP_CODE}}\", upCode);\n template = template.replace(\"{{DOWN_CODE}}\", downCode);\n\n // Remove type reference if disabled\n if (!mergedConfig.includeTypeReference) {\n template = template.replace(/\\/\\/\\/ <reference path=\"[^\"]*\" \\/>\\n?/, \"\");\n }\n\n return template;\n}\n\n/**\n * Writes migration file to the specified directory\n * Creates directory if it doesn't exist\n *\n * @param migrationDir - Directory to write migration file\n * @param filename - Migration filename\n * @param content - Migration file content\n * @returns Full path to the created migration file\n */\nexport function writeMigrationFile(migrationDir: string, filename: string, content: string): string {\n try {\n // Ensure migration directory exists\n if (!fs.existsSync(migrationDir)) {\n try {\n fs.mkdirSync(migrationDir, { recursive: true });\n } catch (error) {\n const fsError = error as NodeJS.ErrnoException;\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied creating migration directory. Check directory permissions.`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n throw new FileSystemError(\n `Failed to create migration directory: ${fsError.message}`,\n migrationDir,\n \"create\",\n fsError.code,\n error as Error\n );\n }\n }\n\n // Full path to migration file\n const filePath = path.join(migrationDir, filename);\n\n // Write migration file\n fs.writeFileSync(filePath, content, \"utf-8\");\n\n return filePath;\n } catch (error) {\n // If it's already a FileSystemError, re-throw it\n if (error instanceof FileSystemError) {\n throw error;\n }\n\n const fsError = error as NodeJS.ErrnoException;\n const filePath = path.join(migrationDir, filename);\n\n if (fsError.code === \"EACCES\" || fsError.code === \"EPERM\") {\n throw new FileSystemError(\n `Permission denied writing migration file. Check file and directory permissions.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n } else if (fsError.code === \"ENOSPC\") {\n throw new FileSystemError(\n `No space left on device when writing migration file.`,\n filePath,\n \"write\",\n fsError.code,\n error as Error\n );\n }\n\n throw new MigrationGenerationError(`Failed to write migration file: ${fsError.message}`, filePath, error as Error);\n }\n}\n\n/**\n * Formats a value for JavaScript code generation\n * Handles strings, numbers, booleans, null, arrays, and objects\n *\n * @param value - Value to format\n * @returns Formatted string representation\n */\nfunction formatValue(value: any): string {\n if (value === null || value === undefined) {\n return \"null\";\n }\n\n if (typeof value === \"string\") {\n // Escape quotes and special characters\n return `\"${value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"').replace(/\\n/g, \"\\\\n\")}\"`;\n }\n\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n\n if (Array.isArray(value)) {\n const items = value.map((v) => formatValue(v)).join(\", \");\n return `[${items}]`;\n }\n\n if (typeof value === \"object\") {\n const entries = Object.entries(value)\n .map(([k, v]) => `${k}: ${formatValue(v)}`)\n .join(\", \");\n return `{ ${entries} }`;\n }\n\n return String(value);\n}\n\n/**\n * Generates field definition object for collection creation\n * Creates the field configuration object used in Collection constructor\n *\n * @param field - Field definition\n * @returns Field definition object as string\n */\nexport function generateFieldDefinitionObject(field: FieldDefinition): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add field type\n parts.push(` type: \"${field.type}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation configuration if present\n if (field.relation) {\n // For relation fields, we need to resolve the collection ID\n // For now, we'll use a placeholder that needs to be resolved at runtime\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\n }\n\n return ` {\\n${parts.join(\",\\n\")},\\n }`;\n}\n\n/**\n * Generates fields array for collection creation\n *\n * @param fields - Array of field definitions\n * @returns Fields array as string\n */\nexport function generateFieldsArray(fields: FieldDefinition[]): string {\n if (fields.length === 0) {\n return \"[]\";\n }\n\n const fieldObjects = fields.map((field) => generateFieldDefinitionObject(field));\n return `[\\n${fieldObjects.join(\",\\n\")},\\n ]`;\n}\n\n/**\n * Generates collection rules object\n *\n * @param rules - Collection rules\n * @returns Rules configuration as string\n */\nexport function generateCollectionRules(rules?: CollectionSchema[\"rules\"]): string {\n if (!rules) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (rules.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(rules.listRule)}`);\n }\n\n if (rules.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(rules.viewRule)}`);\n }\n\n if (rules.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(rules.createRule)}`);\n }\n\n if (rules.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(rules.updateRule)}`);\n }\n\n if (rules.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(rules.deleteRule)}`);\n }\n\n if (rules.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(rules.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates collection permissions object\n * Permissions are the same as rules but extracted from schema metadata\n *\n * @param permissions - Collection permissions\n * @returns Permissions configuration as string\n */\nexport function generateCollectionPermissions(permissions?: CollectionSchema[\"permissions\"]): string {\n if (!permissions) {\n return \"\";\n }\n\n const parts: string[] = [];\n\n if (permissions.listRule !== undefined) {\n parts.push(`listRule: ${formatValue(permissions.listRule)}`);\n }\n\n if (permissions.viewRule !== undefined) {\n parts.push(`viewRule: ${formatValue(permissions.viewRule)}`);\n }\n\n if (permissions.createRule !== undefined) {\n parts.push(`createRule: ${formatValue(permissions.createRule)}`);\n }\n\n if (permissions.updateRule !== undefined) {\n parts.push(`updateRule: ${formatValue(permissions.updateRule)}`);\n }\n\n if (permissions.deleteRule !== undefined) {\n parts.push(`deleteRule: ${formatValue(permissions.deleteRule)}`);\n }\n\n if (permissions.manageRule !== undefined) {\n parts.push(`manageRule: ${formatValue(permissions.manageRule)}`);\n }\n\n return parts.join(\",\\n \");\n}\n\n/**\n * Generates indexes array for collection creation\n *\n * @param indexes - Array of index definitions\n * @returns Indexes array as string\n */\nexport function generateIndexesArray(indexes?: string[]): string {\n if (!indexes || indexes.length === 0) {\n return \"[]\";\n }\n\n const indexStrings = indexes.map((idx) => `\"${idx}\"`);\n return `[\\n ${indexStrings.join(\",\\n \")},\\n ]`;\n}\n\n/**\n * Generates Collection constructor call for creating a new collection\n *\n * @param collection - Collection schema\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @returns JavaScript code for creating the collection\n */\n/**\n * Generates system fields that are required for all PocketBase collections\n * These fields (id, created, updated) must be explicitly included in migrations\n *\n * @returns Array of system field definitions\n */\nfunction getSystemFields(): FieldDefinition[] {\n return [\n // id field - primary key, auto-generated\n {\n name: \"id\",\n type: \"text\",\n required: true,\n options: {\n autogeneratePattern: \"[a-z0-9]{15}\",\n hidden: false,\n id: \"text3208210256\",\n max: 15,\n min: 15,\n pattern: \"^[a-z0-9]+$\",\n presentable: false,\n primaryKey: true,\n system: true,\n },\n },\n // created field - autodate, set on creation\n {\n name: \"created\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate2990389176\",\n onCreate: true,\n onUpdate: false,\n presentable: false,\n system: false,\n },\n },\n // updated field - autodate, set on creation and update\n {\n name: \"updated\",\n type: \"autodate\",\n required: true,\n options: {\n hidden: false,\n id: \"autodate3332085495\",\n onCreate: true,\n onUpdate: true,\n presentable: false,\n system: false,\n },\n },\n ];\n}\n\nexport function generateCollectionCreation(\n collection: CollectionSchema,\n varName: string = \"collection\",\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = new Collection({`);\n lines.push(` name: \"${collection.name}\",`);\n lines.push(` type: \"${collection.type}\",`);\n\n // Add permissions (preferred) or rules\n // Permissions take precedence if both are defined\n const permissionsCode = generateCollectionPermissions(collection.permissions);\n const rulesCode = generateCollectionRules(collection.rules);\n\n if (permissionsCode) {\n lines.push(` ${permissionsCode},`);\n } else if (rulesCode) {\n lines.push(` ${rulesCode},`);\n }\n\n // Prepend system fields (id, created, updated) to user-defined fields\n // These fields are required by PocketBase and must be explicitly included in migrations\n const systemFields = getSystemFields();\n const allFields = [...systemFields, ...collection.fields];\n\n // Add fields\n lines.push(` fields: ${generateFieldsArray(allFields)},`);\n\n // Add indexes\n lines.push(` indexes: ${generateIndexesArray(collection.indexes)},`);\n\n lines.push(` });`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${varName});` : ` app.save(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Gets the appropriate Field constructor name for a field type\n *\n * @param fieldType - PocketBase field type\n * @returns Field constructor name\n */\nfunction getFieldConstructorName(fieldType: string): string {\n const constructorMap: Record<string, string> = {\n text: \"TextField\",\n email: \"EmailField\",\n url: \"URLField\",\n number: \"NumberField\",\n bool: \"BoolField\",\n date: \"DateField\",\n select: \"SelectField\",\n relation: \"RelationField\",\n file: \"FileField\",\n json: \"JSONField\",\n };\n\n return constructorMap[fieldType] || \"TextField\";\n}\n\n/**\n * Generates field constructor options object\n *\n * @param field - Field definition\n * @returns Options object as string\n */\nfunction generateFieldConstructorOptions(field: FieldDefinition): string {\n const parts: string[] = [];\n\n // Add field name\n parts.push(` name: \"${field.name}\"`);\n\n // Add required flag\n parts.push(` required: ${field.required}`);\n\n // Add unique flag if present\n if (field.unique !== undefined) {\n parts.push(` unique: ${field.unique}`);\n }\n\n // Add options if present\n if (field.options && Object.keys(field.options).length > 0) {\n for (const [key, value] of Object.entries(field.options)) {\n parts.push(` ${key}: ${formatValue(value)}`);\n }\n }\n\n // Add relation-specific options\n if (field.relation && field.type === \"relation\") {\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = field.relation.collection.toLowerCase() === \"users\";\n const collectionIdPlaceholder = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${field.relation.collection}\").id`;\n\n parts.push(` collectionId: ${collectionIdPlaceholder}`);\n\n if (field.relation.maxSelect !== undefined) {\n parts.push(` maxSelect: ${field.relation.maxSelect}`);\n }\n\n if (field.relation.minSelect !== undefined) {\n parts.push(` minSelect: ${field.relation.minSelect}`);\n }\n\n if (field.relation.cascadeDelete !== undefined) {\n parts.push(` cascadeDelete: ${field.relation.cascadeDelete}`);\n }\n }\n\n return parts.join(\",\\n\");\n}\n\n/**\n * Generates code for adding a field to an existing collection\n * Uses the appropriate Field constructor based on field type\n *\n * @param collectionName - Name of the collection\n * @param field - Field definition to add\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for adding the field\n */\nexport function generateFieldAddition(\n collectionName: string,\n field: FieldDefinition,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const constructorName = getFieldConstructorName(field.type);\n const collectionVar = varName || `collection_${collectionName}_${field.name}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.add(new ${constructorName}({`);\n lines.push(generateFieldConstructorOptions(field));\n lines.push(` }));`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for modifying an existing field\n * Updates field properties based on detected changes\n *\n * @param collectionName - Name of the collection\n * @param modification - Field modification details\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for modifying the field\n */\nexport function generateFieldModification(\n collectionName: string,\n modification: FieldModification,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${modification.fieldName}`;\n const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${modification.fieldName}\");`);\n lines.push(``);\n\n // Apply each change\n for (const change of modification.changes) {\n if (change.property.startsWith(\"options.\")) {\n // Handle nested options properties\n const optionKey = change.property.replace(\"options.\", \"\");\n // In PocketBase, field properties are set directly on the field, not in an options object\n lines.push(` ${fieldVar}.${optionKey} = ${formatValue(change.newValue)};`);\n } else if (change.property.startsWith(\"relation.\")) {\n // Handle nested relation properties\n const relationKey = change.property.replace(\"relation.\", \"\");\n\n if (relationKey === \"collection\") {\n // Special handling for collection ID\n // Use case-insensitive check for \"users\" to handle both explicit and implicit relation definitions\n const isUsersCollection = String(change.newValue).toLowerCase() === \"users\";\n const collectionIdValue = isUsersCollection\n ? '\"_pb_users_auth_\"'\n : `app.findCollectionByNameOrId(\"${change.newValue}\").id`;\n lines.push(` ${fieldVar}.collectionId = ${collectionIdValue};`);\n } else {\n lines.push(` ${fieldVar}.${relationKey} = ${formatValue(change.newValue)};`);\n }\n } else {\n // Handle top-level properties\n lines.push(` ${fieldVar}.${change.property} = ${formatValue(change.newValue)};`);\n }\n }\n\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a field from a collection\n *\n * @param collectionName - Name of the collection\n * @param fieldName - Name of the field to delete\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the field\n */\nexport function generateFieldDeletion(\n collectionName: string,\n fieldName: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${fieldName}`;\n const fieldVar = `${collectionVar}_field`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${fieldVar} = ${collectionVar}.fields.getByName(\"${fieldName}\");`);\n lines.push(``);\n lines.push(` ${collectionVar}.fields.remove(${fieldVar}.id);`);\n lines.push(``);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for adding an index to a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for adding the index\n */\nfunction generateIndexAddition(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.indexes.push(\"${index}\");`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for removing an index from a collection\n *\n * @param collectionName - Name of the collection\n * @param index - Index SQL statement\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for removing the index\n */\nfunction generateIndexRemoval(\n collectionName: string,\n index: string,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_idx`;\n const indexVar = `${collectionVar}_indexToRemove`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` const ${indexVar} = ${collectionVar}.indexes.findIndex(idx => idx === \"${index}\");`);\n lines.push(` if (${indexVar} !== -1) {`);\n lines.push(` ${collectionVar}.indexes.splice(${indexVar}, 1);`);\n lines.push(` }`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection rules\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of rule to update\n * @param newValue - New rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the rule\n */\nfunction generateRuleUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for updating collection permissions\n * Handles permission rule updates including manageRule for auth collections\n *\n * @param collectionName - Name of the collection\n * @param ruleType - Type of permission rule to update\n * @param newValue - New permission rule value\n * @param varName - Variable name to use for the collection (default: auto-generated)\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for updating the permission\n */\nexport function generatePermissionUpdate(\n collectionName: string,\n ruleType: string,\n newValue: string | null,\n varName?: string,\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n const collectionVar = varName || `collection_${collectionName}_${ruleType}`;\n\n lines.push(` const ${collectionVar} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(` ${collectionVar}.${ruleType} = ${formatValue(newValue)};`);\n lines.push(isLast ? ` return app.save(${collectionVar});` : ` app.save(${collectionVar});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates code for deleting a collection\n *\n * @param collectionName - Name of the collection to delete\n * @param varName - Variable name to use for the collection (default: 'collection')\n * @param isLast - Whether this is the last operation (will return the result)\n * @returns JavaScript code for deleting the collection\n */\nfunction generateCollectionDeletion(\n collectionName: string,\n varName: string = \"collection\",\n isLast: boolean = false\n): string {\n const lines: string[] = [];\n\n lines.push(` const ${varName} = app.findCollectionByNameOrId(\"${collectionName}\");`);\n lines.push(isLast ? ` return app.delete(${varName});` : ` app.delete(${varName});`);\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Generates the up migration function code\n * Applies all changes from the diff in the correct order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for up migration\n */\nexport function generateUpMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // UP MIGRATION`);\n lines.push(``);\n\n // 1. Create new collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Create new collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_create`;\n lines.push(generateCollectionCreation(collection, varName));\n lines.push(``);\n }\n }\n\n // 2. Modify existing collections\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Modify existing collections`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Add new fields\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Add fields to ${collectionName}`);\n for (const field of modification.fieldsToAdd) {\n const varName = `collection_${collectionName}_add_${field.name}`;\n lines.push(generateFieldAddition(collectionName, field, varName));\n lines.push(``);\n }\n }\n\n // Modify existing fields\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Modify fields in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n const varName = `collection_${collectionName}_modify_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, fieldMod, varName));\n lines.push(``);\n }\n }\n\n // Remove fields\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Remove fields from ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_remove_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n\n // Add indexes\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Add indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_addidx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Remove indexes\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_rmidx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Update permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Update permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.newValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Update rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.newValue, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Delete collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_delete`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes detected`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n\n return code;\n}\n\n/**\n * Generates the down migration function code\n * Reverts all changes from the diff in reverse order\n *\n * @param diff - Schema diff containing all changes\n * @returns JavaScript code for down migration\n */\nexport function generateDownMigration(diff: SchemaDiff): string {\n const lines: string[] = [];\n\n // Add comment header\n lines.push(` // DOWN MIGRATION (ROLLBACK)`);\n lines.push(``);\n\n // Reverse order: delete -> modify -> create\n\n // 1. Recreate deleted collections\n if (diff.collectionsToDelete.length > 0) {\n lines.push(` // Recreate deleted collections`);\n for (let i = 0; i < diff.collectionsToDelete.length; i++) {\n const collection = diff.collectionsToDelete[i];\n const varName = `collection_${collection.name}_recreate`;\n lines.push(generateCollectionCreation(collection, varName));\n lines.push(``);\n }\n }\n\n // 2. Revert modifications (in reverse order)\n if (diff.collectionsToModify.length > 0) {\n lines.push(` // Revert modifications`);\n for (const modification of diff.collectionsToModify) {\n const collectionName = modification.collection;\n // Revert permissions (preferred) or rules (fallback)\n if (modification.permissionsToUpdate && modification.permissionsToUpdate.length > 0) {\n lines.push(` // Revert permissions for ${collectionName}`);\n for (const permission of modification.permissionsToUpdate) {\n const varName = `collection_${collectionName}_revert_perm_${permission.ruleType}`;\n lines.push(generatePermissionUpdate(collectionName, permission.ruleType, permission.oldValue, varName));\n lines.push(``);\n }\n } else if (modification.rulesToUpdate.length > 0) {\n lines.push(` // Revert rules for ${collectionName}`);\n for (const rule of modification.rulesToUpdate) {\n const varName = `collection_${collectionName}_revert_rule_${rule.ruleType}`;\n lines.push(generateRuleUpdate(collectionName, rule.ruleType, rule.oldValue, varName));\n lines.push(``);\n }\n }\n\n // Revert index removals (add them back)\n if (modification.indexesToRemove.length > 0) {\n lines.push(` // Restore indexes to ${collectionName}`);\n for (let i = 0; i < modification.indexesToRemove.length; i++) {\n const index = modification.indexesToRemove[i];\n const varName = `collection_${collectionName}_restore_idx_${i}`;\n lines.push(generateIndexAddition(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert index additions (remove them)\n if (modification.indexesToAdd.length > 0) {\n lines.push(` // Remove indexes from ${collectionName}`);\n for (let i = 0; i < modification.indexesToAdd.length; i++) {\n const index = modification.indexesToAdd[i];\n const varName = `collection_${collectionName}_revert_idx_${i}`;\n lines.push(generateIndexRemoval(collectionName, index, varName));\n lines.push(``);\n }\n }\n\n // Revert field removals (add them back)\n if (modification.fieldsToRemove.length > 0) {\n lines.push(` // Restore fields to ${collectionName}`);\n for (const field of modification.fieldsToRemove) {\n const varName = `collection_${collectionName}_restore_${field.name}`;\n lines.push(generateFieldAddition(collectionName, field, varName));\n lines.push(``);\n }\n }\n\n // Revert field modifications\n if (modification.fieldsToModify.length > 0) {\n lines.push(` // Revert field modifications in ${collectionName}`);\n for (const fieldMod of modification.fieldsToModify) {\n // Create a reverse modification\n const reverseChanges = fieldMod.changes.map((change) => ({\n property: change.property,\n oldValue: change.newValue,\n newValue: change.oldValue,\n }));\n\n const reverseMod: FieldModification = {\n fieldName: fieldMod.fieldName,\n currentDefinition: fieldMod.newDefinition,\n newDefinition: fieldMod.currentDefinition,\n changes: reverseChanges,\n };\n\n const varName = `collection_${collectionName}_revert_${fieldMod.fieldName}`;\n lines.push(generateFieldModification(collectionName, reverseMod, varName));\n lines.push(``);\n }\n }\n\n // Revert field additions (remove them)\n if (modification.fieldsToAdd.length > 0) {\n lines.push(` // Remove added fields from ${collectionName}`);\n for (const field of modification.fieldsToAdd) {\n const varName = `collection_${collectionName}_revert_add_${field.name}`;\n lines.push(generateFieldDeletion(collectionName, field.name, varName));\n lines.push(``);\n }\n }\n }\n }\n\n // 3. Delete created collections\n if (diff.collectionsToCreate.length > 0) {\n lines.push(` // Delete created collections`);\n for (let i = 0; i < diff.collectionsToCreate.length; i++) {\n const collection = diff.collectionsToCreate[i];\n const varName = `collection_${collection.name}_rollback`;\n lines.push(generateCollectionDeletion(collection.name, varName));\n lines.push(``);\n }\n }\n\n // If no changes, add a comment\n if (lines.length === 2) {\n lines.push(` // No changes to revert`);\n lines.push(``);\n }\n\n let code = lines.join(\"\\n\");\n\n // Find the last app.save() or app.delete() call and make it return the result\n // Match app.save(...) or app.delete(...) at the end of lines (not in comments or strings)\n const savePattern = /^(\\s*)app\\.save\\((\\w+)\\);$/gm;\n const deletePattern = /^(\\s*)app\\.delete\\((\\w+)\\);$/gm;\n\n const saveMatches = [...code.matchAll(savePattern)];\n const deleteMatches = [...code.matchAll(deletePattern)];\n\n // Combine all matches and find the last one by position\n const allMatches = [\n ...saveMatches.map((m) => ({ match: m, type: \"save\", index: m.index! })),\n ...deleteMatches.map((m) => ({ match: m, type: \"delete\", index: m.index! })),\n ].sort((a, b) => b.index - a.index); // Sort descending to get last match first\n\n if (allMatches.length > 0) {\n const lastMatch = allMatches[0];\n if (lastMatch.type === \"save\") {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.save(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n } else {\n code =\n code.substring(0, lastMatch.match.index!) +\n lastMatch.match[1] +\n \"return app.delete(\" +\n lastMatch.match[2] +\n \");\" +\n code.substring(lastMatch.match.index! + lastMatch.match[0].length);\n }\n }\n\n return code;\n}\n\n/**\n * Main generation function\n * Generates complete migration file from schema diff\n *\n * @param diff - Schema diff containing all changes\n * @param config - Migration generator configuration\n * @returns Path to the generated migration file\n */\nexport function generate(diff: SchemaDiff, config: MigrationGeneratorConfig | string): string {\n // Support legacy string-only parameter (migration directory)\n const normalizedConfig: MigrationGeneratorConfig = typeof config === \"string\" ? { migrationDir: config } : config;\n\n try {\n const migrationDir = resolveMigrationDir(normalizedConfig);\n\n // Generate up and down migration code\n const upCode = generateUpMigration(diff);\n const downCode = generateDownMigration(diff);\n\n // Create migration file structure\n const content = createMigrationFileStructure(upCode, downCode, normalizedConfig);\n\n // Generate filename\n const filename = generateMigrationFilename(diff, normalizedConfig);\n\n // Write migration file\n const filePath = writeMigrationFile(migrationDir, filename, content);\n\n return filePath;\n } catch (error) {\n // If it's already a MigrationGenerationError or FileSystemError, re-throw it\n if (error instanceof MigrationGenerationError || error instanceof FileSystemError) {\n throw error;\n }\n\n // Otherwise, wrap it in a MigrationGenerationError\n throw new MigrationGenerationError(\n `Failed to generate migration: ${error instanceof Error ? error.message : String(error)}`,\n normalizedConfig.migrationDir,\n error as Error\n );\n }\n}\n\n/**\n * MigrationGenerator class for object-oriented usage\n * Provides a stateful interface for migration generation\n */\nexport class MigrationGenerator {\n private config: Required<MigrationGeneratorConfig>;\n\n constructor(config: MigrationGeneratorConfig) {\n this.config = mergeConfig(config);\n }\n\n /**\n * Generates a migration file from a schema diff\n */\n generate(diff: SchemaDiff): string {\n return generate(diff, this.config);\n }\n\n /**\n * Generates the up migration code without writing to file\n */\n generateUpMigration(diff: SchemaDiff): string {\n return generateUpMigration(diff);\n }\n\n /**\n * Generates the down migration code without writing to file\n */\n generateDownMigration(diff: SchemaDiff): string {\n return generateDownMigration(diff);\n }\n\n /**\n * Generates a migration filename\n */\n generateMigrationFilename(diff: SchemaDiff): string {\n return generateMigrationFilename(diff, this.config);\n }\n}\n"]}