@kyro-cms/core 0.8.0 → 0.9.1

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 (248) hide show
  1. package/README.md +57 -589
  2. package/dist/{WebhookService-118ZTFis.d.ts → WebhookService-CUTb9XOy.d.ts} +1 -1
  3. package/dist/{WebhookService-AefJfqX0.d.cts → WebhookService-Yg2UEOB4.d.cts} +1 -1
  4. package/dist/api-handler-graphql.cjs +44 -0
  5. package/dist/api-handler-graphql.cjs.map +1 -0
  6. package/dist/api-handler-graphql.d.cts +6 -0
  7. package/dist/api-handler-graphql.d.ts +6 -0
  8. package/dist/api-handler-graphql.js +41 -0
  9. package/dist/api-handler-graphql.js.map +1 -0
  10. package/dist/api-handler-trpc.cjs +38 -0
  11. package/dist/api-handler-trpc.cjs.map +1 -0
  12. package/dist/api-handler-trpc.d.cts +5 -0
  13. package/dist/api-handler-trpc.d.ts +5 -0
  14. package/dist/api-handler-trpc.js +36 -0
  15. package/dist/api-handler-trpc.js.map +1 -0
  16. package/dist/api-handler.cjs +31 -97
  17. package/dist/api-handler.cjs.map +1 -1
  18. package/dist/api-handler.d.cts +2 -1
  19. package/dist/api-handler.d.ts +2 -1
  20. package/dist/api-handler.js +19 -95
  21. package/dist/api-handler.js.map +1 -1
  22. package/dist/{tenant-B1YB0Jy8.d.ts → base-B71y_EAF.d.cts} +6 -12
  23. package/dist/{tenant-Cpeveji6.d.cts → base-DaqY2GhA.d.ts} +6 -12
  24. package/dist/bootstrap-5NLASFOG.cjs +32 -0
  25. package/dist/{bootstrap-AKAUP6F6.cjs.map → bootstrap-5NLASFOG.cjs.map} +1 -1
  26. package/dist/bootstrap-T5BK77LD.js +7 -0
  27. package/dist/{bootstrap-JCML6NFO.js.map → bootstrap-T5BK77LD.js.map} +1 -1
  28. package/dist/{chunk-35U3FROB.js → chunk-22M4O4ZJ.js} +607 -63
  29. package/dist/chunk-22M4O4ZJ.js.map +1 -0
  30. package/dist/chunk-2HZRBATX.cjs +253 -0
  31. package/dist/chunk-2HZRBATX.cjs.map +1 -0
  32. package/dist/{chunk-VJT6P4N6.cjs → chunk-3HR772HI.cjs} +199 -32
  33. package/dist/chunk-3HR772HI.cjs.map +1 -0
  34. package/dist/chunk-3KTWGODI.cjs +178 -0
  35. package/dist/chunk-3KTWGODI.cjs.map +1 -0
  36. package/dist/{chunk-QXIQWPAP.js → chunk-3UK5XBVJ.js} +4 -134
  37. package/dist/chunk-3UK5XBVJ.js.map +1 -0
  38. package/dist/{chunk-FXYP2HA6.js → chunk-4AO3A3JM.js} +48 -4
  39. package/dist/chunk-4AO3A3JM.js.map +1 -0
  40. package/dist/chunk-4M7X5HAB.cjs +173 -0
  41. package/dist/chunk-4M7X5HAB.cjs.map +1 -0
  42. package/dist/chunk-5EPFQUQD.js +3243 -0
  43. package/dist/chunk-5EPFQUQD.js.map +1 -0
  44. package/dist/{chunk-Y3N7UUDO.js → chunk-7OGPN7MP.js} +5 -2
  45. package/dist/chunk-7OGPN7MP.js.map +1 -0
  46. package/dist/{chunk-WOWUL7ZY.js → chunk-AL5KX63J.js} +4 -3
  47. package/dist/chunk-AL5KX63J.js.map +1 -0
  48. package/dist/{chunk-2OL4O2TH.cjs → chunk-C36TMDTY.cjs} +66 -61
  49. package/dist/chunk-C36TMDTY.cjs.map +1 -0
  50. package/dist/{chunk-ES5HNFFT.js → chunk-CF7OL6HR.js} +4 -2
  51. package/dist/chunk-CF7OL6HR.js.map +1 -0
  52. package/dist/chunk-CJONKRHJ.js +162 -0
  53. package/dist/chunk-CJONKRHJ.js.map +1 -0
  54. package/dist/{chunk-2KVHZE6O.cjs → chunk-COIASRDK.cjs} +202 -46
  55. package/dist/chunk-COIASRDK.cjs.map +1 -0
  56. package/dist/chunk-DEVFAKCQ.cjs +3291 -0
  57. package/dist/chunk-DEVFAKCQ.cjs.map +1 -0
  58. package/dist/{chunk-3ZFYL34R.js → chunk-DYTZ6FQ7.js} +12 -185
  59. package/dist/chunk-DYTZ6FQ7.js.map +1 -0
  60. package/dist/{chunk-QPPDLRNR.js → chunk-EJN2PAOE.js} +197 -41
  61. package/dist/chunk-EJN2PAOE.js.map +1 -0
  62. package/dist/chunk-FAXU7BMP.js +220 -0
  63. package/dist/chunk-FAXU7BMP.js.map +1 -0
  64. package/dist/{chunk-OHVB4AJ7.js → chunk-FOPGUM27.js} +22 -17
  65. package/dist/chunk-FOPGUM27.js.map +1 -0
  66. package/dist/chunk-GAOXD3XT.js +175 -0
  67. package/dist/chunk-GAOXD3XT.js.map +1 -0
  68. package/dist/{chunk-4DA7QPLA.cjs → chunk-GXFOGU7N.cjs} +5 -2
  69. package/dist/chunk-GXFOGU7N.cjs.map +1 -0
  70. package/dist/{chunk-I7HHI6QV.cjs → chunk-IDVRRRAK.cjs} +17 -9
  71. package/dist/chunk-IDVRRRAK.cjs.map +1 -0
  72. package/dist/{chunk-WQBRWOQT.cjs → chunk-JOPVMWTM.cjs} +3 -2
  73. package/dist/chunk-JOPVMWTM.cjs.map +1 -0
  74. package/dist/chunk-KC2GDBLS.cjs +84 -0
  75. package/dist/chunk-KC2GDBLS.cjs.map +1 -0
  76. package/dist/{chunk-K7JPTH3G.cjs → chunk-KNRSROWB.cjs} +132 -74
  77. package/dist/chunk-KNRSROWB.cjs.map +1 -0
  78. package/dist/{chunk-3AJE4SEG.js → chunk-KPA4AN4R.js} +125 -67
  79. package/dist/chunk-KPA4AN4R.js.map +1 -0
  80. package/dist/{chunk-QUW2RZTM.cjs → chunk-L46ROHUS.cjs} +51 -7
  81. package/dist/chunk-L46ROHUS.cjs.map +1 -0
  82. package/dist/chunk-L4EZKIEX.js +185 -0
  83. package/dist/chunk-L4EZKIEX.js.map +1 -0
  84. package/dist/{chunk-REK7AYOC.js → chunk-L5UKKZQN.js} +199 -32
  85. package/dist/chunk-L5UKKZQN.js.map +1 -0
  86. package/dist/chunk-NKPKR5BW.cjs +188 -0
  87. package/dist/chunk-NKPKR5BW.cjs.map +1 -0
  88. package/dist/{chunk-Y3QQN7PN.js → chunk-P2HKJ7P5.js} +13 -4
  89. package/dist/chunk-P2HKJ7P5.js.map +1 -0
  90. package/dist/{chunk-SA7NSSIQ.cjs → chunk-PI73NNOK.cjs} +13 -187
  91. package/dist/chunk-PI73NNOK.cjs.map +1 -0
  92. package/dist/{chunk-HXRD4B37.js → chunk-PU2Z5VWF.js} +1279 -556
  93. package/dist/chunk-PU2Z5VWF.js.map +1 -0
  94. package/dist/{chunk-H727JIG7.js → chunk-Q72BOAPK.js} +16 -8
  95. package/dist/chunk-Q72BOAPK.js.map +1 -0
  96. package/dist/{chunk-IBG6V56E.cjs → chunk-QFLB4EIJ.cjs} +2 -139
  97. package/dist/chunk-QFLB4EIJ.cjs.map +1 -0
  98. package/dist/{chunk-YVUJBEXE.cjs → chunk-RAMGUDJN.cjs} +16 -7
  99. package/dist/chunk-RAMGUDJN.cjs.map +1 -0
  100. package/dist/{chunk-LINKCEG4.cjs → chunk-ROJHKAQ4.cjs} +617 -73
  101. package/dist/chunk-ROJHKAQ4.cjs.map +1 -0
  102. package/dist/{chunk-5KVM3WEY.cjs → chunk-RSF3UU7H.cjs} +1330 -602
  103. package/dist/chunk-RSF3UU7H.cjs.map +1 -0
  104. package/dist/{chunk-V3LKPM3O.cjs → chunk-SHTTJMLT.cjs} +4 -2
  105. package/dist/chunk-SHTTJMLT.cjs.map +1 -0
  106. package/dist/chunk-SPBTLUN6.js +92 -0
  107. package/dist/chunk-SPBTLUN6.js.map +1 -0
  108. package/dist/{chunk-57P6MJKC.js → chunk-TXSZFA4G.js} +3 -3
  109. package/dist/chunk-TXSZFA4G.js.map +1 -0
  110. package/dist/chunk-UERVXYVK.cjs +99 -0
  111. package/dist/chunk-UERVXYVK.cjs.map +1 -0
  112. package/dist/{chunk-PDYFVNUX.cjs → chunk-V2TVSCV5.cjs} +16 -23
  113. package/dist/chunk-V2TVSCV5.cjs.map +1 -0
  114. package/dist/{chunk-DXHRBMGB.js → chunk-VO35MNPH.js} +12 -19
  115. package/dist/chunk-VO35MNPH.js.map +1 -0
  116. package/dist/{chunk-IA6AU5PI.cjs → chunk-WNCYAKF3.cjs} +3 -3
  117. package/dist/chunk-WNCYAKF3.cjs.map +1 -0
  118. package/dist/chunk-XEB7PH2E.js +81 -0
  119. package/dist/chunk-XEB7PH2E.js.map +1 -0
  120. package/dist/cli/index.cjs +5 -5
  121. package/dist/cli/index.cjs.map +1 -1
  122. package/dist/cli/index.js +5 -5
  123. package/dist/cli/index.js.map +1 -1
  124. package/dist/client.cjs +3 -3
  125. package/dist/client.d.cts +3 -3
  126. package/dist/client.d.ts +3 -3
  127. package/dist/client.js +1 -1
  128. package/dist/drizzle/index.cjs +14 -13
  129. package/dist/drizzle/index.d.cts +9 -7
  130. package/dist/drizzle/index.d.ts +9 -7
  131. package/dist/drizzle/index.js +5 -4
  132. package/dist/fields/index.cjs +21 -37
  133. package/dist/fields/index.d.cts +2 -22
  134. package/dist/fields/index.d.ts +2 -22
  135. package/dist/fields/index.js +1 -1
  136. package/dist/graphql/index.cjs +5 -4
  137. package/dist/graphql/index.d.cts +5 -3
  138. package/dist/graphql/index.d.ts +5 -3
  139. package/dist/graphql/index.js +3 -2
  140. package/dist/index-CJXPB_ot.d.ts +276 -0
  141. package/dist/index-CaTNnLGd.d.cts +276 -0
  142. package/dist/index.cjs +304 -162
  143. package/dist/index.cjs.map +1 -1
  144. package/dist/index.d.cts +129 -205
  145. package/dist/index.d.ts +129 -205
  146. package/dist/index.js +172 -33
  147. package/dist/index.js.map +1 -1
  148. package/dist/integration.cjs +2 -2
  149. package/dist/integration.js +1 -1
  150. package/dist/mongo-auth-adapter-ISOM7FSS.cjs +17 -0
  151. package/dist/{mongo-auth-adapter-NHHUJHVH.cjs.map → mongo-auth-adapter-ISOM7FSS.cjs.map} +1 -1
  152. package/dist/mongo-auth-adapter-MO6STCV3.js +4 -0
  153. package/dist/{mongo-auth-adapter-NJQUUCTP.js.map → mongo-auth-adapter-MO6STCV3.js.map} +1 -1
  154. package/dist/mongodb/index.cjs +8 -7
  155. package/dist/mongodb/index.d.cts +5 -7
  156. package/dist/mongodb/index.d.ts +5 -7
  157. package/dist/mongodb/index.js +4 -3
  158. package/dist/postgres-auth-adapter-DWDR7P5G.js +5 -0
  159. package/dist/{postgres-auth-adapter-3T2NKTSE.js.map → postgres-auth-adapter-DWDR7P5G.js.map} +1 -1
  160. package/dist/postgres-auth-adapter-WRWSJD4E.cjs +14 -0
  161. package/dist/{postgres-auth-adapter-7IEENCKQ.cjs.map → postgres-auth-adapter-WRWSJD4E.cjs.map} +1 -1
  162. package/dist/redis-adapter-HGTPWIGV.js +4 -0
  163. package/dist/{redis-adapter-VQXD7ESY.js.map → redis-adapter-HGTPWIGV.js.map} +1 -1
  164. package/dist/redis-adapter-KJ3YOOT6.cjs +13 -0
  165. package/dist/{redis-adapter-D2E2S3GB.cjs.map → redis-adapter-KJ3YOOT6.cjs.map} +1 -1
  166. package/dist/rest/index.cjs +15 -14
  167. package/dist/rest/index.d.cts +4 -4
  168. package/dist/rest/index.d.ts +4 -4
  169. package/dist/rest/index.js +13 -12
  170. package/dist/{schema-5PHL5IVB.js → schema-6I5OFR4Z.js} +3 -3
  171. package/dist/{schema-5PHL5IVB.js.map → schema-6I5OFR4Z.js.map} +1 -1
  172. package/dist/{schema-37SE2F4B.cjs → schema-TTFE4467.cjs} +14 -14
  173. package/dist/{schema-37SE2F4B.cjs.map → schema-TTFE4467.cjs.map} +1 -1
  174. package/dist/sqlite-adapter-6GEUSVXQ.js +4 -0
  175. package/dist/{sqlite-adapter-TR3U3W6Q.js.map → sqlite-adapter-6GEUSVXQ.js.map} +1 -1
  176. package/dist/sqlite-adapter-CSIZE5SX.cjs +13 -0
  177. package/dist/{sqlite-adapter-LVK5PS4T.cjs.map → sqlite-adapter-CSIZE5SX.cjs.map} +1 -1
  178. package/dist/templates/index.cjs +133 -31
  179. package/dist/templates/index.d.cts +52 -9
  180. package/dist/templates/index.d.ts +52 -9
  181. package/dist/templates/index.js +3 -1
  182. package/dist/trpc/index.cjs +13 -12
  183. package/dist/trpc/index.d.cts +55 -49
  184. package/dist/trpc/index.d.ts +55 -49
  185. package/dist/trpc/index.js +4 -3
  186. package/dist/{types-D6ZLRGbH.d.cts → types-CpjuXbe7.d.cts} +2 -0
  187. package/dist/{types-D6ZLRGbH.d.ts → types-CpjuXbe7.d.ts} +2 -0
  188. package/dist/{types-Bs1up4yP.d.ts → types-CyCQ6SAI.d.ts} +28 -2
  189. package/dist/{types-J3R9nVsZ.d.cts → types-DJxD9394.d.cts} +28 -2
  190. package/dist/{types-VtjUxIMp.d.cts → types-Z6FBiqa2.d.cts} +35 -14
  191. package/dist/{types-VtjUxIMp.d.ts → types-Z6FBiqa2.d.ts} +35 -14
  192. package/package.json +22 -4
  193. package/dist/bootstrap-AKAUP6F6.cjs +0 -32
  194. package/dist/bootstrap-JCML6NFO.js +0 -7
  195. package/dist/chunk-2KVHZE6O.cjs.map +0 -1
  196. package/dist/chunk-2OL4O2TH.cjs.map +0 -1
  197. package/dist/chunk-35U3FROB.js.map +0 -1
  198. package/dist/chunk-3AJE4SEG.js.map +0 -1
  199. package/dist/chunk-3J4MFTI3.js +0 -3872
  200. package/dist/chunk-3J4MFTI3.js.map +0 -1
  201. package/dist/chunk-3ZFYL34R.js.map +0 -1
  202. package/dist/chunk-4DA7QPLA.cjs.map +0 -1
  203. package/dist/chunk-57P6MJKC.js.map +0 -1
  204. package/dist/chunk-5KVM3WEY.cjs.map +0 -1
  205. package/dist/chunk-6IMPH6WV.cjs +0 -3897
  206. package/dist/chunk-6IMPH6WV.cjs.map +0 -1
  207. package/dist/chunk-ATBOUGQP.cjs +0 -513
  208. package/dist/chunk-ATBOUGQP.cjs.map +0 -1
  209. package/dist/chunk-DXHRBMGB.js.map +0 -1
  210. package/dist/chunk-ES5HNFFT.js.map +0 -1
  211. package/dist/chunk-FXYP2HA6.js.map +0 -1
  212. package/dist/chunk-H727JIG7.js.map +0 -1
  213. package/dist/chunk-HXRD4B37.js.map +0 -1
  214. package/dist/chunk-I7HHI6QV.cjs.map +0 -1
  215. package/dist/chunk-IA6AU5PI.cjs.map +0 -1
  216. package/dist/chunk-IBG6V56E.cjs.map +0 -1
  217. package/dist/chunk-K7JPTH3G.cjs.map +0 -1
  218. package/dist/chunk-LINKCEG4.cjs.map +0 -1
  219. package/dist/chunk-OHVB4AJ7.js.map +0 -1
  220. package/dist/chunk-PDYFVNUX.cjs.map +0 -1
  221. package/dist/chunk-Q23JB3KL.js +0 -488
  222. package/dist/chunk-Q23JB3KL.js.map +0 -1
  223. package/dist/chunk-QPPDLRNR.js.map +0 -1
  224. package/dist/chunk-QUW2RZTM.cjs.map +0 -1
  225. package/dist/chunk-QXIQWPAP.js.map +0 -1
  226. package/dist/chunk-R3XIBBAW.cjs +0 -34
  227. package/dist/chunk-R3XIBBAW.cjs.map +0 -1
  228. package/dist/chunk-REK7AYOC.js.map +0 -1
  229. package/dist/chunk-SA7NSSIQ.cjs.map +0 -1
  230. package/dist/chunk-SDMNUYVU.js +0 -30
  231. package/dist/chunk-SDMNUYVU.js.map +0 -1
  232. package/dist/chunk-V3LKPM3O.cjs.map +0 -1
  233. package/dist/chunk-VJT6P4N6.cjs.map +0 -1
  234. package/dist/chunk-WOWUL7ZY.js.map +0 -1
  235. package/dist/chunk-WQBRWOQT.cjs.map +0 -1
  236. package/dist/chunk-Y3N7UUDO.js.map +0 -1
  237. package/dist/chunk-Y3QQN7PN.js.map +0 -1
  238. package/dist/chunk-YVUJBEXE.cjs.map +0 -1
  239. package/dist/index-CLp-DRKA.d.ts +0 -64
  240. package/dist/index-DfO7G4kN.d.cts +0 -64
  241. package/dist/mongo-auth-adapter-NHHUJHVH.cjs +0 -17
  242. package/dist/mongo-auth-adapter-NJQUUCTP.js +0 -4
  243. package/dist/postgres-auth-adapter-3T2NKTSE.js +0 -5
  244. package/dist/postgres-auth-adapter-7IEENCKQ.cjs +0 -14
  245. package/dist/redis-adapter-D2E2S3GB.cjs +0 -13
  246. package/dist/redis-adapter-VQXD7ESY.js +0 -4
  247. package/dist/sqlite-adapter-LVK5PS4T.cjs +0 -13
  248. package/dist/sqlite-adapter-TR3U3W6Q.js +0 -4
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/database/mongodb/adapter.ts"],"names":["AbstractBaseAdapter","applyRLS","DEFAULT_RLS_CONFIG","canAccessDocument","randomBytes"],"mappings":"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","file":"chunk-PDYFVNUX.cjs","sourcesContent":["import { randomBytes } from 'crypto';\nimport { AbstractBaseAdapter } from '../base.js';\nimport type {\n CollectionConfig,\n GlobalConfig,\n FindArgs,\n FindByIDArgs,\n CreateArgs,\n UpdateArgs,\n DeleteArgs,\n FindResult,\n DraftFindArgs,\n DraftUpsertArgs,\n DraftDeleteArgs,\n DraftSnapshot,\n VersionRecord,\n CreateVersionArgs,\n FindVersionsArgs,\n} from '../../registry/types.js';\nimport type { TenantContext } from '../../auth/rls/tenant.js';\nimport { applyRLS, DEFAULT_RLS_CONFIG, canAccessDocument } from '../../auth/rls/tenant.js';\n\nexport class MongoDBAdapter extends AbstractBaseAdapter {\n public client: any;\n public db: any;\n private database: string;\n private connectionString?: string;\n private readonly draftsCollectionName = 'kyro_drafts';\n private tenantContext?: TenantContext;\n \n setTenantContext(context: TenantContext | undefined): void {\n this.tenantContext = context;\n }\n \n getTenantContext(): TenantContext | undefined {\n return this.tenantContext;\n }\n \n constructor(options: {\n client?: any;\n database?: string;\n connectionString?: string;\n }) {\n super();\n if (options.connectionString) {\n this.connectionString = options.connectionString;\n try {\n const url = new URL(options.connectionString);\n this.database = url.pathname.replace(/^\\//, '') || 'kyro_cms';\n } catch {\n this.database = 'kyro_cms';\n }\n } else {\n this.client = options.client;\n this.database = options.database!;\n }\n }\n\n async connect(): Promise<void> {\n if (this.connectionString && !this.client) {\n const { MongoClient } = await import('mongodb');\n this.client = new MongoClient(this.connectionString);\n await this.client.connect();\n }\n this.db = this.client.db(this.database);\n this.connected = true;\n console.log(`[MongoDBAdapter] Connected to database: ${this.database}`);\n }\n\n async disconnect(): Promise<void> {\n if (this.client) {\n await this.client.close();\n this.connected = false;\n console.log(`[MongoDBAdapter] Disconnected`);\n }\n }\n\n private getMongoCollection(slug: string): any {\n if (!this.db) {\n throw new Error('MongoDB not connected');\n }\n return this.db.collection(slug);\n }\n\n async find<T>(args: FindArgs): Promise<FindResult<T>> {\n const { collection: slug, where = {}, sort, limit = 10, page = 1, tenantID, select, draft } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n let effectiveWhere = { ...where };\n if (this.tenantContext && config.tenantScoped) {\n const rlsQuery = applyRLS({ where: effectiveWhere }, slug, this.tenantContext, DEFAULT_RLS_CONFIG);\n effectiveWhere = rlsQuery.where || {};\n }\n\n // Build filter\n const filter = this.buildFilter(effectiveWhere, tenantID);\n \n // Default filter for non-draft requests: only show published\n if (!draft) {\n filter._status = 'published';\n }\n\n // Build sort\n const sortOption = this.parseSort(sort);\n const sortObj: Record<string, 1 | -1> = {\n [sortOption.field]: sortOption.direction === 'asc' ? 1 : -1,\n };\n\n // Execute query\n const skip = (page - 1) * limit;\n \n const [docs, totalDocs] = await Promise.all([\n col\n .find(filter)\n .sort(sortObj)\n .skip(skip)\n .limit(limit)\n .project(this.buildProjection(select))\n .toArray(),\n col.countDocuments(filter),\n ]);\n\n // Process results\n let processedDocs = docs.map((doc: any) => this.processResult(doc, config));\n\n if (this.tenantContext && !this.tenantContext.isSuperAdmin) {\n processedDocs = processedDocs.filter((doc: any) => canAccessDocument(doc, slug, this.tenantContext!, DEFAULT_RLS_CONFIG));\n }\n\n // If draft: true, we need to check if any docs have a separate draft version\n if (draft) {\n processedDocs = await Promise.all(processedDocs.map(async (doc: any) => {\n if (doc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: doc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n return { ...doc, ...versions.docs[0].data, _has_draft: true, _status: doc._status };\n }\n }\n return doc;\n }));\n }\n\n return {\n docs: processedDocs as T[],\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findByID<T>(args: FindByIDArgs): Promise<T | null> {\n const { collection: slug, id, tenantID, draft } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n if (this.tenantContext && config.tenantScoped) {\n const tempDoc = { _id: id, tenantId: this.tenantContext.tenantId };\n if (!canAccessDocument(tempDoc, slug, this.tenantContext, DEFAULT_RLS_CONFIG)) {\n return null;\n }\n }\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n \n if (!draft) {\n filter._status = 'published';\n }\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n let processedDoc = this.processResult(doc, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && processedDoc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: processedDoc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };\n }\n }\n\n return processedDoc as T;\n }\n\n async create<T>(args: CreateArgs): Promise<T> {\n const { collection: slug, data, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const doc: any = {\n ...this.prepareData(data, config),\n _id: this.generateId(),\n };\n\n if (tenantID) {\n doc.tenantId = tenantID;\n }\n\n await col.insertOne(doc);\n\n return this.processResult(doc, config) as T;\n }\n\n async update<T>(args: UpdateArgs): Promise<T> {\n const { collection: slug, id, data, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n const updateData = this.prepareData(data, config);\n\n const result = await col.findOneAndUpdate(\n filter,\n { $set: updateData },\n { returnDocument: 'after' }\n );\n\n if (!result) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(result, config) as T;\n }\n\n async delete<T>(args: DeleteArgs): Promise<T> {\n const { collection: slug, id, tenantID } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n\n const filter: any = { _id: id };\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n const doc = await col.findOneAndDelete(filter);\n if (!doc) {\n throw new Error(`Document not found: ${slug}/${id}`);\n }\n\n return this.processResult(doc, config) as T;\n }\n\n async count(args: { collection: string; where?: Record<string, any>; tenantID?: string }): Promise<number> {\n const { collection: slug, where = {}, tenantID } = args;\n const col = this.getMongoCollection(slug);\n const filter = this.buildFilter(where, tenantID);\n return col.countDocuments(filter);\n }\n\n async findOne(args: { collection: string; where: Record<string, any>; tenantID?: string; draft?: boolean }): Promise<any> {\n const { collection: slug, where = {}, tenantID, draft } = args;\n const config = this.getCollectionConfig(slug);\n const col = this.getMongoCollection(slug);\n const filter = this.buildFilter(where, tenantID);\n\n if (!draft) {\n filter._status = 'published';\n }\n\n const doc = await col.findOne(filter);\n if (!doc) return null;\n\n let processedDoc = this.processResult(doc, config);\n\n // If draft: true and doc has a separate draft, merge it\n if (draft && processedDoc._has_draft) {\n const versions = await this.findVersions({\n collection: slug,\n documentId: processedDoc.id,\n limit: 1,\n sort: '-createdAt'\n });\n if (versions.docs.length > 0 && versions.docs[0].status === 'draft') {\n processedDoc = { ...processedDoc, ...versions.docs[0].data, _has_draft: true, _status: processedDoc._status };\n }\n }\n\n return processedDoc;\n }\n\n async findVersions(args: FindVersionsArgs): Promise<FindResult<VersionRecord>> {\n const { collection: slug, documentId, sort, limit = 10, page = 1, tenantID } = args;\n \n // Versions stored in a separate collection\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n\n const skip = (page - 1) * limit;\n const sortOption = this.parseSort(sort);\n const sortObj: Record<string, 1 | -1> = {\n [sortOption.field]: sortOption.direction === 'asc' ? 1 : -1,\n };\n\n const [docs, totalDocs] = await Promise.all([\n versionCollection.find(filter).sort(sortObj).skip(skip).limit(limit).toArray(),\n versionCollection.countDocuments(filter),\n ]);\n\n return {\n docs: docs.map((doc: any) => this.processResult(doc, {} as CollectionConfig) as VersionRecord),\n ...this.calculatePagination(page, limit, totalDocs),\n };\n }\n\n async findVersionByID(args: { collection: string; versionId: string; tenantID?: string }): Promise<VersionRecord | null> {\n const { collection: slug, versionId, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n const filter: any = { _id: versionId };\n if (tenantID) filter.tenant_id = tenantID;\n \n const doc = await versionCollection.findOne(filter);\n return doc ? this.processResult(doc, {} as CollectionConfig) as VersionRecord : null;\n }\n\n async createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>> {\n const { collection: slug, documentId, data, status, createdBy, changeDescription, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n\n const versionDoc: any = {\n _id: this.generateId(),\n document_id: documentId,\n collection_slug: slug,\n tenant_id: tenantID,\n data,\n status,\n created_by: createdBy,\n change_description: changeDescription,\n createdAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n await versionCollection.insertOne(versionDoc);\n \n // Pruning logic\n const config = this.getCollectionConfig(slug);\n if (config.versions?.maxPerDoc) {\n await this.deleteVersions({\n collection: slug,\n documentId: documentId,\n keepLatest: config.versions.maxPerDoc,\n tenantID: tenantID,\n });\n }\n\n return this.processResult(versionDoc, {} as CollectionConfig) as VersionRecord<T>;\n }\n\n async deleteVersions(args: { collection: string; documentId: string; keepLatest?: number; tenantID?: string }): Promise<void> {\n const { collection: slug, documentId, keepLatest, tenantID } = args;\n const versionCollection = this.getMongoCollection(`${slug}_versions`);\n \n if (keepLatest) {\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n\n const toKeep = await versionCollection\n .find(filter)\n .sort({ createdAt: -1 })\n .limit(keepLatest)\n .project({ _id: 1 })\n .toArray();\n\n const keepIds = toKeep.map((doc: any) => doc._id);\n if (keepIds.length > 0) {\n await versionCollection.deleteMany({\n document_id: documentId,\n _id: { $nin: keepIds },\n ...(tenantID ? { tenant_id: tenantID } : {}),\n });\n }\n } else {\n const filter: any = { document_id: documentId };\n if (tenantID) filter.tenant_id = tenantID;\n await versionCollection.deleteMany(filter);\n }\n }\n\n async findDraft<T>(args: DraftFindArgs): Promise<DraftSnapshot<T> | null> {\n const draft = await this.getMongoCollection(this.draftsCollectionName).findOne({\n _id: this.getDraftId(args.collection, args.documentId, args.tenantID),\n });\n\n return draft ? this.docToDraft<T>(draft) : null;\n }\n\n async upsertDraft<T>(args: DraftUpsertArgs<T>): Promise<DraftSnapshot<T>> {\n const now = new Date().toISOString();\n const draftUpdatedAt = args.draftUpdatedAt || now;\n const _id = this.getDraftId(args.collection, args.documentId, args.tenantID);\n const existing = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });\n\n await this.getMongoCollection(this.draftsCollectionName).updateOne(\n { _id },\n {\n $set: {\n collectionSlug: args.collection,\n documentId: args.documentId,\n tenantId: args.tenantID,\n data: args.data,\n baseUpdatedAt: args.baseUpdatedAt ?? null,\n draftUpdatedAt,\n updatedAt: now,\n },\n $setOnInsert: {\n createdAt: existing?.createdAt || now,\n },\n },\n { upsert: true },\n );\n\n const saved = await this.getMongoCollection(this.draftsCollectionName).findOne({ _id });\n if (!saved) {\n throw new Error('Failed to persist draft snapshot');\n }\n return this.docToDraft<T>(saved);\n }\n\n async deleteDraft(args: DraftDeleteArgs): Promise<void> {\n await this.getMongoCollection(this.draftsCollectionName).deleteOne({\n _id: this.getDraftId(args.collection, args.documentId, args.tenantID),\n });\n }\n\n async migrate?(): Promise<void> {\n // Create indexes for all collections\n for (const config of this.collections.values()) {\n const col = this.getMongoCollection(config.slug);\n\n // Create default indexes\n await col.createIndex({ _id: 1 });\n \n if (config.tenantScoped) {\n await col.createIndex({ tenantId: 1 });\n }\n\n if (config.timestamps) {\n await col.createIndex({ createdAt: -1 });\n }\n\n // Create unique indexes\n for (const field of config.fields) {\n if (field.unique && field.name) {\n await col.createIndex({ [field.name]: 1 }, { unique: true });\n }\n if (field.indexed && field.name) {\n await col.createIndex({ [field.name]: 1 });\n }\n }\n }\n\n await this.getMongoCollection(this.draftsCollectionName).createIndex({ updatedAt: -1 });\n \n console.log(`[MongoDBAdapter] Migration completed`);\n }\n\n // ========================================================================\n // Helper Methods\n // ========================================================================\n\n private getCollectionConfig(slug: string): CollectionConfig {\n const config = this.collections.get(slug);\n if (!config) {\n throw new Error(`Collection \"${slug}\" not found`);\n }\n return config;\n }\n\n private buildFilter(where: Record<string, any> = {}, tenantID?: string): Record<string, any> {\n const filter: Record<string, any> = {};\n\n // Apply tenant filter\n if (tenantID) {\n filter.tenantId = tenantID;\n }\n\n // Convert operators to MongoDB format\n for (const [key, value] of Object.entries(where)) {\n if (key === 'AND' && Array.isArray(value)) {\n const andConditions = value.map((v: any) => this.buildFilter(v));\n Object.assign(filter, ...andConditions);\n } else if (key === 'OR' && Array.isArray(value)) {\n filter.$or = value.map((v: any) => this.buildFilter(v));\n } else if (typeof value === 'object' && value !== null && !Array.isArray(value)) {\n // Operator-based conditions\n const mongoOperators: Record<string, any> = {};\n \n if (value.equals !== undefined) {\n filter[key === 'id' ? '_id' : key] = value.equals;\n continue;\n }\n if (value.not_equals !== undefined) {\n mongoOperators.$ne = value.not_equals;\n }\n if (value.in !== undefined) {\n mongoOperators.$in = value.in;\n }\n if (value.not_in !== undefined) {\n mongoOperators.$nin = value.not_in;\n }\n if (value.greater_than !== undefined) {\n mongoOperators.$gt = value.greater_than;\n }\n if (value.greater_than_equal !== undefined) {\n mongoOperators.$gte = value.greater_than_equal;\n }\n if (value.less_than !== undefined) {\n mongoOperators.$lt = value.less_than;\n }\n if (value.less_than_equal !== undefined) {\n mongoOperators.$lte = value.less_than_equal;\n }\n if (value.like !== undefined) {\n mongoOperators.$regex = new RegExp(value.like.replace(/%/g, '.*'), 'i');\n }\n if (value.not_like !== undefined) {\n mongoOperators.$not = new RegExp(value.not_like.replace(/%/g, '.*'), 'i');\n }\n if (value.contains !== undefined) {\n mongoOperators.$regex = new RegExp(`.*${value.contains}.*`, 'i');\n }\n if (value.exists !== undefined) {\n mongoOperators.$exists = value.exists;\n }\n\n if (Object.keys(mongoOperators).length > 0) {\n filter[key === 'id' ? '_id' : key] = mongoOperators;\n }\n } else {\n // Direct equality\n filter[key === 'id' ? '_id' : key] = value;\n }\n }\n\n return filter;\n }\n\n private getDraftId(collection: string, documentId: string, tenantID?: string): string {\n return `${collection}::${documentId}::${tenantID || 'global'}`;\n }\n\n private docToDraft<T>(doc: any): DraftSnapshot<T> {\n return {\n id: String(doc._id),\n collection: doc.collectionSlug,\n documentId: doc.documentId,\n tenantID: doc.tenantId ?? undefined,\n data: doc.data || {},\n baseUpdatedAt: doc.baseUpdatedAt ?? null,\n draftUpdatedAt: doc.draftUpdatedAt,\n createdAt: doc.createdAt,\n updatedAt: doc.updatedAt,\n };\n }\n\n private buildProjection(select?: string[]): Record<string, 1> | undefined {\n if (!select || select.length === 0) return undefined;\n \n const projection: Record<string, 1> = { _id: 1 };\n for (const field of select) {\n projection[field] = 1;\n }\n return projection;\n }\n\n private processResult(data: any, config: CollectionConfig): any {\n if (!data) return null;\n\n const result = { ...data };\n\n // Convert _id to id\n if (data._id) {\n result.id = data._id;\n delete result._id;\n }\n\n // Remove MongoDB internals\n delete result.__v;\n\n // Convert dates to ISO strings\n if (result.createdAt) {\n result.createdAt = new Date(result.createdAt).toISOString();\n }\n if (result.updatedAt) {\n result.updatedAt = new Date(result.updatedAt).toISOString();\n }\n\n return result;\n }\n\n private generateId(): string {\n const timestamp = Date.now().toString(16).padStart(12, '0');\n const random = randomBytes(6).toString('hex');\n return timestamp + random;\n }\n}\n\n// ============================================================================\n// Factory Function\n// ============================================================================\n\nexport function createMongoDBAdapter(options: {\n client?: any;\n database?: string;\n connectionString?: string;\n}): MongoDBAdapter {\n return new MongoDBAdapter(options);\n}\n"]}
@@ -1,488 +0,0 @@
1
- // src/fields/types.ts
2
- function isTextField(field) {
3
- return field.type === "text";
4
- }
5
- function isNumberField(field) {
6
- return field.type === "number";
7
- }
8
- function isRelationshipField(field) {
9
- return field.type === "relationship";
10
- }
11
- function isArrayField(field) {
12
- return field.type === "array";
13
- }
14
- function isGroupField(field) {
15
- return field.type === "group";
16
- }
17
- function isBlocksField(field) {
18
- return field.type === "blocks";
19
- }
20
- function isUploadField(field) {
21
- return field.type === "upload";
22
- }
23
- function isImageField(field) {
24
- return field.type === "image";
25
- }
26
- function isRichTextField(field) {
27
- return field.type === "richtext";
28
- }
29
- function isSelectField(field) {
30
- return field.type === "select";
31
- }
32
- function isLayoutField(field) {
33
- return field.type === "row" || field.type === "collapsible" || field.type === "tabs";
34
- }
35
- var PRIMITIVE_FIELD_TYPES = [
36
- "text",
37
- "number",
38
- "checkbox",
39
- "date",
40
- "email",
41
- "password",
42
- "textarea",
43
- "select",
44
- "radio",
45
- "color"
46
- ];
47
- var COMPLEX_FIELD_TYPES = [
48
- "richtext",
49
- "json",
50
- "code",
51
- "upload",
52
- "image",
53
- "markdown"
54
- ];
55
- var RELATIONAL_FIELD_TYPES = [
56
- "relationship",
57
- "array",
58
- "group",
59
- "blocks"
60
- ];
61
- var LAYOUT_FIELD_TYPES = ["row", "collapsible", "tabs"];
62
- var ALL_FIELD_TYPES = [
63
- ...PRIMITIVE_FIELD_TYPES,
64
- ...COMPLEX_FIELD_TYPES,
65
- ...RELATIONAL_FIELD_TYPES,
66
- ...LAYOUT_FIELD_TYPES
67
- ];
68
- function createRelationshipFieldConfig(name, relationTo, options) {
69
- return {
70
- name,
71
- type: "relationship",
72
- relationTo,
73
- ...options,
74
- required: options?.required ?? false
75
- };
76
- }
77
-
78
- // src/fields/richtext.ts
79
- var MIN_COLUMNS = 1;
80
- var MAX_COLUMNS = 6;
81
- var richTextStyles = `
82
- .kyro-richtext {
83
- color: inherit;
84
- line-height: 1.7;
85
- }
86
-
87
- .kyro-richtext > *:first-child {
88
- margin-top: 0;
89
- }
90
-
91
- .kyro-richtext > *:last-child {
92
- margin-bottom: 0;
93
- }
94
-
95
- .kyro-richtext p,
96
- .kyro-richtext ul,
97
- .kyro-richtext ol,
98
- .kyro-richtext blockquote,
99
- .kyro-richtext pre,
100
- .kyro-richtext kyro-callout,
101
- .kyro-richtext kyro-hero,
102
- .kyro-richtext kyro-heading,
103
- .kyro-richtext kyro-stack,
104
- .kyro-richtext kyro-columns {
105
- margin: 0 0 1rem;
106
- }
107
-
108
- .kyro-richtext h1,
109
- .kyro-richtext h2,
110
- .kyro-richtext h3,
111
- .kyro-richtext h4,
112
- .kyro-richtext h5,
113
- .kyro-richtext h6 {
114
- margin: 0 0 0.75rem;
115
- line-height: 1.2;
116
- }
117
-
118
- .kyro-richtext ul,
119
- .kyro-richtext ol {
120
- padding-left: 1.5rem;
121
- }
122
-
123
- .kyro-richtext blockquote {
124
- border-left: 4px solid rgba(148, 163, 184, 0.5);
125
- margin-left: 0;
126
- padding-left: 1rem;
127
- font-style: italic;
128
- }
129
-
130
- .kyro-richtext pre {
131
- overflow-x: auto;
132
- border-radius: 0.75rem;
133
- background: rgba(15, 23, 42, 0.92);
134
- color: #f8fafc;
135
- padding: 1rem;
136
- }
137
-
138
- .kyro-richtext code {
139
- font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
140
- }
141
-
142
- .kyro-richtext img {
143
- display: block;
144
- max-width: 100%;
145
- height: auto;
146
- border-radius: 0.75rem;
147
- }
148
-
149
- .kyro-richtext kyro-columns {
150
- display: grid;
151
- grid-template-columns: repeat(var(--kyro-columns-count, 1), minmax(0, 1fr));
152
- gap: 1rem;
153
- }
154
-
155
- .kyro-richtext kyro-column {
156
- display: block;
157
- min-width: 0;
158
- }
159
-
160
- .kyro-richtext kyro-column > *:last-child {
161
- margin-bottom: 0;
162
- }
163
-
164
- .kyro-richtext kyro-hero,
165
- .kyro-richtext kyro-callout,
166
- .kyro-richtext kyro-stack,
167
- .kyro-richtext kyro-heading {
168
- display: block;
169
- }
170
-
171
- .kyro-richtext kyro-hero {
172
- border: 1px solid rgba(148, 163, 184, 0.25);
173
- border-radius: 1rem;
174
- padding: 1.5rem;
175
- text-align: center;
176
- background: linear-gradient(to bottom, rgba(148, 163, 184, 0.12), transparent);
177
- }
178
-
179
- .kyro-richtext kyro-heading {
180
- font-size: 1.125rem;
181
- font-weight: 700;
182
- }
183
-
184
- .kyro-richtext kyro-callout {
185
- border: 1px solid rgba(59, 130, 246, 0.25);
186
- border-radius: 0.875rem;
187
- padding: 0.875rem 1rem;
188
- background: rgba(59, 130, 246, 0.06);
189
- }
190
-
191
- @media (max-width: 720px) {
192
- .kyro-richtext kyro-columns {
193
- grid-template-columns: 1fr;
194
- }
195
- }
196
- `.trim();
197
- function createEmptyParagraphNode() {
198
- return {
199
- type: "paragraph",
200
- content: []
201
- };
202
- }
203
- function createColumnNode(content = [createEmptyParagraphNode()]) {
204
- return {
205
- type: "kyroColumn",
206
- content: content.length > 0 ? content : [createEmptyParagraphNode()]
207
- };
208
- }
209
- function createColumnsNode(columns = 2) {
210
- const count = clampColumns(columns);
211
- return {
212
- type: "kyroColumns",
213
- attrs: { columns: count },
214
- content: Array.from({ length: count }, () => createColumnNode())
215
- };
216
- }
217
- function normalizeRichTextDocument(value) {
218
- const documentNode = toRichTextDocument(value);
219
- return {
220
- type: "doc",
221
- content: normalizeNodes(documentNode.content)
222
- };
223
- }
224
- function normalizeRichTextValue(value) {
225
- if (Array.isArray(value)) {
226
- return normalizeRichTextDocument(value).content;
227
- }
228
- if (isObject(value) && value.type === "doc") {
229
- return normalizeRichTextDocument(value);
230
- }
231
- return value;
232
- }
233
- function renderRichText(value) {
234
- if (typeof value === "string") {
235
- return `<div class="kyro-richtext">${value}</div>`;
236
- }
237
- const documentNode = normalizeRichTextDocument(value);
238
- return `<div class="kyro-richtext">${renderNodes(documentNode.content)}</div>`;
239
- }
240
- function toRichTextDocument(value) {
241
- if (Array.isArray(value)) {
242
- return {
243
- type: "doc",
244
- content: normalizeNodes(value)
245
- };
246
- }
247
- if (isObject(value) && value.type === "doc") {
248
- const doc = value;
249
- return {
250
- type: "doc",
251
- content: normalizeNodes(doc.content ?? [])
252
- };
253
- }
254
- return {
255
- type: "doc",
256
- content: []
257
- };
258
- }
259
- function normalizeNodes(nodes) {
260
- return nodes.filter((node) => isObject(node) && typeof node.type === "string").map((node) => normalizeNode(node));
261
- }
262
- function normalizeNode(node) {
263
- if (node.type === "kyroColumns") {
264
- return normalizeColumnsNode(node);
265
- }
266
- if (node.type === "kyroColumn") {
267
- const normalizedContent = normalizeNodes(
268
- Array.isArray(node.content) ? node.content : []
269
- ).filter((child) => child.type !== "kyroColumns");
270
- return {
271
- ...node,
272
- content: normalizedContent.length > 0 ? normalizedContent : [createEmptyParagraphNode()]
273
- };
274
- }
275
- if (Array.isArray(node.content)) {
276
- return {
277
- ...node,
278
- content: normalizeNodes(node.content)
279
- };
280
- }
281
- return {
282
- ...node
283
- };
284
- }
285
- function normalizeColumnsNode(node) {
286
- const rawChildren = Array.isArray(node.content) ? node.content : [];
287
- const hasStructuredColumns = rawChildren.every((child) => child?.type === "kyroColumn");
288
- const targetColumns = clampColumns(
289
- typeof node.attrs?.columns === "number" ? node.attrs.columns : hasStructuredColumns && rawChildren.length > 0 ? rawChildren.length : 2
290
- );
291
- const content = hasStructuredColumns ? normalizeStructuredColumns(rawChildren, targetColumns) : normalizeLegacyColumns(rawChildren, targetColumns);
292
- return {
293
- ...node,
294
- attrs: {
295
- ...node.attrs ?? {},
296
- columns: content.length
297
- },
298
- content
299
- };
300
- }
301
- function normalizeStructuredColumns(columns, targetColumns) {
302
- const normalized = columns.slice(0, MAX_COLUMNS).map((column) => normalizeNode(column)).filter((column) => column.type === "kyroColumn");
303
- if (normalized.length === 0) {
304
- return Array.from({ length: targetColumns }, () => createColumnNode());
305
- }
306
- if (normalized.length > targetColumns) {
307
- const kept = normalized.slice(0, targetColumns);
308
- const extras = normalized.slice(targetColumns);
309
- const mergedTail = extras.flatMap(
310
- (column) => normalizeColumnChildren(column.content)
311
- );
312
- const lastIndex = kept.length - 1;
313
- kept[lastIndex] = createColumnNode([
314
- ...normalizeColumnChildren(kept[lastIndex].content),
315
- ...mergedTail
316
- ]);
317
- return kept;
318
- }
319
- if (normalized.length < targetColumns) {
320
- return [
321
- ...normalized,
322
- ...Array.from(
323
- { length: targetColumns - normalized.length },
324
- () => createColumnNode()
325
- )
326
- ];
327
- }
328
- return normalized;
329
- }
330
- function normalizeLegacyColumns(blocks, targetColumns) {
331
- const normalizedBlocks = normalizeNodes(blocks);
332
- return Array.from({ length: targetColumns }, (_, index) => {
333
- if (index < targetColumns - 1) {
334
- const block = normalizedBlocks[index];
335
- return block ? createColumnNode([block]) : createColumnNode();
336
- }
337
- const tail = normalizedBlocks.slice(index);
338
- return createColumnNode(tail.length > 0 ? tail : [createEmptyParagraphNode()]);
339
- });
340
- }
341
- function normalizeColumnChildren(content) {
342
- const children = Array.isArray(content) ? normalizeNodes(content) : [];
343
- const filtered = children.filter((child) => child.type !== "kyroColumns");
344
- return filtered.length > 0 ? filtered : [createEmptyParagraphNode()];
345
- }
346
- function renderNodes(nodes) {
347
- return nodes.map((node) => renderNode(node)).join("");
348
- }
349
- function renderNode(node) {
350
- switch (node.type) {
351
- case "paragraph":
352
- return `<p>${renderInlineContent(node.content)}</p>`;
353
- case "text":
354
- return renderTextNode(node);
355
- case "heading": {
356
- const level = clampHeadingLevel(node.attrs?.level);
357
- return `<h${level}>${renderInlineContent(node.content)}</h${level}>`;
358
- }
359
- case "bulletList":
360
- return `<ul>${renderNodes(node.content ?? [])}</ul>`;
361
- case "orderedList":
362
- return `<ol>${renderNodes(node.content ?? [])}</ol>`;
363
- case "listItem":
364
- return `<li>${renderNodes(node.content ?? [])}</li>`;
365
- case "blockquote":
366
- return `<blockquote>${renderNodes(node.content ?? [])}</blockquote>`;
367
- case "codeBlock":
368
- return `<pre><code>${escapeHtml(extractText(node.content ?? []))}</code></pre>`;
369
- case "horizontalRule":
370
- return "<hr />";
371
- case "hardBreak":
372
- return "<br />";
373
- case "image":
374
- return renderImageNode(node);
375
- case "kyroColumns": {
376
- const columns = clampColumns(
377
- Array.isArray(node.content) ? node.content.length : 1
378
- );
379
- return `<kyro-columns data-columns="${columns}" style="--kyro-columns-count:${columns}">${renderNodes(node.content ?? [])}</kyro-columns>`;
380
- }
381
- case "kyroColumn":
382
- return `<kyro-column>${renderNodes(node.content ?? [])}</kyro-column>`;
383
- case "kyroHero":
384
- return `<kyro-hero>${renderInlineContent(node.content)}</kyro-hero>`;
385
- case "kyroHeading":
386
- return `<kyro-heading>${renderInlineContent(node.content)}</kyro-heading>`;
387
- case "kyroDivider":
388
- return '<hr class="kyro-divider" />';
389
- case "kyroCallout":
390
- return `<kyro-callout>${renderInlineContent(node.content)}</kyro-callout>`;
391
- case "kyroStack":
392
- return `<kyro-stack>${renderNodes(node.content ?? [])}</kyro-stack>`;
393
- case "kyroImage":
394
- return renderCustomMediaNode("kyro-image", node);
395
- case "kyroVideo":
396
- return renderCustomMediaNode("kyro-video", node);
397
- default:
398
- return renderNodes(node.content ?? []);
399
- }
400
- }
401
- function renderInlineContent(content) {
402
- const nodes = content ?? [];
403
- if (nodes.length === 0) {
404
- return "<br />";
405
- }
406
- return nodes.map((node) => renderNode(node)).join("");
407
- }
408
- function renderTextNode(node) {
409
- const text = typeof node.text === "string" ? escapeHtml(node.text) : "";
410
- return (node.marks ?? []).reduce((acc, mark) => applyMark(acc, mark), text);
411
- }
412
- function renderImageNode(node) {
413
- const src = typeof node.attrs?.src === "string" ? node.attrs.src : "";
414
- if (!src) {
415
- return "";
416
- }
417
- const alt = typeof node.attrs?.alt === "string" ? node.attrs.alt : "";
418
- return `<img src="${escapeAttribute(src)}" alt="${escapeAttribute(alt)}" />`;
419
- }
420
- function renderCustomMediaNode(tagName, node) {
421
- const attrs = renderAttributes(node.attrs);
422
- return `<${tagName}${attrs}></${tagName}>`;
423
- }
424
- function renderAttributes(attrs, keysToSkip = []) {
425
- if (!attrs) {
426
- return "";
427
- }
428
- const entries = Object.entries(attrs).filter(([key, value]) => !keysToSkip.includes(key) && value !== void 0 && value !== null).map(([key, value]) => `${key}="${escapeAttribute(String(value))}"`);
429
- return entries.length > 0 ? ` ${entries.join(" ")}` : "";
430
- }
431
- function applyMark(content, mark) {
432
- switch (mark.type) {
433
- case "bold":
434
- return `<strong>${content}</strong>`;
435
- case "italic":
436
- return `<em>${content}</em>`;
437
- case "underline":
438
- return `<u>${content}</u>`;
439
- case "strike":
440
- return `<s>${content}</s>`;
441
- case "code":
442
- return `<code>${content}</code>`;
443
- case "link": {
444
- const href = typeof mark.attrs?.href === "string" ? escapeAttribute(mark.attrs.href) : "#";
445
- return `<a href="${href}" target="_blank" rel="noopener noreferrer">${content}</a>`;
446
- }
447
- default:
448
- return content;
449
- }
450
- }
451
- function extractText(nodes) {
452
- return nodes.map((node) => {
453
- if (node.type === "text") {
454
- return typeof node.text === "string" ? node.text : "";
455
- }
456
- if (node.type === "hardBreak") {
457
- return "\n";
458
- }
459
- return extractText(node.content ?? []);
460
- }).join("");
461
- }
462
- function clampColumns(value) {
463
- const numericValue = typeof value === "number" ? value : Number(value);
464
- if (!Number.isFinite(numericValue)) {
465
- return 2;
466
- }
467
- return Math.max(MIN_COLUMNS, Math.min(MAX_COLUMNS, Math.round(numericValue)));
468
- }
469
- function clampHeadingLevel(level) {
470
- const numericLevel = typeof level === "number" ? level : Number(level);
471
- if (!Number.isFinite(numericLevel)) {
472
- return 2;
473
- }
474
- return Math.max(1, Math.min(6, Math.round(numericLevel)));
475
- }
476
- function escapeHtml(value) {
477
- return value.replaceAll("&", "&amp;").replaceAll("<", "&lt;").replaceAll(">", "&gt;");
478
- }
479
- function escapeAttribute(value) {
480
- return escapeHtml(value).replaceAll('"', "&quot;");
481
- }
482
- function isObject(value) {
483
- return typeof value === "object" && value !== null;
484
- }
485
-
486
- export { ALL_FIELD_TYPES, COMPLEX_FIELD_TYPES, LAYOUT_FIELD_TYPES, PRIMITIVE_FIELD_TYPES, RELATIONAL_FIELD_TYPES, createColumnNode, createColumnsNode, createEmptyParagraphNode, createRelationshipFieldConfig, isArrayField, isBlocksField, isGroupField, isImageField, isLayoutField, isNumberField, isRelationshipField, isRichTextField, isSelectField, isTextField, isUploadField, normalizeRichTextDocument, normalizeRichTextValue, renderRichText, richTextStyles };
487
- //# sourceMappingURL=chunk-Q23JB3KL.js.map
488
- //# sourceMappingURL=chunk-Q23JB3KL.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/fields/types.ts","../src/fields/richtext.ts"],"names":[],"mappings":"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","file":"chunk-Q23JB3KL.js","sourcesContent":["// ============================================================================\n// Base Field Interface\n// ============================================================================\n\nexport interface FieldAdmin {\n description?: string;\n placeholder?: string;\n readOnly?: boolean;\n hidden?: boolean;\n width?: string;\n position?: \"sidebar\" | \"main\";\n autoGenerate?: string;\n action?: string;\n method?: string;\n inline?: boolean;\n condition?: (\n data: Record<string, any>,\n siblingData: Record<string, any>,\n ) => boolean;\n}\n\nexport interface BaseField {\n name: string;\n label?: string;\n required?: boolean;\n unique?: boolean;\n indexed?: boolean;\n defaultValue?: any;\n admin?: FieldAdmin;\n validate?: (\n value: any,\n options: ValidateOptions,\n ) => string | true | Promise<string | true>;\n hooks?: {\n beforeValidate?: Hook[];\n beforeChange?: Hook[];\n afterChange?: Hook[];\n afterRead?: Hook[];\n };\n}\n\nexport interface ValidateOptions {\n data?: Record<string, any>;\n siblingData?: Record<string, any>;\n user?: any;\n operation?: string;\n required?: boolean;\n}\n\nexport type Hook = (args: any) => Promise<any> | any;\n\n// ============================================================================\n// Primitive Fields\n// ============================================================================\n\nexport type TextFieldVariant = \"text\" | \"email\" | \"password\" | \"url\" | \"id\";\n\nexport interface TextField extends BaseField {\n type: \"text\";\n variant?: TextFieldVariant;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n hasMany?: boolean;\n localized?: boolean;\n}\n\nexport interface NumberField extends BaseField {\n type: \"number\";\n min?: number;\n max?: number;\n step?: number;\n integer?: boolean;\n hasMany?: boolean;\n}\n\nexport interface CheckboxField extends BaseField {\n type: \"checkbox\";\n}\n\nexport interface DateField extends BaseField {\n type: \"date\";\n minDate?: string;\n maxDate?: string;\n time?: boolean;\n}\n\nexport interface EmailField extends BaseField {\n type: \"email\";\n}\n\nexport interface PasswordField extends BaseField {\n type: \"password\";\n}\n\nexport interface TextareaField extends BaseField {\n type: \"textarea\";\n minLength?: number;\n maxLength?: number;\n rows?: number;\n localized?: boolean;\n}\n\nexport interface SelectField extends BaseField {\n type: \"select\";\n options: Array<{ label: string; value: string }>;\n hasMany?: boolean;\n defaultValue?: string | string[];\n}\n\nexport interface RadioField extends BaseField {\n type: \"radio\";\n options: Array<{ label: string; value: string }>;\n defaultValue?: string;\n}\n\nexport interface ColorField extends BaseField {\n type: \"color\";\n format?: \"hex\" | \"rgb\" | \"hsl\";\n defaultValue?: string;\n}\n\nexport interface ImageField extends BaseField {\n type: \"image\";\n minCount?: number;\n maxCount?: number;\n allowedTypes?: string[];\n maxSize?: number;\n}\n\n// ============================================================================\n// Complex Fields\n// ============================================================================\n\nexport interface RichTextBlock {\n type: string;\n data: Record<string, any>;\n children?: RichTextBlock[];\n}\n\nexport interface RichTextField extends BaseField {\n type: \"richtext\";\n editor?: \"lexical\" | \"slate\" | \"blocks\";\n hasBlocks?: boolean;\n defaultValue?: RichTextBlock[];\n localized?: boolean;\n}\n\nexport interface JSONField extends BaseField {\n type: \"json\";\n defaultValue?: Record<string, any>;\n}\n\nexport interface CodeField extends BaseField {\n type: \"code\";\n language?: string;\n defaultValue?: string;\n}\n\nexport interface UploadField extends BaseField {\n type: \"upload\";\n relationTo: string;\n hasMany?: boolean;\n maxDepth?: number;\n defaultValue?: string;\n}\n\nexport interface MarkdownField extends BaseField {\n type: \"markdown\";\n localized?: boolean;\n defaultValue?: string;\n}\n\n// ============================================================================\n// Relational Fields\n// ============================================================================\n\nexport interface RelationshipField extends BaseField {\n type: \"relationship\";\n relationTo: string | string[];\n hasMany?: boolean;\n maxDepth?: number;\n filterOptions?: (args: { data: any; user: any }) => Record<string, any>;\n defaultValue?: string | string[];\n}\n\nexport interface ArrayField extends BaseField {\n type: \"array\";\n fields: Field[];\n minRows?: number;\n maxRows?: number;\n labels?: { singular?: string; plural?: string };\n defaultValue?: Record<string, any>[];\n}\n\nexport interface ListField extends BaseField {\n type: \"list\";\n defaultValue?: string[];\n}\n\nexport interface GroupField extends BaseField {\n type: \"group\";\n fields: Field[];\n defaultValue?: Record<string, any>;\n}\n\nexport interface BlockImage {\n url: string;\n alt?: string;\n}\n\nexport interface BlockAdmin {\n group?: string;\n images?: {\n icon?: BlockImage | string;\n thumbnail?: BlockImage | string;\n };\n}\n\nexport interface Block {\n slug: string;\n label: string;\n fields: Field[];\n imageURL?: string;\n admin?: BlockAdmin;\n}\n\nexport interface BlocksField extends BaseField {\n type: \"blocks\";\n blocks?: Block[];\n minRows?: number;\n maxRows?: number;\n defaultValue?: Array<{ blockType: string; [key: string]: any }>;\n}\n\nexport interface RowField extends Omit<BaseField, \"name\"> {\n type: \"row\";\n fields: Field[];\n name?: string;\n}\n\nexport interface CollapsibleField extends Omit<BaseField, \"name\"> {\n type: \"collapsible\";\n fields: Field[];\n label: string;\n name?: string;\n}\n\nexport interface TabsField extends Omit<BaseField, \"name\"> {\n type: \"tabs\";\n tabs: Array<{\n label: string;\n fields: Field[];\n name?: string;\n }>;\n name?: string;\n}\n\nexport interface ButtonField extends BaseField {\n type: \"button\";\n label: string;\n action?: string;\n method?: string;\n inline?: boolean;\n}\n\n// ============================================================================\n// Union Type\n// ============================================================================\n\nexport type Field =\n | TextField\n | NumberField\n | CheckboxField\n | DateField\n | EmailField\n | PasswordField\n | TextareaField\n | SelectField\n | RadioField\n | ColorField\n | ImageField\n | RichTextField\n | JSONField\n | CodeField\n | UploadField\n | MarkdownField\n | RelationshipField\n | ArrayField\n | ListField\n | GroupField\n | BlocksField\n | RowField\n | CollapsibleField\n | TabsField\n | ButtonField;\n\nexport type FieldType = Field[\"type\"];\n\n// ============================================================================\n// Field Type Guards\n// ============================================================================\n\nexport function isTextField(field: Field): field is TextField {\n return field.type === \"text\";\n}\n\nexport function isNumberField(field: Field): field is NumberField {\n return field.type === \"number\";\n}\n\nexport function isRelationshipField(field: Field): field is RelationshipField {\n return field.type === \"relationship\";\n}\n\nexport function isArrayField(field: Field): field is ArrayField {\n return field.type === \"array\";\n}\n\nexport function isGroupField(field: Field): field is GroupField {\n return field.type === \"group\";\n}\n\nexport function isBlocksField(field: Field): field is BlocksField {\n return field.type === \"blocks\";\n}\n\nexport function isUploadField(field: Field): field is UploadField {\n return field.type === \"upload\";\n}\n\nexport function isImageField(field: Field): field is ImageField {\n return field.type === \"image\";\n}\n\nexport function isRichTextField(field: Field): field is RichTextField {\n return field.type === \"richtext\";\n}\n\nexport function isSelectField(field: Field): field is SelectField {\n return field.type === \"select\";\n}\n\nexport function isLayoutField(\n field: Field,\n): field is RowField | CollapsibleField | TabsField {\n return (\n field.type === \"row\" ||\n field.type === \"collapsible\" ||\n field.type === \"tabs\"\n );\n}\n\n// ============================================================================\n// Field Type List\n// ============================================================================\n\nexport const PRIMITIVE_FIELD_TYPES = [\n \"text\",\n \"number\",\n \"checkbox\",\n \"date\",\n \"email\",\n \"password\",\n \"textarea\",\n \"select\",\n \"radio\",\n \"color\",\n] as const;\n\nexport const COMPLEX_FIELD_TYPES = [\n \"richtext\",\n \"json\",\n \"code\",\n \"upload\",\n \"image\",\n \"markdown\",\n] as const;\n\nexport const RELATIONAL_FIELD_TYPES = [\n \"relationship\",\n \"array\",\n \"group\",\n \"blocks\",\n] as const;\n\nexport const LAYOUT_FIELD_TYPES = [\"row\", \"collapsible\", \"tabs\"] as const;\n\nexport const ALL_FIELD_TYPES = [\n ...PRIMITIVE_FIELD_TYPES,\n ...COMPLEX_FIELD_TYPES,\n ...RELATIONAL_FIELD_TYPES,\n ...LAYOUT_FIELD_TYPES,\n] as const;\n\n// ============================================================================\n// Field Factory Functions\n// ============================================================================\n\nexport function createRelationshipFieldConfig(\n name: string,\n relationTo: string | string[],\n options?: Partial<Omit<RelationshipField, \"type\" | \"name\" | \"relationTo\">>,\n): RelationshipField {\n return {\n name,\n type: \"relationship\",\n relationTo,\n ...options,\n required: options?.required ?? false,\n };\n}\n","const MIN_COLUMNS = 1;\nconst MAX_COLUMNS = 6;\n\nexport interface RichTextMark {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nexport interface RichTextNode {\n type?: string;\n attrs?: Record<string, unknown>;\n content?: RichTextNode[];\n text?: string;\n marks?: RichTextMark[];\n [key: string]: unknown;\n}\n\nexport interface RichTextDocument extends RichTextNode {\n type: \"doc\";\n content: RichTextNode[];\n}\n\nexport const richTextStyles = `\n.kyro-richtext {\n color: inherit;\n line-height: 1.7;\n}\n\n.kyro-richtext > *:first-child {\n margin-top: 0;\n}\n\n.kyro-richtext > *:last-child {\n margin-bottom: 0;\n}\n\n.kyro-richtext p,\n.kyro-richtext ul,\n.kyro-richtext ol,\n.kyro-richtext blockquote,\n.kyro-richtext pre,\n.kyro-richtext kyro-callout,\n.kyro-richtext kyro-hero,\n.kyro-richtext kyro-heading,\n.kyro-richtext kyro-stack,\n.kyro-richtext kyro-columns {\n margin: 0 0 1rem;\n}\n\n.kyro-richtext h1,\n.kyro-richtext h2,\n.kyro-richtext h3,\n.kyro-richtext h4,\n.kyro-richtext h5,\n.kyro-richtext h6 {\n margin: 0 0 0.75rem;\n line-height: 1.2;\n}\n\n.kyro-richtext ul,\n.kyro-richtext ol {\n padding-left: 1.5rem;\n}\n\n.kyro-richtext blockquote {\n border-left: 4px solid rgba(148, 163, 184, 0.5);\n margin-left: 0;\n padding-left: 1rem;\n font-style: italic;\n}\n\n.kyro-richtext pre {\n overflow-x: auto;\n border-radius: 0.75rem;\n background: rgba(15, 23, 42, 0.92);\n color: #f8fafc;\n padding: 1rem;\n}\n\n.kyro-richtext code {\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n}\n\n.kyro-richtext img {\n display: block;\n max-width: 100%;\n height: auto;\n border-radius: 0.75rem;\n}\n\n.kyro-richtext kyro-columns {\n display: grid;\n grid-template-columns: repeat(var(--kyro-columns-count, 1), minmax(0, 1fr));\n gap: 1rem;\n}\n\n.kyro-richtext kyro-column {\n display: block;\n min-width: 0;\n}\n\n.kyro-richtext kyro-column > *:last-child {\n margin-bottom: 0;\n}\n\n.kyro-richtext kyro-hero,\n.kyro-richtext kyro-callout,\n.kyro-richtext kyro-stack,\n.kyro-richtext kyro-heading {\n display: block;\n}\n\n.kyro-richtext kyro-hero {\n border: 1px solid rgba(148, 163, 184, 0.25);\n border-radius: 1rem;\n padding: 1.5rem;\n text-align: center;\n background: linear-gradient(to bottom, rgba(148, 163, 184, 0.12), transparent);\n}\n\n.kyro-richtext kyro-heading {\n font-size: 1.125rem;\n font-weight: 700;\n}\n\n.kyro-richtext kyro-callout {\n border: 1px solid rgba(59, 130, 246, 0.25);\n border-radius: 0.875rem;\n padding: 0.875rem 1rem;\n background: rgba(59, 130, 246, 0.06);\n}\n\n@media (max-width: 720px) {\n .kyro-richtext kyro-columns {\n grid-template-columns: 1fr;\n }\n}\n`.trim();\n\nexport function createEmptyParagraphNode(): RichTextNode {\n return {\n type: \"paragraph\",\n content: [],\n };\n}\n\nexport function createColumnNode(content: RichTextNode[] = [createEmptyParagraphNode()]): RichTextNode {\n return {\n type: \"kyroColumn\",\n content: content.length > 0 ? content : [createEmptyParagraphNode()],\n };\n}\n\nexport function createColumnsNode(columns = 2): RichTextNode {\n const count = clampColumns(columns);\n return {\n type: \"kyroColumns\",\n attrs: { columns: count },\n content: Array.from({ length: count }, () => createColumnNode()),\n };\n}\n\nexport function normalizeRichTextDocument(value: unknown): RichTextDocument {\n const documentNode = toRichTextDocument(value);\n return {\n type: \"doc\",\n content: normalizeNodes(documentNode.content),\n };\n}\n\nexport function normalizeRichTextValue<T>(value: T): T {\n if (Array.isArray(value)) {\n return normalizeRichTextDocument(value).content as T;\n }\n\n if (isObject(value) && (value as RichTextNode).type === \"doc\") {\n return normalizeRichTextDocument(value) as T;\n }\n\n return value;\n}\n\nexport function renderRichText(value: unknown): string {\n if (typeof value === \"string\") {\n return `<div class=\"kyro-richtext\">${value}</div>`;\n }\n\n const documentNode = normalizeRichTextDocument(value);\n return `<div class=\"kyro-richtext\">${renderNodes(documentNode.content)}</div>`;\n}\n\nfunction toRichTextDocument(value: unknown): RichTextDocument {\n if (Array.isArray(value)) {\n return {\n type: \"doc\",\n content: normalizeNodes(value as RichTextNode[]),\n };\n }\n\n if (isObject(value) && (value as RichTextNode).type === \"doc\") {\n const doc = value as RichTextDocument;\n return {\n type: \"doc\",\n content: normalizeNodes(doc.content ?? []),\n };\n }\n\n return {\n type: \"doc\",\n content: [],\n };\n}\n\nfunction normalizeNodes(nodes: RichTextNode[]): RichTextNode[] {\n return nodes\n .filter((node) => isObject(node) && typeof node.type === \"string\")\n .map((node) => normalizeNode(node));\n}\n\nfunction normalizeNode(node: RichTextNode): RichTextNode {\n if (node.type === \"kyroColumns\") {\n return normalizeColumnsNode(node);\n }\n\n if (node.type === \"kyroColumn\") {\n const normalizedContent = normalizeNodes(\n Array.isArray(node.content) ? node.content : [],\n ).filter((child) => child.type !== \"kyroColumns\");\n\n return {\n ...node,\n content:\n normalizedContent.length > 0\n ? normalizedContent\n : [createEmptyParagraphNode()],\n };\n }\n\n if (Array.isArray(node.content)) {\n return {\n ...node,\n content: normalizeNodes(node.content),\n };\n }\n\n return {\n ...node,\n };\n}\n\nfunction normalizeColumnsNode(node: RichTextNode): RichTextNode {\n const rawChildren = Array.isArray(node.content) ? node.content : [];\n const hasStructuredColumns = rawChildren.every((child) => child?.type === \"kyroColumn\");\n const targetColumns = clampColumns(\n typeof node.attrs?.columns === \"number\"\n ? node.attrs.columns\n : hasStructuredColumns && rawChildren.length > 0\n ? rawChildren.length\n : 2,\n );\n\n const content = hasStructuredColumns\n ? normalizeStructuredColumns(rawChildren, targetColumns)\n : normalizeLegacyColumns(rawChildren, targetColumns);\n\n return {\n ...node,\n attrs: {\n ...(node.attrs ?? {}),\n columns: content.length,\n },\n content,\n };\n}\n\nfunction normalizeStructuredColumns(\n columns: RichTextNode[],\n targetColumns: number,\n): RichTextNode[] {\n const normalized = columns\n .slice(0, MAX_COLUMNS)\n .map((column) => normalizeNode(column))\n .filter((column) => column.type === \"kyroColumn\");\n\n if (normalized.length === 0) {\n return Array.from({ length: targetColumns }, () => createColumnNode());\n }\n\n if (normalized.length > targetColumns) {\n const kept = normalized.slice(0, targetColumns);\n const extras = normalized.slice(targetColumns);\n const mergedTail = extras.flatMap((column) =>\n normalizeColumnChildren(column.content),\n );\n\n const lastIndex = kept.length - 1;\n kept[lastIndex] = createColumnNode([\n ...normalizeColumnChildren(kept[lastIndex].content),\n ...mergedTail,\n ]);\n return kept;\n }\n\n if (normalized.length < targetColumns) {\n return [\n ...normalized,\n ...Array.from({ length: targetColumns - normalized.length }, () =>\n createColumnNode(),\n ),\n ];\n }\n\n return normalized;\n}\n\nfunction normalizeLegacyColumns(\n blocks: RichTextNode[],\n targetColumns: number,\n): RichTextNode[] {\n const normalizedBlocks = normalizeNodes(blocks);\n\n return Array.from({ length: targetColumns }, (_, index) => {\n if (index < targetColumns - 1) {\n const block = normalizedBlocks[index];\n return block ? createColumnNode([block]) : createColumnNode();\n }\n\n const tail = normalizedBlocks.slice(index);\n return createColumnNode(tail.length > 0 ? tail : [createEmptyParagraphNode()]);\n });\n}\n\nfunction normalizeColumnChildren(content: unknown): RichTextNode[] {\n const children = Array.isArray(content) ? normalizeNodes(content as RichTextNode[]) : [];\n const filtered = children.filter((child) => child.type !== \"kyroColumns\");\n return filtered.length > 0 ? filtered : [createEmptyParagraphNode()];\n}\n\nfunction renderNodes(nodes: RichTextNode[]): string {\n return nodes.map((node) => renderNode(node)).join(\"\");\n}\n\nfunction renderNode(node: RichTextNode): string {\n switch (node.type) {\n case \"paragraph\":\n return `<p>${renderInlineContent(node.content)}</p>`;\n case \"text\":\n return renderTextNode(node);\n case \"heading\": {\n const level = clampHeadingLevel(node.attrs?.level);\n return `<h${level}>${renderInlineContent(node.content)}</h${level}>`;\n }\n case \"bulletList\":\n return `<ul>${renderNodes(node.content ?? [])}</ul>`;\n case \"orderedList\":\n return `<ol>${renderNodes(node.content ?? [])}</ol>`;\n case \"listItem\":\n return `<li>${renderNodes(node.content ?? [])}</li>`;\n case \"blockquote\":\n return `<blockquote>${renderNodes(node.content ?? [])}</blockquote>`;\n case \"codeBlock\":\n return `<pre><code>${escapeHtml(extractText(node.content ?? []))}</code></pre>`;\n case \"horizontalRule\":\n return \"<hr />\";\n case \"hardBreak\":\n return \"<br />\";\n case \"image\":\n return renderImageNode(node);\n case \"kyroColumns\": {\n const columns = clampColumns(\n Array.isArray(node.content) ? node.content.length : 1,\n );\n return `<kyro-columns data-columns=\"${columns}\" style=\"--kyro-columns-count:${columns}\">${renderNodes(node.content ?? [])}</kyro-columns>`;\n }\n case \"kyroColumn\":\n return `<kyro-column>${renderNodes(node.content ?? [])}</kyro-column>`;\n case \"kyroHero\":\n return `<kyro-hero>${renderInlineContent(node.content)}</kyro-hero>`;\n case \"kyroHeading\":\n return `<kyro-heading>${renderInlineContent(node.content)}</kyro-heading>`;\n case \"kyroDivider\":\n return \"<hr class=\\\"kyro-divider\\\" />\";\n case \"kyroCallout\":\n return `<kyro-callout>${renderInlineContent(node.content)}</kyro-callout>`;\n case \"kyroStack\":\n return `<kyro-stack>${renderNodes(node.content ?? [])}</kyro-stack>`;\n case \"kyroImage\":\n return renderCustomMediaNode(\"kyro-image\", node);\n case \"kyroVideo\":\n return renderCustomMediaNode(\"kyro-video\", node);\n default:\n return renderNodes(node.content ?? []);\n }\n}\n\nfunction renderInlineContent(content?: RichTextNode[]): string {\n const nodes = content ?? [];\n if (nodes.length === 0) {\n return \"<br />\";\n }\n return nodes.map((node) => renderNode(node)).join(\"\");\n}\n\nfunction renderTextNode(node: RichTextNode): string {\n const text = typeof node.text === \"string\" ? escapeHtml(node.text) : \"\";\n return (node.marks ?? []).reduce((acc, mark) => applyMark(acc, mark), text);\n}\n\nfunction renderImageNode(node: RichTextNode): string {\n const src = typeof node.attrs?.src === \"string\" ? node.attrs.src : \"\";\n if (!src) {\n return \"\";\n }\n\n const alt = typeof node.attrs?.alt === \"string\" ? node.attrs.alt : \"\";\n return `<img src=\"${escapeAttribute(src)}\" alt=\"${escapeAttribute(alt)}\" />`;\n}\n\nfunction renderCustomMediaNode(tagName: string, node: RichTextNode): string {\n const attrs = renderAttributes(node.attrs);\n return `<${tagName}${attrs}></${tagName}>`;\n}\n\nfunction renderAttributes(\n attrs: Record<string, unknown> | undefined,\n keysToSkip: string[] = [],\n): string {\n if (!attrs) {\n return \"\";\n }\n\n const entries = Object.entries(attrs)\n .filter(([key, value]) => !keysToSkip.includes(key) && value !== undefined && value !== null)\n .map(([key, value]) => `${key}=\"${escapeAttribute(String(value))}\"`);\n\n return entries.length > 0 ? ` ${entries.join(\" \")}` : \"\";\n}\n\nfunction applyMark(content: string, mark: RichTextMark): string {\n switch (mark.type) {\n case \"bold\":\n return `<strong>${content}</strong>`;\n case \"italic\":\n return `<em>${content}</em>`;\n case \"underline\":\n return `<u>${content}</u>`;\n case \"strike\":\n return `<s>${content}</s>`;\n case \"code\":\n return `<code>${content}</code>`;\n case \"link\": {\n const href =\n typeof mark.attrs?.href === \"string\" ? escapeAttribute(mark.attrs.href) : \"#\";\n return `<a href=\"${href}\" target=\"_blank\" rel=\"noopener noreferrer\">${content}</a>`;\n }\n default:\n return content;\n }\n}\n\nfunction extractText(nodes: RichTextNode[]): string {\n return nodes\n .map((node) => {\n if (node.type === \"text\") {\n return typeof node.text === \"string\" ? node.text : \"\";\n }\n\n if (node.type === \"hardBreak\") {\n return \"\\n\";\n }\n\n return extractText(node.content ?? []);\n })\n .join(\"\");\n}\n\nfunction clampColumns(value: unknown): number {\n const numericValue = typeof value === \"number\" ? value : Number(value);\n if (!Number.isFinite(numericValue)) {\n return 2;\n }\n return Math.max(MIN_COLUMNS, Math.min(MAX_COLUMNS, Math.round(numericValue)));\n}\n\nfunction clampHeadingLevel(level: unknown): number {\n const numericLevel = typeof level === \"number\" ? level : Number(level);\n if (!Number.isFinite(numericLevel)) {\n return 2;\n }\n return Math.max(1, Math.min(6, Math.round(numericLevel)));\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll(\"&\", \"&amp;\")\n .replaceAll(\"<\", \"&lt;\")\n .replaceAll(\">\", \"&gt;\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHtml(value).replaceAll('\"', \"&quot;\");\n}\n\nfunction isObject(value: unknown): value is Record<string, any> {\n return typeof value === \"object\" && value !== null;\n}\n"]}