@aphexcms/cms-core 3.0.0 → 5.0.0

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 (311) hide show
  1. package/dist/api/schemas/user.d.ts +10 -0
  2. package/dist/api/schemas/user.d.ts.map +1 -1
  3. package/dist/api/schemas/user.js +10 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +1 -2
  6. package/dist/hooks.d.ts +3 -4
  7. package/dist/hooks.d.ts.map +1 -1
  8. package/dist/hooks.js +20 -99
  9. package/dist/index.d.ts +9 -1
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +43 -4
  12. package/dist/lib/api/schemas/user.d.ts +10 -0
  13. package/dist/lib/api/schemas/user.d.ts.map +1 -1
  14. package/dist/lib/api/schemas/user.js +10 -0
  15. package/dist/lib/api/schemas/user.js.map +1 -1
  16. package/dist/lib/config.d.ts.map +1 -1
  17. package/dist/lib/config.js +1 -2
  18. package/dist/lib/config.js.map +1 -1
  19. package/dist/lib/hooks.d.ts +3 -4
  20. package/dist/lib/hooks.d.ts.map +1 -1
  21. package/dist/lib/hooks.js +20 -99
  22. package/dist/lib/hooks.js.map +1 -1
  23. package/dist/lib/index.d.ts +9 -1
  24. package/dist/lib/index.d.ts.map +1 -1
  25. package/dist/lib/index.js +43 -4
  26. package/dist/lib/index.js.map +1 -1
  27. package/dist/lib/server/api/index.d.ts +55 -0
  28. package/dist/lib/server/api/index.d.ts.map +1 -0
  29. package/dist/lib/server/api/index.js +107 -0
  30. package/dist/lib/server/api/index.js.map +1 -0
  31. package/dist/lib/server/api/routes/assets-bulk.d.ts +4 -0
  32. package/dist/lib/server/api/routes/assets-bulk.d.ts.map +1 -0
  33. package/dist/{routes → lib/server/api/routes}/assets-bulk.js +23 -23
  34. package/dist/lib/server/api/routes/assets-bulk.js.map +1 -0
  35. package/dist/lib/server/api/routes/assets-by-id.d.ts +4 -0
  36. package/dist/lib/server/api/routes/assets-by-id.d.ts.map +1 -0
  37. package/dist/lib/server/api/routes/assets-by-id.js +108 -0
  38. package/dist/lib/server/api/routes/assets-by-id.js.map +1 -0
  39. package/dist/lib/server/api/routes/assets-references.d.ts +15 -0
  40. package/dist/lib/server/api/routes/assets-references.d.ts.map +1 -0
  41. package/dist/lib/server/api/routes/assets-references.js +78 -0
  42. package/dist/lib/server/api/routes/assets-references.js.map +1 -0
  43. package/dist/lib/server/api/routes/assets.d.ts +4 -0
  44. package/dist/lib/server/api/routes/assets.d.ts.map +1 -0
  45. package/dist/{routes → lib/server/api/routes}/assets.js +76 -87
  46. package/dist/lib/server/api/routes/assets.js.map +1 -0
  47. package/dist/lib/server/api/routes/document-versions.d.ts +4 -0
  48. package/dist/lib/server/api/routes/document-versions.d.ts.map +1 -0
  49. package/dist/lib/server/api/routes/document-versions.js +113 -0
  50. package/dist/lib/server/api/routes/document-versions.js.map +1 -0
  51. package/dist/lib/server/api/routes/documents-by-id.d.ts +4 -0
  52. package/dist/lib/server/api/routes/documents-by-id.d.ts.map +1 -0
  53. package/dist/lib/server/api/routes/documents-by-id.js +148 -0
  54. package/dist/lib/server/api/routes/documents-by-id.js.map +1 -0
  55. package/dist/lib/server/api/routes/documents-publish.d.ts +4 -0
  56. package/dist/lib/server/api/routes/documents-publish.d.ts.map +1 -0
  57. package/dist/{routes → lib/server/api/routes}/documents-publish.js +42 -58
  58. package/dist/lib/server/api/routes/documents-publish.js.map +1 -0
  59. package/dist/lib/server/api/routes/documents-query.d.ts +8 -0
  60. package/dist/lib/server/api/routes/documents-query.d.ts.map +1 -0
  61. package/dist/lib/server/api/routes/documents-query.js +75 -0
  62. package/dist/lib/server/api/routes/documents-query.js.map +1 -0
  63. package/dist/lib/server/api/routes/documents.d.ts +4 -0
  64. package/dist/lib/server/api/routes/documents.d.ts.map +1 -0
  65. package/dist/{routes → lib/server/api/routes}/documents.js +55 -76
  66. package/dist/lib/server/api/routes/documents.js.map +1 -0
  67. package/dist/lib/server/api/routes/organizations-by-id.d.ts +4 -0
  68. package/dist/lib/server/api/routes/organizations-by-id.d.ts.map +1 -0
  69. package/dist/{routes → lib/server/api/routes}/organizations-by-id.js +62 -91
  70. package/dist/lib/server/api/routes/organizations-by-id.js.map +1 -0
  71. package/dist/lib/server/api/routes/organizations-invitations.d.ts +10 -0
  72. package/dist/lib/server/api/routes/organizations-invitations.d.ts.map +1 -0
  73. package/dist/{routes → lib/server/api/routes}/organizations-invitations.js +67 -78
  74. package/dist/lib/server/api/routes/organizations-invitations.js.map +1 -0
  75. package/dist/lib/server/api/routes/organizations-members.d.ts +4 -0
  76. package/dist/lib/server/api/routes/organizations-members.d.ts.map +1 -0
  77. package/dist/{routes → lib/server/api/routes}/organizations-members.js +74 -106
  78. package/dist/lib/server/api/routes/organizations-members.js.map +1 -0
  79. package/dist/lib/server/api/routes/organizations-switch.d.ts +4 -0
  80. package/dist/lib/server/api/routes/organizations-switch.d.ts.map +1 -0
  81. package/dist/lib/server/api/routes/organizations-switch.js +54 -0
  82. package/dist/lib/server/api/routes/organizations-switch.js.map +1 -0
  83. package/dist/lib/server/api/routes/organizations.d.ts +4 -0
  84. package/dist/lib/server/api/routes/organizations.d.ts.map +1 -0
  85. package/dist/lib/server/api/routes/organizations.js +99 -0
  86. package/dist/lib/server/api/routes/organizations.js.map +1 -0
  87. package/dist/lib/server/api/routes/roles.d.ts +12 -0
  88. package/dist/lib/server/api/routes/roles.d.ts.map +1 -0
  89. package/dist/lib/server/api/routes/roles.js +219 -0
  90. package/dist/lib/server/api/routes/roles.js.map +1 -0
  91. package/dist/lib/server/api/routes/schemas.d.ts +4 -0
  92. package/dist/lib/server/api/routes/schemas.d.ts.map +1 -0
  93. package/dist/lib/server/api/routes/schemas.js +27 -0
  94. package/dist/lib/server/api/routes/schemas.js.map +1 -0
  95. package/dist/lib/server/api/routes/user-preferences.d.ts +4 -0
  96. package/dist/lib/server/api/routes/user-preferences.d.ts.map +1 -0
  97. package/dist/lib/server/api/routes/user-preferences.js +63 -0
  98. package/dist/lib/server/api/routes/user-preferences.js.map +1 -0
  99. package/dist/lib/server/api/routes/user.d.ts +12 -0
  100. package/dist/lib/server/api/routes/user.d.ts.map +1 -0
  101. package/dist/lib/server/api/routes/user.js +114 -0
  102. package/dist/lib/server/api/routes/user.js.map +1 -0
  103. package/dist/lib/server/index.d.ts +2 -1
  104. package/dist/lib/server/index.d.ts.map +1 -1
  105. package/dist/lib/server/index.js +7 -3
  106. package/dist/lib/server/index.js.map +1 -1
  107. package/dist/lib/types/config.d.ts +28 -29
  108. package/dist/lib/types/config.d.ts.map +1 -1
  109. package/dist/server/api/index.d.ts +55 -0
  110. package/dist/server/api/index.d.ts.map +1 -0
  111. package/dist/server/api/index.js +106 -0
  112. package/dist/server/api/routes/assets-bulk.d.ts +4 -0
  113. package/dist/server/api/routes/assets-bulk.d.ts.map +1 -0
  114. package/dist/{lib → server/api}/routes/assets-bulk.js +22 -24
  115. package/dist/server/api/routes/assets-by-id.d.ts +4 -0
  116. package/dist/server/api/routes/assets-by-id.d.ts.map +1 -0
  117. package/dist/server/api/routes/assets-by-id.js +107 -0
  118. package/dist/server/api/routes/assets-references.d.ts +15 -0
  119. package/dist/server/api/routes/assets-references.d.ts.map +1 -0
  120. package/dist/server/api/routes/assets-references.js +77 -0
  121. package/dist/server/api/routes/assets.d.ts +4 -0
  122. package/dist/server/api/routes/assets.d.ts.map +1 -0
  123. package/dist/{lib → server/api}/routes/assets.js +75 -88
  124. package/dist/server/api/routes/document-versions.d.ts +4 -0
  125. package/dist/server/api/routes/document-versions.d.ts.map +1 -0
  126. package/dist/server/api/routes/document-versions.js +112 -0
  127. package/dist/server/api/routes/documents-by-id.d.ts +4 -0
  128. package/dist/server/api/routes/documents-by-id.d.ts.map +1 -0
  129. package/dist/server/api/routes/documents-by-id.js +147 -0
  130. package/dist/server/api/routes/documents-publish.d.ts +4 -0
  131. package/dist/server/api/routes/documents-publish.d.ts.map +1 -0
  132. package/dist/{lib → server/api}/routes/documents-publish.js +41 -59
  133. package/dist/server/api/routes/documents-query.d.ts +8 -0
  134. package/dist/server/api/routes/documents-query.d.ts.map +1 -0
  135. package/dist/server/api/routes/documents-query.js +74 -0
  136. package/dist/server/api/routes/documents.d.ts +4 -0
  137. package/dist/server/api/routes/documents.d.ts.map +1 -0
  138. package/dist/{lib → server/api}/routes/documents.js +54 -77
  139. package/dist/server/api/routes/organizations-by-id.d.ts +4 -0
  140. package/dist/server/api/routes/organizations-by-id.d.ts.map +1 -0
  141. package/dist/{lib → server/api}/routes/organizations-by-id.js +61 -92
  142. package/dist/server/api/routes/organizations-invitations.d.ts +10 -0
  143. package/dist/server/api/routes/organizations-invitations.d.ts.map +1 -0
  144. package/dist/{lib → server/api}/routes/organizations-invitations.js +66 -79
  145. package/dist/server/api/routes/organizations-members.d.ts +4 -0
  146. package/dist/server/api/routes/organizations-members.d.ts.map +1 -0
  147. package/dist/{lib → server/api}/routes/organizations-members.js +73 -107
  148. package/dist/server/api/routes/organizations-switch.d.ts +4 -0
  149. package/dist/server/api/routes/organizations-switch.d.ts.map +1 -0
  150. package/dist/server/api/routes/organizations-switch.js +53 -0
  151. package/dist/server/api/routes/organizations.d.ts +4 -0
  152. package/dist/server/api/routes/organizations.d.ts.map +1 -0
  153. package/dist/server/api/routes/organizations.js +98 -0
  154. package/dist/server/api/routes/roles.d.ts +12 -0
  155. package/dist/server/api/routes/roles.d.ts.map +1 -0
  156. package/dist/server/api/routes/roles.js +218 -0
  157. package/dist/server/api/routes/schemas.d.ts +4 -0
  158. package/dist/server/api/routes/schemas.d.ts.map +1 -0
  159. package/dist/server/api/routes/schemas.js +26 -0
  160. package/dist/server/api/routes/user-preferences.d.ts +4 -0
  161. package/dist/server/api/routes/user-preferences.d.ts.map +1 -0
  162. package/dist/server/api/routes/user-preferences.js +62 -0
  163. package/dist/server/api/routes/user.d.ts +12 -0
  164. package/dist/server/api/routes/user.d.ts.map +1 -0
  165. package/dist/server/api/routes/user.js +113 -0
  166. package/dist/server/index.d.ts +2 -1
  167. package/dist/server/index.d.ts.map +1 -1
  168. package/dist/server/index.js +7 -3
  169. package/dist/types/config.d.ts +28 -29
  170. package/dist/types/config.d.ts.map +1 -1
  171. package/package.json +4 -2
  172. package/dist/lib/routes/assets-bulk.d.ts +0 -3
  173. package/dist/lib/routes/assets-bulk.d.ts.map +0 -1
  174. package/dist/lib/routes/assets-bulk.js.map +0 -1
  175. package/dist/lib/routes/assets-by-id.d.ts +0 -5
  176. package/dist/lib/routes/assets-by-id.d.ts.map +0 -1
  177. package/dist/lib/routes/assets-by-id.js +0 -116
  178. package/dist/lib/routes/assets-by-id.js.map +0 -1
  179. package/dist/lib/routes/assets-references-counts.d.ts +0 -7
  180. package/dist/lib/routes/assets-references-counts.d.ts.map +0 -1
  181. package/dist/lib/routes/assets-references-counts.js +0 -42
  182. package/dist/lib/routes/assets-references-counts.js.map +0 -1
  183. package/dist/lib/routes/assets-references.d.ts +0 -7
  184. package/dist/lib/routes/assets-references.d.ts.map +0 -1
  185. package/dist/lib/routes/assets-references.js +0 -35
  186. package/dist/lib/routes/assets-references.js.map +0 -1
  187. package/dist/lib/routes/assets.d.ts +0 -4
  188. package/dist/lib/routes/assets.d.ts.map +0 -1
  189. package/dist/lib/routes/assets.js.map +0 -1
  190. package/dist/lib/routes/document-versions.d.ts +0 -5
  191. package/dist/lib/routes/document-versions.d.ts.map +0 -1
  192. package/dist/lib/routes/document-versions.js +0 -114
  193. package/dist/lib/routes/document-versions.js.map +0 -1
  194. package/dist/lib/routes/documents-by-id.d.ts +0 -5
  195. package/dist/lib/routes/documents-by-id.d.ts.map +0 -1
  196. package/dist/lib/routes/documents-by-id.js +0 -188
  197. package/dist/lib/routes/documents-by-id.js.map +0 -1
  198. package/dist/lib/routes/documents-publish.d.ts +0 -4
  199. package/dist/lib/routes/documents-publish.d.ts.map +0 -1
  200. package/dist/lib/routes/documents-publish.js.map +0 -1
  201. package/dist/lib/routes/documents-query.d.ts +0 -26
  202. package/dist/lib/routes/documents-query.d.ts.map +0 -1
  203. package/dist/lib/routes/documents-query.js +0 -104
  204. package/dist/lib/routes/documents-query.js.map +0 -1
  205. package/dist/lib/routes/documents.d.ts +0 -4
  206. package/dist/lib/routes/documents.d.ts.map +0 -1
  207. package/dist/lib/routes/documents.js.map +0 -1
  208. package/dist/lib/routes/index.d.ts +0 -9
  209. package/dist/lib/routes/index.d.ts.map +0 -1
  210. package/dist/lib/routes/index.js +0 -15
  211. package/dist/lib/routes/index.js.map +0 -1
  212. package/dist/lib/routes/organizations-by-id.d.ts +0 -5
  213. package/dist/lib/routes/organizations-by-id.d.ts.map +0 -1
  214. package/dist/lib/routes/organizations-by-id.js.map +0 -1
  215. package/dist/lib/routes/organizations-invitations.d.ts +0 -4
  216. package/dist/lib/routes/organizations-invitations.d.ts.map +0 -1
  217. package/dist/lib/routes/organizations-invitations.js.map +0 -1
  218. package/dist/lib/routes/organizations-members.d.ts +0 -5
  219. package/dist/lib/routes/organizations-members.d.ts.map +0 -1
  220. package/dist/lib/routes/organizations-members.js.map +0 -1
  221. package/dist/lib/routes/organizations-switch.d.ts +0 -3
  222. package/dist/lib/routes/organizations-switch.d.ts.map +0 -1
  223. package/dist/lib/routes/organizations-switch.js +0 -59
  224. package/dist/lib/routes/organizations-switch.js.map +0 -1
  225. package/dist/lib/routes/organizations.d.ts +0 -4
  226. package/dist/lib/routes/organizations.d.ts.map +0 -1
  227. package/dist/lib/routes/organizations.js +0 -117
  228. package/dist/lib/routes/organizations.js.map +0 -1
  229. package/dist/lib/routes/roles-by-name.d.ts +0 -4
  230. package/dist/lib/routes/roles-by-name.d.ts.map +0 -1
  231. package/dist/lib/routes/roles-by-name.js +0 -112
  232. package/dist/lib/routes/roles-by-name.js.map +0 -1
  233. package/dist/lib/routes/roles.d.ts +0 -4
  234. package/dist/lib/routes/roles.d.ts.map +0 -1
  235. package/dist/lib/routes/roles.js +0 -91
  236. package/dist/lib/routes/roles.js.map +0 -1
  237. package/dist/lib/routes/schemas-by-type.d.ts +0 -3
  238. package/dist/lib/routes/schemas-by-type.d.ts.map +0 -1
  239. package/dist/lib/routes/schemas-by-type.js +0 -27
  240. package/dist/lib/routes/schemas-by-type.js.map +0 -1
  241. package/dist/lib/routes/schemas.d.ts +0 -3
  242. package/dist/lib/routes/schemas.d.ts.map +0 -1
  243. package/dist/lib/routes/schemas.js +0 -12
  244. package/dist/lib/routes/schemas.js.map +0 -1
  245. package/dist/lib/routes/user-preferences.d.ts +0 -4
  246. package/dist/lib/routes/user-preferences.d.ts.map +0 -1
  247. package/dist/lib/routes/user-preferences.js +0 -73
  248. package/dist/lib/routes/user-preferences.js.map +0 -1
  249. package/dist/lib/routes-exports.d.ts +0 -20
  250. package/dist/lib/routes-exports.d.ts.map +0 -1
  251. package/dist/lib/routes-exports.js +0 -27
  252. package/dist/lib/routes-exports.js.map +0 -1
  253. package/dist/routes/assets-bulk.d.ts +0 -3
  254. package/dist/routes/assets-bulk.d.ts.map +0 -1
  255. package/dist/routes/assets-by-id.d.ts +0 -5
  256. package/dist/routes/assets-by-id.d.ts.map +0 -1
  257. package/dist/routes/assets-by-id.js +0 -115
  258. package/dist/routes/assets-references-counts.d.ts +0 -7
  259. package/dist/routes/assets-references-counts.d.ts.map +0 -1
  260. package/dist/routes/assets-references-counts.js +0 -41
  261. package/dist/routes/assets-references.d.ts +0 -7
  262. package/dist/routes/assets-references.d.ts.map +0 -1
  263. package/dist/routes/assets-references.js +0 -34
  264. package/dist/routes/assets.d.ts +0 -4
  265. package/dist/routes/assets.d.ts.map +0 -1
  266. package/dist/routes/document-versions.d.ts +0 -5
  267. package/dist/routes/document-versions.d.ts.map +0 -1
  268. package/dist/routes/document-versions.js +0 -113
  269. package/dist/routes/documents-by-id.d.ts +0 -5
  270. package/dist/routes/documents-by-id.d.ts.map +0 -1
  271. package/dist/routes/documents-by-id.js +0 -187
  272. package/dist/routes/documents-publish.d.ts +0 -4
  273. package/dist/routes/documents-publish.d.ts.map +0 -1
  274. package/dist/routes/documents-query.d.ts +0 -26
  275. package/dist/routes/documents-query.d.ts.map +0 -1
  276. package/dist/routes/documents-query.js +0 -103
  277. package/dist/routes/documents.d.ts +0 -4
  278. package/dist/routes/documents.d.ts.map +0 -1
  279. package/dist/routes/index.d.ts +0 -9
  280. package/dist/routes/index.d.ts.map +0 -1
  281. package/dist/routes/index.js +0 -14
  282. package/dist/routes/organizations-by-id.d.ts +0 -5
  283. package/dist/routes/organizations-by-id.d.ts.map +0 -1
  284. package/dist/routes/organizations-invitations.d.ts +0 -4
  285. package/dist/routes/organizations-invitations.d.ts.map +0 -1
  286. package/dist/routes/organizations-members.d.ts +0 -5
  287. package/dist/routes/organizations-members.d.ts.map +0 -1
  288. package/dist/routes/organizations-switch.d.ts +0 -3
  289. package/dist/routes/organizations-switch.d.ts.map +0 -1
  290. package/dist/routes/organizations-switch.js +0 -58
  291. package/dist/routes/organizations.d.ts +0 -4
  292. package/dist/routes/organizations.d.ts.map +0 -1
  293. package/dist/routes/organizations.js +0 -116
  294. package/dist/routes/roles-by-name.d.ts +0 -4
  295. package/dist/routes/roles-by-name.d.ts.map +0 -1
  296. package/dist/routes/roles-by-name.js +0 -111
  297. package/dist/routes/roles.d.ts +0 -4
  298. package/dist/routes/roles.d.ts.map +0 -1
  299. package/dist/routes/roles.js +0 -90
  300. package/dist/routes/schemas-by-type.d.ts +0 -3
  301. package/dist/routes/schemas-by-type.d.ts.map +0 -1
  302. package/dist/routes/schemas-by-type.js +0 -26
  303. package/dist/routes/schemas.d.ts +0 -3
  304. package/dist/routes/schemas.d.ts.map +0 -1
  305. package/dist/routes/schemas.js +0 -11
  306. package/dist/routes/user-preferences.d.ts +0 -4
  307. package/dist/routes/user-preferences.d.ts.map +0 -1
  308. package/dist/routes/user-preferences.js +0 -72
  309. package/dist/routes-exports.d.ts +0 -20
  310. package/dist/routes-exports.d.ts.map +0 -1
  311. package/dist/routes-exports.js +0 -26
@@ -0,0 +1,98 @@
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { createOrganizationRequest } from '../../../api/schemas/organizations.js';
5
+ export const organizationsRouter = new Hono()
6
+ .get('/', async (c) => {
7
+ try {
8
+ const { databaseAdapter } = c.var.aphexCMS;
9
+ const auth = c.var.auth;
10
+ if (!auth || auth.type !== 'session') {
11
+ return c.json({
12
+ success: false,
13
+ error: 'Unauthorized',
14
+ message: 'Session authentication required'
15
+ }, 401);
16
+ }
17
+ const memberships = await databaseAdapter.findUserOrganizations(auth.user.id);
18
+ const organizations = memberships.map((m) => ({
19
+ id: m.organization.id,
20
+ name: m.organization.name,
21
+ slug: m.organization.slug,
22
+ metadata: m.organization.metadata,
23
+ role: m.member.role,
24
+ joinedAt: m.member.createdAt,
25
+ isActive: m.organization.id === auth.organizationId
26
+ }));
27
+ return c.json({ success: true, data: organizations });
28
+ }
29
+ catch (error) {
30
+ cmsLogger.error('Failed to fetch organizations:', error);
31
+ return c.json({
32
+ success: false,
33
+ error: 'Failed to fetch organizations',
34
+ message: error instanceof Error ? error.message : 'Unknown error'
35
+ }, 500);
36
+ }
37
+ })
38
+ .post('/', zValidator('json', createOrganizationRequest, (result, c) => {
39
+ if (!result.success) {
40
+ return c.json({
41
+ success: false,
42
+ error: 'Invalid request body',
43
+ message: 'Organization name and slug are required',
44
+ issues: result.error.issues
45
+ }, 400);
46
+ }
47
+ }), async (c) => {
48
+ try {
49
+ const { databaseAdapter } = c.var.aphexCMS;
50
+ const auth = c.var.auth;
51
+ if (!auth || auth.type !== 'session') {
52
+ return c.json({
53
+ success: false,
54
+ error: 'Unauthorized',
55
+ message: 'Session authentication required'
56
+ }, 401);
57
+ }
58
+ if (auth.user.role !== 'super_admin') {
59
+ return c.json({
60
+ success: false,
61
+ error: 'Forbidden',
62
+ message: 'Only super admins can create organizations'
63
+ }, 403);
64
+ }
65
+ const body = c.req.valid('json');
66
+ const existingOrg = await databaseAdapter.findOrganizationBySlug(body.slug);
67
+ if (existingOrg) {
68
+ return c.json({
69
+ success: false,
70
+ error: 'Slug already exists',
71
+ message: `Organization with slug '${body.slug}' already exists`
72
+ }, 409);
73
+ }
74
+ const newOrganization = await databaseAdapter.createOrganization({
75
+ name: body.name,
76
+ slug: body.slug,
77
+ metadata: body.metadata || null,
78
+ parentOrganizationId: auth.organizationId,
79
+ createdBy: auth.user.id
80
+ });
81
+ await databaseAdapter.seedBuiltinRoles(newOrganization.id);
82
+ await databaseAdapter.addMember({
83
+ organizationId: newOrganization.id,
84
+ userId: auth.user.id,
85
+ role: 'owner'
86
+ });
87
+ await databaseAdapter.updateUserSession(auth.user.id, newOrganization.id);
88
+ return c.json({ success: true, data: newOrganization }, 201);
89
+ }
90
+ catch (error) {
91
+ cmsLogger.error('Failed to create organization:', error);
92
+ return c.json({
93
+ success: false,
94
+ error: 'Failed to create organization',
95
+ message: error instanceof Error ? error.message : 'Unknown error'
96
+ }, 500);
97
+ }
98
+ });
@@ -0,0 +1,12 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ /**
4
+ * Roles router. Combines `/roles` (list, create) and `/roles/:name`
5
+ * (update, delete) so the wire URLs are
6
+ * `/api/roles` and `/api/roles/:name`.
7
+ *
8
+ * Note: built-in role names cannot be deleted; they're seeded on every
9
+ * org and a custom row with the same name would be unreachable.
10
+ */
11
+ export declare const rolesRouter: Hono<AphexEnv>;
12
+ //# sourceMappingURL=roles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/roles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAK5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,WAAW,EAAE,IAAI,CAAC,QAAQ,CAuSpC,CAAC"}
@@ -0,0 +1,218 @@
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { hasCapability, BUILTIN_ROLE_NAMES } from '../../../types/capabilities.js';
5
+ import { createRoleRequest, updateRoleRequest } from '../../../api/schemas/roles.js';
6
+ /**
7
+ * Roles router. Combines `/roles` (list, create) and `/roles/:name`
8
+ * (update, delete) so the wire URLs are
9
+ * `/api/roles` and `/api/roles/:name`.
10
+ *
11
+ * Note: built-in role names cannot be deleted; they're seeded on every
12
+ * org and a custom row with the same name would be unreachable.
13
+ */
14
+ export const rolesRouter = new Hono()
15
+ .get('/', async (c) => {
16
+ try {
17
+ const { rolesService } = c.var.aphexCMS;
18
+ const auth = c.var.auth;
19
+ if (!auth || auth.type !== 'session') {
20
+ return c.json({
21
+ success: false,
22
+ error: 'Unauthorized',
23
+ message: 'Session authentication required'
24
+ }, 401);
25
+ }
26
+ const roles = await rolesService.listRoles(auth.organizationId);
27
+ return c.json({ success: true, data: roles });
28
+ }
29
+ catch (error) {
30
+ cmsLogger.error('Failed to list roles:', error);
31
+ return c.json({
32
+ success: false,
33
+ error: 'Failed to list roles',
34
+ message: error instanceof Error ? error.message : 'Unknown error'
35
+ }, 500);
36
+ }
37
+ })
38
+ .post('/', zValidator('json', createRoleRequest, (result, c) => {
39
+ if (!result.success) {
40
+ return c.json({
41
+ success: false,
42
+ error: 'Invalid request body',
43
+ message: 'name and capabilities are required',
44
+ issues: result.error.issues
45
+ }, 400);
46
+ }
47
+ }), async (c) => {
48
+ try {
49
+ const { databaseAdapter, rolesService } = c.var.aphexCMS;
50
+ const auth = c.var.auth;
51
+ if (!auth || auth.type !== 'session') {
52
+ return c.json({
53
+ success: false,
54
+ error: 'Unauthorized',
55
+ message: 'Session authentication required'
56
+ }, 401);
57
+ }
58
+ if (!hasCapability(auth, 'role.manage')) {
59
+ return c.json({
60
+ success: false,
61
+ error: 'Forbidden',
62
+ message: 'You do not have permission to manage roles'
63
+ }, 403);
64
+ }
65
+ const body = c.req.valid('json');
66
+ if (BUILTIN_ROLE_NAMES.includes(body.name)) {
67
+ return c.json({
68
+ success: false,
69
+ error: 'Reserved name',
70
+ message: `"${body.name}" is a built-in role name. Edit the existing role instead.`
71
+ }, 409);
72
+ }
73
+ const existing = await databaseAdapter.findRoleByName(auth.organizationId, body.name);
74
+ if (existing) {
75
+ return c.json({
76
+ success: false,
77
+ error: 'Conflict',
78
+ message: `A role named "${body.name}" already exists in this organization.`
79
+ }, 409);
80
+ }
81
+ const role = await databaseAdapter.createRole({
82
+ organizationId: auth.organizationId,
83
+ name: body.name,
84
+ description: body.description ?? null,
85
+ capabilities: body.capabilities,
86
+ isBuiltIn: false
87
+ });
88
+ await rolesService.invalidate(auth.organizationId, body.name);
89
+ return c.json({ success: true, data: role }, 201);
90
+ }
91
+ catch (error) {
92
+ cmsLogger.error('Failed to create role:', error);
93
+ return c.json({
94
+ success: false,
95
+ error: 'Failed to create role',
96
+ message: error instanceof Error ? error.message : 'Unknown error'
97
+ }, 500);
98
+ }
99
+ })
100
+ .patch('/:name', zValidator('json', updateRoleRequest, (result, c) => {
101
+ if (!result.success) {
102
+ return c.json({
103
+ success: false,
104
+ error: 'Invalid request body',
105
+ issues: result.error.issues
106
+ }, 400);
107
+ }
108
+ }), async (c) => {
109
+ try {
110
+ const { databaseAdapter, rolesService } = c.var.aphexCMS;
111
+ const auth = c.var.auth;
112
+ if (!auth || auth.type !== 'session') {
113
+ return c.json({
114
+ success: false,
115
+ error: 'Unauthorized',
116
+ message: 'Session authentication required'
117
+ }, 401);
118
+ }
119
+ if (!hasCapability(auth, 'role.manage')) {
120
+ return c.json({
121
+ success: false,
122
+ error: 'Forbidden',
123
+ message: 'You do not have permission to manage roles'
124
+ }, 403);
125
+ }
126
+ const name = c.req.param('name');
127
+ if (!name) {
128
+ return c.json({
129
+ success: false,
130
+ error: 'Invalid request',
131
+ message: 'Role name is required'
132
+ }, 400);
133
+ }
134
+ const body = c.req.valid('json');
135
+ const updated = await databaseAdapter.updateRole(auth.organizationId, name, body);
136
+ if (!updated) {
137
+ return c.json({
138
+ success: false,
139
+ error: 'Not found',
140
+ message: `No role named "${name}" in this organization`
141
+ }, 404);
142
+ }
143
+ await rolesService.invalidate(auth.organizationId, name);
144
+ return c.json({ success: true, data: updated });
145
+ }
146
+ catch (error) {
147
+ cmsLogger.error('Failed to update role:', error);
148
+ return c.json({
149
+ success: false,
150
+ error: 'Failed to update role',
151
+ message: error instanceof Error ? error.message : 'Unknown error'
152
+ }, 500);
153
+ }
154
+ })
155
+ .delete('/:name', async (c) => {
156
+ try {
157
+ const { databaseAdapter, rolesService } = c.var.aphexCMS;
158
+ const auth = c.var.auth;
159
+ if (!auth || auth.type !== 'session') {
160
+ return c.json({
161
+ success: false,
162
+ error: 'Unauthorized',
163
+ message: 'Session authentication required'
164
+ }, 401);
165
+ }
166
+ if (!hasCapability(auth, 'role.manage')) {
167
+ return c.json({
168
+ success: false,
169
+ error: 'Forbidden',
170
+ message: 'You do not have permission to manage roles'
171
+ }, 403);
172
+ }
173
+ const name = c.req.param('name');
174
+ if (!name) {
175
+ return c.json({
176
+ success: false,
177
+ error: 'Invalid request',
178
+ message: 'Role name is required'
179
+ }, 400);
180
+ }
181
+ if (BUILTIN_ROLE_NAMES.includes(name)) {
182
+ return c.json({
183
+ success: false,
184
+ error: 'Forbidden',
185
+ message: `"${name}" is a built-in role and cannot be deleted.`
186
+ }, 403);
187
+ }
188
+ const members = await databaseAdapter.findOrganizationMembers(auth.organizationId);
189
+ const inUseByMember = members.some((m) => m.role === name);
190
+ const invitations = await databaseAdapter.findOrganizationInvitations(auth.organizationId);
191
+ const inUseByInvitation = invitations.some((i) => i.role === name && !i.acceptedAt);
192
+ if (inUseByMember || inUseByInvitation) {
193
+ return c.json({
194
+ success: false,
195
+ error: 'Role in use',
196
+ message: `Cannot delete "${name}": reassign affected members or invitations first.`
197
+ }, 409);
198
+ }
199
+ const deleted = await databaseAdapter.deleteRole(auth.organizationId, name);
200
+ if (!deleted) {
201
+ return c.json({
202
+ success: false,
203
+ error: 'Not found',
204
+ message: `No role named "${name}" in this organization`
205
+ }, 404);
206
+ }
207
+ await rolesService.invalidate(auth.organizationId, name);
208
+ return c.json({ success: true, message: 'Role deleted' });
209
+ }
210
+ catch (error) {
211
+ cmsLogger.error('Failed to delete role:', error);
212
+ return c.json({
213
+ success: false,
214
+ error: 'Failed to delete role',
215
+ message: error instanceof Error ? error.message : 'Unknown error'
216
+ }, 500);
217
+ }
218
+ });
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ export declare const schemasRouter: Hono<AphexEnv>;
4
+ //# sourceMappingURL=schemas.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAKzC,eAAO,MAAM,aAAa,EAAE,IAAI,CAAC,QAAQ,CAwBtC,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Hono } from 'hono';
2
+ import { cmsLogger } from '../../../utils/logger.js';
3
+ // Annotated as Hono<AphexEnv> (not the full chained type) so cms-core's
4
+ // .d.ts emit doesn't blow up under TS7056. Chained-route inference would
5
+ // only matter for hono/client RPC, which is out of scope here.
6
+ export const schemasRouter = new Hono()
7
+ .get('/', (c) => {
8
+ const { cmsEngine } = c.var.aphexCMS;
9
+ // Read from config so validation functions survive (not from DB).
10
+ const schemas = cmsEngine.config.schemaTypes;
11
+ return c.json({ success: true, data: schemas });
12
+ })
13
+ .get('/:type', (c) => {
14
+ const type = c.req.param('type');
15
+ const { cmsEngine } = c.var.aphexCMS;
16
+ if (!type) {
17
+ return c.json({ error: 'Schema type is required' }, 400);
18
+ }
19
+ cmsLogger.debug('GETTING SCHEMA TYPE FROM: ', type);
20
+ const schema = cmsEngine.getSchemaTypeByName(type);
21
+ cmsLogger.debug('SCHEMA: ', schema);
22
+ if (!schema) {
23
+ return c.json({ error: `Schema type '${type}' not found` }, 404);
24
+ }
25
+ return c.json({ success: true, data: schema });
26
+ });
@@ -0,0 +1,4 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ export declare const userPreferencesRouter: Hono<AphexEnv>;
4
+ //# sourceMappingURL=user-preferences.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-preferences.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/user-preferences.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC,eAAO,MAAM,qBAAqB,EAAE,IAAI,CAAC,QAAQ,CAkF/C,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { updateUserPreferencesRequest } from '../../../api/schemas/user.js';
5
+ export const userPreferencesRouter = new Hono()
6
+ .get('/cms-preference', async (c) => {
7
+ try {
8
+ const { databaseAdapter } = c.var.aphexCMS;
9
+ const auth = c.var.auth;
10
+ if (!auth || auth.type !== 'session') {
11
+ return c.json({
12
+ success: false,
13
+ error: 'Unauthorized',
14
+ message: 'Session authentication required'
15
+ }, 401);
16
+ }
17
+ const userProfile = await databaseAdapter.findUserProfileById(auth.user.id);
18
+ return c.json({ success: true, data: userProfile?.preferences || {} });
19
+ }
20
+ catch (error) {
21
+ cmsLogger.error('Failed to get user preferences:', error);
22
+ return c.json({
23
+ success: false,
24
+ error: 'Failed to get user preferences',
25
+ message: error instanceof Error ? error.message : 'Unknown error'
26
+ }, 500);
27
+ }
28
+ })
29
+ .patch('/cms-preference', zValidator('json', updateUserPreferencesRequest, (result, c) => {
30
+ if (!result.success) {
31
+ return c.json({
32
+ success: false,
33
+ error: 'Invalid request body',
34
+ message: 'Invalid preference values',
35
+ issues: result.error.issues
36
+ }, 400);
37
+ }
38
+ }), async (c) => {
39
+ try {
40
+ const { databaseAdapter } = c.var.aphexCMS;
41
+ const auth = c.var.auth;
42
+ if (!auth || auth.type !== 'session') {
43
+ return c.json({
44
+ success: false,
45
+ error: 'Unauthorized',
46
+ message: 'Session authentication required'
47
+ }, 401);
48
+ }
49
+ const body = c.req.valid('json');
50
+ await databaseAdapter.updateUserPreferences(auth.user.id, body);
51
+ const userProfile = await databaseAdapter.findUserProfileById(auth.user.id);
52
+ return c.json({ success: true, data: userProfile?.preferences || {} });
53
+ }
54
+ catch (error) {
55
+ cmsLogger.error('Failed to update user preferences:', error);
56
+ return c.json({
57
+ success: false,
58
+ error: 'Failed to update user preferences',
59
+ message: error instanceof Error ? error.message : 'Unknown error'
60
+ }, 500);
61
+ }
62
+ });
@@ -0,0 +1,12 @@
1
+ import { Hono } from 'hono';
2
+ import type { AphexEnv } from '../index.js';
3
+ /**
4
+ * User account routes that delegate to the configured AuthProvider.
5
+ *
6
+ * cms-core ships these as Hono routers so studio doesn't need to maintain
7
+ * SvelteKit `+server.ts` files for them. The wire format and side effects
8
+ * (e.g. the password-reset email) are owned by the AuthProvider impl —
9
+ * cms-core's role is just to expose them over HTTP.
10
+ */
11
+ export declare const userRouter: Hono<AphexEnv>;
12
+ //# sourceMappingURL=user.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../src/lib/server/api/routes/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAQ5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;GAOG;AACH,eAAO,MAAM,UAAU,EAAE,IAAI,CAAC,QAAQ,CA6IpC,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { Hono } from 'hono';
2
+ import { zValidator } from '@hono/zod-validator';
3
+ import { cmsLogger } from '../../../utils/logger.js';
4
+ import { updateUserRequest, requestPasswordResetRequest, resetPasswordRequest } from '../../../api/schemas/user.js';
5
+ /**
6
+ * User account routes that delegate to the configured AuthProvider.
7
+ *
8
+ * cms-core ships these as Hono routers so studio doesn't need to maintain
9
+ * SvelteKit `+server.ts` files for them. The wire format and side effects
10
+ * (e.g. the password-reset email) are owned by the AuthProvider impl —
11
+ * cms-core's role is just to expose them over HTTP.
12
+ */
13
+ export const userRouter = new Hono()
14
+ .patch('/', zValidator('json', updateUserRequest, (result, c) => {
15
+ if (!result.success) {
16
+ return c.json({
17
+ success: false,
18
+ error: 'Invalid request body',
19
+ message: 'name is required',
20
+ issues: result.error.issues
21
+ }, 400);
22
+ }
23
+ }), async (c) => {
24
+ try {
25
+ const auth = c.var.auth;
26
+ const provider = c.var.aphexCMS.auth;
27
+ if (!auth || auth.type !== 'session') {
28
+ return c.json({
29
+ success: false,
30
+ error: 'Unauthorized',
31
+ message: 'Session authentication required'
32
+ }, 401);
33
+ }
34
+ if (!provider) {
35
+ return c.json({
36
+ success: false,
37
+ error: 'Auth provider not configured'
38
+ }, 500);
39
+ }
40
+ const { name } = c.req.valid('json');
41
+ await provider.changeUserName(auth.user.id, name);
42
+ return c.json({ success: true, message: 'User updated successfully' });
43
+ }
44
+ catch (error) {
45
+ cmsLogger.error('Failed to update user:', error);
46
+ return c.json({
47
+ success: false,
48
+ error: 'Failed to update user',
49
+ message: error instanceof Error ? error.message : 'Unknown error'
50
+ }, 500);
51
+ }
52
+ })
53
+ .post('/request-password-reset', zValidator('json', requestPasswordResetRequest, (result, c) => {
54
+ if (!result.success) {
55
+ return c.json({
56
+ success: false,
57
+ error: 'Missing required field',
58
+ message: 'email is required',
59
+ issues: result.error.issues
60
+ }, 400);
61
+ }
62
+ }), async (c) => {
63
+ try {
64
+ const provider = c.var.aphexCMS.auth;
65
+ if (!provider) {
66
+ return c.json({ success: false, error: 'Auth provider not configured' }, 500);
67
+ }
68
+ const { email, redirectTo } = c.req.valid('json');
69
+ await provider.requestPasswordReset(email, redirectTo);
70
+ // Constant response shape regardless of whether the email exists,
71
+ // to avoid account enumeration via the API.
72
+ return c.json({
73
+ success: true,
74
+ message: 'If an account exists with that email, a password reset link has been sent'
75
+ });
76
+ }
77
+ catch (error) {
78
+ cmsLogger.error('Failed to request password reset:', error);
79
+ return c.json({
80
+ success: false,
81
+ error: 'Failed to request password reset',
82
+ message: error instanceof Error ? error.message : 'Unknown error'
83
+ }, 500);
84
+ }
85
+ })
86
+ .post('/reset-password', zValidator('json', resetPasswordRequest, (result, c) => {
87
+ if (!result.success) {
88
+ return c.json({
89
+ success: false,
90
+ error: 'Missing required fields',
91
+ message: 'token and newPassword are required',
92
+ issues: result.error.issues
93
+ }, 400);
94
+ }
95
+ }), async (c) => {
96
+ try {
97
+ const provider = c.var.aphexCMS.auth;
98
+ if (!provider) {
99
+ return c.json({ success: false, error: 'Auth provider not configured' }, 500);
100
+ }
101
+ const { token, newPassword } = c.req.valid('json');
102
+ await provider.resetPassword(token, newPassword);
103
+ return c.json({ success: true, message: 'Password reset successfully' });
104
+ }
105
+ catch (error) {
106
+ cmsLogger.error('Failed to reset password:', error);
107
+ return c.json({
108
+ success: false,
109
+ error: 'Failed to reset password',
110
+ message: error instanceof Error ? error.message : 'Invalid or expired token'
111
+ }, 500);
112
+ }
113
+ });
@@ -13,7 +13,8 @@ export * from '../storage/providers/storage.js';
13
13
  export * from '../services/index.js';
14
14
  export { AssetService } from '../services/asset-service.js';
15
15
  export { RolesService } from '../services/roles-service.js';
16
- export * from '../routes-exports.js';
16
+ export { GET as serveAssetCDN } from '../routes/assets-cdn.js';
17
+ export { createAphexApi, mountAphexBuiltins, toHonoHandler, type AphexEnv } from './api/index.js';
17
18
  export * from '../schema-utils/index.js';
18
19
  export { createHashForPublishing } from '../utils/content-hash.js';
19
20
  export { createGraphQLHandler, type GraphQLConfig, type GraphQLSettings, type GraphQLHandlerResult } from '../graphql/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5D,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAIzD,cAAc,mBAAmB,CAAC;AAGlC,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EACN,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/server/index.ts"],"names":[],"mappings":"AAIA,cAAc,gBAAgB,CAAC;AAE/B,cAAc,kBAAkB,CAAC;AAEjC,cAAc,gBAAgB,CAAC;AAE/B,cAAc,gBAAgB,CAAC;AAG/B,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAG5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG5D,cAAc,wBAAwB,CAAC;AAGvC,cAAc,kBAAkB,CAAC;AACjC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,8BAA8B,CAAC;AAG7C,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAKzD,OAAO,EAAE,GAAG,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAI5D,OAAO,EACN,cAAc,EACd,kBAAkB,EAClB,aAAa,EACb,KAAK,QAAQ,EACb,MAAM,aAAa,CAAC;AAGrB,cAAc,uBAAuB,CAAC;AAGtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGhE,OAAO,EACN,oBAAoB,EACpB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACN,QAAQ,EACR,cAAc,EACd,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,MAAM,oBAAoB,CAAC"}
@@ -23,9 +23,13 @@ export * from '../storage/providers/storage.js';
23
23
  export * from '../services/index.js';
24
24
  export { AssetService } from '../services/asset-service.js';
25
25
  export { RolesService } from '../services/roles-service.js';
26
- // API Route handlers (for re-exporting in your app's API routes)
27
- // Re-export from routes-exports to avoid .js extension issues in workspace
28
- export * from '../routes-exports.js';
26
+ // CDN handler re-exported for the studio/template `media/[id]/[filename]/
27
+ // +server.ts` shim. Lives outside `/api` (URLs are baked into published
28
+ // documents, can't move onto the catch-all without breaking links).
29
+ export { GET as serveAssetCDN } from '../routes/assets-cdn.js';
30
+ // Hono API app — exposed so user apps (and tests) can construct or extend
31
+ // the same router the SK catch-all forwards to.
32
+ export { createAphexApi, mountAphexBuiltins, toHonoHandler } from './api/index.js';
29
33
  // Schema utilities
30
34
  export * from '../schema-utils/index.js';
31
35
  // Content hash utilities (server-side)