@dyrected/core 2.6.3 → 2.7.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 (354) hide show
  1. package/dist/__tests__/access-features.test.d.ts +2 -0
  2. package/dist/__tests__/access-features.test.d.ts.map +1 -0
  3. package/dist/__tests__/access-features.test.js +159 -0
  4. package/dist/__tests__/access-features.test.js.map +1 -0
  5. package/dist/__tests__/access-parity.test.d.ts +2 -0
  6. package/dist/__tests__/access-parity.test.d.ts.map +1 -0
  7. package/dist/__tests__/access-parity.test.js +338 -0
  8. package/dist/__tests__/access-parity.test.js.map +1 -0
  9. package/dist/__tests__/access.test.d.ts +2 -0
  10. package/dist/__tests__/access.test.d.ts.map +1 -0
  11. package/dist/__tests__/access.test.js +137 -0
  12. package/dist/__tests__/access.test.js.map +1 -0
  13. package/dist/__tests__/admin-auth.test.d.ts +2 -0
  14. package/dist/__tests__/admin-auth.test.d.ts.map +1 -0
  15. package/dist/__tests__/admin-auth.test.js +440 -0
  16. package/dist/__tests__/admin-auth.test.js.map +1 -0
  17. package/dist/__tests__/app.test.d.ts +2 -0
  18. package/dist/__tests__/app.test.d.ts.map +1 -0
  19. package/dist/__tests__/app.test.js +112 -0
  20. package/dist/__tests__/app.test.js.map +1 -0
  21. package/dist/__tests__/audit.test.d.ts +2 -0
  22. package/dist/__tests__/audit.test.d.ts.map +1 -0
  23. package/dist/__tests__/audit.test.js +125 -0
  24. package/dist/__tests__/audit.test.js.map +1 -0
  25. package/dist/__tests__/auth-hydration.test.d.ts +2 -0
  26. package/dist/__tests__/auth-hydration.test.d.ts.map +1 -0
  27. package/dist/__tests__/auth-hydration.test.js +90 -0
  28. package/dist/__tests__/auth-hydration.test.js.map +1 -0
  29. package/dist/__tests__/auth-invite.test.d.ts +2 -0
  30. package/dist/__tests__/auth-invite.test.d.ts.map +1 -0
  31. package/dist/__tests__/auth-invite.test.js +152 -0
  32. package/dist/__tests__/auth-invite.test.js.map +1 -0
  33. package/dist/__tests__/auth-lockout.test.d.ts +2 -0
  34. package/dist/__tests__/auth-lockout.test.d.ts.map +1 -0
  35. package/dist/__tests__/auth-lockout.test.js +154 -0
  36. package/dist/__tests__/auth-lockout.test.js.map +1 -0
  37. package/dist/__tests__/auth-sessions.test.d.ts +2 -0
  38. package/dist/__tests__/auth-sessions.test.d.ts.map +1 -0
  39. package/dist/__tests__/auth-sessions.test.js +118 -0
  40. package/dist/__tests__/auth-sessions.test.js.map +1 -0
  41. package/dist/__tests__/config.test.d.ts +2 -0
  42. package/dist/__tests__/config.test.d.ts.map +1 -0
  43. package/dist/__tests__/config.test.js +402 -0
  44. package/dist/__tests__/config.test.js.map +1 -0
  45. package/dist/__tests__/define-field.test.d.ts +2 -0
  46. package/dist/__tests__/define-field.test.d.ts.map +1 -0
  47. package/dist/__tests__/define-field.test.js +121 -0
  48. package/dist/__tests__/define-field.test.js.map +1 -0
  49. package/dist/__tests__/deleteMany.test.d.ts +2 -0
  50. package/dist/__tests__/deleteMany.test.d.ts.map +1 -0
  51. package/dist/__tests__/deleteMany.test.js +75 -0
  52. package/dist/__tests__/deleteMany.test.js.map +1 -0
  53. package/dist/__tests__/depth.test.d.ts +2 -0
  54. package/dist/__tests__/depth.test.d.ts.map +1 -0
  55. package/dist/__tests__/depth.test.js +115 -0
  56. package/dist/__tests__/depth.test.js.map +1 -0
  57. package/dist/__tests__/dynamic-options.test.d.ts +2 -0
  58. package/dist/__tests__/dynamic-options.test.d.ts.map +1 -0
  59. package/dist/__tests__/dynamic-options.test.js +168 -0
  60. package/dist/__tests__/dynamic-options.test.js.map +1 -0
  61. package/dist/__tests__/email.service.test.d.ts +2 -0
  62. package/dist/__tests__/email.service.test.d.ts.map +1 -0
  63. package/dist/__tests__/email.service.test.js +52 -0
  64. package/dist/__tests__/email.service.test.js.map +1 -0
  65. package/dist/__tests__/field-inference.test-types.d.ts +161 -0
  66. package/dist/__tests__/field-inference.test-types.d.ts.map +1 -0
  67. package/dist/__tests__/field-inference.test-types.js +87 -0
  68. package/dist/__tests__/field-inference.test-types.js.map +1 -0
  69. package/dist/__tests__/fixtures/editorial-workflow.d.ts +14 -0
  70. package/dist/__tests__/fixtures/editorial-workflow.d.ts.map +1 -0
  71. package/dist/__tests__/fixtures/editorial-workflow.js +12 -0
  72. package/dist/__tests__/fixtures/editorial-workflow.js.map +1 -0
  73. package/dist/__tests__/hooks.test.d.ts +2 -0
  74. package/dist/__tests__/hooks.test.d.ts.map +1 -0
  75. package/dist/__tests__/hooks.test.js +320 -0
  76. package/dist/__tests__/hooks.test.js.map +1 -0
  77. package/dist/__tests__/mocks.d.ts +75 -0
  78. package/dist/__tests__/mocks.d.ts.map +1 -0
  79. package/dist/__tests__/mocks.js +170 -0
  80. package/dist/__tests__/mocks.js.map +1 -0
  81. package/dist/__tests__/observability.test.d.ts +2 -0
  82. package/dist/__tests__/observability.test.d.ts.map +1 -0
  83. package/dist/__tests__/observability.test.js +233 -0
  84. package/dist/__tests__/observability.test.js.map +1 -0
  85. package/dist/__tests__/openapi.test.d.ts +2 -0
  86. package/dist/__tests__/openapi.test.d.ts.map +1 -0
  87. package/dist/__tests__/openapi.test.js +105 -0
  88. package/dist/__tests__/openapi.test.js.map +1 -0
  89. package/dist/__tests__/parse-sort.test.d.ts +2 -0
  90. package/dist/__tests__/parse-sort.test.d.ts.map +1 -0
  91. package/dist/__tests__/parse-sort.test.js +24 -0
  92. package/dist/__tests__/parse-sort.test.js.map +1 -0
  93. package/dist/__tests__/preferences.test.d.ts +2 -0
  94. package/dist/__tests__/preferences.test.d.ts.map +1 -0
  95. package/dist/__tests__/preferences.test.js +168 -0
  96. package/dist/__tests__/preferences.test.js.map +1 -0
  97. package/dist/__tests__/router.test.d.ts +2 -0
  98. package/dist/__tests__/router.test.d.ts.map +1 -0
  99. package/dist/__tests__/router.test.js +70 -0
  100. package/dist/__tests__/router.test.js.map +1 -0
  101. package/dist/__tests__/search.test.d.ts +2 -0
  102. package/dist/__tests__/search.test.d.ts.map +1 -0
  103. package/dist/__tests__/search.test.js +174 -0
  104. package/dist/__tests__/search.test.js.map +1 -0
  105. package/dist/__tests__/upload-validation.test.d.ts +2 -0
  106. package/dist/__tests__/upload-validation.test.d.ts.map +1 -0
  107. package/dist/__tests__/upload-validation.test.js +41 -0
  108. package/dist/__tests__/upload-validation.test.js.map +1 -0
  109. package/dist/__tests__/where.test.d.ts +2 -0
  110. package/dist/__tests__/where.test.d.ts.map +1 -0
  111. package/dist/__tests__/where.test.js +105 -0
  112. package/dist/__tests__/where.test.js.map +1 -0
  113. package/dist/__tests__/workflow.test.d.ts +2 -0
  114. package/dist/__tests__/workflow.test.d.ts.map +1 -0
  115. package/dist/__tests__/workflow.test.js +684 -0
  116. package/dist/__tests__/workflow.test.js.map +1 -0
  117. package/dist/app-config-C9VJ6rTv.d.cts +2092 -0
  118. package/dist/app-config-C9VJ6rTv.d.ts +2092 -0
  119. package/dist/app-config-CYV70eoF.d.cts +2100 -0
  120. package/dist/app-config-CYV70eoF.d.ts +2100 -0
  121. package/dist/app-config-ChsrBB7p.d.cts +2100 -0
  122. package/dist/app-config-ChsrBB7p.d.ts +2100 -0
  123. package/dist/app.d.ts +35 -0
  124. package/dist/app.d.ts.map +1 -0
  125. package/dist/app.js +164 -0
  126. package/dist/app.js.map +1 -0
  127. package/dist/auth/access.d.ts +5 -0
  128. package/dist/auth/access.d.ts.map +1 -0
  129. package/dist/auth/access.js +59 -0
  130. package/dist/auth/access.js.map +1 -0
  131. package/dist/auth/jexl.d.ts +13 -0
  132. package/dist/auth/jexl.d.ts.map +1 -0
  133. package/dist/auth/jexl.js +30 -0
  134. package/dist/auth/jexl.js.map +1 -0
  135. package/dist/auth/lockout.d.ts +11 -0
  136. package/dist/auth/lockout.d.ts.map +1 -0
  137. package/dist/auth/lockout.js +37 -0
  138. package/dist/auth/lockout.js.map +1 -0
  139. package/dist/auth/password.d.ts +10 -0
  140. package/dist/auth/password.d.ts.map +1 -0
  141. package/dist/auth/password.js +28 -0
  142. package/dist/auth/password.js.map +1 -0
  143. package/dist/auth/sessions.d.ts +39 -0
  144. package/dist/auth/sessions.d.ts.map +1 -0
  145. package/dist/auth/sessions.js +126 -0
  146. package/dist/auth/sessions.js.map +1 -0
  147. package/dist/auth/token.d.ts +23 -0
  148. package/dist/auth/token.d.ts.map +1 -0
  149. package/dist/auth/token.js +40 -0
  150. package/dist/auth/token.js.map +1 -0
  151. package/dist/chunk-23NM4LDU.js +2883 -0
  152. package/dist/chunk-2TKDCCIR.js +2622 -0
  153. package/dist/chunk-3SFITPX4.js +2628 -0
  154. package/dist/chunk-CQVTQ67D.js +2632 -0
  155. package/dist/chunk-ELHRRPKX.js +2863 -0
  156. package/dist/chunk-HRLSFTLR.js +3061 -0
  157. package/dist/chunk-QTIAQBNH.js +3097 -0
  158. package/dist/chunk-T2DGC4MD.js +3008 -0
  159. package/dist/chunk-TLU77TLE.js +3203 -0
  160. package/dist/chunk-YEBCT77K.js +3269 -0
  161. package/dist/chunk-YXEKNN5X.js +3085 -0
  162. package/dist/controllers/admin-auth.controller.d.ts +71 -0
  163. package/dist/controllers/admin-auth.controller.d.ts.map +1 -0
  164. package/dist/controllers/admin-auth.controller.js +450 -0
  165. package/dist/controllers/admin-auth.controller.js.map +1 -0
  166. package/dist/controllers/audit.controller.d.ts +42 -0
  167. package/dist/controllers/audit.controller.d.ts.map +1 -0
  168. package/dist/controllers/audit.controller.js +149 -0
  169. package/dist/controllers/audit.controller.js.map +1 -0
  170. package/dist/controllers/auth.controller.d.ts +143 -0
  171. package/dist/controllers/auth.controller.d.ts.map +1 -0
  172. package/dist/controllers/auth.controller.js +572 -0
  173. package/dist/controllers/auth.controller.js.map +1 -0
  174. package/dist/controllers/collection.controller.d.ts +170 -0
  175. package/dist/controllers/collection.controller.d.ts.map +1 -0
  176. package/dist/controllers/collection.controller.js +1033 -0
  177. package/dist/controllers/collection.controller.js.map +1 -0
  178. package/dist/controllers/global.controller.d.ts +20 -0
  179. package/dist/controllers/global.controller.d.ts.map +1 -0
  180. package/dist/controllers/global.controller.js +182 -0
  181. package/dist/controllers/global.controller.js.map +1 -0
  182. package/dist/controllers/media.controller.d.ts +39 -0
  183. package/dist/controllers/media.controller.d.ts.map +1 -0
  184. package/dist/controllers/media.controller.js +178 -0
  185. package/dist/controllers/media.controller.js.map +1 -0
  186. package/dist/controllers/preview.controller.d.ts +37 -0
  187. package/dist/controllers/preview.controller.d.ts.map +1 -0
  188. package/dist/controllers/preview.controller.js +48 -0
  189. package/dist/controllers/preview.controller.js.map +1 -0
  190. package/dist/index.cjs +707 -27
  191. package/dist/index.d.cts +77 -5
  192. package/dist/index.d.ts +77 -5
  193. package/dist/index.d.ts.map +1 -0
  194. package/dist/index.js +37 -1
  195. package/dist/index.js.map +1 -0
  196. package/dist/middleware/auth.d.ts +19 -0
  197. package/dist/middleware/auth.d.ts.map +1 -0
  198. package/dist/middleware/auth.js +157 -0
  199. package/dist/middleware/auth.js.map +1 -0
  200. package/dist/middleware/rate-limit.d.ts +9 -0
  201. package/dist/middleware/rate-limit.d.ts.map +1 -0
  202. package/dist/middleware/rate-limit.js +75 -0
  203. package/dist/middleware/rate-limit.js.map +1 -0
  204. package/dist/network.d.ts +6 -0
  205. package/dist/network.d.ts.map +1 -0
  206. package/dist/network.js +70 -0
  207. package/dist/network.js.map +1 -0
  208. package/dist/observability.d.ts +113 -0
  209. package/dist/observability.d.ts.map +1 -0
  210. package/dist/observability.js +497 -0
  211. package/dist/observability.js.map +1 -0
  212. package/dist/router.d.ts +8 -0
  213. package/dist/router.d.ts.map +1 -0
  214. package/dist/router.js +704 -0
  215. package/dist/router.js.map +1 -0
  216. package/dist/server.cjs +861 -54
  217. package/dist/server.d.cts +9 -1
  218. package/dist/server.d.ts +9 -1
  219. package/dist/server.d.ts.map +1 -0
  220. package/dist/server.js +189 -26
  221. package/dist/server.js.map +1 -0
  222. package/dist/services/audit.service.d.ts +23 -0
  223. package/dist/services/audit.service.d.ts.map +1 -0
  224. package/dist/services/audit.service.js +39 -0
  225. package/dist/services/audit.service.js.map +1 -0
  226. package/dist/services/defaults.service.d.ts +8 -0
  227. package/dist/services/defaults.service.d.ts.map +1 -0
  228. package/dist/services/defaults.service.js +55 -0
  229. package/dist/services/defaults.service.js.map +1 -0
  230. package/dist/services/email-template.d.ts +46 -0
  231. package/dist/services/email-template.d.ts.map +1 -0
  232. package/dist/services/email-template.js +88 -0
  233. package/dist/services/email-template.js.map +1 -0
  234. package/dist/services/email.service.d.ts +34 -0
  235. package/dist/services/email.service.d.ts.map +1 -0
  236. package/dist/services/email.service.js +129 -0
  237. package/dist/services/email.service.js.map +1 -0
  238. package/dist/services/media.service.d.ts +20 -0
  239. package/dist/services/media.service.d.ts.map +1 -0
  240. package/dist/services/media.service.js +49 -0
  241. package/dist/services/media.service.js.map +1 -0
  242. package/dist/services/population.service.d.ts +20 -0
  243. package/dist/services/population.service.d.ts.map +1 -0
  244. package/dist/services/population.service.js +224 -0
  245. package/dist/services/population.service.js.map +1 -0
  246. package/dist/types/access.d.ts +48 -0
  247. package/dist/types/access.d.ts.map +1 -0
  248. package/dist/types/access.js +2 -0
  249. package/dist/types/access.js.map +1 -0
  250. package/dist/types/adapters.d.ts +152 -0
  251. package/dist/types/adapters.d.ts.map +1 -0
  252. package/dist/types/adapters.js +2 -0
  253. package/dist/types/adapters.js.map +1 -0
  254. package/dist/types/admin-auth.d.ts +132 -0
  255. package/dist/types/admin-auth.d.ts.map +1 -0
  256. package/dist/types/admin-auth.js +2 -0
  257. package/dist/types/admin-auth.js.map +1 -0
  258. package/dist/types/admin.d.ts +86 -0
  259. package/dist/types/admin.d.ts.map +1 -0
  260. package/dist/types/admin.js +2 -0
  261. package/dist/types/admin.js.map +1 -0
  262. package/dist/types/app-config.d.ts +279 -0
  263. package/dist/types/app-config.d.ts.map +1 -0
  264. package/dist/types/app-config.js +2 -0
  265. package/dist/types/app-config.js.map +1 -0
  266. package/dist/types/documents.d.ts +65 -0
  267. package/dist/types/documents.d.ts.map +1 -0
  268. package/dist/types/documents.js +2 -0
  269. package/dist/types/documents.js.map +1 -0
  270. package/dist/types/hooks.d.ts +122 -0
  271. package/dist/types/hooks.d.ts.map +1 -0
  272. package/dist/types/hooks.js +2 -0
  273. package/dist/types/hooks.js.map +1 -0
  274. package/dist/types/index.d.ts +13 -0
  275. package/dist/types/index.d.ts.map +1 -0
  276. package/dist/types/index.js +13 -0
  277. package/dist/types/index.js.map +1 -0
  278. package/dist/types/request.d.ts +42 -0
  279. package/dist/types/request.d.ts.map +1 -0
  280. package/dist/types/request.js +2 -0
  281. package/dist/types/request.js.map +1 -0
  282. package/dist/types/schema-config.d.ts +443 -0
  283. package/dist/types/schema-config.d.ts.map +1 -0
  284. package/dist/types/schema-config.js +2 -0
  285. package/dist/types/schema-config.js.map +1 -0
  286. package/dist/types/schema-core.d.ts +628 -0
  287. package/dist/types/schema-core.d.ts.map +1 -0
  288. package/dist/types/schema-core.js +2 -0
  289. package/dist/types/schema-core.js.map +1 -0
  290. package/dist/types/schema-inference.d.ts +73 -0
  291. package/dist/types/schema-inference.d.ts.map +1 -0
  292. package/dist/types/schema-inference.js +2 -0
  293. package/dist/types/schema-inference.js.map +1 -0
  294. package/dist/types/workflows.d.ts +121 -0
  295. package/dist/types/workflows.d.ts.map +1 -0
  296. package/dist/types/workflows.js +7 -0
  297. package/dist/types/workflows.js.map +1 -0
  298. package/dist/utils/access-control.d.ts +35 -0
  299. package/dist/utils/access-control.d.ts.map +1 -0
  300. package/dist/utils/access-control.js +161 -0
  301. package/dist/utils/access-control.js.map +1 -0
  302. package/dist/utils/admin-auth.d.ts +5 -0
  303. package/dist/utils/admin-auth.d.ts.map +1 -0
  304. package/dist/utils/admin-auth.js +39 -0
  305. package/dist/utils/admin-auth.js.map +1 -0
  306. package/dist/utils/block-references.d.ts +10 -0
  307. package/dist/utils/block-references.d.ts.map +1 -0
  308. package/dist/utils/block-references.js +100 -0
  309. package/dist/utils/block-references.js.map +1 -0
  310. package/dist/utils/collection-search.d.ts +11 -0
  311. package/dist/utils/collection-search.d.ts.map +1 -0
  312. package/dist/utils/collection-search.js +204 -0
  313. package/dist/utils/collection-search.js.map +1 -0
  314. package/dist/utils/config.d.ts +8 -0
  315. package/dist/utils/config.d.ts.map +1 -0
  316. package/dist/utils/config.js +336 -0
  317. package/dist/utils/config.js.map +1 -0
  318. package/dist/utils/hooks.d.ts +41 -0
  319. package/dist/utils/hooks.d.ts.map +1 -0
  320. package/dist/utils/hooks.js +177 -0
  321. package/dist/utils/hooks.js.map +1 -0
  322. package/dist/utils/openapi.d.ts +6 -0
  323. package/dist/utils/openapi.d.ts.map +1 -0
  324. package/dist/utils/openapi.js +981 -0
  325. package/dist/utils/openapi.js.map +1 -0
  326. package/dist/utils/parse-sort.d.ts +43 -0
  327. package/dist/utils/parse-sort.d.ts.map +1 -0
  328. package/dist/utils/parse-sort.js +70 -0
  329. package/dist/utils/parse-sort.js.map +1 -0
  330. package/dist/utils/parse-where.d.ts +69 -0
  331. package/dist/utils/parse-where.d.ts.map +1 -0
  332. package/dist/utils/parse-where.js +202 -0
  333. package/dist/utils/parse-where.js.map +1 -0
  334. package/dist/utils/readonly-db.d.ts +9 -0
  335. package/dist/utils/readonly-db.d.ts.map +1 -0
  336. package/dist/utils/readonly-db.js +21 -0
  337. package/dist/utils/readonly-db.js.map +1 -0
  338. package/dist/utils/swagger.d.ts +11 -0
  339. package/dist/utils/swagger.d.ts.map +1 -0
  340. package/dist/utils/swagger.js +62 -0
  341. package/dist/utils/swagger.js.map +1 -0
  342. package/dist/utils/upload-validation.d.ts +23 -0
  343. package/dist/utils/upload-validation.d.ts.map +1 -0
  344. package/dist/utils/upload-validation.js +46 -0
  345. package/dist/utils/upload-validation.js.map +1 -0
  346. package/dist/utils/where-sanitizer.d.ts +10 -0
  347. package/dist/utils/where-sanitizer.d.ts.map +1 -0
  348. package/dist/utils/where-sanitizer.js +67 -0
  349. package/dist/utils/where-sanitizer.js.map +1 -0
  350. package/dist/workflows.d.ts +86 -0
  351. package/dist/workflows.d.ts.map +1 -0
  352. package/dist/workflows.js +405 -0
  353. package/dist/workflows.js.map +1 -0
  354. package/package.json +1 -1
@@ -0,0 +1,55 @@
1
+ export class DefaultsService {
2
+ /**
3
+ * Recursively apply default values to a data object based on field definitions.
4
+ */
5
+ static apply(fields, data = {}) {
6
+ const result = { ...(data || {}) };
7
+ fields.forEach((field) => {
8
+ if (field.type === 'join')
9
+ return;
10
+ if (field.type === 'row' && field.fields) {
11
+ Object.assign(result, this.apply(field.fields, data));
12
+ return;
13
+ }
14
+ if (!field.name)
15
+ return;
16
+ let value = result[field.name];
17
+ // If value is missing, check if it was renamed (migration support)
18
+ if ((value === undefined || value === null) && field.renameTo) {
19
+ const legacyValue = result[field.renameTo];
20
+ if (legacyValue !== undefined && legacyValue !== null) {
21
+ value = legacyValue;
22
+ result[field.name] = legacyValue;
23
+ }
24
+ }
25
+ // If value is missing or null, apply defaultValue
26
+ if (value === undefined || value === null) {
27
+ if (field.defaultValue !== undefined) {
28
+ result[field.name] = field.defaultValue;
29
+ }
30
+ else {
31
+ // Fallback to type-specific defaults if no defaultValue is provided
32
+ if (field.type === 'boolean')
33
+ result[field.name] = false;
34
+ else if (field.type === 'array')
35
+ result[field.name] = [];
36
+ else if (field.type === 'multiSelect')
37
+ result[field.name] = [];
38
+ else if (field.type === 'object') {
39
+ result[field.name] = this.apply(field.fields || [], {});
40
+ }
41
+ }
42
+ }
43
+ else if (field.type === 'object' && field.fields) {
44
+ // Recursively apply to existing object
45
+ result[field.name] = this.apply(field.fields, value);
46
+ }
47
+ else if (field.type === 'array' && field.fields && Array.isArray(value)) {
48
+ // Recursively apply to items in array
49
+ result[field.name] = value.map((item) => this.apply(field.fields, item));
50
+ }
51
+ });
52
+ return result;
53
+ }
54
+ }
55
+ //# sourceMappingURL=defaults.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.service.js","sourceRoot":"","sources":["../../src/services/defaults.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ export declare const emailTokens: {
2
+ readonly colors: {
3
+ readonly canvas: "#f6f7f2";
4
+ readonly surface: "#ffffff";
5
+ readonly text: "#171717";
6
+ readonly muted: "#62665b";
7
+ readonly subtle: "#8a8f82";
8
+ readonly border: "#dde0d7";
9
+ readonly accent: "#b6ff2e";
10
+ readonly code: "#f1f3ec";
11
+ readonly dangerSurface: "#fff2f0";
12
+ readonly dangerBorder: "#ffc9c2";
13
+ readonly dangerText: "#9f251b";
14
+ };
15
+ readonly font: "Arial, 'Helvetica Neue', Helvetica, sans-serif";
16
+ readonly mono: "'Courier New', Courier, monospace";
17
+ readonly radius: {
18
+ readonly card: "12px";
19
+ readonly control: "6px";
20
+ };
21
+ readonly width: "600px";
22
+ };
23
+ export declare function escapeHtml(value: string): string;
24
+ export declare function heading(content: string): string;
25
+ export declare function paragraph(content: string, margin?: string): string;
26
+ export declare function sectionLabel(content: string): string;
27
+ export declare function divider(): string;
28
+ export declare function spacer(height?: number): string;
29
+ export declare function row(content: string, cellStyle?: string): string;
30
+ export declare function table(content: string, style?: string): string;
31
+ export declare function detailBox(content: string, monospace?: boolean): string;
32
+ export declare function eventList(events: ReadonlyArray<{
33
+ label: string;
34
+ value: string;
35
+ }>): string;
36
+ export declare function ctaButton(label: string, href: string): string;
37
+ export declare function alertBox(content: string): string;
38
+ interface LayoutOptions {
39
+ preheader: string;
40
+ title: string;
41
+ content: string;
42
+ footer: string;
43
+ }
44
+ export declare function layout({ preheader, title, content, footer }: LayoutOptions): string;
45
+ export {};
46
+ //# sourceMappingURL=email-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-template.d.ts","sourceRoot":"","sources":["../../src/services/email-template.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;CAkBd,CAAC;AAEX,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQhD;AAWD,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAa,GAAG,MAAM,CAEtE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,wBAAgB,OAAO,IAAI,MAAM,CAEhC;AAED,wBAAgB,MAAM,CAAC,MAAM,SAAK,GAAG,MAAM,CAE1C;AAED,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAE3D;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAe,GAAG,MAAM,CAEnE;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,UAAQ,GAAG,MAAM,CAGpE;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CAKzF;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAO7D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,UAAU,aAAa;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,aAAa,GAAG,MAAM,CAkBnF"}
@@ -0,0 +1,88 @@
1
+ export const emailTokens = {
2
+ colors: {
3
+ canvas: '#f6f7f2',
4
+ surface: '#ffffff',
5
+ text: '#171717',
6
+ muted: '#62665b',
7
+ subtle: '#8a8f82',
8
+ border: '#dde0d7',
9
+ accent: '#b6ff2e',
10
+ code: '#f1f3ec',
11
+ dangerSurface: '#fff2f0',
12
+ dangerBorder: '#ffc9c2',
13
+ dangerText: '#9f251b',
14
+ },
15
+ font: "Arial, 'Helvetica Neue', Helvetica, sans-serif",
16
+ mono: "'Courier New', Courier, monospace",
17
+ radius: { card: '12px', control: '6px' },
18
+ width: '600px',
19
+ };
20
+ export function escapeHtml(value) {
21
+ return value.replace(/[&<>'"]/g, (character) => ({
22
+ '&': '&amp;',
23
+ '<': '&lt;',
24
+ '>': '&gt;',
25
+ "'": '&#39;',
26
+ '"': '&quot;',
27
+ })[character]);
28
+ }
29
+ function safeHttpUrl(value) {
30
+ try {
31
+ const url = new URL(value);
32
+ return url.protocol === 'https:' || url.protocol === 'http:' ? escapeHtml(url.toString()) : undefined;
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ }
38
+ export function heading(content) {
39
+ return `<h1 style="margin:0;font-family:${emailTokens.font};font-size:24px;line-height:1.25;font-weight:700;color:${emailTokens.colors.text}">${escapeHtml(content)}</h1>`;
40
+ }
41
+ export function paragraph(content, margin = '0 0 16px') {
42
+ return `<p style="margin:${margin};font-family:${emailTokens.font};font-size:15px;line-height:1.6;color:${emailTokens.colors.muted}">${escapeHtml(content)}</p>`;
43
+ }
44
+ export function sectionLabel(content) {
45
+ return `<p style="margin:0 0 8px;font-family:${emailTokens.font};font-size:11px;line-height:1.4;font-weight:700;letter-spacing:0.1em;text-transform:uppercase;color:${emailTokens.colors.subtle}">${escapeHtml(content)}</p>`;
46
+ }
47
+ export function divider() {
48
+ return `<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%"><tr><td style="height:1px;background:${emailTokens.colors.border};font-size:0;line-height:0">&nbsp;</td></tr></table>`;
49
+ }
50
+ export function spacer(height = 16) {
51
+ return table(row('&nbsp;', `height:${height}px;font-size:0;line-height:0`));
52
+ }
53
+ export function row(content, cellStyle = '') {
54
+ return `<tr><td style="${cellStyle}">${content}</td></tr>`;
55
+ }
56
+ export function table(content, style = 'width:100%') {
57
+ return `<table role="presentation" cellpadding="0" cellspacing="0" border="0" width="100%" style="${style}">${content}</table>`;
58
+ }
59
+ export function detailBox(content, monospace = false) {
60
+ const font = monospace ? emailTokens.mono : emailTokens.font;
61
+ return table(row(escapeHtml(content), `padding:14px 16px;font-family:${font};font-size:13px;line-height:1.5;font-weight:${monospace ? '400' : '700'};color:${emailTokens.colors.text};word-break:break-all`), `width:100%;background:${emailTokens.colors.code};border-radius:${emailTokens.radius.control}`);
62
+ }
63
+ export function eventList(events) {
64
+ return table(events.map(({ label, value }) => row(`${sectionLabel(label)}${paragraph(value, '0')}`, `padding:12px 0;border-bottom:1px solid ${emailTokens.colors.border}`)).join(''));
65
+ }
66
+ export function ctaButton(label, href) {
67
+ const safeHref = safeHttpUrl(href);
68
+ if (!safeHref)
69
+ return '';
70
+ return table(row(`<a href="${safeHref}" style="display:inline-block;padding:13px 22px;border-radius:${emailTokens.radius.control};background:${emailTokens.colors.accent};font-family:${emailTokens.font};font-size:14px;line-height:1.2;font-weight:700;color:${emailTokens.colors.text};text-decoration:none">${escapeHtml(label)}</a>`, 'padding:8px 0 24px'), 'width:auto');
71
+ }
72
+ export function alertBox(content) {
73
+ return table(row(escapeHtml(content), `padding:13px 16px;font-family:${emailTokens.font};font-size:13px;line-height:1.5;color:${emailTokens.colors.dangerText}`), `width:100%;background:${emailTokens.colors.dangerSurface};border:1px solid ${emailTokens.colors.dangerBorder};border-radius:${emailTokens.radius.control}`);
74
+ }
75
+ export function layout({ preheader, title, content, footer }) {
76
+ return `<!doctype html>
77
+ <html lang="en">
78
+ <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"></head>
79
+ <body style="margin:0;padding:0;background:${emailTokens.colors.canvas}">
80
+ <div style="display:none;max-height:0;overflow:hidden;opacity:0;color:transparent">${escapeHtml(preheader)}</div>
81
+ ${table(row(table(row('&nbsp;', `height:5px;background:${emailTokens.colors.accent};font-size:0;line-height:0`) +
82
+ row(`${sectionLabel('Dyrected')}${heading(title)}`, 'padding:30px 32px 24px') +
83
+ row(content, 'padding:0 32px 32px') +
84
+ row(`${divider()}${paragraph(footer, '20px 0 6px')}${paragraph('Privacy: this message contains account-related information; please avoid forwarding it.', '0')}`, 'padding:0 32px 28px'), `width:100%;max-width:${emailTokens.width};background:${emailTokens.colors.surface};border:1px solid ${emailTokens.colors.border};border-radius:${emailTokens.radius.card};overflow:hidden`), 'padding:32px 12px'), `width:100%;background:${emailTokens.colors.canvas}`)}
85
+ </body>
86
+ </html>`;
87
+ }
88
+ //# sourceMappingURL=email-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-template.js","sourceRoot":"","sources":["../../src/services/email-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { DyrectedConfig } from '../types/index.js';
2
+ export declare function sendEmail(config: DyrectedConfig, payload: {
3
+ to: string;
4
+ subject: string;
5
+ html: string;
6
+ }): Promise<void>;
7
+ export declare function buildWelcomeEmail(config: DyrectedConfig, args: {
8
+ email: string;
9
+ }): {
10
+ subject: string;
11
+ html: string;
12
+ };
13
+ export declare function buildInviteEmail(config: DyrectedConfig, args: {
14
+ token: string;
15
+ invitedByEmail?: string;
16
+ url?: string;
17
+ }): {
18
+ subject: string;
19
+ html: string;
20
+ };
21
+ export declare function buildResetPasswordEmail(config: DyrectedConfig, args: {
22
+ token: string;
23
+ url?: string;
24
+ }): {
25
+ subject: string;
26
+ html: string;
27
+ };
28
+ export declare function buildPasswordChangedEmail(config: DyrectedConfig, args: {
29
+ email: string;
30
+ }): {
31
+ subject: string;
32
+ html: string;
33
+ };
34
+ //# sourceMappingURL=email.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.service.d.ts","sourceRoot":"","sources":["../../src/services/email.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAsDxD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACrD,OAAO,CAAC,IAAI,CAAC,CAwBf;AAMD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWnC;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7D;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAcnC;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAYnC;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,cAAc,EACtB,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,GACtB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWnC"}
@@ -0,0 +1,129 @@
1
+ import { alertBox, ctaButton, detailBox, layout, paragraph, sectionLabel, spacer } from './email-template.js';
2
+ import { getConfigLogger, getObservabilityRuntime } from '../observability.js';
3
+ // Lazy Ethereal singleton — created once on first send in dev
4
+ let _devSend = null;
5
+ let _devSendPromise = null;
6
+ async function getDevSend() {
7
+ if (_devSend)
8
+ return _devSend;
9
+ if (_devSendPromise)
10
+ return _devSendPromise;
11
+ _devSendPromise = (async () => {
12
+ const logger = getConfigLogger(undefined, 'email');
13
+ try {
14
+ const nodemailer = await import('nodemailer');
15
+ const account = await nodemailer.default.createTestAccount();
16
+ const transport = nodemailer.default.createTransport({
17
+ host: 'smtp.ethereal.email',
18
+ port: 587,
19
+ auth: { user: account.user, pass: account.pass },
20
+ });
21
+ logger.info({
22
+ msg: 'No email config; using Ethereal for development email preview',
23
+ });
24
+ logger.info({
25
+ msg: 'Ethereal credentials',
26
+ loginUrl: 'https://ethereal.email',
27
+ user: account.user,
28
+ password: account.pass,
29
+ });
30
+ _devSend = async ({ to, subject, html }) => {
31
+ const info = await transport.sendMail({ from: '"Dyrected Dev" <dev@dyrected.local>', to, subject, html });
32
+ logger.info({
33
+ msg: 'Email preview URL',
34
+ previewUrl: nodemailer.default.getTestMessageUrl(info),
35
+ });
36
+ };
37
+ return _devSend;
38
+ }
39
+ catch {
40
+ logger.warn({
41
+ msg: 'nodemailer not available; development emails will not be sent',
42
+ });
43
+ return null;
44
+ }
45
+ })();
46
+ return _devSendPromise;
47
+ }
48
+ export async function sendEmail(config, payload) {
49
+ const logger = getConfigLogger(config, 'email');
50
+ const observability = getObservabilityRuntime(config);
51
+ if (config.email) {
52
+ try {
53
+ await config.email.send(payload);
54
+ }
55
+ catch (err) {
56
+ observability?.recordEmailSendFailure({
57
+ to: payload.to,
58
+ });
59
+ logger.error({
60
+ err,
61
+ msg: 'Email provider send failed',
62
+ to: payload.to,
63
+ subject: payload.subject,
64
+ });
65
+ throw err;
66
+ }
67
+ return;
68
+ }
69
+ if (process.env.NODE_ENV !== 'production') {
70
+ const devSend = await getDevSend();
71
+ await devSend?.(payload);
72
+ }
73
+ }
74
+ // ---------------------------------------------------------------------------
75
+ // Default email templates
76
+ // ---------------------------------------------------------------------------
77
+ export function buildWelcomeEmail(config, args) {
78
+ const custom = config.email?.templates?.welcome?.(args);
79
+ return {
80
+ subject: custom?.subject ?? 'Welcome — your account is ready',
81
+ html: custom?.html ?? layout({
82
+ preheader: 'Your Dyrected account is ready.',
83
+ title: 'Welcome — your account is ready',
84
+ content: `${paragraph('Your account has been created. You can now log in with:')}${detailBox(args.email)}`,
85
+ footer: "If you didn't create this account, you can safely ignore this email.",
86
+ }),
87
+ };
88
+ }
89
+ export function buildInviteEmail(config, args) {
90
+ const custom = config.email?.templates?.invite?.(args);
91
+ const inviteLink = args.url;
92
+ return {
93
+ subject: custom?.subject ?? "You've been invited",
94
+ html: custom?.html ?? layout({
95
+ preheader: "You've been invited to join a Dyrected account.",
96
+ title: "You've been invited",
97
+ content: inviteLink
98
+ ? `${args.invitedByEmail ? paragraph(`You were invited by ${args.invitedByEmail}.`) : ''}${paragraph('Use the invitation link below to create your account. The link expires in 7 days.')}${ctaButton('Accept invitation', inviteLink)}`
99
+ : `${args.invitedByEmail ? paragraph(`You were invited by ${args.invitedByEmail}.`) : ''}${paragraph('Use the invitation token below to accept your invitation. It expires in 7 days.')}${sectionLabel('Invitation token')}${detailBox(args.token, true)}`,
100
+ footer: "If you weren't expecting this invitation, you can safely ignore this email.",
101
+ }),
102
+ };
103
+ }
104
+ export function buildResetPasswordEmail(config, args) {
105
+ const custom = config.email?.templates?.resetPassword?.(args);
106
+ const resetLink = args.url;
107
+ return {
108
+ subject: custom?.subject ?? 'Reset your password',
109
+ html: custom?.html ?? layout({
110
+ preheader: 'Reset your Dyrected password.',
111
+ title: 'Reset your password',
112
+ content: `${paragraph('We received a request to reset your password. The reset link and token expire in 1 hour.')}${resetLink ? ctaButton('Reset password', resetLink) : ''}${sectionLabel(resetLink ? 'Or use this token' : 'Reset token')}${detailBox(args.token, true)}`,
113
+ footer: "If you didn't request a password reset, you can safely ignore this email.",
114
+ }),
115
+ };
116
+ }
117
+ export function buildPasswordChangedEmail(config, args) {
118
+ const custom = config.email?.templates?.passwordChanged?.(args);
119
+ return {
120
+ subject: custom?.subject ?? 'Your password has been changed',
121
+ html: custom?.html ?? layout({
122
+ preheader: 'Your Dyrected password was changed.',
123
+ title: 'Password changed',
124
+ content: `${paragraph('The password for this account was just changed:')}${detailBox(args.email)}${spacer()}${alertBox('If you did not make this change, please contact support immediately.')}`,
125
+ footer: 'This is an automated security notification.',
126
+ }),
127
+ };
128
+ }
129
+ //# sourceMappingURL=email.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.service.js","sourceRoot":"","sources":["../../src/services/email.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAI/E,8DAA8D;AAC9D,IAAI,QAAQ,GAAkB,IAAI,CAAC;AACnC,IAAI,eAAe,GAAkC,IAAI,CAAC;AAE1D,KAAK,UAAU,UAAU;IACvB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,eAAe;QAAE,OAAO,eAAe,CAAC;IAE5C,eAAe,GAAG,CAAC,KAAK,IAAI,EAAE;QAC5B,MAAM,MAAM,GAAG,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC7D,MAAM,SAAS,GAAG,UAAU,CAAC,OAAO,CAAC,eAAe,CAAC;gBACnD,IAAI,EAAE,qBAAqB;gBAC3B,IAAI,EAAE,GAAG;gBACT,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE;aACjD,CAAC,CAAC;YAEH,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,+DAA+D;aACrE,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,sBAAsB;gBAC3B,QAAQ,EAAE,wBAAwB;gBAClC,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,OAAO,CAAC,IAAI;aACvB,CAAC,CAAC;YAEH,QAAQ,GAAG,KAAK,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;gBACzC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC1G,MAAM,CAAC,IAAI,CAAC;oBACV,GAAG,EAAE,mBAAmB;oBACxB,UAAU,EAAE,UAAU,CAAC,OAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC;iBACvD,CAAC,CAAC;YACL,CAAC,CAAC;YACF,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,IAAI,CAAC;gBACV,GAAG,EAAE,+DAA+D;aACrE,CAAC,CAAC;YACH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,MAAsB,EACtB,OAAsD;IAEtD,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IACtD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,aAAa,EAAE,sBAAsB,CAAC;gBACpC,EAAE,EAAE,OAAO,CAAC,EAAE;aACf,CAAC,CAAC;YACH,MAAM,CAAC,KAAK,CAAC;gBACX,GAAG;gBACH,GAAG,EAAE,4BAA4B;gBACjC,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,OAAO,EAAE,OAAO,CAAC,OAAO;aACzB,CAAC,CAAC;YACH,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC1C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;QACnC,MAAM,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,0BAA0B;AAC1B,8EAA8E;AAE9E,MAAM,UAAU,iBAAiB,CAC/B,MAAsB,EACtB,IAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;IACxD,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,iCAAiC;QAC7D,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC;YAC3B,SAAS,EAAE,iCAAiC;YAC5C,KAAK,EAAE,iCAAiC;YACxC,OAAO,EAAE,GAAG,SAAS,CAAC,yDAAyD,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;YAC1G,MAAM,EAAE,sEAAsE;SAC/E,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAAsB,EACtB,IAA8D;IAE9D,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC;IAC5B,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,qBAAqB;QACjD,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC;YAC3B,SAAS,EAAE,iDAAiD;YAC5D,KAAK,EAAE,qBAAqB;YAC5B,OAAO,EAAE,UAAU;gBACjB,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,mFAAmF,CAAC,GAAG,SAAS,CAAC,mBAAmB,EAAE,UAAU,CAAC,EAAE;gBACxO,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,SAAS,CAAC,uBAAuB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,iFAAiF,CAAC,GAAG,YAAY,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;YAC5P,MAAM,EAAE,6EAA6E;SACtF,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,MAAsB,EACtB,IAAqC;IAErC,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3B,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,qBAAqB;QACjD,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC;YAC3B,SAAS,EAAE,+BAA+B;YAC1C,KAAK,EAAE,qBAAqB;YAC5B,OAAO,EAAE,GAAG,SAAS,CAAC,0FAA0F,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE;YAC3Q,MAAM,EAAE,2EAA2E;SACpF,CAAC;KACH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAAsB,EACtB,IAAuB;IAEvB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,CAAC,IAAI,CAAC,CAAC;IAChE,OAAO;QACL,OAAO,EAAE,MAAM,EAAE,OAAO,IAAI,gCAAgC;QAC5D,IAAI,EAAE,MAAM,EAAE,IAAI,IAAI,MAAM,CAAC;YAC3B,SAAS,EAAE,qCAAqC;YAChD,KAAK,EAAE,kBAAkB;YACzB,OAAO,EAAE,GAAG,SAAS,CAAC,iDAAiD,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,GAAG,QAAQ,CAAC,sEAAsE,CAAC,EAAE;YAChM,MAAM,EAAE,6CAA6C;SACtD,CAAC;KACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * MediaService handles background tasks for media assets,
3
+ * such as extracting metadata from external URLs (YouTube/Vimeo).
4
+ */
5
+ export declare class MediaService {
6
+ /**
7
+ * Fetches metadata for a given URL.
8
+ * Supports YouTube and Vimeo.
9
+ */
10
+ static fetchMetadata(url: string): Promise<{
11
+ provider: string;
12
+ provider_id: string;
13
+ thumbnail: string;
14
+ embedUrl: string;
15
+ type: "video";
16
+ } | null>;
17
+ private static extractYoutubeId;
18
+ private static extractVimeoId;
19
+ }
20
+ //# sourceMappingURL=media.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.service.d.ts","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;OAGG;WACU,aAAa,CAAC,GAAG,EAAE,MAAM;;;;;;;IAgCtC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAO/B,OAAO,CAAC,MAAM,CAAC,cAAc;CAM9B"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * MediaService handles background tasks for media assets,
3
+ * such as extracting metadata from external URLs (YouTube/Vimeo).
4
+ */
5
+ export class MediaService {
6
+ /**
7
+ * Fetches metadata for a given URL.
8
+ * Supports YouTube and Vimeo.
9
+ */
10
+ static async fetchMetadata(url) {
11
+ if (!url)
12
+ return null;
13
+ if (url.includes("youtube.com") || url.includes("youtu.be")) {
14
+ const videoId = this.extractYoutubeId(url);
15
+ if (videoId) {
16
+ return {
17
+ provider: "youtube",
18
+ provider_id: videoId,
19
+ thumbnail: `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,
20
+ embedUrl: `https://www.youtube.com/embed/${videoId}`,
21
+ type: "video",
22
+ };
23
+ }
24
+ }
25
+ if (url.includes("vimeo.com")) {
26
+ const vimeoId = this.extractVimeoId(url);
27
+ if (vimeoId) {
28
+ return {
29
+ provider: "vimeo",
30
+ provider_id: vimeoId,
31
+ thumbnail: "", // Requires oEmbed API for reliable thumbnails
32
+ embedUrl: `https://player.vimeo.com/video/${vimeoId}`,
33
+ type: "video",
34
+ };
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ static extractYoutubeId(url) {
40
+ const regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
41
+ const match = url.match(regExp);
42
+ return match && match[2].length === 11 ? match[2] : null;
43
+ }
44
+ static extractVimeoId(url) {
45
+ const match = url.match(/vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/(?:[^/]*)\/videos\/|album\/(?:\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)/);
46
+ return match ? match[1] : null;
47
+ }
48
+ }
49
+ //# sourceMappingURL=media.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.service.js","sourceRoot":"","sources":["../../src/services/media.service.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,YAAY;IACvB;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,GAAW;QACpC,IAAI,CAAC,GAAG;YAAE,OAAO,IAAI,CAAC;QAEtB,IAAI,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YAC3C,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;oBACL,QAAQ,EAAE,SAAS;oBACnB,WAAW,EAAE,OAAO;oBACpB,SAAS,EAAE,8BAA8B,OAAO,oBAAoB;oBACpE,QAAQ,EAAE,iCAAiC,OAAO,EAAE;oBACpD,IAAI,EAAE,OAAgB;iBACvB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACzC,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO;oBACL,QAAQ,EAAE,OAAO;oBACjB,WAAW,EAAE,OAAO;oBACpB,SAAS,EAAE,EAAE,EAAE,8CAA8C;oBAC7D,QAAQ,EAAE,kCAAkC,OAAO,EAAE;oBACrD,IAAI,EAAE,OAAgB;iBACvB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAAC,GAAW;QACzC,MAAM,MAAM,GACV,8DAA8D,CAAC;QACjE,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAChC,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3D,CAAC;IAEO,MAAM,CAAC,cAAc,CAAC,GAAW;QACvC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CACrB,kHAAkH,CACnH,CAAC;QACF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,20 @@
1
+ import type { CollectionConfig, DatabaseAdapter, Field, PaginatedResult } from "../types/index.js";
2
+ export declare class PopulationService {
3
+ private db;
4
+ private collections;
5
+ constructor(db: DatabaseAdapter, collections: CollectionConfig[]);
6
+ /**
7
+ * Recursively populate relationship fields in a document or array of documents.
8
+ */
9
+ populate(args: {
10
+ data: any;
11
+ fields: Field[];
12
+ currentDepth?: number;
13
+ maxDepth?: number;
14
+ }): Promise<any>;
15
+ /**
16
+ * Helper to populate a PaginatedResult
17
+ */
18
+ populateResult(result: PaginatedResult, fields: Field[], maxDepth: number): Promise<PaginatedResult>;
19
+ }
20
+ //# sourceMappingURL=population.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"population.service.d.ts","sourceRoot":"","sources":["../../src/services/population.service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,eAAe,EACf,KAAK,EACL,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAI3B,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,WAAW,CAAqB;gBAE5B,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE;IAKhE;;OAEG;IACG,QAAQ,CAAC,IAAI,EAAE;QACnB,IAAI,EAAE,GAAG,CAAC;QACV,MAAM,EAAE,KAAK,EAAE,CAAC;QAChB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,GAAG,CAAC;IAwPhB;;OAEG;IACG,cAAc,CAClB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,KAAK,EAAE,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,eAAe,CAAC;CAe5B"}