pocketbase-zod-schema 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +329 -99
  3. package/dist/cli/index.cjs +176 -55
  4. package/dist/cli/index.cjs.map +1 -1
  5. package/dist/cli/index.js +176 -55
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/cli/migrate.cjs +196 -58
  8. package/dist/cli/migrate.cjs.map +1 -1
  9. package/dist/cli/migrate.js +194 -57
  10. package/dist/cli/migrate.js.map +1 -1
  11. package/dist/cli/utils/index.cjs +1 -1
  12. package/dist/cli/utils/index.cjs.map +1 -1
  13. package/dist/cli/utils/index.js +1 -1
  14. package/dist/cli/utils/index.js.map +1 -1
  15. package/dist/index.cjs +197 -96
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +3 -3
  18. package/dist/index.d.ts +3 -3
  19. package/dist/index.js +197 -95
  20. package/dist/index.js.map +1 -1
  21. package/dist/migration/analyzer.cjs +101 -28
  22. package/dist/migration/analyzer.cjs.map +1 -1
  23. package/dist/migration/analyzer.js +101 -28
  24. package/dist/migration/analyzer.js.map +1 -1
  25. package/dist/migration/generator.cjs +60 -25
  26. package/dist/migration/generator.cjs.map +1 -1
  27. package/dist/migration/generator.d.cts +9 -5
  28. package/dist/migration/generator.d.ts +9 -5
  29. package/dist/migration/generator.js +60 -25
  30. package/dist/migration/generator.js.map +1 -1
  31. package/dist/migration/index.cjs +162 -53
  32. package/dist/migration/index.cjs.map +1 -1
  33. package/dist/migration/index.js +162 -53
  34. package/dist/migration/index.js.map +1 -1
  35. package/dist/migration/snapshot.cjs +1 -0
  36. package/dist/migration/snapshot.cjs.map +1 -1
  37. package/dist/migration/snapshot.js +1 -0
  38. package/dist/migration/snapshot.js.map +1 -1
  39. package/dist/migration/utils/index.cjs +19 -17
  40. package/dist/migration/utils/index.cjs.map +1 -1
  41. package/dist/migration/utils/index.d.cts +3 -1
  42. package/dist/migration/utils/index.d.ts +3 -1
  43. package/dist/migration/utils/index.js +19 -17
  44. package/dist/migration/utils/index.js.map +1 -1
  45. package/dist/mutator.cjs +9 -11
  46. package/dist/mutator.cjs.map +1 -1
  47. package/dist/mutator.d.cts +5 -9
  48. package/dist/mutator.d.ts +5 -9
  49. package/dist/mutator.js +9 -11
  50. package/dist/mutator.js.map +1 -1
  51. package/dist/schema.cjs +50 -53
  52. package/dist/schema.cjs.map +1 -1
  53. package/dist/schema.d.cts +94 -12
  54. package/dist/schema.d.ts +94 -12
  55. package/dist/schema.js +50 -52
  56. package/dist/schema.js.map +1 -1
  57. package/dist/types.d.cts +2 -5
  58. package/dist/types.d.ts +2 -5
  59. package/dist/user-C39DQ40N.d.cts +53 -0
  60. package/dist/user-C39DQ40N.d.ts +53 -0
  61. package/package.json +2 -3
  62. package/dist/user-jS1aYoeD.d.cts +0 -123
  63. package/dist/user-jS1aYoeD.d.ts +0 -123
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/migration/utils/pluralize.ts","../../../src/migration/utils/relation-detector.ts","../../../src/migration/utils/type-mapper.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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 */\nexport function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number | undefined {\n if (!isMultipleRelationField(fieldName, zodType)) {\n return undefined;\n }\n\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 return undefined;\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"]}
1
+ {"version":3,"sources":["../../../src/migration/utils/pluralize.ts","../../../src/migration/utils/relation-detector.ts","../../../src/migration/utils/type-mapper.ts"],"names":["z"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\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"]}
@@ -65,8 +65,10 @@ declare function isRelationField(fieldName: string, zodType: z.ZodTypeAny): bool
65
65
  declare function getMaxSelect(fieldName: string, zodType: z.ZodTypeAny): number;
66
66
  /**
67
67
  * Gets the minimum number of relations required for a relation field
68
+ * Returns 0 as default for all relation fields (single or multiple)
69
+ * PocketBase always expects minSelect to be defined for relation fields
68
70
  */
69
- declare function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number | undefined;
71
+ declare function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number;
70
72
 
71
73
  /**
72
74
  * Zod to PocketBase type mapping utilities
@@ -65,8 +65,10 @@ declare function isRelationField(fieldName: string, zodType: z.ZodTypeAny): bool
65
65
  declare function getMaxSelect(fieldName: string, zodType: z.ZodTypeAny): number;
66
66
  /**
67
67
  * Gets the minimum number of relations required for a relation field
68
+ * Returns 0 as default for all relation fields (single or multiple)
69
+ * PocketBase always expects minSelect to be defined for relation fields
68
70
  */
69
- declare function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number | undefined;
71
+ declare function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number;
70
72
 
71
73
  /**
72
74
  * Zod to PocketBase type mapping utilities
@@ -222,26 +222,28 @@ function getMaxSelect(fieldName, zodType) {
222
222
  return 1;
223
223
  }
224
224
  function getMinSelect(fieldName, zodType) {
225
- if (!isMultipleRelationField(fieldName, zodType)) {
226
- return void 0;
227
- }
228
- let unwrappedType = zodType;
229
- if (zodType instanceof z.ZodOptional) {
230
- unwrappedType = zodType._def.innerType;
231
- }
232
- if (unwrappedType instanceof z.ZodNullable) {
233
- unwrappedType = unwrappedType._def.innerType;
234
- }
235
- if (unwrappedType instanceof z.ZodDefault) {
236
- unwrappedType = unwrappedType._def.innerType;
225
+ if (isSingleRelationField(fieldName, zodType)) {
226
+ return 0;
237
227
  }
238
- if (unwrappedType instanceof z.ZodArray) {
239
- const arrayDef = unwrappedType._def;
240
- if (arrayDef.minLength) {
241
- return arrayDef.minLength.value;
228
+ if (isMultipleRelationField(fieldName, zodType)) {
229
+ let unwrappedType = zodType;
230
+ if (zodType instanceof z.ZodOptional) {
231
+ unwrappedType = zodType._def.innerType;
232
+ }
233
+ if (unwrappedType instanceof z.ZodNullable) {
234
+ unwrappedType = unwrappedType._def.innerType;
235
+ }
236
+ if (unwrappedType instanceof z.ZodDefault) {
237
+ unwrappedType = unwrappedType._def.innerType;
238
+ }
239
+ if (unwrappedType instanceof z.ZodArray) {
240
+ const arrayDef = unwrappedType._def;
241
+ if (arrayDef.minLength) {
242
+ return arrayDef.minLength.value;
243
+ }
242
244
  }
243
245
  }
244
- return void 0;
246
+ return 0;
245
247
  }
246
248
  var POCKETBASE_FIELD_TYPES = [
247
249
  "text",
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/migration/utils/pluralize.ts","../../../src/migration/utils/relation-detector.ts","../../../src/migration/utils/type-mapper.ts"],"names":["z"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 */\nexport function getMinSelect(fieldName: string, zodType: z.ZodTypeAny): number | undefined {\n if (!isMultipleRelationField(fieldName, zodType)) {\n return undefined;\n }\n\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 return undefined;\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"]}
1
+ {"version":3,"sources":["../../../src/migration/utils/pluralize.ts","../../../src/migration/utils/relation-detector.ts","../../../src/migration/utils/type-mapper.ts"],"names":["z"],"mappings":";;;AAQA,IAAM,aAAA,GAAwC;AAAA;AAAA,EAE5C,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,UAAA;AAAA,EACP,KAAA,EAAO,UAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA;AAAA,EAGP,QAAA,EAAU,YAAA;AAAA,EACV,QAAA,EAAU,YAAA;AAAA,EACV,OAAA,EAAS,WAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,OAAA,EAAS,WAAA;AAAA,EACT,OAAA,EAAS,WAAA;AAAA,EACT,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ,UAAA;AAAA,EACR,MAAA,EAAQ,UAAA;AAAA,EACR,QAAA,EAAU,YAAA;AAAA,EACV,QAAA,EAAU,YAAA;AAAA,EACV,QAAA,EAAU,YAAA;AAAA,EACV,QAAA,EAAU,YAAA;AAAA;AAAA,EAGV,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,IAAA,EAAM,OAAA;AAAA,EACN,KAAA,EAAO,QAAA;AAAA,EACP,KAAA,EAAO,QAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA,EACN,KAAA,EAAO,SAAA;AAAA,EACP,KAAA,EAAO,SAAA;AAAA,EACP,IAAA,EAAM,QAAA;AAAA,EACN,IAAA,EAAM,QAAA;AAAA;AAAA,EAGN,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA;AAAA,EAGR,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,OAAA,EAAS,QAAA;AAAA,EACT,OAAA,EAAS,QAAA;AAAA,EACT,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA;AAAA,EAGR,UAAA,EAAY,WAAA;AAAA,EACZ,UAAA,EAAY,WAAA;AAAA,EACZ,SAAA,EAAW,UAAA;AAAA,EACX,SAAA,EAAW,UAAA;AAAA;AAAA,EAGX,KAAA,EAAO,MAAA;AAAA,EACP,KAAA,EAAO,MAAA;AAAA,EACP,MAAA,EAAQ,OAAA;AAAA,EACR,MAAA,EAAQ,OAAA;AAAA,EACR,UAAA,EAAY,WAAA;AAAA,EACZ,UAAA,EAAY,WAAA;AAAA;AAAA,EAGZ,KAAA,EAAO,OAAA;AAAA,EACP,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ;AACV,CAAA;AASO,SAAS,UAAU,QAAA,EAA0B;AAElD,EAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,EAAG;AAC3B,IAAA,OAAO,cAAc,QAAQ,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,QAAA,CAAS,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,IAAK,CAAC,QAAA,CAAS,QAAA,CAAS,IAAI,CAAA,EAAG;AAE7E,IAAA,OAAO,QAAA;AAAA,EACT;AAGA,EAAA,MAAM,aAAA,GAAgB,SAAS,WAAA,EAAY;AAE3C,EAAA,IAAI,MAAA;AAGJ,EAAA,IAAI,qBAAA,CAAsB,IAAA,CAAK,aAAa,CAAA,EAAG;AAC7C,IAAA,MAAA,GAAS,QAAA,GAAW,IAAA;AAAA,EACtB,CAAA,MAAA,IAES,YAAA,CAAa,IAAA,CAAK,aAAa,CAAA,EAAG;AACzC,IAAA,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,EACnC,CAAA,MAAA,IAES,YAAA,CAAa,IAAA,CAAK,aAAa,CAAA,EAAG;AACzC,IAAA,MAAA,GAAS,QAAA,GAAW,IAAA;AAAA,EACtB,CAAA,MAAA,IAES,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,EAAG;AACnC,IAAA,IAAI,aAAA,CAAc,QAAA,CAAS,IAAI,CAAA,EAAG;AAChC,MAAA,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,IACnC,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AAAA,IACnC;AAAA,EACF,CAAA,MAEK;AACH,IAAA,MAAA,GAAS,QAAA,GAAW,GAAA;AAAA,EACtB;AAEA,EAAA,OAAO,MAAA;AACT;AASO,SAAS,iBAAiB,UAAA,EAA4B;AAC3D,EAAA,OAAO,UAAU,UAAU,CAAA;AAC7B;AASO,SAAS,YAAY,MAAA,EAAwB;AAElD,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,UAAU,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AAClE,IAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,MAAA,OAAO,QAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAO,WAAA,EAAY;AAGjC,EAAA,IAAI,MAAM,QAAA,CAAS,KAAK,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC9C,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,GAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG;AAEzB,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,IAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,4BAAA,CAA6B,IAAA,CAAK,KAAK,CAAA,EAAG;AAC5C,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,MAAM,QAAA,CAAS,GAAG,CAAA,IAAK,MAAA,CAAO,SAAS,CAAA,EAAG;AAC5C,IAAA,OAAO,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EAC3B;AAGA,EAAA,OAAO,MAAA;AACT;AC1MO,SAAS,qBAAA,CAAsB,WAAmB,OAAA,EAAgC;AAEvF,EAAA,IAAI,aAAA,GAAgB,OAAA;AACpB,EAAA,IAAI,OAAA,YAAmB,EAAE,WAAA,EAAa;AACpC,IAAA,aAAA,GAAgB,QAAQ,IAAA,CAAK,SAAA;AAAA,EAC/B;AACA,EAAA,IAAI,aAAA,YAAyB,EAAE,WAAA,EAAa;AAC1C,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AACA,EAAA,IAAI,aAAA,YAAyB,EAAE,UAAA,EAAY;AACzC,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AAGA,EAAA,IAAI,EAAE,aAAA,YAAyB,CAAA,CAAE,SAAA,CAAA,EAAY;AAC3C,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,MAAM,mBAAA,GAAsB,QAAA,CAAS,IAAA,CAAK,SAAS,CAAA;AAGnD,EAAA,MAAM,kBAAA,GAAqB,CAAC,OAAA,EAAS,MAAA,EAAQ,eAAe,SAAA,EAAW,SAAA,EAAW,UAAU,MAAM,CAAA;AAClG,EAAA,MAAM,aAAA,GAAgB,kBAAA,CAAmB,QAAA,CAAS,SAAS,CAAA;AAE3D,EAAA,OAAO,uBAAuB,CAAC,aAAA;AACjC;AAOO,SAAS,uBAAA,CAAwB,WAAmB,OAAA,EAAgC;AAEzF,EAAA,IAAI,aAAA,GAAgB,OAAA;AACpB,EAAA,IAAI,OAAA,YAAmB,EAAE,WAAA,EAAa;AACpC,IAAA,aAAA,GAAgB,QAAQ,IAAA,CAAK,SAAA;AAAA,EAC/B;AACA,EAAA,IAAI,aAAA,YAAyB,EAAE,WAAA,EAAa;AAC1C,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AACA,EAAA,IAAI,aAAA,YAAyB,EAAE,UAAA,EAAY;AACzC,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AAGA,EAAA,IAAI,EAAE,aAAA,YAAyB,CAAA,CAAE,QAAA,CAAA,EAAW;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,cAAc,IAAA,CAAK,IAAA;AACvC,EAAA,IAAI,EAAE,WAAA,YAAuB,CAAA,CAAE,SAAA,CAAA,EAAY;AACzC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA;AAE3C,EAAA,OAAO,YAAA;AACT;AAUO,SAAS,wBAAwB,SAAA,EAA2B;AAQjE,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,KAAA,CAAM,cAAc,CAAA;AAE9C,EAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG;AAEpC,IAAA,OAAO,UAAU,SAAS,CAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAC,CAAA;AAG7C,EAAA,OAAO,UAAU,UAAU,CAAA;AAC7B;AAKO,SAAS,eAAA,CAAgB,WAAmB,OAAA,EAAgC;AACjF,EAAA,OAAO,sBAAsB,SAAA,EAAW,OAAO,CAAA,IAAK,uBAAA,CAAwB,WAAW,OAAO,CAAA;AAChG;AAMO,SAAS,YAAA,CAAa,WAAmB,OAAA,EAA+B;AAC7E,EAAA,IAAI,qBAAA,CAAsB,SAAA,EAAW,OAAO,CAAA,EAAG;AAC7C,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,IAAI,uBAAA,CAAwB,SAAA,EAAW,OAAO,CAAA,EAAG;AAE/C,IAAA,IAAI,aAAA,GAAgB,OAAA;AACpB,IAAA,IAAI,OAAA,YAAmB,EAAE,WAAA,EAAa;AACpC,MAAA,aAAA,GAAgB,QAAQ,IAAA,CAAK,SAAA;AAAA,IAC/B;AACA,IAAA,IAAI,aAAA,YAAyB,EAAE,WAAA,EAAa;AAC1C,MAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,IACrC;AACA,IAAA,IAAI,aAAA,YAAyB,EAAE,UAAA,EAAY;AACzC,MAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,IACrC;AAEA,IAAA,IAAI,aAAA,YAAyB,EAAE,QAAA,EAAU;AAEvC,MAAA,MAAM,WAAW,aAAA,CAAc,IAAA;AAC/B,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,OAAO,SAAS,SAAA,CAAU,KAAA;AAAA,MAC5B;AAEA,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,EACF;AAEA,EAAA,OAAO,CAAA;AACT;AAOO,SAAS,YAAA,CAAa,WAAmB,OAAA,EAA+B;AAE7E,EAAA,IAAI,qBAAA,CAAsB,SAAA,EAAW,OAAO,CAAA,EAAG;AAC7C,IAAA,OAAO,CAAA;AAAA,EACT;AAGA,EAAA,IAAI,uBAAA,CAAwB,SAAA,EAAW,OAAO,CAAA,EAAG;AAE/C,IAAA,IAAI,aAAA,GAAgB,OAAA;AACpB,IAAA,IAAI,OAAA,YAAmB,EAAE,WAAA,EAAa;AACpC,MAAA,aAAA,GAAgB,QAAQ,IAAA,CAAK,SAAA;AAAA,IAC/B;AACA,IAAA,IAAI,aAAA,YAAyB,EAAE,WAAA,EAAa;AAC1C,MAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,IACrC;AACA,IAAA,IAAI,aAAA,YAAyB,EAAE,UAAA,EAAY;AACzC,MAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,IACrC;AAEA,IAAA,IAAI,aAAA,YAAyB,EAAE,QAAA,EAAU;AAEvC,MAAA,MAAM,WAAW,aAAA,CAAc,IAAA;AAC/B,MAAA,IAAI,SAAS,SAAA,EAAW;AACtB,QAAA,OAAO,SAAS,SAAA,CAAU,KAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO,CAAA;AACT;ACnKO,IAAM,sBAAA,GAAyD;AAAA,EACpE,MAAA;AAAA,EACA,OAAA;AAAA,EACA,KAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA,MAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AAAA,EACA;AACF;AAeO,IAAM,eAAA,GAA8D;AAAA,EACzE,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,kBAAA;AAAA,IACb,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa,qCAAA;AAAA,IACb,QAAA,EAAU,CAAC,wBAAwB,CAAA;AAAA,IACnC,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,GAAA,EAAK;AAAA,IACH,IAAA,EAAM,KAAA;AAAA,IACN,WAAA,EAAa,2BAAA;AAAA,IACb,QAAA,EAAU,CAAC,sBAAsB,CAAA;AAAA,IACjC,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,kCAAA;AAAA,IACb,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,eAAA;AAAA,IACb,QAAA,EAAU,CAAC,YAAY,CAAA;AAAA,IACvB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,qBAAA;AAAA,IACb,QAAA,EAAU,CAAC,SAAA,EAAW,gCAAgC,CAAA;AAAA,IACtD,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,2CAAA;AAAA,IACb,QAAA,EAAU,CAAC,WAAW,CAAA;AAAA,IACtB,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,kDAAA;AAAA,IACb,QAAA,EAAU,CAAC,SAAA,EAAW,mBAAmB,CAAA;AAAA,IACzC,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,iCAAA;AAAA,IACb,QAAA,EAAU,CAAC,WAAA,EAAa,qBAAqB,CAAA;AAAA,IAC7C,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,mBAAA;AAAA,IACb,QAAA,EAAU,CAAC,MAAA,EAAQ,gBAAgB,CAAA;AAAA,IACnC,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa,iBAAA;AAAA,IACb,QAAA,EAAU,CAAC,WAAA,EAAa,WAAA,EAAa,UAAU,CAAA;AAAA,IAC/C,gBAAA,EAAkB;AAAA,GACpB;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,UAAA;AAAA,IACN,WAAA,EAAa,mCAAA;AAAA,IACb,QAAA,EAAU,CAAC,wBAAwB,CAAA;AAAA,IACnC,gBAAA,EAAkB;AAAA;AAEtB;AAKO,SAAS,iBAAiB,OAAA,EAA2C;AAC1E,EAAA,MAAM,MAAA,GAAU,OAAA,CAAgB,IAAA,CAAK,MAAA,IAAU,EAAC;AAGhD,EAAA,MAAM,WAAW,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,CAAM,SAAS,OAAO,CAAA;AACnE,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,SAAS,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,CAAM,SAAS,KAAK,CAAA;AAC/D,EAAA,IAAI,MAAA,EAAQ;AACV,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,cAAc,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,CAAM,SAAS,UAAU,CAAA;AACzE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,MAAA;AAAA,EACT;AAGA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,iBAAiB,QAAA,EAA4C;AAC3E,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,kBAAkB,QAAA,EAA6C;AAC7E,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,eAAe,QAAA,EAA+C;AAC5E,EAAA,OAAO,QAAA;AACT;AAMO,SAAS,eAAA,CAAgB,SAA0B,UAAA,EAAyC;AACjG,EAAA,MAAM,WAAA,GAAc,QAAQ,IAAA,CAAK,IAAA;AAGjC,EAAA,IAAI,WAAA,YAAuBA,EAAE,OAAA,EAAS;AACpC,IAAA,MAAM,QAAA,GAAW,YAAY,IAAA,CAAK,QAAA;AAClC,IAAA,IAAI,aAAa,SAAA,IAAc,WAAA,CAAoB,IAAA,EAAM,SAAA,EAAW,SAAS,MAAA,EAAQ;AACnF,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,CAAY,IAAA,EAAM,QAAA,KAAa,SAAA,EAAW;AAC5C,IAAA,MAAM,MAAA,GAAU,WAAA,CAAoB,IAAA,EAAM,MAAA,IAAU,EAAC;AACrD,IAAA,MAAM,iBAAiB,MAAA,CAAO,IAAA;AAAA,MAC5B,CAAC,UAAe,KAAA,CAAM,IAAA,KAAS,gBAAiB,WAAA,CAAoB,IAAA,EAAM,WAAW,IAAA,KAAS;AAAA,KAChG;AACA,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,YAAuBA,EAAE,SAAA,EAAW;AACtC,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,eAAe,QAAA,EAA0C;AACvE,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,iBAAiB,QAAA,EAA+D;AAC9F,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,sBAAA,CAAuB,SAAuB,SAAA,EAAwC;AAEpG,EAAA,IAAI,aAAA,GAAgB,OAAA;AAEpB,EAAA,IAAI,OAAA,YAAmBA,EAAE,WAAA,EAAa;AACpC,IAAA,aAAA,GAAgB,QAAQ,IAAA,CAAK,SAAA;AAAA,EAC/B;AAEA,EAAA,IAAI,aAAA,YAAyBA,EAAE,WAAA,EAAa;AAC1C,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AAEA,EAAA,IAAI,aAAA,YAAyBA,EAAE,UAAA,EAAY;AACzC,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AAGA,EAAA,IAAK,aAAA,CAAsB,IAAA,EAAM,QAAA,KAAa,YAAA,EAAc;AAC1D,IAAA,MAAM,MAAA,GAAU,cAAsB,IAAA,EAAM,MAAA;AAK5C,IAAA,IAAI,MAAA,EAAQ,SAAS,YAAA,EAAc;AAEjC,MAAA,MAAM,cAAA,GAAiB,CAAC,QAAA,EAAU,OAAA,EAAS,QAAQ,YAAA,EAAc,OAAA,EAAS,SAAA,EAAW,UAAA,EAAY,QAAQ,CAAA;AACzG,MAAA,IAAI,cAAA,CAAe,IAAA,CAAK,CAAC,IAAA,KAAS,SAAA,CAAU,aAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA,EAAG;AACzE,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAK,aAAA,CAAsB,IAAA,EAAM,QAAA,KAAa,SAAA,EAAW;AACvD,IAAA,MAAM,MAAA,GAAU,aAAA,CAAsB,IAAA,EAAM,MAAA,IAAU,EAAC;AACvD,IAAA,MAAM,SAAA,GAAa,cAAsB,IAAA,EAAM,SAAA;AAG/C,IAAA,IAAI,SAAA,EAAW,IAAA,KAAS,MAAA,IAAU,MAAA,CAAO,IAAA,CAAK,CAAC,KAAA,KAAe,KAAA,CAAM,IAAA,KAAS,YAAY,CAAA,EAAG;AAC1F,MAAA,OAAO,MAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,YAAyBA,EAAE,SAAA,EAAW;AACxC,IAAA,OAAO,iBAAiB,aAAa,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,aAAA,YAAyBA,EAAE,SAAA,EAAW;AACxC,IAAA,OAAO,iBAA8B,CAAA;AAAA,EACvC;AAEA,EAAA,IAAI,aAAA,YAAyBA,EAAE,UAAA,EAAY;AACzC,IAAA,OAAO,kBAA+B,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,aAAA,YAAyBA,EAAE,OAAA,EAAS;AACtC,IAAA,OAAO,eAA4B,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,aAAA,YAAyBA,EAAE,QAAA,EAAU;AACvC,IAAA,OAAO,eAAA,CAAgB,aAAwB,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,aAAA,YAAyBA,EAAE,OAAA,EAAS;AACtC,IAAA,OAAO,eAA4B,CAAA;AAAA,EACrC;AAEA,EAAA,IAAI,aAAA,YAAyBA,CAAAA,CAAE,SAAA,IAAa,aAAA,YAAyBA,EAAE,SAAA,EAAW;AAChF,IAAA,OAAO,iBAA8B,CAAA;AAAA,EACvC;AAGA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,oBAAoB,OAAA,EAA4C;AAC9E,EAAA,MAAM,UAA+B,EAAC;AAGtC,EAAA,IAAI,aAAA,GAAgB,OAAA;AACpB,EAAA,IAAI,OAAA,YAAmBA,EAAE,WAAA,EAAa;AACpC,IAAA,aAAA,GAAgB,QAAQ,IAAA,CAAK,SAAA;AAAA,EAC/B;AACA,EAAA,IAAI,aAAA,YAAyBA,EAAE,WAAA,EAAa;AAC1C,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AACA,EAAA,IAAI,aAAA,YAAyBA,EAAE,UAAA,EAAY;AACzC,IAAA,aAAA,GAAgB,cAAc,IAAA,CAAK,SAAA;AAAA,EACrC;AAEA,EAAA,MAAM,MAAA,GAAU,aAAA,CAAsB,IAAA,EAAM,MAAA,IAAU,EAAC;AAGvD,EAAA,IAAI,aAAA,YAAyBA,EAAE,SAAA,EAAW;AACxC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,YAAyBA,EAAE,SAAA,EAAW;AACxC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,aAAA,YAAyBA,EAAE,OAAA,EAAS;AACtC,IAAA,OAAA,CAAQ,MAAA,GAAS,cAAc,IAAA,CAAK,MAAA;AAAA,EACtC;AAGA,EAAA,IAAI,aAAA,YAAyBA,EAAE,QAAA,EAAU;AACvC,IAAA,MAAM,WAAA,GAAe,aAAA,CAAsB,IAAA,EAAM,MAAA,IAAU,EAAC;AAC5D,IAAA,KAAA,MAAW,SAAS,WAAA,EAAa;AAC/B,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,YAAY,KAAA,CAAM,KAAA;AAAA,MAC5B;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,YAAY,KAAA,CAAM,KAAA;AAAA,MAC5B;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKO,SAAS,gBAAgB,OAAA,EAAgC;AAE9D,EAAA,IAAI,OAAA,YAAmBA,EAAE,WAAA,EAAa;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,YAAmBA,EAAE,UAAA,EAAY;AACnC,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,OAAA,YAAmBA,EAAE,WAAA,EAAa;AACpC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,IAAA;AACT;AAMO,SAAS,cAAc,OAAA,EAAqC;AACjE,EAAA,IAAI,SAAA,GAAY,OAAA;AAEhB,EAAA,IAAI,SAAA,YAAqBA,EAAE,WAAA,EAAa;AACtC,IAAA,SAAA,GAAY,UAAU,IAAA,CAAK,SAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAA,YAAqBA,EAAE,WAAA,EAAa;AACtC,IAAA,SAAA,GAAY,UAAU,IAAA,CAAK,SAAA;AAAA,EAC7B;AAEA,EAAA,IAAI,SAAA,YAAqBA,EAAE,UAAA,EAAY;AACrC,IAAA,SAAA,GAAY,UAAU,IAAA,CAAK,SAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,gBAAgB,OAAA,EAA4B;AAC1D,EAAA,IAAI,OAAA,YAAmBA,EAAE,UAAA,EAAY;AACnC,IAAA,OAAO,OAAA,CAAQ,KAAK,YAAA,EAAa;AAAA,EACnC;AACA,EAAA,OAAO,MAAA;AACT;AAKO,SAAS,YAAY,OAAA,EAAgC;AAC1D,EAAA,MAAM,SAAA,GAAY,cAAc,OAAO,CAAA;AACvC,EAAA,OAAO,qBAAqBA,CAAAA,CAAE,QAAA;AAChC;AAKO,SAAS,oBAAoB,OAAA,EAA4C;AAC9E,EAAA,MAAM,SAAA,GAAY,cAAc,OAAO,CAAA;AACvC,EAAA,IAAI,SAAA,YAAqBA,EAAE,QAAA,EAAU;AACnC,IAAA,OAAO,UAAU,IAAA,CAAK,IAAA;AAAA,EACxB;AACA,EAAA,OAAO,IAAA;AACT;AAKO,SAAS,eAAe,OAAA,EAAgC;AAC7D,EAAA,MAAM,SAAA,GAAY,cAAc,OAAO,CAAA;AACvC,EAAA,IAAI,EAAE,SAAA,YAAqBA,CAAAA,CAAE,SAAA,CAAA,EAAY;AACvC,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,IAAA,CAAK,KAAA,EAAM;AACnC,EAAA,MAAM,MAAA,GAAS,KAAA,IAAS,KAAA,IAAS,KAAA,CAAM,eAAeA,CAAAA,CAAE,SAAA;AACxD,EAAA,MAAM,MAAA,GAAS,KAAA,IAAS,KAAA,IAAS,KAAA,CAAM,eAAeA,CAAAA,CAAE,SAAA;AAExD,EAAA,OAAO,MAAA,IAAU,MAAA;AACnB;AAqBO,SAAS,iCAAiC,OAAA,EAA8C;AAC7F,EAAA,MAAM,UAAiC,EAAC;AACxC,EAAA,MAAM,SAAA,GAAY,cAAc,OAAO,CAAA;AACvC,EAAA,MAAM,MAAA,GAAU,SAAA,CAAkB,IAAA,EAAM,MAAA,IAAU,EAAC;AAGnD,EAAA,IAAI,SAAA,YAAqBA,EAAE,SAAA,EAAW;AACpC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,OAAA,EAAS;AAC1B,QAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,KAAA,CAAM,MAAA;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,YAAqBA,EAAE,SAAA,EAAW;AACpC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AACA,MAAA,IAAI,KAAA,CAAM,SAAS,KAAA,EAAO;AACxB,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,KAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,YAAqBA,EAAE,OAAA,EAAS;AAClC,IAAA,OAAA,CAAQ,MAAA,GAAS,UAAU,IAAA,CAAK,MAAA;AAAA,EAClC;AAGA,EAAA,IAAI,SAAA,YAAqBA,EAAE,QAAA,EAAU;AACnC,IAAA,MAAM,WAAW,SAAA,CAAU,IAAA;AAC3B,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,SAAA,GAAY,SAAS,SAAA,CAAU,KAAA;AAAA,IACzC;AACA,IAAA,IAAI,SAAS,SAAA,EAAW;AACtB,MAAA,OAAA,CAAQ,SAAA,GAAY,SAAS,SAAA,CAAU,KAAA;AAAA,IACzC;AAGA,IAAA,MAAM,cAAc,QAAA,CAAS,IAAA;AAC7B,IAAA,IAAI,WAAA,YAAuBA,EAAE,OAAA,EAAS;AACpC,MAAA,OAAA,CAAQ,MAAA,GAAS,YAAY,IAAA,CAAK,MAAA;AAAA,IACpC;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAMO,SAAS,cAAc,SAAA,EAA4B;AACxD,EAAA,MAAM,gBAAA,GAAmB;AAAA,IACvB,SAAA;AAAA,IACA,MAAA;AAAA,IACA,aAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,gBAAA,CAAiB,KAAK,CAAC,IAAA,KAAS,UAAU,WAAA,EAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AAC/E;AAMO,SAAS,kBAAkB,SAAA,EAA4B;AAC5D,EAAA,MAAM,cAAA,GAAiB;AAAA,IACrB,QAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,OAAO,cAAA,CAAe,KAAK,CAAC,IAAA,KAAS,UAAU,WAAA,EAAY,CAAE,QAAA,CAAS,IAAI,CAAC,CAAA;AAC7E;AAcO,SAAS,gBAAA,CAAiB,SAAuB,SAAA,EAAoC;AAC1F,EAAA,MAAM,IAAA,GAAO,sBAAA,CAAuB,OAAA,EAAS,SAAS,CAAA;AACtD,EAAA,MAAM,UAAA,GAAa,YAAY,OAAO,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,iCAAiC,OAAO,CAAA;AAExD,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF;AACF","file":"index.js","sourcesContent":["/**\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"]}
package/dist/mutator.cjs CHANGED
@@ -43,21 +43,21 @@ function withIndexes(schema, indexes) {
43
43
  return schema.describe(JSON.stringify(metadata));
44
44
  }
45
45
  var UserInputSchema = zod.z.object({
46
- name: zod.z.string().min(2, "Name must be longer").optional(),
46
+ name: zod.z.string().optional(),
47
47
  email: zod.z.string().email(),
48
48
  password: zod.z.string().min(8, "Password must be at least 8 characters"),
49
49
  passwordConfirm: zod.z.string(),
50
50
  avatar: zod.z.instanceof(File).optional()
51
51
  });
52
52
  var UserDatabaseSchema = zod.z.object({
53
- name: zod.z.string().min(2, "Name must be longer").optional(),
53
+ name: zod.z.string().optional(),
54
54
  email: zod.z.string().email(),
55
55
  password: zod.z.string().min(8, "Password must be at least 8 characters"),
56
56
  avatar: zod.z.instanceof(File).optional()
57
57
  });
58
58
  withIndexes(
59
59
  withPermissions(UserDatabaseSchema.extend(baseSchema), {
60
- // Users can list other users (for mentions, user search, etc.)
60
+ // Users can list their own profile
61
61
  listRule: "id = @request.auth.id",
62
62
  // Users can view their own profile
63
63
  viewRule: "id = @request.auth.id",
@@ -66,15 +66,13 @@ withIndexes(
66
66
  // Users can only update their own profile
67
67
  updateRule: "id = @request.auth.id",
68
68
  // Users can only delete their own account
69
- deleteRule: "id = @request.auth.id",
70
- // Users can only manage their own account (change email, password, etc.)
71
- manageRule: "id = @request.auth.id"
69
+ deleteRule: "id = @request.auth.id"
70
+ // manageRule is null in PocketBase default (not set)
72
71
  }),
73
72
  [
74
- // Email should be unique for authentication
75
- "CREATE UNIQUE INDEX idx_users_email ON users (email)",
76
- // Index on name for user search and sorting
77
- "CREATE INDEX idx_users_name ON users (name)"
73
+ // PocketBase's default indexes for auth collections
74
+ "CREATE UNIQUE INDEX `idx_tokenKey__pb_users_auth_` ON `users` (`tokenKey`)",
75
+ "CREATE UNIQUE INDEX `idx_email__pb_users_auth_` ON `users` (`email`) WHERE `email` != ''"
78
76
  ]
79
77
  );
80
78
  var BaseMutator = class {
@@ -415,7 +413,7 @@ var UserMutator = class extends BaseMutator {
415
413
  };
416
414
  }
417
415
  getCollection() {
418
- return this.pb.collection("Projects");
416
+ return this.pb.collection("Users");
419
417
  }
420
418
  async validateInput(input) {
421
419
  return UserInputSchema.parse(input);