@aphexcms/cms-core 0.1.1 → 0.1.4

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 (336) 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/{src/api/index.ts → dist/api/index.d.ts} +1 -1
  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/client/index.ts → dist/client/index.js} +0 -16
  31. package/{src → dist}/components/AdminApp.svelte +7 -8
  32. package/dist/components/AdminApp.svelte.d.ts +24 -0
  33. package/dist/components/AdminApp.svelte.d.ts.map +1 -0
  34. package/dist/components/admin/AdminLayout.svelte.d.ts +15 -0
  35. package/dist/components/admin/AdminLayout.svelte.d.ts.map +1 -0
  36. package/dist/components/admin/DocumentEditor.svelte.d.ts +18 -0
  37. package/dist/components/admin/DocumentEditor.svelte.d.ts.map +1 -0
  38. package/dist/components/admin/DocumentTypesList.svelte.d.ts +14 -0
  39. package/dist/components/admin/DocumentTypesList.svelte.d.ts.map +1 -0
  40. package/dist/components/admin/ObjectModal.svelte.d.ts +15 -0
  41. package/dist/components/admin/ObjectModal.svelte.d.ts.map +1 -0
  42. package/dist/components/admin/SchemaField.svelte.d.ts +19 -0
  43. package/dist/components/admin/SchemaField.svelte.d.ts.map +1 -0
  44. package/dist/components/admin/fields/ArrayField.svelte.d.ts +12 -0
  45. package/dist/components/admin/fields/ArrayField.svelte.d.ts.map +1 -0
  46. package/dist/components/admin/fields/BooleanField.svelte.d.ts +13 -0
  47. package/dist/components/admin/fields/BooleanField.svelte.d.ts.map +1 -0
  48. package/dist/components/admin/fields/ImageField.svelte.d.ts +15 -0
  49. package/dist/components/admin/fields/ImageField.svelte.d.ts.map +1 -0
  50. package/dist/components/admin/fields/NumberField.svelte.d.ts +14 -0
  51. package/dist/components/admin/fields/NumberField.svelte.d.ts.map +1 -0
  52. package/dist/components/admin/fields/ReferenceField.svelte.d.ts +12 -0
  53. package/dist/components/admin/fields/ReferenceField.svelte.d.ts.map +1 -0
  54. package/dist/components/admin/fields/SlugField.svelte.d.ts +15 -0
  55. package/dist/components/admin/fields/SlugField.svelte.d.ts.map +1 -0
  56. package/dist/components/admin/fields/StringField.svelte.d.ts +14 -0
  57. package/dist/components/admin/fields/StringField.svelte.d.ts.map +1 -0
  58. package/dist/components/admin/fields/TextareaField.svelte.d.ts +14 -0
  59. package/dist/components/admin/fields/TextareaField.svelte.d.ts.map +1 -0
  60. package/dist/components/fields/index.d.ts +9 -0
  61. package/dist/components/fields/index.d.ts.map +1 -0
  62. package/dist/components/index.d.ts +7 -0
  63. package/dist/components/index.d.ts.map +1 -0
  64. package/{src/components/index.ts → dist/components/index.js} +0 -4
  65. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts +11 -0
  66. package/dist/components/layout/OrganizationSwitcher.svelte.d.ts.map +1 -0
  67. package/{src → dist}/components/layout/Sidebar.svelte +7 -7
  68. package/dist/components/layout/Sidebar.svelte.d.ts +14 -0
  69. package/dist/components/layout/Sidebar.svelte.d.ts.map +1 -0
  70. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts +11 -0
  71. package/dist/components/layout/sidebar/AppSidebar.svelte.d.ts.map +1 -0
  72. package/dist/components/layout/sidebar/NavMain.svelte.d.ts +19 -0
  73. package/dist/components/layout/sidebar/NavMain.svelte.d.ts.map +1 -0
  74. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts +9 -0
  75. package/dist/components/layout/sidebar/NavSecondary.svelte.d.ts.map +1 -0
  76. package/dist/components/layout/sidebar/NavUser.svelte.d.ts +9 -0
  77. package/dist/components/layout/sidebar/NavUser.svelte.d.ts.map +1 -0
  78. package/dist/config.d.ts +3 -0
  79. package/dist/config.d.ts.map +1 -0
  80. package/dist/config.js +15 -0
  81. package/dist/db/adapters/index.d.ts +1 -0
  82. package/dist/db/adapters/index.d.ts.map +1 -0
  83. package/{src/db/adapters/index.ts → dist/db/adapters/index.js} +1 -0
  84. package/dist/db/index.d.ts +2 -0
  85. package/dist/db/index.d.ts.map +1 -0
  86. package/{src/db/index.ts → dist/db/index.js} +0 -1
  87. package/dist/db/interfaces/asset.d.ts +51 -0
  88. package/dist/db/interfaces/asset.d.ts.map +1 -0
  89. package/dist/db/interfaces/asset.js +1 -0
  90. package/dist/db/interfaces/document.d.ts +36 -0
  91. package/dist/db/interfaces/document.d.ts.map +1 -0
  92. package/dist/db/interfaces/document.js +1 -0
  93. package/dist/db/interfaces/index.d.ts +73 -0
  94. package/dist/db/interfaces/index.d.ts.map +1 -0
  95. package/dist/db/interfaces/index.js +1 -0
  96. package/dist/db/interfaces/organization.d.ts +27 -0
  97. package/dist/db/interfaces/organization.d.ts.map +1 -0
  98. package/dist/db/interfaces/organization.js +1 -0
  99. package/dist/db/interfaces/schema.d.ts +21 -0
  100. package/dist/db/interfaces/schema.d.ts.map +1 -0
  101. package/dist/db/interfaces/schema.js +1 -0
  102. package/dist/db/interfaces/user.d.ts +15 -0
  103. package/dist/db/interfaces/user.d.ts.map +1 -0
  104. package/dist/db/interfaces/user.js +1 -0
  105. package/dist/db/utils/reference-resolver.d.ts +18 -0
  106. package/dist/db/utils/reference-resolver.d.ts.map +1 -0
  107. package/dist/db/utils/reference-resolver.js +80 -0
  108. package/dist/define.d.ts +3 -0
  109. package/dist/define.d.ts.map +1 -0
  110. package/dist/define.js +4 -0
  111. package/dist/email/index.d.ts +2 -0
  112. package/dist/email/index.d.ts.map +1 -0
  113. package/{src/email/index.ts → dist/email/index.js} +0 -1
  114. package/dist/email/interfaces/email.d.ts +42 -0
  115. package/dist/email/interfaces/email.d.ts.map +1 -0
  116. package/dist/email/interfaces/email.js +1 -0
  117. package/dist/engine.d.ts +26 -0
  118. package/dist/engine.d.ts.map +1 -0
  119. package/dist/engine.js +66 -0
  120. package/dist/field-validation/rule.d.ts +51 -0
  121. package/dist/field-validation/rule.d.ts.map +1 -0
  122. package/dist/field-validation/rule.js +221 -0
  123. package/dist/field-validation/utils.d.ts +21 -0
  124. package/dist/field-validation/utils.d.ts.map +1 -0
  125. package/dist/field-validation/utils.js +66 -0
  126. package/dist/hooks.d.ts +23 -0
  127. package/dist/hooks.d.ts.map +1 -0
  128. package/dist/hooks.js +96 -0
  129. package/dist/index.d.ts +2 -0
  130. package/dist/index.d.ts.map +1 -0
  131. package/{src/index.ts → dist/index.js} +0 -1
  132. package/dist/routes/assets-by-id.d.ts +5 -0
  133. package/dist/routes/assets-by-id.d.ts.map +1 -0
  134. package/dist/routes/assets-by-id.js +138 -0
  135. package/dist/routes/assets-cdn.d.ts +3 -0
  136. package/dist/routes/assets-cdn.d.ts.map +1 -0
  137. package/dist/routes/assets-cdn.js +155 -0
  138. package/dist/routes/assets.d.ts +4 -0
  139. package/dist/routes/assets.d.ts.map +1 -0
  140. package/dist/routes/assets.js +94 -0
  141. package/dist/routes/documents-by-id.d.ts +5 -0
  142. package/dist/routes/documents-by-id.d.ts.map +1 -0
  143. package/dist/routes/documents-by-id.js +142 -0
  144. package/dist/routes/documents-publish.d.ts +4 -0
  145. package/dist/routes/documents-publish.d.ts.map +1 -0
  146. package/dist/routes/documents-publish.js +151 -0
  147. package/dist/routes/documents.d.ts +4 -0
  148. package/dist/routes/documents.d.ts.map +1 -0
  149. package/dist/routes/documents.js +131 -0
  150. package/dist/routes/index.d.ts +6 -0
  151. package/dist/routes/index.d.ts.map +1 -0
  152. package/{src/routes/index.ts → dist/routes/index.js} +0 -3
  153. package/dist/routes/organizations-by-id.d.ts +5 -0
  154. package/dist/routes/organizations-by-id.d.ts.map +1 -0
  155. package/dist/routes/organizations-by-id.js +187 -0
  156. package/dist/routes/organizations-invitations.d.ts +4 -0
  157. package/dist/routes/organizations-invitations.d.ts.map +1 -0
  158. package/dist/routes/organizations-invitations.js +125 -0
  159. package/dist/routes/organizations-members.d.ts +5 -0
  160. package/dist/routes/organizations-members.d.ts.map +1 -0
  161. package/dist/routes/organizations-members.js +206 -0
  162. package/dist/routes/organizations-switch.d.ts +3 -0
  163. package/dist/routes/organizations-switch.d.ts.map +1 -0
  164. package/dist/routes/organizations-switch.js +53 -0
  165. package/dist/routes/organizations.d.ts +4 -0
  166. package/dist/routes/organizations.d.ts.map +1 -0
  167. package/dist/routes/organizations.js +108 -0
  168. package/dist/routes/schemas-by-type.d.ts +3 -0
  169. package/dist/routes/schemas-by-type.d.ts.map +1 -0
  170. package/dist/routes/schemas-by-type.js +25 -0
  171. package/dist/routes/schemas.d.ts +3 -0
  172. package/dist/routes/schemas.d.ts.map +1 -0
  173. package/dist/routes/schemas.js +11 -0
  174. package/dist/routes-exports.d.ts +14 -0
  175. package/dist/routes-exports.d.ts.map +1 -0
  176. package/{src/routes-exports.ts → dist/routes-exports.js} +5 -28
  177. package/dist/schema-context.svelte.d.ts +10 -0
  178. package/dist/schema-context.svelte.d.ts.map +1 -0
  179. package/dist/schema-context.svelte.js +18 -0
  180. package/dist/schema-utils/cleanup.d.ts +21 -0
  181. package/dist/schema-utils/cleanup.d.ts.map +1 -0
  182. package/dist/schema-utils/cleanup.js +80 -0
  183. package/dist/schema-utils/index.d.ts +4 -0
  184. package/dist/schema-utils/index.d.ts.map +1 -0
  185. package/dist/schema-utils/utils.d.ts +30 -0
  186. package/dist/schema-utils/utils.d.ts.map +1 -0
  187. package/dist/schema-utils/utils.js +37 -0
  188. package/dist/schema-utils/validator.d.ts +6 -0
  189. package/dist/schema-utils/validator.d.ts.map +1 -0
  190. package/dist/schema-utils/validator.js +45 -0
  191. package/dist/server/index.d.ts +16 -0
  192. package/dist/server/index.d.ts.map +1 -0
  193. package/{src/server/index.ts → dist/server/index.js} +2 -14
  194. package/dist/services/asset-service.d.ts +86 -0
  195. package/dist/services/asset-service.d.ts.map +1 -0
  196. package/dist/services/asset-service.js +187 -0
  197. package/{src/services/index.ts → dist/services/index.d.ts} +1 -4
  198. package/dist/services/index.d.ts.map +1 -0
  199. package/dist/services/index.js +4 -0
  200. package/dist/storage/adapters/index.d.ts +2 -0
  201. package/dist/storage/adapters/index.d.ts.map +1 -0
  202. package/dist/storage/adapters/local-storage-adapter.d.ts +54 -0
  203. package/dist/storage/adapters/local-storage-adapter.d.ts.map +1 -0
  204. package/dist/storage/adapters/local-storage-adapter.js +187 -0
  205. package/dist/storage/index.d.ts +3 -0
  206. package/dist/storage/index.d.ts.map +1 -0
  207. package/{src/storage/index.ts → dist/storage/index.js} +0 -2
  208. package/dist/storage/interfaces/index.d.ts +2 -0
  209. package/dist/storage/interfaces/index.d.ts.map +1 -0
  210. package/dist/storage/interfaces/storage.d.ts +91 -0
  211. package/dist/storage/interfaces/storage.d.ts.map +1 -0
  212. package/dist/storage/interfaces/storage.js +1 -0
  213. package/dist/storage/providers/storage.d.ts +43 -0
  214. package/dist/storage/providers/storage.d.ts.map +1 -0
  215. package/dist/storage/providers/storage.js +64 -0
  216. package/dist/types/asset.d.ts +73 -0
  217. package/dist/types/asset.d.ts.map +1 -0
  218. package/dist/types/asset.js +2 -0
  219. package/dist/types/auth.d.ts +50 -0
  220. package/dist/types/auth.d.ts.map +1 -0
  221. package/dist/types/auth.js +41 -0
  222. package/dist/types/config.d.ts +47 -0
  223. package/dist/types/config.d.ts.map +1 -0
  224. package/dist/types/config.js +1 -0
  225. package/dist/types/document.d.ts +34 -0
  226. package/dist/types/document.d.ts.map +1 -0
  227. package/dist/types/document.js +1 -0
  228. package/dist/types/index.d.ts +9 -0
  229. package/dist/types/index.d.ts.map +1 -0
  230. package/dist/types/organization.d.ts +105 -0
  231. package/dist/types/organization.d.ts.map +1 -0
  232. package/dist/types/organization.js +3 -0
  233. package/dist/types/schemas.d.ts +114 -0
  234. package/dist/types/schemas.d.ts.map +1 -0
  235. package/dist/types/schemas.js +1 -0
  236. package/dist/types/sidebar.d.ts +33 -0
  237. package/dist/types/sidebar.d.ts.map +1 -0
  238. package/dist/types/sidebar.js +1 -0
  239. package/dist/types/user.d.ts +14 -0
  240. package/dist/types/user.d.ts.map +1 -0
  241. package/dist/types/user.js +1 -0
  242. package/dist/utils/content-hash.d.ts +22 -0
  243. package/dist/utils/content-hash.d.ts.map +1 -0
  244. package/dist/utils/content-hash.js +67 -0
  245. package/dist/utils/image-url.d.ts +88 -0
  246. package/dist/utils/image-url.d.ts.map +1 -0
  247. package/dist/utils/image-url.js +165 -0
  248. package/dist/utils/index.d.ts +6 -0
  249. package/dist/utils/index.d.ts.map +1 -0
  250. package/{src/utils/index.ts → dist/utils/index.js} +0 -3
  251. package/dist/utils/slug.d.ts +13 -0
  252. package/dist/utils/slug.d.ts.map +1 -0
  253. package/dist/utils/slug.js +30 -0
  254. package/package.json +12 -25
  255. package/src/api/assets.ts +0 -75
  256. package/src/api/client.ts +0 -150
  257. package/src/api/documents.ts +0 -102
  258. package/src/api/organizations.ts +0 -154
  259. package/src/api/types.ts +0 -34
  260. package/src/auth/auth-errors.ts +0 -23
  261. package/src/auth/auth-hooks.ts +0 -132
  262. package/src/auth/provider.ts +0 -25
  263. package/src/config.ts +0 -18
  264. package/src/db/interfaces/asset.ts +0 -61
  265. package/src/db/interfaces/document.ts +0 -53
  266. package/src/db/interfaces/index.ts +0 -98
  267. package/src/db/interfaces/organization.ts +0 -51
  268. package/src/db/interfaces/schema.ts +0 -13
  269. package/src/db/interfaces/user.ts +0 -16
  270. package/src/db/utils/reference-resolver.ts +0 -119
  271. package/src/define.ts +0 -7
  272. package/src/email/interfaces/email.ts +0 -45
  273. package/src/engine.ts +0 -85
  274. package/src/field-validation/rule.ts +0 -287
  275. package/src/field-validation/utils.ts +0 -91
  276. package/src/hooks.ts +0 -142
  277. package/src/lib/is-mobile.svelte.ts +0 -9
  278. package/src/lib/utils.ts +0 -13
  279. package/src/routes/assets-by-id.ts +0 -161
  280. package/src/routes/assets-cdn.ts +0 -185
  281. package/src/routes/assets.ts +0 -116
  282. package/src/routes/documents-by-id.ts +0 -188
  283. package/src/routes/documents-publish.ts +0 -211
  284. package/src/routes/documents.ts +0 -172
  285. package/src/routes/organizations-by-id.ts +0 -258
  286. package/src/routes/organizations-invitations.ts +0 -183
  287. package/src/routes/organizations-members.ts +0 -301
  288. package/src/routes/organizations-switch.ts +0 -74
  289. package/src/routes/organizations.ts +0 -146
  290. package/src/routes/schemas-by-type.ts +0 -35
  291. package/src/routes/schemas.ts +0 -19
  292. package/src/schema-context.svelte.ts +0 -24
  293. package/src/schema-utils/cleanup.ts +0 -116
  294. package/src/schema-utils/utils.ts +0 -47
  295. package/src/schema-utils/validator.ts +0 -58
  296. package/src/services/asset-service.ts +0 -256
  297. package/src/storage/adapters/local-storage-adapter.ts +0 -215
  298. package/src/storage/interfaces/storage.ts +0 -114
  299. package/src/storage/providers/storage.ts +0 -83
  300. package/src/types/asset.ts +0 -81
  301. package/src/types/auth.ts +0 -80
  302. package/src/types/config.ts +0 -45
  303. package/src/types/document.ts +0 -38
  304. package/src/types/organization.ts +0 -119
  305. package/src/types/schemas.ts +0 -151
  306. package/src/types/sidebar.ts +0 -37
  307. package/src/types/user.ts +0 -17
  308. package/src/utils/content-hash.ts +0 -75
  309. package/src/utils/image-url.ts +0 -204
  310. package/src/utils/slug.ts +0 -33
  311. /package/{src → dist}/app.d.ts +0 -0
  312. /package/{src → dist}/auth/MULTI_TENANCY_PLAN.md +0 -0
  313. /package/{src → dist}/components/admin/AdminLayout.svelte +0 -0
  314. /package/{src → dist}/components/admin/DocumentEditor.svelte +0 -0
  315. /package/{src → dist}/components/admin/DocumentTypesList.svelte +0 -0
  316. /package/{src → dist}/components/admin/ObjectModal.svelte +0 -0
  317. /package/{src → dist}/components/admin/SchemaField.svelte +0 -0
  318. /package/{src → dist}/components/admin/fields/ArrayField.svelte +0 -0
  319. /package/{src → dist}/components/admin/fields/BooleanField.svelte +0 -0
  320. /package/{src → dist}/components/admin/fields/ImageField.svelte +0 -0
  321. /package/{src → dist}/components/admin/fields/NumberField.svelte +0 -0
  322. /package/{src → dist}/components/admin/fields/ReferenceField.svelte +0 -0
  323. /package/{src → dist}/components/admin/fields/SlugField.svelte +0 -0
  324. /package/{src → dist}/components/admin/fields/StringField.svelte +0 -0
  325. /package/{src → dist}/components/admin/fields/TextareaField.svelte +0 -0
  326. /package/{src/components/fields/index.ts → dist/components/fields/index.js} +0 -0
  327. /package/{src → dist}/components/layout/OrganizationSwitcher.svelte +0 -0
  328. /package/{src → dist}/components/layout/sidebar/AppSidebar.svelte +0 -0
  329. /package/{src → dist}/components/layout/sidebar/NavMain.svelte +0 -0
  330. /package/{src → dist}/components/layout/sidebar/NavSecondary.svelte +0 -0
  331. /package/{src → dist}/components/layout/sidebar/NavUser.svelte +0 -0
  332. /package/{src → dist}/plugins/README.md +0 -0
  333. /package/{src/schema-utils/index.ts → dist/schema-utils/index.js} +0 -0
  334. /package/{src/storage/adapters/index.ts → dist/storage/adapters/index.js} +0 -0
  335. /package/{src/storage/interfaces/index.ts → dist/storage/interfaces/index.js} +0 -0
  336. /package/{src/types/index.ts → dist/types/index.js} +0 -0
@@ -1,75 +0,0 @@
1
- /**
2
- * Content hashing utilities for document version tracking
3
- * Includes timestamp for proper change detection and UX
4
- */
5
-
6
- /**
7
- * Recursively sort object keys for stable JSON serialization
8
- */
9
- function sortObject(item: any): any {
10
- if (item === null || typeof item !== 'object') return item;
11
-
12
- if (Array.isArray(item)) {
13
- return item.map(sortObject);
14
- }
15
-
16
- const sortedKeys = Object.keys(item).sort();
17
- const sortedObj: any = {};
18
- for (const key of sortedKeys) {
19
- sortedObj[key] = sortObject(item[key]);
20
- }
21
- return sortedObj;
22
- }
23
-
24
- /**
25
- * Create a stable hash from any object using a simple hash algorithm
26
- */
27
- function simpleHash(str: string): string {
28
- let hash = 0;
29
- for (let i = 0; i < str.length; i++) {
30
- const char = str.charCodeAt(i);
31
- hash = (hash << 5) - hash + char;
32
- hash = hash & hash; // Convert to 32-bit integer
33
- }
34
- return Math.abs(hash).toString(36); // Base36 for shorter string
35
- }
36
-
37
- /**
38
- * Create a content hash including timestamp for change tracking
39
- * This matches Sanity's behavior where any interaction creates a publishable state
40
- */
41
- export function createContentHash(data: any, includeTimestamp = true): string {
42
- const hashData = includeTimestamp
43
- ? {
44
- ...data,
45
- _lastModified: new Date().toISOString()
46
- }
47
- : data;
48
-
49
- const stableJson = JSON.stringify(sortObject(hashData));
50
- return simpleHash(stableJson);
51
- }
52
-
53
- /**
54
- * Create a hash from published data (no timestamp needed as it's already stable)
55
- */
56
- export function createPublishedHash(data: any): string {
57
- return createContentHash(data, false);
58
- }
59
-
60
- /**
61
- * Compare if current draft differs from published version
62
- */
63
- export function hasUnpublishedChanges(draftData: any, publishedHash: string | null): boolean {
64
- if (!publishedHash) return true; // No published version = has changes
65
-
66
- const publishedDataHash = createPublishedHash(draftData);
67
- return publishedDataHash !== publishedHash;
68
- }
69
-
70
- /**
71
- * Utility to create a clean published hash when publishing
72
- */
73
- export function createHashForPublishing(draftData: any): string {
74
- return createPublishedHash(draftData);
75
- }
@@ -1,204 +0,0 @@
1
- import type { ImageValue, ImageAsset, Asset } from '../types/asset.js';
2
-
3
- export interface ImageUrlBuilderOptions {
4
- width?: number;
5
- height?: number;
6
- quality?: number;
7
- format?: 'jpg' | 'jpeg' | 'png' | 'webp' | 'avif';
8
- fit?: 'cover' | 'contain' | 'fill' | 'inside' | 'outside';
9
- auto?: 'format';
10
- }
11
-
12
- export interface ImageUrlBuilderConfig {
13
- baseUrl?: string;
14
- /**
15
- * Function to sign asset URLs for secure, time-limited access
16
- * Used for multi-tenant access without exposing API keys
17
- */
18
- signAssetUrl?: (assetId: string) => string;
19
- }
20
-
21
- /**
22
- * Helper to extract URL from various image source types
23
- * Works with GraphQL responses that include resolved asset data
24
- */
25
- function extractUrl(source: any): string | null {
26
- if (!source) return null;
27
-
28
- // Direct URL string
29
- if (typeof source === 'string') {
30
- return source;
31
- }
32
-
33
- // Asset object with url property
34
- if (typeof source === 'object' && 'url' in source && source.url) {
35
- return source.url;
36
- }
37
-
38
- // ImageValue with resolved asset (from GraphQL)
39
- if (typeof source === 'object' && 'asset' in source && source.asset) {
40
- // Check if asset is resolved (has url property)
41
- if (typeof source.asset === 'object' && 'url' in source.asset) {
42
- return source.asset.url;
43
- }
44
- }
45
-
46
- return null;
47
- }
48
-
49
- export class ImageUrlBuilder {
50
- private _source: any = null;
51
- private _options: ImageUrlBuilderOptions = {};
52
-
53
- /**
54
- * Set the image source
55
- */
56
- image(source: ImageValue | ImageAsset | string | Asset | null | undefined): this {
57
- this._source = source;
58
- return this;
59
- }
60
-
61
- /**
62
- * Set width (for future dynamic image rendering)
63
- */
64
- width(width: number): this {
65
- this._options.width = width;
66
- return this;
67
- }
68
-
69
- /**
70
- * Set height (for future dynamic image rendering)
71
- */
72
- height(height: number): this {
73
- this._options.height = height;
74
- return this;
75
- }
76
-
77
- /**
78
- * Set both width and height (for future dynamic image rendering)
79
- */
80
- size(width: number, height: number): this {
81
- this._options.width = width;
82
- this._options.height = height;
83
- return this;
84
- }
85
-
86
- /**
87
- * Set quality (for future dynamic image rendering)
88
- */
89
- quality(quality: number): this {
90
- this._options.quality = Math.max(1, Math.min(100, quality));
91
- return this;
92
- }
93
-
94
- /**
95
- * Set format (for future dynamic image rendering)
96
- */
97
- format(format: 'jpg' | 'jpeg' | 'png' | 'webp' | 'avif'): this {
98
- this._options.format = format;
99
- return this;
100
- }
101
-
102
- /**
103
- * Set fit mode (for future dynamic image rendering)
104
- */
105
- fit(fit: 'cover' | 'contain' | 'fill' | 'inside' | 'outside'): this {
106
- this._options.fit = fit;
107
- return this;
108
- }
109
-
110
- /**
111
- * Enable automatic format selection (for future dynamic image rendering)
112
- */
113
- auto(mode: 'format'): this {
114
- this._options.auto = mode;
115
- return this;
116
- }
117
-
118
- /**
119
- * Build the final URL
120
- * Returns /api/assets/{id}?dl=1 which redirects to the actual S3/R2 URL
121
- * Transformations (.width(), .quality(), etc) are stored but not yet applied
122
- *
123
- * For multi-tenant access, use signAssetUrl config to generate signed URLs
124
- * TODO: Add dynamic image rendering support
125
- */
126
- url(): string | null {
127
- console.log('[ImageUrlBuilder] url() called with source:', JSON.stringify(this._source));
128
-
129
- if (!this._source) {
130
- console.log('[ImageUrlBuilder] No source provided');
131
- return null;
132
- }
133
-
134
- // First try to extract a direct URL (if asset was already resolved)
135
- const directUrl = extractUrl(this._source);
136
- if (directUrl) {
137
- console.log('[ImageUrlBuilder] Using direct URL from resolved asset:', directUrl);
138
- return directUrl;
139
- }
140
-
141
- // Otherwise, build an API URL from the asset reference
142
- let assetId: string | null = null;
143
-
144
- if (typeof this._source === 'string') {
145
- console.log('[ImageUrlBuilder] Source is string:', this._source);
146
- assetId = this._source;
147
- } else if (typeof this._source === 'object') {
148
- console.log('[ImageUrlBuilder] Source is object, checking for asset._ref or _ref');
149
- if ('asset' in this._source && this._source.asset?._ref) {
150
- assetId = this._source.asset._ref;
151
- console.log('[ImageUrlBuilder] Found asset._ref:', assetId);
152
- } else if ('_ref' in this._source) {
153
- assetId = this._source._ref;
154
- console.log('[ImageUrlBuilder] Found _ref:', assetId);
155
- }
156
- }
157
-
158
- if (!assetId) {
159
- console.warn('[ImageUrlBuilder] Could not extract asset ID from source:', this._source);
160
- return null;
161
- }
162
-
163
- const finalUrl = `/media/${assetId}/image`;
164
- console.log('[ImageUrlBuilder] Building CDN URL:', finalUrl);
165
- return finalUrl;
166
- }
167
-
168
- /**
169
- * Alias for url()
170
- */
171
- toString(): string | null {
172
- return this.url();
173
- }
174
- }
175
-
176
- /**
177
- * Factory function to create an image URL builder
178
- *
179
- * Note: Currently returns direct S3/R2 URLs without transformations.
180
- * The baseUrl parameter is accepted for future compatibility but not currently used
181
- * since assets already contain their full public URLs.
182
- *
183
- * For multi-tenant access with API keys, provide a signAssetUrl function:
184
- * const urlFor = imageUrlBuilder({
185
- * signAssetUrl: (assetId) => `/api/assets/${assetId}?token=${generateToken(assetId)}`
186
- * })
187
- *
188
- * Usage:
189
- * const urlFor = imageUrlBuilder({ baseUrl: 'https://yourdomain.com' })
190
- * const url = urlFor(image).url() // Returns asset.url directly
191
- *
192
- * Future usage with transformations:
193
- * const url = urlFor(image).width(800).quality(80).url()
194
- * // Will return transformed image once dynamic rendering is implemented
195
- */
196
- export function imageUrlBuilder() {
197
- return (source?: ImageValue | ImageAsset | string | Asset | null) => {
198
- const builder = new ImageUrlBuilder();
199
- if (source) {
200
- builder.image(source);
201
- }
202
- return builder;
203
- };
204
- }
package/src/utils/slug.ts DELETED
@@ -1,33 +0,0 @@
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: string): string {
7
- if (!text) return '';
8
-
9
- return (
10
- text
11
- .toString()
12
- .toLowerCase()
13
- .trim()
14
- // Replace spaces and multiple special characters with single hyphens
15
- .replace(/[^a-z0-9]+/g, '-')
16
- // Remove leading and trailing hyphens
17
- .replace(/^-+|-+$/g, '')
18
- );
19
- }
20
-
21
- /**
22
- * Validate if a string is a valid slug
23
- * @param slug - The slug to validate
24
- * @returns Boolean indicating if the slug is valid
25
- */
26
- export function isValidSlug(slug: string): boolean {
27
- if (!slug) return false;
28
-
29
- // Valid slug: lowercase letters, numbers, and hyphens only
30
- // Cannot start or end with hyphen
31
- const slugPattern = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
32
- return slugPattern.test(slug);
33
- }
File without changes
File without changes
File without changes
File without changes