@aglyn/plugins-crm 1.0.0-beta.221 → 1.0.0-beta.222

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 (514) hide show
  1. package/README.md +2 -1
  2. package/package.json +13 -13
  3. package/src/lib/components/activity-list.js +12 -5
  4. package/src/lib/components/activity-list.js.map +1 -1
  5. package/src/lib/components/companies-bulk-bar.d.ts +1 -4
  6. package/src/lib/components/companies-bulk-bar.js +7 -20
  7. package/src/lib/components/companies-bulk-bar.js.map +1 -1
  8. package/src/lib/components/companies-section.d.ts +3 -3
  9. package/src/lib/components/companies-section.js +149 -46
  10. package/src/lib/components/companies-section.js.map +1 -1
  11. package/src/lib/components/company-edit-drawer.js +281 -20
  12. package/src/lib/components/company-edit-drawer.js.map +1 -1
  13. package/src/lib/components/company-properties-card.js +99 -8
  14. package/src/lib/components/company-properties-card.js.map +1 -1
  15. package/src/lib/components/contact-detail-page.js +3 -1
  16. package/src/lib/components/contact-detail-page.js.map +1 -1
  17. package/src/lib/components/contact-merge-dialog.js +33 -10
  18. package/src/lib/components/contact-merge-dialog.js.map +1 -1
  19. package/src/lib/components/contact-properties-card.d.ts +0 -69
  20. package/src/lib/components/contact-properties-card.js +350 -60
  21. package/src/lib/components/contact-properties-card.js.map +1 -1
  22. package/src/lib/components/contact-reports-to-field.d.ts +46 -0
  23. package/src/lib/components/contact-reports-to-field.js +67 -0
  24. package/src/lib/components/contact-reports-to-field.js.map +1 -0
  25. package/src/lib/components/contacts-bulk-bar.d.ts +1 -8
  26. package/src/lib/components/contacts-bulk-bar.js +7 -19
  27. package/src/lib/components/contacts-bulk-bar.js.map +1 -1
  28. package/src/lib/components/contacts-section.js +46 -33
  29. package/src/lib/components/contacts-section.js.map +1 -1
  30. package/src/lib/components/crm-call-actions.d.ts +10 -0
  31. package/src/lib/components/crm-call-actions.js +26 -9
  32. package/src/lib/components/crm-call-actions.js.map +1 -1
  33. package/src/lib/components/crm-record-picker.d.ts +15 -0
  34. package/src/lib/components/crm-record-picker.js +16 -10
  35. package/src/lib/components/crm-record-picker.js.map +1 -1
  36. package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
  37. package/src/lib/components/crm-transfer-buttons.js +167 -0
  38. package/src/lib/components/crm-transfer-buttons.js.map +1 -0
  39. package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
  40. package/src/lib/components/deal-contact-roles-card.js +368 -0
  41. package/src/lib/components/deal-contact-roles-card.js.map +1 -0
  42. package/src/lib/components/deal-detail-page.d.ts +3 -2
  43. package/src/lib/components/deal-detail-page.js +25 -6
  44. package/src/lib/components/deal-detail-page.js.map +1 -1
  45. package/src/lib/components/deal-edit-drawer.d.ts +10 -0
  46. package/src/lib/components/deal-edit-drawer.js +219 -10
  47. package/src/lib/components/deal-edit-drawer.js.map +1 -1
  48. package/src/lib/components/deal-properties-card.d.ts +7 -0
  49. package/src/lib/components/deal-properties-card.js +34 -3
  50. package/src/lib/components/deal-properties-card.js.map +1 -1
  51. package/src/lib/components/deal-stage-card.d.ts +4 -0
  52. package/src/lib/components/deal-stage-card.js +10 -2
  53. package/src/lib/components/deal-stage-card.js.map +1 -1
  54. package/src/lib/components/deals-bulk-bar.d.ts +0 -3
  55. package/src/lib/components/deals-bulk-bar.js +7 -20
  56. package/src/lib/components/deals-bulk-bar.js.map +1 -1
  57. package/src/lib/components/deals-section.d.ts +3 -3
  58. package/src/lib/components/deals-section.js +123 -63
  59. package/src/lib/components/deals-section.js.map +1 -1
  60. package/src/lib/components/fields-section.js +31 -17
  61. package/src/lib/components/fields-section.js.map +1 -1
  62. package/src/lib/components/lead-convert-dialog.d.ts +4 -0
  63. package/src/lib/components/lead-convert-dialog.js +23 -1
  64. package/src/lib/components/lead-convert-dialog.js.map +1 -1
  65. package/src/lib/components/lead-detail-page.js +8 -2
  66. package/src/lib/components/lead-detail-page.js.map +1 -1
  67. package/src/lib/components/lead-profile-fields.d.ts +71 -0
  68. package/src/lib/components/lead-profile-fields.js +386 -0
  69. package/src/lib/components/lead-profile-fields.js.map +1 -0
  70. package/src/lib/components/lead-properties-card.d.ts +2 -1
  71. package/src/lib/components/lead-properties-card.js +85 -176
  72. package/src/lib/components/lead-properties-card.js.map +1 -1
  73. package/src/lib/components/lead-source-select.d.ts +4 -23
  74. package/src/lib/components/lead-source-select.js +9 -73
  75. package/src/lib/components/lead-source-select.js.map +1 -1
  76. package/src/lib/components/lead-status-chip.d.ts +9 -3
  77. package/src/lib/components/lead-status-chip.js +8 -4
  78. package/src/lib/components/lead-status-chip.js.map +1 -1
  79. package/src/lib/components/lead-status-options.d.ts +20 -0
  80. package/src/lib/components/lead-status-options.js +51 -0
  81. package/src/lib/components/lead-status-options.js.map +1 -0
  82. package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
  83. package/src/lib/components/lead-unqualify-dialog.js +50 -18
  84. package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
  85. package/src/lib/components/leads-bulk-bar.d.ts +0 -3
  86. package/src/lib/components/leads-bulk-bar.js +29 -29
  87. package/src/lib/components/leads-bulk-bar.js.map +1 -1
  88. package/src/lib/components/leads-section.js +120 -68
  89. package/src/lib/components/leads-section.js.map +1 -1
  90. package/src/lib/components/linked-deals-card.d.ts +4 -0
  91. package/src/lib/components/linked-deals-card.js +47 -3
  92. package/src/lib/components/linked-deals-card.js.map +1 -1
  93. package/src/lib/components/log-activity-dialog.js +43 -3
  94. package/src/lib/components/log-activity-dialog.js.map +1 -1
  95. package/src/lib/components/new-contact-drawer.d.ts +8 -0
  96. package/src/lib/components/new-contact-drawer.js +108 -6
  97. package/src/lib/components/new-contact-drawer.js.map +1 -1
  98. package/src/lib/components/new-lead-drawer.d.ts +9 -2
  99. package/src/lib/components/new-lead-drawer.js +88 -121
  100. package/src/lib/components/new-lead-drawer.js.map +1 -1
  101. package/src/lib/components/picklist-select.d.ts +36 -0
  102. package/src/lib/components/picklist-select.js +114 -0
  103. package/src/lib/components/picklist-select.js.map +1 -0
  104. package/src/lib/components/picklist-values-card.d.ts +34 -0
  105. package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
  106. package/src/lib/components/picklist-values-card.js.map +1 -0
  107. package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
  108. package/src/lib/components/pipeline-stages-dialog.js +26 -4
  109. package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
  110. package/src/lib/components/pipelines-dialog.js +15 -6
  111. package/src/lib/components/pipelines-dialog.js.map +1 -1
  112. package/src/lib/components/recent-activity-feed.js +20 -5
  113. package/src/lib/components/recent-activity-feed.js.map +1 -1
  114. package/src/lib/components/recipes-card.js +4 -2
  115. package/src/lib/components/recipes-card.js.map +1 -1
  116. package/src/lib/components/record-tasks-card.js +15 -8
  117. package/src/lib/components/record-tasks-card.js.map +1 -1
  118. package/src/lib/components/reports/forecast-card.d.ts +6 -0
  119. package/src/lib/components/reports/forecast-card.js +101 -3
  120. package/src/lib/components/reports/forecast-card.js.map +1 -1
  121. package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
  122. package/src/lib/components/reports/lead-funnel-card.js +9 -5
  123. package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
  124. package/src/lib/components/reports/lead-source-card.d.ts +23 -0
  125. package/src/lib/components/reports/lead-source-card.js +318 -0
  126. package/src/lib/components/reports/lead-source-card.js.map +1 -0
  127. package/src/lib/components/reports/report-export.js +1 -1
  128. package/src/lib/components/reports/report-export.js.map +1 -1
  129. package/src/lib/components/reports-section.js +8 -0
  130. package/src/lib/components/reports-section.js.map +1 -1
  131. package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
  132. package/src/lib/components/sharing-rule-drawer.js +108 -19
  133. package/src/lib/components/sharing-rule-drawer.js.map +1 -1
  134. package/src/lib/components/sharing-rules-card.js +11 -3
  135. package/src/lib/components/sharing-rules-card.js.map +1 -1
  136. package/src/lib/components/task-cells.d.ts +9 -1
  137. package/src/lib/components/task-cells.js +9 -4
  138. package/src/lib/components/task-cells.js.map +1 -1
  139. package/src/lib/components/task-edit-drawer.js +111 -43
  140. package/src/lib/components/task-edit-drawer.js.map +1 -1
  141. package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
  142. package/src/lib/components/tasks-bulk-bar.js +7 -20
  143. package/src/lib/components/tasks-bulk-bar.js.map +1 -1
  144. package/src/lib/components/tasks-calendar.d.ts +3 -0
  145. package/src/lib/components/tasks-calendar.js +8 -1
  146. package/src/lib/components/tasks-calendar.js.map +1 -1
  147. package/src/lib/components/tasks-section.d.ts +3 -3
  148. package/src/lib/components/tasks-section.js +58 -43
  149. package/src/lib/components/tasks-section.js.map +1 -1
  150. package/src/lib/constants/api-routes.d.ts +2 -9
  151. package/src/lib/constants/api-routes.js +1 -7
  152. package/src/lib/constants/api-routes.js.map +1 -1
  153. package/src/lib/constants/bundle-common.d.ts +6 -0
  154. package/src/lib/constants/bundle-common.js +11 -0
  155. package/src/lib/constants/bundle-common.js.map +1 -1
  156. package/src/lib/constants/company-filters.d.ts +14 -0
  157. package/src/lib/constants/company-filters.js +51 -1
  158. package/src/lib/constants/company-filters.js.map +1 -1
  159. package/src/lib/constants/contact-filters.d.ts +2 -0
  160. package/src/lib/constants/contact-filters.js +18 -1
  161. package/src/lib/constants/contact-filters.js.map +1 -1
  162. package/src/lib/constants/deal-filters.d.ts +22 -1
  163. package/src/lib/constants/deal-filters.js +67 -4
  164. package/src/lib/constants/deal-filters.js.map +1 -1
  165. package/src/lib/declarations.console-server.d.ts +3 -0
  166. package/src/lib/declarations.console-server.js +35 -0
  167. package/src/lib/declarations.console-server.js.map +1 -1
  168. package/src/lib/declarations.d.ts +26 -0
  169. package/src/lib/declarations.js +35 -0
  170. package/src/lib/declarations.js.map +1 -0
  171. package/src/lib/declarations.server.d.ts +11 -0
  172. package/src/lib/declarations.server.js +92 -1
  173. package/src/lib/declarations.server.js.map +1 -1
  174. package/src/lib/hooks/use-company-picklists.d.ts +15 -0
  175. package/src/lib/hooks/use-company-picklists.js +55 -0
  176. package/src/lib/hooks/use-company-picklists.js.map +1 -0
  177. package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
  178. package/src/lib/hooks/use-crm-picklist.js +53 -0
  179. package/src/lib/hooks/use-crm-picklist.js.map +1 -0
  180. package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
  181. package/src/lib/hooks/use-crm-record-names.js +45 -19
  182. package/src/lib/hooks/use-crm-record-names.js.map +1 -1
  183. package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
  184. package/src/lib/hooks/use-crm-task-picklists.js +45 -0
  185. package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
  186. package/src/lib/hooks/use-deals.d.ts +14 -0
  187. package/src/lib/hooks/use-deals.js +29 -0
  188. package/src/lib/hooks/use-deals.js.map +1 -1
  189. package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
  190. package/src/lib/hooks/use-lead-picklists.js +46 -0
  191. package/src/lib/hooks/use-lead-picklists.js.map +1 -0
  192. package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
  193. package/src/lib/hooks/use-lead-source-picklist.js +12 -22
  194. package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
  195. package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
  196. package/src/lib/hooks/use-lead-status-picklist.js +40 -0
  197. package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
  198. package/src/lib/model/companies.d.ts +32 -3
  199. package/src/lib/model/companies.js +133 -16
  200. package/src/lib/model/companies.js.map +1 -1
  201. package/src/lib/model/contact-merge.d.ts +27 -3
  202. package/src/lib/model/contact-merge.js +81 -7
  203. package/src/lib/model/contact-merge.js.map +1 -1
  204. package/src/lib/model/contact-record.d.ts +17 -0
  205. package/src/lib/model/contact-record.js +15 -1
  206. package/src/lib/model/contact-record.js.map +1 -1
  207. package/src/lib/model/contact-update.d.ts +31 -2
  208. package/src/lib/model/contact-update.js +14 -0
  209. package/src/lib/model/contact-update.js.map +1 -1
  210. package/src/lib/model/crm-list-query.d.ts +5 -0
  211. package/src/lib/model/crm-list-query.js +8 -0
  212. package/src/lib/model/crm-list-query.js.map +1 -1
  213. package/src/lib/model/crm-recipes.d.ts +40 -0
  214. package/src/lib/model/crm-recipes.js +244 -0
  215. package/src/lib/model/crm-recipes.js.map +1 -0
  216. package/src/lib/model/crm-record-counts.d.ts +36 -0
  217. package/src/lib/model/crm-record-counts.js +54 -0
  218. package/src/lib/model/crm-record-counts.js.map +1 -0
  219. package/src/lib/model/crm-record-lists.d.ts +23 -0
  220. package/src/lib/model/crm-record-lists.js +161 -0
  221. package/src/lib/model/crm-record-lists.js.map +1 -0
  222. package/src/lib/model/crm-reports.d.ts +73 -3
  223. package/src/lib/model/crm-reports.js +120 -1
  224. package/src/lib/model/crm-reports.js.map +1 -1
  225. package/src/lib/model/crm-sharing.d.ts +21 -3
  226. package/src/lib/model/crm-sharing.js +27 -6
  227. package/src/lib/model/crm-sharing.js.map +1 -1
  228. package/src/lib/model/deal-board-model.d.ts +8 -2
  229. package/src/lib/model/deal-board-model.js +15 -2
  230. package/src/lib/model/deal-board-model.js.map +1 -1
  231. package/src/lib/model/deal-contact-roles.d.ts +45 -0
  232. package/src/lib/model/deal-contact-roles.js +73 -0
  233. package/src/lib/model/deal-contact-roles.js.map +1 -0
  234. package/src/lib/model/deal-form-model.d.ts +56 -0
  235. package/src/lib/model/deal-form-model.js +79 -7
  236. package/src/lib/model/deal-form-model.js.map +1 -1
  237. package/src/lib/model/download-text-file.d.ts +23 -0
  238. package/src/lib/model/download-text-file.js +34 -0
  239. package/src/lib/model/download-text-file.js.map +1 -0
  240. package/src/lib/model/lead-filters.d.ts +36 -2
  241. package/src/lib/model/lead-filters.js +123 -2
  242. package/src/lib/model/lead-filters.js.map +1 -1
  243. package/src/lib/model/lead-source-direction.d.ts +38 -0
  244. package/src/lib/model/lead-source-direction.js +52 -0
  245. package/src/lib/model/lead-source-direction.js.map +1 -0
  246. package/src/lib/model/picklist-values.d.ts +119 -0
  247. package/src/lib/model/picklist-values.js +256 -0
  248. package/src/lib/model/picklist-values.js.map +1 -0
  249. package/src/lib/model/record-facts-disclosed.d.ts +81 -0
  250. package/src/lib/model/record-facts-disclosed.js +281 -0
  251. package/src/lib/model/record-facts-disclosed.js.map +1 -0
  252. package/src/lib/model/record-facts.d.ts +215 -34
  253. package/src/lib/model/record-facts.js +307 -128
  254. package/src/lib/model/record-facts.js.map +1 -1
  255. package/src/lib/model/task-picklists.d.ts +52 -0
  256. package/src/lib/model/task-picklists.js +83 -0
  257. package/src/lib/model/task-picklists.js.map +1 -0
  258. package/src/lib/model/task-routes.d.ts +13 -0
  259. package/src/lib/model/task-routes.js +23 -4
  260. package/src/lib/model/task-routes.js.map +1 -1
  261. package/src/lib/plan-entitlements.js +6 -4
  262. package/src/lib/plan-entitlements.js.map +1 -1
  263. package/src/lib/plugin.js +17 -0
  264. package/src/lib/plugin.js.map +1 -1
  265. package/src/lib/server/api-v1/contacts.js +220 -14
  266. package/src/lib/server/api-v1/contacts.js.map +1 -1
  267. package/src/lib/server/api-v1/crm-activities.js +14 -1
  268. package/src/lib/server/api-v1/crm-activities.js.map +1 -1
  269. package/src/lib/server/api-v1/crm-companies.js +123 -14
  270. package/src/lib/server/api-v1/crm-companies.js.map +1 -1
  271. package/src/lib/server/api-v1/crm-deals.js +291 -26
  272. package/src/lib/server/api-v1/crm-deals.js.map +1 -1
  273. package/src/lib/server/api-v1/crm-leads.js +144 -38
  274. package/src/lib/server/api-v1/crm-leads.js.map +1 -1
  275. package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
  276. package/src/lib/server/api-v1/crm-pipelines.js +8 -2
  277. package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
  278. package/src/lib/server/api-v1/crm-tasks.js +75 -33
  279. package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
  280. package/src/lib/server/api-v1/openapi.d.ts +0 -11
  281. package/src/lib/server/api-v1/openapi.js +171 -16
  282. package/src/lib/server/api-v1/openapi.js.map +1 -1
  283. package/src/lib/server/assign-contact-owner.d.ts +162 -0
  284. package/src/lib/server/assign-contact-owner.js +340 -0
  285. package/src/lib/server/assign-contact-owner.js.map +1 -0
  286. package/src/lib/server/associate-company-by-domain.d.ts +70 -0
  287. package/src/lib/server/associate-company-by-domain.js +153 -0
  288. package/src/lib/server/associate-company-by-domain.js.map +1 -0
  289. package/src/lib/server/automation-steps.d.ts +139 -0
  290. package/src/lib/server/automation-steps.js +472 -0
  291. package/src/lib/server/automation-steps.js.map +1 -0
  292. package/src/lib/server/capture-contact.js +65 -21
  293. package/src/lib/server/capture-contact.js.map +1 -1
  294. package/src/lib/server/capture-host-contact.d.ts +104 -0
  295. package/src/lib/server/capture-host-contact.js +151 -0
  296. package/src/lib/server/capture-host-contact.js.map +1 -0
  297. package/src/lib/server/company-children.d.ts +25 -0
  298. package/src/lib/server/company-children.js +42 -0
  299. package/src/lib/server/company-children.js.map +1 -0
  300. package/src/lib/server/company-delete.d.ts +18 -0
  301. package/src/lib/server/company-delete.js +44 -21
  302. package/src/lib/server/company-delete.js.map +1 -1
  303. package/src/lib/server/contact-email-history.js +21 -19
  304. package/src/lib/server/contact-email-history.js.map +1 -1
  305. package/src/lib/server/contact-remove.js +27 -2
  306. package/src/lib/server/contact-remove.js.map +1 -1
  307. package/src/lib/server/contact-reports-to.d.ts +61 -0
  308. package/src/lib/server/contact-reports-to.js +114 -0
  309. package/src/lib/server/contact-reports-to.js.map +1 -0
  310. package/src/lib/server/contact-update.d.ts +42 -1
  311. package/src/lib/server/contact-update.js +204 -23
  312. package/src/lib/server/contact-update.js.map +1 -1
  313. package/src/lib/server/convert-host-lead.d.ts +46 -1
  314. package/src/lib/server/convert-host-lead.js +173 -15
  315. package/src/lib/server/convert-host-lead.js.map +1 -1
  316. package/src/lib/server/convert-open-lead.js +12 -5
  317. package/src/lib/server/convert-open-lead.js.map +1 -1
  318. package/src/lib/server/crm-record-indexes.d.ts +45 -0
  319. package/src/lib/server/crm-record-indexes.js +78 -0
  320. package/src/lib/server/crm-record-indexes.js.map +1 -0
  321. package/src/lib/server/crm-sharing.d.ts +9 -1
  322. package/src/lib/server/crm-sharing.js +23 -3
  323. package/src/lib/server/crm-sharing.js.map +1 -1
  324. package/src/lib/server/deal-contact-roles.d.ts +27 -0
  325. package/src/lib/server/deal-contact-roles.js +89 -0
  326. package/src/lib/server/deal-contact-roles.js.map +1 -0
  327. package/src/lib/server/lead-convert.d.ts +5 -0
  328. package/src/lib/server/lead-convert.js +19 -3
  329. package/src/lib/server/lead-convert.js.map +1 -1
  330. package/src/lib/server/lead-create.d.ts +17 -2
  331. package/src/lib/server/lead-create.js +46 -14
  332. package/src/lib/server/lead-create.js.map +1 -1
  333. package/src/lib/server/lead-nurturing.d.ts +6 -0
  334. package/src/lib/server/lead-nurturing.js +57 -20
  335. package/src/lib/server/lead-nurturing.js.map +1 -1
  336. package/src/lib/server/lead-picklists.d.ts +35 -0
  337. package/src/lib/server/lead-picklists.js +52 -0
  338. package/src/lib/server/lead-picklists.js.map +1 -0
  339. package/src/lib/server/lead-source-picklist.d.ts +1 -13
  340. package/src/lib/server/lead-source-picklist.js +6 -33
  341. package/src/lib/server/lead-source-picklist.js.map +1 -1
  342. package/src/lib/server/merge-contacts.js +22 -4
  343. package/src/lib/server/merge-contacts.js.map +1 -1
  344. package/src/lib/server/person-eraser.d.ts +53 -0
  345. package/src/lib/server/person-eraser.js +149 -0
  346. package/src/lib/server/person-eraser.js.map +1 -0
  347. package/src/lib/server/person-records.d.ts +69 -0
  348. package/src/lib/server/person-records.js +317 -0
  349. package/src/lib/server/person-records.js.map +1 -0
  350. package/src/lib/server/person-refund.d.ts +97 -0
  351. package/src/lib/server/person-refund.js +221 -0
  352. package/src/lib/server/person-refund.js.map +1 -0
  353. package/src/lib/server/picklist-values.d.ts +21 -0
  354. package/src/lib/server/picklist-values.js +308 -0
  355. package/src/lib/server/picklist-values.js.map +1 -0
  356. package/src/lib/server/read-picklist.d.ts +44 -0
  357. package/src/lib/server/read-picklist.js +65 -0
  358. package/src/lib/server/read-picklist.js.map +1 -0
  359. package/src/lib/server/recipe-routes.js +15 -7
  360. package/src/lib/server/recipe-routes.js.map +1 -1
  361. package/src/lib/server/record-email-state.js +7 -1
  362. package/src/lib/server/record-email-state.js.map +1 -1
  363. package/src/lib/server/record-facts.d.ts +3 -0
  364. package/src/lib/server/record-facts.js +233 -31
  365. package/src/lib/server/record-facts.js.map +1 -1
  366. package/src/lib/server/record-origin.d.ts +27 -0
  367. package/src/lib/server/record-origin.js +104 -0
  368. package/src/lib/server/record-origin.js.map +1 -0
  369. package/src/lib/server/record-timeline.js +15 -2
  370. package/src/lib/server/record-timeline.js.map +1 -1
  371. package/src/lib/server/suite-gate.js +4 -3
  372. package/src/lib/server/suite-gate.js.map +1 -1
  373. package/src/lib/server/task-routes.js +30 -16
  374. package/src/lib/server/task-routes.js.map +1 -1
  375. package/src/lib/server-deal-stage.d.ts +5 -1
  376. package/src/lib/server-deal-stage.js +10 -5
  377. package/src/lib/server-deal-stage.js.map +1 -1
  378. package/src/lib/server.d.ts +8 -3
  379. package/src/lib/server.js +47 -43
  380. package/src/lib/server.js.map +1 -1
  381. package/src/lib/testing/memory-firestore.d.ts +55 -0
  382. package/src/lib/testing/memory-firestore.js +335 -0
  383. package/src/lib/testing/memory-firestore.js.map +1 -0
  384. package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
  385. package/src/lib/testing/stand-in-email-send-index.js +49 -0
  386. package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
  387. package/src/lib/transfer/activities.d.ts +30 -0
  388. package/src/lib/transfer/activities.js +132 -0
  389. package/src/lib/transfer/activities.js.map +1 -0
  390. package/src/lib/transfer/aliases.d.ts +22 -0
  391. package/src/lib/transfer/aliases.js +1342 -0
  392. package/src/lib/transfer/aliases.js.map +1 -0
  393. package/src/lib/transfer/common.d.ts +222 -0
  394. package/src/lib/transfer/common.js +832 -0
  395. package/src/lib/transfer/common.js.map +1 -0
  396. package/src/lib/transfer/companies.d.ts +43 -0
  397. package/src/lib/transfer/companies.js +549 -0
  398. package/src/lib/transfer/companies.js.map +1 -0
  399. package/src/lib/transfer/contacts.d.ts +31 -0
  400. package/src/lib/transfer/contacts.js +727 -0
  401. package/src/lib/transfer/contacts.js.map +1 -0
  402. package/src/lib/transfer/deals.d.ts +66 -0
  403. package/src/lib/transfer/deals.js +698 -0
  404. package/src/lib/transfer/deals.js.map +1 -0
  405. package/src/lib/transfer/email-templates-package.d.ts +40 -0
  406. package/src/lib/transfer/email-templates-package.js +76 -0
  407. package/src/lib/transfer/email-templates-package.js.map +1 -0
  408. package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
  409. package/src/lib/transfer/email-templates-package.server.js +176 -0
  410. package/src/lib/transfer/email-templates-package.server.js.map +1 -0
  411. package/src/lib/transfer/fields.d.ts +102 -0
  412. package/src/lib/transfer/fields.js +1755 -0
  413. package/src/lib/transfer/fields.js.map +1 -0
  414. package/src/lib/transfer/leads.d.ts +30 -0
  415. package/src/lib/transfer/leads.js +582 -0
  416. package/src/lib/transfer/leads.js.map +1 -0
  417. package/src/lib/transfer/pipelines.d.ts +21 -0
  418. package/src/lib/transfer/pipelines.js +172 -0
  419. package/src/lib/transfer/pipelines.js.map +1 -0
  420. package/src/lib/transfer/register.d.ts +47 -0
  421. package/src/lib/transfer/register.js +277 -0
  422. package/src/lib/transfer/register.js.map +1 -0
  423. package/src/lib/transfer/tasks.d.ts +30 -0
  424. package/src/lib/transfer/tasks.js +418 -0
  425. package/src/lib/transfer/tasks.js.map +1 -0
  426. package/src/lib/transfer/ui.d.ts +20 -0
  427. package/src/lib/transfer/ui.js +42 -0
  428. package/src/lib/transfer/ui.js.map +1 -0
  429. package/src/lib/components/company-import-drawer.d.ts +0 -42
  430. package/src/lib/components/company-import-drawer.js +0 -99
  431. package/src/lib/components/company-import-drawer.js.map +0 -1
  432. package/src/lib/components/contact-import-drawer.d.ts +0 -46
  433. package/src/lib/components/contact-import-drawer.js +0 -149
  434. package/src/lib/components/contact-import-drawer.js.map +0 -1
  435. package/src/lib/components/crm-export-all-button.d.ts +0 -39
  436. package/src/lib/components/crm-export-all-button.js +0 -98
  437. package/src/lib/components/crm-export-all-button.js.map +0 -1
  438. package/src/lib/components/csv-import-drawer.d.ts +0 -139
  439. package/src/lib/components/csv-import-drawer.js +0 -757
  440. package/src/lib/components/csv-import-drawer.js.map +0 -1
  441. package/src/lib/components/deal-import-drawer.d.ts +0 -24
  442. package/src/lib/components/deal-import-drawer.js +0 -83
  443. package/src/lib/components/deal-import-drawer.js.map +0 -1
  444. package/src/lib/components/lead-import-drawer.d.ts +0 -27
  445. package/src/lib/components/lead-import-drawer.js +0 -118
  446. package/src/lib/components/lead-import-drawer.js.map +0 -1
  447. package/src/lib/components/lead-source-values-card.d.ts +0 -27
  448. package/src/lib/components/lead-source-values-card.js.map +0 -1
  449. package/src/lib/components/task-import-drawer.d.ts +0 -24
  450. package/src/lib/components/task-import-drawer.js +0 -82
  451. package/src/lib/components/task-import-drawer.js.map +0 -1
  452. package/src/lib/model/companies-csv.d.ts +0 -36
  453. package/src/lib/model/companies-csv.js +0 -38
  454. package/src/lib/model/companies-csv.js.map +0 -1
  455. package/src/lib/model/contacts-csv.d.ts +0 -54
  456. package/src/lib/model/contacts-csv.js +0 -67
  457. package/src/lib/model/contacts-csv.js.map +0 -1
  458. package/src/lib/model/crm-company-import.d.ts +0 -154
  459. package/src/lib/model/crm-company-import.js +0 -331
  460. package/src/lib/model/crm-company-import.js.map +0 -1
  461. package/src/lib/model/crm-csv.d.ts +0 -239
  462. package/src/lib/model/crm-csv.js +0 -467
  463. package/src/lib/model/crm-csv.js.map +0 -1
  464. package/src/lib/model/crm-deal-import.d.ts +0 -112
  465. package/src/lib/model/crm-deal-import.js +0 -263
  466. package/src/lib/model/crm-deal-import.js.map +0 -1
  467. package/src/lib/model/crm-import.d.ts +0 -250
  468. package/src/lib/model/crm-import.js +0 -467
  469. package/src/lib/model/crm-import.js.map +0 -1
  470. package/src/lib/model/crm-lead-import.d.ts +0 -138
  471. package/src/lib/model/crm-lead-import.js +0 -446
  472. package/src/lib/model/crm-lead-import.js.map +0 -1
  473. package/src/lib/model/crm-task-import.d.ts +0 -94
  474. package/src/lib/model/crm-task-import.js +0 -275
  475. package/src/lib/model/crm-task-import.js.map +0 -1
  476. package/src/lib/model/deals-csv.d.ts +0 -32
  477. package/src/lib/model/deals-csv.js +0 -36
  478. package/src/lib/model/deals-csv.js.map +0 -1
  479. package/src/lib/model/import-column-shapes.d.ts +0 -36
  480. package/src/lib/model/import-column-shapes.js +0 -76
  481. package/src/lib/model/import-column-shapes.js.map +0 -1
  482. package/src/lib/model/lead-source-values.d.ts +0 -82
  483. package/src/lib/model/lead-source-values.js +0 -149
  484. package/src/lib/model/lead-source-values.js.map +0 -1
  485. package/src/lib/model/leads-csv.d.ts +0 -40
  486. package/src/lib/model/leads-csv.js +0 -40
  487. package/src/lib/model/leads-csv.js.map +0 -1
  488. package/src/lib/model/tasks-csv.d.ts +0 -28
  489. package/src/lib/model/tasks-csv.js +0 -28
  490. package/src/lib/model/tasks-csv.js.map +0 -1
  491. package/src/lib/server/companies-import.d.ts +0 -57
  492. package/src/lib/server/companies-import.js +0 -242
  493. package/src/lib/server/companies-import.js.map +0 -1
  494. package/src/lib/server/contacts-import.d.ts +0 -109
  495. package/src/lib/server/contacts-import.js +0 -393
  496. package/src/lib/server/contacts-import.js.map +0 -1
  497. package/src/lib/server/deals-import.d.ts +0 -76
  498. package/src/lib/server/deals-import.js +0 -248
  499. package/src/lib/server/deals-import.js.map +0 -1
  500. package/src/lib/server/export-route.d.ts +0 -60
  501. package/src/lib/server/export-route.js +0 -447
  502. package/src/lib/server/export-route.js.map +0 -1
  503. package/src/lib/server/import-context.d.ts +0 -87
  504. package/src/lib/server/import-context.js +0 -182
  505. package/src/lib/server/import-context.js.map +0 -1
  506. package/src/lib/server/lead-source-values.d.ts +0 -50
  507. package/src/lib/server/lead-source-values.js +0 -191
  508. package/src/lib/server/lead-source-values.js.map +0 -1
  509. package/src/lib/server/leads-import.d.ts +0 -84
  510. package/src/lib/server/leads-import.js +0 -367
  511. package/src/lib/server/leads-import.js.map +0 -1
  512. package/src/lib/server/tasks-import.d.ts +0 -54
  513. package/src/lib/server/tasks-import.js +0 -160
  514. package/src/lib/server/tasks-import.js.map +0 -1
@@ -0,0 +1,335 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /*==========================================
17
+ * AN IN-MEMORY ADMIN FIRESTORE, for the transfer resources' specs
18
+ * (AGL-3527).
19
+ *
20
+ * Documents by path; the operators the CRM's transfer hooks and the job
21
+ * engine issue — `where` (equality, ranges, `in`, the array operators),
22
+ * `orderBy` (a field or the document id), `limit`, `startAfter`, `count`,
23
+ * `getAll`, batches and read-then-write transactions — and the write
24
+ * sentinels (`delete`, `serverTimestamp`, `arrayUnion`, `arrayRemove`,
25
+ * `increment`) applied along dotted paths, as Firestore applies them.
26
+ *
27
+ * A spec mocks `firebase-admin/firestore` with {@link memoryFirestoreModule}
28
+ * so the code under test builds its sentinels from the same table.
29
+ *=========================================*/ import { _ as _extends } from "@swc/helpers/_/_extends";
30
+ const DOCUMENT_ID = {
31
+ __documentId: true
32
+ };
33
+ /** What a spec hands `jest.mock('firebase-admin/firestore', …)`. */ export const memoryFirestoreModule = {
34
+ __esModule: true,
35
+ FieldValue: {
36
+ delete: ()=>({
37
+ __sentinel: 'delete'
38
+ }),
39
+ serverTimestamp: ()=>({
40
+ __sentinel: 'serverTimestamp'
41
+ }),
42
+ arrayUnion: (...values)=>({
43
+ __sentinel: 'arrayUnion',
44
+ values
45
+ }),
46
+ arrayRemove: (...values)=>({
47
+ __sentinel: 'arrayRemove',
48
+ values
49
+ }),
50
+ increment: (by)=>({
51
+ __sentinel: 'increment',
52
+ by
53
+ })
54
+ },
55
+ FieldPath: {
56
+ documentId: ()=>DOCUMENT_ID
57
+ },
58
+ Timestamp: {
59
+ fromDate: (date)=>date.getTime()
60
+ }
61
+ };
62
+ const isSentinel = (value)=>Boolean(value && typeof value === 'object' && '__sentinel' in value);
63
+ const copy = (value)=>value === undefined ? value : JSON.parse(JSON.stringify(value));
64
+ function readPath(data, path) {
65
+ return path.split('.').reduce((node, key)=>node == null ? void 0 : node[key], data);
66
+ }
67
+ /** A fresh in-memory Firestore. */ export function memoryFirestore(clock = ()=>1800000000000) {
68
+ const docs = new Map();
69
+ const resolve = (value, current)=>{
70
+ if (!isSentinel(value)) return Array.isArray(value) || value && typeof value === 'object' ? copy(value) : value;
71
+ switch(value.__sentinel){
72
+ case 'serverTimestamp':
73
+ return clock();
74
+ case 'arrayUnion':
75
+ var _value_values;
76
+ return [
77
+ ...new Set([
78
+ ...Array.isArray(current) ? current : [],
79
+ ...(_value_values = value.values) != null ? _value_values : []
80
+ ])
81
+ ];
82
+ case 'arrayRemove':
83
+ return (Array.isArray(current) ? current : []).filter((entry)=>{
84
+ var _value_values;
85
+ return !((_value_values = value.values) != null ? _value_values : []).includes(entry);
86
+ });
87
+ case 'increment':
88
+ var _value_by;
89
+ return Number(current != null ? current : 0) + Number((_value_by = value.by) != null ? _value_by : 0);
90
+ default:
91
+ return undefined;
92
+ }
93
+ };
94
+ /** Writes `value` at a dotted path, a `delete` sentinel removing the leaf. */ const writePath = (target, path, value)=>{
95
+ const keys = path.split('.');
96
+ let node = target;
97
+ for (const key of keys.slice(0, -1)){
98
+ if (!node[key] || typeof node[key] !== 'object') node[key] = {};
99
+ node = node[key];
100
+ }
101
+ const leaf = keys[keys.length - 1];
102
+ if (isSentinel(value) && value.__sentinel === 'delete') delete node[leaf];
103
+ else node[leaf] = resolve(value, node[leaf]);
104
+ };
105
+ /** Every top-level key of `data` with sentinels resolved (a `set`). */ const settle = (data, base = {})=>{
106
+ const next = copy(base);
107
+ for (const [key, value] of Object.entries(data)){
108
+ if (value === undefined) continue;
109
+ if (isSentinel(value)) writePath(next, key, value);
110
+ else if (value && typeof value === 'object' && !Array.isArray(value) && base[key] && typeof base[key] === 'object') {
111
+ next[key] = settle(value, base[key]);
112
+ } else next[key] = resolve(value, next[key]);
113
+ }
114
+ return next;
115
+ };
116
+ const snapshot = (path)=>{
117
+ const data = docs.get(path);
118
+ return {
119
+ id: path.slice(path.lastIndexOf('/') + 1),
120
+ ref: docRef(path),
121
+ exists: data !== undefined,
122
+ data: ()=>copy(data),
123
+ get: (field)=>copy(readPath(data, field))
124
+ };
125
+ };
126
+ const docRef = (path)=>({
127
+ id: path.slice(path.lastIndexOf('/') + 1),
128
+ path,
129
+ get firestore () {
130
+ return firestore;
131
+ },
132
+ get parent () {
133
+ return collectionRef(path.slice(0, path.lastIndexOf('/')));
134
+ },
135
+ collection: (name)=>collectionRef(`${path}/${name}`),
136
+ get: async ()=>snapshot(path),
137
+ set: async (data, options)=>{
138
+ var _docs_get;
139
+ docs.set(path, settle(data, (options == null ? void 0 : options.merge) ? (_docs_get = docs.get(path)) != null ? _docs_get : {} : {}));
140
+ },
141
+ create: async (data)=>{
142
+ if (docs.has(path)) throw Object.assign(new Error(`ALREADY_EXISTS: ${path}`), {
143
+ code: 6
144
+ });
145
+ docs.set(path, settle(data));
146
+ },
147
+ update: async (...args)=>{
148
+ const current = docs.get(path);
149
+ if (!current) throw Object.assign(new Error(`NOT_FOUND: ${path}`), {
150
+ code: 5
151
+ });
152
+ const patch = typeof args[0] === 'string' ? Object.fromEntries(Array.from({
153
+ length: args.length / 2
154
+ }, (_unused, at)=>[
155
+ String(args[at * 2]),
156
+ args[at * 2 + 1]
157
+ ])) : args[0];
158
+ const next = copy(current);
159
+ for (const [key, value] of Object.entries(patch))writePath(next, key, value);
160
+ docs.set(path, next);
161
+ },
162
+ delete: async ()=>{
163
+ docs.delete(path);
164
+ }
165
+ });
166
+ const fieldOf = (data, id, field)=>field === DOCUMENT_ID ? id : readPath(data, field);
167
+ const compare = (a, b)=>{
168
+ if (a === b) return 0;
169
+ if (a === undefined || a === null) return -1;
170
+ if (b === undefined || b === null) return 1;
171
+ return a < b ? -1 : 1;
172
+ };
173
+ const matches = (data, id, filter)=>{
174
+ const value = fieldOf(data, id, filter.field);
175
+ const wanted = filter.value;
176
+ switch(filter.op){
177
+ case '==':
178
+ return JSON.stringify(value) === JSON.stringify(wanted);
179
+ case '!=':
180
+ return value !== undefined && JSON.stringify(value) !== JSON.stringify(wanted);
181
+ case 'in':
182
+ return wanted.some((entry)=>JSON.stringify(entry) === JSON.stringify(value));
183
+ case 'not-in':
184
+ return value !== undefined && !wanted.some((entry)=>JSON.stringify(entry) === JSON.stringify(value));
185
+ case 'array-contains':
186
+ return Array.isArray(value) && value.includes(wanted);
187
+ case 'array-contains-any':
188
+ return Array.isArray(value) && value.some((entry)=>wanted.includes(entry));
189
+ case '<':
190
+ return value !== undefined && compare(value, wanted) < 0;
191
+ case '<=':
192
+ return value !== undefined && compare(value, wanted) <= 0;
193
+ case '>':
194
+ return value !== undefined && compare(value, wanted) > 0;
195
+ case '>=':
196
+ return value !== undefined && compare(value, wanted) >= 0;
197
+ default:
198
+ throw new Error(`memory firestore: no operator ${filter.op}`);
199
+ }
200
+ };
201
+ const run = (state)=>{
202
+ const prefix = `${state.path}/`;
203
+ let found = [
204
+ ...docs.entries()
205
+ ].filter(([path])=>path.startsWith(prefix) && !path.slice(prefix.length).includes('/')).map(([path, data])=>({
206
+ path,
207
+ id: path.slice(prefix.length),
208
+ data
209
+ })).filter((entry)=>state.filters.every((filter)=>matches(entry.data, entry.id, filter)));
210
+ const order = state.order.length ? state.order : [
211
+ {
212
+ field: DOCUMENT_ID,
213
+ direction: 'asc'
214
+ }
215
+ ];
216
+ for (const { field } of order){
217
+ if (field !== DOCUMENT_ID) found = found.filter((entry)=>readPath(entry.data, field) !== undefined);
218
+ }
219
+ found.sort((a, b)=>{
220
+ for (const { field, direction } of [
221
+ ...order,
222
+ {
223
+ field: DOCUMENT_ID,
224
+ direction: 'asc'
225
+ }
226
+ ]){
227
+ const result = compare(fieldOf(a.data, a.id, field), fieldOf(b.data, b.id, field));
228
+ if (result) return direction === 'desc' ? -result : result;
229
+ }
230
+ return 0;
231
+ });
232
+ if (state.after) {
233
+ const at = found.findIndex((entry)=>entry.id === state.after.id);
234
+ found = at >= 0 ? found.slice(at + 1) : found;
235
+ }
236
+ if (state.limit !== undefined) found = found.slice(0, state.limit);
237
+ return found.map((entry)=>snapshot(entry.path));
238
+ };
239
+ const query = (state)=>({
240
+ where: (field, op, value)=>query(_extends({}, state, {
241
+ filters: [
242
+ ...state.filters,
243
+ {
244
+ field,
245
+ op,
246
+ value
247
+ }
248
+ ]
249
+ })),
250
+ orderBy: (field, direction = 'asc')=>query(_extends({}, state, {
251
+ order: [
252
+ ...state.order,
253
+ {
254
+ field,
255
+ direction
256
+ }
257
+ ]
258
+ })),
259
+ limit: (count)=>query(_extends({}, state, {
260
+ limit: count
261
+ })),
262
+ startAfter: (after)=>query(_extends({}, state, {
263
+ after
264
+ })),
265
+ get: async ()=>{
266
+ const found = run(state);
267
+ return {
268
+ docs: found,
269
+ empty: !found.length,
270
+ size: found.length
271
+ };
272
+ },
273
+ count: ()=>({
274
+ get: async ()=>({
275
+ data: ()=>({
276
+ count: run(_extends({}, state, {
277
+ limit: undefined
278
+ })).length
279
+ })
280
+ })
281
+ })
282
+ });
283
+ const collectionRef = (path)=>_extends({
284
+ id: path.slice(path.lastIndexOf('/') + 1),
285
+ path,
286
+ get parent () {
287
+ const at = path.lastIndexOf('/');
288
+ return at > 0 ? docRef(path.slice(0, at)) : null;
289
+ },
290
+ doc: (id)=>docRef(`${path}/${id != null ? id : `auto${Math.random().toString(36).slice(2, 12)}`}`)
291
+ }, query({
292
+ path,
293
+ filters: [],
294
+ order: []
295
+ }));
296
+ const firestore = {
297
+ collection: (name)=>collectionRef(name),
298
+ getAll: async (...refs)=>refs.map((ref)=>snapshot(ref.path)),
299
+ batch: ()=>{
300
+ const staged = [];
301
+ const batch = {
302
+ set: (ref, data, options)=>(staged.push(()=>ref.set(data, options)), batch),
303
+ create: (ref, data)=>(staged.push(()=>ref.create(data)), batch),
304
+ update: (ref, ...args)=>(staged.push(()=>ref.update(...args)), batch),
305
+ delete: (ref)=>(staged.push(()=>ref.delete()), batch),
306
+ commit: async ()=>{
307
+ for (const write of staged)await write();
308
+ }
309
+ };
310
+ return batch;
311
+ },
312
+ runTransaction: async (body)=>{
313
+ const staged = [];
314
+ const transaction = {
315
+ get: async (target)=>target.get(),
316
+ set: (ref, data, options)=>(staged.push(()=>ref.set(data, options)), transaction),
317
+ create: (ref, data)=>(staged.push(()=>ref.create(data)), transaction),
318
+ update: (ref, ...args)=>(staged.push(()=>ref.update(...args)), transaction),
319
+ delete: (ref)=>(staged.push(()=>ref.delete()), transaction)
320
+ };
321
+ const result = await body(transaction);
322
+ for (const write of staged)await write();
323
+ return result;
324
+ }
325
+ };
326
+ return {
327
+ docs,
328
+ now: clock,
329
+ firestore: firestore,
330
+ seed: (path, data)=>docs.set(path, copy(data)),
331
+ read: (path)=>copy(docs.get(path))
332
+ };
333
+ }
334
+
335
+ //# sourceMappingURL=memory-firestore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/testing/memory-firestore.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/*==========================================\n * AN IN-MEMORY ADMIN FIRESTORE, for the transfer resources' specs\n * (AGL-3527).\n *\n * Documents by path; the operators the CRM's transfer hooks and the job\n * engine issue — `where` (equality, ranges, `in`, the array operators),\n * `orderBy` (a field or the document id), `limit`, `startAfter`, `count`,\n * `getAll`, batches and read-then-write transactions — and the write\n * sentinels (`delete`, `serverTimestamp`, `arrayUnion`, `arrayRemove`,\n * `increment`) applied along dotted paths, as Firestore applies them.\n *\n * A spec mocks `firebase-admin/firestore` with {@link memoryFirestoreModule}\n * so the code under test builds its sentinels from the same table.\n *=========================================*/\n\ntype Data = Record<string, unknown>\n\ninterface Sentinel {\n __sentinel: 'delete' | 'serverTimestamp' | 'arrayUnion' | 'arrayRemove' | 'increment'\n values?: unknown[]\n by?: number\n}\n\nconst DOCUMENT_ID = { __documentId: true }\n\n/** What a spec hands `jest.mock('firebase-admin/firestore', …)`. */\nexport const memoryFirestoreModule = {\n __esModule: true,\n FieldValue: {\n delete: (): Sentinel => ({ __sentinel: 'delete' }),\n serverTimestamp: (): Sentinel => ({ __sentinel: 'serverTimestamp' }),\n arrayUnion: (...values: unknown[]): Sentinel => ({ __sentinel: 'arrayUnion', values }),\n arrayRemove: (...values: unknown[]): Sentinel => ({ __sentinel: 'arrayRemove', values }),\n increment: (by: number): Sentinel => ({ __sentinel: 'increment', by }),\n },\n FieldPath: { documentId: () => DOCUMENT_ID },\n Timestamp: { fromDate: (date: Date) => date.getTime() },\n}\n\nconst isSentinel = (value: unknown): value is Sentinel =>\n Boolean(value && typeof value === 'object' && '__sentinel' in (value as object))\n\nconst copy = <T>(value: T): T => (value === undefined ? value : (JSON.parse(JSON.stringify(value)) as T))\n\nfunction readPath(data: Data | undefined, path: string): unknown {\n return path.split('.').reduce<unknown>((node, key) => (node as Data | undefined)?.[key], data)\n}\n\nexport interface MemoryFirestore {\n /** Every document, by full path. */\n docs: Map<string, Data>\n /** The clock `serverTimestamp` writes. */\n now: () => number\n firestore: FirebaseFirestore.Firestore\n /** Seeds one document at its full path. */\n seed: (path: string, data: Data) => void\n /** A document's data, or `undefined`. */\n read: (path: string) => Data | undefined\n}\n\n/** A fresh in-memory Firestore. */\nexport function memoryFirestore(clock: () => number = () => 1_800_000_000_000): MemoryFirestore {\n const docs = new Map<string, Data>()\n\n const resolve = (value: unknown, current: unknown): unknown => {\n if (!isSentinel(value)) return Array.isArray(value) || (value && typeof value === 'object') ? copy(value) : value\n switch (value.__sentinel) {\n case 'serverTimestamp':\n return clock()\n case 'arrayUnion':\n return [...new Set([...(Array.isArray(current) ? current : []), ...(value.values ?? [])])]\n case 'arrayRemove':\n return (Array.isArray(current) ? current : []).filter((entry) => !(value.values ?? []).includes(entry))\n case 'increment':\n return Number(current ?? 0) + Number(value.by ?? 0)\n default:\n return undefined\n }\n }\n\n /** Writes `value` at a dotted path, a `delete` sentinel removing the leaf. */\n const writePath = (target: Data, path: string, value: unknown): void => {\n const keys = path.split('.')\n let node = target\n for (const key of keys.slice(0, -1)) {\n if (!node[key] || typeof node[key] !== 'object') node[key] = {}\n node = node[key] as Data\n }\n const leaf = keys[keys.length - 1] as string\n if (isSentinel(value) && value.__sentinel === 'delete') delete node[leaf]\n else node[leaf] = resolve(value, node[leaf])\n }\n\n /** Every top-level key of `data` with sentinels resolved (a `set`). */\n const settle = (data: Data, base: Data = {}): Data => {\n const next = copy(base)\n for (const [key, value] of Object.entries(data)) {\n if (value === undefined) continue\n if (isSentinel(value)) writePath(next, key, value)\n else if (value && typeof value === 'object' && !Array.isArray(value) && base[key] && typeof base[key] === 'object') {\n next[key] = settle(value as Data, base[key] as Data)\n } else next[key] = resolve(value, next[key])\n }\n return next\n }\n\n const snapshot = (path: string): any => {\n const data = docs.get(path)\n return {\n id: path.slice(path.lastIndexOf('/') + 1),\n ref: docRef(path),\n exists: data !== undefined,\n data: () => copy(data),\n get: (field: string) => copy(readPath(data, field)),\n }\n }\n\n const docRef = (path: string): any => ({\n id: path.slice(path.lastIndexOf('/') + 1),\n path,\n get firestore() {\n return firestore\n },\n get parent() {\n return collectionRef(path.slice(0, path.lastIndexOf('/')))\n },\n collection: (name: string) => collectionRef(`${path}/${name}`),\n get: async () => snapshot(path),\n set: async (data: Data, options?: { merge?: boolean }) => {\n docs.set(path, settle(data, options?.merge ? (docs.get(path) ?? {}) : {}))\n },\n create: async (data: Data) => {\n if (docs.has(path)) throw Object.assign(new Error(`ALREADY_EXISTS: ${path}`), { code: 6 })\n docs.set(path, settle(data))\n },\n update: async (...args: unknown[]) => {\n const current = docs.get(path)\n if (!current) throw Object.assign(new Error(`NOT_FOUND: ${path}`), { code: 5 })\n const patch: Data =\n typeof args[0] === 'string'\n ? Object.fromEntries(\n Array.from({ length: args.length / 2 }, (_unused, at) => [String(args[at * 2]), args[at * 2 + 1]]),\n )\n : (args[0] as Data)\n const next = copy(current)\n for (const [key, value] of Object.entries(patch)) writePath(next, key, value)\n docs.set(path, next)\n },\n delete: async () => {\n docs.delete(path)\n },\n })\n\n interface QueryState {\n path: string\n filters: Array<{ field: string | typeof DOCUMENT_ID; op: string; value: unknown }>\n order: Array<{ field: string | typeof DOCUMENT_ID; direction: 'asc' | 'desc' }>\n limit?: number\n after?: any\n }\n\n const fieldOf = (data: Data | undefined, id: string, field: string | typeof DOCUMENT_ID) =>\n field === DOCUMENT_ID ? id : readPath(data, field as string)\n\n const compare = (a: unknown, b: unknown): number => {\n if (a === b) return 0\n if (a === undefined || a === null) return -1\n if (b === undefined || b === null) return 1\n return (a as number) < (b as number) ? -1 : 1\n }\n\n const matches = (data: Data, id: string, filter: QueryState['filters'][number]): boolean => {\n const value = fieldOf(data, id, filter.field)\n const wanted = filter.value\n switch (filter.op) {\n case '==':\n return JSON.stringify(value) === JSON.stringify(wanted)\n case '!=':\n return value !== undefined && JSON.stringify(value) !== JSON.stringify(wanted)\n case 'in':\n return (wanted as unknown[]).some((entry) => JSON.stringify(entry) === JSON.stringify(value))\n case 'not-in':\n return value !== undefined && !(wanted as unknown[]).some((entry) => JSON.stringify(entry) === JSON.stringify(value))\n case 'array-contains':\n return Array.isArray(value) && value.includes(wanted)\n case 'array-contains-any':\n return Array.isArray(value) && value.some((entry) => (wanted as unknown[]).includes(entry))\n case '<':\n return value !== undefined && compare(value, wanted) < 0\n case '<=':\n return value !== undefined && compare(value, wanted) <= 0\n case '>':\n return value !== undefined && compare(value, wanted) > 0\n case '>=':\n return value !== undefined && compare(value, wanted) >= 0\n default:\n throw new Error(`memory firestore: no operator ${filter.op}`)\n }\n }\n\n const run = (state: QueryState): any[] => {\n const prefix = `${state.path}/`\n let found = [...docs.entries()]\n .filter(([path]) => path.startsWith(prefix) && !path.slice(prefix.length).includes('/'))\n .map(([path, data]) => ({ path, id: path.slice(prefix.length), data }))\n .filter((entry) => state.filters.every((filter) => matches(entry.data, entry.id, filter)))\n const order = state.order.length ? state.order : [{ field: DOCUMENT_ID, direction: 'asc' as const }]\n for (const { field } of order) {\n if (field !== DOCUMENT_ID) found = found.filter((entry) => readPath(entry.data, field as string) !== undefined)\n }\n found.sort((a, b) => {\n for (const { field, direction } of [...order, { field: DOCUMENT_ID, direction: 'asc' as const }]) {\n const result = compare(fieldOf(a.data, a.id, field), fieldOf(b.data, b.id, field))\n if (result) return direction === 'desc' ? -result : result\n }\n return 0\n })\n if (state.after) {\n const at = found.findIndex((entry) => entry.id === state.after.id)\n found = at >= 0 ? found.slice(at + 1) : found\n }\n if (state.limit !== undefined) found = found.slice(0, state.limit)\n return found.map((entry) => snapshot(entry.path))\n }\n\n const query = (state: QueryState): any => ({\n where: (field: string | typeof DOCUMENT_ID, op: string, value: unknown) =>\n query({ ...state, filters: [...state.filters, { field, op, value }] }),\n orderBy: (field: string | typeof DOCUMENT_ID, direction: 'asc' | 'desc' = 'asc') =>\n query({ ...state, order: [...state.order, { field, direction }] }),\n limit: (count: number) => query({ ...state, limit: count }),\n startAfter: (after: any) => query({ ...state, after }),\n get: async () => {\n const found = run(state)\n return { docs: found, empty: !found.length, size: found.length }\n },\n count: () => ({\n get: async () => ({ data: () => ({ count: run({ ...state, limit: undefined }).length }) }),\n }),\n })\n\n const collectionRef = (path: string): any => ({\n id: path.slice(path.lastIndexOf('/') + 1),\n path,\n get parent() {\n const at = path.lastIndexOf('/')\n return at > 0 ? docRef(path.slice(0, at)) : null\n },\n doc: (id?: string) => docRef(`${path}/${id ?? `auto${Math.random().toString(36).slice(2, 12)}`}`),\n ...query({ path, filters: [], order: [] }),\n })\n\n const firestore = {\n collection: (name: string) => collectionRef(name),\n getAll: async (...refs: Array<{ path: string }>) => refs.map((ref) => snapshot(ref.path)),\n batch: () => {\n const staged: Array<() => Promise<void>> = []\n const batch = {\n set: (ref: any, data: Data, options?: { merge?: boolean }) => (staged.push(() => ref.set(data, options)), batch),\n create: (ref: any, data: Data) => (staged.push(() => ref.create(data)), batch),\n update: (ref: any, ...args: unknown[]) => (staged.push(() => ref.update(...args)), batch),\n delete: (ref: any) => (staged.push(() => ref.delete()), batch),\n commit: async () => {\n for (const write of staged) await write()\n },\n }\n return batch\n },\n runTransaction: async <T>(body: (transaction: any) => Promise<T>): Promise<T> => {\n const staged: Array<() => Promise<void>> = []\n const transaction = {\n get: async (target: any) => target.get(),\n set: (ref: any, data: Data, options?: { merge?: boolean }) => (staged.push(() => ref.set(data, options)), transaction),\n create: (ref: any, data: Data) => (staged.push(() => ref.create(data)), transaction),\n update: (ref: any, ...args: unknown[]) => (staged.push(() => ref.update(...args)), transaction),\n delete: (ref: any) => (staged.push(() => ref.delete()), transaction),\n }\n const result = await body(transaction)\n for (const write of staged) await write()\n return result\n },\n }\n\n return {\n docs,\n now: clock,\n firestore: firestore as unknown as FirebaseFirestore.Firestore,\n seed: (path, data) => docs.set(path, copy(data)),\n read: (path) => copy(docs.get(path)),\n }\n}\n"],"names":["DOCUMENT_ID","__documentId","memoryFirestoreModule","__esModule","FieldValue","delete","__sentinel","serverTimestamp","arrayUnion","values","arrayRemove","increment","by","FieldPath","documentId","Timestamp","fromDate","date","getTime","isSentinel","value","Boolean","copy","undefined","JSON","parse","stringify","readPath","data","path","split","reduce","node","key","memoryFirestore","clock","docs","Map","resolve","current","Array","isArray","Set","filter","entry","includes","Number","writePath","target","keys","slice","leaf","length","settle","base","next","Object","entries","snapshot","get","id","lastIndexOf","ref","docRef","exists","field","firestore","parent","collectionRef","collection","name","set","options","merge","create","has","assign","Error","code","update","args","patch","fromEntries","from","_unused","at","String","fieldOf","compare","a","b","matches","wanted","op","some","run","state","prefix","found","startsWith","map","filters","every","order","direction","sort","result","after","findIndex","limit","query","where","orderBy","count","startAfter","empty","size","doc","Math","random","toString","getAll","refs","batch","staged","push","commit","write","runTransaction","body","transaction","now","seed","read"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ /**
18
+ * The `emailSend` record index the plugin that sends campaigns publishes
19
+ * (AGL-3080), stood in for this plugin's specs — this plugin may not load
20
+ * the marketing plugin. A send is named as that plugin's index names it: the
21
+ * name the team gave it, else its subject, and an unnamed send is left out.
22
+ * `read` answers the stored send the spec holds for an org and an id; what
23
+ * the marketing plugin itself answers is held in its own spec.
24
+ */
25
+ export declare function standInEmailSendIndex(read: (orgId: string, sendId: string) => Readonly<Record<string, unknown>> | undefined): void;
@@ -0,0 +1,49 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ import { registerPluginRecordIndex } from "@aglyn/aglyn/plugin-manager/plugin-record-index";
17
+ /**
18
+ * The `emailSend` record index the plugin that sends campaigns publishes
19
+ * (AGL-3080), stood in for this plugin's specs — this plugin may not load
20
+ * the marketing plugin. A send is named as that plugin's index names it: the
21
+ * name the team gave it, else its subject, and an unnamed send is left out.
22
+ * `read` answers the stored send the spec holds for an org and an id; what
23
+ * the marketing plugin itself answers is held in its own spec.
24
+ */ export function standInEmailSendIndex(read) {
25
+ const text = (value)=>typeof value === 'string' ? value.trim() : '';
26
+ registerPluginRecordIndex('emailSend', {
27
+ async list () {
28
+ return {
29
+ records: [],
30
+ truncated: false
31
+ };
32
+ },
33
+ async get ({ orgId, id }) {
34
+ const data = orgId ? read(orgId, id) : undefined;
35
+ const name = data ? text(data['displayName']) || text(data['subject']) : '';
36
+ return name ? {
37
+ id,
38
+ name,
39
+ facts: {
40
+ hostId: text(data == null ? void 0 : data['hostId'])
41
+ }
42
+ } : null;
43
+ }
44
+ }, {
45
+ pluginId: 'marketing'
46
+ });
47
+ }
48
+
49
+ //# sourceMappingURL=stand-in-email-send-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/testing/stand-in-email-send-index.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { registerPluginRecordIndex } from '@aglyn/aglyn/plugin-manager/plugin-record-index'\n\n/**\n * The `emailSend` record index the plugin that sends campaigns publishes\n * (AGL-3080), stood in for this plugin's specs — this plugin may not load\n * the marketing plugin. A send is named as that plugin's index names it: the\n * name the team gave it, else its subject, and an unnamed send is left out.\n * `read` answers the stored send the spec holds for an org and an id; what\n * the marketing plugin itself answers is held in its own spec.\n */\nexport function standInEmailSendIndex(\n read: (orgId: string, sendId: string) => Readonly<Record<string, unknown>> | undefined,\n): void {\n const text = (value: unknown) => (typeof value === 'string' ? value.trim() : '')\n registerPluginRecordIndex(\n 'emailSend',\n {\n async list() {\n return { records: [], truncated: false }\n },\n async get({ orgId, id }) {\n const data = orgId ? read(orgId, id) : undefined\n const name = data ? text(data['displayName']) || text(data['subject']) : ''\n return name ? { id, name, facts: { hostId: text(data?.['hostId']) } } : null\n },\n },\n { pluginId: 'marketing' },\n )\n}\n"],"names":["registerPluginRecordIndex","standInEmailSendIndex","read","text","value","trim","list","records","truncated","get","orgId","id","data","undefined","name","facts","hostId","pluginId"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,yBAAyB,QAAQ,kDAAiD;AAE3F;;;;;;;CAOC,GACD,OAAO,SAASC,sBACdC,IAAsF;IAEtF,MAAMC,OAAO,CAACC,QAAoB,OAAOA,UAAU,WAAWA,MAAMC,IAAI,KAAK;IAC7EL,0BACE,aACA;QACE,MAAMM;YACJ,OAAO;gBAAEC,SAAS,EAAE;gBAAEC,WAAW;YAAM;QACzC;QACA,MAAMC,KAAI,EAAEC,KAAK,EAAEC,EAAE,EAAE;YACrB,MAAMC,OAAOF,QAAQR,KAAKQ,OAAOC,MAAME;YACvC,MAAMC,OAAOF,OAAOT,KAAKS,IAAI,CAAC,cAAc,KAAKT,KAAKS,IAAI,CAAC,UAAU,IAAI;YACzE,OAAOE,OAAO;gBAAEH;gBAAIG;gBAAMC,OAAO;oBAAEC,QAAQb,KAAKS,wBAAAA,IAAM,CAAC,SAAS;gBAAE;YAAE,IAAI;QAC1E;IACF,GACA;QAAEK,UAAU;IAAY;AAE5B"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { type TransferExportHooks } from './common';
18
+ /** The words an export writes for the records an activity is about. */
19
+ interface ActivityNames {
20
+ by?: (uid: string) => string | undefined;
21
+ contact?: (id: string) => string | undefined;
22
+ company?: (id: string) => string | undefined;
23
+ deal?: (id: string) => string | undefined;
24
+ lead?: (id: string) => string | undefined;
25
+ }
26
+ /** One activity as values by field id. */
27
+ export declare function activityTransferValues(id: string, activity: Record<string, unknown>, names?: ActivityNames): Record<string, unknown>;
28
+ /** The `crm.activities` hooks: an export, and the reads undo would ask. */
29
+ export declare function activitiesTransferResource(): TransferExportHooks;
30
+ export {};
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */ /*==========================================
17
+ * WHAT THE TEAM LOGGED, AS A FILE (AGL-3528) — `crm.activities`, exported.
18
+ *
19
+ * Every call, email, meeting and note logged against a contact, a company,
20
+ * a deal or a lead, with who logged it and what it was about: the record of
21
+ * the team's work, taken out to report on or to keep. An activity is
22
+ * logged on a record, as it happens, so the resource is exported and never
23
+ * imported (`directions: ["export"]`).
24
+ *=========================================*/ import { CRM_ACTIVITY_DIRECTION_LABELS, CRM_ACTIVITY_KIND_LABELS, CRM_COLLECTIONS, CRM_EMAIL_DELIVERY_STATE_LABELS } from "@aglyn/aglyn/server";
25
+ import { TRANSFER_ID_FIELD } from "@aglyn/aglyn/data-transfer";
26
+ import { countCrmExport, crmMemberEmails, crmTransferEnv, isoOf, lookupById, lookupResult, pickValues, readCrmExportPage, requireCrmRecords, textOf, visibleIn } from "./common.js";
27
+ import { ACTIVITY_TRANSFER_FIELDS, ACTIVITY_TRANSFER_GROUPS, CRM_TIMESTAMP_FIELDS } from "./fields.js";
28
+ const activitiesOf = (env)=>env.orgRef.collection(CRM_COLLECTIONS.activities);
29
+ /** One activity as values by field id. */ export function activityTransferValues(id, activity, names = {}) {
30
+ var _CRM_ACTIVITY_KIND_LABELS_kind, _CRM_ACTIVITY_DIRECTION_LABELS_direction, _link, _CRM_EMAIL_DELIVERY_STATE_LABELS_delivery;
31
+ const text = (value)=>textOf(value) || null;
32
+ const link = (value, resolve)=>{
33
+ var _ref;
34
+ const linked = text(value);
35
+ return linked ? (_ref = resolve == null ? void 0 : resolve(linked)) != null ? _ref : linked : null;
36
+ };
37
+ const kind = textOf(activity['kind']);
38
+ const direction = textOf(activity['direction']);
39
+ const delivery = textOf(activity['deliveryState']);
40
+ return {
41
+ subject: text(activity['subject']),
42
+ kind: (_CRM_ACTIVITY_KIND_LABELS_kind = CRM_ACTIVITY_KIND_LABELS[kind]) != null ? _CRM_ACTIVITY_KIND_LABELS_kind : text(kind),
43
+ direction: (_CRM_ACTIVITY_DIRECTION_LABELS_direction = CRM_ACTIVITY_DIRECTION_LABELS[direction]) != null ? _CRM_ACTIVITY_DIRECTION_LABELS_direction : text(direction),
44
+ at: isoOf(activity['atMs']),
45
+ body: text(activity['body']),
46
+ outcome: text(activity['outcome']),
47
+ durationMinutes: typeof activity['durationMinutes'] === 'number' ? activity['durationMinutes'] : null,
48
+ by: (_link = link(activity['byUid'], names.by)) != null ? _link : text(activity['byName']),
49
+ to: text(activity['to']),
50
+ from: text(activity['from']),
51
+ deliveryState: (_CRM_EMAIL_DELIVERY_STATE_LABELS_delivery = CRM_EMAIL_DELIVERY_STATE_LABELS[delivery]) != null ? _CRM_EMAIL_DELIVERY_STATE_LABELS_delivery : text(delivery),
52
+ contact: link(activity['contactId'], names.contact),
53
+ company: link(activity['companyId'], names.company),
54
+ deal: link(activity['dealId'], names.deal),
55
+ lead: link(activity['leadId'], names.lead),
56
+ createdAt: isoOf(activity['createdAt']),
57
+ updatedAt: isoOf(activity['updatedAt']),
58
+ [TRANSFER_ID_FIELD]: id
59
+ };
60
+ }
61
+ /** Reads one field of each linked record by id. */ async function namesOf(env, collection, ids, field) {
62
+ const out = new Map();
63
+ const wanted = [
64
+ ...new Set(ids)
65
+ ].filter((id)=>id && !id.includes('/'));
66
+ for(let at = 0; at < wanted.length; at += 500){
67
+ const refs = wanted.slice(at, at + 500).map((id)=>env.orgRef.collection(collection).doc(id));
68
+ for (const snapshot of (await env.firestore.getAll(...refs))){
69
+ var _snapshot_data;
70
+ if (snapshot.exists) out.set(snapshot.id, field((_snapshot_data = snapshot.data()) != null ? _snapshot_data : {}));
71
+ }
72
+ }
73
+ return out;
74
+ }
75
+ /** The `crm.activities` hooks: an export, and the reads undo would ask. */ export function activitiesTransferResource() {
76
+ return {
77
+ fields: ()=>({
78
+ standard: ACTIVITY_TRANSFER_FIELDS,
79
+ system: CRM_TIMESTAMP_FIELDS,
80
+ groups: ACTIVITY_TRANSFER_GROUPS
81
+ }),
82
+ matchKeys: [
83
+ {
84
+ fieldId: TRANSFER_ID_FIELD,
85
+ normalizer: 'aglynId'
86
+ }
87
+ ],
88
+ async count (ctx, options) {
89
+ const env = await crmTransferEnv(ctx);
90
+ requireCrmRecords(env, 'activities');
91
+ return countCrmExport(env, activitiesOf(env), options, (data)=>visibleIn(env, data['visibleTo'], options.scopeTokens));
92
+ },
93
+ async readPage (ctx, cursor, fieldIds, options) {
94
+ const env = await crmTransferEnv(ctx);
95
+ requireCrmRecords(env, 'activities');
96
+ const emails = fieldIds.includes('by') ? await crmMemberEmails(env.orgId) : new Map();
97
+ return readCrmExportPage(env, activitiesOf(env), cursor, options, (data)=>visibleIn(env, data['visibleTo'], options == null ? void 0 : options.scopeTokens), async (docs)=>{
98
+ const ids = (field)=>docs.map((doc)=>textOf(doc.data[field])).filter(Boolean);
99
+ const wants = (field)=>fieldIds.includes(field);
100
+ const empty = new Map();
101
+ const [contacts, companies, deals, leads] = await Promise.all([
102
+ wants('contact') ? namesOf(env, 'contacts', ids('contactId'), (data)=>textOf(data['email'])) : empty,
103
+ wants('company') ? namesOf(env, CRM_COLLECTIONS.companies, ids('companyId'), (data)=>textOf(data['name'])) : empty,
104
+ wants('deal') ? namesOf(env, CRM_COLLECTIONS.deals, ids('dealId'), (data)=>textOf(data['title'])) : empty,
105
+ wants('lead') ? namesOf(env, 'leads', ids('leadId'), (data)=>textOf(data['email'])) : empty
106
+ ]);
107
+ return docs.map((doc)=>pickValues(activityTransferValues(doc.id, doc.data, {
108
+ by: (uid)=>emails.get(uid),
109
+ contact: (id)=>contacts.get(id) || undefined,
110
+ company: (id)=>companies.get(id) || undefined,
111
+ deal: (id)=>deals.get(id) || undefined,
112
+ lead: (id)=>leads.get(id) || undefined
113
+ }), fieldIds));
114
+ });
115
+ },
116
+ async lookup (ctx, requests) {
117
+ const env = await crmTransferEnv(ctx);
118
+ const found = {
119
+ lookup: new Map(),
120
+ docs: new Map()
121
+ };
122
+ for (const request of requests){
123
+ if (request.fieldId === TRANSFER_ID_FIELD) {
124
+ await lookupById(env, activitiesOf(env), request, (data)=>visibleIn(env, data['visibleTo']), found);
125
+ }
126
+ }
127
+ return lookupResult(found, (id, data)=>activityTransferValues(id, data));
128
+ }
129
+ };
130
+ }
131
+
132
+ //# sourceMappingURL=activities.js.map