@aphexcms/cms-core 0.1.6 → 0.1.8

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 (350) hide show
  1. package/package.json +8 -4
  2. package/src/lib/api/assets.ts +75 -0
  3. package/src/lib/api/client.ts +150 -0
  4. package/src/lib/api/documents.ts +102 -0
  5. package/src/lib/api/index.ts +7 -0
  6. package/src/lib/api/organizations.ts +154 -0
  7. package/src/lib/api/types.ts +34 -0
  8. package/src/lib/auth/auth-errors.ts +23 -0
  9. package/src/lib/auth/auth-hooks.ts +132 -0
  10. package/src/lib/auth/provider.ts +25 -0
  11. package/{dist/client/index.js → src/lib/client/index.ts} +19 -8
  12. package/{dist → src/lib}/components/AdminApp.svelte +4 -5
  13. package/{dist → src/lib}/components/admin/DocumentEditor.svelte +7 -7
  14. package/{dist → src/lib}/components/admin/SchemaField.svelte +1 -1
  15. package/{dist → src/lib}/components/admin/fields/ArrayField.svelte +3 -3
  16. package/{dist → src/lib}/components/admin/fields/BooleanField.svelte +1 -1
  17. package/{dist → src/lib}/components/admin/fields/ImageField.svelte +40 -13
  18. package/{dist → src/lib}/components/admin/fields/NumberField.svelte +1 -1
  19. package/{dist → src/lib}/components/admin/fields/ReferenceField.svelte +2 -2
  20. package/{dist → src/lib}/components/admin/fields/SlugField.svelte +2 -2
  21. package/{dist → src/lib}/components/admin/fields/StringField.svelte +1 -1
  22. package/{dist → src/lib}/components/admin/fields/TextareaField.svelte +1 -1
  23. package/{dist/components/index.js → src/lib/components/index.ts} +5 -1
  24. package/{dist → src/lib}/components/layout/OrganizationSwitcher.svelte +2 -2
  25. package/{dist → src/lib}/components/layout/Sidebar.svelte +1 -1
  26. package/{dist → src/lib}/components/layout/sidebar/AppSidebar.svelte +1 -1
  27. package/{dist → src/lib}/components/layout/sidebar/NavUser.svelte +1 -1
  28. package/src/lib/config.ts +18 -0
  29. package/{dist/db/adapters/index.js → src/lib/db/adapters/index.ts} +0 -1
  30. package/{dist/db/index.js → src/lib/db/index.ts} +2 -1
  31. package/src/lib/db/interfaces/asset.ts +61 -0
  32. package/src/lib/db/interfaces/document.ts +53 -0
  33. package/src/lib/db/interfaces/index.ts +98 -0
  34. package/src/lib/db/interfaces/organization.ts +51 -0
  35. package/src/lib/db/interfaces/schema.ts +13 -0
  36. package/src/lib/db/interfaces/user.ts +16 -0
  37. package/src/lib/db/utils/reference-resolver.ts +119 -0
  38. package/src/lib/define.ts +7 -0
  39. package/{dist/email/index.js → src/lib/email/index.ts} +2 -1
  40. package/src/lib/email/interfaces/email.ts +45 -0
  41. package/src/lib/engine.ts +85 -0
  42. package/src/lib/field-validation/rule.ts +287 -0
  43. package/src/lib/field-validation/utils.ts +91 -0
  44. package/src/lib/hooks.ts +142 -0
  45. package/{dist/index.js → src/lib/index.ts} +2 -1
  46. package/{dist/is-mobile.svelte.js → src/lib/is-mobile.svelte.ts} +5 -3
  47. package/src/lib/routes/assets-by-id.ts +161 -0
  48. package/src/lib/routes/assets-cdn.ts +185 -0
  49. package/src/lib/routes/assets.ts +116 -0
  50. package/src/lib/routes/documents-by-id.ts +188 -0
  51. package/src/lib/routes/documents-publish.ts +211 -0
  52. package/src/lib/routes/documents.ts +172 -0
  53. package/src/lib/routes/index.ts +13 -0
  54. package/src/lib/routes/organizations-by-id.ts +258 -0
  55. package/src/lib/routes/organizations-invitations.ts +183 -0
  56. package/src/lib/routes/organizations-members.ts +301 -0
  57. package/src/lib/routes/organizations-switch.ts +74 -0
  58. package/src/lib/routes/organizations.ts +147 -0
  59. package/src/lib/routes/schemas-by-type.ts +35 -0
  60. package/src/lib/routes/schemas.ts +19 -0
  61. package/{dist/routes-exports.js → src/lib/routes-exports.ts} +28 -5
  62. package/src/lib/schema-context.svelte.ts +24 -0
  63. package/src/lib/schema-utils/cleanup.ts +116 -0
  64. package/src/lib/schema-utils/index.ts +4 -0
  65. package/src/lib/schema-utils/utils.ts +47 -0
  66. package/src/lib/schema-utils/validator.ts +58 -0
  67. package/src/lib/server/index.ts +40 -0
  68. package/src/lib/services/asset-service.ts +256 -0
  69. package/src/lib/services/index.ts +6 -0
  70. package/src/lib/storage/adapters/index.ts +2 -0
  71. package/src/lib/storage/adapters/local-storage-adapter.ts +215 -0
  72. package/{dist/storage/index.js → src/lib/storage/index.ts} +4 -2
  73. package/src/lib/storage/interfaces/index.ts +2 -0
  74. package/src/lib/storage/interfaces/storage.ts +114 -0
  75. package/src/lib/storage/providers/storage.ts +83 -0
  76. package/src/lib/types/asset.ts +81 -0
  77. package/src/lib/types/auth.ts +80 -0
  78. package/src/lib/types/config.ts +45 -0
  79. package/src/lib/types/document.ts +38 -0
  80. package/src/lib/types/index.ts +8 -0
  81. package/src/lib/types/organization.ts +119 -0
  82. package/src/lib/types/schemas.ts +151 -0
  83. package/src/lib/types/sidebar.ts +37 -0
  84. package/src/lib/types/user.ts +17 -0
  85. package/src/lib/utils/content-hash.ts +75 -0
  86. package/src/lib/utils/image-url.ts +204 -0
  87. package/src/lib/utils/index.ts +12 -0
  88. package/src/lib/utils/slug.ts +33 -0
  89. package/src/lib/utils.ts +13 -0
  90. package/dist/api/assets.d.ts +0 -48
  91. package/dist/api/assets.d.ts.map +0 -1
  92. package/dist/api/assets.js +0 -52
  93. package/dist/api/client.d.ts +0 -37
  94. package/dist/api/client.d.ts.map +0 -1
  95. package/dist/api/client.js +0 -125
  96. package/dist/api/documents.d.ts +0 -56
  97. package/dist/api/documents.d.ts.map +0 -1
  98. package/dist/api/documents.js +0 -77
  99. package/dist/api/index.d.ts +0 -7
  100. package/dist/api/index.d.ts.map +0 -1
  101. package/dist/api/index.js +0 -5
  102. package/dist/api/organizations.d.ts +0 -101
  103. package/dist/api/organizations.d.ts.map +0 -1
  104. package/dist/api/organizations.js +0 -92
  105. package/dist/api/types.d.ts +0 -23
  106. package/dist/api/types.d.ts.map +0 -1
  107. package/dist/api/types.js +0 -1
  108. package/dist/auth/auth-errors.d.ts +0 -7
  109. package/dist/auth/auth-errors.d.ts.map +0 -1
  110. package/dist/auth/auth-errors.js +0 -13
  111. package/dist/auth/auth-hooks.d.ts +0 -6
  112. package/dist/auth/auth-hooks.d.ts.map +0 -1
  113. package/dist/auth/auth-hooks.js +0 -108
  114. package/dist/auth/provider.d.ts +0 -17
  115. package/dist/auth/provider.d.ts.map +0 -1
  116. package/dist/auth/provider.js +0 -1
  117. package/dist/client/index.d.ts +0 -24
  118. package/dist/client/index.d.ts.map +0 -1
  119. package/dist/components/AdminApp.svelte.d.ts +0 -24
  120. package/dist/components/AdminApp.svelte.d.ts.map +0 -1
  121. package/dist/components/admin/AdminLayout.svelte.d.ts +0 -15
  122. package/dist/components/admin/AdminLayout.svelte.d.ts.map +0 -1
  123. package/dist/components/admin/DocumentEditor.svelte.d.ts +0 -18
  124. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +0 -1
  125. package/dist/components/admin/DocumentTypesList.svelte.d.ts +0 -14
  126. package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +0 -1
  127. package/dist/components/admin/ObjectModal.svelte.d.ts +0 -15
  128. package/dist/components/admin/ObjectModal.svelte.d.ts.map +0 -1
  129. package/dist/components/admin/SchemaField.svelte.d.ts +0 -19
  130. package/dist/components/admin/SchemaField.svelte.d.ts.map +0 -1
  131. package/dist/components/admin/fields/ArrayField.svelte.d.ts +0 -12
  132. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +0 -1
  133. package/dist/components/admin/fields/BooleanField.svelte.d.ts +0 -13
  134. package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +0 -1
  135. package/dist/components/admin/fields/ImageField.svelte.d.ts +0 -15
  136. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +0 -1
  137. package/dist/components/admin/fields/NumberField.svelte.d.ts +0 -14
  138. package/dist/components/admin/fields/NumberField.svelte.d.ts.map +0 -1
  139. package/dist/components/admin/fields/ReferenceField.svelte.d.ts +0 -12
  140. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +0 -1
  141. package/dist/components/admin/fields/SlugField.svelte.d.ts +0 -15
  142. package/dist/components/admin/fields/SlugField.svelte.d.ts.map +0 -1
  143. package/dist/components/admin/fields/StringField.svelte.d.ts +0 -14
  144. package/dist/components/admin/fields/StringField.svelte.d.ts.map +0 -1
  145. package/dist/components/admin/fields/TextareaField.svelte.d.ts +0 -14
  146. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +0 -1
  147. package/dist/components/fields/index.d.ts +0 -9
  148. package/dist/components/fields/index.d.ts.map +0 -1
  149. package/dist/components/index.d.ts +0 -7
  150. package/dist/components/index.d.ts.map +0 -1
  151. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +0 -11
  152. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +0 -1
  153. package/dist/components/layout/Sidebar.svelte.d.ts +0 -14
  154. package/dist/components/layout/Sidebar.svelte.d.ts.map +0 -1
  155. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +0 -11
  156. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +0 -1
  157. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +0 -19
  158. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +0 -1
  159. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +0 -9
  160. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +0 -1
  161. package/dist/components/layout/sidebar/NavUser.svelte.d.ts +0 -9
  162. package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +0 -1
  163. package/dist/config.d.ts +0 -3
  164. package/dist/config.d.ts.map +0 -1
  165. package/dist/config.js +0 -15
  166. package/dist/db/adapters/index.d.ts +0 -1
  167. package/dist/db/adapters/index.d.ts.map +0 -1
  168. package/dist/db/index.d.ts +0 -2
  169. package/dist/db/index.d.ts.map +0 -1
  170. package/dist/db/interfaces/asset.d.ts +0 -51
  171. package/dist/db/interfaces/asset.d.ts.map +0 -1
  172. package/dist/db/interfaces/asset.js +0 -1
  173. package/dist/db/interfaces/document.d.ts +0 -36
  174. package/dist/db/interfaces/document.d.ts.map +0 -1
  175. package/dist/db/interfaces/document.js +0 -1
  176. package/dist/db/interfaces/index.d.ts +0 -73
  177. package/dist/db/interfaces/index.d.ts.map +0 -1
  178. package/dist/db/interfaces/index.js +0 -1
  179. package/dist/db/interfaces/organization.d.ts +0 -27
  180. package/dist/db/interfaces/organization.d.ts.map +0 -1
  181. package/dist/db/interfaces/organization.js +0 -1
  182. package/dist/db/interfaces/schema.d.ts +0 -21
  183. package/dist/db/interfaces/schema.d.ts.map +0 -1
  184. package/dist/db/interfaces/schema.js +0 -1
  185. package/dist/db/interfaces/user.d.ts +0 -15
  186. package/dist/db/interfaces/user.d.ts.map +0 -1
  187. package/dist/db/interfaces/user.js +0 -1
  188. package/dist/db/utils/reference-resolver.d.ts +0 -18
  189. package/dist/db/utils/reference-resolver.d.ts.map +0 -1
  190. package/dist/db/utils/reference-resolver.js +0 -80
  191. package/dist/define.d.ts +0 -3
  192. package/dist/define.d.ts.map +0 -1
  193. package/dist/define.js +0 -4
  194. package/dist/email/index.d.ts +0 -2
  195. package/dist/email/index.d.ts.map +0 -1
  196. package/dist/email/interfaces/email.d.ts +0 -42
  197. package/dist/email/interfaces/email.d.ts.map +0 -1
  198. package/dist/email/interfaces/email.js +0 -1
  199. package/dist/engine.d.ts +0 -26
  200. package/dist/engine.d.ts.map +0 -1
  201. package/dist/engine.js +0 -66
  202. package/dist/field-validation/rule.d.ts +0 -51
  203. package/dist/field-validation/rule.d.ts.map +0 -1
  204. package/dist/field-validation/rule.js +0 -221
  205. package/dist/field-validation/utils.d.ts +0 -21
  206. package/dist/field-validation/utils.d.ts.map +0 -1
  207. package/dist/field-validation/utils.js +0 -66
  208. package/dist/hooks.d.ts +0 -23
  209. package/dist/hooks.d.ts.map +0 -1
  210. package/dist/hooks.js +0 -96
  211. package/dist/index.d.ts +0 -2
  212. package/dist/index.d.ts.map +0 -1
  213. package/dist/is-mobile.svelte.d.ts +0 -5
  214. package/dist/is-mobile.svelte.d.ts.map +0 -1
  215. package/dist/routes/assets-by-id.d.ts +0 -5
  216. package/dist/routes/assets-by-id.d.ts.map +0 -1
  217. package/dist/routes/assets-by-id.js +0 -138
  218. package/dist/routes/assets-cdn.d.ts +0 -3
  219. package/dist/routes/assets-cdn.d.ts.map +0 -1
  220. package/dist/routes/assets-cdn.js +0 -155
  221. package/dist/routes/assets.d.ts +0 -4
  222. package/dist/routes/assets.d.ts.map +0 -1
  223. package/dist/routes/assets.js +0 -94
  224. package/dist/routes/documents-by-id.d.ts +0 -5
  225. package/dist/routes/documents-by-id.d.ts.map +0 -1
  226. package/dist/routes/documents-by-id.js +0 -142
  227. package/dist/routes/documents-publish.d.ts +0 -4
  228. package/dist/routes/documents-publish.d.ts.map +0 -1
  229. package/dist/routes/documents-publish.js +0 -151
  230. package/dist/routes/documents.d.ts +0 -4
  231. package/dist/routes/documents.d.ts.map +0 -1
  232. package/dist/routes/documents.js +0 -131
  233. package/dist/routes/index.d.ts +0 -6
  234. package/dist/routes/index.d.ts.map +0 -1
  235. package/dist/routes/index.js +0 -10
  236. package/dist/routes/organizations-by-id.d.ts +0 -5
  237. package/dist/routes/organizations-by-id.d.ts.map +0 -1
  238. package/dist/routes/organizations-by-id.js +0 -187
  239. package/dist/routes/organizations-invitations.d.ts +0 -4
  240. package/dist/routes/organizations-invitations.d.ts.map +0 -1
  241. package/dist/routes/organizations-invitations.js +0 -125
  242. package/dist/routes/organizations-members.d.ts +0 -5
  243. package/dist/routes/organizations-members.d.ts.map +0 -1
  244. package/dist/routes/organizations-members.js +0 -206
  245. package/dist/routes/organizations-switch.d.ts +0 -3
  246. package/dist/routes/organizations-switch.d.ts.map +0 -1
  247. package/dist/routes/organizations-switch.js +0 -53
  248. package/dist/routes/organizations.d.ts +0 -4
  249. package/dist/routes/organizations.d.ts.map +0 -1
  250. package/dist/routes/organizations.js +0 -108
  251. package/dist/routes/schemas-by-type.d.ts +0 -3
  252. package/dist/routes/schemas-by-type.d.ts.map +0 -1
  253. package/dist/routes/schemas-by-type.js +0 -25
  254. package/dist/routes/schemas.d.ts +0 -3
  255. package/dist/routes/schemas.d.ts.map +0 -1
  256. package/dist/routes/schemas.js +0 -11
  257. package/dist/routes-exports.d.ts +0 -14
  258. package/dist/routes-exports.d.ts.map +0 -1
  259. package/dist/schema-context.svelte.d.ts +0 -10
  260. package/dist/schema-context.svelte.d.ts.map +0 -1
  261. package/dist/schema-context.svelte.js +0 -18
  262. package/dist/schema-utils/cleanup.d.ts +0 -21
  263. package/dist/schema-utils/cleanup.d.ts.map +0 -1
  264. package/dist/schema-utils/cleanup.js +0 -80
  265. package/dist/schema-utils/index.d.ts +0 -4
  266. package/dist/schema-utils/index.d.ts.map +0 -1
  267. package/dist/schema-utils/index.js +0 -4
  268. package/dist/schema-utils/utils.d.ts +0 -30
  269. package/dist/schema-utils/utils.d.ts.map +0 -1
  270. package/dist/schema-utils/utils.js +0 -37
  271. package/dist/schema-utils/validator.d.ts +0 -6
  272. package/dist/schema-utils/validator.d.ts.map +0 -1
  273. package/dist/schema-utils/validator.js +0 -45
  274. package/dist/server/index.d.ts +0 -16
  275. package/dist/server/index.d.ts.map +0 -1
  276. package/dist/server/index.js +0 -28
  277. package/dist/services/asset-service.d.ts +0 -86
  278. package/dist/services/asset-service.d.ts.map +0 -1
  279. package/dist/services/asset-service.js +0 -187
  280. package/dist/services/index.d.ts +0 -3
  281. package/dist/services/index.d.ts.map +0 -1
  282. package/dist/services/index.js +0 -4
  283. package/dist/storage/adapters/index.d.ts +0 -2
  284. package/dist/storage/adapters/index.d.ts.map +0 -1
  285. package/dist/storage/adapters/index.js +0 -2
  286. package/dist/storage/adapters/local-storage-adapter.d.ts +0 -54
  287. package/dist/storage/adapters/local-storage-adapter.d.ts.map +0 -1
  288. package/dist/storage/adapters/local-storage-adapter.js +0 -187
  289. package/dist/storage/index.d.ts +0 -3
  290. package/dist/storage/index.d.ts.map +0 -1
  291. package/dist/storage/interfaces/index.d.ts +0 -2
  292. package/dist/storage/interfaces/index.d.ts.map +0 -1
  293. package/dist/storage/interfaces/index.js +0 -2
  294. package/dist/storage/interfaces/storage.d.ts +0 -91
  295. package/dist/storage/interfaces/storage.d.ts.map +0 -1
  296. package/dist/storage/interfaces/storage.js +0 -1
  297. package/dist/storage/providers/storage.d.ts +0 -43
  298. package/dist/storage/providers/storage.d.ts.map +0 -1
  299. package/dist/storage/providers/storage.js +0 -64
  300. package/dist/types/asset.d.ts +0 -73
  301. package/dist/types/asset.d.ts.map +0 -1
  302. package/dist/types/asset.js +0 -2
  303. package/dist/types/auth.d.ts +0 -50
  304. package/dist/types/auth.d.ts.map +0 -1
  305. package/dist/types/auth.js +0 -41
  306. package/dist/types/config.d.ts +0 -47
  307. package/dist/types/config.d.ts.map +0 -1
  308. package/dist/types/config.js +0 -1
  309. package/dist/types/document.d.ts +0 -34
  310. package/dist/types/document.d.ts.map +0 -1
  311. package/dist/types/document.js +0 -1
  312. package/dist/types/index.d.ts +0 -9
  313. package/dist/types/index.d.ts.map +0 -1
  314. package/dist/types/index.js +0 -8
  315. package/dist/types/organization.d.ts +0 -105
  316. package/dist/types/organization.d.ts.map +0 -1
  317. package/dist/types/organization.js +0 -3
  318. package/dist/types/schemas.d.ts +0 -114
  319. package/dist/types/schemas.d.ts.map +0 -1
  320. package/dist/types/schemas.js +0 -1
  321. package/dist/types/sidebar.d.ts +0 -33
  322. package/dist/types/sidebar.d.ts.map +0 -1
  323. package/dist/types/sidebar.js +0 -1
  324. package/dist/types/user.d.ts +0 -14
  325. package/dist/types/user.d.ts.map +0 -1
  326. package/dist/types/user.js +0 -1
  327. package/dist/utils/content-hash.d.ts +0 -22
  328. package/dist/utils/content-hash.d.ts.map +0 -1
  329. package/dist/utils/content-hash.js +0 -67
  330. package/dist/utils/image-url.d.ts +0 -88
  331. package/dist/utils/image-url.d.ts.map +0 -1
  332. package/dist/utils/image-url.js +0 -165
  333. package/dist/utils/index.d.ts +0 -6
  334. package/dist/utils/index.d.ts.map +0 -1
  335. package/dist/utils/index.js +0 -9
  336. package/dist/utils/slug.d.ts +0 -13
  337. package/dist/utils/slug.d.ts.map +0 -1
  338. package/dist/utils/slug.js +0 -30
  339. package/dist/utils.d.ts +0 -13
  340. package/dist/utils.d.ts.map +0 -1
  341. package/dist/utils.js +0 -5
  342. /package/{dist → src/lib}/app.d.ts +0 -0
  343. /package/{dist → src/lib}/auth/MULTI_TENANCY_PLAN.md +0 -0
  344. /package/{dist → src/lib}/components/admin/AdminLayout.svelte +0 -0
  345. /package/{dist → src/lib}/components/admin/DocumentTypesList.svelte +0 -0
  346. /package/{dist → src/lib}/components/admin/ObjectModal.svelte +0 -0
  347. /package/{dist/components/fields/index.js → src/lib/components/fields/index.ts} +0 -0
  348. /package/{dist → src/lib}/components/layout/sidebar/NavMain.svelte +0 -0
  349. /package/{dist → src/lib}/components/layout/sidebar/NavSecondary.svelte +0 -0
  350. /package/{dist → src/lib}/plugins/README.md +0 -0
@@ -1,37 +0,0 @@
1
- /**
2
- * Schema utility functions that work with a schema registry
3
- * These functions accept schemas as parameters to avoid package-level dependencies
4
- */
5
- /**
6
- * Get a schema type by name from a collection of schemas
7
- */
8
- export function getSchemaByName(schemas, name) {
9
- return schemas.find((schema) => schema.name === name) || null;
10
- }
11
- /**
12
- * Get all available object types (for array field dropdowns)
13
- */
14
- export function getObjectTypes(schemas) {
15
- return schemas.filter((schema) => schema.type === 'object');
16
- }
17
- /**
18
- * Get all available document types
19
- */
20
- export function getDocumentTypes(schemas) {
21
- return schemas.filter((schema) => schema.type === 'document');
22
- }
23
- /**
24
- * Check if a schema type exists
25
- */
26
- export function schemaExists(schemas, name) {
27
- return schemas.some((schema) => schema.name === name);
28
- }
29
- /**
30
- * Get the available types for an array field
31
- */
32
- export function getArrayTypes(schemas, arrayField) {
33
- if (!arrayField.of)
34
- return [];
35
- const typeNames = arrayField.of.map((item) => item.type);
36
- return schemas.filter((schema) => typeNames.includes(schema.name));
37
- }
@@ -1,6 +0,0 @@
1
- import type { SchemaType } from '../types/schemas.js';
2
- /**
3
- * Validate all schema references to ensure they exist
4
- */
5
- export declare function validateSchemaReferences(schemas: SchemaType[]): void;
6
- //# sourceMappingURL=validator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/lib/schema-utils/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,qBAAqB,CAAC;AAE7D;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAoDpE"}
@@ -1,45 +0,0 @@
1
- /**
2
- * Validate all schema references to ensure they exist
3
- */
4
- export function validateSchemaReferences(schemas) {
5
- const schemaNames = new Set(schemas.map((schema) => schema.name));
6
- const errors = [];
7
- function validateField(field, parentSchema) {
8
- // Check array field references
9
- if (field.type === 'array' && field.of) {
10
- for (const arrayType of field.of) {
11
- if (!schemaNames.has(arrayType.type)) {
12
- errors.push(`Schema "${parentSchema}" field "${field.name}" references unknown type "${arrayType.type}"`);
13
- }
14
- }
15
- }
16
- // Check object field references (if they reference external types)
17
- if (field.type === 'object' && typeof field.fields === 'string') {
18
- if (!schemaNames.has(field.fields)) {
19
- errors.push(`Schema "${parentSchema}" field "${field.name}" references unknown object type "${field.fields}"`);
20
- }
21
- }
22
- // Recursively check nested fields -- cast type later or something. cba
23
- if ('fields' in field && Array.isArray(field.fields)) {
24
- for (const nestedField of field.fields) {
25
- validateField(nestedField, parentSchema);
26
- }
27
- }
28
- }
29
- // Validate each schema
30
- for (const schema of schemas) {
31
- if (schema.fields) {
32
- for (const field of schema.fields) {
33
- validateField(field, schema.name);
34
- }
35
- }
36
- }
37
- // Throw error if any validation issues found
38
- if (errors.length > 0) {
39
- console.error('\nSchema Validation Errors:');
40
- errors.forEach((error) => console.error(error));
41
- // Just throw the errors directly
42
- throw new Error(errors.join('\n'));
43
- }
44
- console.log('✅ Schema validation passed - all references are valid');
45
- }
@@ -1,16 +0,0 @@
1
- export * from '../types/index.js';
2
- export * from '../auth/provider.js';
3
- export * from '../email/index.js';
4
- export { AuthError, type AuthErrorCode } from '../auth/auth-errors.js';
5
- export { createCMSConfig } from '../config.js';
6
- export { createCMSHook, type CMSInstances } from '../hooks.js';
7
- export * from '../db/interfaces/index.js';
8
- export * from '../storage/index.js';
9
- export * from '../storage/interfaces/index.js';
10
- export * from '../storage/providers/storage.js';
11
- export * from '../services/index.js';
12
- export { AssetService } from '../services/asset-service.js';
13
- export * from '../routes-exports.js';
14
- export * from '../schema-utils/index.js';
15
- export { createHashForPublishing } from '../utils/content-hash.js';
16
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC;AAElC,cAAc,qBAAqB,CAAC;AAEpC,cAAc,mBAAmB,CAAC;AAGlC,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAGvE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAG/D,cAAc,2BAA2B,CAAC;AAG1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,iCAAiC,CAAC;AAGhD,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAI5D,cAAc,sBAAsB,CAAC;AAGrC,cAAc,0BAA0B,CAAC;AAGzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -1,28 +0,0 @@
1
- // Aphex CMS Core - Server-side exports
2
- // These require Node.js and should NOT be imported client-side
3
- // Export all core types from the new central location
4
- export * from '../types/index.js';
5
- export * from '../auth/provider.js';
6
- export * from '../email/index.js';
7
- // Authentication errors
8
- export { AuthError } from '../auth/auth-errors.js';
9
- // Configuration system
10
- export { createCMSConfig } from '../config.js';
11
- // Hooks integration (SvelteKit server hooks)
12
- export { createCMSHook } from '../hooks.js';
13
- // Database interfaces (no longer export registry or adapters - use adapter packages)
14
- export * from '../db/interfaces/index.js';
15
- // Storage adapters and interfaces
16
- export * from '../storage/index.js';
17
- export * from '../storage/interfaces/index.js';
18
- export * from '../storage/providers/storage.js';
19
- // Services (includes sharp for image processing)
20
- export * from '../services/index.js';
21
- export { AssetService } from '../services/asset-service.js';
22
- // API Route handlers (for re-exporting in your app's API routes)
23
- // Re-export from routes-exports to avoid .js extension issues in workspace
24
- export * from '../routes-exports.js';
25
- // Schema utilities
26
- export * from '../schema-utils/index.js';
27
- // Content hash utilities (server-side)
28
- export { createHashForPublishing } from '../utils/content-hash.js';
@@ -1,86 +0,0 @@
1
- import type { StorageAdapter } from '../storage/interfaces/storage.js';
2
- import type { DatabaseAdapter } from '../db/interfaces/index.js';
3
- import type { Asset } from '../types/index.js';
4
- export interface AssetUploadData {
5
- buffer: Buffer;
6
- originalFilename: string;
7
- mimeType: string;
8
- size: number;
9
- title?: string;
10
- description?: string;
11
- alt?: string;
12
- creditLine?: string;
13
- createdBy?: string;
14
- metadata?: {
15
- schemaType?: string;
16
- fieldPath?: string;
17
- [key: string]: any;
18
- };
19
- }
20
- export interface AssetFilters {
21
- assetType?: 'image' | 'file';
22
- mimeType?: string;
23
- search?: string;
24
- limit?: number;
25
- offset?: number;
26
- }
27
- /**
28
- * Asset service - coordinates storage and database operations
29
- * Maintains separation of concerns while providing unified asset management
30
- */
31
- export declare class AssetService {
32
- private storage;
33
- private database;
34
- constructor(storage: StorageAdapter, database: DatabaseAdapter);
35
- /**
36
- * Upload and store an asset
37
- */
38
- uploadAsset(organizationId: string, data: AssetUploadData): Promise<Asset>;
39
- /**
40
- * Find asset by ID
41
- */
42
- findAssetById(organizationId: string, id: string): Promise<Asset | null>;
43
- /**
44
- * Find asset by ID globally (bypasses organization filter for public asset access)
45
- * Only available on PostgreSQL adapter with RLS bypass
46
- */
47
- findAssetByIdGlobal(id: string): Promise<Asset | null>;
48
- /**
49
- * Find multiple assets with filtering
50
- */
51
- findAssets(organizationId: string, filters?: AssetFilters): Promise<Asset[]>;
52
- /**
53
- * Delete asset (both file and database record)
54
- *
55
- * Note: If the asset was stored by a different adapter (e.g., switching from R2 to local),
56
- * file deletion may fail. The database record will still be removed for a clean state.
57
- */
58
- deleteAsset(organizationId: string, id: string): Promise<boolean>;
59
- /**
60
- * Update asset metadata
61
- */
62
- updateAssetMetadata(organizationId: string, id: string, metadata: {
63
- title?: string;
64
- description?: string;
65
- alt?: string;
66
- creditLine?: string;
67
- updatedBy?: string;
68
- }): Promise<Asset | null>;
69
- /**
70
- * Get asset statistics
71
- */
72
- getAssetStats(organizationId: string): Promise<{
73
- totalAssets: number;
74
- totalImages: number;
75
- totalFiles: number;
76
- totalSize: number;
77
- }>;
78
- /**
79
- * Get health status of both storage and database
80
- */
81
- getHealthStatus(): Promise<{
82
- storage: boolean;
83
- database: boolean;
84
- }>;
85
- }
86
- //# sourceMappingURL=asset-service.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"asset-service.d.ts","sourceRoot":"","sources":["../../src/lib/services/asset-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE/C,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE;QACV,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACnB,CAAC;CACF;AAED,MAAM,WAAW,YAAY;IAC5B,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,qBAAa,YAAY;IAEvB,OAAO,CAAC,OAAO;IACf,OAAO,CAAC,QAAQ;gBADR,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,eAAe;IAGlC;;OAEG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC;IAoFhF;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAI9E;;;OAGG;IACG,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAmB5D;;OAEG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAItF;;;;;OAKG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BvE;;OAEG;IACG,mBAAmB,CACxB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE;QACT,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,CAAC,EAAE,MAAM,CAAC;KACnB,GACC,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAIxB;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC;QACpD,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,SAAS,EAAE,MAAM,CAAC;KAClB,CAAC;IAeF;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC;QAChC,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,OAAO,CAAC;KAClB,CAAC;CAWF"}
@@ -1,187 +0,0 @@
1
- // Asset service - orchestrates storage and database operations
2
- import sharp from 'sharp';
3
- /**
4
- * Asset service - coordinates storage and database operations
5
- * Maintains separation of concerns while providing unified asset management
6
- */
7
- export class AssetService {
8
- storage;
9
- database;
10
- constructor(storage, database) {
11
- this.storage = storage;
12
- this.database = database;
13
- }
14
- /**
15
- * Upload and store an asset
16
- */
17
- async uploadAsset(organizationId, data) {
18
- // Determine asset type
19
- const assetType = data.mimeType.startsWith('image/') ? 'image' : 'file';
20
- // Extract image metadata if it's an image
21
- let width;
22
- let height;
23
- let metadata = {
24
- // Include field metadata for privacy checking
25
- ...data.metadata
26
- };
27
- if (assetType === 'image') {
28
- try {
29
- const imageMetadata = await sharp(data.buffer).metadata();
30
- width = imageMetadata.width;
31
- height = imageMetadata.height;
32
- // Merge image metadata with field metadata
33
- metadata = {
34
- ...metadata, // Keep schemaType and fieldPath
35
- format: imageMetadata.format,
36
- space: imageMetadata.space,
37
- channels: imageMetadata.channels,
38
- density: imageMetadata.density,
39
- hasProfile: imageMetadata.hasProfile,
40
- hasAlpha: imageMetadata.hasAlpha
41
- };
42
- // Add dominant color
43
- const stats = await sharp(data.buffer).stats();
44
- metadata.dominantColor = stats.dominant;
45
- }
46
- catch (error) {
47
- console.warn('Could not extract image metadata:', error);
48
- }
49
- }
50
- // 1. Store file using storage adapter
51
- const storageFile = await this.storage.store({
52
- buffer: data.buffer,
53
- filename: data.originalFilename,
54
- mimeType: data.mimeType,
55
- size: data.size
56
- });
57
- // 2. Save asset metadata using database adapter
58
- try {
59
- const asset = await this.database.createAsset({
60
- assetType,
61
- filename: storageFile.path.split('/').pop() || data.originalFilename,
62
- originalFilename: data.originalFilename,
63
- mimeType: data.mimeType,
64
- size: data.size,
65
- url: storageFile.url || '', // Empty for local storage initially
66
- path: storageFile.path,
67
- storageAdapter: this.storage.name,
68
- organizationId,
69
- width,
70
- height,
71
- metadata,
72
- title: data.title || undefined,
73
- description: data.description || undefined,
74
- alt: data.alt || undefined,
75
- creditLine: data.creditLine || undefined,
76
- createdBy: data.createdBy
77
- });
78
- // If using local storage, generate and store the CDN URL with the real asset ID
79
- if (!storageFile.url) {
80
- const cdnUrl = `/media/${asset.id}/${encodeURIComponent(asset.originalFilename)}`;
81
- // Update both the object and the database
82
- asset.url = cdnUrl;
83
- await this.database.updateAsset(organizationId, asset.id, { url: cdnUrl });
84
- }
85
- return asset;
86
- }
87
- catch (error) {
88
- // If database save fails, clean up the stored file
89
- await this.storage.delete(storageFile.path);
90
- throw error;
91
- }
92
- }
93
- /**
94
- * Find asset by ID
95
- */
96
- async findAssetById(organizationId, id) {
97
- return await this.database.findAssetById(organizationId, id);
98
- }
99
- /**
100
- * Find asset by ID globally (bypasses organization filter for public asset access)
101
- * Only available on PostgreSQL adapter with RLS bypass
102
- */
103
- async findAssetByIdGlobal(id) {
104
- // Check if the adapter has the global method
105
- if ('findAssetByIdGlobal' in this.database &&
106
- typeof this.database.findAssetByIdGlobal === 'function') {
107
- console.log('[AssetService] Using findAssetByIdGlobal from adapter');
108
- return await this.database.findAssetByIdGlobal(id);
109
- }
110
- // Fallback: not supported
111
- console.warn('[AssetService] findAssetByIdGlobal not supported by this database adapter');
112
- console.warn('[AssetService] Database adapter type:', this.database.constructor.name);
113
- console.warn('[AssetService] Available methods:', Object.getOwnPropertyNames(Object.getPrototypeOf(this.database)));
114
- return null;
115
- }
116
- /**
117
- * Find multiple assets with filtering
118
- */
119
- async findAssets(organizationId, filters = {}) {
120
- return await this.database.findAssets(organizationId, filters);
121
- }
122
- /**
123
- * Delete asset (both file and database record)
124
- *
125
- * Note: If the asset was stored by a different adapter (e.g., switching from R2 to local),
126
- * file deletion may fail. The database record will still be removed for a clean state.
127
- */
128
- async deleteAsset(organizationId, id) {
129
- const asset = await this.database.findAssetById(organizationId, id);
130
- if (!asset) {
131
- return false;
132
- }
133
- // Try to delete file from storage
134
- // If the asset was stored by a different adapter, this may fail
135
- if (asset.storageAdapter === this.storage.name) {
136
- // Same adapter - delete should work
137
- try {
138
- await this.storage.delete(asset.path);
139
- }
140
- catch (error) {
141
- console.warn(`Failed to delete file from storage: ${asset.path}`, error);
142
- }
143
- }
144
- else {
145
- // Different adapter - log warning but continue with database cleanup
146
- console.warn(`Asset ${id} was stored by '${asset.storageAdapter}' but current adapter is '${this.storage.name}'. ` +
147
- `File at ${asset.path} may need manual cleanup.`);
148
- }
149
- // Always delete database record for clean state
150
- return await this.database.deleteAsset(organizationId, id);
151
- }
152
- /**
153
- * Update asset metadata
154
- */
155
- async updateAssetMetadata(organizationId, id, metadata) {
156
- return await this.database.updateAsset(organizationId, id, metadata);
157
- }
158
- /**
159
- * Get asset statistics
160
- */
161
- async getAssetStats(organizationId) {
162
- const [totalAssets, assetsByType, totalSize] = await Promise.all([
163
- this.database.countAssets(organizationId),
164
- this.database.countAssetsByType(organizationId),
165
- this.database.getTotalAssetsSize(organizationId)
166
- ]);
167
- return {
168
- totalAssets,
169
- totalImages: assetsByType.image || 0,
170
- totalFiles: assetsByType.file || 0,
171
- totalSize
172
- };
173
- }
174
- /**
175
- * Get health status of both storage and database
176
- */
177
- async getHealthStatus() {
178
- const [storageHealthy, databaseHealthy] = await Promise.all([
179
- this.storage.isHealthy(),
180
- this.database.isHealthy()
181
- ]);
182
- return {
183
- storage: storageHealthy,
184
- database: databaseHealthy
185
- };
186
- }
187
- }
@@ -1,3 +0,0 @@
1
- export { AssetService } from './asset-service.js';
2
- export type { AssetUploadData, AssetFilters } from './asset-service.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/services/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,4 +0,0 @@
1
- // Aphex CMS Services
2
- // Business logic layer
3
- // Re-export services
4
- export { AssetService } from './asset-service.js';
@@ -1,2 +0,0 @@
1
- export * from './local-storage-adapter.js';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/storage/adapters/index.ts"],"names":[],"mappings":"AACA,cAAc,4BAA4B,CAAC"}
@@ -1,2 +0,0 @@
1
- // Storage adapters
2
- export * from './local-storage-adapter.js';
@@ -1,54 +0,0 @@
1
- import type { StorageAdapter, StorageConfig, UploadFileData, StorageFile } from '../interfaces/storage.js';
2
- /**
3
- * Pure local file system storage adapter - only handles files
4
- */
5
- export declare class LocalStorageAdapter implements StorageAdapter {
6
- readonly name = "local";
7
- private config;
8
- constructor(config: StorageConfig);
9
- /**
10
- * Generate unique filename preserving original name
11
- */
12
- private generateUniqueFilename;
13
- /**
14
- * Parse filename into name and extension
15
- */
16
- private parseFilename;
17
- /**
18
- * Check if file exists on disk
19
- */
20
- private fileExistsOnDisk;
21
- /**
22
- * Store a file and return storage info
23
- */
24
- store(data: UploadFileData): Promise<StorageFile>;
25
- /**
26
- * Read a file from storage
27
- * Used by API endpoint to serve files
28
- */
29
- getObject(path: string): Promise<Buffer>;
30
- /**
31
- * Delete a file from storage
32
- */
33
- delete(path: string): Promise<boolean>;
34
- /**
35
- * Check if file exists
36
- */
37
- exists(path: string): Promise<boolean>;
38
- /**
39
- * Get public URL for a file path
40
- */
41
- getUrl(path: string): string;
42
- /**
43
- * Get storage information
44
- */
45
- getStorageInfo(): Promise<{
46
- totalSize: number;
47
- availableSpace?: number;
48
- }>;
49
- /**
50
- * Health check - test if we can write to storage
51
- */
52
- isHealthy(): Promise<boolean>;
53
- }
54
- //# sourceMappingURL=local-storage-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"local-storage-adapter.d.ts","sourceRoot":"","sources":["../../../src/lib/storage/adapters/local-storage-adapter.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACX,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,EACX,MAAM,0BAA0B,CAAC;AAalC;;GAEG;AACH,qBAAa,mBAAoB,YAAW,cAAc;IACzD,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,MAAM,CAA0B;gBAE5B,MAAM,EAAE,aAAa;IAUjC;;OAEG;YACW,sBAAsB;IAcpC;;OAEG;IACH,OAAO,CAAC,aAAa;IAWrB;;OAEG;YACW,gBAAgB;IAU9B;;OAEG;IACG,KAAK,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,WAAW,CAAC;IA2CvD;;;OAGG;IACG,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU5C;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS5C;;OAEG;IACH,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAM5B;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAyB/E;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;CAYnC"}