@aphexcms/cms-core 0.1.11 → 0.1.12

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 (351) hide show
  1. package/dist/api/assets.d.ts +48 -0
  2. package/dist/api/assets.d.ts.map +1 -0
  3. package/dist/api/assets.js +52 -0
  4. package/dist/api/client.d.ts +37 -0
  5. package/dist/api/client.d.ts.map +1 -0
  6. package/dist/api/client.js +125 -0
  7. package/dist/api/documents.d.ts +56 -0
  8. package/dist/api/documents.d.ts.map +1 -0
  9. package/dist/api/documents.js +77 -0
  10. package/dist/api/index.d.ts +7 -0
  11. package/dist/api/index.d.ts.map +1 -0
  12. package/dist/api/index.js +5 -0
  13. package/dist/api/organizations.d.ts +101 -0
  14. package/dist/api/organizations.d.ts.map +1 -0
  15. package/dist/api/organizations.js +92 -0
  16. package/dist/api/types.d.ts +23 -0
  17. package/dist/api/types.d.ts.map +1 -0
  18. package/dist/api/types.js +1 -0
  19. package/dist/auth/auth-errors.d.ts +7 -0
  20. package/dist/auth/auth-errors.d.ts.map +1 -0
  21. package/dist/auth/auth-errors.js +13 -0
  22. package/dist/auth/auth-hooks.d.ts +6 -0
  23. package/dist/auth/auth-hooks.d.ts.map +1 -0
  24. package/dist/auth/auth-hooks.js +108 -0
  25. package/dist/auth/provider.d.ts +17 -0
  26. package/dist/auth/provider.d.ts.map +1 -0
  27. package/dist/auth/provider.js +1 -0
  28. package/dist/client/index.d.ts +24 -0
  29. package/dist/client/index.d.ts.map +1 -0
  30. package/{src/lib/client/index.ts → dist/client/index.js} +7 -18
  31. package/dist/components/AdminApp.svelte.d.ts +26 -0
  32. package/dist/components/AdminApp.svelte.d.ts.map +1 -0
  33. package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
  34. package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
  35. package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
  36. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
  37. package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
  38. package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
  39. package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
  40. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
  41. package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
  42. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
  43. package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
  44. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
  45. package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
  46. package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
  47. package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
  48. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
  49. package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
  50. package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
  51. package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
  52. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
  53. package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
  54. package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
  55. package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
  56. package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
  57. package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
  58. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
  59. package/dist/components/fields/index.d.ts +9 -0
  60. package/dist/components/fields/index.d.ts.map +1 -0
  61. package/dist/components/index.d.ts +7 -0
  62. package/dist/components/index.d.ts.map +1 -0
  63. package/{src/lib/components/index.ts → dist/components/index.js} +1 -5
  64. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
  65. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
  66. package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
  67. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
  68. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +4 -0
  69. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
  70. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
  71. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
  72. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
  73. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
  74. package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
  75. package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
  76. package/dist/config.d.ts +3 -0
  77. package/dist/config.d.ts.map +1 -0
  78. package/dist/config.js +15 -0
  79. package/dist/db/adapters/index.d.ts +1 -0
  80. package/dist/db/adapters/index.d.ts.map +1 -0
  81. package/{src/lib/db/adapters/index.ts → dist/db/adapters/index.js} +1 -0
  82. package/dist/db/index.d.ts +2 -0
  83. package/dist/db/index.d.ts.map +1 -0
  84. package/{src/lib/db/index.ts → dist/db/index.js} +1 -2
  85. package/dist/db/interfaces/asset.d.ts +51 -0
  86. package/dist/db/interfaces/asset.d.ts.map +1 -0
  87. package/dist/db/interfaces/asset.js +1 -0
  88. package/dist/db/interfaces/document.d.ts +36 -0
  89. package/dist/db/interfaces/document.d.ts.map +1 -0
  90. package/dist/db/interfaces/document.js +1 -0
  91. package/dist/db/interfaces/index.d.ts +73 -0
  92. package/dist/db/interfaces/index.d.ts.map +1 -0
  93. package/dist/db/interfaces/index.js +1 -0
  94. package/dist/db/interfaces/organization.d.ts +27 -0
  95. package/dist/db/interfaces/organization.d.ts.map +1 -0
  96. package/dist/db/interfaces/organization.js +1 -0
  97. package/dist/db/interfaces/schema.d.ts +21 -0
  98. package/dist/db/interfaces/schema.d.ts.map +1 -0
  99. package/dist/db/interfaces/schema.js +1 -0
  100. package/dist/db/interfaces/user.d.ts +15 -0
  101. package/dist/db/interfaces/user.d.ts.map +1 -0
  102. package/dist/db/interfaces/user.js +1 -0
  103. package/dist/db/utils/reference-resolver.d.ts +18 -0
  104. package/dist/db/utils/reference-resolver.d.ts.map +1 -0
  105. package/dist/db/utils/reference-resolver.js +80 -0
  106. package/dist/define.d.ts +3 -0
  107. package/dist/define.d.ts.map +1 -0
  108. package/dist/define.js +4 -0
  109. package/dist/email/index.d.ts +2 -0
  110. package/dist/email/index.d.ts.map +1 -0
  111. package/{src/lib/email/index.ts → dist/email/index.js} +1 -2
  112. package/dist/email/interfaces/email.d.ts +42 -0
  113. package/dist/email/interfaces/email.d.ts.map +1 -0
  114. package/dist/email/interfaces/email.js +1 -0
  115. package/dist/engine.d.ts +26 -0
  116. package/dist/engine.d.ts.map +1 -0
  117. package/dist/engine.js +66 -0
  118. package/dist/field-validation/rule.d.ts +51 -0
  119. package/dist/field-validation/rule.d.ts.map +1 -0
  120. package/dist/field-validation/rule.js +221 -0
  121. package/dist/field-validation/utils.d.ts +21 -0
  122. package/dist/field-validation/utils.d.ts.map +1 -0
  123. package/dist/field-validation/utils.js +66 -0
  124. package/dist/hooks.d.ts +23 -0
  125. package/dist/hooks.d.ts.map +1 -0
  126. package/dist/hooks.js +96 -0
  127. package/dist/index.d.ts +2 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/{src/lib/index.ts → dist/index.js} +1 -2
  130. package/dist/is-mobile.svelte.d.ts +5 -0
  131. package/dist/is-mobile.svelte.d.ts.map +1 -0
  132. package/{src/lib/is-mobile.svelte.ts → dist/is-mobile.svelte.js} +3 -5
  133. package/dist/routes/assets-by-id.d.ts +5 -0
  134. package/dist/routes/assets-by-id.d.ts.map +1 -0
  135. package/dist/routes/assets-by-id.js +138 -0
  136. package/dist/routes/assets-cdn.d.ts +3 -0
  137. package/dist/routes/assets-cdn.d.ts.map +1 -0
  138. package/dist/routes/assets-cdn.js +155 -0
  139. package/dist/routes/assets.d.ts +4 -0
  140. package/dist/routes/assets.d.ts.map +1 -0
  141. package/dist/routes/assets.js +94 -0
  142. package/dist/routes/documents-by-id.d.ts +5 -0
  143. package/dist/routes/documents-by-id.d.ts.map +1 -0
  144. package/dist/routes/documents-by-id.js +142 -0
  145. package/dist/routes/documents-publish.d.ts +4 -0
  146. package/dist/routes/documents-publish.d.ts.map +1 -0
  147. package/dist/routes/documents-publish.js +151 -0
  148. package/dist/routes/documents.d.ts +4 -0
  149. package/dist/routes/documents.d.ts.map +1 -0
  150. package/dist/routes/documents.js +131 -0
  151. package/dist/routes/index.d.ts +6 -0
  152. package/dist/routes/index.d.ts.map +1 -0
  153. package/dist/routes/index.js +10 -0
  154. package/dist/routes/organizations-by-id.d.ts +5 -0
  155. package/dist/routes/organizations-by-id.d.ts.map +1 -0
  156. package/dist/routes/organizations-by-id.js +187 -0
  157. package/dist/routes/organizations-invitations.d.ts +4 -0
  158. package/dist/routes/organizations-invitations.d.ts.map +1 -0
  159. package/dist/routes/organizations-invitations.js +125 -0
  160. package/dist/routes/organizations-members.d.ts +5 -0
  161. package/dist/routes/organizations-members.d.ts.map +1 -0
  162. package/dist/routes/organizations-members.js +206 -0
  163. package/dist/routes/organizations-switch.d.ts +3 -0
  164. package/dist/routes/organizations-switch.d.ts.map +1 -0
  165. package/dist/routes/organizations-switch.js +53 -0
  166. package/dist/routes/organizations.d.ts +4 -0
  167. package/dist/routes/organizations.d.ts.map +1 -0
  168. package/dist/routes/organizations.js +109 -0
  169. package/dist/routes/schemas-by-type.d.ts +3 -0
  170. package/dist/routes/schemas-by-type.d.ts.map +1 -0
  171. package/dist/routes/schemas-by-type.js +25 -0
  172. package/dist/routes/schemas.d.ts +3 -0
  173. package/dist/routes/schemas.d.ts.map +1 -0
  174. package/dist/routes/schemas.js +11 -0
  175. package/dist/routes-exports.d.ts +14 -0
  176. package/dist/routes-exports.d.ts.map +1 -0
  177. package/dist/routes-exports.js +19 -0
  178. package/dist/schema-context.svelte.d.ts +10 -0
  179. package/dist/schema-context.svelte.d.ts.map +1 -0
  180. package/dist/schema-context.svelte.js +18 -0
  181. package/dist/schema-utils/cleanup.d.ts +21 -0
  182. package/dist/schema-utils/cleanup.d.ts.map +1 -0
  183. package/dist/schema-utils/cleanup.js +80 -0
  184. package/dist/schema-utils/index.d.ts +4 -0
  185. package/dist/schema-utils/index.d.ts.map +1 -0
  186. package/dist/schema-utils/index.js +4 -0
  187. package/dist/schema-utils/utils.d.ts +30 -0
  188. package/dist/schema-utils/utils.d.ts.map +1 -0
  189. package/dist/schema-utils/utils.js +37 -0
  190. package/dist/schema-utils/validator.d.ts +6 -0
  191. package/dist/schema-utils/validator.d.ts.map +1 -0
  192. package/dist/schema-utils/validator.js +45 -0
  193. package/dist/server/index.d.ts +16 -0
  194. package/dist/server/index.d.ts.map +1 -0
  195. package/dist/server/index.js +28 -0
  196. package/dist/services/asset-service.d.ts +86 -0
  197. package/dist/services/asset-service.d.ts.map +1 -0
  198. package/dist/services/asset-service.js +187 -0
  199. package/dist/services/index.d.ts +3 -0
  200. package/dist/services/index.d.ts.map +1 -0
  201. package/dist/services/index.js +4 -0
  202. package/dist/storage/adapters/index.d.ts +2 -0
  203. package/dist/storage/adapters/index.d.ts.map +1 -0
  204. package/dist/storage/adapters/index.js +2 -0
  205. package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
  206. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
  207. package/dist/storage/adapters/local-storage-adapter.js +187 -0
  208. package/dist/storage/index.d.ts +3 -0
  209. package/dist/storage/index.d.ts.map +1 -0
  210. package/{src/lib/storage/index.ts → dist/storage/index.js} +2 -4
  211. package/dist/storage/interfaces/index.d.ts +2 -0
  212. package/dist/storage/interfaces/index.d.ts.map +1 -0
  213. package/dist/storage/interfaces/index.js +2 -0
  214. package/dist/storage/interfaces/storage.d.ts +91 -0
  215. package/dist/storage/interfaces/storage.d.ts.map +1 -0
  216. package/dist/storage/interfaces/storage.js +1 -0
  217. package/dist/storage/providers/storage.d.ts +43 -0
  218. package/dist/storage/providers/storage.d.ts.map +1 -0
  219. package/dist/storage/providers/storage.js +64 -0
  220. package/dist/types/asset.d.ts +73 -0
  221. package/dist/types/asset.d.ts.map +1 -0
  222. package/dist/types/asset.js +2 -0
  223. package/dist/types/auth.d.ts +50 -0
  224. package/dist/types/auth.d.ts.map +1 -0
  225. package/dist/types/auth.js +41 -0
  226. package/dist/types/config.d.ts +47 -0
  227. package/dist/types/config.d.ts.map +1 -0
  228. package/dist/types/config.js +1 -0
  229. package/dist/types/document.d.ts +34 -0
  230. package/dist/types/document.d.ts.map +1 -0
  231. package/dist/types/document.js +1 -0
  232. package/dist/types/index.d.ts +9 -0
  233. package/dist/types/index.d.ts.map +1 -0
  234. package/dist/types/index.js +8 -0
  235. package/dist/types/organization.d.ts +105 -0
  236. package/dist/types/organization.d.ts.map +1 -0
  237. package/dist/types/organization.js +3 -0
  238. package/dist/types/schemas.d.ts +119 -0
  239. package/dist/types/schemas.d.ts.map +1 -0
  240. package/dist/types/schemas.js +1 -0
  241. package/dist/types/sidebar.d.ts +33 -0
  242. package/dist/types/sidebar.d.ts.map +1 -0
  243. package/dist/types/sidebar.js +1 -0
  244. package/dist/types/user.d.ts +14 -0
  245. package/dist/types/user.d.ts.map +1 -0
  246. package/dist/types/user.js +1 -0
  247. package/dist/utils/content-hash.d.ts +22 -0
  248. package/dist/utils/content-hash.d.ts.map +1 -0
  249. package/dist/utils/content-hash.js +67 -0
  250. package/dist/utils/image-url.d.ts +88 -0
  251. package/dist/utils/image-url.d.ts.map +1 -0
  252. package/dist/utils/image-url.js +165 -0
  253. package/dist/utils/index.d.ts +6 -0
  254. package/dist/utils/index.d.ts.map +1 -0
  255. package/dist/utils/index.js +9 -0
  256. package/dist/utils/slug.d.ts +13 -0
  257. package/dist/utils/slug.d.ts.map +1 -0
  258. package/dist/utils/slug.js +30 -0
  259. package/dist/utils.d.ts +13 -0
  260. package/dist/utils.d.ts.map +1 -0
  261. package/dist/utils.js +5 -0
  262. package/package.json +2 -2
  263. package/src/lib/api/assets.ts +0 -75
  264. package/src/lib/api/client.ts +0 -150
  265. package/src/lib/api/documents.ts +0 -102
  266. package/src/lib/api/index.ts +0 -7
  267. package/src/lib/api/organizations.ts +0 -154
  268. package/src/lib/api/types.ts +0 -34
  269. package/src/lib/auth/auth-errors.ts +0 -23
  270. package/src/lib/auth/auth-hooks.ts +0 -132
  271. package/src/lib/auth/provider.ts +0 -25
  272. package/src/lib/config.ts +0 -18
  273. package/src/lib/db/interfaces/asset.ts +0 -61
  274. package/src/lib/db/interfaces/document.ts +0 -53
  275. package/src/lib/db/interfaces/index.ts +0 -98
  276. package/src/lib/db/interfaces/organization.ts +0 -51
  277. package/src/lib/db/interfaces/schema.ts +0 -13
  278. package/src/lib/db/interfaces/user.ts +0 -16
  279. package/src/lib/db/utils/reference-resolver.ts +0 -119
  280. package/src/lib/define.ts +0 -7
  281. package/src/lib/email/interfaces/email.ts +0 -45
  282. package/src/lib/engine.ts +0 -85
  283. package/src/lib/field-validation/rule.ts +0 -287
  284. package/src/lib/field-validation/utils.ts +0 -91
  285. package/src/lib/hooks.ts +0 -142
  286. package/src/lib/routes/assets-by-id.ts +0 -161
  287. package/src/lib/routes/assets-cdn.ts +0 -185
  288. package/src/lib/routes/assets.ts +0 -116
  289. package/src/lib/routes/documents-by-id.ts +0 -188
  290. package/src/lib/routes/documents-publish.ts +0 -211
  291. package/src/lib/routes/documents.ts +0 -172
  292. package/src/lib/routes/index.ts +0 -13
  293. package/src/lib/routes/organizations-by-id.ts +0 -258
  294. package/src/lib/routes/organizations-invitations.ts +0 -183
  295. package/src/lib/routes/organizations-members.ts +0 -301
  296. package/src/lib/routes/organizations-switch.ts +0 -74
  297. package/src/lib/routes/organizations.ts +0 -147
  298. package/src/lib/routes/schemas-by-type.ts +0 -35
  299. package/src/lib/routes/schemas.ts +0 -19
  300. package/src/lib/routes-exports.ts +0 -42
  301. package/src/lib/schema-context.svelte.ts +0 -24
  302. package/src/lib/schema-utils/cleanup.ts +0 -116
  303. package/src/lib/schema-utils/index.ts +0 -4
  304. package/src/lib/schema-utils/utils.ts +0 -47
  305. package/src/lib/schema-utils/validator.ts +0 -58
  306. package/src/lib/server/index.ts +0 -40
  307. package/src/lib/services/asset-service.ts +0 -256
  308. package/src/lib/services/index.ts +0 -6
  309. package/src/lib/storage/adapters/index.ts +0 -2
  310. package/src/lib/storage/adapters/local-storage-adapter.ts +0 -215
  311. package/src/lib/storage/interfaces/index.ts +0 -2
  312. package/src/lib/storage/interfaces/storage.ts +0 -114
  313. package/src/lib/storage/providers/storage.ts +0 -83
  314. package/src/lib/types/asset.ts +0 -81
  315. package/src/lib/types/auth.ts +0 -80
  316. package/src/lib/types/config.ts +0 -45
  317. package/src/lib/types/document.ts +0 -38
  318. package/src/lib/types/index.ts +0 -8
  319. package/src/lib/types/organization.ts +0 -119
  320. package/src/lib/types/schemas.ts +0 -156
  321. package/src/lib/types/sidebar.ts +0 -37
  322. package/src/lib/types/user.ts +0 -17
  323. package/src/lib/utils/content-hash.ts +0 -75
  324. package/src/lib/utils/image-url.ts +0 -204
  325. package/src/lib/utils/index.ts +0 -12
  326. package/src/lib/utils/slug.ts +0 -33
  327. package/src/lib/utils.ts +0 -13
  328. /package/{src/lib → dist}/app.d.ts +0 -0
  329. /package/{src/lib → dist}/auth/MULTI_TENANCY_PLAN.md +0 -0
  330. /package/{src/lib → dist}/components/AdminApp.svelte +0 -0
  331. /package/{src/lib → dist}/components/admin/AdminLayout.svelte +0 -0
  332. /package/{src/lib → dist}/components/admin/DocumentEditor.svelte +0 -0
  333. /package/{src/lib → dist}/components/admin/DocumentTypesList.svelte +0 -0
  334. /package/{src/lib → dist}/components/admin/ObjectModal.svelte +0 -0
  335. /package/{src/lib → dist}/components/admin/SchemaField.svelte +0 -0
  336. /package/{src/lib → dist}/components/admin/fields/ArrayField.svelte +0 -0
  337. /package/{src/lib → dist}/components/admin/fields/BooleanField.svelte +0 -0
  338. /package/{src/lib → dist}/components/admin/fields/ImageField.svelte +0 -0
  339. /package/{src/lib → dist}/components/admin/fields/NumberField.svelte +0 -0
  340. /package/{src/lib → dist}/components/admin/fields/ReferenceField.svelte +0 -0
  341. /package/{src/lib → dist}/components/admin/fields/SlugField.svelte +0 -0
  342. /package/{src/lib → dist}/components/admin/fields/StringField.svelte +0 -0
  343. /package/{src/lib → dist}/components/admin/fields/TextareaField.svelte +0 -0
  344. /package/{src/lib/components/fields/index.ts → dist/components/fields/index.js} +0 -0
  345. /package/{src/lib → dist}/components/layout/OrganizationSwitcher.svelte +0 -0
  346. /package/{src/lib → dist}/components/layout/Sidebar.svelte +0 -0
  347. /package/{src/lib → dist}/components/layout/sidebar/AppSidebar.svelte +0 -0
  348. /package/{src/lib → dist}/components/layout/sidebar/NavMain.svelte +0 -0
  349. /package/{src/lib → dist}/components/layout/sidebar/NavSecondary.svelte +0 -0
  350. /package/{src/lib → dist}/components/layout/sidebar/NavUser.svelte +0 -0
  351. /package/{src/lib → dist}/plugins/README.md +0 -0
package/src/lib/hooks.ts DELETED
@@ -1,142 +0,0 @@
1
- import type { Handle } from '@sveltejs/kit';
2
- import type { CMSConfig } from './types/index';
3
- import type { DatabaseAdapter } from './db/index';
4
- import type { AssetService } from './services/asset-service';
5
- import type { StorageAdapter } from './storage/interfaces/storage';
6
- import type { EmailAdapter } from './email/index';
7
- import type { AuthProvider } from './auth/provider';
8
- import { handleAuthHook } from './auth/auth-hooks';
9
- import { createStorageAdapter as createStorageAdapterProvider } from './storage/providers/storage';
10
- import { AssetService as AssetServiceClass } from './services/asset-service';
11
- import { createCMS, CMSEngine } from './engine';
12
-
13
- // Singleton instances - created once per application lifecycle
14
- export interface CMSInstances {
15
- config: CMSConfig;
16
- assetService: AssetService;
17
- storageAdapter: StorageAdapter;
18
- databaseAdapter: DatabaseAdapter;
19
- emailAdapter?: EmailAdapter | null;
20
- cmsEngine: CMSEngine;
21
- auth?: AuthProvider;
22
- pluginRoutes?: Map<
23
- string,
24
- { handler: (event: any) => Promise<Response> | Response; pluginName: string }
25
- >;
26
- }
27
-
28
- let cmsInstances: CMSInstances | null = null;
29
- let lastConfigHash: string | null = null;
30
-
31
- // Helper to generate a simple hash of schema types for change detection
32
- function getConfigHash(config: CMSConfig): string {
33
- const schemaNames = config.schemaTypes
34
- .map((s) => `${s.name}:${s.fields.length}:${JSON.stringify(s.fields)}`)
35
- .join(',');
36
- return schemaNames;
37
- }
38
-
39
- // Factory function to create the default local storage adapter
40
- function createDefaultStorageAdapter(): StorageAdapter {
41
- return createStorageAdapterProvider('local', {
42
- basePath: './storage/assets', // Private storage - not in static/, not served in production
43
- baseUrl: '' // No direct URL - all access through /assets/{id}/{filename}
44
- });
45
- }
46
-
47
- export function createCMSHook(config: CMSConfig): Handle {
48
- return async ({ event, resolve }) => {
49
- // Note: In dev mode, /storage/ might be accessible via Vite dev server
50
- // In production, only /static/ folder is served - /storage/ is private
51
-
52
- const currentConfigHash = getConfigHash(config);
53
- const configChanged = lastConfigHash !== null && currentConfigHash !== lastConfigHash;
54
-
55
- // Initialize CMS instances once at application startup
56
- if (!cmsInstances) {
57
- console.log('🚀 Initializing CMS...');
58
- const databaseAdapter = config.database;
59
- // Use the storage adapter from config, or create the default local one.
60
- const storageAdapter = config.storage ?? createDefaultStorageAdapter();
61
- const emailAdapter = config.email ?? null;
62
- const assetService = new AssetServiceClass(storageAdapter, databaseAdapter);
63
- const cmsEngine = createCMS(config, databaseAdapter);
64
-
65
- await cmsEngine.initialize();
66
-
67
- // Build plugin route map (do this ONCE at startup)
68
- const pluginRoutes = new Map<
69
- string,
70
- { handler: (event: any) => Promise<Response> | Response; pluginName: string }
71
- >();
72
- if (config.plugins && config.plugins.length > 0) {
73
- for (const plugin of config.plugins) {
74
- if (plugin.routes) {
75
- for (const [path, handler] of Object.entries(plugin.routes)) {
76
- pluginRoutes.set(path, { handler, pluginName: plugin.name });
77
- }
78
- }
79
- }
80
- }
81
-
82
- cmsInstances = {
83
- config,
84
- databaseAdapter: databaseAdapter,
85
- assetService: assetService,
86
- storageAdapter: storageAdapter,
87
- emailAdapter: emailAdapter,
88
- cmsEngine: cmsEngine,
89
- auth: config.auth?.provider,
90
- pluginRoutes
91
- };
92
-
93
- // Install plugins
94
- if (config.plugins && config.plugins.length > 0) {
95
- for (const plugin of config.plugins) {
96
- console.log(`🔌 Installing plugin: ${plugin.name}`);
97
- await plugin.install(cmsInstances);
98
- }
99
- }
100
-
101
- lastConfigHash = currentConfigHash;
102
- } else if (configChanged) {
103
- // HMR: Config changed, re-sync schemas
104
- console.log('🔄 Schema types changed, re-syncing...');
105
- console.log('Old hash:', lastConfigHash?.substring(0, 100) + '...');
106
- console.log('New hash:', currentConfigHash.substring(0, 100) + '...');
107
- console.log(
108
- 'Schema types being updated:',
109
- config.schemaTypes.map((s) => s.name)
110
- );
111
- cmsInstances.cmsEngine.updateConfig(config);
112
- await cmsInstances.cmsEngine.initialize();
113
- lastConfigHash = currentConfigHash;
114
- console.log('✅ Schema sync complete');
115
- }
116
-
117
- // Inject shared CMS services into locals (reuse singleton instances)
118
- event.locals.aphexCMS = cmsInstances;
119
-
120
- // Auth protection if configured
121
- if (cmsInstances.auth) {
122
- const authResponse = await handleAuthHook(
123
- event,
124
- config,
125
- cmsInstances.auth,
126
- cmsInstances.databaseAdapter
127
- );
128
- if (authResponse) return authResponse;
129
- }
130
-
131
- // Check if a plugin handles this route (O(1) lookup)
132
- if (cmsInstances.pluginRoutes && cmsInstances.pluginRoutes.size > 0) {
133
- const pluginRoute = cmsInstances.pluginRoutes.get(event.url.pathname);
134
- if (pluginRoute) {
135
- console.log(`🔌 Plugin ${pluginRoute.pluginName} handling route: ${event.url.pathname}`);
136
- return pluginRoute.handler(event);
137
- }
138
- }
139
-
140
- return resolve(event);
141
- };
142
- }
@@ -1,161 +0,0 @@
1
- import { json } from '@sveltejs/kit';
2
- import type { RequestHandler } from '@sveltejs/kit';
3
- import { Asset } from '../types/asset';
4
-
5
- export const GET: RequestHandler = async ({ params, locals }) => {
6
- try {
7
- const { assetService } = locals.aphexCMS;
8
- const auth = locals.auth;
9
- const { id } = params;
10
-
11
- if (!auth) {
12
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
13
- }
14
-
15
- if (!id) {
16
- return json({ success: false, error: 'Asset ID is required' }, { status: 400 });
17
- }
18
-
19
- const asset = await assetService.findAssetById(auth.organizationId, id);
20
-
21
- if (!asset) {
22
- return json({ success: false, error: 'Asset not found' }, { status: 404 });
23
- }
24
-
25
- // Return JSON metadata for admin UI
26
- return json({
27
- success: true,
28
- data: {
29
- _type: asset.assetType === 'image' ? 'sanity.imageAsset' : 'sanity.fileAsset',
30
- _id: asset.id,
31
- url: asset.url,
32
- originalFilename: asset.originalFilename,
33
- mimeType: asset.mimeType,
34
- size: asset.size,
35
- metadata: {
36
- dimensions:
37
- asset.width && asset.height
38
- ? {
39
- width: asset.width,
40
- height: asset.height
41
- }
42
- : undefined,
43
- ...asset.metadata
44
- },
45
- title: asset.title,
46
- description: asset.description,
47
- alt: asset.alt,
48
- creditLine: asset.creditLine,
49
- _createdAt: asset.createdAt,
50
- _updatedAt: asset.updatedAt
51
- }
52
- });
53
- } catch (error) {
54
- console.error('[Asset API] Error fetching asset:', error);
55
- return json({ success: false, error: 'Failed to fetch asset' }, { status: 500 });
56
- }
57
- };
58
-
59
- export const DELETE: RequestHandler = async ({ params, locals }) => {
60
- try {
61
- const { id } = params;
62
- const { assetService } = locals.aphexCMS;
63
- const auth = locals.auth;
64
-
65
- if (!auth) {
66
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
67
- }
68
-
69
- if (!id) {
70
- return json({ success: false, error: 'Asset ID is required' }, { status: 400 });
71
- }
72
-
73
- const result = await assetService.deleteAsset(auth.organizationId, id);
74
-
75
- if (!result) {
76
- return json(
77
- { success: false, error: 'Asset not found or could not be deleted' },
78
- { status: 404 }
79
- );
80
- }
81
-
82
- return json({ success: true });
83
- } catch (error) {
84
- console.error('Error deleting asset:', error);
85
- return json({ success: false, error: 'Failed to delete asset' }, { status: 500 });
86
- }
87
- };
88
-
89
- export const PATCH: RequestHandler = async ({ params, locals, request }) => {
90
- try {
91
- const { assetService } = locals.aphexCMS;
92
- const auth = locals.auth;
93
- const { id } = params;
94
-
95
- if (!auth) {
96
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
97
- }
98
-
99
- if (!id) {
100
- return json({ success: false, error: 'Asset ID is required' }, { status: 400 });
101
- }
102
-
103
- const { title, description, alt, creditLine } = await request.json();
104
-
105
- let updatedAsset: Asset | null;
106
-
107
- if (auth.type == 'session') {
108
- updatedAsset = await assetService.updateAssetMetadata(auth.organizationId, id, {
109
- title,
110
- description,
111
- alt,
112
- creditLine,
113
- updatedBy: auth.user.id
114
- });
115
- } else {
116
- updatedAsset = await assetService.updateAssetMetadata(auth.organizationId, id, {
117
- title,
118
- description,
119
- alt,
120
- creditLine,
121
- updatedBy: auth.keyId
122
- });
123
- }
124
-
125
- if (!updatedAsset) {
126
- return json({ success: false, error: 'Asset not found' }, { status: 404 });
127
- }
128
-
129
- // Return API response with success wrapper
130
- return json({
131
- success: true,
132
- data: {
133
- _type: updatedAsset.assetType === 'image' ? 'sanity.imageAsset' : 'sanity.fileAsset',
134
- _id: updatedAsset.id,
135
- url: updatedAsset.url,
136
- originalFilename: updatedAsset.originalFilename,
137
- mimeType: updatedAsset.mimeType,
138
- size: updatedAsset.size,
139
- metadata: {
140
- dimensions:
141
- updatedAsset.width && updatedAsset.height
142
- ? {
143
- width: updatedAsset.width,
144
- height: updatedAsset.height
145
- }
146
- : undefined,
147
- ...updatedAsset.metadata
148
- },
149
- title: updatedAsset.title,
150
- description: updatedAsset.description,
151
- alt: updatedAsset.alt,
152
- creditLine: updatedAsset.creditLine,
153
- _createdAt: updatedAsset.createdAt,
154
- _updatedAt: updatedAsset.updatedAt
155
- }
156
- });
157
- } catch (error) {
158
- console.error('Error updating asset:', error);
159
- return json({ success: false, error: 'Failed to update asset' }, { status: 500 });
160
- }
161
- };
@@ -1,185 +0,0 @@
1
- import type { RequestHandler } from '@sveltejs/kit';
2
-
3
- export const GET: RequestHandler = async ({ params, locals, setHeaders, request }) => {
4
- console.log('[Asset CDN] ========== ROUTE HIT ==========');
5
- console.log('[Asset CDN] Params:', params);
6
- try {
7
- const { assetService, databaseAdapter, storageAdapter, cmsEngine, config } = locals.aphexCMS;
8
- let auth = locals.auth;
9
- const { id, filename } = params;
10
-
11
- console.log('[Asset CDN] Request for asset:', id, filename);
12
- console.log('[Asset CDN] Has auth?', !!auth);
13
-
14
- // If no session auth, check for API key in headers
15
- if (!auth) {
16
- const apiKey = request.headers.get('x-api-key');
17
- console.log('[Asset CDN] API key present?', !!apiKey);
18
- if (apiKey && config.auth?.provider) {
19
- try {
20
- const apiKeyAuth = await config.auth.provider.validateApiKey(request, databaseAdapter);
21
- if (apiKeyAuth) {
22
- auth = apiKeyAuth;
23
- console.log('[Asset CDN] Authenticated via API key, org:', apiKeyAuth.organizationId);
24
- }
25
- } catch (err) {
26
- console.warn('[Asset CDN] API key validation failed:', err);
27
- }
28
- }
29
- }
30
-
31
- console.log('[Asset CDN] Auth type:', auth?.type);
32
-
33
- if (!id) {
34
- return new Response('Asset ID is required', { status: 400 });
35
- }
36
-
37
- // Try to fetch asset globally first (bypasses RLS for public assets)
38
- const asset = await assetService.findAssetByIdGlobal(id);
39
-
40
- console.log('[Asset CDN] Asset found globally?', !!asset);
41
-
42
- if (!asset) {
43
- console.warn('[Asset CDN] Asset not found:', id);
44
- return new Response('Asset not found', { status: 404 });
45
- }
46
-
47
- const organizationId = auth?.organizationId;
48
- console.log('[Asset CDN] Auth object:', JSON.stringify(auth, null, 2));
49
- console.log('[Asset CDN] Auth organizationId:', organizationId);
50
- console.log('[Asset CDN] Asset organizationId:', asset.organizationId);
51
-
52
- // Check if this asset is used in a private field
53
- // The field metadata (schemaType and fieldPath) is stored when the asset is uploaded
54
- let isPrivate = false;
55
-
56
- const schemaType = asset.metadata?.schemaType;
57
- const fieldPath = asset.metadata?.fieldPath;
58
-
59
- if (schemaType && fieldPath) {
60
- // Get the schema definition from IN-MEMORY config (always up-to-date with code changes)
61
- const schema = cmsEngine.getSchemaTypeByName(schemaType);
62
- console.log(`[Asset CDN] Schema lookup for ${schemaType}:`, {
63
- found: !!schema,
64
- fieldCount: schema?.fields?.length
65
- });
66
-
67
- if (schema && schema.fields) {
68
- // Navigate the field path to find the field definition
69
- const findField = (fields: any[], path: string): any => {
70
- const parts = path.split('.');
71
- let current: any = null;
72
-
73
- for (let i = 0; i < parts.length; i++) {
74
- const part = parts[i];
75
- current = fields.find((f) => f.name === part);
76
-
77
- if (!current) return null;
78
-
79
- // If not the last part, navigate into nested fields
80
- if (i < parts.length - 1) {
81
- if (current.type === 'object' && current.fields) {
82
- fields = current.fields;
83
- } else {
84
- return null;
85
- }
86
- }
87
- }
88
-
89
- return current;
90
- };
91
-
92
- const field = findField(schema.fields, fieldPath);
93
- console.log(`[Asset CDN] Field lookup for ${fieldPath}:`, {
94
- found: !!field,
95
- type: field?.type,
96
- private: field?.private
97
- });
98
-
99
- if (field && field.type === 'image') {
100
- isPrivate = field.private === true;
101
- console.log(
102
- `[Asset CDN] Field check: ${schemaType}.${fieldPath} - private: ${isPrivate}`
103
- );
104
- } else {
105
- console.warn(`[Asset CDN] Could not find field: ${schemaType}.${fieldPath}`);
106
- }
107
- }
108
- } else {
109
- console.log('[Asset CDN] No field metadata - treating as public');
110
- }
111
-
112
- console.log('[Asset CDN] Asset privacy result:', { isPrivate, schemaType, fieldPath });
113
-
114
- // If asset is private, require auth
115
- if (isPrivate && !organizationId) {
116
- console.warn('[Asset CDN] Private asset accessed without auth - DENIED');
117
- return new Response('Unauthorized - This asset is private', { status: 401 });
118
- }
119
-
120
- // If asset is private, verify org matches
121
- if (isPrivate && organizationId && organizationId !== asset.organizationId) {
122
- console.warn('[Asset CDN] Org mismatch for private asset - FORBIDDEN');
123
- return new Response('Forbidden', { status: 403 });
124
- }
125
-
126
- // Log the decision
127
- if (isPrivate && organizationId) {
128
- console.log('[Asset CDN] Private asset access ALLOWED - user has auth and org matches');
129
- } else if (!isPrivate) {
130
- console.log('[Asset CDN] Public asset access ALLOWED');
131
- }
132
-
133
- console.log('[Asset CDN] Asset found:', {
134
- id: asset.id,
135
- path: asset.path,
136
- mimeType: asset.mimeType,
137
- storageAdapter: asset.storageAdapter
138
- });
139
-
140
- // If asset has a direct URL (S3/R2), redirect to it
141
- if (asset.url && asset.url.startsWith('http')) {
142
- console.log('[Asset CDN] Redirecting to external URL:', asset.url);
143
- return new Response(null, {
144
- status: 302,
145
- headers: { Location: asset.url }
146
- });
147
- }
148
-
149
- // Otherwise, serve from local storage
150
- if (!storageAdapter?.getObject) {
151
- console.error('[Asset CDN] Storage adapter does not support getObject');
152
- return new Response('Storage adapter does not support file serving', { status: 500 });
153
- }
154
-
155
- console.log('[Asset CDN] Reading file from storage:', asset.path);
156
- const fileBuffer = await storageAdapter.getObject(asset.path);
157
-
158
- console.log('[Asset CDN] Serving file:', {
159
- size: fileBuffer.length,
160
- mimeType: asset.mimeType
161
- });
162
-
163
- // Set appropriate headers for the asset
164
- setHeaders({
165
- 'Content-Type': asset.mimeType || 'application/octet-stream',
166
- 'Content-Length': fileBuffer.length.toString(),
167
- 'Cache-Control': 'public, max-age=31536000, immutable', // Cache for 1 year
168
- 'Content-Disposition': `inline; filename="${encodeURIComponent(asset.originalFilename || asset.filename)}"`,
169
- ...(asset.mimeType?.startsWith('image/') && {
170
- 'Accept-Ranges': 'bytes'
171
- })
172
- });
173
-
174
- // Convert Buffer to ArrayBuffer for Response
175
- const arrayBuffer = fileBuffer.buffer.slice(
176
- fileBuffer.byteOffset,
177
- fileBuffer.byteOffset + fileBuffer.byteLength
178
- ) as ArrayBuffer;
179
-
180
- return new Response(arrayBuffer);
181
- } catch (error) {
182
- console.error('[Asset CDN] Error serving asset:', error);
183
- return new Response('Failed to serve asset', { status: 500 });
184
- }
185
- };
@@ -1,116 +0,0 @@
1
- // Aphex CMS Asset API Handlers
2
- import { json } from '@sveltejs/kit';
3
- import type { RequestHandler } from '@sveltejs/kit';
4
-
5
- export const POST: RequestHandler = async ({ request, locals }) => {
6
- try {
7
- const { assetService } = locals.aphexCMS;
8
- const auth = locals.auth;
9
-
10
- if (!auth) {
11
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
12
- }
13
-
14
- const formData = await request.formData();
15
- const file = formData.get('file') as File;
16
-
17
- if (!file) {
18
- return json({ success: false, error: 'No file provided' }, { status: 400 });
19
- }
20
-
21
- // Convert file to buffer
22
- const arrayBuffer = await file.arrayBuffer();
23
- const buffer = Buffer.from(arrayBuffer);
24
-
25
- // Get optional metadata from form data
26
- const title = (formData.get('title') as string) || undefined;
27
- const description = (formData.get('description') as string) || undefined;
28
- const alt = (formData.get('alt') as string) || undefined;
29
- const creditLine = (formData.get('creditLine') as string) || undefined;
30
-
31
- // Get field metadata for privacy checking
32
- const schemaType = (formData.get('schemaType') as string) || undefined;
33
- const fieldPath = (formData.get('fieldPath') as string) || undefined;
34
-
35
- // Create asset upload data
36
- const uploadData = {
37
- buffer,
38
- originalFilename: file.name,
39
- mimeType: file.type,
40
- size: file.size,
41
- title,
42
- description,
43
- alt,
44
- creditLine,
45
- createdBy: auth.type === 'session' ? auth.user.id : undefined,
46
- metadata: {
47
- schemaType,
48
- fieldPath
49
- }
50
- };
51
-
52
- // Upload asset using the service
53
- const asset = await assetService.uploadAsset(auth.organizationId, uploadData);
54
-
55
- return json({
56
- success: true,
57
- data: asset
58
- });
59
- } catch (error) {
60
- console.error('Asset upload failed:', error);
61
- return json(
62
- {
63
- success: false,
64
- error: 'Asset upload failed',
65
- message: error instanceof Error ? error.message : 'Unknown error'
66
- },
67
- { status: 500 }
68
- );
69
- }
70
- };
71
-
72
- export const GET: RequestHandler = async ({ url, locals }) => {
73
- try {
74
- const { assetService } = locals.aphexCMS;
75
- const auth = locals.auth;
76
-
77
- if (!auth) {
78
- return json({ success: false, error: 'Unauthorized' }, { status: 401 });
79
- }
80
-
81
- // Parse query parameters
82
- const assetType = url.searchParams.get('assetType') as 'image' | 'file' | undefined;
83
- const mimeType = url.searchParams.get('mimeType') || undefined;
84
- const search = url.searchParams.get('search') || undefined;
85
- const limitParam = url.searchParams.get('limit');
86
- const offsetParam = url.searchParams.get('offset');
87
-
88
- const limit = limitParam ? parseInt(limitParam) : 20;
89
- const offset = offsetParam ? parseInt(offsetParam) : 0;
90
-
91
- const filters = {
92
- assetType,
93
- mimeType,
94
- search,
95
- limit: isNaN(limit) ? 20 : limit,
96
- offset: isNaN(offset) ? 0 : offset
97
- };
98
-
99
- const assets = await assetService.findAssets(auth.organizationId, filters);
100
-
101
- return json({
102
- success: true,
103
- data: assets
104
- });
105
- } catch (error) {
106
- console.error('Failed to fetch assets:', error);
107
- return json(
108
- {
109
- success: false,
110
- error: 'Failed to fetch assets',
111
- message: error instanceof Error ? error.message : 'Unknown error'
112
- },
113
- { status: 500 }
114
- );
115
- }
116
- };