@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
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Helper to extract URL from various image source types
3
+ * Works with GraphQL responses that include resolved asset data
4
+ */
5
+ function extractUrl(source) {
6
+ if (!source)
7
+ return null;
8
+ // Direct URL string
9
+ if (typeof source === 'string') {
10
+ return source;
11
+ }
12
+ // Asset object with url property
13
+ if (typeof source === 'object' && 'url' in source && source.url) {
14
+ return source.url;
15
+ }
16
+ // ImageValue with resolved asset (from GraphQL)
17
+ if (typeof source === 'object' && 'asset' in source && source.asset) {
18
+ // Check if asset is resolved (has url property)
19
+ if (typeof source.asset === 'object' && 'url' in source.asset) {
20
+ return source.asset.url;
21
+ }
22
+ }
23
+ return null;
24
+ }
25
+ export class ImageUrlBuilder {
26
+ _source = null;
27
+ _options = {};
28
+ /**
29
+ * Set the image source
30
+ */
31
+ image(source) {
32
+ this._source = source;
33
+ return this;
34
+ }
35
+ /**
36
+ * Set width (for future dynamic image rendering)
37
+ */
38
+ width(width) {
39
+ this._options.width = width;
40
+ return this;
41
+ }
42
+ /**
43
+ * Set height (for future dynamic image rendering)
44
+ */
45
+ height(height) {
46
+ this._options.height = height;
47
+ return this;
48
+ }
49
+ /**
50
+ * Set both width and height (for future dynamic image rendering)
51
+ */
52
+ size(width, height) {
53
+ this._options.width = width;
54
+ this._options.height = height;
55
+ return this;
56
+ }
57
+ /**
58
+ * Set quality (for future dynamic image rendering)
59
+ */
60
+ quality(quality) {
61
+ this._options.quality = Math.max(1, Math.min(100, quality));
62
+ return this;
63
+ }
64
+ /**
65
+ * Set format (for future dynamic image rendering)
66
+ */
67
+ format(format) {
68
+ this._options.format = format;
69
+ return this;
70
+ }
71
+ /**
72
+ * Set fit mode (for future dynamic image rendering)
73
+ */
74
+ fit(fit) {
75
+ this._options.fit = fit;
76
+ return this;
77
+ }
78
+ /**
79
+ * Enable automatic format selection (for future dynamic image rendering)
80
+ */
81
+ auto(mode) {
82
+ this._options.auto = mode;
83
+ return this;
84
+ }
85
+ /**
86
+ * Build the final URL
87
+ * Returns /api/assets/{id}?dl=1 which redirects to the actual S3/R2 URL
88
+ * Transformations (.width(), .quality(), etc) are stored but not yet applied
89
+ *
90
+ * For multi-tenant access, use signAssetUrl config to generate signed URLs
91
+ * TODO: Add dynamic image rendering support
92
+ */
93
+ url() {
94
+ console.log('[ImageUrlBuilder] url() called with source:', JSON.stringify(this._source));
95
+ if (!this._source) {
96
+ console.log('[ImageUrlBuilder] No source provided');
97
+ return null;
98
+ }
99
+ // First try to extract a direct URL (if asset was already resolved)
100
+ const directUrl = extractUrl(this._source);
101
+ if (directUrl) {
102
+ console.log('[ImageUrlBuilder] Using direct URL from resolved asset:', directUrl);
103
+ return directUrl;
104
+ }
105
+ // Otherwise, build an API URL from the asset reference
106
+ let assetId = null;
107
+ if (typeof this._source === 'string') {
108
+ console.log('[ImageUrlBuilder] Source is string:', this._source);
109
+ assetId = this._source;
110
+ }
111
+ else if (typeof this._source === 'object') {
112
+ console.log('[ImageUrlBuilder] Source is object, checking for asset._ref or _ref');
113
+ if ('asset' in this._source && this._source.asset?._ref) {
114
+ assetId = this._source.asset._ref;
115
+ console.log('[ImageUrlBuilder] Found asset._ref:', assetId);
116
+ }
117
+ else if ('_ref' in this._source) {
118
+ assetId = this._source._ref;
119
+ console.log('[ImageUrlBuilder] Found _ref:', assetId);
120
+ }
121
+ }
122
+ if (!assetId) {
123
+ console.warn('[ImageUrlBuilder] Could not extract asset ID from source:', this._source);
124
+ return null;
125
+ }
126
+ const finalUrl = `/media/${assetId}/image`;
127
+ console.log('[ImageUrlBuilder] Building CDN URL:', finalUrl);
128
+ return finalUrl;
129
+ }
130
+ /**
131
+ * Alias for url()
132
+ */
133
+ toString() {
134
+ return this.url();
135
+ }
136
+ }
137
+ /**
138
+ * Factory function to create an image URL builder
139
+ *
140
+ * Note: Currently returns direct S3/R2 URLs without transformations.
141
+ * The baseUrl parameter is accepted for future compatibility but not currently used
142
+ * since assets already contain their full public URLs.
143
+ *
144
+ * For multi-tenant access with API keys, provide a signAssetUrl function:
145
+ * const urlFor = imageUrlBuilder({
146
+ * signAssetUrl: (assetId) => `/api/assets/${assetId}?token=${generateToken(assetId)}`
147
+ * })
148
+ *
149
+ * Usage:
150
+ * const urlFor = imageUrlBuilder({ baseUrl: 'https://yourdomain.com' })
151
+ * const url = urlFor(image).url() // Returns asset.url directly
152
+ *
153
+ * Future usage with transformations:
154
+ * const url = urlFor(image).width(800).quality(80).url()
155
+ * // Will return transformed image once dynamic rendering is implemented
156
+ */
157
+ export function imageUrlBuilder() {
158
+ return (source) => {
159
+ const builder = new ImageUrlBuilder();
160
+ if (source) {
161
+ builder.image(source);
162
+ }
163
+ return builder;
164
+ };
165
+ }
@@ -0,0 +1,6 @@
1
+ export * from '../schema-utils/index.js';
2
+ export * from '../field-validation/utils.js';
3
+ export * from './content-hash.js';
4
+ export * from './slug.js';
5
+ export * from './image-url.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/utils/index.ts"],"names":[],"mappings":"AAGA,cAAc,uBAAuB,CAAC;AAGtC,cAAc,2BAA2B,CAAC;AAG1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC"}
@@ -0,0 +1,9 @@
1
+ // Aphex CMS Utilities
2
+ // Schema utilities
3
+ export * from '../schema-utils/index.js';
4
+ // Validation utilities
5
+ export * from '../field-validation/utils.js';
6
+ // Other utilities
7
+ export * from './content-hash.js';
8
+ export * from './slug.js';
9
+ export * from './image-url.js';
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Generate a URL-friendly slug from a string
3
+ * @param text - The text to convert to a slug
4
+ * @returns A URL-safe slug string
5
+ */
6
+ export declare function generateSlug(text: string): string;
7
+ /**
8
+ * Validate if a string is a valid slug
9
+ * @param slug - The slug to validate
10
+ * @returns Boolean indicating if the slug is valid
11
+ */
12
+ export declare function isValidSlug(slug: string): boolean;
13
+ //# sourceMappingURL=slug.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slug.d.ts","sourceRoot":"","sources":["../../src/lib/utils/slug.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAajD;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOjD"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Generate a URL-friendly slug from a string
3
+ * @param text - The text to convert to a slug
4
+ * @returns A URL-safe slug string
5
+ */
6
+ export function generateSlug(text) {
7
+ if (!text)
8
+ return '';
9
+ return (text
10
+ .toString()
11
+ .toLowerCase()
12
+ .trim()
13
+ // Replace spaces and multiple special characters with single hyphens
14
+ .replace(/[^a-z0-9]+/g, '-')
15
+ // Remove leading and trailing hyphens
16
+ .replace(/^-+|-+$/g, ''));
17
+ }
18
+ /**
19
+ * Validate if a string is a valid slug
20
+ * @param slug - The slug to validate
21
+ * @returns Boolean indicating if the slug is valid
22
+ */
23
+ export function isValidSlug(slug) {
24
+ if (!slug)
25
+ return false;
26
+ // Valid slug: lowercase letters, numbers, and hyphens only
27
+ // Cannot start or end with hyphen
28
+ const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
29
+ return slugPattern.test(slug);
30
+ }
@@ -0,0 +1,13 @@
1
+ import { type ClassValue } from 'clsx';
2
+ export declare function cn(...inputs: ClassValue[]): string;
3
+ export type WithoutChild<T> = T extends {
4
+ child?: any;
5
+ } ? Omit<T, 'child'> : T;
6
+ export type WithoutChildren<T> = T extends {
7
+ children?: any;
8
+ } ? Omit<T, 'children'> : T;
9
+ export type WithoutChildrenOrChild<T> = WithoutChildren<WithoutChild<T>>;
10
+ export type WithElementRef<T, U extends HTMLElement = HTMLElement> = T & {
11
+ ref?: U | null;
12
+ };
13
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAG7C,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAGD,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,KAAK,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;AAE/E,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,GAAG,CAAA;CAAE,GAAG,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;AACxF,MAAM,MAAM,sBAAsB,CAAC,CAAC,IAAI,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,MAAM,MAAM,cAAc,CAAC,CAAC,EAAE,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,CAAC,GAAG;IAAE,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAA;CAAE,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,5 @@
1
+ import { clsx } from 'clsx';
2
+ import { twMerge } from 'tailwind-merge';
3
+ export function cn(...inputs) {
4
+ return twMerge(clsx(inputs));
5
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aphexcms/cms-core",
3
- "version": "0.1.11",
3
+ "version": "0.1.12",
4
4
  "description": "Aphex CMS Core - A Sanity-style CMS with ports and adapters architecture",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -30,7 +30,7 @@
30
30
  }
31
31
  },
32
32
  "files": [
33
- "src/lib"
33
+ "dist"
34
34
  ],
35
35
  "scripts": {
36
36
  "build": "svelte-package && node ../../scripts/fix-imports.js ./dist",
@@ -1,75 +0,0 @@
1
- // Assets API client - manage uploaded files and images
2
- import { apiClient } from './client';
3
- import type { Asset } from '../types/asset';
4
- import type { ApiResponse } from './types';
5
-
6
- export interface AssetFilters {
7
- assetType?: 'image' | 'file';
8
- mimeType?: string;
9
- search?: string;
10
- limit?: number;
11
- offset?: number;
12
- }
13
-
14
- export interface UpdateAssetData {
15
- title?: string;
16
- description?: string;
17
- alt?: string;
18
- creditLine?: string;
19
- }
20
-
21
- export class AssetsApi {
22
- /**
23
- * List assets with optional filters
24
- */
25
- static async list(filters?: AssetFilters): Promise<ApiResponse<Asset[]>> {
26
- const params = new URLSearchParams();
27
- if (filters) {
28
- Object.entries(filters).forEach(([key, value]) => {
29
- if (value !== undefined) {
30
- params.append(key, String(value));
31
- }
32
- });
33
- }
34
- const query = params.toString();
35
- return apiClient.get<Asset[]>(`/assets${query ? `?${query}` : ''}`);
36
- }
37
-
38
- /**
39
- * Get asset by ID
40
- */
41
- static async getById(id: string): Promise<ApiResponse<Asset>> {
42
- return apiClient.get<Asset>(`/assets/${id}`);
43
- }
44
-
45
- /**
46
- * Upload a new asset (multipart/form-data)
47
- * Note: Use FormData for file uploads
48
- */
49
- static async upload(formData: FormData): Promise<ApiResponse<Asset>> {
50
- return apiClient.post<Asset>('/assets', formData);
51
- }
52
-
53
- /**
54
- * Update asset metadata
55
- */
56
- static async update(id: string, data: UpdateAssetData): Promise<ApiResponse<Asset>> {
57
- return apiClient.patch<Asset>(`/assets/${id}`, data);
58
- }
59
-
60
- /**
61
- * Delete an asset
62
- */
63
- static async delete(id: string): Promise<ApiResponse<{ success: boolean }>> {
64
- return apiClient.delete<{ success: boolean }>(`/assets/${id}`);
65
- }
66
- }
67
-
68
- // Export convenience functions for direct use
69
- export const assets = {
70
- list: AssetsApi.list.bind(AssetsApi),
71
- getById: AssetsApi.getById.bind(AssetsApi),
72
- upload: AssetsApi.upload.bind(AssetsApi),
73
- update: AssetsApi.update.bind(AssetsApi),
74
- delete: AssetsApi.delete.bind(AssetsApi)
75
- };
@@ -1,150 +0,0 @@
1
- // Base API client with common functionality
2
- import type { ApiResponse } from './types';
3
-
4
- // Default configuration
5
- const DEFAULT_BASE_URL = '/api';
6
- const DEFAULT_TIMEOUT = 10000; // 10 seconds
7
-
8
- export class ApiError extends Error {
9
- constructor(
10
- public status: number,
11
- public response: any,
12
- message?: string
13
- ) {
14
- super(message || `API Error: ${status}`);
15
- this.name = 'ApiError';
16
- }
17
- }
18
-
19
- export class ApiClient {
20
- private baseUrl: string;
21
- private timeout: number;
22
-
23
- constructor(baseUrl = DEFAULT_BASE_URL, timeout = DEFAULT_TIMEOUT) {
24
- this.baseUrl = baseUrl;
25
- this.timeout = timeout;
26
- }
27
-
28
- /**
29
- * Make HTTP request with proper error handling
30
- */
31
- private async request<T>(endpoint: string, options: RequestInit = {}): Promise<ApiResponse<T>> {
32
- const url = `${this.baseUrl}${endpoint}`;
33
-
34
- // Set up request with defaults
35
- // Don't set Content-Type for FormData (browser will set it with boundary)
36
- const headers: Record<string, string> = {};
37
- if (!(options.body instanceof FormData)) {
38
- headers['Content-Type'] = 'application/json';
39
- }
40
-
41
- const requestOptions: RequestInit = {
42
- headers: {
43
- ...headers,
44
- ...options.headers
45
- },
46
- ...options
47
- };
48
-
49
- // Add timeout
50
- const controller = new AbortController();
51
- const timeoutId = setTimeout(() => controller.abort(), this.timeout);
52
- requestOptions.signal = controller.signal;
53
-
54
- try {
55
- const response = await fetch(url, requestOptions);
56
- clearTimeout(timeoutId);
57
-
58
- const data: ApiResponse<T> = await response.json();
59
-
60
- // Handle HTTP errors
61
- if (!response.ok) {
62
- throw new ApiError(response.status, data, data.message || data.error);
63
- }
64
-
65
- // Handle API-level errors
66
- if (!data.success) {
67
- throw new ApiError(response.status, data, data.message || data.error);
68
- }
69
-
70
- return data;
71
- } catch (error) {
72
- clearTimeout(timeoutId);
73
-
74
- if (error instanceof ApiError) {
75
- throw error;
76
- }
77
-
78
- // Handle fetch errors (network, timeout, etc.)
79
- throw new ApiError(0, null, error instanceof Error ? error.message : 'Network error');
80
- }
81
- }
82
-
83
- /**
84
- * GET request
85
- */
86
- async get<T>(endpoint: string, params?: Record<string, any>): Promise<ApiResponse<T>> {
87
- let url = endpoint;
88
-
89
- if (params) {
90
- const searchParams = new URLSearchParams();
91
- Object.entries(params).forEach(([key, value]) => {
92
- if (value !== undefined && value !== null) {
93
- searchParams.append(key, String(value));
94
- }
95
- });
96
-
97
- if (searchParams.toString()) {
98
- url += `?${searchParams.toString()}`;
99
- }
100
- }
101
-
102
- return this.request<T>(url, { method: 'GET' });
103
- }
104
-
105
- /**
106
- * POST request
107
- */
108
- async post<T>(endpoint: string, body?: any): Promise<ApiResponse<T>> {
109
- return this.request<T>(endpoint, {
110
- method: 'POST',
111
- // Don't stringify FormData - pass it directly
112
- body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined
113
- });
114
- }
115
-
116
- /**
117
- * PUT request
118
- */
119
- async put<T>(endpoint: string, body?: any): Promise<ApiResponse<T>> {
120
- return this.request<T>(endpoint, {
121
- method: 'PUT',
122
- // Don't stringify FormData - pass it directly
123
- body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined
124
- });
125
- }
126
-
127
- /**
128
- * DELETE request
129
- */
130
- async delete<T>(endpoint: string, body?: any): Promise<ApiResponse<T>> {
131
- return this.request<T>(endpoint, {
132
- method: 'DELETE',
133
- body: body ? JSON.stringify(body) : undefined
134
- });
135
- }
136
-
137
- /**
138
- * PATCH request
139
- */
140
- async patch<T>(endpoint: string, body?: any): Promise<ApiResponse<T>> {
141
- return this.request<T>(endpoint, {
142
- method: 'PATCH',
143
- // Don't stringify FormData - pass it directly
144
- body: body instanceof FormData ? body : body ? JSON.stringify(body) : undefined
145
- });
146
- }
147
- }
148
-
149
- // Export singleton instance
150
- export const apiClient = new ApiClient();
@@ -1,102 +0,0 @@
1
- // Documents API client - composable document operations
2
- import { apiClient } from './client';
3
- import type {
4
- Document,
5
- DocumentListParams,
6
- CreateDocumentData,
7
- UpdateDocumentData,
8
- ApiResponse
9
- } from './types';
10
-
11
- export class DocumentsApi {
12
- /**
13
- * List documents with optional filtering
14
- */
15
- static async list(params: DocumentListParams = {}): Promise<ApiResponse<Document[]>> {
16
- return apiClient.get<Document[]>('/documents', params);
17
- }
18
-
19
- /**
20
- * Get document by ID
21
- */
22
- static async getById(id: string): Promise<ApiResponse<Document>> {
23
- return apiClient.get<Document>(`/documents/${id}`);
24
- }
25
-
26
- /**
27
- * Create new document
28
- */
29
- static async create(data: CreateDocumentData): Promise<ApiResponse<Document>> {
30
- return apiClient.post<Document>('/documents', data);
31
- }
32
-
33
- /**
34
- * Update document draft by ID (auto-save)
35
- */
36
- static async updateById(id: string, data: UpdateDocumentData): Promise<ApiResponse<Document>> {
37
- return apiClient.put<Document>(`/documents/${id}`, data);
38
- }
39
-
40
- /**
41
- * Publish document (copy draft -> published)
42
- */
43
- static async publish(id: string): Promise<ApiResponse<Document>> {
44
- return apiClient.post<Document>(`/documents/${id}/publish`);
45
- }
46
-
47
- /**
48
- * Unpublish document (revert to draft only)
49
- */
50
- static async unpublish(id: string): Promise<ApiResponse<Document>> {
51
- return apiClient.delete<Document>(`/documents/${id}/publish`);
52
- }
53
-
54
- /**
55
- * Delete document by ID
56
- */
57
- static async deleteById(id: string): Promise<ApiResponse<void>> {
58
- return apiClient.delete<void>(`/documents/${id}`);
59
- }
60
-
61
- /**
62
- * Get documents by type (convenience method)
63
- */
64
- static async getByType(
65
- docType: string,
66
- params: Omit<DocumentListParams, 'docType'> = {}
67
- ): Promise<ApiResponse<Document[]>> {
68
- return this.list({ ...params, docType });
69
- }
70
-
71
- /**
72
- * Get published documents only (convenience method)
73
- */
74
- static async getPublished(
75
- params: Omit<DocumentListParams, 'status'> = {}
76
- ): Promise<ApiResponse<Document[]>> {
77
- return this.list({ ...params, status: 'published' });
78
- }
79
-
80
- /**
81
- * Get draft documents only (convenience method)
82
- */
83
- static async getDrafts(
84
- params: Omit<DocumentListParams, 'status'> = {}
85
- ): Promise<ApiResponse<Document[]>> {
86
- return this.list({ ...params, status: 'draft' });
87
- }
88
- }
89
-
90
- // Export convenience functions for direct use
91
- export const documents = {
92
- list: DocumentsApi.list.bind(DocumentsApi),
93
- getById: DocumentsApi.getById.bind(DocumentsApi),
94
- create: DocumentsApi.create.bind(DocumentsApi),
95
- updateById: DocumentsApi.updateById.bind(DocumentsApi),
96
- publish: DocumentsApi.publish.bind(DocumentsApi),
97
- unpublish: DocumentsApi.unpublish.bind(DocumentsApi),
98
- deleteById: DocumentsApi.deleteById.bind(DocumentsApi),
99
- getByType: DocumentsApi.getByType.bind(DocumentsApi),
100
- getPublished: DocumentsApi.getPublished.bind(DocumentsApi),
101
- getDrafts: DocumentsApi.getDrafts.bind(DocumentsApi)
102
- };
@@ -1,7 +0,0 @@
1
- // API Client exports
2
- export { type ApiClient, ApiError, apiClient } from './client';
3
- export { type ApiResponse } from './types';
4
- export { documents } from './documents';
5
- export { organizations } from './organizations';
6
- export { assets } from './assets';
7
- export type * from '../types/index';