@revealui/core 0.2.1 → 0.3.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 (325) hide show
  1. package/dist/api/compression.d.ts.map +1 -1
  2. package/dist/api/payload-optimization.d.ts.map +1 -1
  3. package/dist/api/rate-limit.d.ts +29 -28
  4. package/dist/api/rate-limit.d.ts.map +1 -1
  5. package/dist/api/rate-limit.js +63 -3
  6. package/dist/api/response-cache.d.ts.map +1 -1
  7. package/dist/api/response-cache.js +1 -1
  8. package/dist/api/rest.d.ts.map +1 -1
  9. package/dist/api/rest.js +3 -2
  10. package/dist/auth/access.d.ts.map +1 -1
  11. package/dist/auth/index.d.ts.map +1 -1
  12. package/dist/cache/query-cache.d.ts +12 -10
  13. package/dist/cache/query-cache.d.ts.map +1 -1
  14. package/dist/cache/query-cache.js +38 -42
  15. package/dist/caching/app-cache.d.ts +5 -0
  16. package/dist/caching/app-cache.d.ts.map +1 -1
  17. package/dist/caching/app-cache.js +9 -1
  18. package/dist/caching/cdn-config.d.ts.map +1 -1
  19. package/dist/caching/cdn-config.js +4 -0
  20. package/dist/caching/edge-cache.d.ts +1 -1
  21. package/dist/caching/edge-cache.d.ts.map +1 -1
  22. package/dist/caching/edge-cache.js +36 -7
  23. package/dist/caching/index.d.ts +6 -0
  24. package/dist/caching/index.d.ts.map +1 -0
  25. package/dist/caching/index.js +5 -0
  26. package/dist/caching/service-worker.d.ts +6 -3
  27. package/dist/caching/service-worker.d.ts.map +1 -1
  28. package/dist/caching/service-worker.js +3 -2
  29. package/dist/client/admin/RichText.d.ts +1 -1
  30. package/dist/client/admin/RichText.d.ts.map +1 -1
  31. package/dist/client/admin/components/AdminDashboard.d.ts.map +1 -1
  32. package/dist/client/admin/components/AdminDashboard.js +178 -205
  33. package/dist/client/admin/components/CollectionList.d.ts.map +1 -1
  34. package/dist/client/admin/components/DocumentForm.d.ts.map +1 -1
  35. package/dist/client/admin/components/DocumentForm.js +130 -6
  36. package/dist/client/admin/components/GlobalForm.d.ts.map +1 -1
  37. package/dist/client/admin/context/ServerFunctionContext.d.ts +8 -0
  38. package/dist/client/admin/context/ServerFunctionContext.d.ts.map +1 -0
  39. package/dist/client/admin/context/ServerFunctionContext.js +15 -0
  40. package/dist/client/admin/i18n/en.d.ts.map +1 -1
  41. package/dist/client/admin/index.d.ts +1 -0
  42. package/dist/client/admin/index.d.ts.map +1 -1
  43. package/dist/client/admin/index.js +1 -0
  44. package/dist/client/admin/layout.d.ts +1 -1
  45. package/dist/client/admin/layout.d.ts.map +1 -1
  46. package/dist/client/admin/layout.js +3 -2
  47. package/dist/client/admin/page.d.ts.map +1 -1
  48. package/dist/client/admin/utils/apiClient.d.ts.map +1 -1
  49. package/dist/client/admin/utils/apiClient.js +0 -4
  50. package/dist/client/admin/utils/index.d.ts +0 -1
  51. package/dist/client/admin/utils/index.d.ts.map +1 -1
  52. package/dist/client/admin/utils/index.js +0 -1
  53. package/dist/client/admin/utils/serializeConfig.d.ts.map +1 -1
  54. package/dist/client/hooks.d.ts.map +1 -1
  55. package/dist/client/index.d.ts.map +1 -1
  56. package/dist/client/richtext/RichTextEditor.d.ts.map +1 -1
  57. package/dist/client/richtext/components/ImageNodeComponent.d.ts.map +1 -1
  58. package/dist/client/richtext/components/ImageNodeComponent.js +0 -1
  59. package/dist/client/richtext/components/ImageUploadButton.d.ts +2 -0
  60. package/dist/client/richtext/components/ImageUploadButton.d.ts.map +1 -1
  61. package/dist/client/richtext/components/ImageUploadButton.js +30 -15
  62. package/dist/client/richtext/index.d.ts.map +1 -1
  63. package/dist/client/richtext/nodes/DecoratorBlockNode.d.ts.map +1 -1
  64. package/dist/client/richtext/nodes/ImageNode.d.ts.map +1 -1
  65. package/dist/client/richtext/plugins/CollaborationPlugin.d.ts.map +1 -1
  66. package/dist/client/richtext/plugins/CursorsOverlayPlugin.d.ts.map +1 -1
  67. package/dist/client/richtext/plugins/FloatingToolbarPlugin.d.ts.map +1 -1
  68. package/dist/client/richtext/plugins/ImagePlugin.d.ts.map +1 -1
  69. package/dist/client/richtext/plugins/ToolbarPlugin.d.ts.map +1 -1
  70. package/dist/client/ui/index.d.ts.map +1 -1
  71. package/dist/client/ui/index.js +1 -1
  72. package/dist/collections/CollectionOperations.d.ts +7 -7
  73. package/dist/collections/CollectionOperations.d.ts.map +1 -1
  74. package/dist/collections/CollectionOperations.js +15 -1
  75. package/dist/collections/hooks.d.ts.map +1 -1
  76. package/dist/collections/index.d.ts.map +1 -1
  77. package/dist/collections/operations/create.d.ts +2 -4
  78. package/dist/collections/operations/create.d.ts.map +1 -1
  79. package/dist/collections/operations/create.js +7 -5
  80. package/dist/collections/operations/createMany.d.ts +12 -0
  81. package/dist/collections/operations/createMany.d.ts.map +1 -0
  82. package/dist/collections/operations/createMany.js +43 -0
  83. package/dist/collections/operations/delete.d.ts +1 -1
  84. package/dist/collections/operations/delete.d.ts.map +1 -1
  85. package/dist/collections/operations/delete.js +31 -2
  86. package/dist/collections/operations/deleteMany.d.ts +11 -0
  87. package/dist/collections/operations/deleteMany.d.ts.map +1 -0
  88. package/dist/collections/operations/deleteMany.js +50 -0
  89. package/dist/collections/operations/fieldHooks.d.ts +2 -2
  90. package/dist/collections/operations/fieldHooks.d.ts.map +1 -1
  91. package/dist/collections/operations/fieldHooks.js +4 -4
  92. package/dist/collections/operations/find.d.ts +2 -4
  93. package/dist/collections/operations/find.d.ts.map +1 -1
  94. package/dist/collections/operations/find.js +115 -8
  95. package/dist/collections/operations/findById.d.ts +3 -4
  96. package/dist/collections/operations/findById.d.ts.map +1 -1
  97. package/dist/collections/operations/findById.js +53 -1
  98. package/dist/collections/operations/sqlAdapter.d.ts +23 -0
  99. package/dist/collections/operations/sqlAdapter.d.ts.map +1 -0
  100. package/dist/collections/operations/sqlAdapter.js +76 -0
  101. package/dist/collections/operations/update.d.ts +3 -5
  102. package/dist/collections/operations/update.d.ts.map +1 -1
  103. package/dist/collections/operations/update.js +103 -11
  104. package/dist/collections/operations/updateMany.d.ts +11 -0
  105. package/dist/collections/operations/updateMany.d.ts.map +1 -0
  106. package/dist/collections/operations/updateMany.js +52 -0
  107. package/dist/collections/registry.d.ts +12 -0
  108. package/dist/collections/registry.d.ts.map +1 -0
  109. package/dist/collections/registry.js +38 -0
  110. package/dist/config/index.d.ts.map +1 -1
  111. package/dist/config/runtime.d.ts.map +1 -1
  112. package/dist/config/utils.d.ts +0 -10
  113. package/dist/config/utils.d.ts.map +1 -1
  114. package/dist/config/utils.js +0 -13
  115. package/dist/database/index.d.ts +3 -0
  116. package/dist/database/index.d.ts.map +1 -1
  117. package/dist/database/index.js +1 -5
  118. package/dist/database/safe-parse.d.ts.map +1 -1
  119. package/dist/database/ssl-config.d.ts.map +1 -1
  120. package/dist/database/type-adapter.d.ts.map +1 -1
  121. package/dist/database/universal-postgres.d.ts.map +1 -1
  122. package/dist/database/universal-postgres.js +6 -1
  123. package/dist/dataloader.d.ts.map +1 -1
  124. package/dist/error-handling/circuit-breaker.d.ts +1 -1
  125. package/dist/error-handling/circuit-breaker.d.ts.map +1 -1
  126. package/dist/error-handling/circuit-breaker.js +11 -3
  127. package/dist/error-handling/error-boundary.d.ts.map +1 -1
  128. package/dist/error-handling/error-reporter.d.ts +1 -1
  129. package/dist/error-handling/error-reporter.d.ts.map +1 -1
  130. package/dist/error-handling/error-reporter.js +19 -5
  131. package/dist/error-handling/fallback-components.d.ts.map +1 -1
  132. package/dist/error-handling/fallback-components.js +1 -1
  133. package/dist/error-handling/index.d.ts +2 -4
  134. package/dist/error-handling/index.d.ts.map +1 -1
  135. package/dist/error-handling/index.js +1 -4
  136. package/dist/error-handling/retry.d.ts.map +1 -1
  137. package/dist/error-handling/retry.js +13 -8
  138. package/dist/factories/builders.d.ts.map +1 -1
  139. package/dist/factories/index.d.ts.map +1 -1
  140. package/dist/features.d.ts +0 -4
  141. package/dist/features.d.ts.map +1 -1
  142. package/dist/features.js +0 -2
  143. package/dist/fieldTraversal.d.ts.map +1 -1
  144. package/dist/fields/config/types.d.ts.map +1 -1
  145. package/dist/fields/getDefaultValue.d.ts.map +1 -1
  146. package/dist/fields/getFieldPaths.d.ts.map +1 -1
  147. package/dist/fields/hooks/afterRead/index.d.ts.map +1 -1
  148. package/dist/fields/hooks/afterRead/promise.d.ts.map +1 -1
  149. package/dist/fields/hooks/afterRead/traverseFields.d.ts.map +1 -1
  150. package/dist/generated/types/cms.d.ts.map +1 -1
  151. package/dist/generated/types/cms.js +0 -1
  152. package/dist/generated/types/neon.d.ts.map +1 -1
  153. package/dist/generated/types/neon.js +4 -2
  154. package/dist/globals/GlobalOperations.d.ts.map +1 -1
  155. package/dist/globals/GlobalOperations.js +4 -2
  156. package/dist/globals/index.d.ts.map +1 -1
  157. package/dist/index.d.ts +4 -4
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +4 -4
  160. package/dist/instance/RevealUIInstance.d.ts.map +1 -1
  161. package/dist/instance/RevealUIInstance.js +6 -19
  162. package/dist/instance/index.d.ts.map +1 -1
  163. package/dist/instance/logger.d.ts.map +1 -1
  164. package/dist/instance/methods/create.d.ts.map +1 -1
  165. package/dist/instance/methods/create.js +0 -3
  166. package/dist/instance/methods/delete.d.ts.map +1 -1
  167. package/dist/instance/methods/delete.js +1 -4
  168. package/dist/instance/methods/find.d.ts.map +1 -1
  169. package/dist/instance/methods/find.js +0 -3
  170. package/dist/instance/methods/findById.d.ts.map +1 -1
  171. package/dist/instance/methods/findById.js +0 -3
  172. package/dist/instance/methods/hooks.d.ts.map +1 -1
  173. package/dist/instance/methods/update.d.ts.map +1 -1
  174. package/dist/instance/methods/update.js +0 -3
  175. package/dist/jobs/index.d.ts +16 -0
  176. package/dist/jobs/index.d.ts.map +1 -0
  177. package/dist/jobs/index.js +14 -0
  178. package/dist/jobs/queue.d.ts +57 -0
  179. package/dist/jobs/queue.d.ts.map +1 -0
  180. package/dist/jobs/queue.js +134 -0
  181. package/dist/license-encryption.d.ts +21 -0
  182. package/dist/license-encryption.d.ts.map +1 -0
  183. package/dist/license-encryption.js +74 -0
  184. package/dist/license.d.ts +20 -3
  185. package/dist/license.d.ts.map +1 -1
  186. package/dist/license.js +73 -6
  187. package/dist/monitoring/alerts.d.ts.map +1 -1
  188. package/dist/monitoring/cleanup-manager.d.ts.map +1 -1
  189. package/dist/monitoring/health-monitor.d.ts.map +1 -1
  190. package/dist/monitoring/index.d.ts.map +1 -1
  191. package/dist/monitoring/process-registry.d.ts.map +1 -1
  192. package/dist/monitoring/query-monitor.d.ts.map +1 -1
  193. package/dist/monitoring/types.d.ts.map +1 -1
  194. package/dist/monitoring/zombie-detector.d.ts.map +1 -1
  195. package/dist/monitoring/zombie-detector.js +5 -0
  196. package/dist/nextjs/index.d.ts.map +1 -1
  197. package/dist/nextjs/utilities.d.ts.map +1 -1
  198. package/dist/nextjs/withRevealUI.d.ts.map +1 -1
  199. package/dist/observability/alerts.d.ts.map +1 -1
  200. package/dist/observability/alerts.js +1 -2
  201. package/dist/observability/health-check.d.ts +0 -4
  202. package/dist/observability/health-check.d.ts.map +1 -1
  203. package/dist/observability/health-check.js +0 -36
  204. package/dist/observability/index.d.ts.map +1 -1
  205. package/dist/observability/logger.d.ts.map +1 -1
  206. package/dist/observability/logger.js +1 -1
  207. package/dist/observability/metrics.d.ts.map +1 -1
  208. package/dist/observability/tracing.d.ts.map +1 -1
  209. package/dist/observability/tracing.js +0 -1
  210. package/dist/optimization/asset-optimizer.d.ts +6 -2
  211. package/dist/optimization/asset-optimizer.d.ts.map +1 -1
  212. package/dist/optimization/asset-optimizer.js +31 -7
  213. package/dist/optimization/bundle-analyzer.d.ts +1 -1
  214. package/dist/optimization/bundle-analyzer.d.ts.map +1 -1
  215. package/dist/optimization/bundle-analyzer.js +29 -5
  216. package/dist/optimization/code-splitting.d.ts +0 -10
  217. package/dist/optimization/code-splitting.d.ts.map +1 -1
  218. package/dist/optimization/code-splitting.js +0 -16
  219. package/dist/plugins/form-builder.d.ts.map +1 -1
  220. package/dist/plugins/index.d.ts.map +1 -1
  221. package/dist/plugins/nested-docs.d.ts +4 -0
  222. package/dist/plugins/nested-docs.d.ts.map +1 -1
  223. package/dist/plugins/nested-docs.js +50 -5
  224. package/dist/plugins/redirects.d.ts.map +1 -1
  225. package/dist/queries/index.d.ts.map +1 -1
  226. package/dist/queries/queryBuilder.d.ts.map +1 -1
  227. package/dist/queries/queryBuilder.js +9 -2
  228. package/dist/relationships/analyzer.d.ts.map +1 -1
  229. package/dist/relationships/analyzer.js +8 -0
  230. package/dist/relationships/index.d.ts.map +1 -1
  231. package/dist/relationships/populate-core.d.ts +57 -0
  232. package/dist/relationships/populate-core.d.ts.map +1 -0
  233. package/dist/relationships/populate-core.js +116 -0
  234. package/dist/relationships/populate-helpers.d.ts +5 -51
  235. package/dist/relationships/populate-helpers.d.ts.map +1 -1
  236. package/dist/relationships/populate-helpers.js +4 -109
  237. package/dist/relationships/population.d.ts +1 -9
  238. package/dist/relationships/population.d.ts.map +1 -1
  239. package/dist/relationships/population.js +8 -3
  240. package/dist/revealui.d.ts.map +1 -1
  241. package/dist/richtext/exports/client/rcc.d.ts.map +1 -1
  242. package/dist/richtext/exports/client/rcc.js +1 -1
  243. package/dist/richtext/exports/server/rsc.d.ts +17 -0
  244. package/dist/richtext/exports/server/rsc.d.ts.map +1 -1
  245. package/dist/richtext/exports/server/rsc.js +61 -5
  246. package/dist/richtext/index.d.ts.map +1 -1
  247. package/dist/richtext/lexical.d.ts.map +1 -1
  248. package/dist/security/audit.d.ts +1 -1
  249. package/dist/security/audit.d.ts.map +1 -1
  250. package/dist/security/audit.js +4 -2
  251. package/dist/security/auth.d.ts +29 -160
  252. package/dist/security/auth.d.ts.map +1 -1
  253. package/dist/security/auth.js +148 -367
  254. package/dist/security/authorization.d.ts +7 -31
  255. package/dist/security/authorization.d.ts.map +1 -1
  256. package/dist/security/authorization.js +72 -14
  257. package/dist/security/encryption.d.ts +56 -44
  258. package/dist/security/encryption.d.ts.map +1 -1
  259. package/dist/security/encryption.js +113 -96
  260. package/dist/security/gdpr-storage.d.ts +102 -0
  261. package/dist/security/gdpr-storage.d.ts.map +1 -0
  262. package/dist/security/gdpr-storage.js +65 -0
  263. package/dist/security/gdpr.d.ts +57 -37
  264. package/dist/security/gdpr.d.ts.map +1 -1
  265. package/dist/security/gdpr.js +155 -89
  266. package/dist/security/headers.d.ts +4 -2
  267. package/dist/security/headers.d.ts.map +1 -1
  268. package/dist/security/headers.js +35 -17
  269. package/dist/security/index.d.ts +3 -16
  270. package/dist/security/index.d.ts.map +1 -1
  271. package/dist/security/index.js +3 -16
  272. package/dist/server/index.d.ts.map +1 -1
  273. package/dist/server/renderPage.d.ts.map +1 -1
  274. package/dist/storage/index.d.ts +1 -0
  275. package/dist/storage/index.d.ts.map +1 -1
  276. package/dist/storage/index.js +2 -4
  277. package/dist/storage/vercel-blob.d.ts.map +1 -1
  278. package/dist/translations/index.d.ts.map +1 -1
  279. package/dist/types/access.d.ts.map +1 -1
  280. package/dist/types/api.d.ts.map +1 -1
  281. package/dist/types/cms.d.ts.map +1 -1
  282. package/dist/types/config.d.ts.map +1 -1
  283. package/dist/types/core.d.ts.map +1 -1
  284. package/dist/types/extensions.d.ts.map +1 -1
  285. package/dist/types/frontend.d.ts.map +1 -1
  286. package/dist/types/generated.d.ts.map +1 -1
  287. package/dist/types/hooks.d.ts.map +1 -1
  288. package/dist/types/index.d.ts +1 -1
  289. package/dist/types/index.d.ts.map +1 -1
  290. package/dist/types/interfaces/app.d.ts.map +1 -1
  291. package/dist/types/jobs.d.ts.map +1 -1
  292. package/dist/types/legacy.d.ts.map +1 -1
  293. package/dist/types/plugins.d.ts.map +1 -1
  294. package/dist/types/query.d.ts.map +1 -1
  295. package/dist/types/request.d.ts.map +1 -1
  296. package/dist/types/richtext.d.ts.map +1 -1
  297. package/dist/types/runtime.d.ts +59 -1
  298. package/dist/types/runtime.d.ts.map +1 -1
  299. package/dist/types/schema.d.ts.map +1 -1
  300. package/dist/types/user.d.ts.map +1 -1
  301. package/dist/utils/access-conversion.d.ts.map +1 -1
  302. package/dist/utils/api-wrapper.d.ts.map +1 -1
  303. package/dist/utils/api-wrapper.js +1 -1
  304. package/dist/utils/block-conversion.d.ts.map +1 -1
  305. package/dist/utils/cache.d.ts.map +1 -1
  306. package/dist/utils/deep-clone.js +0 -1
  307. package/dist/utils/error-responses.d.ts.map +1 -1
  308. package/dist/utils/errors.d.ts +36 -0
  309. package/dist/utils/errors.d.ts.map +1 -1
  310. package/dist/utils/errors.js +103 -0
  311. package/dist/utils/field-conversion.d.ts +1 -1
  312. package/dist/utils/field-conversion.d.ts.map +1 -1
  313. package/dist/utils/flattenResult.d.ts.map +1 -1
  314. package/dist/utils/flattenResult.js +0 -1
  315. package/dist/utils/getBlockSelect.d.ts.map +1 -1
  316. package/dist/utils/getSelectMode.d.ts.map +1 -1
  317. package/dist/utils/isValidID.d.ts.map +1 -1
  318. package/dist/utils/json-parsing.d.ts.map +1 -1
  319. package/dist/utils/logger-client.d.ts.map +1 -1
  320. package/dist/utils/logger-server.d.ts.map +1 -1
  321. package/dist/utils/logger.d.ts.map +1 -1
  322. package/dist/utils/request-context.d.ts.map +1 -1
  323. package/dist/utils/stripUnselectedFields.d.ts.map +1 -1
  324. package/dist/utils/type-guards.d.ts.map +1 -1
  325. package/package.json +39 -7
@@ -1,3 +1,4 @@
1
+ import { defaultLogger } from '../instance/logger.js';
1
2
  /**
2
3
  * Analyzes a collection or global configuration and extracts all relationship fields
3
4
  * with their storage metadata for proper query building.
@@ -46,6 +47,13 @@ export function getRelationshipFields(config, collectionSlug) {
46
47
  }
47
48
  }
48
49
  traverseFields(config.fields);
50
+ // Validate extracted metadata to catch configuration errors early
51
+ const validation = validateRelationshipMetadata(relationships);
52
+ if (!validation.valid) {
53
+ for (const error of validation.errors) {
54
+ defaultLogger.warn(`[RelationshipAnalyzer] ${error}`);
55
+ }
56
+ }
49
57
  return relationships;
50
58
  }
51
59
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relationships/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/relationships/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,6BAA6B,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Population Core — Pure Types & Utilities
3
+ *
4
+ * This module contains types and pure utility functions for relationship
5
+ * population that have NO imports from the afterRead chain, breaking the
6
+ * circular dependency: population → populate-helpers → afterRead → population.
7
+ */
8
+ /** Relationship field types supported by population */
9
+ export interface PopulateRelationshipField {
10
+ type: 'relationship' | 'upload' | 'join';
11
+ name: string;
12
+ relationTo?: string | string[];
13
+ collection?: string | string[];
14
+ hasMany?: boolean;
15
+ maxDepth?: number;
16
+ localized?: boolean;
17
+ }
18
+ /** Information extracted about a relationship */
19
+ export interface RelationInfo {
20
+ /** The collection slug this relationship points to */
21
+ relationName: string | undefined;
22
+ /** The ID(s) to populate */
23
+ id: unknown;
24
+ /** The related collection config if available */
25
+ relatedCollection: unknown;
26
+ }
27
+ /** Location information for updating a document with populated values */
28
+ export interface UpdateLocation {
29
+ index?: number;
30
+ key?: string;
31
+ }
32
+ /**
33
+ * Extract relationship information from field and data
34
+ *
35
+ * Handles polymorphic relationships, join tables, and direct FK relationships.
36
+ */
37
+ export declare function extractRelationInfo(field: PopulateRelationshipField, data: unknown, req: {
38
+ revealui?: {
39
+ collections?: Record<string, unknown>;
40
+ };
41
+ }): RelationInfo;
42
+ /**
43
+ * Check if a relationship should be populated based on depth
44
+ */
45
+ export declare function shouldPopulateRelationship(currentDepth: number, depth: number): boolean;
46
+ /**
47
+ * Update document with populated relationship value
48
+ *
49
+ * Handles various field configurations: arrays, localized fields, join tables, etc.
50
+ */
51
+ export declare function updateDocumentWithPopulatedValue(args: {
52
+ dataReference: Record<string, unknown>;
53
+ field: PopulateRelationshipField;
54
+ relationshipValue: unknown;
55
+ location: UpdateLocation;
56
+ }): void;
57
+ //# sourceMappingURL=populate-core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"populate-core.d.ts","sourceRoot":"","sources":["../../src/relationships/populate-core.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,uDAAuD;AACvD,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,YAAY,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,4BAA4B;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,iDAAiD;IACjD,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAED,yEAAyE;AACzE,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,yBAAyB,EAChC,IAAI,EAAE,OAAO,EACb,GAAG,EAAE;IACH,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACvC,CAAC;CACH,GACA,YAAY,CAwCd;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAEvF;AAED;;;;GAIG;AACH,wBAAgB,gCAAgC,CAAC,IAAI,EAAE;IACrD,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,KAAK,EAAE,yBAAyB,CAAC;IACjC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,QAAQ,EAAE,cAAc,CAAC;CAC1B,GAAG,IAAI,CAsDP"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * Population Core — Pure Types & Utilities
3
+ *
4
+ * This module contains types and pure utility functions for relationship
5
+ * population that have NO imports from the afterRead chain, breaking the
6
+ * circular dependency: population → populate-helpers → afterRead → population.
7
+ */
8
+ /**
9
+ * Extract relationship information from field and data
10
+ *
11
+ * Handles polymorphic relationships, join tables, and direct FK relationships.
12
+ */
13
+ export function extractRelationInfo(field, data, req) {
14
+ const dataRecord = data;
15
+ // Determine relation name based on field type
16
+ let relationName;
17
+ if (field.type === 'join') {
18
+ relationName = Array.isArray(field.collection)
19
+ ? dataRecord.relationTo
20
+ : field.collection;
21
+ }
22
+ else {
23
+ relationName = Array.isArray(field.relationTo)
24
+ ? dataRecord.relationTo
25
+ : field.relationTo;
26
+ }
27
+ // Get related collection config
28
+ const relatedCollection = relationName && req.revealui?.collections ? req.revealui.collections[relationName] : undefined;
29
+ // Extract ID based on field configuration
30
+ let id;
31
+ if (field.type === 'join' && Array.isArray(field.collection)) {
32
+ id = dataRecord.value;
33
+ }
34
+ else if (field.type !== 'join' && Array.isArray(field.relationTo)) {
35
+ id = dataRecord.value;
36
+ }
37
+ else {
38
+ id = data;
39
+ }
40
+ // Normalize ID to string or number
41
+ if (typeof id !== 'string' &&
42
+ typeof id !== 'number' &&
43
+ typeof id?.toString === 'function' &&
44
+ typeof id !== 'object') {
45
+ id = id.toString();
46
+ }
47
+ return { relationName, id, relatedCollection };
48
+ }
49
+ /**
50
+ * Check if a relationship should be populated based on depth
51
+ */
52
+ export function shouldPopulateRelationship(currentDepth, depth) {
53
+ return depth > 0 && currentDepth <= depth;
54
+ }
55
+ /**
56
+ * Update document with populated relationship value
57
+ *
58
+ * Handles various field configurations: arrays, localized fields, join tables, etc.
59
+ */
60
+ export function updateDocumentWithPopulatedValue(args) {
61
+ const { dataReference, field, relationshipValue, location } = args;
62
+ const { index, key } = location;
63
+ // Case 1: Localized array field (has both index and key)
64
+ if (typeof index === 'number' && typeof key === 'string') {
65
+ const fieldRecord = dataReference[field.name];
66
+ const localeRecords = fieldRecord[key];
67
+ const localeEntry = localeRecords[index];
68
+ if (field.type !== 'join' && Array.isArray(field.relationTo)) {
69
+ localeEntry.value = relationshipValue;
70
+ }
71
+ else if (field.type === 'join' && Array.isArray(field.collection)) {
72
+ localeEntry.value = relationshipValue;
73
+ }
74
+ else {
75
+ localeRecords[index] = relationshipValue;
76
+ }
77
+ return;
78
+ }
79
+ // Case 2: Array field or localized field (has index or key, but not both)
80
+ if (typeof index === 'number' || typeof key === 'string') {
81
+ const fieldRecord = dataReference[field.name];
82
+ const target = (index ?? key);
83
+ if (field.type === 'join') {
84
+ if (!Array.isArray(field.collection)) {
85
+ const docs = fieldRecord.docs;
86
+ docs[target] = relationshipValue;
87
+ }
88
+ else {
89
+ const docs = fieldRecord.docs;
90
+ const docEntry = docs[target];
91
+ docEntry.value = relationshipValue;
92
+ }
93
+ }
94
+ else if (Array.isArray(field.relationTo)) {
95
+ const entries = fieldRecord;
96
+ const entry = entries[target];
97
+ entry.value = relationshipValue;
98
+ }
99
+ else {
100
+ fieldRecord[target] = relationshipValue;
101
+ }
102
+ return;
103
+ }
104
+ // Case 3: Single value (no index or key)
105
+ if (field.type !== 'join' && Array.isArray(field.relationTo)) {
106
+ const fieldRecord = dataReference[field.name];
107
+ fieldRecord.value = relationshipValue;
108
+ }
109
+ else if (field.type === 'join' && Array.isArray(field.collection)) {
110
+ const fieldRecord = dataReference[field.name];
111
+ fieldRecord.value = relationshipValue;
112
+ }
113
+ else {
114
+ dataReference[field.name] = relationshipValue;
115
+ }
116
+ }
@@ -3,41 +3,13 @@
3
3
  *
4
4
  * Extracted from the monolithic populate() function to improve
5
5
  * maintainability, testability, and clarity.
6
- */
7
- import type { RevealRequest, TypedFallbackLocale } from '../types/index.js';
8
- /** Relationship field types supported by population */
9
- export interface PopulateRelationshipField {
10
- type: 'relationship' | 'upload' | 'join';
11
- name: string;
12
- relationTo?: string | string[];
13
- collection?: string | string[];
14
- hasMany?: boolean;
15
- maxDepth?: number;
16
- localized?: boolean;
17
- }
18
- /** Information extracted about a relationship */
19
- export interface RelationInfo {
20
- /** The collection slug this relationship points to */
21
- relationName: string | undefined;
22
- /** The ID(s) to populate */
23
- id: unknown;
24
- /** The related collection config if available */
25
- relatedCollection: unknown;
26
- }
27
- /**
28
- * Extract relationship information from field and data
29
6
  *
30
- * Handles polymorphic relationships, join tables, and direct FK relationships.
31
- */
32
- export declare function extractRelationInfo(field: PopulateRelationshipField, data: unknown, req: {
33
- revealui?: {
34
- collections?: Record<string, unknown>;
35
- };
36
- }): RelationInfo;
37
- /**
38
- * Check if a relationship should be populated based on depth
7
+ * Pure types and utilities live in populate-core.ts (no afterRead imports).
8
+ * This module re-exports them and adds helpers that depend on afterRead.
39
9
  */
40
- export declare function shouldPopulateRelationship(currentDepth: number, depth: number): boolean;
10
+ import type { RevealRequest, TypedFallbackLocale } from '../types/index.js';
11
+ export type { PopulateRelationshipField, RelationInfo, UpdateLocation } from './populate-core.js';
12
+ export { extractRelationInfo, shouldPopulateRelationship, updateDocumentWithPopulatedValue, } from './populate-core.js';
41
13
  /**
42
14
  * Load a related document using the dataLoader
43
15
  *
@@ -83,22 +55,4 @@ export declare function applyNestedPopulation(args: {
83
55
  showHiddenFields: boolean;
84
56
  req: RevealRequest;
85
57
  }): Promise<unknown>;
86
- /**
87
- * Location information for updating a document with populated values
88
- */
89
- export interface UpdateLocation {
90
- index?: number;
91
- key?: string;
92
- }
93
- /**
94
- * Update document with populated relationship value
95
- *
96
- * Handles various field configurations: arrays, localized fields, join tables, etc.
97
- */
98
- export declare function updateDocumentWithPopulatedValue(args: {
99
- dataReference: Record<string, unknown>;
100
- field: PopulateRelationshipField;
101
- relationshipValue: unknown;
102
- location: UpdateLocation;
103
- }): void;
104
58
  //# sourceMappingURL=populate-helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"populate-helpers.d.ts","sourceRoot":"","sources":["../../src/relationships/populate-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"populate-helpers.d.ts","sourceRoot":"","sources":["../../src/relationships/populate-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,KAAK,EAIV,aAAa,EAGb,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAG3B,YAAY,EAAE,yBAAyB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EACL,mBAAmB,EACnB,0BAA0B,EAC1B,gCAAgC,GACjC,MAAM,oBAAoB,CAAC;AAE5B;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,EAAE,EAAE,OAAO,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,mBAAmB,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,GAAG,EAAE;QACH,UAAU,CAAC,EAAE;YACX,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;SAC1C,CAAC;KACH,CAAC;CACH,GAAG,OAAO,CAAC,OAAO,CAAC,CA8DnB;AAED;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,IAAI,EAAE;IAChD,GAAG,EAAE,OAAO,CAAC;IACb,gBAAgB,EAAE;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;QACnB,eAAe,CAAC,EAAE,OAAO,CAAC;KAC3B,CAAC;IACF,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,mBAAmB,CAAC;IACpC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,GAAG,EAAE,aAAa,CAAC;CACpB,GAAG,OAAO,CAAC,OAAO,CAAC,CA+CnB"}
@@ -3,56 +3,13 @@
3
3
  *
4
4
  * Extracted from the monolithic populate() function to improve
5
5
  * maintainability, testability, and clarity.
6
+ *
7
+ * Pure types and utilities live in populate-core.ts (no afterRead imports).
8
+ * This module re-exports them and adds helpers that depend on afterRead.
6
9
  */
7
10
  import { createDataloaderCacheKey } from '../dataloader.js';
8
11
  import { afterRead } from '../fields/hooks/afterRead/index.js';
9
- /**
10
- * Extract relationship information from field and data
11
- *
12
- * Handles polymorphic relationships, join tables, and direct FK relationships.
13
- */
14
- export function extractRelationInfo(field, data, req) {
15
- const dataRecord = data;
16
- // Determine relation name based on field type
17
- let relationName;
18
- if (field.type === 'join') {
19
- relationName = Array.isArray(field.collection)
20
- ? dataRecord.relationTo
21
- : field.collection;
22
- }
23
- else {
24
- relationName = Array.isArray(field.relationTo)
25
- ? dataRecord.relationTo
26
- : field.relationTo;
27
- }
28
- // Get related collection config
29
- const relatedCollection = relationName && req.revealui?.collections ? req.revealui.collections[relationName] : undefined;
30
- // Extract ID based on field configuration
31
- let id;
32
- if (field.type === 'join' && Array.isArray(field.collection)) {
33
- id = dataRecord.value;
34
- }
35
- else if (field.type !== 'join' && Array.isArray(field.relationTo)) {
36
- id = dataRecord.value;
37
- }
38
- else {
39
- id = data;
40
- }
41
- // Normalize ID to string or number
42
- if (typeof id !== 'string' &&
43
- typeof id !== 'number' &&
44
- typeof id?.toString === 'function' &&
45
- typeof id !== 'object') {
46
- id = id.toString();
47
- }
48
- return { relationName, id, relatedCollection };
49
- }
50
- /**
51
- * Check if a relationship should be populated based on depth
52
- */
53
- export function shouldPopulateRelationship(currentDepth, depth) {
54
- return depth > 0 && currentDepth <= depth;
55
- }
12
+ export { extractRelationInfo, shouldPopulateRelationship, updateDocumentWithPopulatedValue, } from './populate-core.js';
56
13
  /**
57
14
  * Load a related document using the dataLoader
58
15
  *
@@ -123,65 +80,3 @@ export async function applyNestedPopulation(args) {
123
80
  showHiddenFields,
124
81
  });
125
82
  }
126
- /**
127
- * Update document with populated relationship value
128
- *
129
- * Handles various field configurations: arrays, localized fields, join tables, etc.
130
- */
131
- export function updateDocumentWithPopulatedValue(args) {
132
- const { dataReference, field, relationshipValue, location } = args;
133
- const { index, key } = location;
134
- // Case 1: Localized array field (has both index and key)
135
- if (typeof index === 'number' && typeof key === 'string') {
136
- const fieldRecord = dataReference[field.name];
137
- const localeRecords = fieldRecord[key];
138
- const localeEntry = localeRecords[index];
139
- if (field.type !== 'join' && Array.isArray(field.relationTo)) {
140
- localeEntry.value = relationshipValue;
141
- }
142
- else if (field.type === 'join' && Array.isArray(field.collection)) {
143
- localeEntry.value = relationshipValue;
144
- }
145
- else {
146
- localeRecords[index] = relationshipValue;
147
- }
148
- return;
149
- }
150
- // Case 2: Array field or localized field (has index or key, but not both)
151
- if (typeof index === 'number' || typeof key === 'string') {
152
- const fieldRecord = dataReference[field.name];
153
- const target = (index ?? key);
154
- if (field.type === 'join') {
155
- if (!Array.isArray(field.collection)) {
156
- const docs = fieldRecord.docs;
157
- docs[target] = relationshipValue;
158
- }
159
- else {
160
- const docs = fieldRecord.docs;
161
- const docEntry = docs[target];
162
- docEntry.value = relationshipValue;
163
- }
164
- }
165
- else if (Array.isArray(field.relationTo)) {
166
- const entries = fieldRecord;
167
- const entry = entries[target];
168
- entry.value = relationshipValue;
169
- }
170
- else {
171
- fieldRecord[target] = relationshipValue;
172
- }
173
- return;
174
- }
175
- // Case 3: Single value (no index or key)
176
- if (field.type !== 'join' && Array.isArray(field.relationTo)) {
177
- const fieldRecord = dataReference[field.name];
178
- fieldRecord.value = relationshipValue;
179
- }
180
- else if (field.type === 'join' && Array.isArray(field.collection)) {
181
- const fieldRecord = dataReference[field.name];
182
- fieldRecord.value = relationshipValue;
183
- }
184
- else {
185
- dataReference[field.name] = relationshipValue;
186
- }
187
- }
@@ -1,4 +1,5 @@
1
1
  import type { PopulateType, TypedFallbackLocale } from '../types/index.js';
2
+ import type { PopulateRelationshipField } from './populate-core.js';
2
3
  interface PopulateRequest {
3
4
  revealui?: {
4
5
  collections?: Record<string, {
@@ -15,15 +16,6 @@ interface PopulateRequest {
15
16
  find?: (options: unknown) => Promise<unknown>;
16
17
  };
17
18
  }
18
- interface PopulateRelationshipField {
19
- type: 'relationship' | 'upload' | 'join';
20
- name: string;
21
- relationTo?: string | string[];
22
- collection?: string | string[];
23
- hasMany?: boolean;
24
- maxDepth?: number;
25
- localized?: boolean;
26
- }
27
19
  type PromiseArgs = {
28
20
  currentDepth: number;
29
21
  depth: number;
@@ -1 +1 @@
1
- {"version":3,"file":"population.d.ts","sourceRoot":"","sources":["../../src/relationships/population.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAiB,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAGzF,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,CAAC,EAAE;gBAAE,eAAe,CAAC,EAAE,OAAO,CAAA;aAAE,CAAA;SAAE,CAAC,CAAA;QACxE,MAAM,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;SAAE,CAAA;KACrC,CAAA;IACD,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAC9C,CAAA;CACF;AAGD,UAAU,yBAAyB;IACjC,IAAI,EAAE,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAA;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC9B,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAkID,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,OAAO,CAAA;IACd,cAAc,EAAE,mBAAmB,CAAA;IACnC,KAAK,EAAE,yBAAyB,CAAA;IAChC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAA;IACrB,cAAc,EAAE,OAAO,CAAA;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAA;IACvB,GAAG,EAAE,eAAe,CAAA;IACpB,gBAAgB,EAAE,OAAO,CAAA;IACzB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC,CAAA;AAED,eAAO,MAAM,6BAA6B,GAAU,0IAYjD,WAAW,KAAG,OAAO,CAAC,IAAI,CAoI5B,CAAA"}
1
+ {"version":3,"file":"population.d.ts","sourceRoot":"","sources":["../../src/relationships/population.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,YAAY,EAAiB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC1F,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAapE,UAAU,eAAe;IACvB,QAAQ,CAAC,EAAE;QACT,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;YAAE,MAAM,CAAC,EAAE;gBAAE,eAAe,CAAC,EAAE,OAAO,CAAA;aAAE,CAAA;SAAE,CAAC,CAAC;QACzE,MAAM,CAAC,EAAE;YAAE,WAAW,CAAC,EAAE,OAAO,EAAE,CAAA;SAAE,CAAC;KACtC,CAAC;IACF,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,CAAC;CACH;AAkHD,KAAK,WAAW,GAAG;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,EAAE,mBAAmB,CAAC;IACpC,KAAK,EAAE,yBAAyB,CAAC;IACjC,MAAM,EAAE,IAAI,GAAG,MAAM,CAAC;IACtB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,GAAG,EAAE,eAAe,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,CAAC;AAEF,eAAO,MAAM,6BAA6B,GAAU,0IAYjD,WAAW,KAAG,OAAO,CAAC,IAAI,CAoI5B,CAAC"}
@@ -1,13 +1,18 @@
1
+ // External type imports
1
2
  import { fieldHasMaxDepth, fieldShouldBeLocalized, fieldSupportsMany, } from '../fields/config/types.js';
3
+ // Pure utilities from populate-core (no circular dependency)
4
+ import { extractRelationInfo, shouldPopulateRelationship, updateDocumentWithPopulatedValue, } from './populate-core.js';
5
+ // Helpers that depend on afterRead (static import — safe because populate-core
6
+ // broke the cycle: population no longer imports from populate-helpers for the
7
+ // functions that afterRead/promise.ts needs)
8
+ import { applyNestedPopulation, loadRelatedDocument } from './populate-helpers.js';
2
9
  /**
3
10
  * Populate a single relationship field
4
11
  *
5
12
  * Refactored from the original monolithic function for better maintainability.
6
- * Uses helper functions from populate-helpers.ts for clarity and testability.
13
+ * Uses helper functions from populate-core.ts and populate-helpers.ts.
7
14
  */
8
15
  const populate = async ({ currentDepth, data, dataReference, depth, draft, fallbackLocale, field, index, key, locale, overrideAccess, populateArg, req, showHiddenFields, }) => {
9
- // Import helpers (dynamic to avoid circular dependencies)
10
- const { extractRelationInfo, shouldPopulateRelationship, loadRelatedDocument, applyNestedPopulation, updateDocumentWithPopulatedValue, } = await import('./populate-helpers.js');
11
16
  // Step 1: Extract relationship information
12
17
  const { relationName, id, relatedCollection } = extractRelationInfo(field, data, req);
13
18
  if (!relatedCollection) {
@@ -1 +1 @@
1
- {"version":3,"file":"revealui.d.ts","sourceRoot":"","sources":["../src/revealui.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uCAAuC,CAAA;AAC1E,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAA;AAE9D,OAAO,EACL,YAAY,EACZ,aAAa,EACb,MAAM,EACN,KAAK,cAAc,GACpB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,OAAO,EACL,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,2BAA2B,CAAA;AAElC,OAAO,EACL,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,+BAA+B,CAAA;AAG7E,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAIxD,OAAO,KAAK,EAAE,0BAA0B,EAAE,4BAA4B,EAAE,MAAM,kBAAkB,CAAA;AAEhG,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,4BAA4B,CAAC,CAIvC;AAED,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,4BAA4B,CAAC,CAIvC;AAED,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,4BAA4B,CAAC,CAIvC;AAED,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,0BAA0B,GAC/B,OAAO,CAAC,4BAA4B,CAAC,CAIvC;AAGD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAA;AAEnE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,2BAA2B,GAAG,OAAO,CA+C5E;AAKD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/D,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GACjB,CAAC,CAGH;AAED,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAA;AACtD,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EACV,aAAa,EACb,qBAAqB,EACrB,aAAa,EACb,uBAAuB,EACxB,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC7E,MAAM,MAAM,WAAW,GAAG,MAAM,CAAA;AAChC,MAAM,MAAM,eAAe,GAAG,aAAa,CAAA;AAC3C,MAAM,MAAM,eAAe,GAAG,uBAAuB,CAAA;AACrD,MAAM,MAAM,aAAa,GAAG,qBAAqB,CAAA;AAGjD,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC1C,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAG/C,YAAY,EAAE,gBAAgB,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAG9E,MAAM,MAAM,iBAAiB,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAC5E,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AACtE,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;AAC1E,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAC1D,MAAM,MAAM,WAAW,GAAG,aAAa,CAAA;AAGvC,MAAM,MAAM,KAAK,GAAG,aAAa,CAAA;AACjC,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,CAAA;AACzC,MAAM,MAAM,SAAS,GAAG,MAAM,CAAA;AAG9B,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,mBAAmB,EAC7B,UAAU,EAAE,OAAO,GAClB,mBAAmB,GAAG,mBAAmB,EAAE,GAAG,SAAS,CAGzD"}
1
+ {"version":3,"file":"revealui.d.ts","sourceRoot":"","sources":["../src/revealui.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"rcc.d.ts","sourceRoot":"","sources":["../../../../src/richtext/exports/client/rcc.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAA0B,kBAAkB,EAAE,MAAM,eAAe,CAAA;AAQ/E,OAAO,EAQL,KAAK,qBAAqB,EAE1B,KAAK,qBAAqB,EAE3B,MAAM,SAAS,CAAA;AAChB,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,OAAO,CAAA;AA2B1C,UAAU,mBAAoB,SAAQ,qBAAqB;IACzD,IAAI,EAAE,OAAO,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;IAC9E,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,EAC5B,KAAK,EAAE,MAAM,KACV,GAAG,CAAC,OAAO,CAAA;IAChB,WAAW,CAAC,EAAE,CACZ,IAAI,EAAE;QACJ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,KAAK,CAAC,EAAE,MAAM,CAAA;QACd,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAA;KACjB,EACD,KAAK,EAAE,MAAM,KACV,GAAG,CAAC,OAAO,GAAG,IAAI,CAAA;CACxB;AAwPD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,CAAC,EAAE,sBAAsB,GAC/B,GAAG,CAAC,OAAO,GAAG,IAAI,CAMpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAS,EACT,GAAG,OAAO,EACX,EAAE;IACD,IAAI,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAA;IAC9C,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,GAAG,sBAAsB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAO9C"}
1
+ {"version":3,"file":"rcc.d.ts","sourceRoot":"","sources":["../../../../src/richtext/exports/client/rcc.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAA0B,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAIhF,OAAO,EAQL,KAAK,qBAAqB,EAE1B,KAAK,qBAAqB,EAE3B,MAAM,SAAS,CAAC;AACjB,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AA2B3C,UAAU,mBAAoB,SAAQ,qBAAqB;IACzD,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,KAAK,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;IAC/E,UAAU,CAAC,EAAE,CACX,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,GAAG,CAAC,OAAO,GAAG,IAAI,EAC5B,KAAK,EAAE,MAAM,KACV,GAAG,CAAC,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,CACZ,IAAI,EAAE;QACJ,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,EACD,KAAK,EAAE,MAAM,KACV,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC;CACzB;AA0PD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,EAC9C,OAAO,CAAC,EAAE,sBAAsB,GAC/B,GAAG,CAAC,OAAO,GAAG,IAAI,CAMpB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,SAAS,EACT,GAAG,OAAO,EACX,EAAE;IACD,IAAI,EAAE,qBAAqB,GAAG,IAAI,GAAG,SAAS,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,sBAAsB,GAAG,GAAG,CAAC,OAAO,GAAG,IAAI,CAO9C"}
@@ -43,7 +43,7 @@ function serializeTextNode(node, index) {
43
43
  function serializeChildren(children, options) {
44
44
  if (!children || children.length === 0)
45
45
  return null;
46
- return _jsx(Fragment, { children: children.map((child, index) => serializeNode(child, index, options)) });
46
+ return (_jsx(Fragment, { children: children.map((child, index) => serializeNode(child, index, options)) }));
47
47
  }
48
48
  function serializeNode(node, index, options) {
49
49
  if (!node)
@@ -7,6 +7,23 @@
7
7
  import type { SerializedEditorState, SerializedLexicalNode } from 'lexical';
8
8
  import { type JSX } from 'react';
9
9
  export type { SerializedEditorState };
10
+ /**
11
+ * Check whether a URL is safe to render in an href attribute.
12
+ *
13
+ * Blocks javascript:, vbscript:, data: (except data:image/ for images),
14
+ * and other dangerous protocols. Handles case-insensitive matching and
15
+ * leading whitespace tricks.
16
+ *
17
+ * @param url - The URL to validate
18
+ * @param context - Whether this URL is for a link href or image src
19
+ * @returns true if the URL is safe to render
20
+ */
21
+ export declare function isSafeUrl(url: string, context?: 'link' | 'image'): boolean;
22
+ /**
23
+ * Sanitize a URL for use in an href or src attribute.
24
+ * Returns '#' if the URL is not safe.
25
+ */
26
+ export declare function sanitizeUrl(url: string, context?: 'link' | 'image'): string;
10
27
  interface SerializedElementNode extends SerializedLexicalNode {
11
28
  type: string;
12
29
  children?: SerializedLexicalNode[];
@@ -1 +1 @@
1
- {"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../../../src/richtext/exports/server/rsc.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rsc.d.ts","sourceRoot":"","sources":["../../../../src/richtext/exports/server/rsc.tsx"],"names":[],"mappings":"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"}
@@ -1,6 +1,62 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Fragment } from 'react';
3
3
  // ============================================
4
+ // URL SANITIZATION
5
+ // ============================================
6
+ /**
7
+ * Protocols that are safe to render in href/src attributes.
8
+ * Anything not matching these will be replaced with '#'.
9
+ */
10
+ const SAFE_LINK_PROTOCOLS = /^(?:https?:|mailto:|tel:|#|\/)/i;
11
+ /**
12
+ * Data URIs that are safe for image src attributes (base64 images only).
13
+ * data:text/html and similar are blocked.
14
+ */
15
+ const SAFE_IMAGE_DATA_URI = /^data:image\//i;
16
+ /**
17
+ * Check whether a URL is safe to render in an href attribute.
18
+ *
19
+ * Blocks javascript:, vbscript:, data: (except data:image/ for images),
20
+ * and other dangerous protocols. Handles case-insensitive matching and
21
+ * leading whitespace tricks.
22
+ *
23
+ * @param url - The URL to validate
24
+ * @param context - Whether this URL is for a link href or image src
25
+ * @returns true if the URL is safe to render
26
+ */
27
+ export function isSafeUrl(url, context = 'link') {
28
+ // Trim whitespace (catches " javascript:" trick)
29
+ const trimmed = url.trim();
30
+ if (trimmed === '' || trimmed === '#') {
31
+ return true;
32
+ }
33
+ // For image context, allow data:image/ URIs (base64 images)
34
+ if (context === 'image' && SAFE_IMAGE_DATA_URI.test(trimmed)) {
35
+ return true;
36
+ }
37
+ // Block all data: URIs for links (and non-image data: for images)
38
+ if (/^data:/i.test(trimmed)) {
39
+ return false;
40
+ }
41
+ // Block javascript: and vbscript: protocols (case-insensitive)
42
+ if (/^(?:javascript|vbscript):/i.test(trimmed)) {
43
+ return false;
44
+ }
45
+ // Relative paths, anchors, and safe protocols are allowed
46
+ if (SAFE_LINK_PROTOCOLS.test(trimmed) || !trimmed.includes(':')) {
47
+ return true;
48
+ }
49
+ // Unknown protocol — block it
50
+ return false;
51
+ }
52
+ /**
53
+ * Sanitize a URL for use in an href or src attribute.
54
+ * Returns '#' if the URL is not safe.
55
+ */
56
+ export function sanitizeUrl(url, context = 'link') {
57
+ return isSafeUrl(url, context) ? url.trim() : '#';
58
+ }
59
+ // ============================================
4
60
  // TEXT FORMAT CONSTANTS
5
61
  // ============================================
6
62
  const IS_BOLD = 1;
@@ -45,7 +101,7 @@ function serializeTextNode(node, index) {
45
101
  function serializeChildren(children, options) {
46
102
  if (!children || children.length === 0)
47
103
  return null;
48
- return _jsx(Fragment, { children: children.map((child, index) => serializeNode(child, index, options)) });
104
+ return (_jsx(Fragment, { children: children.map((child, index) => serializeNode(child, index, options)) }));
49
105
  }
50
106
  /**
51
107
  * Serialize a single Lexical node to React elements
@@ -105,8 +161,8 @@ function serializeNode(node, index, options) {
105
161
  if (options?.renderLink) {
106
162
  return options.renderLink(linkNode, children, index);
107
163
  }
108
- // Default link rendering
109
- const href = linkNode.fields?.url || '#';
164
+ // Default link rendering with URL sanitization
165
+ const href = sanitizeUrl(linkNode.fields?.url || '#', 'link');
110
166
  const target = linkNode.fields?.newTab ? '_blank' : undefined;
111
167
  const rel = linkNode.fields?.newTab ? 'noopener noreferrer' : undefined;
112
168
  return (_jsx("a", { href: href, target: target, rel: rel, children: children }, index));
@@ -115,12 +171,12 @@ function serializeNode(node, index, options) {
115
171
  if (node.type === 'autolink') {
116
172
  const children = serializeChildren(n.children, options);
117
173
  const autoLinkNode = node;
118
- return (_jsx("a", { href: autoLinkNode.url || '#', children: children }, index));
174
+ return (_jsx("a", { href: sanitizeUrl(autoLinkNode.url || '#', 'link'), children: children }, index));
119
175
  }
120
176
  // Image (from upload feature)
121
177
  if (node.type === 'image') {
122
178
  const imageNode = node;
123
- const src = imageNode.fields?.src || '';
179
+ const src = sanitizeUrl(imageNode.fields?.src || '', 'image');
124
180
  const alt = imageNode.fields?.alt || '';
125
181
  const width = imageNode.fields?.width;
126
182
  const height = imageNode.fields?.height;