@kyro-cms/core 0.10.4 → 0.10.6

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 (301) hide show
  1. package/dist/api-handler-graphql.cjs +1 -49
  2. package/dist/api-handler-graphql.js +1 -46
  3. package/dist/api-handler-trpc.cjs +1 -38
  4. package/dist/api-handler-trpc.js +1 -36
  5. package/dist/api-handler.cjs +1 -44
  6. package/dist/api-handler.js +1 -27
  7. package/dist/bootstrap-HIAV5ZFT.cjs +1 -0
  8. package/dist/bootstrap-P7QPQYQP.js +1 -0
  9. package/dist/chunk-2BTRHVT3.cjs +20 -0
  10. package/dist/chunk-2W4FK6CJ.js +122 -0
  11. package/dist/chunk-4ORJMSJU.cjs +1 -0
  12. package/dist/chunk-65G73T7Z.cjs +2 -0
  13. package/dist/chunk-7N6NKCRT.js +1 -0
  14. package/dist/chunk-7WOX27LK.js +259 -0
  15. package/dist/chunk-AE6GXUT7.js +1 -0
  16. package/dist/chunk-AJAZ7D3W.cjs +259 -0
  17. package/dist/chunk-ATLSIYRH.cjs +1 -0
  18. package/dist/chunk-AU6IWTBO.js +2 -0
  19. package/dist/chunk-CDL7ARXT.js +133 -0
  20. package/dist/chunk-CUTFS6N2.cjs +1 -0
  21. package/dist/chunk-CVVW4LXZ.cjs +1 -0
  22. package/dist/chunk-DGJUBN33.js +1 -0
  23. package/dist/chunk-DV4LFLPL.cjs +1 -0
  24. package/dist/chunk-EEWCANFX.js +1 -0
  25. package/dist/chunk-ELICKLFM.cjs +3 -0
  26. package/dist/chunk-EQUQJBPP.cjs +2 -0
  27. package/dist/chunk-ET6NN2V2.cjs +122 -0
  28. package/dist/chunk-F7P36SLX.cjs +74 -0
  29. package/dist/chunk-F7SR5IDT.cjs +1 -0
  30. package/dist/chunk-FO3HLBC7.js +1 -0
  31. package/dist/chunk-FS7GL2BR.js +73 -0
  32. package/dist/chunk-G6A7OSIG.js +2 -0
  33. package/dist/chunk-GFU7AOI3.cjs +1 -0
  34. package/dist/chunk-GYQMNXXW.cjs +114 -0
  35. package/dist/chunk-HLSB2MCK.js +1 -0
  36. package/dist/chunk-HVXO3OFB.cjs +1 -0
  37. package/dist/chunk-IFJJ44OQ.cjs +133 -0
  38. package/dist/chunk-ISWMETHJ.cjs +1 -0
  39. package/dist/chunk-K6WUOU6P.js +1 -0
  40. package/dist/chunk-KDNYHLD2.js +1 -0
  41. package/dist/chunk-KIW36TG7.cjs +86 -0
  42. package/dist/chunk-L6CZYN3L.cjs +20 -0
  43. package/dist/chunk-LRGAPGG3.js +74 -0
  44. package/dist/chunk-LZ6YFYQM.js +20 -0
  45. package/dist/chunk-MIOMMB23.cjs +1 -0
  46. package/dist/chunk-NGBJKZMT.js +90 -0
  47. package/dist/chunk-NRLIGDYF.js +1 -0
  48. package/dist/chunk-NY47CFVP.cjs +1 -0
  49. package/dist/chunk-NZ35PV5R.js +2 -0
  50. package/dist/chunk-OG7CNQGU.js +1 -0
  51. package/dist/chunk-OQD3WG6Z.cjs +1 -0
  52. package/dist/chunk-P7CESLDJ.js +1 -0
  53. package/dist/chunk-PP5S2UBV.js +0 -0
  54. package/dist/chunk-Q3Q7BJVQ.cjs +1 -0
  55. package/dist/chunk-Q4CSLXCO.cjs +90 -0
  56. package/dist/chunk-QRXDCV6K.js +0 -0
  57. package/dist/chunk-R7DVVXXI.cjs +73 -0
  58. package/dist/chunk-RHCWCG3O.js +114 -0
  59. package/dist/chunk-SL3LZQCF.js +1 -0
  60. package/dist/chunk-UBHFUFD4.cjs +1 -0
  61. package/dist/chunk-UBRYJP2G.js +1 -0
  62. package/dist/chunk-UDSJGML2.cjs +2 -0
  63. package/dist/chunk-UHFDH3PG.js +20 -0
  64. package/dist/chunk-UJNSOOYZ.cjs +1 -0
  65. package/dist/chunk-URCLFIME.js +86 -0
  66. package/dist/chunk-UVTS2IWM.js +1 -0
  67. package/dist/chunk-V65NPSR5.cjs +1 -0
  68. package/dist/chunk-WIZ6C5QZ.cjs +1 -0
  69. package/dist/chunk-ZAQOSRP6.js +1 -0
  70. package/dist/chunk-ZELCS7IC.js +3 -0
  71. package/dist/cli/index.cjs +35 -405
  72. package/dist/cli/index.js +35 -402
  73. package/dist/client.cjs +1 -55
  74. package/dist/client.js +1 -6
  75. package/dist/drizzle/index.cjs +1 -50
  76. package/dist/drizzle/index.d.cts +1 -2
  77. package/dist/drizzle/index.d.ts +1 -2
  78. package/dist/drizzle/index.js +1 -9
  79. package/dist/fields/index.cjs +1 -89
  80. package/dist/fields/index.js +1 -4
  81. package/dist/graphql/index.cjs +1 -31
  82. package/dist/graphql/index.d.cts +1 -1
  83. package/dist/graphql/index.d.ts +1 -1
  84. package/dist/graphql/index.js +1 -6
  85. package/dist/{index-jLs0zlft.d.ts → index-DXr33e0x.d.ts} +1 -1
  86. package/dist/{index-DHbywDs-.d.cts → index-DuuUzWBq.d.cts} +1 -1
  87. package/dist/index.cjs +29 -2464
  88. package/dist/index.d.cts +2 -2
  89. package/dist/index.d.ts +2 -2
  90. package/dist/index.js +29 -1929
  91. package/dist/integration.cjs +1 -10
  92. package/dist/integration.js +1 -4
  93. package/dist/media-NSSMOB7N.cjs +1 -0
  94. package/dist/media-RNMCZYPZ.js +1 -0
  95. package/dist/mongo-auth-adapter-JYJ4GBZE.cjs +1 -0
  96. package/dist/mongo-auth-adapter-XI7EPURZ.js +1 -0
  97. package/dist/mongodb/index.cjs +1 -29
  98. package/dist/mongodb/index.d.cts +1 -2
  99. package/dist/mongodb/index.d.ts +1 -2
  100. package/dist/mongodb/index.js +1 -8
  101. package/dist/postgres-auth-adapter-E7OGMDD4.cjs +1 -0
  102. package/dist/postgres-auth-adapter-F4KLOGAG.js +1 -0
  103. package/dist/redis-adapter-AQJVABYT.cjs +1 -0
  104. package/dist/redis-adapter-AUKOV74G.js +1 -0
  105. package/dist/rest/index.cjs +1 -31
  106. package/dist/rest/index.d.cts +1 -1
  107. package/dist/rest/index.d.ts +1 -1
  108. package/dist/rest/index.js +1 -18
  109. package/dist/schema-5XNROI7I.js +1 -0
  110. package/dist/schema-6O4JTJRU.cjs +1 -0
  111. package/dist/sqlite-adapter-5XFLNJDH.js +1 -0
  112. package/dist/sqlite-adapter-W53Q32N5.cjs +1 -0
  113. package/dist/templates/index.cjs +1 -207
  114. package/dist/templates/index.js +1 -6
  115. package/dist/trpc/index.cjs +1 -48
  116. package/dist/trpc/index.js +1 -7
  117. package/dist/ws/index.cjs +1 -25
  118. package/dist/ws/index.js +1 -4
  119. package/package.json +44 -13
  120. package/dist/api-handler-graphql.cjs.map +0 -1
  121. package/dist/api-handler-graphql.js.map +0 -1
  122. package/dist/api-handler-trpc.cjs.map +0 -1
  123. package/dist/api-handler-trpc.js.map +0 -1
  124. package/dist/api-handler.cjs.map +0 -1
  125. package/dist/api-handler.js.map +0 -1
  126. package/dist/bootstrap-FUAPY2OF.cjs +0 -32
  127. package/dist/bootstrap-FUAPY2OF.cjs.map +0 -1
  128. package/dist/bootstrap-OXNVM7FP.js +0 -7
  129. package/dist/bootstrap-OXNVM7FP.js.map +0 -1
  130. package/dist/chunk-2HFJUUFZ.js +0 -250
  131. package/dist/chunk-2HFJUUFZ.js.map +0 -1
  132. package/dist/chunk-3AKCVYDB.js +0 -162
  133. package/dist/chunk-3AKCVYDB.js.map +0 -1
  134. package/dist/chunk-3KTWGODI.cjs +0 -178
  135. package/dist/chunk-3KTWGODI.cjs.map +0 -1
  136. package/dist/chunk-3YELQL7Z.cjs +0 -4
  137. package/dist/chunk-3YELQL7Z.cjs.map +0 -1
  138. package/dist/chunk-4CV4JOE5.js +0 -24
  139. package/dist/chunk-4CV4JOE5.js.map +0 -1
  140. package/dist/chunk-4OCMVGEY.cjs +0 -173
  141. package/dist/chunk-4OCMVGEY.cjs.map +0 -1
  142. package/dist/chunk-4PWRCMTQ.cjs +0 -15
  143. package/dist/chunk-4PWRCMTQ.cjs.map +0 -1
  144. package/dist/chunk-53NYVYVX.js +0 -3243
  145. package/dist/chunk-53NYVYVX.js.map +0 -1
  146. package/dist/chunk-5GFQPHGT.cjs +0 -156
  147. package/dist/chunk-5GFQPHGT.cjs.map +0 -1
  148. package/dist/chunk-5RPRLTTN.js +0 -861
  149. package/dist/chunk-5RPRLTTN.js.map +0 -1
  150. package/dist/chunk-74YSDAWE.cjs +0 -2749
  151. package/dist/chunk-74YSDAWE.cjs.map +0 -1
  152. package/dist/chunk-7OGPN7MP.js +0 -352
  153. package/dist/chunk-7OGPN7MP.js.map +0 -1
  154. package/dist/chunk-7OS7TX2Q.cjs +0 -495
  155. package/dist/chunk-7OS7TX2Q.cjs.map +0 -1
  156. package/dist/chunk-ADLJSJSN.cjs +0 -13
  157. package/dist/chunk-ADLJSJSN.cjs.map +0 -1
  158. package/dist/chunk-B6X3LN25.cjs +0 -6486
  159. package/dist/chunk-B6X3LN25.cjs.map +0 -1
  160. package/dist/chunk-BYBMTIMT.js +0 -419
  161. package/dist/chunk-BYBMTIMT.js.map +0 -1
  162. package/dist/chunk-CF7OL6HR.js +0 -355
  163. package/dist/chunk-CF7OL6HR.js.map +0 -1
  164. package/dist/chunk-CJX74IYK.js +0 -489
  165. package/dist/chunk-CJX74IYK.js.map +0 -1
  166. package/dist/chunk-CKVOU6MX.cjs +0 -52
  167. package/dist/chunk-CKVOU6MX.cjs.map +0 -1
  168. package/dist/chunk-CZLDE2OZ.cjs +0 -28
  169. package/dist/chunk-CZLDE2OZ.cjs.map +0 -1
  170. package/dist/chunk-DPA3KWPY.cjs +0 -205
  171. package/dist/chunk-DPA3KWPY.cjs.map +0 -1
  172. package/dist/chunk-EEJUFDMF.cjs +0 -424
  173. package/dist/chunk-EEJUFDMF.cjs.map +0 -1
  174. package/dist/chunk-FIAMXNTH.js +0 -220
  175. package/dist/chunk-FIAMXNTH.js.map +0 -1
  176. package/dist/chunk-GAOXD3XT.js +0 -175
  177. package/dist/chunk-GAOXD3XT.js.map +0 -1
  178. package/dist/chunk-GTGRLD4Y.js +0 -3
  179. package/dist/chunk-GTGRLD4Y.js.map +0 -1
  180. package/dist/chunk-GUUB5EAG.cjs +0 -223
  181. package/dist/chunk-GUUB5EAG.cjs.map +0 -1
  182. package/dist/chunk-GXFOGU7N.cjs +0 -359
  183. package/dist/chunk-GXFOGU7N.cjs.map +0 -1
  184. package/dist/chunk-GZS4LMR7.js +0 -422
  185. package/dist/chunk-GZS4LMR7.js.map +0 -1
  186. package/dist/chunk-HY6B7B5A.js +0 -150
  187. package/dist/chunk-HY6B7B5A.js.map +0 -1
  188. package/dist/chunk-HZOMOK5Y.js +0 -2728
  189. package/dist/chunk-HZOMOK5Y.js.map +0 -1
  190. package/dist/chunk-IDVRRRAK.cjs +0 -824
  191. package/dist/chunk-IDVRRRAK.cjs.map +0 -1
  192. package/dist/chunk-KC2GDBLS.cjs +0 -84
  193. package/dist/chunk-KC2GDBLS.cjs.map +0 -1
  194. package/dist/chunk-L4EZKIEX.js +0 -185
  195. package/dist/chunk-L4EZKIEX.js.map +0 -1
  196. package/dist/chunk-LNTFRAHF.cjs +0 -473
  197. package/dist/chunk-LNTFRAHF.cjs.map +0 -1
  198. package/dist/chunk-MTIRYI7F.cjs +0 -4
  199. package/dist/chunk-MTIRYI7F.cjs.map +0 -1
  200. package/dist/chunk-N4GN6Q3V.cjs +0 -869
  201. package/dist/chunk-N4GN6Q3V.cjs.map +0 -1
  202. package/dist/chunk-N4H37VN4.cjs +0 -259
  203. package/dist/chunk-N4H37VN4.cjs.map +0 -1
  204. package/dist/chunk-N5QSHUA6.js +0 -1135
  205. package/dist/chunk-N5QSHUA6.js.map +0 -1
  206. package/dist/chunk-NKPKR5BW.cjs +0 -188
  207. package/dist/chunk-NKPKR5BW.cjs.map +0 -1
  208. package/dist/chunk-OIRG6ZRV.cjs +0 -1073
  209. package/dist/chunk-OIRG6ZRV.cjs.map +0 -1
  210. package/dist/chunk-OJ2AM75W.cjs +0 -253
  211. package/dist/chunk-OJ2AM75W.cjs.map +0 -1
  212. package/dist/chunk-OLV7K22H.js +0 -6457
  213. package/dist/chunk-OLV7K22H.js.map +0 -1
  214. package/dist/chunk-OX6GOIPH.js +0 -516
  215. package/dist/chunk-OX6GOIPH.js.map +0 -1
  216. package/dist/chunk-P2YW545G.js +0 -11
  217. package/dist/chunk-P2YW545G.js.map +0 -1
  218. package/dist/chunk-PHJRNPHY.cjs +0 -3291
  219. package/dist/chunk-PHJRNPHY.cjs.map +0 -1
  220. package/dist/chunk-Q72BOAPK.js +0 -817
  221. package/dist/chunk-Q72BOAPK.js.map +0 -1
  222. package/dist/chunk-QU2RFFH4.js +0 -3
  223. package/dist/chunk-QU2RFFH4.js.map +0 -1
  224. package/dist/chunk-RP7VZUEL.js +0 -49
  225. package/dist/chunk-RP7VZUEL.js.map +0 -1
  226. package/dist/chunk-SHTTJMLT.cjs +0 -361
  227. package/dist/chunk-SHTTJMLT.cjs.map +0 -1
  228. package/dist/chunk-SX76DNOO.js +0 -103
  229. package/dist/chunk-SX76DNOO.js.map +0 -1
  230. package/dist/chunk-THBQG64D.cjs +0 -425
  231. package/dist/chunk-THBQG64D.cjs.map +0 -1
  232. package/dist/chunk-TQG7G7YI.cjs +0 -526
  233. package/dist/chunk-TQG7G7YI.cjs.map +0 -1
  234. package/dist/chunk-U3VVLYXG.cjs +0 -189
  235. package/dist/chunk-U3VVLYXG.cjs.map +0 -1
  236. package/dist/chunk-UUDTPZX6.js +0 -193
  237. package/dist/chunk-UUDTPZX6.js.map +0 -1
  238. package/dist/chunk-V5AWATUP.js +0 -1059
  239. package/dist/chunk-V5AWATUP.js.map +0 -1
  240. package/dist/chunk-VAXLFZCV.cjs +0 -110
  241. package/dist/chunk-VAXLFZCV.cjs.map +0 -1
  242. package/dist/chunk-VKREAIBA.cjs +0 -1139
  243. package/dist/chunk-VKREAIBA.cjs.map +0 -1
  244. package/dist/chunk-WDTTHKDS.js +0 -458
  245. package/dist/chunk-WDTTHKDS.js.map +0 -1
  246. package/dist/chunk-WXVB364T.js +0 -218
  247. package/dist/chunk-WXVB364T.js.map +0 -1
  248. package/dist/chunk-X4BPPD6K.js +0 -181
  249. package/dist/chunk-X4BPPD6K.js.map +0 -1
  250. package/dist/chunk-XEB7PH2E.js +0 -81
  251. package/dist/chunk-XEB7PH2E.js.map +0 -1
  252. package/dist/chunk-YT7HXXVN.js +0 -13
  253. package/dist/chunk-YT7HXXVN.js.map +0 -1
  254. package/dist/cli/index.cjs.map +0 -1
  255. package/dist/cli/index.js.map +0 -1
  256. package/dist/client.cjs.map +0 -1
  257. package/dist/client.js.map +0 -1
  258. package/dist/drizzle/index.cjs.map +0 -1
  259. package/dist/drizzle/index.js.map +0 -1
  260. package/dist/fields/index.cjs.map +0 -1
  261. package/dist/fields/index.js.map +0 -1
  262. package/dist/graphql/index.cjs.map +0 -1
  263. package/dist/graphql/index.js.map +0 -1
  264. package/dist/index.cjs.map +0 -1
  265. package/dist/index.js.map +0 -1
  266. package/dist/integration.cjs.map +0 -1
  267. package/dist/integration.js.map +0 -1
  268. package/dist/media-7WDX4BDJ.js +0 -4
  269. package/dist/media-7WDX4BDJ.js.map +0 -1
  270. package/dist/media-TUSLVRQ6.cjs +0 -17
  271. package/dist/media-TUSLVRQ6.cjs.map +0 -1
  272. package/dist/mongo-auth-adapter-GT4S7SCU.cjs +0 -17
  273. package/dist/mongo-auth-adapter-GT4S7SCU.cjs.map +0 -1
  274. package/dist/mongo-auth-adapter-M7VV4LNB.js +0 -4
  275. package/dist/mongo-auth-adapter-M7VV4LNB.js.map +0 -1
  276. package/dist/mongodb/index.cjs.map +0 -1
  277. package/dist/mongodb/index.js.map +0 -1
  278. package/dist/postgres-auth-adapter-AFAPISH7.js +0 -5
  279. package/dist/postgres-auth-adapter-AFAPISH7.js.map +0 -1
  280. package/dist/postgres-auth-adapter-SFDTLONT.cjs +0 -14
  281. package/dist/postgres-auth-adapter-SFDTLONT.cjs.map +0 -1
  282. package/dist/redis-adapter-UQX4EE3B.cjs +0 -13
  283. package/dist/redis-adapter-UQX4EE3B.cjs.map +0 -1
  284. package/dist/redis-adapter-XALOGWY3.js +0 -4
  285. package/dist/redis-adapter-XALOGWY3.js.map +0 -1
  286. package/dist/rest/index.cjs.map +0 -1
  287. package/dist/rest/index.js.map +0 -1
  288. package/dist/schema-6QL3USNB.cjs +0 -67
  289. package/dist/schema-6QL3USNB.cjs.map +0 -1
  290. package/dist/schema-FNNWEAAW.js +0 -6
  291. package/dist/schema-FNNWEAAW.js.map +0 -1
  292. package/dist/sqlite-adapter-AQB5TCGV.cjs +0 -13
  293. package/dist/sqlite-adapter-AQB5TCGV.cjs.map +0 -1
  294. package/dist/sqlite-adapter-N5H6IM2X.js +0 -4
  295. package/dist/sqlite-adapter-N5H6IM2X.js.map +0 -1
  296. package/dist/templates/index.cjs.map +0 -1
  297. package/dist/templates/index.js.map +0 -1
  298. package/dist/trpc/index.cjs.map +0 -1
  299. package/dist/trpc/index.js.map +0 -1
  300. package/dist/ws/index.cjs.map +0 -1
  301. package/dist/ws/index.js.map +0 -1
@@ -1,178 +0,0 @@
1
- 'use strict';
2
-
3
- // src/templates/settings/storage.ts
4
- var localFields = [
5
- { name: "uploadDir", type: "text", label: "Upload Directory", defaultValue: "./public/uploads" },
6
- { name: "baseUrl", type: "text", label: "Base URL", defaultValue: "/uploads" }
7
- ];
8
- var awsFields = [
9
- { name: "bucket", type: "text", label: "Bucket Name", required: true },
10
- { name: "region", type: "text", label: "Region", defaultValue: "us-east-1", admin: { placeholder: "us-east-1" } },
11
- { name: "accessKeyId", type: "text", label: "Access Key ID", required: true },
12
- { name: "secretAccessKey", type: "password", label: "Secret Access Key", required: true },
13
- { name: "endpoint", type: "text", label: "Endpoint URL", admin: { placeholder: "https://s3.custom.com" } },
14
- { name: "cdnUrl", type: "text", label: "CDN URL", admin: { placeholder: "https://cdn.example.com" } },
15
- { name: "prefix", type: "text", label: "Path Prefix", admin: { placeholder: "uploads" } }
16
- ];
17
- var r2Fields = [
18
- { name: "accountId", type: "text", label: "Account ID", required: true, admin: { placeholder: "Your Cloudflare Account ID" } },
19
- { name: "accessKeyId", type: "text", label: "Access Key ID", required: true },
20
- { name: "secretAccessKey", type: "password", label: "Secret Access Key", required: true },
21
- { name: "bucket", type: "text", label: "Bucket Name", required: true },
22
- {
23
- name: "publicDevUrl",
24
- type: "text",
25
- label: "Public Dev URL ID",
26
- admin: {
27
- placeholder: "pub-xxxxxxxxxxxxxxxx",
28
- description: "Enter ONLY the ID (e.g., pub-b8d8c4cc8bcf4d868ddd95efc1b305aa). Do NOT include https:// or the full URL. Found in R2 Dashboard \u2192 Public Dev URL."
29
- }
30
- },
31
- { name: "cdnUrl", type: "text", label: "Custom CDN URL", admin: { placeholder: "https://assets.example.com (optional)" } },
32
- { name: "prefix", type: "text", label: "Path Prefix", admin: { placeholder: "uploads (optional)", description: "Optional prefix for all object keys. Do not use '/' as prefix." } }
33
- ];
34
- var cloudinaryFields = [
35
- { name: "cloudName", type: "text", label: "Cloud Name", required: true },
36
- { name: "apiKey", type: "text", label: "API Key", required: true },
37
- { name: "apiSecret", type: "password", label: "API Secret", required: true },
38
- { name: "folder", type: "text", label: "Folder", admin: { placeholder: "Optional folder path" } },
39
- {
40
- name: "uploadPreset",
41
- type: "text",
42
- label: "Upload Preset (optional)",
43
- admin: { placeholder: "Leave empty for signed uploads", description: "If not set, uploads will be signed with API Secret" }
44
- }
45
- ];
46
- var ftpFields = [
47
- { name: "host", type: "text", label: "Host", required: true, admin: { placeholder: "ftp.example.com" } },
48
- { name: "port", type: "number", label: "Port", defaultValue: 21, admin: { placeholder: "21 for FTP" } },
49
- { name: "user", type: "text", label: "Username", required: true },
50
- { name: "password", type: "password", label: "Password", required: true },
51
- { name: "secure", type: "checkbox", label: "Use TLS/SSL", defaultValue: false, admin: { description: "Enable TLS/SSL for secure connections (FTP only)" } },
52
- { name: "baseUrl", type: "text", label: "Base URL", required: true, admin: { placeholder: "https://files.example.com" } },
53
- { name: "prefix", type: "text", label: "Path Prefix", admin: { placeholder: "uploads" } }
54
- ];
55
- var builtInProviders = [
56
- { type: "local", displayName: "Local Server", configFields: localFields },
57
- { type: "aws", displayName: "S3 Compatible (AWS, Backblaze, Wasabi, etc.)", configFields: awsFields },
58
- { type: "r2", displayName: "Cloudflare R2", configFields: r2Fields },
59
- { type: "cloudinary", displayName: "Cloudinary", configFields: cloudinaryFields },
60
- { type: "ftp", displayName: "FTP", configFields: ftpFields }
61
- ];
62
- var providerOptions = builtInProviders.map((p) => ({
63
- label: p.displayName,
64
- value: p.type
65
- }));
66
- var providerGroups = builtInProviders.map((p) => ({
67
- name: p.type,
68
- type: "group",
69
- label: `${p.displayName} Settings`,
70
- admin: { condition: { field: "provider", equals: p.type } },
71
- fields: p.configFields
72
- }));
73
- var storageSettingsGlobal = {
74
- slug: "storage-settings",
75
- label: "Storage Settings",
76
- admin: { group: "settings" },
77
- access: { read: () => true, update: () => true },
78
- fields: [
79
- {
80
- name: "provider",
81
- type: "select",
82
- label: "Storage Provider",
83
- defaultValue: "local",
84
- options: providerOptions
85
- },
86
- ...providerGroups,
87
- {
88
- name: "limits",
89
- type: "group",
90
- label: "Upload Limits",
91
- fields: [
92
- {
93
- name: "maxFileSize",
94
- type: "number",
95
- label: "Max File Size (bytes)",
96
- defaultValue: 10485760
97
- },
98
- {
99
- name: "allowedTypes",
100
- type: "json",
101
- label: "Allowed MIME Types",
102
- defaultValue: ["image/*", "video/*", "audio/*", "application/pdf"]
103
- },
104
- {
105
- name: "maxFilesPerUpload",
106
- type: "number",
107
- label: "Max Files per Upload",
108
- defaultValue: 10
109
- }
110
- ]
111
- }
112
- ]
113
- };
114
- function createStorageSettingsGlobal(registry, isPluginEnabled) {
115
- const allProviders = registry.getAllAvailable(isPluginEnabled);
116
- const builtInTypes = new Set(builtInProviders.map((p) => p.type));
117
- const hasExtras = allProviders.some((p) => !builtInTypes.has(p.type));
118
- if (!hasExtras) {
119
- return storageSettingsGlobal;
120
- }
121
- const providerOpts = allProviders.map((p) => ({
122
- label: p.displayName,
123
- value: p.type
124
- }));
125
- const groups = allProviders.map((p) => ({
126
- name: p.type,
127
- type: "group",
128
- label: `${p.displayName} Settings`,
129
- admin: { condition: { field: "provider", equals: p.type } },
130
- fields: p.configFields
131
- }));
132
- return {
133
- slug: "storage-settings",
134
- label: "Storage Settings",
135
- admin: { group: "settings" },
136
- access: { read: () => true, update: () => true },
137
- fields: [
138
- {
139
- name: "provider",
140
- type: "select",
141
- label: "Storage Provider",
142
- defaultValue: "local",
143
- options: providerOpts
144
- },
145
- ...groups,
146
- {
147
- name: "limits",
148
- type: "group",
149
- label: "Upload Limits",
150
- fields: [
151
- {
152
- name: "maxFileSize",
153
- type: "number",
154
- label: "Max File Size (bytes)",
155
- defaultValue: 10485760
156
- },
157
- {
158
- name: "allowedTypes",
159
- type: "json",
160
- label: "Allowed MIME Types",
161
- defaultValue: ["image/*", "video/*", "audio/*", "application/pdf"]
162
- },
163
- {
164
- name: "maxFilesPerUpload",
165
- type: "number",
166
- label: "Max Files per Upload",
167
- defaultValue: 10
168
- }
169
- ]
170
- }
171
- ]
172
- };
173
- }
174
-
175
- exports.createStorageSettingsGlobal = createStorageSettingsGlobal;
176
- exports.storageSettingsGlobal = storageSettingsGlobal;
177
- //# sourceMappingURL=chunk-3KTWGODI.cjs.map
178
- //# sourceMappingURL=chunk-3KTWGODI.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/templates/settings/storage.ts"],"names":[],"mappings":"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","file":"chunk-3KTWGODI.cjs","sourcesContent":["import type { GlobalConfig } from \"../../registry/types.js\";\nimport type { Field } from \"../../fields/types.js\";\nimport type { DeclarativeCondition } from \"../../fields/types.js\";\nimport type { StorageProviderRegistry } from \"../../storage/registry.js\";\n\n// ============================================================================\n// Built-in Provider Field Definitions\n// ============================================================================\n// These are defined statically so they are available at build time\n// (for admin config serialization) without requiring a runtime registry.\n\nconst localFields: Field[] = [\n { name: \"uploadDir\", type: \"text\", label: \"Upload Directory\", defaultValue: \"./public/uploads\" },\n { name: \"baseUrl\", type: \"text\", label: \"Base URL\", defaultValue: \"/uploads\" },\n];\n\nconst awsFields: Field[] = [\n { name: \"bucket\", type: \"text\", label: \"Bucket Name\", required: true },\n { name: \"region\", type: \"text\", label: \"Region\", defaultValue: \"us-east-1\", admin: { placeholder: \"us-east-1\" } },\n { name: \"accessKeyId\", type: \"text\", label: \"Access Key ID\", required: true },\n { name: \"secretAccessKey\", type: \"password\", label: \"Secret Access Key\", required: true },\n { name: \"endpoint\", type: \"text\", label: \"Endpoint URL\", admin: { placeholder: \"https://s3.custom.com\" } },\n { name: \"cdnUrl\", type: \"text\", label: \"CDN URL\", admin: { placeholder: \"https://cdn.example.com\" } },\n { name: \"prefix\", type: \"text\", label: \"Path Prefix\", admin: { placeholder: \"uploads\" } },\n];\n\nconst r2Fields: Field[] = [\n { name: \"accountId\", type: \"text\", label: \"Account ID\", required: true, admin: { placeholder: \"Your Cloudflare Account ID\" } },\n { name: \"accessKeyId\", type: \"text\", label: \"Access Key ID\", required: true },\n { name: \"secretAccessKey\", type: \"password\", label: \"Secret Access Key\", required: true },\n { name: \"bucket\", type: \"text\", label: \"Bucket Name\", required: true },\n {\n name: \"publicDevUrl\", type: \"text\", label: \"Public Dev URL ID\",\n admin: {\n placeholder: \"pub-xxxxxxxxxxxxxxxx\",\n description: \"Enter ONLY the ID (e.g., pub-b8d8c4cc8bcf4d868ddd95efc1b305aa). Do NOT include https:// or the full URL. Found in R2 Dashboard → Public Dev URL.\",\n },\n },\n { name: \"cdnUrl\", type: \"text\", label: \"Custom CDN URL\", admin: { placeholder: \"https://assets.example.com (optional)\" } },\n { name: \"prefix\", type: \"text\", label: \"Path Prefix\", admin: { placeholder: \"uploads (optional)\", description: \"Optional prefix for all object keys. Do not use '/' as prefix.\" } },\n];\n\nconst cloudinaryFields: Field[] = [\n { name: \"cloudName\", type: \"text\", label: \"Cloud Name\", required: true },\n { name: \"apiKey\", type: \"text\", label: \"API Key\", required: true },\n { name: \"apiSecret\", type: \"password\", label: \"API Secret\", required: true },\n { name: \"folder\", type: \"text\", label: \"Folder\", admin: { placeholder: \"Optional folder path\" } },\n {\n name: \"uploadPreset\", type: \"text\", label: \"Upload Preset (optional)\",\n admin: { placeholder: \"Leave empty for signed uploads\", description: \"If not set, uploads will be signed with API Secret\" },\n },\n];\n\nconst ftpFields: Field[] = [\n { name: \"host\", type: \"text\", label: \"Host\", required: true, admin: { placeholder: \"ftp.example.com\" } },\n { name: \"port\", type: \"number\", label: \"Port\", defaultValue: 21, admin: { placeholder: \"21 for FTP\" } },\n { name: \"user\", type: \"text\", label: \"Username\", required: true },\n { name: \"password\", type: \"password\", label: \"Password\", required: true },\n { name: \"secure\", type: \"checkbox\", label: \"Use TLS/SSL\", defaultValue: false, admin: { description: \"Enable TLS/SSL for secure connections (FTP only)\" } },\n { name: \"baseUrl\", type: \"text\", label: \"Base URL\", required: true, admin: { placeholder: \"https://files.example.com\" } },\n { name: \"prefix\", type: \"text\", label: \"Path Prefix\", admin: { placeholder: \"uploads\" } },\n];\n\n// All built-in providers and their config field groups\ninterface ProviderDef {\n type: string;\n displayName: string;\n configFields: Field[];\n}\n\nconst builtInProviders: ProviderDef[] = [\n { type: \"local\", displayName: \"Local Server\", configFields: localFields },\n { type: \"aws\", displayName: \"S3 Compatible (AWS, Backblaze, Wasabi, etc.)\", configFields: awsFields },\n { type: \"r2\", displayName: \"Cloudflare R2\", configFields: r2Fields },\n { type: \"cloudinary\", displayName: \"Cloudinary\", configFields: cloudinaryFields },\n { type: \"ftp\", displayName: \"FTP\", configFields: ftpFields },\n];\n\n// ============================================================================\n// Static Storage Settings Global\n// ============================================================================\n// This global is included in allSettingsGlobals so it's available at build time.\n// It uses DeclarativeCondition instead of function conditions so the\n// conditions survive JSON serialization in the admin config.\n\nconst providerOptions = builtInProviders.map((p) => ({\n label: p.displayName,\n value: p.type,\n}));\n\nconst providerGroups: Field[] = builtInProviders.map((p) => ({\n name: p.type,\n type: \"group\" as const,\n label: `${p.displayName} Settings`,\n admin: { condition: { field: \"provider\", equals: p.type } as DeclarativeCondition },\n fields: p.configFields,\n}));\n\nexport const storageSettingsGlobal: GlobalConfig = {\n slug: \"storage-settings\",\n label: \"Storage Settings\",\n admin: { group: \"settings\" },\n access: { read: () => true, update: () => true },\n fields: [\n {\n name: \"provider\",\n type: \"select\",\n label: \"Storage Provider\",\n defaultValue: \"local\",\n options: providerOptions,\n },\n ...providerGroups,\n {\n name: \"limits\",\n type: \"group\",\n label: \"Upload Limits\",\n fields: [\n {\n name: \"maxFileSize\",\n type: \"number\",\n label: \"Max File Size (bytes)\",\n defaultValue: 10485760,\n },\n {\n name: \"allowedTypes\",\n type: \"json\",\n label: \"Allowed MIME Types\",\n defaultValue: [\"image/*\", \"video/*\", \"audio/*\", \"application/pdf\"],\n },\n {\n name: \"maxFilesPerUpload\",\n type: \"number\",\n label: \"Max Files per Upload\",\n defaultValue: 10,\n },\n ],\n },\n ],\n};\n\n// ============================================================================\n// Dynamic Storage Settings Global (runtime)\n// ============================================================================\n// Called at runtime to build a storage settings global that includes\n// any additional providers registered by plugins via the StorageProviderRegistry.\n// Falls back to the static global if no extra providers were added.\n\nexport function createStorageSettingsGlobal(\n registry: StorageProviderRegistry,\n isPluginEnabled?: (name: string) => boolean,\n): GlobalConfig {\n const allProviders = registry.getAllAvailable(isPluginEnabled);\n\n // If only the built-in providers are registered, return the static global\n const builtInTypes = new Set(builtInProviders.map((p) => p.type));\n const hasExtras = allProviders.some((p) => !builtInTypes.has(p.type));\n\n if (!hasExtras) {\n return storageSettingsGlobal;\n }\n\n // Build extended global with additional providers\n const providerOpts = allProviders.map((p) => ({\n label: p.displayName,\n value: p.type,\n }));\n\n const groups: Field[] = allProviders.map((p) => ({\n name: p.type,\n type: \"group\" as const,\n label: `${p.displayName} Settings`,\n admin: { condition: { field: \"provider\", equals: p.type } as DeclarativeCondition },\n fields: p.configFields,\n }));\n\n return {\n slug: \"storage-settings\",\n label: \"Storage Settings\",\n admin: { group: \"settings\" },\n access: { read: () => true, update: () => true },\n fields: [\n {\n name: \"provider\",\n type: \"select\",\n label: \"Storage Provider\",\n defaultValue: \"local\",\n options: providerOpts,\n },\n ...groups,\n {\n name: \"limits\",\n type: \"group\",\n label: \"Upload Limits\",\n fields: [\n {\n name: \"maxFileSize\",\n type: \"number\",\n label: \"Max File Size (bytes)\",\n defaultValue: 10485760,\n },\n {\n name: \"allowedTypes\",\n type: \"json\",\n label: \"Allowed MIME Types\",\n defaultValue: [\"image/*\", \"video/*\", \"audio/*\", \"application/pdf\"],\n },\n {\n name: \"maxFilesPerUpload\",\n type: \"number\",\n label: \"Max Files per Upload\",\n defaultValue: 10,\n },\n ],\n },\n ],\n };\n}\n"]}
@@ -1,4 +0,0 @@
1
- 'use strict';
2
-
3
- //# sourceMappingURL=chunk-3YELQL7Z.cjs.map
4
- //# sourceMappingURL=chunk-3YELQL7Z.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-3YELQL7Z.cjs"}
@@ -1,24 +0,0 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __esm = (fn, res) => function __init() {
6
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
7
- };
8
- var __export = (target, all) => {
9
- for (var name in all)
10
- __defProp(target, name, { get: all[name], enumerable: true });
11
- };
12
- var __copyProps = (to, from, except, desc) => {
13
- if (from && typeof from === "object" || typeof from === "function") {
14
- for (let key of __getOwnPropNames(from))
15
- if (!__hasOwnProp.call(to, key) && key !== except)
16
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
- }
18
- return to;
19
- };
20
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
21
-
22
- export { __esm, __export, __toCommonJS };
23
- //# sourceMappingURL=chunk-4CV4JOE5.js.map
24
- //# sourceMappingURL=chunk-4CV4JOE5.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-4CV4JOE5.js"}
@@ -1,173 +0,0 @@
1
- 'use strict';
2
-
3
- var crypto = require('crypto');
4
-
5
- // src/access/types.ts
6
- async function evaluateAccess(access, args) {
7
- if (typeof access === "boolean") {
8
- return access;
9
- }
10
- if (typeof access === "function") {
11
- return await access(args);
12
- }
13
- return true;
14
- }
15
- function mergeWhereClauses(...whereClauses) {
16
- const result = {};
17
- for (const clause of whereClauses) {
18
- if (clause && typeof clause === "object") {
19
- Object.assign(result, clause);
20
- }
21
- }
22
- return result;
23
- }
24
- function getWhereClause(access, args) {
25
- return evaluateAccess(access, args).then((result) => {
26
- if (result === true) return void 0;
27
- if (result === false) return { _id: { $eq: null } };
28
- return result;
29
- });
30
- }
31
- var API_KEY_COLLECTION = "api_keys";
32
- function generateKeyPrefix(key) {
33
- return key.substring(0, 8);
34
- }
35
- function constantTimeCompare(a, b) {
36
- if (a.length !== b.length) {
37
- return false;
38
- }
39
- try {
40
- return crypto.timingSafeEqual(Buffer.from(a), Buffer.from(b));
41
- } catch {
42
- return false;
43
- }
44
- }
45
- async function validateApiKey(rawKey, db, userLookup) {
46
- if (!rawKey || typeof rawKey !== "string") {
47
- return { valid: false, error: "No API key provided" };
48
- }
49
- if (!rawKey.startsWith("kyro_")) {
50
- return { valid: false, error: "Invalid API key format" };
51
- }
52
- const keyPrefix = generateKeyPrefix(rawKey);
53
- try {
54
- const result = await db.find({
55
- collection: API_KEY_COLLECTION,
56
- where: { keyPrefix: { equals: keyPrefix } },
57
- limit: 100,
58
- page: 1
59
- });
60
- if (!result.docs || result.docs.length === 0) {
61
- return { valid: false, error: "Invalid API key" };
62
- }
63
- let matchedKey = null;
64
- for (const doc of result.docs) {
65
- const record = doc;
66
- if (constantTimeCompare(record.key, rawKey)) {
67
- matchedKey = record;
68
- break;
69
- }
70
- }
71
- if (!matchedKey) {
72
- return { valid: false, error: "Invalid API key" };
73
- }
74
- if (matchedKey.expiresAt) {
75
- const expiresAt = new Date(matchedKey.expiresAt);
76
- if (expiresAt < /* @__PURE__ */ new Date()) {
77
- return { valid: false, error: "API key has expired" };
78
- }
79
- }
80
- try {
81
- await db.update({
82
- collection: API_KEY_COLLECTION,
83
- id: matchedKey.id,
84
- data: { lastUsedAt: (/* @__PURE__ */ new Date()).toISOString() }
85
- });
86
- } catch {
87
- }
88
- const user = {
89
- id: matchedKey.userId,
90
- role: matchedKey.role || "author",
91
- tenantId: matchedKey.tenantId
92
- };
93
- if (userLookup) {
94
- const dbUser = await userLookup(matchedKey.userId);
95
- if (dbUser) {
96
- Object.assign(user, dbUser);
97
- }
98
- }
99
- return {
100
- valid: true,
101
- userId: matchedKey.userId,
102
- user,
103
- permissions: matchedKey.permissions || [],
104
- apiKeyId: matchedKey.id,
105
- tenantId: user.tenantId,
106
- role: user.role
107
- };
108
- } catch (error) {
109
- console.error("[ApiKey] Validation error:", error);
110
- return { valid: false, error: "Failed to validate API key" };
111
- }
112
- }
113
- function extractApiKeyFromRequest(request) {
114
- const authHeader = request.headers.get("Authorization");
115
- if (authHeader) {
116
- if (authHeader.startsWith("ApiKey ")) {
117
- return authHeader.slice(7).trim();
118
- }
119
- if (authHeader.startsWith("Bearer ")) {
120
- return null;
121
- }
122
- }
123
- const xApiKey = request.headers.get("X-API-Key");
124
- if (xApiKey) {
125
- return xApiKey.trim();
126
- }
127
- return null;
128
- }
129
- function createApiKeyContext(result) {
130
- if (!result.valid || !result.userId) {
131
- return null;
132
- }
133
- return {
134
- userId: result.userId,
135
- user: result.user || {},
136
- permissions: result.permissions || [],
137
- apiKeyId: result.apiKeyId || "",
138
- tenantId: result.tenantId,
139
- role: result.role
140
- };
141
- }
142
- function hasApiKeyPermission(permissions, required) {
143
- if (permissions.length === 0) return false;
144
- if (permissions.includes("*")) return true;
145
- if (permissions.includes(required)) return true;
146
- const [resource, action] = required.split(":");
147
- if (permissions.includes(`${resource}:*`)) return true;
148
- return false;
149
- }
150
- function generateApiKey() {
151
- const chars = "abcdefghijklmnopqrstuvwxyz0123456789";
152
- let suffix = "";
153
- for (let i = 0; i < 32; i++) {
154
- suffix += chars[Math.floor(Math.random() * chars.length)];
155
- }
156
- return `kyro_${suffix}`;
157
- }
158
- function generateApiKeyPrefix(key) {
159
- return key.substring(0, 8);
160
- }
161
-
162
- exports.API_KEY_COLLECTION = API_KEY_COLLECTION;
163
- exports.createApiKeyContext = createApiKeyContext;
164
- exports.evaluateAccess = evaluateAccess;
165
- exports.extractApiKeyFromRequest = extractApiKeyFromRequest;
166
- exports.generateApiKey = generateApiKey;
167
- exports.generateApiKeyPrefix = generateApiKeyPrefix;
168
- exports.getWhereClause = getWhereClause;
169
- exports.hasApiKeyPermission = hasApiKeyPermission;
170
- exports.mergeWhereClauses = mergeWhereClauses;
171
- exports.validateApiKey = validateApiKey;
172
- //# sourceMappingURL=chunk-4OCMVGEY.cjs.map
173
- //# sourceMappingURL=chunk-4OCMVGEY.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access/types.ts","../src/auth/api-key.ts"],"names":["timingSafeEqual"],"mappings":"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","file":"chunk-4OCMVGEY.cjs","sourcesContent":["import type { User, Request } from '../hooks/types.js';\n\n// ============================================================================\n// Access Control Types\n// ============================================================================\n\nexport interface WhereClause {\n [field: string]: any;\n}\n\nexport interface AccessArgs {\n req: Request;\n user?: User;\n data?: unknown;\n doc?: unknown;\n id?: string;\n tenantID?: string;\n context?: Record<string, unknown>;\n}\n\nexport type AccessControl = boolean | ((args: AccessArgs) => Promise<boolean | WhereClause> | boolean | WhereClause);\n\nexport interface CollectionAccess {\n create?: AccessControl;\n read?: AccessControl;\n update?: AccessControl;\n delete?: AccessControl;\n admin?: AccessControl;\n unlock?: AccessControl;\n readVersions?: AccessControl;\n}\n\nexport interface GlobalAccess {\n read?: AccessControl;\n update?: AccessControl;\n}\n\nexport interface FieldAccess {\n create?: AccessControl;\n read?: AccessControl;\n update?: AccessControl;\n}\n\n// ============================================================================\n// Access Control Evaluation\n// ============================================================================\n\nexport async function evaluateAccess(\n access: AccessControl,\n args: AccessArgs\n): Promise<boolean | WhereClause> {\n if (typeof access === 'boolean') {\n return access;\n }\n if (typeof access === 'function') {\n return await access(args);\n }\n return true;\n}\n\nexport function mergeWhereClauses(\n ...whereClauses: (WhereClause | boolean | undefined)[]\n): WhereClause {\n const result: WhereClause = {};\n for (const clause of whereClauses) {\n if (clause && typeof clause === 'object') {\n Object.assign(result, clause);\n }\n }\n return result;\n}\n\nexport function getWhereClause(\n access: AccessControl,\n args: AccessArgs\n): Promise<WhereClause | undefined> {\n return evaluateAccess(access, args).then(result => {\n if (result === true) return undefined;\n if (result === false) return { _id: { $eq: null } };\n return result;\n });\n}\n","import { timingSafeEqual } from \"crypto\";\nimport type { BaseAdapter } from \"../registry/types.js\";\nimport type { AuthUser, UserRole } from \"./types.js\";\n\nexport interface ApiKeyRecord {\n id: string;\n userId: string;\n name: string;\n key: string;\n keyPrefix: string;\n permissions: string[];\n lastUsedAt?: string;\n expiresAt?: string;\n createdAt: string;\n}\n\nexport interface ApiKeyValidationResult {\n valid: boolean;\n userId?: string;\n user?: Partial<AuthUser>;\n permissions?: string[];\n apiKeyId?: string;\n error?: string;\n tenantId?: string;\n role?: UserRole;\n}\n\nexport interface ApiKeyContext {\n userId: string;\n user: Partial<AuthUser>;\n permissions: string[];\n apiKeyId: string;\n tenantId?: string;\n role?: UserRole;\n}\n\nexport const API_KEY_COLLECTION = \"api_keys\";\n\nfunction generateKeyPrefix(key: string): string {\n return key.substring(0, 8);\n}\n\nfunction constantTimeCompare(a: string, b: string): boolean {\n if (a.length !== b.length) {\n return false;\n }\n try {\n return timingSafeEqual(Buffer.from(a), Buffer.from(b));\n } catch {\n return false;\n }\n}\n\nexport async function validateApiKey(\n rawKey: string,\n db: BaseAdapter,\n userLookup?: (userId: string) => Promise<Partial<AuthUser> | null>,\n): Promise<ApiKeyValidationResult> {\n if (!rawKey || typeof rawKey !== \"string\") {\n return { valid: false, error: \"No API key provided\" };\n }\n\n if (!rawKey.startsWith(\"kyro_\")) {\n return { valid: false, error: \"Invalid API key format\" };\n }\n\n const keyPrefix = generateKeyPrefix(rawKey);\n\n try {\n const result = await db.find({\n collection: API_KEY_COLLECTION,\n where: { keyPrefix: { equals: keyPrefix } },\n limit: 100,\n page: 1,\n });\n\n if (!result.docs || result.docs.length === 0) {\n return { valid: false, error: \"Invalid API key\" };\n }\n\n let matchedKey: ApiKeyRecord | null = null;\n for (const doc of result.docs) {\n const record = doc as unknown as ApiKeyRecord;\n if (constantTimeCompare(record.key, rawKey)) {\n matchedKey = record;\n break;\n }\n }\n\n if (!matchedKey) {\n return { valid: false, error: \"Invalid API key\" };\n }\n\n if (matchedKey.expiresAt) {\n const expiresAt = new Date(matchedKey.expiresAt);\n if (expiresAt < new Date()) {\n return { valid: false, error: \"API key has expired\" };\n }\n }\n\n try {\n await db.update({\n collection: API_KEY_COLLECTION,\n id: matchedKey.id,\n data: { lastUsedAt: new Date().toISOString() },\n });\n } catch {\n // Non-critical: don't fail if lastUsedAt update fails\n }\n\n const user: Partial<AuthUser> = {\n id: matchedKey.userId,\n role: (matchedKey as any).role || \"author\",\n tenantId: (matchedKey as any).tenantId,\n };\n\n if (userLookup) {\n const dbUser = await userLookup(matchedKey.userId);\n if (dbUser) {\n Object.assign(user, dbUser);\n }\n }\n\n return {\n valid: true,\n userId: matchedKey.userId,\n user,\n permissions: matchedKey.permissions || [],\n apiKeyId: matchedKey.id,\n tenantId: user.tenantId,\n role: user.role,\n };\n } catch (error) {\n console.error(\"[ApiKey] Validation error:\", error);\n return { valid: false, error: \"Failed to validate API key\" };\n }\n}\n\nexport function extractApiKeyFromRequest(request: Request): string | null {\n const authHeader = request.headers.get(\"Authorization\");\n if (authHeader) {\n if (authHeader.startsWith(\"ApiKey \")) {\n return authHeader.slice(7).trim();\n }\n if (authHeader.startsWith(\"Bearer \")) {\n return null;\n }\n }\n\n const xApiKey = request.headers.get(\"X-API-Key\");\n if (xApiKey) {\n return xApiKey.trim();\n }\n\n return null;\n}\n\nexport function createApiKeyContext(\n result: ApiKeyValidationResult,\n): ApiKeyContext | null {\n if (!result.valid || !result.userId) {\n return null;\n }\n return {\n userId: result.userId,\n user: result.user || {},\n permissions: result.permissions || [],\n apiKeyId: result.apiKeyId || \"\",\n tenantId: result.tenantId,\n role: result.role,\n };\n}\n\nexport function hasApiKeyPermission(\n permissions: string[],\n required: string,\n): boolean {\n if (permissions.length === 0) return false;\n if (permissions.includes(\"*\")) return true;\n if (permissions.includes(required)) return true;\n\n const [resource, action] = required.split(\":\");\n if (permissions.includes(`${resource}:*`)) return true;\n\n return false;\n}\n\nexport function generateApiKey(): string {\n const chars = \"abcdefghijklmnopqrstuvwxyz0123456789\";\n let suffix = \"\";\n for (let i = 0; i < 32; i++) {\n suffix += chars[Math.floor(Math.random() * chars.length)];\n }\n return `kyro_${suffix}`;\n}\n\nexport function generateApiKeyPrefix(key: string): string {\n return key.substring(0, 8);\n}\n"]}
@@ -1,15 +0,0 @@
1
- 'use strict';
2
-
3
- var pgCore = require('drizzle-orm/pg-core');
4
-
5
- // src/database/drizzle/schema/settings.ts
6
- var settings = pgCore.pgTable("settings", {
7
- key: pgCore.varchar("key", { length: 255 }).primaryKey(),
8
- value: pgCore.text("value").notNull(),
9
- description: pgCore.text("description"),
10
- updatedAt: pgCore.timestamp("updated_at").defaultNow()
11
- });
12
-
13
- exports.settings = settings;
14
- //# sourceMappingURL=chunk-4PWRCMTQ.cjs.map
15
- //# sourceMappingURL=chunk-4PWRCMTQ.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/database/drizzle/schema/settings.ts"],"names":["pgTable","varchar","text","timestamp"],"mappings":";;;;;AAEO,IAAM,QAAA,GAAWA,eAAQ,UAAA,EAAY;AAAA,EAC1C,GAAA,EAAKC,eAAQ,KAAA,EAAO,EAAE,QAAQ,GAAA,EAAK,EAAE,UAAA,EAAW;AAAA,EAChD,KAAA,EAAOC,WAAA,CAAK,OAAO,CAAA,CAAE,OAAA,EAAQ;AAAA,EAC7B,WAAA,EAAaA,YAAK,aAAa,CAAA;AAAA,EAC/B,SAAA,EAAWC,gBAAA,CAAU,YAAY,CAAA,CAAE,UAAA;AACrC,CAAC","file":"chunk-4PWRCMTQ.cjs","sourcesContent":["import { pgTable, varchar, text, timestamp } from \"drizzle-orm/pg-core\";\n\nexport const settings = pgTable(\"settings\", {\n key: varchar(\"key\", { length: 255 }).primaryKey(),\n value: text(\"value\").notNull(),\n description: text(\"description\"),\n updatedAt: timestamp(\"updated_at\").defaultNow(),\n});\n\nexport type Setting = typeof settings.$inferSelect;\nexport type NewSetting = typeof settings.$inferInsert;\n"]}