@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.
- package/README.md +2 -1
- package/package.json +13 -13
- package/src/lib/components/activity-list.js +12 -5
- package/src/lib/components/activity-list.js.map +1 -1
- package/src/lib/components/companies-bulk-bar.d.ts +1 -4
- package/src/lib/components/companies-bulk-bar.js +7 -20
- package/src/lib/components/companies-bulk-bar.js.map +1 -1
- package/src/lib/components/companies-section.d.ts +3 -3
- package/src/lib/components/companies-section.js +149 -46
- package/src/lib/components/companies-section.js.map +1 -1
- package/src/lib/components/company-edit-drawer.js +281 -20
- package/src/lib/components/company-edit-drawer.js.map +1 -1
- package/src/lib/components/company-properties-card.js +99 -8
- package/src/lib/components/company-properties-card.js.map +1 -1
- package/src/lib/components/contact-detail-page.js +3 -1
- package/src/lib/components/contact-detail-page.js.map +1 -1
- package/src/lib/components/contact-merge-dialog.js +33 -10
- package/src/lib/components/contact-merge-dialog.js.map +1 -1
- package/src/lib/components/contact-properties-card.d.ts +0 -69
- package/src/lib/components/contact-properties-card.js +350 -60
- package/src/lib/components/contact-properties-card.js.map +1 -1
- package/src/lib/components/contact-reports-to-field.d.ts +46 -0
- package/src/lib/components/contact-reports-to-field.js +67 -0
- package/src/lib/components/contact-reports-to-field.js.map +1 -0
- package/src/lib/components/contacts-bulk-bar.d.ts +1 -8
- package/src/lib/components/contacts-bulk-bar.js +7 -19
- package/src/lib/components/contacts-bulk-bar.js.map +1 -1
- package/src/lib/components/contacts-section.js +46 -33
- package/src/lib/components/contacts-section.js.map +1 -1
- package/src/lib/components/crm-call-actions.d.ts +10 -0
- package/src/lib/components/crm-call-actions.js +26 -9
- package/src/lib/components/crm-call-actions.js.map +1 -1
- package/src/lib/components/crm-record-picker.d.ts +15 -0
- package/src/lib/components/crm-record-picker.js +16 -10
- package/src/lib/components/crm-record-picker.js.map +1 -1
- package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
- package/src/lib/components/crm-transfer-buttons.js +167 -0
- package/src/lib/components/crm-transfer-buttons.js.map +1 -0
- package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
- package/src/lib/components/deal-contact-roles-card.js +368 -0
- package/src/lib/components/deal-contact-roles-card.js.map +1 -0
- package/src/lib/components/deal-detail-page.d.ts +3 -2
- package/src/lib/components/deal-detail-page.js +25 -6
- package/src/lib/components/deal-detail-page.js.map +1 -1
- package/src/lib/components/deal-edit-drawer.d.ts +10 -0
- package/src/lib/components/deal-edit-drawer.js +219 -10
- package/src/lib/components/deal-edit-drawer.js.map +1 -1
- package/src/lib/components/deal-properties-card.d.ts +7 -0
- package/src/lib/components/deal-properties-card.js +34 -3
- package/src/lib/components/deal-properties-card.js.map +1 -1
- package/src/lib/components/deal-stage-card.d.ts +4 -0
- package/src/lib/components/deal-stage-card.js +10 -2
- package/src/lib/components/deal-stage-card.js.map +1 -1
- package/src/lib/components/deals-bulk-bar.d.ts +0 -3
- package/src/lib/components/deals-bulk-bar.js +7 -20
- package/src/lib/components/deals-bulk-bar.js.map +1 -1
- package/src/lib/components/deals-section.d.ts +3 -3
- package/src/lib/components/deals-section.js +123 -63
- package/src/lib/components/deals-section.js.map +1 -1
- package/src/lib/components/fields-section.js +31 -17
- package/src/lib/components/fields-section.js.map +1 -1
- package/src/lib/components/lead-convert-dialog.d.ts +4 -0
- package/src/lib/components/lead-convert-dialog.js +23 -1
- package/src/lib/components/lead-convert-dialog.js.map +1 -1
- package/src/lib/components/lead-detail-page.js +8 -2
- package/src/lib/components/lead-detail-page.js.map +1 -1
- package/src/lib/components/lead-profile-fields.d.ts +71 -0
- package/src/lib/components/lead-profile-fields.js +386 -0
- package/src/lib/components/lead-profile-fields.js.map +1 -0
- package/src/lib/components/lead-properties-card.d.ts +2 -1
- package/src/lib/components/lead-properties-card.js +85 -176
- package/src/lib/components/lead-properties-card.js.map +1 -1
- package/src/lib/components/lead-source-select.d.ts +4 -23
- package/src/lib/components/lead-source-select.js +9 -73
- package/src/lib/components/lead-source-select.js.map +1 -1
- package/src/lib/components/lead-status-chip.d.ts +9 -3
- package/src/lib/components/lead-status-chip.js +8 -4
- package/src/lib/components/lead-status-chip.js.map +1 -1
- package/src/lib/components/lead-status-options.d.ts +20 -0
- package/src/lib/components/lead-status-options.js +51 -0
- package/src/lib/components/lead-status-options.js.map +1 -0
- package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
- package/src/lib/components/lead-unqualify-dialog.js +50 -18
- package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
- package/src/lib/components/leads-bulk-bar.d.ts +0 -3
- package/src/lib/components/leads-bulk-bar.js +29 -29
- package/src/lib/components/leads-bulk-bar.js.map +1 -1
- package/src/lib/components/leads-section.js +120 -68
- package/src/lib/components/leads-section.js.map +1 -1
- package/src/lib/components/linked-deals-card.d.ts +4 -0
- package/src/lib/components/linked-deals-card.js +47 -3
- package/src/lib/components/linked-deals-card.js.map +1 -1
- package/src/lib/components/log-activity-dialog.js +43 -3
- package/src/lib/components/log-activity-dialog.js.map +1 -1
- package/src/lib/components/new-contact-drawer.d.ts +8 -0
- package/src/lib/components/new-contact-drawer.js +108 -6
- package/src/lib/components/new-contact-drawer.js.map +1 -1
- package/src/lib/components/new-lead-drawer.d.ts +9 -2
- package/src/lib/components/new-lead-drawer.js +88 -121
- package/src/lib/components/new-lead-drawer.js.map +1 -1
- package/src/lib/components/picklist-select.d.ts +36 -0
- package/src/lib/components/picklist-select.js +114 -0
- package/src/lib/components/picklist-select.js.map +1 -0
- package/src/lib/components/picklist-values-card.d.ts +34 -0
- package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
- package/src/lib/components/picklist-values-card.js.map +1 -0
- package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
- package/src/lib/components/pipeline-stages-dialog.js +26 -4
- package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
- package/src/lib/components/pipelines-dialog.js +15 -6
- package/src/lib/components/pipelines-dialog.js.map +1 -1
- package/src/lib/components/recent-activity-feed.js +20 -5
- package/src/lib/components/recent-activity-feed.js.map +1 -1
- package/src/lib/components/recipes-card.js +4 -2
- package/src/lib/components/recipes-card.js.map +1 -1
- package/src/lib/components/record-tasks-card.js +15 -8
- package/src/lib/components/record-tasks-card.js.map +1 -1
- package/src/lib/components/reports/forecast-card.d.ts +6 -0
- package/src/lib/components/reports/forecast-card.js +101 -3
- package/src/lib/components/reports/forecast-card.js.map +1 -1
- package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
- package/src/lib/components/reports/lead-funnel-card.js +9 -5
- package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
- package/src/lib/components/reports/lead-source-card.d.ts +23 -0
- package/src/lib/components/reports/lead-source-card.js +318 -0
- package/src/lib/components/reports/lead-source-card.js.map +1 -0
- package/src/lib/components/reports/report-export.js +1 -1
- package/src/lib/components/reports/report-export.js.map +1 -1
- package/src/lib/components/reports-section.js +8 -0
- package/src/lib/components/reports-section.js.map +1 -1
- package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
- package/src/lib/components/sharing-rule-drawer.js +108 -19
- package/src/lib/components/sharing-rule-drawer.js.map +1 -1
- package/src/lib/components/sharing-rules-card.js +11 -3
- package/src/lib/components/sharing-rules-card.js.map +1 -1
- package/src/lib/components/task-cells.d.ts +9 -1
- package/src/lib/components/task-cells.js +9 -4
- package/src/lib/components/task-cells.js.map +1 -1
- package/src/lib/components/task-edit-drawer.js +111 -43
- package/src/lib/components/task-edit-drawer.js.map +1 -1
- package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
- package/src/lib/components/tasks-bulk-bar.js +7 -20
- package/src/lib/components/tasks-bulk-bar.js.map +1 -1
- package/src/lib/components/tasks-calendar.d.ts +3 -0
- package/src/lib/components/tasks-calendar.js +8 -1
- package/src/lib/components/tasks-calendar.js.map +1 -1
- package/src/lib/components/tasks-section.d.ts +3 -3
- package/src/lib/components/tasks-section.js +58 -43
- package/src/lib/components/tasks-section.js.map +1 -1
- package/src/lib/constants/api-routes.d.ts +2 -9
- package/src/lib/constants/api-routes.js +1 -7
- package/src/lib/constants/api-routes.js.map +1 -1
- package/src/lib/constants/bundle-common.d.ts +6 -0
- package/src/lib/constants/bundle-common.js +11 -0
- package/src/lib/constants/bundle-common.js.map +1 -1
- package/src/lib/constants/company-filters.d.ts +14 -0
- package/src/lib/constants/company-filters.js +51 -1
- package/src/lib/constants/company-filters.js.map +1 -1
- package/src/lib/constants/contact-filters.d.ts +2 -0
- package/src/lib/constants/contact-filters.js +18 -1
- package/src/lib/constants/contact-filters.js.map +1 -1
- package/src/lib/constants/deal-filters.d.ts +22 -1
- package/src/lib/constants/deal-filters.js +67 -4
- package/src/lib/constants/deal-filters.js.map +1 -1
- package/src/lib/declarations.console-server.d.ts +3 -0
- package/src/lib/declarations.console-server.js +35 -0
- package/src/lib/declarations.console-server.js.map +1 -1
- package/src/lib/declarations.d.ts +26 -0
- package/src/lib/declarations.js +35 -0
- package/src/lib/declarations.js.map +1 -0
- package/src/lib/declarations.server.d.ts +11 -0
- package/src/lib/declarations.server.js +92 -1
- package/src/lib/declarations.server.js.map +1 -1
- package/src/lib/hooks/use-company-picklists.d.ts +15 -0
- package/src/lib/hooks/use-company-picklists.js +55 -0
- package/src/lib/hooks/use-company-picklists.js.map +1 -0
- package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
- package/src/lib/hooks/use-crm-picklist.js +53 -0
- package/src/lib/hooks/use-crm-picklist.js.map +1 -0
- package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
- package/src/lib/hooks/use-crm-record-names.js +45 -19
- package/src/lib/hooks/use-crm-record-names.js.map +1 -1
- package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
- package/src/lib/hooks/use-crm-task-picklists.js +45 -0
- package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
- package/src/lib/hooks/use-deals.d.ts +14 -0
- package/src/lib/hooks/use-deals.js +29 -0
- package/src/lib/hooks/use-deals.js.map +1 -1
- package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
- package/src/lib/hooks/use-lead-picklists.js +46 -0
- package/src/lib/hooks/use-lead-picklists.js.map +1 -0
- package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
- package/src/lib/hooks/use-lead-source-picklist.js +12 -22
- package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
- package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
- package/src/lib/hooks/use-lead-status-picklist.js +40 -0
- package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
- package/src/lib/model/companies.d.ts +32 -3
- package/src/lib/model/companies.js +133 -16
- package/src/lib/model/companies.js.map +1 -1
- package/src/lib/model/contact-merge.d.ts +27 -3
- package/src/lib/model/contact-merge.js +81 -7
- package/src/lib/model/contact-merge.js.map +1 -1
- package/src/lib/model/contact-record.d.ts +17 -0
- package/src/lib/model/contact-record.js +15 -1
- package/src/lib/model/contact-record.js.map +1 -1
- package/src/lib/model/contact-update.d.ts +31 -2
- package/src/lib/model/contact-update.js +14 -0
- package/src/lib/model/contact-update.js.map +1 -1
- package/src/lib/model/crm-list-query.d.ts +5 -0
- package/src/lib/model/crm-list-query.js +8 -0
- package/src/lib/model/crm-list-query.js.map +1 -1
- package/src/lib/model/crm-recipes.d.ts +40 -0
- package/src/lib/model/crm-recipes.js +244 -0
- package/src/lib/model/crm-recipes.js.map +1 -0
- package/src/lib/model/crm-record-counts.d.ts +36 -0
- package/src/lib/model/crm-record-counts.js +54 -0
- package/src/lib/model/crm-record-counts.js.map +1 -0
- package/src/lib/model/crm-record-lists.d.ts +23 -0
- package/src/lib/model/crm-record-lists.js +161 -0
- package/src/lib/model/crm-record-lists.js.map +1 -0
- package/src/lib/model/crm-reports.d.ts +73 -3
- package/src/lib/model/crm-reports.js +120 -1
- package/src/lib/model/crm-reports.js.map +1 -1
- package/src/lib/model/crm-sharing.d.ts +21 -3
- package/src/lib/model/crm-sharing.js +27 -6
- package/src/lib/model/crm-sharing.js.map +1 -1
- package/src/lib/model/deal-board-model.d.ts +8 -2
- package/src/lib/model/deal-board-model.js +15 -2
- package/src/lib/model/deal-board-model.js.map +1 -1
- package/src/lib/model/deal-contact-roles.d.ts +45 -0
- package/src/lib/model/deal-contact-roles.js +73 -0
- package/src/lib/model/deal-contact-roles.js.map +1 -0
- package/src/lib/model/deal-form-model.d.ts +56 -0
- package/src/lib/model/deal-form-model.js +79 -7
- package/src/lib/model/deal-form-model.js.map +1 -1
- package/src/lib/model/download-text-file.d.ts +23 -0
- package/src/lib/model/download-text-file.js +34 -0
- package/src/lib/model/download-text-file.js.map +1 -0
- package/src/lib/model/lead-filters.d.ts +36 -2
- package/src/lib/model/lead-filters.js +123 -2
- package/src/lib/model/lead-filters.js.map +1 -1
- package/src/lib/model/lead-source-direction.d.ts +38 -0
- package/src/lib/model/lead-source-direction.js +52 -0
- package/src/lib/model/lead-source-direction.js.map +1 -0
- package/src/lib/model/picklist-values.d.ts +119 -0
- package/src/lib/model/picklist-values.js +256 -0
- package/src/lib/model/picklist-values.js.map +1 -0
- package/src/lib/model/record-facts-disclosed.d.ts +81 -0
- package/src/lib/model/record-facts-disclosed.js +281 -0
- package/src/lib/model/record-facts-disclosed.js.map +1 -0
- package/src/lib/model/record-facts.d.ts +215 -34
- package/src/lib/model/record-facts.js +307 -128
- package/src/lib/model/record-facts.js.map +1 -1
- package/src/lib/model/task-picklists.d.ts +52 -0
- package/src/lib/model/task-picklists.js +83 -0
- package/src/lib/model/task-picklists.js.map +1 -0
- package/src/lib/model/task-routes.d.ts +13 -0
- package/src/lib/model/task-routes.js +23 -4
- package/src/lib/model/task-routes.js.map +1 -1
- package/src/lib/plan-entitlements.js +6 -4
- package/src/lib/plan-entitlements.js.map +1 -1
- package/src/lib/plugin.js +17 -0
- package/src/lib/plugin.js.map +1 -1
- package/src/lib/server/api-v1/contacts.js +220 -14
- package/src/lib/server/api-v1/contacts.js.map +1 -1
- package/src/lib/server/api-v1/crm-activities.js +14 -1
- package/src/lib/server/api-v1/crm-activities.js.map +1 -1
- package/src/lib/server/api-v1/crm-companies.js +123 -14
- package/src/lib/server/api-v1/crm-companies.js.map +1 -1
- package/src/lib/server/api-v1/crm-deals.js +291 -26
- package/src/lib/server/api-v1/crm-deals.js.map +1 -1
- package/src/lib/server/api-v1/crm-leads.js +144 -38
- package/src/lib/server/api-v1/crm-leads.js.map +1 -1
- package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
- package/src/lib/server/api-v1/crm-pipelines.js +8 -2
- package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
- package/src/lib/server/api-v1/crm-tasks.js +75 -33
- package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
- package/src/lib/server/api-v1/openapi.d.ts +0 -11
- package/src/lib/server/api-v1/openapi.js +171 -16
- package/src/lib/server/api-v1/openapi.js.map +1 -1
- package/src/lib/server/assign-contact-owner.d.ts +162 -0
- package/src/lib/server/assign-contact-owner.js +340 -0
- package/src/lib/server/assign-contact-owner.js.map +1 -0
- package/src/lib/server/associate-company-by-domain.d.ts +70 -0
- package/src/lib/server/associate-company-by-domain.js +153 -0
- package/src/lib/server/associate-company-by-domain.js.map +1 -0
- package/src/lib/server/automation-steps.d.ts +139 -0
- package/src/lib/server/automation-steps.js +472 -0
- package/src/lib/server/automation-steps.js.map +1 -0
- package/src/lib/server/capture-contact.js +65 -21
- package/src/lib/server/capture-contact.js.map +1 -1
- package/src/lib/server/capture-host-contact.d.ts +104 -0
- package/src/lib/server/capture-host-contact.js +151 -0
- package/src/lib/server/capture-host-contact.js.map +1 -0
- package/src/lib/server/company-children.d.ts +25 -0
- package/src/lib/server/company-children.js +42 -0
- package/src/lib/server/company-children.js.map +1 -0
- package/src/lib/server/company-delete.d.ts +18 -0
- package/src/lib/server/company-delete.js +44 -21
- package/src/lib/server/company-delete.js.map +1 -1
- package/src/lib/server/contact-email-history.js +21 -19
- package/src/lib/server/contact-email-history.js.map +1 -1
- package/src/lib/server/contact-remove.js +27 -2
- package/src/lib/server/contact-remove.js.map +1 -1
- package/src/lib/server/contact-reports-to.d.ts +61 -0
- package/src/lib/server/contact-reports-to.js +114 -0
- package/src/lib/server/contact-reports-to.js.map +1 -0
- package/src/lib/server/contact-update.d.ts +42 -1
- package/src/lib/server/contact-update.js +204 -23
- package/src/lib/server/contact-update.js.map +1 -1
- package/src/lib/server/convert-host-lead.d.ts +46 -1
- package/src/lib/server/convert-host-lead.js +173 -15
- package/src/lib/server/convert-host-lead.js.map +1 -1
- package/src/lib/server/convert-open-lead.js +12 -5
- package/src/lib/server/convert-open-lead.js.map +1 -1
- package/src/lib/server/crm-record-indexes.d.ts +45 -0
- package/src/lib/server/crm-record-indexes.js +78 -0
- package/src/lib/server/crm-record-indexes.js.map +1 -0
- package/src/lib/server/crm-sharing.d.ts +9 -1
- package/src/lib/server/crm-sharing.js +23 -3
- package/src/lib/server/crm-sharing.js.map +1 -1
- package/src/lib/server/deal-contact-roles.d.ts +27 -0
- package/src/lib/server/deal-contact-roles.js +89 -0
- package/src/lib/server/deal-contact-roles.js.map +1 -0
- package/src/lib/server/lead-convert.d.ts +5 -0
- package/src/lib/server/lead-convert.js +19 -3
- package/src/lib/server/lead-convert.js.map +1 -1
- package/src/lib/server/lead-create.d.ts +17 -2
- package/src/lib/server/lead-create.js +46 -14
- package/src/lib/server/lead-create.js.map +1 -1
- package/src/lib/server/lead-nurturing.d.ts +6 -0
- package/src/lib/server/lead-nurturing.js +57 -20
- package/src/lib/server/lead-nurturing.js.map +1 -1
- package/src/lib/server/lead-picklists.d.ts +35 -0
- package/src/lib/server/lead-picklists.js +52 -0
- package/src/lib/server/lead-picklists.js.map +1 -0
- package/src/lib/server/lead-source-picklist.d.ts +1 -13
- package/src/lib/server/lead-source-picklist.js +6 -33
- package/src/lib/server/lead-source-picklist.js.map +1 -1
- package/src/lib/server/merge-contacts.js +22 -4
- package/src/lib/server/merge-contacts.js.map +1 -1
- package/src/lib/server/person-eraser.d.ts +53 -0
- package/src/lib/server/person-eraser.js +149 -0
- package/src/lib/server/person-eraser.js.map +1 -0
- package/src/lib/server/person-records.d.ts +69 -0
- package/src/lib/server/person-records.js +317 -0
- package/src/lib/server/person-records.js.map +1 -0
- package/src/lib/server/person-refund.d.ts +97 -0
- package/src/lib/server/person-refund.js +221 -0
- package/src/lib/server/person-refund.js.map +1 -0
- package/src/lib/server/picklist-values.d.ts +21 -0
- package/src/lib/server/picklist-values.js +308 -0
- package/src/lib/server/picklist-values.js.map +1 -0
- package/src/lib/server/read-picklist.d.ts +44 -0
- package/src/lib/server/read-picklist.js +65 -0
- package/src/lib/server/read-picklist.js.map +1 -0
- package/src/lib/server/recipe-routes.js +15 -7
- package/src/lib/server/recipe-routes.js.map +1 -1
- package/src/lib/server/record-email-state.js +7 -1
- package/src/lib/server/record-email-state.js.map +1 -1
- package/src/lib/server/record-facts.d.ts +3 -0
- package/src/lib/server/record-facts.js +233 -31
- package/src/lib/server/record-facts.js.map +1 -1
- package/src/lib/server/record-origin.d.ts +27 -0
- package/src/lib/server/record-origin.js +104 -0
- package/src/lib/server/record-origin.js.map +1 -0
- package/src/lib/server/record-timeline.js +15 -2
- package/src/lib/server/record-timeline.js.map +1 -1
- package/src/lib/server/suite-gate.js +4 -3
- package/src/lib/server/suite-gate.js.map +1 -1
- package/src/lib/server/task-routes.js +30 -16
- package/src/lib/server/task-routes.js.map +1 -1
- package/src/lib/server-deal-stage.d.ts +5 -1
- package/src/lib/server-deal-stage.js +10 -5
- package/src/lib/server-deal-stage.js.map +1 -1
- package/src/lib/server.d.ts +8 -3
- package/src/lib/server.js +47 -43
- package/src/lib/server.js.map +1 -1
- package/src/lib/testing/memory-firestore.d.ts +55 -0
- package/src/lib/testing/memory-firestore.js +335 -0
- package/src/lib/testing/memory-firestore.js.map +1 -0
- package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
- package/src/lib/testing/stand-in-email-send-index.js +49 -0
- package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
- package/src/lib/transfer/activities.d.ts +30 -0
- package/src/lib/transfer/activities.js +132 -0
- package/src/lib/transfer/activities.js.map +1 -0
- package/src/lib/transfer/aliases.d.ts +22 -0
- package/src/lib/transfer/aliases.js +1342 -0
- package/src/lib/transfer/aliases.js.map +1 -0
- package/src/lib/transfer/common.d.ts +222 -0
- package/src/lib/transfer/common.js +832 -0
- package/src/lib/transfer/common.js.map +1 -0
- package/src/lib/transfer/companies.d.ts +43 -0
- package/src/lib/transfer/companies.js +549 -0
- package/src/lib/transfer/companies.js.map +1 -0
- package/src/lib/transfer/contacts.d.ts +31 -0
- package/src/lib/transfer/contacts.js +727 -0
- package/src/lib/transfer/contacts.js.map +1 -0
- package/src/lib/transfer/deals.d.ts +66 -0
- package/src/lib/transfer/deals.js +698 -0
- package/src/lib/transfer/deals.js.map +1 -0
- package/src/lib/transfer/email-templates-package.d.ts +40 -0
- package/src/lib/transfer/email-templates-package.js +76 -0
- package/src/lib/transfer/email-templates-package.js.map +1 -0
- package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
- package/src/lib/transfer/email-templates-package.server.js +176 -0
- package/src/lib/transfer/email-templates-package.server.js.map +1 -0
- package/src/lib/transfer/fields.d.ts +102 -0
- package/src/lib/transfer/fields.js +1755 -0
- package/src/lib/transfer/fields.js.map +1 -0
- package/src/lib/transfer/leads.d.ts +30 -0
- package/src/lib/transfer/leads.js +582 -0
- package/src/lib/transfer/leads.js.map +1 -0
- package/src/lib/transfer/pipelines.d.ts +21 -0
- package/src/lib/transfer/pipelines.js +172 -0
- package/src/lib/transfer/pipelines.js.map +1 -0
- package/src/lib/transfer/register.d.ts +47 -0
- package/src/lib/transfer/register.js +277 -0
- package/src/lib/transfer/register.js.map +1 -0
- package/src/lib/transfer/tasks.d.ts +30 -0
- package/src/lib/transfer/tasks.js +418 -0
- package/src/lib/transfer/tasks.js.map +1 -0
- package/src/lib/transfer/ui.d.ts +20 -0
- package/src/lib/transfer/ui.js +42 -0
- package/src/lib/transfer/ui.js.map +1 -0
- package/src/lib/components/company-import-drawer.d.ts +0 -42
- package/src/lib/components/company-import-drawer.js +0 -99
- package/src/lib/components/company-import-drawer.js.map +0 -1
- package/src/lib/components/contact-import-drawer.d.ts +0 -46
- package/src/lib/components/contact-import-drawer.js +0 -149
- package/src/lib/components/contact-import-drawer.js.map +0 -1
- package/src/lib/components/crm-export-all-button.d.ts +0 -39
- package/src/lib/components/crm-export-all-button.js +0 -98
- package/src/lib/components/crm-export-all-button.js.map +0 -1
- package/src/lib/components/csv-import-drawer.d.ts +0 -139
- package/src/lib/components/csv-import-drawer.js +0 -757
- package/src/lib/components/csv-import-drawer.js.map +0 -1
- package/src/lib/components/deal-import-drawer.d.ts +0 -24
- package/src/lib/components/deal-import-drawer.js +0 -83
- package/src/lib/components/deal-import-drawer.js.map +0 -1
- package/src/lib/components/lead-import-drawer.d.ts +0 -27
- package/src/lib/components/lead-import-drawer.js +0 -118
- package/src/lib/components/lead-import-drawer.js.map +0 -1
- package/src/lib/components/lead-source-values-card.d.ts +0 -27
- package/src/lib/components/lead-source-values-card.js.map +0 -1
- package/src/lib/components/task-import-drawer.d.ts +0 -24
- package/src/lib/components/task-import-drawer.js +0 -82
- package/src/lib/components/task-import-drawer.js.map +0 -1
- package/src/lib/model/companies-csv.d.ts +0 -36
- package/src/lib/model/companies-csv.js +0 -38
- package/src/lib/model/companies-csv.js.map +0 -1
- package/src/lib/model/contacts-csv.d.ts +0 -54
- package/src/lib/model/contacts-csv.js +0 -67
- package/src/lib/model/contacts-csv.js.map +0 -1
- package/src/lib/model/crm-company-import.d.ts +0 -154
- package/src/lib/model/crm-company-import.js +0 -331
- package/src/lib/model/crm-company-import.js.map +0 -1
- package/src/lib/model/crm-csv.d.ts +0 -239
- package/src/lib/model/crm-csv.js +0 -467
- package/src/lib/model/crm-csv.js.map +0 -1
- package/src/lib/model/crm-deal-import.d.ts +0 -112
- package/src/lib/model/crm-deal-import.js +0 -263
- package/src/lib/model/crm-deal-import.js.map +0 -1
- package/src/lib/model/crm-import.d.ts +0 -250
- package/src/lib/model/crm-import.js +0 -467
- package/src/lib/model/crm-import.js.map +0 -1
- package/src/lib/model/crm-lead-import.d.ts +0 -138
- package/src/lib/model/crm-lead-import.js +0 -446
- package/src/lib/model/crm-lead-import.js.map +0 -1
- package/src/lib/model/crm-task-import.d.ts +0 -94
- package/src/lib/model/crm-task-import.js +0 -275
- package/src/lib/model/crm-task-import.js.map +0 -1
- package/src/lib/model/deals-csv.d.ts +0 -32
- package/src/lib/model/deals-csv.js +0 -36
- package/src/lib/model/deals-csv.js.map +0 -1
- package/src/lib/model/import-column-shapes.d.ts +0 -36
- package/src/lib/model/import-column-shapes.js +0 -76
- package/src/lib/model/import-column-shapes.js.map +0 -1
- package/src/lib/model/lead-source-values.d.ts +0 -82
- package/src/lib/model/lead-source-values.js +0 -149
- package/src/lib/model/lead-source-values.js.map +0 -1
- package/src/lib/model/leads-csv.d.ts +0 -40
- package/src/lib/model/leads-csv.js +0 -40
- package/src/lib/model/leads-csv.js.map +0 -1
- package/src/lib/model/tasks-csv.d.ts +0 -28
- package/src/lib/model/tasks-csv.js +0 -28
- package/src/lib/model/tasks-csv.js.map +0 -1
- package/src/lib/server/companies-import.d.ts +0 -57
- package/src/lib/server/companies-import.js +0 -242
- package/src/lib/server/companies-import.js.map +0 -1
- package/src/lib/server/contacts-import.d.ts +0 -109
- package/src/lib/server/contacts-import.js +0 -393
- package/src/lib/server/contacts-import.js.map +0 -1
- package/src/lib/server/deals-import.d.ts +0 -76
- package/src/lib/server/deals-import.js +0 -248
- package/src/lib/server/deals-import.js.map +0 -1
- package/src/lib/server/export-route.d.ts +0 -60
- package/src/lib/server/export-route.js +0 -447
- package/src/lib/server/export-route.js.map +0 -1
- package/src/lib/server/import-context.d.ts +0 -87
- package/src/lib/server/import-context.js +0 -182
- package/src/lib/server/import-context.js.map +0 -1
- package/src/lib/server/lead-source-values.d.ts +0 -50
- package/src/lib/server/lead-source-values.js +0 -191
- package/src/lib/server/lead-source-values.js.map +0 -1
- package/src/lib/server/leads-import.d.ts +0 -84
- package/src/lib/server/leads-import.js +0 -367
- package/src/lib/server/leads-import.js.map +0 -1
- package/src/lib/server/tasks-import.d.ts +0 -54
- package/src/lib/server/tasks-import.js +0 -160
- 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
|