@dyrected/core 2.6.3 → 2.6.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 (352) 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.d.ts +35 -0
  122. package/dist/app.d.ts.map +1 -0
  123. package/dist/app.js +164 -0
  124. package/dist/app.js.map +1 -0
  125. package/dist/auth/access.d.ts +5 -0
  126. package/dist/auth/access.d.ts.map +1 -0
  127. package/dist/auth/access.js +59 -0
  128. package/dist/auth/access.js.map +1 -0
  129. package/dist/auth/jexl.d.ts +13 -0
  130. package/dist/auth/jexl.d.ts.map +1 -0
  131. package/dist/auth/jexl.js +30 -0
  132. package/dist/auth/jexl.js.map +1 -0
  133. package/dist/auth/lockout.d.ts +11 -0
  134. package/dist/auth/lockout.d.ts.map +1 -0
  135. package/dist/auth/lockout.js +37 -0
  136. package/dist/auth/lockout.js.map +1 -0
  137. package/dist/auth/password.d.ts +10 -0
  138. package/dist/auth/password.d.ts.map +1 -0
  139. package/dist/auth/password.js +28 -0
  140. package/dist/auth/password.js.map +1 -0
  141. package/dist/auth/sessions.d.ts +39 -0
  142. package/dist/auth/sessions.d.ts.map +1 -0
  143. package/dist/auth/sessions.js +126 -0
  144. package/dist/auth/sessions.js.map +1 -0
  145. package/dist/auth/token.d.ts +23 -0
  146. package/dist/auth/token.d.ts.map +1 -0
  147. package/dist/auth/token.js +40 -0
  148. package/dist/auth/token.js.map +1 -0
  149. package/dist/chunk-23NM4LDU.js +2883 -0
  150. package/dist/chunk-2TKDCCIR.js +2622 -0
  151. package/dist/chunk-3SFITPX4.js +2628 -0
  152. package/dist/chunk-CQVTQ67D.js +2632 -0
  153. package/dist/chunk-ELHRRPKX.js +2863 -0
  154. package/dist/chunk-HRLSFTLR.js +3061 -0
  155. package/dist/chunk-QTIAQBNH.js +3097 -0
  156. package/dist/chunk-T2DGC4MD.js +3008 -0
  157. package/dist/chunk-TLU77TLE.js +3203 -0
  158. package/dist/chunk-YEBCT77K.js +3269 -0
  159. package/dist/chunk-YXEKNN5X.js +3085 -0
  160. package/dist/controllers/admin-auth.controller.d.ts +71 -0
  161. package/dist/controllers/admin-auth.controller.d.ts.map +1 -0
  162. package/dist/controllers/admin-auth.controller.js +450 -0
  163. package/dist/controllers/admin-auth.controller.js.map +1 -0
  164. package/dist/controllers/audit.controller.d.ts +42 -0
  165. package/dist/controllers/audit.controller.d.ts.map +1 -0
  166. package/dist/controllers/audit.controller.js +149 -0
  167. package/dist/controllers/audit.controller.js.map +1 -0
  168. package/dist/controllers/auth.controller.d.ts +143 -0
  169. package/dist/controllers/auth.controller.d.ts.map +1 -0
  170. package/dist/controllers/auth.controller.js +572 -0
  171. package/dist/controllers/auth.controller.js.map +1 -0
  172. package/dist/controllers/collection.controller.d.ts +170 -0
  173. package/dist/controllers/collection.controller.d.ts.map +1 -0
  174. package/dist/controllers/collection.controller.js +1033 -0
  175. package/dist/controllers/collection.controller.js.map +1 -0
  176. package/dist/controllers/global.controller.d.ts +20 -0
  177. package/dist/controllers/global.controller.d.ts.map +1 -0
  178. package/dist/controllers/global.controller.js +182 -0
  179. package/dist/controllers/global.controller.js.map +1 -0
  180. package/dist/controllers/media.controller.d.ts +39 -0
  181. package/dist/controllers/media.controller.d.ts.map +1 -0
  182. package/dist/controllers/media.controller.js +178 -0
  183. package/dist/controllers/media.controller.js.map +1 -0
  184. package/dist/controllers/preview.controller.d.ts +37 -0
  185. package/dist/controllers/preview.controller.d.ts.map +1 -0
  186. package/dist/controllers/preview.controller.js +48 -0
  187. package/dist/controllers/preview.controller.js.map +1 -0
  188. package/dist/index.cjs +707 -27
  189. package/dist/index.d.cts +77 -5
  190. package/dist/index.d.ts +77 -5
  191. package/dist/index.d.ts.map +1 -0
  192. package/dist/index.js +37 -1
  193. package/dist/index.js.map +1 -0
  194. package/dist/middleware/auth.d.ts +19 -0
  195. package/dist/middleware/auth.d.ts.map +1 -0
  196. package/dist/middleware/auth.js +157 -0
  197. package/dist/middleware/auth.js.map +1 -0
  198. package/dist/middleware/rate-limit.d.ts +9 -0
  199. package/dist/middleware/rate-limit.d.ts.map +1 -0
  200. package/dist/middleware/rate-limit.js +75 -0
  201. package/dist/middleware/rate-limit.js.map +1 -0
  202. package/dist/network.d.ts +6 -0
  203. package/dist/network.d.ts.map +1 -0
  204. package/dist/network.js +70 -0
  205. package/dist/network.js.map +1 -0
  206. package/dist/observability.d.ts +113 -0
  207. package/dist/observability.d.ts.map +1 -0
  208. package/dist/observability.js +497 -0
  209. package/dist/observability.js.map +1 -0
  210. package/dist/router.d.ts +8 -0
  211. package/dist/router.d.ts.map +1 -0
  212. package/dist/router.js +704 -0
  213. package/dist/router.js.map +1 -0
  214. package/dist/server.cjs +861 -54
  215. package/dist/server.d.cts +9 -1
  216. package/dist/server.d.ts +9 -1
  217. package/dist/server.d.ts.map +1 -0
  218. package/dist/server.js +189 -26
  219. package/dist/server.js.map +1 -0
  220. package/dist/services/audit.service.d.ts +23 -0
  221. package/dist/services/audit.service.d.ts.map +1 -0
  222. package/dist/services/audit.service.js +39 -0
  223. package/dist/services/audit.service.js.map +1 -0
  224. package/dist/services/defaults.service.d.ts +8 -0
  225. package/dist/services/defaults.service.d.ts.map +1 -0
  226. package/dist/services/defaults.service.js +55 -0
  227. package/dist/services/defaults.service.js.map +1 -0
  228. package/dist/services/email-template.d.ts +46 -0
  229. package/dist/services/email-template.d.ts.map +1 -0
  230. package/dist/services/email-template.js +88 -0
  231. package/dist/services/email-template.js.map +1 -0
  232. package/dist/services/email.service.d.ts +34 -0
  233. package/dist/services/email.service.d.ts.map +1 -0
  234. package/dist/services/email.service.js +129 -0
  235. package/dist/services/email.service.js.map +1 -0
  236. package/dist/services/media.service.d.ts +20 -0
  237. package/dist/services/media.service.d.ts.map +1 -0
  238. package/dist/services/media.service.js +49 -0
  239. package/dist/services/media.service.js.map +1 -0
  240. package/dist/services/population.service.d.ts +20 -0
  241. package/dist/services/population.service.d.ts.map +1 -0
  242. package/dist/services/population.service.js +224 -0
  243. package/dist/services/population.service.js.map +1 -0
  244. package/dist/types/access.d.ts +48 -0
  245. package/dist/types/access.d.ts.map +1 -0
  246. package/dist/types/access.js +2 -0
  247. package/dist/types/access.js.map +1 -0
  248. package/dist/types/adapters.d.ts +152 -0
  249. package/dist/types/adapters.d.ts.map +1 -0
  250. package/dist/types/adapters.js +2 -0
  251. package/dist/types/adapters.js.map +1 -0
  252. package/dist/types/admin-auth.d.ts +132 -0
  253. package/dist/types/admin-auth.d.ts.map +1 -0
  254. package/dist/types/admin-auth.js +2 -0
  255. package/dist/types/admin-auth.js.map +1 -0
  256. package/dist/types/admin.d.ts +86 -0
  257. package/dist/types/admin.d.ts.map +1 -0
  258. package/dist/types/admin.js +2 -0
  259. package/dist/types/admin.js.map +1 -0
  260. package/dist/types/app-config.d.ts +279 -0
  261. package/dist/types/app-config.d.ts.map +1 -0
  262. package/dist/types/app-config.js +2 -0
  263. package/dist/types/app-config.js.map +1 -0
  264. package/dist/types/documents.d.ts +65 -0
  265. package/dist/types/documents.d.ts.map +1 -0
  266. package/dist/types/documents.js +2 -0
  267. package/dist/types/documents.js.map +1 -0
  268. package/dist/types/hooks.d.ts +122 -0
  269. package/dist/types/hooks.d.ts.map +1 -0
  270. package/dist/types/hooks.js +2 -0
  271. package/dist/types/hooks.js.map +1 -0
  272. package/dist/types/index.d.ts +13 -0
  273. package/dist/types/index.d.ts.map +1 -0
  274. package/dist/types/index.js +13 -0
  275. package/dist/types/index.js.map +1 -0
  276. package/dist/types/request.d.ts +42 -0
  277. package/dist/types/request.d.ts.map +1 -0
  278. package/dist/types/request.js +2 -0
  279. package/dist/types/request.js.map +1 -0
  280. package/dist/types/schema-config.d.ts +443 -0
  281. package/dist/types/schema-config.d.ts.map +1 -0
  282. package/dist/types/schema-config.js +2 -0
  283. package/dist/types/schema-config.js.map +1 -0
  284. package/dist/types/schema-core.d.ts +628 -0
  285. package/dist/types/schema-core.d.ts.map +1 -0
  286. package/dist/types/schema-core.js +2 -0
  287. package/dist/types/schema-core.js.map +1 -0
  288. package/dist/types/schema-inference.d.ts +73 -0
  289. package/dist/types/schema-inference.d.ts.map +1 -0
  290. package/dist/types/schema-inference.js +2 -0
  291. package/dist/types/schema-inference.js.map +1 -0
  292. package/dist/types/workflows.d.ts +121 -0
  293. package/dist/types/workflows.d.ts.map +1 -0
  294. package/dist/types/workflows.js +7 -0
  295. package/dist/types/workflows.js.map +1 -0
  296. package/dist/utils/access-control.d.ts +35 -0
  297. package/dist/utils/access-control.d.ts.map +1 -0
  298. package/dist/utils/access-control.js +161 -0
  299. package/dist/utils/access-control.js.map +1 -0
  300. package/dist/utils/admin-auth.d.ts +5 -0
  301. package/dist/utils/admin-auth.d.ts.map +1 -0
  302. package/dist/utils/admin-auth.js +39 -0
  303. package/dist/utils/admin-auth.js.map +1 -0
  304. package/dist/utils/block-references.d.ts +10 -0
  305. package/dist/utils/block-references.d.ts.map +1 -0
  306. package/dist/utils/block-references.js +100 -0
  307. package/dist/utils/block-references.js.map +1 -0
  308. package/dist/utils/collection-search.d.ts +11 -0
  309. package/dist/utils/collection-search.d.ts.map +1 -0
  310. package/dist/utils/collection-search.js +204 -0
  311. package/dist/utils/collection-search.js.map +1 -0
  312. package/dist/utils/config.d.ts +8 -0
  313. package/dist/utils/config.d.ts.map +1 -0
  314. package/dist/utils/config.js +336 -0
  315. package/dist/utils/config.js.map +1 -0
  316. package/dist/utils/hooks.d.ts +41 -0
  317. package/dist/utils/hooks.d.ts.map +1 -0
  318. package/dist/utils/hooks.js +177 -0
  319. package/dist/utils/hooks.js.map +1 -0
  320. package/dist/utils/openapi.d.ts +6 -0
  321. package/dist/utils/openapi.d.ts.map +1 -0
  322. package/dist/utils/openapi.js +981 -0
  323. package/dist/utils/openapi.js.map +1 -0
  324. package/dist/utils/parse-sort.d.ts +43 -0
  325. package/dist/utils/parse-sort.d.ts.map +1 -0
  326. package/dist/utils/parse-sort.js +70 -0
  327. package/dist/utils/parse-sort.js.map +1 -0
  328. package/dist/utils/parse-where.d.ts +69 -0
  329. package/dist/utils/parse-where.d.ts.map +1 -0
  330. package/dist/utils/parse-where.js +202 -0
  331. package/dist/utils/parse-where.js.map +1 -0
  332. package/dist/utils/readonly-db.d.ts +9 -0
  333. package/dist/utils/readonly-db.d.ts.map +1 -0
  334. package/dist/utils/readonly-db.js +21 -0
  335. package/dist/utils/readonly-db.js.map +1 -0
  336. package/dist/utils/swagger.d.ts +11 -0
  337. package/dist/utils/swagger.d.ts.map +1 -0
  338. package/dist/utils/swagger.js +62 -0
  339. package/dist/utils/swagger.js.map +1 -0
  340. package/dist/utils/upload-validation.d.ts +23 -0
  341. package/dist/utils/upload-validation.d.ts.map +1 -0
  342. package/dist/utils/upload-validation.js +46 -0
  343. package/dist/utils/upload-validation.js.map +1 -0
  344. package/dist/utils/where-sanitizer.d.ts +10 -0
  345. package/dist/utils/where-sanitizer.d.ts.map +1 -0
  346. package/dist/utils/where-sanitizer.js +67 -0
  347. package/dist/utils/where-sanitizer.js.map +1 -0
  348. package/dist/workflows.d.ts +86 -0
  349. package/dist/workflows.d.ts.map +1 -0
  350. package/dist/workflows.js +405 -0
  351. package/dist/workflows.js.map +1 -0
  352. package/package.json +1 -1
@@ -0,0 +1,11 @@
1
+ import type { CollectionConfig, Field, ReadonlyDatabaseAdapter } from "../types/index.js";
2
+ import type { WhereClause } from "./parse-where.js";
3
+ export declare function resolveCollectionTitleField(collection: CollectionConfig): Field | undefined;
4
+ export declare function getCollectionSearchableFields(collection: CollectionConfig): Field[];
5
+ export declare function buildCollectionSearchWhere(args: {
6
+ collection: CollectionConfig;
7
+ search: string | undefined;
8
+ db: ReadonlyDatabaseAdapter;
9
+ collections: CollectionConfig[];
10
+ }): Promise<WhereClause | undefined>;
11
+ //# sourceMappingURL=collection-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-search.d.ts","sourceRoot":"","sources":["../../src/utils/collection-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,KAAK,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AA8BpD,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,GAAG,SAAS,CAU3F;AAED,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,gBAAgB,GAAG,KAAK,EAAE,CAgCnF;AAoJD,wBAAsB,0BAA0B,CAAC,IAAI,EAAE;IACrD,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,EAAE,EAAE,uBAAuB,CAAC;IAC5B,WAAW,EAAE,gBAAgB,EAAE,CAAC;CACjC,GAAG,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CA+BnC"}
@@ -0,0 +1,204 @@
1
+ const DEFAULT_SEARCHABLE_NAMES = new Set([
2
+ "title",
3
+ "name",
4
+ "label",
5
+ "slug",
6
+ "email",
7
+ "caption",
8
+ "description",
9
+ ]);
10
+ const MAX_RELATION_MATCHES = 50;
11
+ const MAX_RELATION_TITLE_DEPTH = 8;
12
+ const TITLE_FALLBACK_NAMES = ["title", "name", "label", "heading", "email", "subject"];
13
+ function isScalarSearchField(field) {
14
+ return (field.type === "text" ||
15
+ field.type === "textarea" ||
16
+ field.type === "richText" ||
17
+ field.type === "email");
18
+ }
19
+ function findFieldByName(collection, fieldName) {
20
+ if (!fieldName)
21
+ return undefined;
22
+ return collection.fields.find((field) => field.name === fieldName);
23
+ }
24
+ export function resolveCollectionTitleField(collection) {
25
+ const configured = findFieldByName(collection, collection.admin?.useAsTitle);
26
+ if (configured)
27
+ return configured;
28
+ for (const name of TITLE_FALLBACK_NAMES) {
29
+ const field = findFieldByName(collection, name);
30
+ if (field)
31
+ return field;
32
+ }
33
+ return collection.fields.find((field) => !!field.name && field.type !== "join" && field.type !== "row");
34
+ }
35
+ export function getCollectionSearchableFields(collection) {
36
+ const fieldByName = new Map(collection.fields
37
+ .filter((field) => !!field.name)
38
+ .map((field) => [field.name, field]));
39
+ const configured = collection.admin?.searchableFields
40
+ ?.map((fieldName) => fieldByName.get(fieldName))
41
+ .filter((field) => !!field);
42
+ if (configured && configured.length > 0) {
43
+ return configured;
44
+ }
45
+ const results = [];
46
+ const pushUnique = (field) => {
47
+ if (!field?.name)
48
+ return;
49
+ if (results.some((item) => item.name === field.name))
50
+ return;
51
+ results.push(field);
52
+ };
53
+ pushUnique(findFieldByName(collection, collection.admin?.useAsTitle));
54
+ for (const field of collection.fields) {
55
+ if (!field.name)
56
+ continue;
57
+ if (isScalarSearchField(field) && DEFAULT_SEARCHABLE_NAMES.has(field.name)) {
58
+ pushUnique(field);
59
+ }
60
+ }
61
+ return results;
62
+ }
63
+ function buildScalarSearchClause(fieldName, search) {
64
+ return { [fieldName]: { contains: search } };
65
+ }
66
+ function getFallbackTitleFields(collection) {
67
+ const fields = [];
68
+ for (const name of TITLE_FALLBACK_NAMES) {
69
+ const field = findFieldByName(collection, name);
70
+ if (!field?.name || !isScalarSearchField(field))
71
+ continue;
72
+ if (fields.some((item) => item.name === field.name))
73
+ continue;
74
+ fields.push(field);
75
+ }
76
+ return fields;
77
+ }
78
+ async function findMatchingDocumentIdsByWhere(args) {
79
+ const { collection, where, db } = args;
80
+ if (!where)
81
+ return [];
82
+ const matches = await db.find({
83
+ collection: collection.slug,
84
+ where,
85
+ limit: MAX_RELATION_MATCHES,
86
+ });
87
+ return matches.docs
88
+ .map((doc) => doc?.id)
89
+ .filter((id) => typeof id === "string");
90
+ }
91
+ function buildMultiRelationshipClause(fieldName, ids) {
92
+ const matches = ids.map((id) => ({
93
+ OR: [
94
+ { [fieldName]: { contains: `"${id}"` } },
95
+ { [fieldName]: { contains: id } },
96
+ ],
97
+ }));
98
+ if (matches.length === 0)
99
+ return undefined;
100
+ return matches.length === 1 ? matches[0] : { OR: matches };
101
+ }
102
+ function buildRelationshipMatchClause(field, ids) {
103
+ if (!field.name || ids.length === 0)
104
+ return undefined;
105
+ if (field.hasMany) {
106
+ return buildMultiRelationshipClause(field.name, ids);
107
+ }
108
+ return { [field.name]: { in: ids } };
109
+ }
110
+ async function findMatchingDocumentIdsByTitle(args) {
111
+ const { collection, search, db, collections, depth = 0 } = args;
112
+ if (depth >= MAX_RELATION_TITLE_DEPTH) {
113
+ return [];
114
+ }
115
+ const ids = new Set();
116
+ const titleField = resolveCollectionTitleField(collection);
117
+ if (titleField?.name && isScalarSearchField(titleField)) {
118
+ for (const id of await findMatchingDocumentIdsByWhere({
119
+ collection,
120
+ where: buildScalarSearchClause(titleField.name, search),
121
+ db,
122
+ })) {
123
+ ids.add(id);
124
+ }
125
+ }
126
+ if (titleField?.type === "relationship" && titleField.relationTo) {
127
+ for (const field of getFallbackTitleFields(collection)) {
128
+ for (const id of await findMatchingDocumentIdsByWhere({
129
+ collection,
130
+ where: buildScalarSearchClause(field.name, search),
131
+ db,
132
+ })) {
133
+ ids.add(id);
134
+ }
135
+ }
136
+ const relatedCollection = collections.find((item) => item.slug === titleField.relationTo);
137
+ if (relatedCollection) {
138
+ const relatedIds = await findMatchingDocumentIdsByTitle({
139
+ collection: relatedCollection,
140
+ search,
141
+ db,
142
+ collections,
143
+ depth: depth + 1,
144
+ });
145
+ const relationClause = buildRelationshipMatchClause(titleField, relatedIds);
146
+ for (const id of await findMatchingDocumentIdsByWhere({
147
+ collection,
148
+ where: relationClause,
149
+ db,
150
+ })) {
151
+ ids.add(id);
152
+ }
153
+ }
154
+ }
155
+ return Array.from(ids).slice(0, MAX_RELATION_MATCHES);
156
+ }
157
+ async function buildRelationshipSearchClause(args) {
158
+ const { field, search, db, collections } = args;
159
+ if (!field.name || field.type !== "relationship" || !field.relationTo) {
160
+ return undefined;
161
+ }
162
+ const relatedCollection = collections.find((collection) => collection.slug === field.relationTo);
163
+ if (!relatedCollection)
164
+ return undefined;
165
+ const ids = await findMatchingDocumentIdsByTitle({
166
+ collection: relatedCollection,
167
+ search,
168
+ db,
169
+ collections,
170
+ });
171
+ return buildRelationshipMatchClause(field, ids);
172
+ }
173
+ export async function buildCollectionSearchWhere(args) {
174
+ const { collection, search, db, collections } = args;
175
+ const trimmedSearch = search?.trim();
176
+ if (!trimmedSearch)
177
+ return undefined;
178
+ const searchableFields = getCollectionSearchableFields(collection);
179
+ if (searchableFields.length === 0)
180
+ return undefined;
181
+ const clauses = [];
182
+ for (const field of searchableFields) {
183
+ if (!field.name)
184
+ continue;
185
+ if (isScalarSearchField(field)) {
186
+ clauses.push(buildScalarSearchClause(field.name, trimmedSearch));
187
+ continue;
188
+ }
189
+ if (field.type === "relationship") {
190
+ const clause = await buildRelationshipSearchClause({
191
+ field,
192
+ search: trimmedSearch,
193
+ db,
194
+ collections,
195
+ });
196
+ if (clause)
197
+ clauses.push(clause);
198
+ }
199
+ }
200
+ if (clauses.length === 0)
201
+ return undefined;
202
+ return clauses.length === 1 ? clauses[0] : { OR: clauses };
203
+ }
204
+ //# sourceMappingURL=collection-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collection-search.js","sourceRoot":"","sources":["../../src/utils/collection-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { DyrectedConfig } from "../types/index.js";
2
+ /**
3
+ * Normalizes the Dyrected configuration by injecting system fields
4
+ * (createdAt, updatedAt, createdBy, updatedBy) into every collection and
5
+ * registering the __audit collection if any collection has audit: true.
6
+ */
7
+ export declare function normalizeConfig(config: DyrectedConfig): DyrectedConfig;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EAEf,MAAM,mBAAmB,CAAC;AA6I3B;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAiOtE"}
@@ -0,0 +1,336 @@
1
+ import { AUTH_SESSIONS_COLLECTION } from "../auth/sessions.js";
2
+ import { LIFECYCLE_EVENTS_COLLECTION, WORKFLOW_HISTORY_COLLECTION, simplePublishingWorkflow, } from "../workflows.js";
3
+ import { getAdminAuthCollection } from "./admin-auth.js";
4
+ import { normalizeSchemaFragment } from "./block-references.js";
5
+ const AUDIT_COLLECTION_SLUG = "__audit";
6
+ const SYSTEM_FIELDS = [
7
+ {
8
+ name: "createdAt",
9
+ type: "date",
10
+ label: "Created At",
11
+ admin: { readOnly: true, hidden: true },
12
+ },
13
+ {
14
+ name: "updatedAt",
15
+ type: "date",
16
+ label: "Updated At",
17
+ admin: { readOnly: true, hidden: true },
18
+ },
19
+ {
20
+ name: "createdBy",
21
+ type: "text",
22
+ label: "Created By",
23
+ admin: { readOnly: true, hidden: true },
24
+ },
25
+ {
26
+ name: "updatedBy",
27
+ type: "text",
28
+ label: "Updated By",
29
+ admin: { readOnly: true, hidden: true },
30
+ },
31
+ ];
32
+ const AUDIT_COLLECTION = {
33
+ slug: AUDIT_COLLECTION_SLUG,
34
+ labels: { singular: "Audit Log", plural: "Audit Logs" },
35
+ fields: [
36
+ { name: "collection", type: "text", label: "Collection", required: true },
37
+ { name: "documentId", type: "text", label: "Document ID" },
38
+ {
39
+ name: "operation",
40
+ type: "select",
41
+ label: "Operation",
42
+ options: ["create", "update", "delete"],
43
+ required: true,
44
+ },
45
+ { name: "user", type: "text", label: "User ID" },
46
+ { name: "timestamp", type: "date", label: "Timestamp", required: true },
47
+ { name: "changes", type: "json", label: "Changes" },
48
+ ],
49
+ access: {
50
+ read: () => false,
51
+ create: () => false,
52
+ update: () => false,
53
+ delete: () => false,
54
+ },
55
+ admin: { hidden: true },
56
+ };
57
+ const WORKFLOW_HISTORY_COLLECTION_CONFIG = {
58
+ slug: WORKFLOW_HISTORY_COLLECTION,
59
+ labels: { singular: "Workflow transition", plural: "Workflow transitions" },
60
+ fields: [
61
+ { name: "collection", type: "text", required: true },
62
+ { name: "documentId", type: "text", required: true },
63
+ { name: "transition", type: "text", required: true },
64
+ { name: "from", type: "text", required: true },
65
+ { name: "to", type: "text", required: true },
66
+ { name: "revision", type: "number", required: true },
67
+ { name: "comment", type: "textarea" },
68
+ { name: "actorId", type: "text" },
69
+ { name: "createdAt", type: "date", required: true },
70
+ ],
71
+ access: {
72
+ read: ({ user }) => !!user,
73
+ create: () => false,
74
+ update: () => false,
75
+ delete: () => false,
76
+ },
77
+ admin: { hidden: true },
78
+ };
79
+ const LIFECYCLE_EVENTS_COLLECTION_CONFIG = {
80
+ slug: LIFECYCLE_EVENTS_COLLECTION,
81
+ labels: { singular: "Lifecycle event", plural: "Lifecycle events" },
82
+ fields: [
83
+ { name: "name", type: "text", required: true },
84
+ { name: "collection", type: "text", required: true },
85
+ { name: "documentId", type: "text", required: true },
86
+ { name: "occurredAt", type: "date", required: true },
87
+ { name: "actorId", type: "text" },
88
+ { name: "payload", type: "json", required: true },
89
+ { name: "attempts", type: "number", required: true },
90
+ {
91
+ name: "status",
92
+ type: "select",
93
+ options: ["pending", "processing", "delivered", "failed"],
94
+ required: true,
95
+ },
96
+ { name: "nextAttemptAt", type: "date" },
97
+ { name: "deliveredAt", type: "date" },
98
+ { name: "lastError", type: "textarea" },
99
+ ],
100
+ access: {
101
+ read: ({ user }) => !!user?.roles?.includes("admin"),
102
+ create: () => false,
103
+ update: () => false,
104
+ delete: () => false,
105
+ },
106
+ admin: { hidden: true },
107
+ };
108
+ const AUTH_SESSIONS_COLLECTION_CONFIG = {
109
+ slug: AUTH_SESSIONS_COLLECTION,
110
+ labels: { singular: "Auth session", plural: "Auth sessions" },
111
+ fields: [
112
+ { name: "userId", type: "text", required: true },
113
+ { name: "email", type: "email", required: true },
114
+ { name: "collection", type: "text", required: true },
115
+ { name: "authSource", type: "text" },
116
+ { name: "providerId", type: "text" },
117
+ { name: "lastIp", type: "text" },
118
+ { name: "lastSeenAt", type: "date" },
119
+ { name: "expiresAt", type: "date" },
120
+ { name: "revokedAt", type: "date" },
121
+ ],
122
+ access: {
123
+ read: () => false,
124
+ create: () => false,
125
+ update: () => false,
126
+ delete: () => false,
127
+ },
128
+ admin: { hidden: true },
129
+ };
130
+ /**
131
+ * Normalizes the Dyrected configuration by injecting system fields
132
+ * (createdAt, updatedAt, createdBy, updatedBy) into every collection and
133
+ * registering the __audit collection if any collection has audit: true.
134
+ */
135
+ export function normalizeConfig(config) {
136
+ const schemaAwareConfig = normalizeSchemaFragment(config);
137
+ const collections = schemaAwareConfig?.collections || [];
138
+ const globals = schemaAwareConfig?.globals || [];
139
+ const needsAudit = collections.some((col) => col.audit);
140
+ const needsWorkflow = collections.some((col) => col.workflow || col.drafts);
141
+ const needsAuthSessions = collections.some((col) => !!col.auth);
142
+ const adminAuthCollectionSlug = getAdminAuthCollection({
143
+ collections,
144
+ adminAuth: schemaAwareConfig.adminAuth,
145
+ })?.slug;
146
+ const normalizedCollections = collections.map((col) => {
147
+ let fields = col.fields || [];
148
+ const existingFieldNames = new Set(fields.map((f) => f.name));
149
+ // Inject email and password if auth is enabled
150
+ if (col.auth) {
151
+ if (!existingFieldNames.has("email")) {
152
+ fields = [
153
+ ...fields,
154
+ {
155
+ name: "email",
156
+ type: "email",
157
+ label: "Email",
158
+ required: true,
159
+ unique: true,
160
+ promoted: true,
161
+ access: {
162
+ update: "!id",
163
+ },
164
+ },
165
+ ];
166
+ }
167
+ if (!existingFieldNames.has("password")) {
168
+ fields = [
169
+ ...fields,
170
+ {
171
+ name: "password",
172
+ type: "text",
173
+ label: "Password",
174
+ required: true,
175
+ access: {
176
+ update: "!id || user.id == id",
177
+ },
178
+ },
179
+ ];
180
+ }
181
+ if (!existingFieldNames.has("roles")) {
182
+ fields = [
183
+ ...fields,
184
+ {
185
+ name: "roles",
186
+ type: "select",
187
+ label: "Roles",
188
+ defaultValue: [],
189
+ options: [
190
+ { value: "admin", label: "Admin" },
191
+ { value: "editor", label: "Editor" },
192
+ { value: "viewer", label: "Viewer" },
193
+ ],
194
+ access: {
195
+ update: "user.roles && 'admin' in user.roles",
196
+ },
197
+ },
198
+ ];
199
+ }
200
+ if (!existingFieldNames.has("status")) {
201
+ fields = [
202
+ ...fields,
203
+ {
204
+ name: "status",
205
+ type: "select",
206
+ label: "Status",
207
+ defaultValue: "active",
208
+ options: [
209
+ { value: "active", label: "Active" },
210
+ { value: "pending", label: "Pending" },
211
+ ],
212
+ access: {
213
+ update: "user.roles && 'admin' in user.roles && user.id != id",
214
+ },
215
+ },
216
+ ];
217
+ }
218
+ // Enforce access control rules for email, password, and roles fields even if explicitly defined
219
+ fields = fields.map((field) => {
220
+ if (field.name === "email") {
221
+ return {
222
+ ...field,
223
+ // Email is the login identifier. Keep the integrity constraints
224
+ // auth relies on even when the field is explicitly redefined, so a
225
+ // custom `email` field can never silently drop uniqueness.
226
+ required: true,
227
+ unique: true,
228
+ promoted: true,
229
+ access: {
230
+ ...(field.access || {}),
231
+ update: "!id",
232
+ },
233
+ };
234
+ }
235
+ if (field.name === "password") {
236
+ return {
237
+ ...field,
238
+ // Password is required to authenticate; enforce it regardless of
239
+ // how the field was declared.
240
+ required: true,
241
+ admin: { ...(field.admin || {}) },
242
+ access: {
243
+ ...(field.access || {}),
244
+ update: "!id || user.id == id",
245
+ },
246
+ };
247
+ }
248
+ if (field.name === "roles") {
249
+ return {
250
+ ...field,
251
+ access: {
252
+ ...(field.access || {}),
253
+ // Must be an admin; cannot edit own roles (no self-elevation).
254
+ update: "user.roles && 'admin' in user.roles && user.id != id",
255
+ },
256
+ };
257
+ }
258
+ if (field.name === "status") {
259
+ return {
260
+ ...field,
261
+ access: {
262
+ ...(field.access || {}),
263
+ update: "user.roles && 'admin' in user.roles && user.id != id",
264
+ },
265
+ };
266
+ }
267
+ return field;
268
+ });
269
+ }
270
+ if (adminAuthCollectionSlug &&
271
+ col.slug === adminAuthCollectionSlug &&
272
+ schemaAwareConfig.adminAuth?.mode === "external") {
273
+ const externalAdminFields = [
274
+ {
275
+ name: "authProvider",
276
+ type: "text",
277
+ label: "Auth Provider",
278
+ admin: { readOnly: true, hidden: true },
279
+ },
280
+ {
281
+ name: "externalSubject",
282
+ type: "text",
283
+ label: "External Subject",
284
+ admin: { readOnly: true, hidden: true },
285
+ },
286
+ {
287
+ name: "authSource",
288
+ type: "text",
289
+ label: "Auth Source",
290
+ admin: { readOnly: true, hidden: true },
291
+ },
292
+ {
293
+ name: "lastLoginAt",
294
+ type: "date",
295
+ label: "Last Login At",
296
+ admin: { readOnly: true, hidden: true },
297
+ },
298
+ ];
299
+ for (const field of externalAdminFields) {
300
+ if (!existingFieldNames.has(field.name)) {
301
+ fields = [...fields, field];
302
+ }
303
+ }
304
+ }
305
+ const updatedFieldNames = new Set(fields.map((f) => f.name));
306
+ const fieldsToInject = SYSTEM_FIELDS.filter((f) => !updatedFieldNames.has(f.name));
307
+ const workflow = col.workflow || (col.drafts ? simplePublishingWorkflow() : undefined);
308
+ return {
309
+ ...col,
310
+ workflow,
311
+ fields: [...fields, ...fieldsToInject],
312
+ };
313
+ });
314
+ const hasAuditCollection = normalizedCollections.some((col) => col.slug === AUDIT_COLLECTION_SLUG);
315
+ const systemCollections = [];
316
+ if (needsAudit && !hasAuditCollection)
317
+ systemCollections.push(AUDIT_COLLECTION);
318
+ if (needsWorkflow &&
319
+ !normalizedCollections.some((col) => col.slug === WORKFLOW_HISTORY_COLLECTION)) {
320
+ systemCollections.push(WORKFLOW_HISTORY_COLLECTION_CONFIG);
321
+ }
322
+ if (needsWorkflow &&
323
+ !normalizedCollections.some((col) => col.slug === LIFECYCLE_EVENTS_COLLECTION)) {
324
+ systemCollections.push(LIFECYCLE_EVENTS_COLLECTION_CONFIG);
325
+ }
326
+ if (needsAuthSessions &&
327
+ !normalizedCollections.some((col) => col.slug === AUTH_SESSIONS_COLLECTION)) {
328
+ systemCollections.push(AUTH_SESSIONS_COLLECTION_CONFIG);
329
+ }
330
+ return {
331
+ ...schemaAwareConfig,
332
+ collections: [...normalizedCollections, ...systemCollections],
333
+ globals,
334
+ };
335
+ }
336
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Field } from "../types/index.js";
2
+ type AnyHookFn = (args: any) => any;
3
+ /**
4
+ * Run a list of hook functions sequentially.
5
+ *
6
+ * Each hook receives the output of the previous hook merged back into the
7
+ * original `args`. When a hook returns a non-undefined value it becomes the
8
+ * `data` / `doc` for the next hook in the chain.
9
+ *
10
+ * Pass `{ isolated: true }` for hooks that run **after** a DB write has already
11
+ * been committed (`afterChange`, `afterDelete`). In isolated mode each hook is
12
+ * wrapped in a try/catch so a failing side-effect (email, webhook, etc.) never
13
+ * surfaces as an HTTP 500 to the caller — the write already succeeded.
14
+ */
15
+ export declare function runCollectionHooks(hooks: AnyHookFn[] | undefined, args: {
16
+ data?: unknown;
17
+ doc?: unknown;
18
+ user?: unknown;
19
+ req?: unknown;
20
+ db?: unknown;
21
+ operation?: "create" | "update" | "delete";
22
+ [key: string]: unknown;
23
+ }, options?: {
24
+ isolated?: boolean;
25
+ }): Promise<any>;
26
+ /**
27
+ * Execute field-level `beforeChange` hooks recursively on a data payload.
28
+ *
29
+ * Traverses `array`, `object`, and `blocks` fields depth-first so that nested
30
+ * field hooks fire on every item automatically.
31
+ */
32
+ export declare function executeFieldBeforeChange(fields: Field[], data: Record<string, unknown>, originalDoc: Record<string, unknown> | null, user: unknown, db?: unknown): Promise<Record<string, unknown>>;
33
+ /**
34
+ * Execute field-level `afterRead` hooks recursively on a document.
35
+ *
36
+ * Traverses `array`, `object`, and `blocks` fields depth-first so that nested
37
+ * field hooks fire on every item automatically.
38
+ */
39
+ export declare function executeFieldAfterRead(fields: Field[], doc: Record<string, unknown>, user: unknown, db?: unknown): Promise<Record<string, unknown>>;
40
+ export {};
41
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,KAAK,EAMN,MAAM,mBAAmB,CAAC;AAO3B,KAAK,SAAS,GAAG,CAAC,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC;AAWpC;;;;;;;;;;;GAWG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAC9B,IAAI,EAAE;IACJ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB,EACD,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,OAAO,CAAC,GAAG,CAAC,CA+Bd;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,KAAK,EAAE,EACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EAC3C,IAAI,EAAE,OAAO,EACb,EAAE,CAAC,EAAE,OAAO,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAgGlC;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,KAAK,EAAE,EACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,IAAI,EAAE,OAAO,EACb,EAAE,CAAC,EAAE,OAAO,GACX,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoFlC"}