@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
@@ -0,0 +1,2 @@
1
+ export * from './interfaces/email.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/email/index.ts"],"names":[],"mappings":"AAIA,cAAc,uBAAuB,CAAC"}
@@ -1,5 +1,4 @@
1
1
  // Aphex CMS Email Layer
2
2
  // Ports and adapters for email sending operations
3
-
4
3
  // Interfaces
5
4
  export * from './interfaces/email.js';
@@ -0,0 +1,42 @@
1
+ export interface EmailAddress {
2
+ email: string;
3
+ name?: string;
4
+ }
5
+ export interface SendEmailOptions {
6
+ from: string;
7
+ to: string | string[];
8
+ subject: string;
9
+ html?: string;
10
+ text?: string;
11
+ cc?: string | string[];
12
+ bcc?: string | string[];
13
+ replyTo?: string;
14
+ tags?: Array<{
15
+ name: string;
16
+ value: string;
17
+ }>;
18
+ attachments?: Array<{
19
+ filename: string;
20
+ content: Buffer | string;
21
+ }>;
22
+ }
23
+ export interface SendEmailResult {
24
+ id: string;
25
+ error?: string;
26
+ }
27
+ export interface EmailAdapter {
28
+ readonly name: string;
29
+ send(options: SendEmailOptions): Promise<SendEmailResult>;
30
+ sendBatch?(emails: SendEmailOptions[]): Promise<SendEmailResult[]>;
31
+ }
32
+ export interface EmailProvider {
33
+ name: string;
34
+ createAdapter(config: EmailConfig): EmailAdapter;
35
+ }
36
+ export interface EmailConfig {
37
+ apiKey?: string;
38
+ options?: {
39
+ [key: string]: any;
40
+ };
41
+ }
42
+ //# sourceMappingURL=email.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../../src/lib/email/interfaces/email.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9C,WAAW,CAAC,EAAE,KAAK,CAAC;QACnB,QAAQ,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;KACzB,CAAC,CAAC;CACH;AAED,MAAM,WAAW,eAAe;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAEtB,IAAI,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAE1D,SAAS,CAAC,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,CAAC;CACjD;AAED,MAAM,WAAW,WAAW;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE;QACT,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACnB,CAAC;CACF"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,26 @@
1
+ import type { CMSConfig } from './types/config.js';
2
+ import type { SchemaType } from './types/schemas.js';
3
+ import type { DatabaseAdapter } from './db/interfaces/index.js';
4
+ export declare class CMSEngine {
5
+ private db;
6
+ config: CMSConfig;
7
+ constructor(config: CMSConfig, dbAdapter: DatabaseAdapter);
8
+ updateConfig(newConfig: CMSConfig): void;
9
+ initialize(): Promise<void>;
10
+ getSchemaType(name: string): Promise<SchemaType | null>;
11
+ listSchemas(): Promise<SchemaType[]>;
12
+ getSchemaTypeByName(name: string): SchemaType | null;
13
+ listDocumentTypes(): Promise<Array<{
14
+ name: string;
15
+ title: string;
16
+ description?: string;
17
+ }>>;
18
+ listObjectTypes(): Promise<Array<{
19
+ name: string;
20
+ title: string;
21
+ description?: string;
22
+ }>>;
23
+ }
24
+ export declare function createCMS(config: CMSConfig, dbAdapter: DatabaseAdapter): CMSEngine;
25
+ export declare function getCMS(): CMSEngine;
26
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/lib/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEhE,qBAAa,SAAS;IACrB,OAAO,CAAC,EAAE,CAAkB;IACrB,MAAM,EAAE,SAAS,CAAC;gBAEb,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe;IAMzD,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,IAAI;IAUlC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAIvD,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAI1C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAI9C,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAI1F,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAG9F;AAKD,wBAAgB,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,eAAe,GAAG,SAAS,CAKlF;AAED,wBAAgB,MAAM,IAAI,SAAS,CAKlC"}
package/dist/engine.js ADDED
@@ -0,0 +1,66 @@
1
+ export class CMSEngine {
2
+ db;
3
+ config;
4
+ constructor(config, dbAdapter) {
5
+ this.config = config;
6
+ this.db = dbAdapter;
7
+ }
8
+ // Update config dynamically (for schema hot-reloading)
9
+ updateConfig(newConfig) {
10
+ this.config = newConfig;
11
+ console.log('🔄 CMS config updated:', {
12
+ schemaTypes: newConfig.schemaTypes.length,
13
+ documents: newConfig.schemaTypes.filter((t) => t.type === 'document').length,
14
+ objects: newConfig.schemaTypes.filter((t) => t.type === 'object').length
15
+ });
16
+ }
17
+ // Initialize CMS - register schema types in database
18
+ async initialize() {
19
+ console.log('🚀 Initializing CMS...');
20
+ // Get existing schemas from database
21
+ const existingSchemas = await this.db.listSchemas();
22
+ const existingNames = new Set(existingSchemas.map((s) => s.name));
23
+ const currentNames = new Set(this.config.schemaTypes.map((s) => s.name));
24
+ // Delete schemas that are no longer in config
25
+ for (const existingName of existingNames) {
26
+ if (!currentNames.has(existingName)) {
27
+ await this.db.deleteSchemaType(existingName);
28
+ }
29
+ }
30
+ // Register all schema types (updates if exists, creates if new)
31
+ for (const schemaType of this.config.schemaTypes) {
32
+ await this.db.registerSchemaType(schemaType);
33
+ }
34
+ console.log('✅ CMS initialized successfully');
35
+ }
36
+ // Schema Type utility methods
37
+ async getSchemaType(name) {
38
+ return this.db.getSchemaType(name);
39
+ }
40
+ async listSchemas() {
41
+ return this.db.listSchemas();
42
+ }
43
+ getSchemaTypeByName(name) {
44
+ return this.config.schemaTypes.find((s) => s.name === name) || null;
45
+ }
46
+ async listDocumentTypes() {
47
+ return this.db.listDocumentTypes();
48
+ }
49
+ async listObjectTypes() {
50
+ return this.db.listObjectTypes();
51
+ }
52
+ }
53
+ // Global CMS instance
54
+ let cmsInstance = null;
55
+ export function createCMS(config, dbAdapter) {
56
+ if (!cmsInstance) {
57
+ cmsInstance = new CMSEngine(config, dbAdapter);
58
+ }
59
+ return cmsInstance;
60
+ }
61
+ export function getCMS() {
62
+ if (!cmsInstance) {
63
+ throw new Error('CMS not initialized. Call createCMS() first.');
64
+ }
65
+ return cmsInstance;
66
+ }
@@ -0,0 +1,51 @@
1
+ export interface ValidationMarker {
2
+ level: 'error' | 'warning' | 'info';
3
+ message: string;
4
+ path?: string[];
5
+ }
6
+ export interface ValidationContext {
7
+ document?: any;
8
+ parent?: any;
9
+ path?: string[];
10
+ }
11
+ export interface CustomValidator<T = unknown> {
12
+ (value: T, context: ValidationContext): ValidationMarker[] | string | boolean | Promise<ValidationMarker[] | string | boolean>;
13
+ }
14
+ export interface FieldReference {
15
+ __fieldReference: true;
16
+ path: string | string[];
17
+ }
18
+ export declare class Rule {
19
+ private _required;
20
+ private _rules;
21
+ private _level;
22
+ private _message?;
23
+ static FIELD_REF: symbol;
24
+ static valueOfField(path: string | string[]): FieldReference;
25
+ valueOfField(path: string | string[]): FieldReference;
26
+ required(): Rule;
27
+ optional(): Rule;
28
+ min(len: number | string | FieldReference): Rule;
29
+ max(len: number | string | FieldReference): Rule;
30
+ length(len: number | FieldReference): Rule;
31
+ email(): Rule;
32
+ uri(options?: {
33
+ scheme?: RegExp[];
34
+ allowRelative?: boolean;
35
+ }): Rule;
36
+ regex(pattern: RegExp, name?: string): Rule;
37
+ positive(): Rule;
38
+ negative(): Rule;
39
+ integer(): Rule;
40
+ greaterThan(num: number | FieldReference): Rule;
41
+ lessThan(num: number | FieldReference): Rule;
42
+ custom<T = unknown>(fn: CustomValidator<T>): Rule;
43
+ error(message?: string): Rule;
44
+ warning(message?: string): Rule;
45
+ info(message?: string): Rule;
46
+ clone(): Rule;
47
+ validate(value: unknown, context?: ValidationContext): Promise<ValidationMarker[]>;
48
+ private validateRule;
49
+ isRequired(): boolean;
50
+ }
51
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/rule.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,gBAAgB;IAChC,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAEjC,QAAQ,CAAC,EAAE,GAAG,CAAC;IAEf,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CAChB;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC3C,CACC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,iBAAiB,GACxB,gBAAgB,EAAE,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,gBAAgB,EAAE,GAAG,MAAM,GAAG,OAAO,CAAC,CAAC;CAC1F;AAED,MAAM,WAAW,cAAc;IAC9B,gBAAgB,EAAE,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CACxB;AAED,qBAAa,IAAI;IAChB,OAAO,CAAC,SAAS,CAAkB;IAEnC,OAAO,CAAC,MAAM,CAAmE;IACjF,OAAO,CAAC,MAAM,CAAyC;IACvD,OAAO,CAAC,QAAQ,CAAC,CAAS;IAE1B,MAAM,CAAC,SAAS,SAA4B;IAE5C,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc;IAO5D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,cAAc;IAIrD,QAAQ,IAAI,IAAI;IAMhB,QAAQ,IAAI,IAAI;IAMhB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,IAAI;IAMhD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,cAAc,GAAG,IAAI;IAMhD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM1C,KAAK,IAAI,IAAI;IAMb,GAAG,CAAC,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI;IAMnE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3C,QAAQ,IAAI,IAAI;IAMhB,QAAQ,IAAI,IAAI;IAMhB,OAAO,IAAI,IAAI;IAMf,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM/C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAM5C,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI;IAMjD,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO7B,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO/B,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI;IAO5B,KAAK,IAAI,IAAI;IASP,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,iBAAsB,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC;YAwC9E,YAAY;IAkF1B,UAAU,IAAI,OAAO;CAGrB"}
@@ -0,0 +1,221 @@
1
+ export class Rule {
2
+ _required = false;
3
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
+ _rules = [];
5
+ _level = 'error';
6
+ _message;
7
+ static FIELD_REF = Symbol('fieldReference');
8
+ static valueOfField(path) {
9
+ return {
10
+ __fieldReference: true,
11
+ path
12
+ };
13
+ }
14
+ valueOfField(path) {
15
+ return Rule.valueOfField(path);
16
+ }
17
+ required() {
18
+ const newRule = this.clone();
19
+ newRule._required = true;
20
+ return newRule;
21
+ }
22
+ optional() {
23
+ const newRule = this.clone();
24
+ newRule._required = false;
25
+ return newRule;
26
+ }
27
+ min(len) {
28
+ const newRule = this.clone();
29
+ newRule._rules.push({ type: 'min', constraint: len });
30
+ return newRule;
31
+ }
32
+ max(len) {
33
+ const newRule = this.clone();
34
+ newRule._rules.push({ type: 'max', constraint: len });
35
+ return newRule;
36
+ }
37
+ length(len) {
38
+ const newRule = this.clone();
39
+ newRule._rules.push({ type: 'length', constraint: len });
40
+ return newRule;
41
+ }
42
+ email() {
43
+ const newRule = this.clone();
44
+ newRule._rules.push({ type: 'email' });
45
+ return newRule;
46
+ }
47
+ uri(options) {
48
+ const newRule = this.clone();
49
+ newRule._rules.push({ type: 'uri', constraint: options });
50
+ return newRule;
51
+ }
52
+ regex(pattern, name) {
53
+ const newRule = this.clone();
54
+ newRule._rules.push({ type: 'regex', constraint: { pattern, name } });
55
+ return newRule;
56
+ }
57
+ positive() {
58
+ const newRule = this.clone();
59
+ newRule._rules.push({ type: 'positive' });
60
+ return newRule;
61
+ }
62
+ negative() {
63
+ const newRule = this.clone();
64
+ newRule._rules.push({ type: 'negative' });
65
+ return newRule;
66
+ }
67
+ integer() {
68
+ const newRule = this.clone();
69
+ newRule._rules.push({ type: 'integer' });
70
+ return newRule;
71
+ }
72
+ greaterThan(num) {
73
+ const newRule = this.clone();
74
+ newRule._rules.push({ type: 'greaterThan', constraint: num });
75
+ return newRule;
76
+ }
77
+ lessThan(num) {
78
+ const newRule = this.clone();
79
+ newRule._rules.push({ type: 'lessThan', constraint: num });
80
+ return newRule;
81
+ }
82
+ custom(fn) {
83
+ const newRule = this.clone();
84
+ newRule._rules.push({ type: 'custom', constraint: fn });
85
+ return newRule;
86
+ }
87
+ error(message) {
88
+ const newRule = this.clone();
89
+ newRule._level = 'error';
90
+ newRule._message = message;
91
+ return newRule;
92
+ }
93
+ warning(message) {
94
+ const newRule = this.clone();
95
+ newRule._level = 'warning';
96
+ newRule._message = message;
97
+ return newRule;
98
+ }
99
+ info(message) {
100
+ const newRule = this.clone();
101
+ newRule._level = 'info';
102
+ newRule._message = message;
103
+ return newRule;
104
+ }
105
+ clone() {
106
+ const newRule = new Rule();
107
+ newRule._required = this._required;
108
+ newRule._rules = [...this._rules];
109
+ newRule._level = this._level;
110
+ newRule._message = this._message;
111
+ return newRule;
112
+ }
113
+ async validate(value, context = {}) {
114
+ const markers = [];
115
+ // Check required
116
+ if (this._required && (value === undefined || value === null || value === '')) {
117
+ markers.push({
118
+ level: this._level,
119
+ message: this._message || 'Required',
120
+ path: context.path
121
+ });
122
+ }
123
+ // If value is empty and not required, skip other validations
124
+ if (!this._required && (value === undefined || value === null || value === '')) {
125
+ return markers;
126
+ }
127
+ // Run other validations
128
+ for (const rule of this._rules) {
129
+ try {
130
+ const result = await this.validateRule(rule, value, context);
131
+ if (result) {
132
+ markers.push({
133
+ level: this._level,
134
+ message: this._message || result,
135
+ path: context.path
136
+ });
137
+ }
138
+ }
139
+ catch (error) {
140
+ markers.push({
141
+ level: 'error',
142
+ message: `Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`,
143
+ path: context.path
144
+ });
145
+ }
146
+ }
147
+ return markers;
148
+ }
149
+ async validateRule(rule, value, context) {
150
+ switch (rule.type) {
151
+ case 'min':
152
+ if (typeof value === 'string' && value.length < rule.constraint) {
153
+ return `Must be at least ${rule.constraint} characters`;
154
+ }
155
+ if (typeof value === 'number' && value < rule.constraint) {
156
+ return `Must be at least ${rule.constraint}`;
157
+ }
158
+ break;
159
+ case 'max':
160
+ if (typeof value === 'string' && value.length > rule.constraint) {
161
+ return `Must be at most ${rule.constraint} characters`;
162
+ }
163
+ if (typeof value === 'number' && value > rule.constraint) {
164
+ return `Must be at most ${rule.constraint}`;
165
+ }
166
+ break;
167
+ case 'email':
168
+ if (typeof value === 'string' && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
169
+ return 'Must be a valid email address';
170
+ }
171
+ break;
172
+ case 'uri':
173
+ if (typeof value === 'string') {
174
+ try {
175
+ new URL(value);
176
+ }
177
+ catch {
178
+ return 'Must be a valid URL';
179
+ }
180
+ }
181
+ break;
182
+ case 'regex':
183
+ if (typeof value === 'string' && !rule.constraint.pattern.test(value)) {
184
+ return `Must match pattern${rule.constraint.name ? ` (${rule.constraint.name})` : ''}`;
185
+ }
186
+ break;
187
+ case 'positive':
188
+ if (typeof value === 'number' && value <= 0) {
189
+ return 'Must be positive';
190
+ }
191
+ break;
192
+ case 'negative':
193
+ if (typeof value === 'number' && value >= 0) {
194
+ return 'Must be negative';
195
+ }
196
+ break;
197
+ case 'integer':
198
+ if (typeof value === 'number' && !Number.isInteger(value)) {
199
+ return 'Must be an integer';
200
+ }
201
+ break;
202
+ case 'custom': {
203
+ const customResult = await rule.constraint(value, context);
204
+ if (customResult === false) {
205
+ return 'Validation failed';
206
+ }
207
+ if (typeof customResult === 'string') {
208
+ return customResult;
209
+ }
210
+ if (Array.isArray(customResult) && customResult.length > 0) {
211
+ return customResult[0].message;
212
+ }
213
+ break;
214
+ }
215
+ }
216
+ return null;
217
+ }
218
+ isRequired() {
219
+ return this._required;
220
+ }
221
+ }
@@ -0,0 +1,21 @@
1
+ import type { Field } from '../types';
2
+ export interface ValidationError {
3
+ level: 'error' | 'warning' | 'info';
4
+ message: string;
5
+ }
6
+ /**
7
+ * Check if a field is required based on its validation rules
8
+ */
9
+ export declare function isFieldRequired(field: Field): boolean;
10
+ /**
11
+ * Validate a field value against its validation rules
12
+ */
13
+ export declare function validateField(field: Field, value: any, context?: any): Promise<{
14
+ isValid: boolean;
15
+ errors: ValidationError[];
16
+ }>;
17
+ /**
18
+ * Get validation CSS classes for input styling
19
+ */
20
+ export declare function getValidationClasses(hasErrors: boolean): string;
21
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/lib/field-validation/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAUrD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAClC,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,GAAQ,GACf,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,eAAe,EAAE,CAAC;CAC1B,CAAC,CA6CD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAO/D"}
@@ -0,0 +1,66 @@
1
+ import { Rule } from './rule.js';
2
+ /**
3
+ * Check if a field is required based on its validation rules
4
+ */
5
+ export function isFieldRequired(field) {
6
+ if (!field.validation)
7
+ return false;
8
+ try {
9
+ const validationFn = Array.isArray(field.validation) ? field.validation[0] : field.validation;
10
+ if (!validationFn)
11
+ return false;
12
+ const rule = validationFn(new Rule());
13
+ return rule.isRequired();
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ /**
20
+ * Validate a field value against its validation rules
21
+ */
22
+ export async function validateField(field, value, context = {}) {
23
+ if (!field.validation) {
24
+ return { isValid: true, errors: [] };
25
+ }
26
+ try {
27
+ const validationFunctions = Array.isArray(field.validation)
28
+ ? field.validation
29
+ : [field.validation];
30
+ const allErrors = [];
31
+ for (const validationFn of validationFunctions) {
32
+ const rule = validationFn(new Rule());
33
+ if (!(rule instanceof Rule)) {
34
+ console.error(`Validation function for field "${field.name}" did not return a Rule object. Make sure you are chaining validation methods and returning the result.`);
35
+ continue;
36
+ }
37
+ const markers = await rule.validate(value, {
38
+ path: [field.name],
39
+ ...context
40
+ });
41
+ allErrors.push(...markers.map((marker) => ({
42
+ level: marker.level,
43
+ message: marker.message
44
+ })));
45
+ }
46
+ const isValid = allErrors.filter((e) => e.level === 'error').length === 0;
47
+ return { isValid, errors: allErrors };
48
+ }
49
+ catch (error) {
50
+ console.error('Validation error:', error);
51
+ return {
52
+ isValid: false,
53
+ errors: [{ level: 'error', message: 'Validation failed' }]
54
+ };
55
+ }
56
+ }
57
+ /**
58
+ * Get validation CSS classes for input styling
59
+ */
60
+ export function getValidationClasses(hasErrors) {
61
+ if (hasErrors) {
62
+ return 'border-destructive border-2';
63
+ }
64
+ // No green styling for success - only show red for errors
65
+ return '';
66
+ }
@@ -0,0 +1,23 @@
1
+ import type { Handle } from '@sveltejs/kit';
2
+ import type { CMSConfig } from './types/index.js';
3
+ import type { DatabaseAdapter } from './db/index.js';
4
+ import type { AssetService } from './services/asset-service.js';
5
+ import type { StorageAdapter } from './storage/interfaces/storage.js';
6
+ import type { EmailAdapter } from './email/index.js';
7
+ import type { AuthProvider } from './auth/provider.js';
8
+ import { CMSEngine } from './engine.js';
9
+ export interface CMSInstances {
10
+ config: CMSConfig;
11
+ assetService: AssetService;
12
+ storageAdapter: StorageAdapter;
13
+ databaseAdapter: DatabaseAdapter;
14
+ emailAdapter?: EmailAdapter | null;
15
+ cmsEngine: CMSEngine;
16
+ auth?: AuthProvider;
17
+ pluginRoutes?: Map<string, {
18
+ handler: (event: any) => Promise<Response> | Response;
19
+ pluginName: string;
20
+ }>;
21
+ }
22
+ export declare function createCMSHook(config: CMSConfig): Handle;
23
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/lib/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAIvD,OAAO,EAAa,SAAS,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,WAAW,YAAY;IAC5B,MAAM,EAAE,SAAS,CAAC;IAClB,YAAY,EAAE,YAAY,CAAC;IAC3B,cAAc,EAAE,cAAc,CAAC;IAC/B,eAAe,EAAE,eAAe,CAAC;IACjC,YAAY,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,CAAC,EAAE,GAAG,CACjB,MAAM,EACN;QAAE,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAC7E,CAAC;CACF;AAqBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,GAAG,MAAM,CA+FvD"}
package/dist/hooks.js ADDED
@@ -0,0 +1,96 @@
1
+ import { handleAuthHook } from './auth/auth-hooks.js';
2
+ import { createStorageAdapter as createStorageAdapterProvider } from './storage/providers/storage.js';
3
+ import { AssetService as AssetServiceClass } from './services/asset-service.js';
4
+ import { createCMS } from './engine.js';
5
+ let cmsInstances = null;
6
+ let lastConfigHash = null;
7
+ // Helper to generate a simple hash of schema types for change detection
8
+ function getConfigHash(config) {
9
+ const schemaNames = config.schemaTypes
10
+ .map((s) => `${s.name}:${s.fields.length}:${JSON.stringify(s.fields)}`)
11
+ .join(',');
12
+ return schemaNames;
13
+ }
14
+ // Factory function to create the default local storage adapter
15
+ function createDefaultStorageAdapter() {
16
+ return createStorageAdapterProvider('local', {
17
+ basePath: './storage/assets', // Private storage - not in static/, not served in production
18
+ baseUrl: '' // No direct URL - all access through /assets/{id}/{filename}
19
+ });
20
+ }
21
+ export function createCMSHook(config) {
22
+ return async ({ event, resolve }) => {
23
+ // Note: In dev mode, /storage/ might be accessible via Vite dev server
24
+ // In production, only /static/ folder is served - /storage/ is private
25
+ const currentConfigHash = getConfigHash(config);
26
+ const configChanged = lastConfigHash !== null && currentConfigHash !== lastConfigHash;
27
+ // Initialize CMS instances once at application startup
28
+ if (!cmsInstances) {
29
+ console.log('🚀 Initializing CMS...');
30
+ const databaseAdapter = config.database;
31
+ // Use the storage adapter from config, or create the default local one.
32
+ const storageAdapter = config.storage ?? createDefaultStorageAdapter();
33
+ const emailAdapter = config.email ?? null;
34
+ const assetService = new AssetServiceClass(storageAdapter, databaseAdapter);
35
+ const cmsEngine = createCMS(config, databaseAdapter);
36
+ await cmsEngine.initialize();
37
+ // Build plugin route map (do this ONCE at startup)
38
+ const pluginRoutes = new Map();
39
+ if (config.plugins && config.plugins.length > 0) {
40
+ for (const plugin of config.plugins) {
41
+ if (plugin.routes) {
42
+ for (const [path, handler] of Object.entries(plugin.routes)) {
43
+ pluginRoutes.set(path, { handler, pluginName: plugin.name });
44
+ }
45
+ }
46
+ }
47
+ }
48
+ cmsInstances = {
49
+ config,
50
+ databaseAdapter: databaseAdapter,
51
+ assetService: assetService,
52
+ storageAdapter: storageAdapter,
53
+ emailAdapter: emailAdapter,
54
+ cmsEngine: cmsEngine,
55
+ auth: config.auth?.provider,
56
+ pluginRoutes
57
+ };
58
+ // Install plugins
59
+ if (config.plugins && config.plugins.length > 0) {
60
+ for (const plugin of config.plugins) {
61
+ console.log(`🔌 Installing plugin: ${plugin.name}`);
62
+ await plugin.install(cmsInstances);
63
+ }
64
+ }
65
+ lastConfigHash = currentConfigHash;
66
+ }
67
+ else if (configChanged) {
68
+ // HMR: Config changed, re-sync schemas
69
+ console.log('🔄 Schema types changed, re-syncing...');
70
+ console.log('Old hash:', lastConfigHash?.substring(0, 100) + '...');
71
+ console.log('New hash:', currentConfigHash.substring(0, 100) + '...');
72
+ console.log('Schema types being updated:', config.schemaTypes.map((s) => s.name));
73
+ cmsInstances.cmsEngine.updateConfig(config);
74
+ await cmsInstances.cmsEngine.initialize();
75
+ lastConfigHash = currentConfigHash;
76
+ console.log('✅ Schema sync complete');
77
+ }
78
+ // Inject shared CMS services into locals (reuse singleton instances)
79
+ event.locals.aphexCMS = cmsInstances;
80
+ // Auth protection if configured
81
+ if (cmsInstances.auth) {
82
+ const authResponse = await handleAuthHook(event, config, cmsInstances.auth, cmsInstances.databaseAdapter);
83
+ if (authResponse)
84
+ return authResponse;
85
+ }
86
+ // Check if a plugin handles this route (O(1) lookup)
87
+ if (cmsInstances.pluginRoutes && cmsInstances.pluginRoutes.size > 0) {
88
+ const pluginRoute = cmsInstances.pluginRoutes.get(event.url.pathname);
89
+ if (pluginRoute) {
90
+ console.log(`🔌 Plugin ${pluginRoute.pluginName} handling route: ${event.url.pathname}`);
91
+ return pluginRoute.handler(event);
92
+ }
93
+ }
94
+ return resolve(event);
95
+ };
96
+ }
@@ -0,0 +1,2 @@
1
+ export * from './client/index.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC"}
@@ -1,5 +1,4 @@
1
1
  // Aphex CMS Core - Main exports (client-safe only)
2
2
  // For server-side functionality, import from '@aphexcms/cms-core/server'
3
-
4
3
  // Re-export all client-safe functionality
5
4
  export * from './client/index.js';