@kyro-cms/core 0.9.0 → 0.9.2

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 (265) hide show
  1. package/README.md +55 -593
  2. package/dist/{WebhookService-AefJfqX0.d.cts → WebhookService-BKszZlG0.d.cts} +1 -1
  3. package/dist/{WebhookService-118ZTFis.d.ts → WebhookService-Ccf1j-IN.d.ts} +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 +33 -99
  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 +21 -97
  21. package/dist/api-handler.js.map +1 -1
  22. package/dist/{tenant-B1YB0Jy8.d.ts → base-CIuXkrH4.d.cts} +7 -15
  23. package/dist/{tenant-Cpeveji6.d.cts → base-fFo4lqER.d.ts} +7 -15
  24. package/dist/bootstrap-3PV3GJ3S.js +7 -0
  25. package/dist/{bootstrap-JCML6NFO.js.map → bootstrap-3PV3GJ3S.js.map} +1 -1
  26. package/dist/bootstrap-4CELFLJO.cjs +32 -0
  27. package/dist/{bootstrap-AKAUP6F6.cjs.map → bootstrap-4CELFLJO.cjs.map} +1 -1
  28. package/dist/{chunk-VJT6P4N6.cjs → chunk-3HR772HI.cjs} +199 -32
  29. package/dist/chunk-3HR772HI.cjs.map +1 -0
  30. package/dist/chunk-3KTWGODI.cjs +178 -0
  31. package/dist/chunk-3KTWGODI.cjs.map +1 -0
  32. package/dist/{chunk-QXIQWPAP.js → chunk-3UK5XBVJ.js} +4 -134
  33. package/dist/chunk-3UK5XBVJ.js.map +1 -0
  34. package/dist/{chunk-FXYP2HA6.js → chunk-4AO3A3JM.js} +48 -4
  35. package/dist/chunk-4AO3A3JM.js.map +1 -0
  36. package/dist/{chunk-Z6ZWNWWR.js → chunk-4CV4JOE5.js} +3 -9
  37. package/dist/{chunk-Z6ZWNWWR.js.map → chunk-4CV4JOE5.js.map} +1 -1
  38. package/dist/chunk-4M7X5HAB.cjs +173 -0
  39. package/dist/chunk-4M7X5HAB.cjs.map +1 -0
  40. package/dist/chunk-53NYVYVX.js +3243 -0
  41. package/dist/chunk-53NYVYVX.js.map +1 -0
  42. package/dist/{chunk-35U3FROB.js → chunk-5H3MWQJS.js} +714 -184
  43. package/dist/chunk-5H3MWQJS.js.map +1 -0
  44. package/dist/{chunk-YVUJBEXE.cjs → chunk-5PMQQFRE.cjs} +16 -7
  45. package/dist/chunk-5PMQQFRE.cjs.map +1 -0
  46. package/dist/{chunk-57P6MJKC.js → chunk-6UNONDW7.js} +94 -10
  47. package/dist/chunk-6UNONDW7.js.map +1 -0
  48. package/dist/{chunk-Y3N7UUDO.js → chunk-7OGPN7MP.js} +5 -2
  49. package/dist/chunk-7OGPN7MP.js.map +1 -0
  50. package/dist/{chunk-2OL4O2TH.cjs → chunk-7OS7TX2Q.cjs} +68 -62
  51. package/dist/chunk-7OS7TX2Q.cjs.map +1 -0
  52. package/dist/{chunk-3TPQ2BU6.js → chunk-BYBMTIMT.js} +2 -6
  53. package/dist/chunk-BYBMTIMT.js.map +1 -0
  54. package/dist/{chunk-ES5HNFFT.js → chunk-CF7OL6HR.js} +4 -2
  55. package/dist/chunk-CF7OL6HR.js.map +1 -0
  56. package/dist/chunk-CJONKRHJ.js +162 -0
  57. package/dist/chunk-CJONKRHJ.js.map +1 -0
  58. package/dist/{chunk-OHVB4AJ7.js → chunk-CJX74IYK.js} +24 -18
  59. package/dist/chunk-CJX74IYK.js.map +1 -0
  60. package/dist/{chunk-5KVM3WEY.cjs → chunk-CNKT4PME.cjs} +1592 -868
  61. package/dist/chunk-CNKT4PME.cjs.map +1 -0
  62. package/dist/{chunk-G7VZBCD6.cjs → chunk-CZLDE2OZ.cjs} +2 -9
  63. package/dist/{chunk-G7VZBCD6.cjs.map → chunk-CZLDE2OZ.cjs.map} +1 -1
  64. package/dist/{chunk-WQBRWOQT.cjs → chunk-DPA3KWPY.cjs} +4 -3
  65. package/dist/chunk-DPA3KWPY.cjs.map +1 -0
  66. package/dist/{chunk-LINKCEG4.cjs → chunk-E2763JUP.cjs} +726 -196
  67. package/dist/chunk-E2763JUP.cjs.map +1 -0
  68. package/dist/chunk-E5UJBLQ7.js +220 -0
  69. package/dist/chunk-E5UJBLQ7.js.map +1 -0
  70. package/dist/{chunk-DVD5P72E.cjs → chunk-EEJUFDMF.cjs} +2 -6
  71. package/dist/chunk-EEJUFDMF.cjs.map +1 -0
  72. package/dist/chunk-FSKONGCX.cjs +253 -0
  73. package/dist/chunk-FSKONGCX.cjs.map +1 -0
  74. package/dist/{chunk-Y3QQN7PN.js → chunk-GAAHG2Z4.js} +13 -4
  75. package/dist/chunk-GAAHG2Z4.js.map +1 -0
  76. package/dist/chunk-GAOXD3XT.js +175 -0
  77. package/dist/chunk-GAOXD3XT.js.map +1 -0
  78. package/dist/{chunk-SA7NSSIQ.cjs → chunk-GUUB5EAG.cjs} +13 -187
  79. package/dist/chunk-GUUB5EAG.cjs.map +1 -0
  80. package/dist/{chunk-4DA7QPLA.cjs → chunk-GXFOGU7N.cjs} +5 -2
  81. package/dist/chunk-GXFOGU7N.cjs.map +1 -0
  82. package/dist/{chunk-I7HHI6QV.cjs → chunk-IDVRRRAK.cjs} +17 -9
  83. package/dist/chunk-IDVRRRAK.cjs.map +1 -0
  84. package/dist/{chunk-HXRD4B37.js → chunk-IPTZM3VE.js} +1423 -704
  85. package/dist/chunk-IPTZM3VE.js.map +1 -0
  86. package/dist/chunk-KC2GDBLS.cjs +84 -0
  87. package/dist/chunk-KC2GDBLS.cjs.map +1 -0
  88. package/dist/{chunk-QUW2RZTM.cjs → chunk-L46ROHUS.cjs} +51 -7
  89. package/dist/chunk-L46ROHUS.cjs.map +1 -0
  90. package/dist/chunk-L4EZKIEX.js +185 -0
  91. package/dist/chunk-L4EZKIEX.js.map +1 -0
  92. package/dist/{chunk-REK7AYOC.js → chunk-L5UKKZQN.js} +199 -32
  93. package/dist/chunk-L5UKKZQN.js.map +1 -0
  94. package/dist/chunk-NKPKR5BW.cjs +188 -0
  95. package/dist/chunk-NKPKR5BW.cjs.map +1 -0
  96. package/dist/chunk-NWUEVLQT.cjs +99 -0
  97. package/dist/chunk-NWUEVLQT.cjs.map +1 -0
  98. package/dist/{chunk-3AJE4SEG.js → chunk-OHC6UHFY.js} +208 -76
  99. package/dist/chunk-OHC6UHFY.js.map +1 -0
  100. package/dist/chunk-PHJRNPHY.cjs +3291 -0
  101. package/dist/chunk-PHJRNPHY.cjs.map +1 -0
  102. package/dist/{chunk-DXHRBMGB.js → chunk-PQ72Z6WC.js} +67 -112
  103. package/dist/chunk-PQ72Z6WC.js.map +1 -0
  104. package/dist/{chunk-K7JPTH3G.cjs → chunk-PV2I2KMI.cjs} +214 -82
  105. package/dist/chunk-PV2I2KMI.cjs.map +1 -0
  106. package/dist/{chunk-PDYFVNUX.cjs → chunk-Q23GAMLE.cjs} +71 -116
  107. package/dist/chunk-Q23GAMLE.cjs.map +1 -0
  108. package/dist/{chunk-H727JIG7.js → chunk-Q72BOAPK.js} +16 -8
  109. package/dist/chunk-Q72BOAPK.js.map +1 -0
  110. package/dist/{chunk-IBG6V56E.cjs → chunk-QFLB4EIJ.cjs} +2 -139
  111. package/dist/chunk-QFLB4EIJ.cjs.map +1 -0
  112. package/dist/{chunk-2KVHZE6O.cjs → chunk-RFFSZSCL.cjs} +282 -190
  113. package/dist/chunk-RFFSZSCL.cjs.map +1 -0
  114. package/dist/{chunk-V3LKPM3O.cjs → chunk-SHTTJMLT.cjs} +4 -2
  115. package/dist/chunk-SHTTJMLT.cjs.map +1 -0
  116. package/dist/{chunk-WOWUL7ZY.js → chunk-UUDTPZX6.js} +5 -4
  117. package/dist/chunk-UUDTPZX6.js.map +1 -0
  118. package/dist/{chunk-QPPDLRNR.js → chunk-V7KZQIZ6.js} +277 -185
  119. package/dist/chunk-V7KZQIZ6.js.map +1 -0
  120. package/dist/{chunk-3ZFYL34R.js → chunk-WXVB364T.js} +12 -185
  121. package/dist/chunk-WXVB364T.js.map +1 -0
  122. package/dist/chunk-XEB7PH2E.js +81 -0
  123. package/dist/chunk-XEB7PH2E.js.map +1 -0
  124. package/dist/{chunk-IA6AU5PI.cjs → chunk-Y7AQK4R4.cjs} +94 -10
  125. package/dist/chunk-Y7AQK4R4.cjs.map +1 -0
  126. package/dist/chunk-YFAVQQTU.js +92 -0
  127. package/dist/chunk-YFAVQQTU.js.map +1 -0
  128. package/dist/cli/index.cjs +6 -6
  129. package/dist/cli/index.cjs.map +1 -1
  130. package/dist/cli/index.js +6 -6
  131. package/dist/cli/index.js.map +1 -1
  132. package/dist/client.cjs +4 -4
  133. package/dist/client.d.cts +3 -3
  134. package/dist/client.d.ts +3 -3
  135. package/dist/client.js +2 -2
  136. package/dist/drizzle/index.cjs +15 -14
  137. package/dist/drizzle/index.d.cts +10 -14
  138. package/dist/drizzle/index.d.ts +10 -14
  139. package/dist/drizzle/index.js +6 -5
  140. package/dist/fields/index.cjs +22 -38
  141. package/dist/fields/index.d.cts +2 -22
  142. package/dist/fields/index.d.ts +2 -22
  143. package/dist/fields/index.js +2 -2
  144. package/dist/graphql/index.cjs +6 -5
  145. package/dist/graphql/index.d.cts +5 -3
  146. package/dist/graphql/index.d.ts +5 -3
  147. package/dist/graphql/index.js +4 -3
  148. package/dist/index-BKta3cBH.d.cts +277 -0
  149. package/dist/index-ClOqnkTO.d.ts +277 -0
  150. package/dist/index.cjs +310 -168
  151. package/dist/index.cjs.map +1 -1
  152. package/dist/index.d.cts +130 -211
  153. package/dist/index.d.ts +130 -211
  154. package/dist/index.js +174 -35
  155. package/dist/index.js.map +1 -1
  156. package/dist/integration.cjs +3 -3
  157. package/dist/integration.js +2 -2
  158. package/dist/media-7WDX4BDJ.js +4 -0
  159. package/dist/{media-GPPTZ43E.js.map → media-7WDX4BDJ.js.map} +1 -1
  160. package/dist/{media-XNTUFJZR.cjs → media-TUSLVRQ6.cjs} +3 -3
  161. package/dist/{media-XNTUFJZR.cjs.map → media-TUSLVRQ6.cjs.map} +1 -1
  162. package/dist/mongo-auth-adapter-GT4S7SCU.cjs +17 -0
  163. package/dist/{mongo-auth-adapter-NHHUJHVH.cjs.map → mongo-auth-adapter-GT4S7SCU.cjs.map} +1 -1
  164. package/dist/mongo-auth-adapter-M7VV4LNB.js +4 -0
  165. package/dist/{mongo-auth-adapter-NJQUUCTP.js.map → mongo-auth-adapter-M7VV4LNB.js.map} +1 -1
  166. package/dist/mongodb/index.cjs +9 -8
  167. package/dist/mongodb/index.d.cts +6 -13
  168. package/dist/mongodb/index.d.ts +6 -13
  169. package/dist/mongodb/index.js +5 -4
  170. package/dist/postgres-auth-adapter-AFAPISH7.js +5 -0
  171. package/dist/{postgres-auth-adapter-3T2NKTSE.js.map → postgres-auth-adapter-AFAPISH7.js.map} +1 -1
  172. package/dist/postgres-auth-adapter-SFDTLONT.cjs +14 -0
  173. package/dist/{postgres-auth-adapter-7IEENCKQ.cjs.map → postgres-auth-adapter-SFDTLONT.cjs.map} +1 -1
  174. package/dist/redis-adapter-UQX4EE3B.cjs +13 -0
  175. package/dist/{redis-adapter-D2E2S3GB.cjs.map → redis-adapter-UQX4EE3B.cjs.map} +1 -1
  176. package/dist/redis-adapter-XALOGWY3.js +4 -0
  177. package/dist/{redis-adapter-VQXD7ESY.js.map → redis-adapter-XALOGWY3.js.map} +1 -1
  178. package/dist/rest/index.cjs +16 -15
  179. package/dist/rest/index.d.cts +4 -4
  180. package/dist/rest/index.d.ts +4 -4
  181. package/dist/rest/index.js +14 -13
  182. package/dist/{schema-37SE2F4B.cjs → schema-6QL3USNB.cjs} +15 -15
  183. package/dist/{schema-37SE2F4B.cjs.map → schema-6QL3USNB.cjs.map} +1 -1
  184. package/dist/{schema-5PHL5IVB.js → schema-FNNWEAAW.js} +4 -4
  185. package/dist/{schema-5PHL5IVB.js.map → schema-FNNWEAAW.js.map} +1 -1
  186. package/dist/sqlite-adapter-AQB5TCGV.cjs +13 -0
  187. package/dist/{sqlite-adapter-LVK5PS4T.cjs.map → sqlite-adapter-AQB5TCGV.cjs.map} +1 -1
  188. package/dist/sqlite-adapter-N5H6IM2X.js +4 -0
  189. package/dist/{sqlite-adapter-TR3U3W6Q.js.map → sqlite-adapter-N5H6IM2X.js.map} +1 -1
  190. package/dist/templates/index.cjs +134 -32
  191. package/dist/templates/index.d.cts +52 -9
  192. package/dist/templates/index.d.ts +52 -9
  193. package/dist/templates/index.js +4 -2
  194. package/dist/trpc/index.cjs +14 -13
  195. package/dist/trpc/index.d.cts +55 -49
  196. package/dist/trpc/index.d.ts +55 -49
  197. package/dist/trpc/index.js +5 -4
  198. package/dist/{types-D6ZLRGbH.d.cts → types-CpjuXbe7.d.cts} +2 -0
  199. package/dist/{types-D6ZLRGbH.d.ts → types-CpjuXbe7.d.ts} +2 -0
  200. package/dist/{types-VtjUxIMp.d.cts → types-DeSApf9T.d.cts} +36 -14
  201. package/dist/{types-VtjUxIMp.d.ts → types-DeSApf9T.d.ts} +36 -14
  202. package/dist/{types-J3R9nVsZ.d.cts → types-Dgzlftb7.d.ts} +32 -28
  203. package/dist/{types-Bs1up4yP.d.ts → types-Ds0tCA3L.d.cts} +32 -28
  204. package/dist/ws/index.cjs +6 -6
  205. package/dist/ws/index.js +2 -2
  206. package/package.json +22 -4
  207. package/dist/bootstrap-AKAUP6F6.cjs +0 -32
  208. package/dist/bootstrap-JCML6NFO.js +0 -7
  209. package/dist/chunk-2KVHZE6O.cjs.map +0 -1
  210. package/dist/chunk-2OL4O2TH.cjs.map +0 -1
  211. package/dist/chunk-35U3FROB.js.map +0 -1
  212. package/dist/chunk-3AJE4SEG.js.map +0 -1
  213. package/dist/chunk-3J4MFTI3.js +0 -3872
  214. package/dist/chunk-3J4MFTI3.js.map +0 -1
  215. package/dist/chunk-3TPQ2BU6.js.map +0 -1
  216. package/dist/chunk-3ZFYL34R.js.map +0 -1
  217. package/dist/chunk-4DA7QPLA.cjs.map +0 -1
  218. package/dist/chunk-57P6MJKC.js.map +0 -1
  219. package/dist/chunk-5KVM3WEY.cjs.map +0 -1
  220. package/dist/chunk-6IMPH6WV.cjs +0 -3897
  221. package/dist/chunk-6IMPH6WV.cjs.map +0 -1
  222. package/dist/chunk-ATBOUGQP.cjs +0 -513
  223. package/dist/chunk-ATBOUGQP.cjs.map +0 -1
  224. package/dist/chunk-DVD5P72E.cjs.map +0 -1
  225. package/dist/chunk-DXHRBMGB.js.map +0 -1
  226. package/dist/chunk-ES5HNFFT.js.map +0 -1
  227. package/dist/chunk-FXYP2HA6.js.map +0 -1
  228. package/dist/chunk-H727JIG7.js.map +0 -1
  229. package/dist/chunk-HXRD4B37.js.map +0 -1
  230. package/dist/chunk-I7HHI6QV.cjs.map +0 -1
  231. package/dist/chunk-IA6AU5PI.cjs.map +0 -1
  232. package/dist/chunk-IBG6V56E.cjs.map +0 -1
  233. package/dist/chunk-K7JPTH3G.cjs.map +0 -1
  234. package/dist/chunk-LINKCEG4.cjs.map +0 -1
  235. package/dist/chunk-OHVB4AJ7.js.map +0 -1
  236. package/dist/chunk-PDYFVNUX.cjs.map +0 -1
  237. package/dist/chunk-Q23JB3KL.js +0 -488
  238. package/dist/chunk-Q23JB3KL.js.map +0 -1
  239. package/dist/chunk-QPPDLRNR.js.map +0 -1
  240. package/dist/chunk-QUW2RZTM.cjs.map +0 -1
  241. package/dist/chunk-QXIQWPAP.js.map +0 -1
  242. package/dist/chunk-R3XIBBAW.cjs +0 -34
  243. package/dist/chunk-R3XIBBAW.cjs.map +0 -1
  244. package/dist/chunk-REK7AYOC.js.map +0 -1
  245. package/dist/chunk-SA7NSSIQ.cjs.map +0 -1
  246. package/dist/chunk-SDMNUYVU.js +0 -30
  247. package/dist/chunk-SDMNUYVU.js.map +0 -1
  248. package/dist/chunk-V3LKPM3O.cjs.map +0 -1
  249. package/dist/chunk-VJT6P4N6.cjs.map +0 -1
  250. package/dist/chunk-WOWUL7ZY.js.map +0 -1
  251. package/dist/chunk-WQBRWOQT.cjs.map +0 -1
  252. package/dist/chunk-Y3N7UUDO.js.map +0 -1
  253. package/dist/chunk-Y3QQN7PN.js.map +0 -1
  254. package/dist/chunk-YVUJBEXE.cjs.map +0 -1
  255. package/dist/index-CLp-DRKA.d.ts +0 -64
  256. package/dist/index-DfO7G4kN.d.cts +0 -64
  257. package/dist/media-GPPTZ43E.js +0 -4
  258. package/dist/mongo-auth-adapter-NHHUJHVH.cjs +0 -17
  259. package/dist/mongo-auth-adapter-NJQUUCTP.js +0 -4
  260. package/dist/postgres-auth-adapter-3T2NKTSE.js +0 -5
  261. package/dist/postgres-auth-adapter-7IEENCKQ.cjs +0 -14
  262. package/dist/redis-adapter-D2E2S3GB.cjs +0 -13
  263. package/dist/redis-adapter-VQXD7ESY.js +0 -4
  264. package/dist/sqlite-adapter-LVK5PS4T.cjs +0 -13
  265. package/dist/sqlite-adapter-TR3U3W6Q.js +0 -4
@@ -1,12 +1,15 @@
1
- import { B as BaseAdapter, C as CollectionConfig, G as GlobalConfig, F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, e as UpdateArgs, D as DeleteArgs, f as FindVersionsArgs, g as VersionRecord, h as CreateVersionArgs, i as DraftFindArgs, j as DraftSnapshot, k as DraftUpsertArgs, l as DraftDeleteArgs } from './types-J3R9nVsZ.cjs';
2
- import { F as Field, j as RelationshipField, U as UploadField } from './types-VtjUxIMp.cjs';
1
+ import { B as BaseAdapter, C as CollectionConfig, G as GlobalConfig, T as TenantContext, F as FindArgs, b as FindResult, c as FindByIDArgs, d as CreateArgs, e as UpdateArgs, D as DeleteArgs, f as FindVersionsArgs, g as VersionRecord, h as CreateVersionArgs } from './types-Dgzlftb7.js';
2
+ import { F as Field, k as RelationshipField, U as UploadField } from './types-DeSApf9T.js';
3
3
 
4
4
  declare abstract class AbstractBaseAdapter implements BaseAdapter {
5
5
  protected collections: Map<string, CollectionConfig>;
6
6
  protected globals: Map<string, GlobalConfig>;
7
7
  protected connected: boolean;
8
+ protected tenantContext?: TenantContext;
8
9
  abstract connect(): Promise<void>;
9
10
  abstract disconnect(): Promise<void>;
11
+ setTenantContext(context: TenantContext | undefined): void;
12
+ getTenantContext(): TenantContext | undefined;
10
13
  init(collections: CollectionConfig[], globals?: GlobalConfig[]): Promise<void>;
11
14
  abstract find<T>(args: FindArgs): Promise<FindResult<T>>;
12
15
  abstract findByID<T>(args: FindByIDArgs): Promise<T | null>;
@@ -31,15 +34,13 @@ declare abstract class AbstractBaseAdapter implements BaseAdapter {
31
34
  tenantID?: string;
32
35
  }): Promise<VersionRecord | null>;
33
36
  abstract createVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;
37
+ abstract updateLatestVersion<T = Record<string, any>>(args: CreateVersionArgs<T>): Promise<VersionRecord<T>>;
34
38
  abstract deleteVersions(args: {
35
39
  collection: string;
36
40
  documentId: string;
37
41
  keepLatest?: number;
38
42
  tenantID?: string;
39
43
  }): Promise<void>;
40
- abstract findDraft<T>(args: DraftFindArgs): Promise<DraftSnapshot<T> | null>;
41
- abstract upsertDraft<T>(args: DraftUpsertArgs<T>): Promise<DraftSnapshot<T>>;
42
- abstract deleteDraft(args: DraftDeleteArgs): Promise<void>;
43
44
  migrate?(): Promise<void>;
44
45
  rollback?(): Promise<void>;
45
46
  transaction?<T>(fn: (tx: any) => Promise<T>): Promise<T>;
@@ -70,13 +71,4 @@ declare abstract class AbstractBaseAdapter implements BaseAdapter {
70
71
  protected getUploadFields(fields: Field[]): UploadField[];
71
72
  }
72
73
 
73
- interface TenantContext {
74
- tenantId: string;
75
- userId: string;
76
- role: string;
77
- roles: string[];
78
- permissions: string[];
79
- isSuperAdmin: boolean;
80
- }
81
-
82
- export { AbstractBaseAdapter as A, type TenantContext as T };
74
+ export { AbstractBaseAdapter as A };
@@ -0,0 +1,7 @@
1
+ export { autoBootstrap, bootstrapAdmin, bootstrapWithRetry, checkBootstrapRequired, getBootstrapFromEnv } from './chunk-GAAHG2Z4.js';
2
+ import './chunk-6UNONDW7.js';
3
+ import './chunk-YT7HXXVN.js';
4
+ import './chunk-Q72BOAPK.js';
5
+ import './chunk-4CV4JOE5.js';
6
+ //# sourceMappingURL=bootstrap-3PV3GJ3S.js.map
7
+ //# sourceMappingURL=bootstrap-3PV3GJ3S.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-JCML6NFO.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-3PV3GJ3S.js"}
@@ -0,0 +1,32 @@
1
+ 'use strict';
2
+
3
+ var chunk5PMQQFRE_cjs = require('./chunk-5PMQQFRE.cjs');
4
+ require('./chunk-Y7AQK4R4.cjs');
5
+ require('./chunk-4PWRCMTQ.cjs');
6
+ require('./chunk-IDVRRRAK.cjs');
7
+ require('./chunk-CZLDE2OZ.cjs');
8
+
9
+
10
+
11
+ Object.defineProperty(exports, "autoBootstrap", {
12
+ enumerable: true,
13
+ get: function () { return chunk5PMQQFRE_cjs.autoBootstrap; }
14
+ });
15
+ Object.defineProperty(exports, "bootstrapAdmin", {
16
+ enumerable: true,
17
+ get: function () { return chunk5PMQQFRE_cjs.bootstrapAdmin; }
18
+ });
19
+ Object.defineProperty(exports, "bootstrapWithRetry", {
20
+ enumerable: true,
21
+ get: function () { return chunk5PMQQFRE_cjs.bootstrapWithRetry; }
22
+ });
23
+ Object.defineProperty(exports, "checkBootstrapRequired", {
24
+ enumerable: true,
25
+ get: function () { return chunk5PMQQFRE_cjs.checkBootstrapRequired; }
26
+ });
27
+ Object.defineProperty(exports, "getBootstrapFromEnv", {
28
+ enumerable: true,
29
+ get: function () { return chunk5PMQQFRE_cjs.getBootstrapFromEnv; }
30
+ });
31
+ //# sourceMappingURL=bootstrap-4CELFLJO.cjs.map
32
+ //# sourceMappingURL=bootstrap-4CELFLJO.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-AKAUP6F6.cjs"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"bootstrap-4CELFLJO.cjs"}
@@ -1,10 +1,54 @@
1
1
  'use strict';
2
2
 
3
- var chunkR3XIBBAW_cjs = require('./chunk-R3XIBBAW.cjs');
3
+ var chunk4M7X5HAB_cjs = require('./chunk-4M7X5HAB.cjs');
4
+ var chunkNKPKR5BW_cjs = require('./chunk-NKPKR5BW.cjs');
4
5
  var graphql = require('graphql');
5
6
 
6
7
  async function checkGraphQLAccess(collection, operation, context) {
7
8
  const accessRule = collection.access?.[operation];
9
+ if (context.apiKey?.permissions?.length > 0) {
10
+ const resource = collection.slug;
11
+ const action = operation === "read" ? "read" : operation === "create" ? "create" : "update";
12
+ const permission = `${resource}:${action}`;
13
+ if (!chunk4M7X5HAB_cjs.hasApiKeyPermission(context.apiKey.permissions, permission) && !chunk4M7X5HAB_cjs.hasApiKeyPermission(context.apiKey.permissions, `${resource}:admin`)) {
14
+ return { allowed: false };
15
+ }
16
+ }
17
+ if (context.user) {
18
+ const resource = collection.slug;
19
+ const action = operation === "read" ? "read" : operation === "create" ? "create" : operation === "update" ? "update" : "delete";
20
+ const permission = `${resource}:${action}`;
21
+ const userHasPermission = chunkNKPKR5BW_cjs.hasPermission(
22
+ { id: context.user.id, email: context.user.email, role: context.user.role },
23
+ permission
24
+ );
25
+ if (!userHasPermission && !chunkNKPKR5BW_cjs.hasPermission(
26
+ { id: context.user.id, email: context.user.email, role: context.user.role },
27
+ `${resource}:admin`
28
+ )) {
29
+ if (!accessRule) {
30
+ return { allowed: false };
31
+ }
32
+ }
33
+ }
34
+ if (!accessRule) {
35
+ if (!context.user && !context.apiKey) {
36
+ return { allowed: false };
37
+ }
38
+ return { allowed: true };
39
+ }
40
+ const result = await chunk4M7X5HAB_cjs.evaluateAccess(accessRule, {
41
+ req: context.req,
42
+ user: context.user,
43
+ tenantID: context.tenantID
44
+ });
45
+ if (typeof result === "boolean") {
46
+ return { allowed: result };
47
+ }
48
+ return { allowed: true, extraWhere: result };
49
+ }
50
+ async function checkGlobalAccess(global, operation, context) {
51
+ const accessRule = global.access?.[operation];
8
52
  if (!accessRule) {
9
53
  if (!context.user) {
10
54
  return { allowed: false };
@@ -15,7 +59,7 @@ async function checkGraphQLAccess(collection, operation, context) {
15
59
  }
16
60
  return { allowed: false };
17
61
  }
18
- const result = await chunkR3XIBBAW_cjs.evaluateAccess(accessRule, {
62
+ const result = await chunk4M7X5HAB_cjs.evaluateAccess(accessRule, {
19
63
  req: context.req,
20
64
  user: context.user,
21
65
  tenantID: context.tenantID
@@ -23,9 +67,9 @@ async function checkGraphQLAccess(collection, operation, context) {
23
67
  if (typeof result === "boolean") {
24
68
  return { allowed: result };
25
69
  }
26
- return { allowed: true, extraWhere: result };
70
+ return { allowed: true };
27
71
  }
28
- function fieldToGraphQLType(field, registry) {
72
+ function fieldToGraphQLType(field, registry, collectionTypes, isInputType = false) {
29
73
  switch (field.type) {
30
74
  case "text":
31
75
  case "email":
@@ -49,13 +93,19 @@ function fieldToGraphQLType(field, registry) {
49
93
  // JSON as string
50
94
  case "relationship":
51
95
  if (typeof field.relationTo === "string") {
96
+ if (isInputType) {
97
+ return graphql.GraphQLString;
98
+ }
99
+ if (collectionTypes?.[field.relationTo]) {
100
+ return collectionTypes[field.relationTo];
101
+ }
52
102
  const relatedCollection = registry.getCollection(field.relationTo);
53
103
  if (relatedCollection) {
54
104
  return new graphql.GraphQLObjectType({
55
105
  name: `${field.relationTo}_ref`,
56
106
  fields: () => ({
57
107
  id: { type: graphql.GraphQLString },
58
- ...buildFieldsFromCollection(relatedCollection, registry)
108
+ ...buildFieldsFromCollection(relatedCollection, registry, collectionTypes)
59
109
  })
60
110
  });
61
111
  }
@@ -78,12 +128,12 @@ function fieldToGraphQLType(field, registry) {
78
128
  return graphql.GraphQLString;
79
129
  }
80
130
  }
81
- function buildFieldsFromCollection(config, registry) {
131
+ function buildFieldsFromCollection(config, registry, collectionTypes) {
82
132
  const fields = {};
83
133
  for (const field of config.fields) {
84
134
  if (field.name && field.admin?.hidden !== true) {
85
135
  fields[field.name] = {
86
- type: field.required ? new graphql.GraphQLNonNull(fieldToGraphQLType(field, registry)) : fieldToGraphQLType(field, registry),
136
+ type: field.required ? new graphql.GraphQLNonNull(fieldToGraphQLType(field, registry, collectionTypes)) : fieldToGraphQLType(field, registry, collectionTypes),
87
137
  description: field.admin?.description || field.label
88
138
  };
89
139
  }
@@ -91,7 +141,7 @@ function buildFieldsFromCollection(config, registry) {
91
141
  return fields;
92
142
  }
93
143
  function buildGraphQLSchema(options) {
94
- const { registry, db, user, req, tenantID, settings } = options;
144
+ const { registry, db, user, req, tenantID, apiKey, settings } = options;
95
145
  const apiAccess = settings?.access?.apiAccess;
96
146
  if (apiAccess?.graphqlEnabled === false) {
97
147
  throw new Error("GraphQL API is disabled");
@@ -105,7 +155,7 @@ function buildGraphQLSchema(options) {
105
155
  name: `${collection.slug.replace(/-/g, "_")}_type`,
106
156
  fields: () => ({
107
157
  id: { type: graphql.GraphQLString },
108
- ...buildFieldsFromCollection(collection, registry),
158
+ ...buildFieldsFromCollection(collection, registry, collectionTypes),
109
159
  ...collection.timestamps ? {
110
160
  createdAt: { type: graphql.GraphQLString },
111
161
  updatedAt: { type: graphql.GraphQLString }
@@ -119,7 +169,7 @@ function buildGraphQLSchema(options) {
119
169
  for (const field of collection.fields) {
120
170
  if (field.name && field.name !== "id") {
121
171
  inputFields[field.name] = {
122
- type: fieldToGraphQLType(field, registry)
172
+ type: fieldToGraphQLType(field, registry, collectionTypes, true)
123
173
  };
124
174
  }
125
175
  }
@@ -129,6 +179,7 @@ function buildGraphQLSchema(options) {
129
179
  });
130
180
  }
131
181
  const globalTypes = {};
182
+ const globalInputTypes = {};
132
183
  for (const global of globals) {
133
184
  globalTypes[global.slug] = new graphql.GraphQLObjectType({
134
185
  name: `${global.slug.replace(/-/g, "_")}_global_type`,
@@ -136,16 +187,31 @@ function buildGraphQLSchema(options) {
136
187
  id: { type: graphql.GraphQLString },
137
188
  ...buildFieldsFromCollection(
138
189
  { slug: global.slug, fields: global.fields },
139
- registry
190
+ registry,
191
+ collectionTypes
140
192
  )
141
193
  })
142
194
  });
195
+ globalInputTypes[global.slug] = new graphql.GraphQLInputObjectType({
196
+ name: `${global.slug.replace(/-/g, "_")}_global_input`,
197
+ fields: () => {
198
+ const inputFields = {};
199
+ for (const field of global.fields) {
200
+ if (field.name && field.name !== "id") {
201
+ inputFields[field.name] = {
202
+ type: fieldToGraphQLType(field, registry, collectionTypes, true)
203
+ };
204
+ }
205
+ }
206
+ return inputFields;
207
+ }
208
+ });
143
209
  }
144
210
  const queryFields = {};
145
211
  for (const collection of collections) {
146
212
  const type = collectionTypes[collection.slug];
147
213
  if (!type) continue;
148
- queryFields[`${collection.slug}Find`] = {
214
+ queryFields[`${collection.slug.replace(/-/g, "_")}Find`] = {
149
215
  type: new graphql.GraphQLObjectType({
150
216
  name: `${collection.slug.replace(/-/g, "_")}_find_result`,
151
217
  fields: {
@@ -161,17 +227,22 @@ function buildGraphQLSchema(options) {
161
227
  where: { type: graphql.GraphQLString },
162
228
  sort: { type: graphql.GraphQLString },
163
229
  limit: { type: graphql.GraphQLInt },
164
- page: { type: graphql.GraphQLInt }
230
+ page: { type: graphql.GraphQLInt },
231
+ draft: { type: graphql.GraphQLBoolean }
165
232
  },
166
233
  resolve: async (_, args, context) => {
167
234
  const access = await checkGraphQLAccess(collection, "read", {
168
235
  user,
169
236
  req,
170
- tenantID
237
+ tenantID,
238
+ apiKey
171
239
  });
172
240
  if (!access.allowed) {
173
241
  throw new Error("Access denied");
174
242
  }
243
+ if (tenantID) {
244
+ db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? "", role: user?.role, isSuperAdmin: user?.role === "super_admin" });
245
+ }
175
246
  let where = {};
176
247
  if (args.where) {
177
248
  try {
@@ -182,39 +253,48 @@ function buildGraphQLSchema(options) {
182
253
  if (access.extraWhere) {
183
254
  where = { ...where, ...access.extraWhere };
184
255
  }
256
+ const isDraft = args.draft ?? !!user;
185
257
  return db.find({
186
258
  collection: collection.slug,
187
259
  where,
188
260
  sort: args.sort,
189
261
  limit: args.limit || 10,
190
262
  page: args.page || 1,
191
- tenantID
263
+ tenantID,
264
+ draft: isDraft
192
265
  });
193
266
  }
194
267
  };
195
- queryFields[`${collection.slug}FindByID`] = {
268
+ queryFields[`${collection.slug.replace(/-/g, "_")}FindByID`] = {
196
269
  type,
197
270
  args: {
198
- id: { type: new graphql.GraphQLNonNull(graphql.GraphQLString) }
271
+ id: { type: new graphql.GraphQLNonNull(graphql.GraphQLString) },
272
+ draft: { type: graphql.GraphQLBoolean }
199
273
  },
200
274
  resolve: async (_, args, context) => {
201
275
  const access = await checkGraphQLAccess(collection, "read", {
202
276
  user,
203
277
  req,
204
- tenantID
278
+ tenantID,
279
+ apiKey
205
280
  });
206
281
  if (!access.allowed) {
207
282
  throw new Error("Access denied");
208
283
  }
284
+ if (tenantID) {
285
+ db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? "", role: user?.role, isSuperAdmin: user?.role === "super_admin" });
286
+ }
287
+ const isDraft = args.draft ?? !!user;
209
288
  const doc = await db.findByID({
210
289
  collection: collection.slug,
211
290
  id: args.id,
212
- tenantID
291
+ tenantID,
292
+ draft: isDraft
213
293
  });
214
294
  return doc;
215
295
  }
216
296
  };
217
- queryFields[`${collection.slug}Count`] = {
297
+ queryFields[`${collection.slug.replace(/-/g, "_")}Count`] = {
218
298
  type: new graphql.GraphQLObjectType({
219
299
  name: `${collection.slug.replace(/-/g, "_")}_count`,
220
300
  fields: {
@@ -228,7 +308,8 @@ function buildGraphQLSchema(options) {
228
308
  const access = await checkGraphQLAccess(collection, "read", {
229
309
  user,
230
310
  req,
231
- tenantID
311
+ tenantID,
312
+ apiKey
232
313
  });
233
314
  if (!access.allowed) {
234
315
  return { totalDocs: 0 };
@@ -252,9 +333,20 @@ function buildGraphQLSchema(options) {
252
333
  for (const global of globals) {
253
334
  const type = globalTypes[global.slug];
254
335
  if (!type) continue;
255
- queryFields[`${global.slug}Get`] = {
336
+ queryFields[`${global.slug.replace(/-/g, "_")}Get`] = {
256
337
  type,
257
338
  resolve: async () => {
339
+ const access = await checkGlobalAccess(global, "read", {
340
+ user,
341
+ req,
342
+ tenantID
343
+ });
344
+ if (!access.allowed) {
345
+ throw new Error("Access denied: cannot read global");
346
+ }
347
+ if (tenantID) {
348
+ db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? "", role: user?.role, isSuperAdmin: user?.role === "super_admin" });
349
+ }
258
350
  return db.findOne({
259
351
  collection: `_globals_${global.slug}`,
260
352
  where: {},
@@ -272,7 +364,7 @@ function buildGraphQLSchema(options) {
272
364
  const type = collectionTypes[collection.slug];
273
365
  const inputType = collectionInputTypes[collection.slug];
274
366
  if (!type || !inputType) continue;
275
- mutationFields[`${collection.slug}Create`] = {
367
+ mutationFields[`${collection.slug.replace(/-/g, "_")}Create`] = {
276
368
  type: new graphql.GraphQLObjectType({
277
369
  name: `${collection.slug.replace(/-/g, "_")}_create_result`,
278
370
  fields: {
@@ -287,11 +379,15 @@ function buildGraphQLSchema(options) {
287
379
  const access = await checkGraphQLAccess(collection, "create", {
288
380
  user,
289
381
  req,
290
- tenantID
382
+ tenantID,
383
+ apiKey
291
384
  });
292
385
  if (!access.allowed) {
293
386
  throw new Error("Access denied: cannot create");
294
387
  }
388
+ if (tenantID) {
389
+ db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? "", role: user?.role, isSuperAdmin: user?.role === "super_admin" });
390
+ }
295
391
  const schema = registry.getCreateZodSchema(collection.slug);
296
392
  const validated = schema.parse(args.data);
297
393
  const doc = await db.create({
@@ -302,7 +398,7 @@ function buildGraphQLSchema(options) {
302
398
  return { doc, message: "Created successfully" };
303
399
  }
304
400
  };
305
- mutationFields[`${collection.slug}Update`] = {
401
+ mutationFields[`${collection.slug.replace(/-/g, "_")}Update`] = {
306
402
  type: new graphql.GraphQLObjectType({
307
403
  name: `${collection.slug.replace(/-/g, "_")}_update_result`,
308
404
  fields: {
@@ -312,17 +408,33 @@ function buildGraphQLSchema(options) {
312
408
  }),
313
409
  args: {
314
410
  id: { type: new graphql.GraphQLNonNull(graphql.GraphQLString) },
315
- data: { type: new graphql.GraphQLNonNull(inputType) }
411
+ data: { type: new graphql.GraphQLNonNull(inputType) },
412
+ baseUpdatedAt: { type: graphql.GraphQLString }
316
413
  },
317
414
  resolve: async (_, args, context) => {
318
415
  const access = await checkGraphQLAccess(collection, "update", {
319
416
  user,
320
417
  req,
321
- tenantID
418
+ tenantID,
419
+ apiKey
322
420
  });
323
421
  if (!access.allowed) {
324
422
  throw new Error("Access denied: cannot update");
325
423
  }
424
+ if (tenantID) {
425
+ db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? "", role: user?.role, isSuperAdmin: user?.role === "super_admin" });
426
+ }
427
+ if (args.baseUpdatedAt) {
428
+ const originalDoc = await db.findByID({
429
+ collection: collection.slug,
430
+ id: args.id,
431
+ tenantID,
432
+ draft: true
433
+ });
434
+ if (originalDoc && originalDoc.updatedAt && args.baseUpdatedAt !== originalDoc.updatedAt) {
435
+ throw new Error(`Revision conflict: document has changed since ${args.baseUpdatedAt}. Current updatedAt: ${originalDoc.updatedAt}`);
436
+ }
437
+ }
326
438
  const schema = registry.getUpdateZodSchema(collection.slug);
327
439
  const validated = schema.parse(args.data);
328
440
  const doc = await db.update({
@@ -334,7 +446,7 @@ function buildGraphQLSchema(options) {
334
446
  return { doc, message: "Updated successfully" };
335
447
  }
336
448
  };
337
- mutationFields[`${collection.slug}Delete`] = {
449
+ mutationFields[`${collection.slug.replace(/-/g, "_")}Delete`] = {
338
450
  type: new graphql.GraphQLObjectType({
339
451
  name: `${collection.slug.replace(/-/g, "_")}_delete_result`,
340
452
  fields: {
@@ -349,11 +461,15 @@ function buildGraphQLSchema(options) {
349
461
  const access = await checkGraphQLAccess(collection, "delete", {
350
462
  user,
351
463
  req,
352
- tenantID
464
+ tenantID,
465
+ apiKey
353
466
  });
354
467
  if (!access.allowed) {
355
468
  throw new Error("Access denied: cannot delete");
356
469
  }
470
+ if (tenantID) {
471
+ db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? "", role: user?.role, isSuperAdmin: user?.role === "super_admin" });
472
+ }
357
473
  const doc = await db.delete({
358
474
  collection: collection.slug,
359
475
  id: args.id,
@@ -363,6 +479,56 @@ function buildGraphQLSchema(options) {
363
479
  }
364
480
  };
365
481
  }
482
+ for (const global of globals) {
483
+ const inputType = globalInputTypes[global.slug];
484
+ if (!inputType) continue;
485
+ mutationFields[`${global.slug.replace(/-/g, "_")}Update`] = {
486
+ type: new graphql.GraphQLObjectType({
487
+ name: `${global.slug.replace(/-/g, "_")}_update_result`,
488
+ fields: {
489
+ doc: { type: globalTypes[global.slug] || graphql.GraphQLString },
490
+ message: { type: graphql.GraphQLString }
491
+ }
492
+ }),
493
+ args: {
494
+ data: { type: new graphql.GraphQLNonNull(inputType) }
495
+ },
496
+ resolve: async (_, args, context) => {
497
+ const access = await checkGlobalAccess(global, "update", {
498
+ user,
499
+ req,
500
+ tenantID
501
+ });
502
+ if (!access.allowed) {
503
+ throw new Error("Access denied: cannot update global");
504
+ }
505
+ if (tenantID) {
506
+ db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? "", role: user?.role, isSuperAdmin: user?.role === "super_admin" });
507
+ }
508
+ const doc = await db.findOne({
509
+ collection: `_globals_${global.slug}`,
510
+ where: {},
511
+ tenantID
512
+ });
513
+ let result;
514
+ if (doc) {
515
+ result = await db.update({
516
+ collection: `_globals_${global.slug}`,
517
+ id: doc.id,
518
+ data: args.data,
519
+ tenantID
520
+ });
521
+ } else {
522
+ result = await db.create({
523
+ collection: `_globals_${global.slug}`,
524
+ data: args.data,
525
+ tenantID
526
+ });
527
+ }
528
+ return { doc: result, message: "Updated successfully" };
529
+ }
530
+ };
531
+ }
366
532
  const Mutation = new graphql.GraphQLObjectType({
367
533
  name: "Mutation",
368
534
  fields: mutationFields
@@ -378,11 +544,12 @@ function createGraphQLSchema(registry, db, options) {
378
544
  db,
379
545
  user: options?.user,
380
546
  req: options?.req,
381
- tenantID: options?.tenantID
547
+ tenantID: options?.tenantID,
548
+ apiKey: options?.apiKey
382
549
  });
383
550
  }
384
551
 
385
552
  exports.buildGraphQLSchema = buildGraphQLSchema;
386
553
  exports.createGraphQLSchema = createGraphQLSchema;
387
- //# sourceMappingURL=chunk-VJT6P4N6.cjs.map
388
- //# sourceMappingURL=chunk-VJT6P4N6.cjs.map
554
+ //# sourceMappingURL=chunk-3HR772HI.cjs.map
555
+ //# sourceMappingURL=chunk-3HR772HI.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/api/graphql/schema.ts"],"names":["hasApiKeyPermission","hasPermission","evaluateAccess","GraphQLString","GraphQLInt","GraphQLFloat","GraphQLBoolean","GraphQLObjectType","GraphQLList","GraphQLNonNull","GraphQLInputObjectType","GraphQLSchema"],"mappings":"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","file":"chunk-3HR772HI.cjs","sourcesContent":["import {\n GraphQLSchema,\n GraphQLObjectType,\n GraphQLString,\n GraphQLInt,\n GraphQLBoolean,\n GraphQLFloat,\n GraphQLList,\n GraphQLNonNull,\n GraphQLInputObjectType,\n type GraphQLFieldConfig,\n type GraphQLType,\n} from \"graphql\";\nimport type {\n CollectionConfig,\n GlobalConfig,\n BaseAdapter,\n} from \"../../registry/types.js\";\nimport { Registry } from \"../../registry/index.js\";\nimport type { Field, SelectField } from \"../../fields/types.js\";\nimport { evaluateAccess, type WhereClause } from \"../../access/types.js\";\nimport type { User, Request } from \"../../hooks/types.js\";\nimport type { TenantContext } from \"../../auth/rls/tenant.js\";\nimport { hasApiKeyPermission } from \"../../auth/api-key.js\";\nimport { hasPermission } from \"../../auth/rbac/checker.js\";\n\n// ============================================================================\n// Access Control Helper\n// ============================================================================\n\nasync function checkGraphQLAccess(\n collection: { access?: any; slug: string },\n operation: \"read\" | \"create\" | \"update\" | \"delete\",\n context: { user?: User; req?: Request; tenantID?: string; apiKey?: any },\n): Promise<{ allowed: boolean; extraWhere?: WhereClause }> {\n const accessRule = collection.access?.[operation];\n\n // API key permission check\n if (context.apiKey?.permissions?.length > 0) {\n const resource = collection.slug;\n const action = operation === \"read\" ? \"read\" : operation === \"create\" ? \"create\" : \"update\";\n const permission = `${resource}:${action}`;\n if (\n !hasApiKeyPermission(context.apiKey.permissions, permission) &&\n !hasApiKeyPermission(context.apiKey.permissions, `${resource}:admin`)\n ) {\n return { allowed: false };\n }\n }\n\n // RBAC check for authenticated users\n if (context.user) {\n const resource = collection.slug;\n const action = operation === \"read\" ? \"read\" : operation === \"create\" ? \"create\" : operation === \"update\" ? \"update\" : \"delete\";\n const permission = `${resource}:${action}`;\n const userHasPermission = hasPermission(\n { id: context.user.id, email: context.user.email, role: context.user.role } as any,\n permission,\n );\n if (!userHasPermission && !hasPermission(\n { id: context.user.id, email: context.user.email, role: context.user.role } as any,\n `${resource}:admin`,\n )) {\n if (!accessRule) {\n return { allowed: false };\n }\n }\n }\n\n if (!accessRule) {\n if (!context.user && !context.apiKey) {\n return { allowed: false };\n }\n return { allowed: true };\n }\n\n const result = await evaluateAccess(accessRule, {\n req: context.req!,\n user: context.user,\n tenantID: context.tenantID,\n });\n\n if (typeof result === \"boolean\") {\n return { allowed: result };\n }\n\n return { allowed: true, extraWhere: result };\n}\n\nasync function checkGlobalAccess(\n global: { access?: any },\n operation: \"read\" | \"update\",\n context: { user?: User; req?: Request; tenantID?: string },\n): Promise<{ allowed: boolean }> {\n const accessRule = global.access?.[operation];\n\n if (!accessRule) {\n if (!context.user) {\n return { allowed: false };\n }\n const userRole = context.user.role;\n if (userRole === \"super_admin\" || userRole === \"admin\") {\n return { allowed: true };\n }\n return { allowed: false };\n }\n\n const result = await evaluateAccess(accessRule, {\n req: context.req!,\n user: context.user,\n tenantID: context.tenantID,\n });\n\n if (typeof result === \"boolean\") {\n return { allowed: result };\n }\n\n return { allowed: true };\n}\n\n// ============================================================================\n// Field → GraphQL Type Mapping\n// ============================================================================\n\nfunction fieldToGraphQLType(\n field: Field,\n registry: Registry,\n collectionTypes?: Record<string, GraphQLObjectType>,\n isInputType = false,\n): GraphQLType {\n switch (field.type) {\n case \"text\":\n case \"email\":\n case \"password\":\n case \"textarea\":\n case \"color\":\n case \"code\":\n case \"markdown\":\n case \"date\":\n case \"select\":\n case \"radio\":\n case \"upload\":\n return GraphQLString;\n case \"number\":\n return field.integer ? GraphQLInt : GraphQLFloat;\n case \"checkbox\":\n return GraphQLBoolean;\n case \"json\":\n case \"richtext\":\n return GraphQLString; // JSON as string\n case \"relationship\":\n if (typeof field.relationTo === \"string\") {\n if (isInputType) {\n return GraphQLString;\n }\n if (collectionTypes?.[field.relationTo]) {\n return collectionTypes[field.relationTo];\n }\n const relatedCollection = registry.getCollection(field.relationTo);\n if (relatedCollection) {\n return new GraphQLObjectType({\n name: `${field.relationTo}_ref`,\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(relatedCollection, registry, collectionTypes),\n }),\n });\n }\n }\n return GraphQLString;\n case \"array\":\n return new GraphQLList(GraphQLString); // Simplified\n case \"group\":\n return GraphQLString; // Simplified - JSON string\n case \"blocks\":\n return new GraphQLList(GraphQLString); // Simplified\n case \"row\":\n case \"collapsible\":\n case \"tabs\":\n return GraphQLString;\n default:\n return GraphQLString;\n }\n}\n\nfunction buildFieldsFromCollection(\n config: CollectionConfig,\n registry: Registry,\n collectionTypes?: Record<string, GraphQLObjectType>,\n): Record<string, GraphQLFieldConfig<any, any>> {\n const fields: Record<string, GraphQLFieldConfig<any, any>> = {};\n\n for (const field of config.fields) {\n if (field.name && field.admin?.hidden !== true) {\n fields[field.name] = {\n type: field.required\n ? new GraphQLNonNull(fieldToGraphQLType(field, registry, collectionTypes) as any)\n : (fieldToGraphQLType(field, registry, collectionTypes) as any),\n description: field.admin?.description || field.label,\n };\n }\n }\n\n return fields;\n}\n\n// ============================================================================\n// GraphQL Schema Builder\n// ============================================================================\n\nexport interface GraphQLSchemaOptions {\n registry: Registry;\n db: BaseAdapter;\n user?: User;\n req?: Request;\n tenantID?: string;\n apiKey?: any;\n settings?: Record<string, any>;\n}\n\nexport function buildGraphQLSchema(\n options: GraphQLSchemaOptions,\n): GraphQLSchema {\n const { registry, db, user, req, tenantID, apiKey, settings } = options;\n\n // Check if GraphQL is disabled in settings\n const apiAccess = settings?.access?.apiAccess;\n if (apiAccess?.graphqlEnabled === false) {\n throw new Error(\"GraphQL API is disabled\");\n }\n\n const collections = registry.getCollections();\n const globals = registry.getGlobals();\n\n // Build collection types\n const collectionTypes: Record<string, GraphQLObjectType> = {};\n const collectionInputTypes: Record<string, GraphQLInputObjectType> = {};\n\n for (const collection of collections) {\n // Output type\n collectionTypes[collection.slug] = new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_type`,\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(collection, registry, collectionTypes),\n ...(collection.timestamps\n ? {\n createdAt: { type: GraphQLString },\n updatedAt: { type: GraphQLString },\n }\n : {}),\n ...(collection.tenantScoped\n ? {\n tenantID: { type: GraphQLString },\n }\n : {}),\n }),\n });\n\n // Input type for create/update\n const inputFields: Record<string, { type: GraphQLType }> = {};\n for (const field of collection.fields) {\n if (field.name && field.name !== \"id\") {\n inputFields[field.name] = {\n type: fieldToGraphQLType(field, registry, collectionTypes, true) as any,\n };\n }\n }\n\n collectionInputTypes[collection.slug] = new GraphQLInputObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_input`,\n fields: () => inputFields as any,\n });\n }\n\n // Build global types and input types\n const globalTypes: Record<string, GraphQLObjectType> = {};\n const globalInputTypes: Record<string, GraphQLInputObjectType> = {};\n\n for (const global of globals) {\n globalTypes[global.slug] = new GraphQLObjectType({\n name: `${global.slug.replace(/-/g, \"_\")}_global_type`,\n fields: () => ({\n id: { type: GraphQLString },\n ...buildFieldsFromCollection(\n { slug: global.slug, fields: global.fields } as CollectionConfig,\n registry,\n collectionTypes,\n ),\n }),\n });\n\n globalInputTypes[global.slug] = new GraphQLInputObjectType({\n name: `${global.slug.replace(/-/g, \"_\")}_global_input`,\n fields: () => {\n const inputFields: Record<string, { type: GraphQLType }> = {};\n for (const field of global.fields) {\n if (field.name && field.name !== \"id\") {\n inputFields[field.name] = {\n type: fieldToGraphQLType(field, registry, collectionTypes, true) as any,\n };\n }\n }\n return inputFields as any;\n },\n });\n }\n\n // Build query type\n const queryFields: Record<string, GraphQLFieldConfig<any, any>> = {};\n\n // List queries for each collection\n for (const collection of collections) {\n const type = collectionTypes[collection.slug];\n if (!type) continue;\n\n // FindMany query\n queryFields[`${collection.slug.replace(/-/g, \"_\")}Find`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_find_result`,\n fields: {\n docs: { type: new GraphQLList(type) },\n totalDocs: { type: GraphQLInt },\n page: { type: GraphQLInt },\n totalPages: { type: GraphQLInt },\n hasNextPage: { type: GraphQLBoolean },\n hasPrevPage: { type: GraphQLBoolean },\n },\n }),\n args: {\n where: { type: GraphQLString },\n sort: { type: GraphQLString },\n limit: { type: GraphQLInt },\n page: { type: GraphQLInt },\n draft: { type: GraphQLBoolean },\n },\n resolve: async (_: any, args: any, context: any) => {\n const access = await checkGraphQLAccess(collection, \"read\", {\n user,\n req,\n tenantID,\n apiKey,\n });\n if (!access.allowed) {\n throw new Error(\"Access denied\");\n }\n\n if (tenantID) {\n db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? '', role: user?.role, isSuperAdmin: user?.role === 'super_admin' });\n }\n\n let where = {};\n if (args.where) {\n try {\n where = JSON.parse(args.where);\n } catch {}\n }\n\n if (access.extraWhere) {\n where = { ...where, ...access.extraWhere };\n }\n\n const isDraft = args.draft ?? !!user;\n\n return db.find({\n collection: collection.slug,\n where,\n sort: args.sort,\n limit: args.limit || 10,\n page: args.page || 1,\n tenantID,\n draft: isDraft,\n });\n },\n };\n\n // FindByID query\n queryFields[`${collection.slug.replace(/-/g, \"_\")}FindByID`] = {\n type,\n args: {\n id: { type: new GraphQLNonNull(GraphQLString) },\n draft: { type: GraphQLBoolean },\n },\n resolve: async (_: any, args: any, context: any) => {\n const access = await checkGraphQLAccess(collection, \"read\", {\n user,\n req,\n tenantID,\n apiKey,\n });\n if (!access.allowed) {\n throw new Error(\"Access denied\");\n }\n\n if (tenantID) {\n db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? '', role: user?.role, isSuperAdmin: user?.role === 'super_admin' });\n }\n\n const isDraft = args.draft ?? !!user;\n const doc = await db.findByID({\n collection: collection.slug,\n id: args.id,\n tenantID,\n draft: isDraft,\n });\n return doc;\n },\n };\n\n // Count query\n queryFields[`${collection.slug.replace(/-/g, \"_\")}Count`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_count`,\n fields: {\n totalDocs: { type: GraphQLInt },\n },\n }),\n args: {\n where: { type: GraphQLString },\n },\n resolve: async (_: any, args: any, context: any) => {\n const access = await checkGraphQLAccess(collection, \"read\", {\n user,\n req,\n tenantID,\n apiKey,\n });\n if (!access.allowed) {\n return { totalDocs: 0 };\n }\n let where = {};\n if (args.where) {\n try {\n where = JSON.parse(args.where);\n } catch {}\n }\n const count = await db.count({\n collection: collection.slug,\n where,\n tenantID,\n });\n return { totalDocs: count };\n },\n };\n }\n\n // Global queries\n for (const global of globals) {\n const type = globalTypes[global.slug];\n if (!type) continue;\n\n queryFields[`${global.slug.replace(/-/g, \"_\")}Get`] = {\n type,\n resolve: async () => {\n const access = await checkGlobalAccess(global, \"read\", {\n user,\n req,\n tenantID,\n });\n if (!access.allowed) {\n throw new Error(\"Access denied: cannot read global\");\n }\n if (tenantID) {\n db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? '', role: user?.role, isSuperAdmin: user?.role === 'super_admin' });\n }\n return db.findOne({\n collection: `_globals_${global.slug}`,\n where: {},\n tenantID,\n });\n },\n };\n }\n\n const Query = new GraphQLObjectType({\n name: \"Query\",\n fields: queryFields,\n });\n\n // Build mutation type\n const mutationFields: Record<string, GraphQLFieldConfig<any, any>> = {};\n\n for (const collection of collections) {\n const type = collectionTypes[collection.slug];\n const inputType = collectionInputTypes[collection.slug];\n if (!type || !inputType) continue;\n\n // Create mutation\n mutationFields[`${collection.slug.replace(/-/g, \"_\")}Create`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_create_result`,\n fields: {\n doc: { type },\n message: { type: GraphQLString },\n },\n }),\n args: {\n data: { type: new GraphQLNonNull(inputType) },\n },\n resolve: async (_: any, args: any, context: any) => {\n const access = await checkGraphQLAccess(collection, \"create\", {\n user,\n req,\n tenantID,\n apiKey,\n });\n if (!access.allowed) {\n throw new Error(\"Access denied: cannot create\");\n }\n if (tenantID) {\n db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? '', role: user?.role, isSuperAdmin: user?.role === 'super_admin' });\n }\n const schema = registry.getCreateZodSchema(collection.slug);\n\n const validated = schema.parse(args.data);\n\n const doc = await db.create({\n collection: collection.slug,\n data: validated,\n tenantID,\n });\n\n return { doc, message: \"Created successfully\" };\n },\n };\n\n // Update mutation\n mutationFields[`${collection.slug.replace(/-/g, \"_\")}Update`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_update_result`,\n fields: {\n doc: { type },\n message: { type: GraphQLString },\n },\n }),\n args: {\n id: { type: new GraphQLNonNull(GraphQLString) },\n data: { type: new GraphQLNonNull(inputType) },\n baseUpdatedAt: { type: GraphQLString },\n },\n resolve: async (_: any, args: any, context: any) => {\n const access = await checkGraphQLAccess(collection, \"update\", {\n user,\n req,\n tenantID,\n apiKey,\n });\n if (!access.allowed) {\n throw new Error(\"Access denied: cannot update\");\n }\n if (tenantID) {\n db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? '', role: user?.role, isSuperAdmin: user?.role === 'super_admin' });\n }\n\n // Revision conflict detection\n if (args.baseUpdatedAt) {\n const originalDoc = await db.findByID<Record<string, any>>({\n collection: collection.slug,\n id: args.id,\n tenantID,\n draft: true,\n });\n if (originalDoc && originalDoc.updatedAt && args.baseUpdatedAt !== originalDoc.updatedAt) {\n throw new Error(`Revision conflict: document has changed since ${args.baseUpdatedAt}. Current updatedAt: ${originalDoc.updatedAt}`);\n }\n }\n\n const schema = registry.getUpdateZodSchema(collection.slug);\n\n const validated = schema.parse(args.data);\n\n const doc = await db.update({\n collection: collection.slug,\n id: args.id,\n data: validated,\n tenantID,\n });\n\n return { doc, message: \"Updated successfully\" };\n },\n };\n\n // Delete mutation\n mutationFields[`${collection.slug.replace(/-/g, \"_\")}Delete`] = {\n type: new GraphQLObjectType({\n name: `${collection.slug.replace(/-/g, \"_\")}_delete_result`,\n fields: {\n doc: { type },\n message: { type: GraphQLString },\n },\n }),\n args: {\n id: { type: new GraphQLNonNull(GraphQLString) },\n },\n resolve: async (_: any, args: any, context: any) => {\n const access = await checkGraphQLAccess(collection, \"delete\", {\n user,\n req,\n tenantID,\n apiKey,\n });\n if (!access.allowed) {\n throw new Error(\"Access denied: cannot delete\");\n }\n if (tenantID) {\n db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? '', role: user?.role, isSuperAdmin: user?.role === 'super_admin' });\n }\n const doc = await db.delete({\n collection: collection.slug,\n id: args.id,\n tenantID,\n });\n\n return { doc, message: \"Deleted successfully\" };\n },\n };\n }\n\n // Global mutations\n for (const global of globals) {\n const inputType = globalInputTypes[global.slug];\n if (!inputType) continue;\n\n mutationFields[`${global.slug.replace(/-/g, \"_\")}Update`] = {\n type: new GraphQLObjectType({\n name: `${global.slug.replace(/-/g, \"_\")}_update_result`,\n fields: {\n doc: { type: globalTypes[global.slug] || GraphQLString },\n message: { type: GraphQLString },\n },\n }),\n args: {\n data: { type: new GraphQLNonNull(inputType) },\n },\n resolve: async (_: any, args: any, context: any) => {\n const access = await checkGlobalAccess(global, \"update\", {\n user,\n req,\n tenantID,\n });\n if (!access.allowed) {\n throw new Error(\"Access denied: cannot update global\");\n }\n if (tenantID) {\n db.setTenantContext({ tenantId: tenantID, userId: user?.id ?? '', role: user?.role, isSuperAdmin: user?.role === 'super_admin' });\n }\n\n const doc = await db.findOne({\n collection: `_globals_${global.slug}`,\n where: {},\n tenantID,\n });\n\n let result;\n if (doc) {\n result = await db.update({\n collection: `_globals_${global.slug}`,\n id: doc.id,\n data: args.data,\n tenantID,\n });\n } else {\n result = await db.create({\n collection: `_globals_${global.slug}`,\n data: args.data,\n tenantID,\n });\n }\n\n return { doc: result, message: \"Updated successfully\" };\n },\n };\n }\n\n const Mutation = new GraphQLObjectType({\n name: \"Mutation\",\n fields: mutationFields,\n });\n\n return new GraphQLSchema({\n query: Query,\n mutation: Mutation,\n });\n}\n\n// ============================================================================\n// Factory\n// ============================================================================\n\nexport function createGraphQLSchema(\n registry: Registry,\n db: BaseAdapter,\n options?: {\n user?: User;\n req?: Request;\n tenantID?: string;\n apiKey?: any;\n },\n): GraphQLSchema {\n return buildGraphQLSchema({\n registry,\n db,\n user: options?.user,\n req: options?.req,\n tenantID: options?.tenantID,\n apiKey: options?.apiKey,\n });\n}\n"]}