@deessejs/collections 0.0.51 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +204 -0
  3. package/dist/index.js +868 -22
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.mjs +821 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/dist/next/index.js +421 -51
  8. package/dist/next/index.js.map +1 -0
  9. package/dist/next/index.mjs +377 -0
  10. package/dist/next/index.mjs.map +1 -0
  11. package/package.json +76 -72
  12. package/dist/collections/define.d.ts +0 -43
  13. package/dist/collections/define.js +0 -13
  14. package/dist/collections/extend-fields.d.ts +0 -3
  15. package/dist/collections/extend-fields.js +0 -13
  16. package/dist/collections/index.d.ts +0 -1
  17. package/dist/collections/index.js +0 -17
  18. package/dist/collections/types.d.ts +0 -29
  19. package/dist/collections/types.js +0 -2
  20. package/dist/config/index.d.ts +0 -2
  21. package/dist/config/index.js +0 -45
  22. package/dist/config/orchestrator.d.ts +0 -8
  23. package/dist/config/orchestrator.js +0 -70
  24. package/dist/config/types.d.ts +0 -14
  25. package/dist/config/types.js +0 -2
  26. package/dist/database/types.d.ts +0 -10
  27. package/dist/database/types.js +0 -2
  28. package/dist/drizzle/generate.d.ts +0 -2
  29. package/dist/drizzle/generate.js +0 -49
  30. package/dist/drizzle/index.d.ts +0 -31
  31. package/dist/drizzle/index.js +0 -24
  32. package/dist/drizzle/types.js +0 -1
  33. package/dist/dsl/collections.d.ts +0 -13
  34. package/dist/dsl/collections.js +0 -14
  35. package/dist/dsl/index.d.ts +0 -1
  36. package/dist/dsl/index.js +0 -17
  37. package/dist/dsl/types.d.ts +0 -1
  38. package/dist/dsl/types.js +0 -2
  39. package/dist/esm/collections/define.d.ts +0 -43
  40. package/dist/esm/collections/define.js +0 -9
  41. package/dist/esm/collections/extend-fields.d.ts +0 -3
  42. package/dist/esm/collections/extend-fields.js +0 -9
  43. package/dist/esm/collections/index.d.ts +0 -1
  44. package/dist/esm/collections/index.js +0 -1
  45. package/dist/esm/collections/types.d.ts +0 -29
  46. package/dist/esm/collections/types.js +0 -1
  47. package/dist/esm/config/index.d.ts +0 -5
  48. package/dist/esm/config/index.js +0 -13
  49. package/dist/esm/config/orchestrator.d.ts +0 -8
  50. package/dist/esm/config/orchestrator.js +0 -66
  51. package/dist/esm/config/types.d.ts +0 -14
  52. package/dist/esm/config/types.js +0 -1
  53. package/dist/esm/database/types.d.ts +0 -10
  54. package/dist/esm/database/types.js +0 -1
  55. package/dist/esm/drizzle/generate.d.ts +0 -2
  56. package/dist/esm/drizzle/generate.js +0 -30
  57. package/dist/esm/drizzle/index.d.ts +0 -31
  58. package/dist/esm/drizzle/index.js +0 -20
  59. package/dist/esm/drizzle/types.d.ts +0 -0
  60. package/dist/esm/drizzle/types.js +0 -1
  61. package/dist/esm/dsl/collections.d.ts +0 -13
  62. package/dist/esm/dsl/collections.js +0 -10
  63. package/dist/esm/dsl/index.d.ts +0 -1
  64. package/dist/esm/dsl/index.js +0 -1
  65. package/dist/esm/fields/constraints.d.ts +0 -6
  66. package/dist/esm/fields/constraints.js +0 -59
  67. package/dist/esm/fields/core.d.ts +0 -71
  68. package/dist/esm/fields/core.js +0 -27
  69. package/dist/esm/fields/field.d.ts +0 -24
  70. package/dist/esm/fields/field.js +0 -33
  71. package/dist/esm/fields/index.d.ts +0 -4
  72. package/dist/esm/fields/index.js +0 -4
  73. package/dist/esm/fields/types.d.ts +0 -48
  74. package/dist/esm/fields/types.js +0 -1
  75. package/dist/esm/index.d.ts +0 -8
  76. package/dist/esm/index.js +0 -8
  77. package/dist/esm/next/index.d.ts +0 -5
  78. package/dist/esm/next/index.js +0 -17
  79. package/dist/esm/plugins/index.d.ts +0 -2
  80. package/dist/esm/plugins/index.js +0 -3
  81. package/dist/esm/plugins/types.d.ts +0 -1
  82. package/dist/esm/plugins/types.js +0 -1
  83. package/dist/esm/providers/index.d.ts +0 -2
  84. package/dist/esm/providers/index.js +0 -53
  85. package/dist/esm/providers/types.d.ts +0 -8
  86. package/dist/esm/providers/types.js +0 -1
  87. package/dist/esm/utils/deep-partial.d.ts +0 -3
  88. package/dist/esm/utils/deep-partial.js +0 -1
  89. package/dist/esm/utils/exact.d.ts +0 -1
  90. package/dist/esm/utils/exact.js +0 -1
  91. package/dist/esm/utils/union-intersection.d.ts +0 -1
  92. package/dist/esm/utils/union-intersection.js +0 -1
  93. package/dist/esm/worker/index.d.ts +0 -2
  94. package/dist/esm/worker/index.js +0 -32
  95. package/dist/fields/constraints.d.ts +0 -6
  96. package/dist/fields/constraints.js +0 -67
  97. package/dist/fields/core.d.ts +0 -71
  98. package/dist/fields/core.js +0 -33
  99. package/dist/fields/field.d.ts +0 -24
  100. package/dist/fields/field.js +0 -38
  101. package/dist/fields/index.d.ts +0 -4
  102. package/dist/fields/index.js +0 -20
  103. package/dist/fields/types.d.ts +0 -48
  104. package/dist/fields/types.js +0 -2
  105. package/dist/index.d.ts +0 -8
  106. package/dist/next/index.d.ts +0 -5
  107. package/dist/plugins/index.d.ts +0 -2
  108. package/dist/plugins/index.js +0 -7
  109. package/dist/plugins/types.d.ts +0 -1
  110. package/dist/plugins/types.js +0 -2
  111. package/dist/providers/index.d.ts +0 -2
  112. package/dist/providers/index.js +0 -57
  113. package/dist/providers/types.d.ts +0 -8
  114. package/dist/providers/types.js +0 -2
  115. package/dist/utils/deep-partial.d.ts +0 -3
  116. package/dist/utils/deep-partial.js +0 -2
  117. package/dist/utils/exact.d.ts +0 -1
  118. package/dist/utils/exact.js +0 -1
  119. package/dist/utils/union-intersection.d.ts +0 -1
  120. package/dist/utils/union-intersection.js +0 -2
  121. package/dist/worker/index.d.ts +0 -1
  122. package/dist/worker/index.js +0 -101
  123. /package/{dist/drizzle/types.d.ts → public/.gitkeep} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/field-type.ts","../src/field.ts","../src/fields/f.ts","../src/collection.ts","../src/operations/collection-operations.ts","../src/adapter.ts","../src/schema.ts","../src/migrations.ts","../src/config.ts"],"sourcesContent":["// Field type system\r\nexport { fieldType, type FieldTypeInstance, type FieldTypeCreator, type FieldTypeConfig } from './field-type'\r\n\r\n// Field\r\nexport { field, type FieldDefinition, type FieldOptions } from './field'\r\n\r\n// Built-in field types\r\nexport { f } from './fields'\r\nexport * from './fields'\r\n\r\n// Collection\r\nexport { collection, type CollectionConfig, type Collection, type CollectionHooks, type OperationType, type CreateHookContext, type UpdateHookContext, type DeleteHookContext, type ReadHookContext, type OperationHookContext, type CreateHookFunction, type UpdateHookFunction, type DeleteHookFunction, type ReadHookFunction, type GenericHookFunction } from './collection'\r\n\r\n// Operations\r\nexport * from './operations'\r\n\r\n// Adapter\r\nexport { pgAdapter, type PgAdapter, type PgAdapterConfig, type DatabaseAdapter } from './adapter'\r\n\r\n// Schema\r\nexport { buildSchema, buildTable } from './schema'\r\n\r\n// Migrations\r\nexport { push, generate, migrate } from './migrations'\r\n\r\n// Config\r\nexport { defineConfig, type Plugin, type ConfigOptions, type DefineConfigReturn } from './config'\r\n","import { z } from 'zod'\r\n\r\n/**\r\n * A field type instance (already configured)\r\n */\r\nexport type FieldTypeInstance = {\r\n schema: z.ZodType\r\n database: unknown\r\n}\r\n\r\n/**\r\n * A field type creator (needs to be called to get instance)\r\n */\r\nexport type FieldTypeCreator = () => FieldTypeInstance\r\n\r\n/**\r\n * Field type configuration\r\n */\r\nexport type FieldTypeConfig = {\r\n schema: z.ZodType\r\n database?: unknown\r\n}\r\n\r\n/**\r\n * Creates a new field type\r\n *\r\n * @example\r\n * const text = fieldType({\r\n * schema: z.string(),\r\n * database: { type: 'text' }\r\n * })\r\n *\r\n * const textField = text() // Get instance\r\n */\r\nexport const fieldType = (config: FieldTypeConfig): (() => FieldTypeInstance) => {\r\n return () => ({\r\n schema: config.schema,\r\n database: config.database ?? {}\r\n })\r\n}\r\n","import type { FieldTypeInstance } from './field-type'\r\n\r\n/**\r\n * Field configuration options\r\n */\r\nexport type FieldOptions = {\r\n fieldType: FieldTypeInstance\r\n required?: boolean\r\n unique?: boolean\r\n indexed?: boolean\r\n default?: unknown\r\n label?: string\r\n description?: string\r\n}\r\n\r\n/**\r\n * Creates a field definition\r\n *\r\n * @example\r\n * name: field({ fieldType: text() })\r\n * email: field({ fieldType: email(), unique: true })\r\n */\r\nexport const field = (config: FieldOptions): FieldDefinition => {\r\n return {\r\n fieldType: config.fieldType,\r\n required: config.required ?? false,\r\n unique: config.unique ?? false,\r\n indexed: config.indexed ?? false,\r\n default: config.default,\r\n label: config.label,\r\n description: config.description\r\n }\r\n}\r\n\r\n/**\r\n * A field definition\r\n */\r\nexport type FieldDefinition = {\r\n fieldType: FieldTypeInstance\r\n required: boolean\r\n unique: boolean\r\n indexed: boolean\r\n default?: unknown\r\n label?: string\r\n description?: string\r\n}\r\n","import { fieldType, type FieldTypeInstance } from '../field-type'\r\nimport { z } from 'zod'\r\n\r\n/**\r\n * Derive the database type string from a Zod schema\r\n */\r\nconst getItemType = (itemSchema: z.ZodType): string => {\r\n if (itemSchema instanceof z.ZodString) return 'text'\r\n if (itemSchema instanceof z.ZodNumber) return 'integer'\r\n if (itemSchema instanceof z.ZodBoolean) return 'boolean'\r\n if (itemSchema instanceof z.ZodDate) return 'timestamp'\r\n if (itemSchema instanceof z.ZodEnum) return 'text'\r\n if (itemSchema instanceof z.ZodArray) return 'array'\r\n if (itemSchema instanceof z.ZodObject) return 'jsonb'\r\n return 'text'\r\n}\r\n\r\n/**\r\n * Field types namespace (like zod's z)\r\n */\r\nexport const f = {\r\n /**\r\n * Text field type\r\n */\r\n text: (): FieldTypeInstance => fieldType({\r\n schema: z.string(),\r\n database: { type: 'text' }\r\n })(),\r\n\r\n /**\r\n * Email field type with built-in validation\r\n */\r\n email: (): FieldTypeInstance => fieldType({\r\n schema: z.string().email(),\r\n database: { type: 'text' }\r\n })(),\r\n\r\n /**\r\n * URL field type with built-in validation\r\n */\r\n url: (): FieldTypeInstance => fieldType({\r\n schema: z.string().url(),\r\n database: { type: 'text' }\r\n })(),\r\n\r\n /**\r\n * Number field type\r\n */\r\n number: (): FieldTypeInstance => fieldType({\r\n schema: z.number(),\r\n database: { type: 'integer' }\r\n })(),\r\n\r\n /**\r\n * Boolean field type\r\n */\r\n boolean: (): FieldTypeInstance => fieldType({\r\n schema: z.boolean(),\r\n database: { type: 'boolean' }\r\n })(),\r\n\r\n /**\r\n * Date field type (date only, no time)\r\n */\r\n date: (): FieldTypeInstance => fieldType({\r\n schema: z.date(),\r\n database: { type: 'date' }\r\n })(),\r\n\r\n /**\r\n * Timestamp field type (date with time)\r\n */\r\n timestamp: (): FieldTypeInstance => fieldType({\r\n schema: z.date(),\r\n database: { type: 'timestamp' }\r\n })(),\r\n\r\n /**\r\n * Creates a select field type\r\n */\r\n select: <T extends readonly [string, ...string[]]>(\r\n options: T\r\n ): FieldTypeInstance => fieldType({\r\n schema: z.enum(options),\r\n database: { type: 'text' }\r\n })(),\r\n\r\n /**\r\n * JSON field type for storing JSON data\r\n */\r\n json: (schema?: z.ZodType): FieldTypeInstance => fieldType({\r\n schema: schema ?? z.any(),\r\n database: { type: 'jsonb' }\r\n })(),\r\n\r\n /**\r\n * Array field type for storing lists\r\n */\r\n array: (itemSchema: z.ZodType): FieldTypeInstance => fieldType({\r\n schema: z.array(itemSchema),\r\n database: { type: 'array', itemType: getItemType(itemSchema) }\r\n })(),\r\n\r\n /**\r\n * Creates a relation field type for foreign key relationships\r\n */\r\n relation: (options: {\r\n collection: string\r\n singular?: boolean\r\n many?: boolean\r\n through?: string\r\n }): FieldTypeInstance => {\r\n const isMany = options.many ?? false\r\n const isSingular = options.singular ?? false\r\n\r\n return fieldType({\r\n schema: isMany ? z.array(z.string()) : z.string(),\r\n database: {\r\n type: 'integer',\r\n references: options.collection,\r\n through: options.through,\r\n many: isMany,\r\n singular: isSingular\r\n }\r\n })()\r\n }\r\n}\r\n\r\n/**\r\n * @deprecated Use f.text() instead\r\n */\r\nexport const text = f.text\r\n\r\n/**\r\n * @deprecated Use f.email() instead\r\n */\r\nexport const email = f.email\r\n\r\n/**\r\n * @deprecated Use f.url() instead\r\n */\r\nexport const url = f.url\r\n\r\n/**\r\n * @deprecated Use f.number() instead\r\n */\r\nexport const number = f.number\r\n\r\n/**\r\n * @deprecated Use f.boolean() instead\r\n */\r\nexport const boolean = f.boolean\r\n\r\n/**\r\n * @deprecated Use f.date() instead\r\n */\r\nexport const date = f.date\r\n\r\n/**\r\n * @deprecated Use f.timestamp() instead\r\n */\r\nexport const timestamp = f.timestamp\r\n\r\n/**\r\n * @deprecated Use f.select() instead\r\n */\r\nexport const select = f.select\r\n\r\n/**\r\n * @deprecated Use f.json() instead\r\n */\r\nexport const json = f.json\r\n\r\n/**\r\n * @deprecated Use f.array() instead\r\n */\r\nexport const array = f.array\r\n\r\n/**\r\n * @deprecated Use f.relation() instead\r\n */\r\nexport const relation = f.relation\r\n\r\n/**\r\n * @deprecated Use f.relation instead\r\n */\r\nexport type RelationOptions = {\r\n collection: string\r\n singular?: boolean\r\n many?: boolean\r\n through?: string\r\n}\r\n","import type { FieldDefinition } from './field'\r\n\r\n/**\r\n * Collection configuration\r\n */\r\nexport type CollectionConfig<T extends Record<string, unknown> = Record<string, unknown>> = {\r\n slug: string\r\n name?: string\r\n fields: Record<string, FieldDefinition>\r\n hooks?: CollectionHooks\r\n dataType?: T\r\n}\r\n\r\n/**\r\n * Operation types\r\n */\r\nexport type OperationType = 'create' | 'update' | 'delete' | 'read'\r\n\r\n/**\r\n * Hook context base\r\n */\r\nexport type HookContextBase = {\r\n collection: string\r\n operation: OperationType\r\n}\r\n\r\n/**\r\n * Before/After Operation context\r\n */\r\nexport type OperationHookContext = HookContextBase & {\r\n data?: Record<string, unknown>\r\n where?: Record<string, unknown>\r\n result?: unknown\r\n}\r\n\r\n/**\r\n * Before/After Create context\r\n */\r\nexport type CreateHookContext = HookContextBase & {\r\n operation: 'create'\r\n data: Record<string, unknown>\r\n result?: unknown\r\n db?: unknown\r\n}\r\n\r\n/**\r\n * Before/After Update context\r\n */\r\nexport type UpdateHookContext = HookContextBase & {\r\n operation: 'update'\r\n data: Record<string, unknown>\r\n where: Record<string, unknown>\r\n previousData?: Record<string, unknown>\r\n result?: unknown\r\n db?: unknown\r\n}\r\n\r\n/**\r\n * Before/After Delete context\r\n */\r\nexport type DeleteHookContext = HookContextBase & {\r\n operation: 'delete'\r\n where: Record<string, unknown>\r\n previousData?: Record<string, unknown>\r\n result?: unknown\r\n db?: unknown\r\n}\r\n\r\n/**\r\n * Before/After Read context\r\n */\r\nexport type ReadHookContext = HookContextBase & {\r\n operation: 'read'\r\n query?: Record<string, unknown>\r\n result?: unknown[]\r\n db?: unknown\r\n}\r\n\r\n/**\r\n * Generic hook function type\r\n */\r\nexport type GenericHookFunction = (context: OperationHookContext) => Promise<void> | void\r\nexport type CreateHookFunction = (context: CreateHookContext) => Promise<void> | void\r\nexport type UpdateHookFunction = (context: UpdateHookContext) => Promise<void> | void\r\nexport type DeleteHookFunction = (context: DeleteHookContext) => Promise<void> | void\r\nexport type ReadHookFunction = (context: ReadHookContext) => Promise<void> | void\r\n\r\n/**\r\n * Collection hooks\r\n */\r\nexport type CollectionHooks = {\r\n beforeOperation?: GenericHookFunction[]\r\n afterOperation?: GenericHookFunction[]\r\n beforeCreate?: CreateHookFunction[]\r\n afterCreate?: CreateHookFunction[]\r\n beforeUpdate?: UpdateHookFunction[]\r\n afterUpdate?: UpdateHookFunction[]\r\n beforeDelete?: DeleteHookFunction[]\r\n afterDelete?: DeleteHookFunction[]\r\n beforeRead?: ReadHookFunction[]\r\n afterRead?: ReadHookFunction[]\r\n}\r\n\r\n/**\r\n * A collection definition\r\n */\r\nexport type Collection<T extends Record<string, unknown> = Record<string, unknown>> = {\r\n slug: string\r\n name?: string\r\n fields: Record<string, FieldDefinition>\r\n hooks?: CollectionHooks\r\n dataType?: T\r\n}\r\n\r\n/**\r\n * Creates a new collection\r\n *\r\n * @example\r\n * export const users = collection({\r\n * slug: 'users',\r\n * name: 'Users',\r\n * fields: {\r\n * name: field({ fieldType: text }),\r\n * email: field({ fieldType: email, unique: true })\r\n * }\r\n * })\r\n */\r\nexport const collection = <T extends Record<string, unknown> = Record<string, unknown>>(\r\n config: CollectionConfig<T>\r\n): Collection<T> => {\r\n return {\r\n slug: config.slug,\r\n name: config.name,\r\n fields: config.fields,\r\n hooks: config.hooks,\r\n dataType: config.dataType\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { eq, and, like, gt, gte, lt, lte, isNull, inArray, not, desc, asc } from 'drizzle-orm'\r\n\r\nimport type { Collection, CollectionHooks, CreateHookContext, UpdateHookContext, DeleteHookContext, ReadHookContext, OperationHookContext } from '../collection'\r\nimport type {\r\n FindManyOptions,\r\n FindUniqueOptions,\r\n FindFirstOptions,\r\n CreateOptions,\r\n CreateManyOptions,\r\n UpdateOptions,\r\n UpdateManyOptions,\r\n DeleteOptions,\r\n DeleteManyOptions,\r\n CountOptions,\r\n ExistsOptions,\r\n WhereOperator\r\n} from './types'\r\n\r\n/**\r\n * Collection operations interface\r\n */\r\nexport interface CollectionOperations {\r\n findMany<T>(options?: FindManyOptions): Promise<T[]>\r\n findUnique<T>(options: FindUniqueOptions): Promise<T | undefined>\r\n findFirst<T>(options: FindFirstOptions): Promise<T | undefined>\r\n create<T>(options: CreateOptions<T>): Promise<T | undefined>\r\n createMany<T>(options: CreateManyOptions<T>): Promise<number>\r\n update<T>(options: UpdateOptions<T>): Promise<T | undefined>\r\n updateMany<T>(options: UpdateManyOptions<T>): Promise<number>\r\n delete<T>(options: DeleteOptions): Promise<T | undefined>\r\n deleteMany(options: DeleteManyOptions): Promise<number>\r\n count(options?: CountOptions): Promise<number>\r\n exists(options: ExistsOptions): Promise<boolean>\r\n}\r\n\r\n/**\r\n * Build where conditions from options\r\n */\r\nconst buildWhereClause = (\r\n tableColumns: Record<string, any>,\r\n where?: Record<string, unknown>\r\n): any => {\r\n if (!where) return undefined\r\n\r\n const conditions: any[] = []\r\n\r\n for (const [key, value] of Object.entries(where)) {\r\n const column = tableColumns[key]\r\n if (!column) continue\r\n\r\n if (value === null || typeof value !== 'object') {\r\n conditions.push(eq(column, value))\r\n } else {\r\n const operator = value as WhereOperator<unknown>\r\n if ('eq' in operator) {\r\n conditions.push(eq(column, operator.eq))\r\n } else if ('neq' in operator) {\r\n conditions.push(not(eq(column, operator.neq)))\r\n } else if ('gt' in operator) {\r\n conditions.push(gt(column, operator.gt as number))\r\n } else if ('gte' in operator) {\r\n conditions.push(gte(column, operator.gte as number))\r\n } else if ('lt' in operator) {\r\n conditions.push(lt(column, operator.lt as number))\r\n } else if ('lte' in operator) {\r\n conditions.push(lte(column, operator.lte as number))\r\n } else if ('in' in operator) {\r\n conditions.push(inArray(column, operator.in))\r\n } else if ('notIn' in operator) {\r\n conditions.push(not(inArray(column, operator.notIn)))\r\n } else if ('contains' in operator) {\r\n conditions.push(like(column, `%${operator.contains}%`))\r\n } else if ('startsWith' in operator) {\r\n conditions.push(like(column, `${operator.startsWith}%`))\r\n } else if ('endsWith' in operator) {\r\n conditions.push(like(column, `%${operator.endsWith}`))\r\n } else if ('isNull' in operator) {\r\n if (operator.isNull) {\r\n conditions.push(isNull(column))\r\n }\r\n } else if ('not' in operator) {\r\n conditions.push(not(eq(column, operator.not)))\r\n }\r\n }\r\n }\r\n\r\n if (conditions.length === 0) return undefined\r\n if (conditions.length === 1) return conditions[0]\r\n return and(...conditions)\r\n}\r\n\r\n/**\r\n * Build orderBy from options\r\n */\r\nconst buildOrderBy = (\r\n tableColumns: Record<string, any>,\r\n orderBy?: Record<string, unknown> | Record<string, unknown>[]\r\n): any[] => {\r\n if (!orderBy) return []\r\n\r\n const orders = Array.isArray(orderBy) ? orderBy : [orderBy]\r\n return orders.map((order) => {\r\n for (const [key, direction] of Object.entries(order)) {\r\n const column = tableColumns[key]\r\n if (!column) continue\r\n return direction === 'desc' ? desc(column) : asc(column)\r\n }\r\n return undefined\r\n }).filter(Boolean)\r\n}\r\n\r\n/**\r\n * Execute before operation hooks\r\n */\r\nconst executeBeforeOperationHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: OperationHookContext\r\n): Promise<void> => {\r\n if (!hooks?.beforeOperation) return\r\n for (const hook of hooks.beforeOperation) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute after operation hooks\r\n */\r\nconst executeAfterOperationHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: OperationHookContext\r\n): Promise<void> => {\r\n if (!hooks?.afterOperation) return\r\n for (const hook of hooks.afterOperation) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute before create hooks\r\n */\r\nconst executeBeforeCreateHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: CreateHookContext\r\n): Promise<void> => {\r\n if (!hooks?.beforeCreate) return\r\n for (const hook of hooks.beforeCreate) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute after create hooks\r\n */\r\nconst executeAfterCreateHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: CreateHookContext\r\n): Promise<void> => {\r\n if (!hooks?.afterCreate) return\r\n for (const hook of hooks.afterCreate) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute before update hooks\r\n */\r\nconst executeBeforeUpdateHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: UpdateHookContext\r\n): Promise<void> => {\r\n if (!hooks?.beforeUpdate) return\r\n for (const hook of hooks.beforeUpdate) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute after update hooks\r\n */\r\nconst executeAfterUpdateHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: UpdateHookContext\r\n): Promise<void> => {\r\n if (!hooks?.afterUpdate) return\r\n for (const hook of hooks.afterUpdate) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute before delete hooks\r\n */\r\nconst executeBeforeDeleteHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: DeleteHookContext\r\n): Promise<void> => {\r\n if (!hooks?.beforeDelete) return\r\n for (const hook of hooks.beforeDelete) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute after delete hooks\r\n */\r\nconst executeAfterDeleteHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: DeleteHookContext\r\n): Promise<void> => {\r\n if (!hooks?.afterDelete) return\r\n for (const hook of hooks.afterDelete) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute before read hooks\r\n */\r\nconst executeBeforeReadHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: ReadHookContext\r\n): Promise<void> => {\r\n if (!hooks?.beforeRead) return\r\n for (const hook of hooks.beforeRead) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Execute after read hooks\r\n */\r\nconst executeAfterReadHooks = async (\r\n hooks: CollectionHooks | undefined,\r\n context: ReadHookContext\r\n): Promise<void> => {\r\n if (!hooks?.afterRead) return\r\n for (const hook of hooks.afterRead) {\r\n await hook(context)\r\n }\r\n}\r\n\r\n/**\r\n * Creates collection operations with Drizzle\r\n */\r\nexport const createCollectionOperations = (\r\n _collection: Collection,\r\n _slug: string,\r\n _db: any,\r\n _table: any,\r\n _hooks?: CollectionHooks\r\n): CollectionOperations => {\r\n const tableColumns = _table as Record<string, any>\r\n const db = _db as any\r\n const hooks = _hooks as CollectionHooks | undefined\r\n\r\n // If no db instance, return placeholder operations\r\n if (!db) {\r\n return {\r\n findMany: async <T>(): Promise<T[]> => [],\r\n findUnique: async <T>(): Promise<T | undefined> => undefined,\r\n findFirst: async <T>(): Promise<T | undefined> => undefined,\r\n create: async <T>(): Promise<T | undefined> => undefined,\r\n createMany: async (): Promise<number> => 0,\r\n update: async <T>(): Promise<T | undefined> => undefined,\r\n updateMany: async (): Promise<number> => 0,\r\n delete: async <T>(): Promise<T | undefined> => undefined,\r\n deleteMany: async (): Promise<number> => 0,\r\n count: async (): Promise<number> => 0,\r\n exists: async (): Promise<boolean> => false\r\n }\r\n }\r\n\r\n return {\r\n findMany: async <T>(options?: FindManyOptions): Promise<T[]> => {\r\n const whereClause = buildWhereClause(tableColumns, options?.where)\r\n const orderByClause = buildOrderBy(tableColumns, options?.orderBy)\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options?.where\r\n })\r\n\r\n // Execute before read hooks\r\n await executeBeforeReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n db\r\n })\r\n\r\n let query = db.select().from(_table)\r\n\r\n if (whereClause) {\r\n query = query.where(whereClause)\r\n }\r\n\r\n if (orderByClause.length > 0) {\r\n query = query.orderBy(...orderByClause)\r\n }\r\n\r\n if (options?.offset) {\r\n query = query.offset(options.offset)\r\n }\r\n\r\n if (options?.limit) {\r\n query = query.limit(options.limit)\r\n }\r\n\r\n const result = await query\r\n\r\n // Execute after read hooks\r\n await executeAfterReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n result: result as unknown[],\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options?.where,\r\n result\r\n })\r\n\r\n return result as T[]\r\n },\r\n\r\n findUnique: async <T>(options: FindUniqueOptions): Promise<T | undefined> => {\r\n const whereClause = buildWhereClause(tableColumns, options.where)\r\n if (!whereClause) return undefined\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options.where\r\n })\r\n\r\n // Execute before read hooks\r\n await executeBeforeReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n db\r\n })\r\n\r\n const result = await db.select().from(_table).where(whereClause).limit(1)\r\n const returnValue = result[0] as T | undefined\r\n\r\n // Execute after read hooks\r\n await executeAfterReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n result: returnValue ? [returnValue] : [],\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options.where,\r\n result: returnValue\r\n })\r\n\r\n return returnValue\r\n },\r\n\r\n findFirst: async <T>(options: FindFirstOptions): Promise<T | undefined> => {\r\n const whereClause = buildWhereClause(tableColumns, options.where)\r\n const orderByClause = buildOrderBy(tableColumns, options.orderBy)\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options.where\r\n })\r\n\r\n // Execute before read hooks\r\n await executeBeforeReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n db\r\n })\r\n\r\n let query = db.select().from(_table)\r\n\r\n if (whereClause) {\r\n query = query.where(whereClause)\r\n }\r\n\r\n if (orderByClause.length > 0) {\r\n query = query.orderBy(...orderByClause)\r\n }\r\n\r\n const result = await query.limit(1)\r\n const returnValue = result[0] as T | undefined\r\n\r\n // Execute after read hooks\r\n await executeAfterReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n result: returnValue ? [returnValue] : [],\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options.where,\r\n result: returnValue\r\n })\r\n\r\n return returnValue\r\n },\r\n\r\n create: async <T>(options: CreateOptions<T>): Promise<T | undefined> => {\r\n const data = Array.isArray(options.data) ? options.data : [options.data]\r\n const firstData = data[0] as Record<string, unknown>\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: firstData,\r\n where: undefined\r\n })\r\n\r\n // Execute before create hooks\r\n await executeBeforeCreateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: firstData,\r\n db\r\n })\r\n\r\n const result = await db.insert(_table).values(data).returning()\r\n\r\n const returnValue = options.returning ? result[0] as T : undefined\r\n\r\n // Execute after create hooks\r\n await executeAfterCreateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: firstData,\r\n result: returnValue,\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: firstData,\r\n result: returnValue\r\n })\r\n\r\n return returnValue\r\n },\r\n\r\n createMany: async <T>(options: CreateManyOptions<T>): Promise<number> => {\r\n const dataArray = Array.isArray(options.data) ? options.data : [options.data]\r\n\r\n // Execute before operation hooks for each item\r\n for (const data of dataArray) {\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: data as Record<string, unknown>,\r\n where: undefined\r\n })\r\n\r\n await executeBeforeCreateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: data as Record<string, unknown>,\r\n db\r\n })\r\n }\r\n\r\n const result = await db.insert(_table).values(options.data as any)\r\n\r\n // Execute after operation hooks for each item\r\n for (let i = 0; i < dataArray.length; i++) {\r\n await executeAfterCreateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: dataArray[i] as Record<string, unknown>,\r\n result: result[i],\r\n db\r\n })\r\n\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'create',\r\n data: dataArray[i] as Record<string, unknown>,\r\n result: result[i]\r\n })\r\n }\r\n\r\n return result.length || 0\r\n },\r\n\r\n update: async <T>(options: UpdateOptions<T>): Promise<T | undefined> => {\r\n const whereClause = buildWhereClause(tableColumns, options.where)\r\n if (!whereClause) return undefined\r\n\r\n // Get previous data for hooks\r\n const previousResult = await db.select().from(_table).where(whereClause).limit(1)\r\n const previousData = previousResult[0] as Record<string, unknown> | undefined\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where\r\n })\r\n\r\n // Execute before update hooks\r\n await executeBeforeUpdateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where,\r\n previousData,\r\n db\r\n })\r\n\r\n const result = await db.update(_table)\r\n .set(options.data as any)\r\n .where(whereClause)\r\n .returning()\r\n\r\n const returnValue = options.returning ? result[0] as T : undefined\r\n\r\n // Execute after update hooks\r\n await executeAfterUpdateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where,\r\n previousData,\r\n result: returnValue,\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where,\r\n result: returnValue\r\n })\r\n\r\n return returnValue\r\n },\r\n\r\n updateMany: async <T>(options: UpdateManyOptions<T>): Promise<number> => {\r\n const whereClause = buildWhereClause(tableColumns, options.where)\r\n if (!whereClause) return 0\r\n\r\n // Get previous data for hooks\r\n const previousResults = await db.select().from(_table).where(whereClause)\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where\r\n })\r\n\r\n // Execute before update hooks (for each previous record)\r\n for (const previousData of previousResults) {\r\n await executeBeforeUpdateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where,\r\n previousData: previousData as Record<string, unknown>,\r\n db\r\n })\r\n }\r\n\r\n const result = await db.update(_table)\r\n .set(options.data as any)\r\n .where(whereClause)\r\n\r\n // Execute after update hooks\r\n for (const previousData of previousResults) {\r\n await executeAfterUpdateHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where,\r\n previousData: previousData as Record<string, unknown>,\r\n db\r\n })\r\n }\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'update',\r\n data: options.data as Record<string, unknown>,\r\n where: options.where\r\n })\r\n\r\n return result.length || 0\r\n },\r\n\r\n delete: async <T>(options: DeleteOptions): Promise<T | undefined> => {\r\n const whereClause = buildWhereClause(tableColumns, options.where)\r\n if (!whereClause) return undefined\r\n\r\n // Get previous data for hooks\r\n const previousResult = await db.select().from(_table).where(whereClause).limit(1)\r\n const previousData = previousResult[0] as Record<string, unknown> | undefined\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where\r\n })\r\n\r\n // Execute before delete hooks\r\n await executeBeforeDeleteHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where,\r\n previousData,\r\n db\r\n })\r\n\r\n const result = await db.delete(_table)\r\n .where(whereClause)\r\n .returning()\r\n\r\n const returnValue = options.returning ? result[0] as T : undefined\r\n\r\n // Execute after delete hooks\r\n await executeAfterDeleteHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where,\r\n previousData,\r\n result: returnValue,\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where,\r\n result: returnValue\r\n })\r\n\r\n return returnValue\r\n },\r\n\r\n deleteMany: async (options: DeleteManyOptions): Promise<number> => {\r\n const whereClause = buildWhereClause(tableColumns, options.where)\r\n if (!whereClause) return 0\r\n\r\n // Get previous data for hooks\r\n const previousResults = await db.select().from(_table).where(whereClause)\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where\r\n })\r\n\r\n // Execute before delete hooks\r\n for (const previousData of previousResults) {\r\n await executeBeforeDeleteHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where,\r\n previousData: previousData as Record<string, unknown>,\r\n db\r\n })\r\n }\r\n\r\n const result = await db.delete(_table).where(whereClause)\r\n\r\n // Execute after delete hooks\r\n for (const previousData of previousResults) {\r\n await executeAfterDeleteHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where,\r\n previousData: previousData as Record<string, unknown>,\r\n db\r\n })\r\n }\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'delete',\r\n where: options.where\r\n })\r\n\r\n return result.length || 0\r\n },\r\n\r\n count: async (options?: CountOptions): Promise<number> => {\r\n const whereClause = buildWhereClause(tableColumns, options?.where)\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options?.where\r\n })\r\n\r\n // Execute before read hooks\r\n await executeBeforeReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n db\r\n })\r\n\r\n const result = whereClause\r\n ? await db.select().from(_table).where(whereClause)\r\n : await db.select().from(_table)\r\n\r\n // Execute after read hooks\r\n await executeAfterReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n result,\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options?.where,\r\n result\r\n })\r\n\r\n return result.length\r\n },\r\n\r\n exists: async (options: ExistsOptions): Promise<boolean> => {\r\n const whereClause = buildWhereClause(tableColumns, options.where)\r\n if (!whereClause) return false\r\n\r\n // Execute before operation hooks\r\n await executeBeforeOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options.where\r\n })\r\n\r\n // Execute before read hooks\r\n await executeBeforeReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n db\r\n })\r\n\r\n const result = await db.select().from(_table).where(whereClause).limit(1)\r\n const returnValue = result.length > 0\r\n\r\n // Execute after read hooks\r\n await executeAfterReadHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n query: options as unknown as Record<string, unknown>,\r\n result: result,\r\n db\r\n })\r\n\r\n // Execute after operation hooks\r\n await executeAfterOperationHooks(hooks, {\r\n collection: _slug,\r\n operation: 'read',\r\n where: options.where,\r\n result: returnValue\r\n })\r\n\r\n return returnValue\r\n }\r\n }\r\n}\r\n","/**\r\n * PostgreSQL adapter configuration\r\n */\r\nexport type PgAdapterConfig = {\r\n url: string\r\n migrationsPath?: string\r\n}\r\n\r\n/**\r\n * PostgreSQL adapter\r\n */\r\nexport interface PgAdapter {\r\n type: 'postgres'\r\n config: PgAdapterConfig\r\n}\r\n\r\n/**\r\n * Database adapter type\r\n */\r\nexport type DatabaseAdapter = PgAdapter\r\n\r\n/**\r\n * Creates a PostgreSQL adapter\r\n *\r\n * @example\r\n * const adapter = pgAdapter({\r\n * url: 'postgres://user:pass@localhost:5432/db'\r\n * })\r\n */\r\nexport const pgAdapter = (config: PgAdapterConfig): PgAdapter => {\r\n return {\r\n type: 'postgres',\r\n config: {\r\n url: config.url,\r\n migrationsPath: config.migrationsPath ?? './migrations'\r\n }\r\n }\r\n}\r\n","import { pgTable, serial, text, timestamp, uuid, varchar, boolean, integer } from 'drizzle-orm/pg-core'\r\n\r\nimport type { Collection } from './collection'\r\n\r\n/**\r\n * Build Drizzle table from collection definition\r\n */\r\nexport const buildTable = (collection: Collection) => {\r\n // Build columns object\r\n const columns: Record<string, unknown> = {\r\n // Add default id column\r\n id: serial('id').primaryKey()\r\n }\r\n\r\n // Build columns from fields\r\n for (const [fieldName, fieldDef] of Object.entries(collection.fields)) {\r\n // Skip the id field if explicitly defined in fields\r\n if (fieldName === 'id') continue\r\n\r\n const fieldType = fieldDef.fieldType as { name?: string; type?: string }\r\n const fieldTypeName = fieldType.name || fieldType.type || 'text'\r\n\r\n switch (fieldTypeName) {\r\n case 'text':\r\n columns[fieldName] = text(fieldName)\r\n break\r\n case 'varchar':\r\n columns[fieldName] = varchar(fieldName, { length: 255 })\r\n break\r\n case 'number':\r\n case 'integer':\r\n columns[fieldName] = integer(fieldName)\r\n break\r\n case 'boolean':\r\n columns[fieldName] = boolean(fieldName)\r\n break\r\n case 'timestamp':\r\n columns[fieldName] = timestamp(fieldName)\r\n break\r\n case 'uuid':\r\n columns[fieldName] = uuid(fieldName)\r\n break\r\n default:\r\n columns[fieldName] = text(fieldName)\r\n }\r\n }\r\n\r\n return pgTable(collection.slug, columns as Record<string, ReturnType<typeof text>>)\r\n}\r\n\r\n/**\r\n * Build all tables from collections\r\n */\r\nexport const buildSchema = (collections: Collection[]) => {\r\n const tables: Record<string, ReturnType<typeof pgTable>> = {}\r\n\r\n for (const coll of collections) {\r\n tables[coll.slug] = buildTable(coll)\r\n }\r\n\r\n return tables\r\n}\r\n","import type { PgAdapter } from './adapter'\r\nimport type { Collection } from './collection'\r\nimport { buildSchema } from './schema'\r\n\r\n/**\r\n * Push schema to database (development mode)\r\n *\r\n * Uses drizzle-kit's pushSchema to push schema changes to the database\r\n */\r\nexport const push = async (_adapter: PgAdapter, collections: Collection[]) => {\r\n const schema = buildSchema(collections)\r\n\r\n // TODO: Implement actual push using drizzle-kit/api\r\n // import { pushSchema } from 'drizzle-kit/api'\r\n // const result = await pushSchema(schema, drizzleInstance)\r\n // await result.apply()\r\n\r\n console.log('[TODO] Push schema with collections:', Object.keys(schema))\r\n}\r\n\r\n/**\r\n * Generate migration files\r\n *\r\n * Uses drizzle-kit's generateMigration to create migration files\r\n */\r\nexport const generate = async (_adapter: PgAdapter, collections: Collection[]) => {\r\n const schema = buildSchema(collections)\r\n\r\n // TODO: Implement actual migration generation\r\n // import { generateMigration, generateDrizzleJson } from 'drizzle-kit/api'\r\n // const currentSnapshot = generateDrizzleJson(schema)\r\n // const previousSnapshot = loadPreviousSnapshot()\r\n // const migration = await generateMigration(previousSnapshot, currentSnapshot)\r\n // writeMigrationFile(migration)\r\n\r\n console.log('[TODO] Generate migration with collections:', Object.keys(schema))\r\n}\r\n\r\n/**\r\n * Apply migrations\r\n *\r\n * Runs pending migration files against the database\r\n */\r\nexport const migrate = async (adapter: PgAdapter) => {\r\n // TODO: Implement actual migration application\r\n // Run migration files against the database\r\n\r\n console.log('[TODO] Apply migrations from:', adapter.config.migrationsPath)\r\n}\r\n","import { Pool, type Pool as PoolType } from 'pg'\r\nimport { drizzle } from 'drizzle-orm/node-postgres'\r\n\r\nimport type { Collection } from './collection'\r\nimport type { DatabaseAdapter } from './adapter'\r\nimport { buildSchema } from './schema'\r\n\r\n/**\r\n * Plugin interface\r\n */\r\nexport type Plugin = {\r\n name: string\r\n collections?: Record<string, Collection>\r\n hooks?: Record<string, unknown[]>\r\n}\r\n\r\n/**\r\n * Configuration options\r\n */\r\nexport type ConfigOptions<T extends Collection[] = []> = {\r\n database: DatabaseAdapter\r\n collections: T\r\n plugins?: Plugin[]\r\n}\r\n\r\n/**\r\n * Define config return type with inferred collection keys\r\n *\r\n * - collections: metadata only (slug, name, fields, hooks, dataType)\r\n * - db: Drizzle instance with operations (via schema tables)\r\n * - $meta: array of collection slugs and plugin names\r\n */\r\nexport type DefineConfigReturn<T extends Collection[] = []> = {\r\n collections: {\r\n [K in T[number] as K['slug']]: Collection\r\n }\r\n db: ReturnType<typeof drizzle<Record<string, unknown>>>\r\n $meta: {\r\n collections: T[number]['slug'][]\r\n plugins: string[]\r\n }\r\n}\r\n\r\n/**\r\n * Creates the configuration for the data layer\r\n *\r\n * @example\r\n * const adapter = pgAdapter({\r\n * url: process.env.DATABASE_URL!\r\n * })\r\n *\r\n * export const { collections, db } = defineConfig({\r\n * database: adapter,\r\n * collections: [users, posts],\r\n * plugins: [timestampsPlugin()]\r\n * })\r\n *\r\n * // collections: metadata only\r\n * collections.users.slug // 'users'\r\n * collections.users.fields // { name, email, ... }\r\n *\r\n * // db: Drizzle instance with operations\r\n * await db.users.findMany()\r\n * await db.users.insert(values)\r\n */\r\nexport const defineConfig = <T extends Collection[]>(\r\n options: ConfigOptions<T>\r\n): DefineConfigReturn<T> => {\r\n // Initialize the database connection based on adapter type\r\n let pool: PoolType | null = null\r\n let dbInstance: ReturnType<typeof drizzle<Record<string, unknown>>> | null = null\r\n\r\n let schema: Record<string, unknown> = {}\r\n\r\n if (options.database.type === 'postgres') {\r\n // Create pool from adapter config\r\n pool = new Pool({\r\n connectionString: options.database.config.url\r\n })\r\n\r\n // Build schema from collections\r\n schema = buildSchema(options.collections as Collection[])\r\n\r\n // Create Drizzle instance with schema\r\n dbInstance = drizzle(pool, { schema })\r\n }\r\n\r\n // Build collections map (metadata only)\r\n const collectionsMap: Record<string, Collection> = {}\r\n const collectionNames: string[] = []\r\n\r\n for (const coll of options.collections) {\r\n // Store only metadata (not operations)\r\n collectionsMap[coll.slug] = {\r\n slug: coll.slug,\r\n name: coll.name,\r\n fields: coll.fields,\r\n hooks: coll.hooks,\r\n dataType: coll.dataType\r\n }\r\n collectionNames.push(coll.slug)\r\n }\r\n\r\n // Build plugins map\r\n const pluginNames: string[] = []\r\n if (options.plugins) {\r\n for (const plugin of options.plugins) {\r\n pluginNames.push(plugin.name)\r\n\r\n // Register plugin collections (metadata only)\r\n if (plugin.collections) {\r\n for (const [name, coll] of Object.entries(plugin.collections)) {\r\n collectionsMap[name] = {\r\n slug: coll.slug,\r\n name: coll.name,\r\n fields: coll.fields,\r\n hooks: coll.hooks,\r\n dataType: coll.dataType\r\n }\r\n collectionNames.push(name)\r\n }\r\n }\r\n }\r\n }\r\n\r\n return {\r\n collections: collectionsMap as DefineConfigReturn<T>['collections'],\r\n db: dbInstance as DefineConfigReturn<T>['db'],\r\n $meta: {\r\n collections: collectionNames as DefineConfigReturn<T>['$meta']['collections'],\r\n plugins: pluginNames\r\n }\r\n }\r\n}\r\n"],"mappings":"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","names":["collection","fieldType"]}