@rapidmx/crm-plugin 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +382 -0
- package/README.md +210 -0
- package/apps/admin-crm/_layout.tsx +46 -0
- package/apps/admin-crm/index.tsx +16 -0
- package/apps/crm/_layout.tsx +46 -0
- package/apps/crm/automations/[uid].tsx +16 -0
- package/apps/crm/automations/index.tsx +16 -0
- package/apps/crm/campaigns/[uid].tsx +16 -0
- package/apps/crm/campaigns/index.tsx +16 -0
- package/apps/crm/companies/[uid].tsx +16 -0
- package/apps/crm/companies/index.tsx +16 -0
- package/apps/crm/contacts/[uid].tsx +16 -0
- package/apps/crm/deals/[uid].tsx +16 -0
- package/apps/crm/deals/index.tsx +16 -0
- package/apps/crm/forms/index.tsx +16 -0
- package/apps/crm/imports/index.tsx +16 -0
- package/apps/crm/index.tsx +16 -0
- package/apps/crm/integrations/index.tsx +16 -0
- package/apps/crm/lists/index.tsx +16 -0
- package/apps/crm/pipelines/index.tsx +16 -0
- package/apps/crm/reports/index.tsx +16 -0
- package/apps/crm/scoring/index.tsx +16 -0
- package/apps/crm/segments/index.tsx +16 -0
- package/apps/crm/settings/index.tsx +16 -0
- package/apps/crm/tasks/index.tsx +16 -0
- package/apps/crm/templates/[uid].tsx +16 -0
- package/apps/crm/templates/index.tsx +16 -0
- package/apps/f/[formUid].tsx +11 -0
- package/apps/f/_layout.tsx +33 -0
- package/apps/f/index.tsx +15 -0
- package/apps/shared/components/CrmShell.tsx +229 -0
- package/apps/shared/components/FilterBuilder.tsx +204 -0
- package/apps/shared/components/FormManager.tsx +326 -0
- package/apps/shared/components/ImportWizard.tsx +251 -0
- package/apps/shared/components/Integrations.tsx +401 -0
- package/apps/shared/components/ListManager.tsx +206 -0
- package/apps/shared/components/RecordDetail.tsx +444 -0
- package/apps/shared/components/RecordList.tsx +446 -0
- package/apps/shared/components/ScoringRules.tsx +262 -0
- package/apps/shared/components/SegmentManager.tsx +245 -0
- package/apps/shared/components/TaskList.tsx +140 -0
- package/apps/shared/components/TemplateList.tsx +170 -0
- package/apps/shared/components/WorkspaceSettings.tsx +503 -0
- package/apps/shared/components/admin/CrmAdmin.tsx +129 -0
- package/apps/shared/components/automations/AutomationEditor.tsx +530 -0
- package/apps/shared/components/automations/AutomationList.tsx +147 -0
- package/apps/shared/components/automations/StepInspector.tsx +403 -0
- package/apps/shared/components/automations/flowModel.ts +331 -0
- package/apps/shared/components/campaigns/CampaignEditor.tsx +471 -0
- package/apps/shared/components/campaigns/CampaignList.tsx +164 -0
- package/apps/shared/components/campaigns/CampaignPage.tsx +30 -0
- package/apps/shared/components/campaigns/CampaignReport.tsx +345 -0
- package/apps/shared/components/campaigns/campaignUi.tsx +33 -0
- package/apps/shared/components/deals/ContactDeals.tsx +40 -0
- package/apps/shared/components/deals/DealBoard.tsx +287 -0
- package/apps/shared/components/deals/DealDetail.tsx +363 -0
- package/apps/shared/components/deals/PipelineManager.tsx +207 -0
- package/apps/shared/components/deals/dealUi.ts +24 -0
- package/apps/shared/components/designer/BlockView.tsx +92 -0
- package/apps/shared/components/designer/Canvas.tsx +206 -0
- package/apps/shared/components/designer/Inspector.tsx +339 -0
- package/apps/shared/components/designer/LazyTextBlockEditor.tsx +68 -0
- package/apps/shared/components/designer/MergeTagPicker.tsx +31 -0
- package/apps/shared/components/designer/PreviewModal.tsx +119 -0
- package/apps/shared/components/designer/TemplateDesigner.tsx +408 -0
- package/apps/shared/components/designer/TestSendModal.tsx +75 -0
- package/apps/shared/components/designer/TextBlockEditor.tsx +122 -0
- package/apps/shared/components/designer/designModel.ts +276 -0
- package/apps/shared/components/public/PublicPages.tsx +343 -0
- package/apps/shared/components/public/honeypot.ts +7 -0
- package/apps/shared/components/reports/Charts.tsx +315 -0
- package/apps/shared/components/reports/Reports.tsx +198 -0
- package/apps/shared/crmApi.ts +1046 -0
- package/apps/shared/fields.ts +175 -0
- package/apps/shared/publicApi.ts +50 -0
- package/apps/subscriptions/[token].tsx +11 -0
- package/apps/subscriptions/_layout.tsx +33 -0
- package/apps/subscriptions/confirm/[token].tsx +11 -0
- package/apps/subscriptions/index.tsx +11 -0
- package/apps/subscriptions/unsubscribe/[token].tsx +11 -0
- package/dist/apps/admin-crm/_layout.d.ts +15 -0
- package/dist/apps/admin-crm/_layout.js +8 -0
- package/dist/apps/admin-crm/index.d.ts +4 -0
- package/dist/apps/admin-crm/index.js +7 -0
- package/dist/apps/crm/_layout.d.ts +15 -0
- package/dist/apps/crm/_layout.js +8 -0
- package/dist/apps/crm/automations/[uid].d.ts +8 -0
- package/dist/apps/crm/automations/[uid].js +7 -0
- package/dist/apps/crm/automations/index.d.ts +4 -0
- package/dist/apps/crm/automations/index.js +7 -0
- package/dist/apps/crm/campaigns/[uid].d.ts +8 -0
- package/dist/apps/crm/campaigns/[uid].js +7 -0
- package/dist/apps/crm/campaigns/index.d.ts +4 -0
- package/dist/apps/crm/campaigns/index.js +7 -0
- package/dist/apps/crm/companies/[uid].d.ts +8 -0
- package/dist/apps/crm/companies/[uid].js +7 -0
- package/dist/apps/crm/companies/index.d.ts +4 -0
- package/dist/apps/crm/companies/index.js +7 -0
- package/dist/apps/crm/contacts/[uid].d.ts +8 -0
- package/dist/apps/crm/contacts/[uid].js +7 -0
- package/dist/apps/crm/deals/[uid].d.ts +8 -0
- package/dist/apps/crm/deals/[uid].js +7 -0
- package/dist/apps/crm/deals/index.d.ts +4 -0
- package/dist/apps/crm/deals/index.js +7 -0
- package/dist/apps/crm/forms/index.d.ts +4 -0
- package/dist/apps/crm/forms/index.js +7 -0
- package/dist/apps/crm/imports/index.d.ts +4 -0
- package/dist/apps/crm/imports/index.js +7 -0
- package/dist/apps/crm/index.d.ts +4 -0
- package/dist/apps/crm/index.js +7 -0
- package/dist/apps/crm/integrations/index.d.ts +4 -0
- package/dist/apps/crm/integrations/index.js +7 -0
- package/dist/apps/crm/lists/index.d.ts +4 -0
- package/dist/apps/crm/lists/index.js +7 -0
- package/dist/apps/crm/pipelines/index.d.ts +4 -0
- package/dist/apps/crm/pipelines/index.js +7 -0
- package/dist/apps/crm/reports/index.d.ts +4 -0
- package/dist/apps/crm/reports/index.js +7 -0
- package/dist/apps/crm/scoring/index.d.ts +4 -0
- package/dist/apps/crm/scoring/index.js +7 -0
- package/dist/apps/crm/segments/index.d.ts +4 -0
- package/dist/apps/crm/segments/index.js +7 -0
- package/dist/apps/crm/settings/index.d.ts +4 -0
- package/dist/apps/crm/settings/index.js +7 -0
- package/dist/apps/crm/tasks/index.d.ts +4 -0
- package/dist/apps/crm/tasks/index.js +7 -0
- package/dist/apps/crm/templates/[uid].d.ts +8 -0
- package/dist/apps/crm/templates/[uid].js +7 -0
- package/dist/apps/crm/templates/index.d.ts +4 -0
- package/dist/apps/crm/templates/index.js +7 -0
- package/dist/apps/f/[formUid].d.ts +7 -0
- package/dist/apps/f/[formUid].js +6 -0
- package/dist/apps/f/_layout.d.ts +8 -0
- package/dist/apps/f/_layout.js +8 -0
- package/dist/apps/f/index.d.ts +3 -0
- package/dist/apps/f/index.js +6 -0
- package/dist/apps/shared/components/CrmShell.d.ts +39 -0
- package/dist/apps/shared/components/CrmShell.js +127 -0
- package/dist/apps/shared/components/FilterBuilder.d.ts +34 -0
- package/dist/apps/shared/components/FilterBuilder.js +101 -0
- package/dist/apps/shared/components/FormManager.d.ts +7 -0
- package/dist/apps/shared/components/FormManager.js +132 -0
- package/dist/apps/shared/components/ImportWizard.d.ts +8 -0
- package/dist/apps/shared/components/ImportWizard.js +105 -0
- package/dist/apps/shared/components/Integrations.d.ts +13 -0
- package/dist/apps/shared/components/Integrations.js +164 -0
- package/dist/apps/shared/components/ListManager.d.ts +6 -0
- package/dist/apps/shared/components/ListManager.js +95 -0
- package/dist/apps/shared/components/RecordDetail.d.ts +30 -0
- package/dist/apps/shared/components/RecordDetail.js +244 -0
- package/dist/apps/shared/components/RecordList.d.ts +13 -0
- package/dist/apps/shared/components/RecordList.js +214 -0
- package/dist/apps/shared/components/ScoringRules.d.ts +13 -0
- package/dist/apps/shared/components/ScoringRules.js +128 -0
- package/dist/apps/shared/components/SegmentManager.d.ts +10 -0
- package/dist/apps/shared/components/SegmentManager.js +119 -0
- package/dist/apps/shared/components/TaskList.d.ts +3 -0
- package/dist/apps/shared/components/TaskList.js +62 -0
- package/dist/apps/shared/components/TemplateList.d.ts +3 -0
- package/dist/apps/shared/components/TemplateList.js +81 -0
- package/dist/apps/shared/components/WorkspaceSettings.d.ts +6 -0
- package/dist/apps/shared/components/WorkspaceSettings.js +239 -0
- package/dist/apps/shared/components/admin/CrmAdmin.d.ts +9 -0
- package/dist/apps/shared/components/admin/CrmAdmin.js +56 -0
- package/dist/apps/shared/components/automations/AutomationEditor.d.ts +15 -0
- package/dist/apps/shared/components/automations/AutomationEditor.js +219 -0
- package/dist/apps/shared/components/automations/AutomationList.d.ts +3 -0
- package/dist/apps/shared/components/automations/AutomationList.js +65 -0
- package/dist/apps/shared/components/automations/StepInspector.d.ts +40 -0
- package/dist/apps/shared/components/automations/StepInspector.js +177 -0
- package/dist/apps/shared/components/automations/flowModel.d.ts +67 -0
- package/dist/apps/shared/components/automations/flowModel.js +292 -0
- package/dist/apps/shared/components/campaigns/CampaignEditor.d.ts +11 -0
- package/dist/apps/shared/components/campaigns/CampaignEditor.js +163 -0
- package/dist/apps/shared/components/campaigns/CampaignList.d.ts +3 -0
- package/dist/apps/shared/components/campaigns/CampaignList.js +80 -0
- package/dist/apps/shared/components/campaigns/CampaignPage.d.ts +5 -0
- package/dist/apps/shared/components/campaigns/CampaignPage.js +24 -0
- package/dist/apps/shared/components/campaigns/CampaignReport.d.ts +13 -0
- package/dist/apps/shared/components/campaigns/CampaignReport.js +119 -0
- package/dist/apps/shared/components/campaigns/campaignUi.d.ts +10 -0
- package/dist/apps/shared/components/campaigns/campaignUi.js +24 -0
- package/dist/apps/shared/components/deals/ContactDeals.d.ts +5 -0
- package/dist/apps/shared/components/deals/ContactDeals.js +18 -0
- package/dist/apps/shared/components/deals/DealBoard.d.ts +7 -0
- package/dist/apps/shared/components/deals/DealBoard.js +134 -0
- package/dist/apps/shared/components/deals/DealDetail.d.ts +8 -0
- package/dist/apps/shared/components/deals/DealDetail.js +148 -0
- package/dist/apps/shared/components/deals/PipelineManager.d.ts +7 -0
- package/dist/apps/shared/components/deals/PipelineManager.js +62 -0
- package/dist/apps/shared/components/deals/dealUi.d.ts +7 -0
- package/dist/apps/shared/components/deals/dealUi.js +17 -0
- package/dist/apps/shared/components/designer/BlockView.d.ts +10 -0
- package/dist/apps/shared/components/designer/BlockView.js +37 -0
- package/dist/apps/shared/components/designer/Canvas.d.ts +31 -0
- package/dist/apps/shared/components/designer/Canvas.js +71 -0
- package/dist/apps/shared/components/designer/Inspector.d.ts +27 -0
- package/dist/apps/shared/components/designer/Inspector.js +102 -0
- package/dist/apps/shared/components/designer/LazyTextBlockEditor.d.ts +7 -0
- package/dist/apps/shared/components/designer/LazyTextBlockEditor.js +42 -0
- package/dist/apps/shared/components/designer/MergeTagPicker.d.ts +11 -0
- package/dist/apps/shared/components/designer/MergeTagPicker.js +15 -0
- package/dist/apps/shared/components/designer/PreviewModal.d.ts +15 -0
- package/dist/apps/shared/components/designer/PreviewModal.js +50 -0
- package/dist/apps/shared/components/designer/TemplateDesigner.d.ts +10 -0
- package/dist/apps/shared/components/designer/TemplateDesigner.js +194 -0
- package/dist/apps/shared/components/designer/TestSendModal.d.ts +11 -0
- package/dist/apps/shared/components/designer/TestSendModal.js +35 -0
- package/dist/apps/shared/components/designer/TextBlockEditor.d.ts +16 -0
- package/dist/apps/shared/components/designer/TextBlockEditor.js +81 -0
- package/dist/apps/shared/components/designer/designModel.d.ts +86 -0
- package/dist/apps/shared/components/designer/designModel.js +230 -0
- package/dist/apps/shared/components/public/PublicPages.d.ts +29 -0
- package/dist/apps/shared/components/public/PublicPages.js +155 -0
- package/dist/apps/shared/components/public/honeypot.d.ts +2 -0
- package/dist/apps/shared/components/public/honeypot.js +6 -0
- package/dist/apps/shared/components/reports/Charts.d.ts +32 -0
- package/dist/apps/shared/components/reports/Charts.js +121 -0
- package/dist/apps/shared/components/reports/Reports.d.ts +9 -0
- package/dist/apps/shared/components/reports/Reports.js +61 -0
- package/dist/apps/shared/crmApi.d.ts +909 -0
- package/dist/apps/shared/crmApi.js +240 -0
- package/dist/apps/shared/fields.d.ts +45 -0
- package/dist/apps/shared/fields.js +146 -0
- package/dist/apps/shared/publicApi.d.ts +48 -0
- package/dist/apps/shared/publicApi.js +17 -0
- package/dist/apps/subscriptions/[token].d.ts +7 -0
- package/dist/apps/subscriptions/[token].js +6 -0
- package/dist/apps/subscriptions/_layout.d.ts +8 -0
- package/dist/apps/subscriptions/_layout.js +8 -0
- package/dist/apps/subscriptions/confirm/[token].d.ts +7 -0
- package/dist/apps/subscriptions/confirm/[token].js +6 -0
- package/dist/apps/subscriptions/index.d.ts +3 -0
- package/dist/apps/subscriptions/index.js +6 -0
- package/dist/apps/subscriptions/unsubscribe/[token].d.ts +7 -0
- package/dist/apps/subscriptions/unsubscribe/[token].js +6 -0
- package/dist/lib/automation/Dates.js +85 -0
- package/dist/lib/automation/Dates.js.map +1 -0
- package/dist/lib/automation/Engine.js +384 -0
- package/dist/lib/automation/Engine.js.map +1 -0
- package/dist/lib/automation/Events.js +46 -0
- package/dist/lib/automation/Events.js.map +1 -0
- package/dist/lib/automation/Graph.js +296 -0
- package/dist/lib/automation/Graph.js.map +1 -0
- package/dist/lib/filters/Filter.js +343 -0
- package/dist/lib/filters/Filter.js.map +1 -0
- package/dist/lib/filters/fields.js +71 -0
- package/dist/lib/filters/fields.js.map +1 -0
- package/dist/lib/index.js +86 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/jobs/AutomationRunJob.js +110 -0
- package/dist/lib/jobs/AutomationRunJob.js.map +1 -0
- package/dist/lib/jobs/AutomationTriggerJob.js +126 -0
- package/dist/lib/jobs/AutomationTriggerJob.js.map +1 -0
- package/dist/lib/jobs/CampaignJob.js +285 -0
- package/dist/lib/jobs/CampaignJob.js.map +1 -0
- package/dist/lib/jobs/CrmImportJob.js +218 -0
- package/dist/lib/jobs/CrmImportJob.js.map +1 -0
- package/dist/lib/jobs/CrmJobBase.js +75 -0
- package/dist/lib/jobs/CrmJobBase.js.map +1 -0
- package/dist/lib/jobs/CrmMailEventJob.js +232 -0
- package/dist/lib/jobs/CrmMailEventJob.js.map +1 -0
- package/dist/lib/jobs/DateTriggerJob.js +155 -0
- package/dist/lib/jobs/DateTriggerJob.js.map +1 -0
- package/dist/lib/jobs/ScoringJob.js +75 -0
- package/dist/lib/jobs/ScoringJob.js.map +1 -0
- package/dist/lib/jobs/SegmentRefreshJob.js +84 -0
- package/dist/lib/jobs/SegmentRefreshJob.js.map +1 -0
- package/dist/lib/jobs/SendDispatchJob.js +277 -0
- package/dist/lib/jobs/SendDispatchJob.js.map +1 -0
- package/dist/lib/jobs/TaskReminderJob.js +70 -0
- package/dist/lib/jobs/TaskReminderJob.js.map +1 -0
- package/dist/lib/jobs/WebhookDeliveryJob.js +126 -0
- package/dist/lib/jobs/WebhookDeliveryJob.js.map +1 -0
- package/dist/lib/jobs/mongo/AutomationRunJobMongo.js +12 -0
- package/dist/lib/jobs/mongo/AutomationRunJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/AutomationTriggerJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/AutomationTriggerJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/CampaignJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/CampaignJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/CrmImportJobMongo.js +14 -0
- package/dist/lib/jobs/mongo/CrmImportJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/CrmMailEventJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/CrmMailEventJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/DateTriggerJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/DateTriggerJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/ScoringJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/ScoringJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/SegmentRefreshJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/SegmentRefreshJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/SendDispatchJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/SendDispatchJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/TaskReminderJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/TaskReminderJobMongo.js.map +1 -0
- package/dist/lib/jobs/mongo/WebhookDeliveryJobMongo.js +10 -0
- package/dist/lib/jobs/mongo/WebhookDeliveryJobMongo.js.map +1 -0
- package/dist/lib/jobs/sql/AutomationRunJobSQL.js +12 -0
- package/dist/lib/jobs/sql/AutomationRunJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/AutomationTriggerJobSQL.js +10 -0
- package/dist/lib/jobs/sql/AutomationTriggerJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/CampaignJobSQL.js +10 -0
- package/dist/lib/jobs/sql/CampaignJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/CrmImportJobSQL.js +14 -0
- package/dist/lib/jobs/sql/CrmImportJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/CrmMailEventJobSQL.js +10 -0
- package/dist/lib/jobs/sql/CrmMailEventJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/DateTriggerJobSQL.js +10 -0
- package/dist/lib/jobs/sql/DateTriggerJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/ScoringJobSQL.js +10 -0
- package/dist/lib/jobs/sql/ScoringJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/SegmentRefreshJobSQL.js +10 -0
- package/dist/lib/jobs/sql/SegmentRefreshJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/SendDispatchJobSQL.js +10 -0
- package/dist/lib/jobs/sql/SendDispatchJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/TaskReminderJobSQL.js +10 -0
- package/dist/lib/jobs/sql/TaskReminderJobSQL.js.map +1 -0
- package/dist/lib/jobs/sql/WebhookDeliveryJobSQL.js +10 -0
- package/dist/lib/jobs/sql/WebhookDeliveryJobSQL.js.map +1 -0
- package/dist/lib/models/CrmModelClasses.js +44 -0
- package/dist/lib/models/CrmModelClasses.js.map +1 -0
- package/dist/lib/models/mongo/ApiKeyMongo.js +105 -0
- package/dist/lib/models/mongo/ApiKeyMongo.js.map +1 -0
- package/dist/lib/models/mongo/AutomationMongo.js +126 -0
- package/dist/lib/models/mongo/AutomationMongo.js.map +1 -0
- package/dist/lib/models/mongo/AutomationVersionMongo.js +82 -0
- package/dist/lib/models/mongo/AutomationVersionMongo.js.map +1 -0
- package/dist/lib/models/mongo/CampaignMongo.js +211 -0
- package/dist/lib/models/mongo/CampaignMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmCompanyMongo.js +126 -0
- package/dist/lib/models/mongo/CrmCompanyMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmContactMongo.js +156 -0
- package/dist/lib/models/mongo/CrmContactMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmEventMongo.js +92 -0
- package/dist/lib/models/mongo/CrmEventMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmFormMongo.js +139 -0
- package/dist/lib/models/mongo/CrmFormMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmImportMongo.js +190 -0
- package/dist/lib/models/mongo/CrmImportMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmNoteMongo.js +89 -0
- package/dist/lib/models/mongo/CrmNoteMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmSettingMongo.js +60 -0
- package/dist/lib/models/mongo/CrmSettingMongo.js.map +1 -0
- package/dist/lib/models/mongo/CrmTaskMongo.js +136 -0
- package/dist/lib/models/mongo/CrmTaskMongo.js.map +1 -0
- package/dist/lib/models/mongo/DealMongo.js +163 -0
- package/dist/lib/models/mongo/DealMongo.js.map +1 -0
- package/dist/lib/models/mongo/EmailTemplateMongo.js +90 -0
- package/dist/lib/models/mongo/EmailTemplateMongo.js.map +1 -0
- package/dist/lib/models/mongo/EngagementEventMongo.js +113 -0
- package/dist/lib/models/mongo/EngagementEventMongo.js.map +1 -0
- package/dist/lib/models/mongo/EnrollmentMongo.js +150 -0
- package/dist/lib/models/mongo/EnrollmentMongo.js.map +1 -0
- package/dist/lib/models/mongo/MailingListMongo.js +104 -0
- package/dist/lib/models/mongo/MailingListMongo.js.map +1 -0
- package/dist/lib/models/mongo/OutboundSendMongo.js +265 -0
- package/dist/lib/models/mongo/OutboundSendMongo.js.map +1 -0
- package/dist/lib/models/mongo/PipelineMongo.js +74 -0
- package/dist/lib/models/mongo/PipelineMongo.js.map +1 -0
- package/dist/lib/models/mongo/PropertyDefinitionMongo.js +105 -0
- package/dist/lib/models/mongo/PropertyDefinitionMongo.js.map +1 -0
- package/dist/lib/models/mongo/PropertyValueMongo.js +101 -0
- package/dist/lib/models/mongo/PropertyValueMongo.js.map +1 -0
- package/dist/lib/models/mongo/SavedBlockMongo.js +67 -0
- package/dist/lib/models/mongo/SavedBlockMongo.js.map +1 -0
- package/dist/lib/models/mongo/ScoringRuleMongo.js +112 -0
- package/dist/lib/models/mongo/ScoringRuleMongo.js.map +1 -0
- package/dist/lib/models/mongo/SegmentMongo.js +113 -0
- package/dist/lib/models/mongo/SegmentMongo.js.map +1 -0
- package/dist/lib/models/mongo/SubscriptionMongo.js +114 -0
- package/dist/lib/models/mongo/SubscriptionMongo.js.map +1 -0
- package/dist/lib/models/mongo/SuppressionMongo.js +77 -0
- package/dist/lib/models/mongo/SuppressionMongo.js.map +1 -0
- package/dist/lib/models/mongo/TimelineEventMongo.js +112 -0
- package/dist/lib/models/mongo/TimelineEventMongo.js.map +1 -0
- package/dist/lib/models/mongo/WebhookDeliveryMongo.js +128 -0
- package/dist/lib/models/mongo/WebhookDeliveryMongo.js.map +1 -0
- package/dist/lib/models/mongo/WebhookEndpointMongo.js +118 -0
- package/dist/lib/models/mongo/WebhookEndpointMongo.js.map +1 -0
- package/dist/lib/models/mongo/WorkspaceMemberMongo.js +92 -0
- package/dist/lib/models/mongo/WorkspaceMemberMongo.js.map +1 -0
- package/dist/lib/models/mongo/WorkspaceMongo.js +117 -0
- package/dist/lib/models/mongo/WorkspaceMongo.js.map +1 -0
- package/dist/lib/models/mongo/WorkspaceSenderMongo.js +100 -0
- package/dist/lib/models/mongo/WorkspaceSenderMongo.js.map +1 -0
- package/dist/lib/models/mongo/index.js +74 -0
- package/dist/lib/models/mongo/index.js.map +1 -0
- package/dist/lib/models/sql/ApiKeySQL.js +105 -0
- package/dist/lib/models/sql/ApiKeySQL.js.map +1 -0
- package/dist/lib/models/sql/AutomationSQL.js +126 -0
- package/dist/lib/models/sql/AutomationSQL.js.map +1 -0
- package/dist/lib/models/sql/AutomationVersionSQL.js +82 -0
- package/dist/lib/models/sql/AutomationVersionSQL.js.map +1 -0
- package/dist/lib/models/sql/CampaignSQL.js +211 -0
- package/dist/lib/models/sql/CampaignSQL.js.map +1 -0
- package/dist/lib/models/sql/CrmCompanySQL.js +126 -0
- package/dist/lib/models/sql/CrmCompanySQL.js.map +1 -0
- package/dist/lib/models/sql/CrmContactSQL.js +156 -0
- package/dist/lib/models/sql/CrmContactSQL.js.map +1 -0
- package/dist/lib/models/sql/CrmEventSQL.js +92 -0
- package/dist/lib/models/sql/CrmEventSQL.js.map +1 -0
- package/dist/lib/models/sql/CrmFormSQL.js +139 -0
- package/dist/lib/models/sql/CrmFormSQL.js.map +1 -0
- package/dist/lib/models/sql/CrmImportSQL.js +190 -0
- package/dist/lib/models/sql/CrmImportSQL.js.map +1 -0
- package/dist/lib/models/sql/CrmNoteSQL.js +89 -0
- package/dist/lib/models/sql/CrmNoteSQL.js.map +1 -0
- package/dist/lib/models/sql/CrmSettingSQL.js +60 -0
- package/dist/lib/models/sql/CrmSettingSQL.js.map +1 -0
- package/dist/lib/models/sql/CrmTaskSQL.js +136 -0
- package/dist/lib/models/sql/CrmTaskSQL.js.map +1 -0
- package/dist/lib/models/sql/DealSQL.js +163 -0
- package/dist/lib/models/sql/DealSQL.js.map +1 -0
- package/dist/lib/models/sql/EmailTemplateSQL.js +90 -0
- package/dist/lib/models/sql/EmailTemplateSQL.js.map +1 -0
- package/dist/lib/models/sql/EngagementEventSQL.js +113 -0
- package/dist/lib/models/sql/EngagementEventSQL.js.map +1 -0
- package/dist/lib/models/sql/EnrollmentSQL.js +150 -0
- package/dist/lib/models/sql/EnrollmentSQL.js.map +1 -0
- package/dist/lib/models/sql/MailingListSQL.js +104 -0
- package/dist/lib/models/sql/MailingListSQL.js.map +1 -0
- package/dist/lib/models/sql/OutboundSendSQL.js +265 -0
- package/dist/lib/models/sql/OutboundSendSQL.js.map +1 -0
- package/dist/lib/models/sql/PipelineSQL.js +74 -0
- package/dist/lib/models/sql/PipelineSQL.js.map +1 -0
- package/dist/lib/models/sql/PropertyDefinitionSQL.js +105 -0
- package/dist/lib/models/sql/PropertyDefinitionSQL.js.map +1 -0
- package/dist/lib/models/sql/PropertyValueSQL.js +101 -0
- package/dist/lib/models/sql/PropertyValueSQL.js.map +1 -0
- package/dist/lib/models/sql/SavedBlockSQL.js +67 -0
- package/dist/lib/models/sql/SavedBlockSQL.js.map +1 -0
- package/dist/lib/models/sql/ScoringRuleSQL.js +112 -0
- package/dist/lib/models/sql/ScoringRuleSQL.js.map +1 -0
- package/dist/lib/models/sql/SegmentSQL.js +113 -0
- package/dist/lib/models/sql/SegmentSQL.js.map +1 -0
- package/dist/lib/models/sql/SubscriptionSQL.js +114 -0
- package/dist/lib/models/sql/SubscriptionSQL.js.map +1 -0
- package/dist/lib/models/sql/SuppressionSQL.js +77 -0
- package/dist/lib/models/sql/SuppressionSQL.js.map +1 -0
- package/dist/lib/models/sql/TimelineEventSQL.js +112 -0
- package/dist/lib/models/sql/TimelineEventSQL.js.map +1 -0
- package/dist/lib/models/sql/WebhookDeliverySQL.js +128 -0
- package/dist/lib/models/sql/WebhookDeliverySQL.js.map +1 -0
- package/dist/lib/models/sql/WebhookEndpointSQL.js +118 -0
- package/dist/lib/models/sql/WebhookEndpointSQL.js.map +1 -0
- package/dist/lib/models/sql/WorkspaceMemberSQL.js +92 -0
- package/dist/lib/models/sql/WorkspaceMemberSQL.js.map +1 -0
- package/dist/lib/models/sql/WorkspaceSQL.js +117 -0
- package/dist/lib/models/sql/WorkspaceSQL.js.map +1 -0
- package/dist/lib/models/sql/WorkspaceSenderSQL.js +100 -0
- package/dist/lib/models/sql/WorkspaceSenderSQL.js.map +1 -0
- package/dist/lib/models/sql/index.js +74 -0
- package/dist/lib/models/sql/index.js.map +1 -0
- package/dist/lib/models/types.js +275 -0
- package/dist/lib/models/types.js.map +1 -0
- package/dist/lib/mongo.js +80 -0
- package/dist/lib/mongo.js.map +1 -0
- package/dist/lib/purge.js +68 -0
- package/dist/lib/purge.js.map +1 -0
- package/dist/lib/routes/BaseAnalyticsRoute.js +217 -0
- package/dist/lib/routes/BaseAnalyticsRoute.js.map +1 -0
- package/dist/lib/routes/BaseApiKeyRoute.js +76 -0
- package/dist/lib/routes/BaseApiKeyRoute.js.map +1 -0
- package/dist/lib/routes/BaseAutomationRoute.js +316 -0
- package/dist/lib/routes/BaseAutomationRoute.js.map +1 -0
- package/dist/lib/routes/BaseCampaignRoute.js +443 -0
- package/dist/lib/routes/BaseCampaignRoute.js.map +1 -0
- package/dist/lib/routes/BaseCompanyRoute.js +106 -0
- package/dist/lib/routes/BaseCompanyRoute.js.map +1 -0
- package/dist/lib/routes/BaseContactRoute.js +162 -0
- package/dist/lib/routes/BaseContactRoute.js.map +1 -0
- package/dist/lib/routes/BaseCrmAdminRoute.js +108 -0
- package/dist/lib/routes/BaseCrmAdminRoute.js.map +1 -0
- package/dist/lib/routes/BaseDealRoute.js +312 -0
- package/dist/lib/routes/BaseDealRoute.js.map +1 -0
- package/dist/lib/routes/BaseFormRoute.js +124 -0
- package/dist/lib/routes/BaseFormRoute.js.map +1 -0
- package/dist/lib/routes/BaseImportRoute.js +231 -0
- package/dist/lib/routes/BaseImportRoute.js.map +1 -0
- package/dist/lib/routes/BaseIntegrationRoute.js +181 -0
- package/dist/lib/routes/BaseIntegrationRoute.js.map +1 -0
- package/dist/lib/routes/BaseListRoute.js +89 -0
- package/dist/lib/routes/BaseListRoute.js.map +1 -0
- package/dist/lib/routes/BaseNoteRoute.js +69 -0
- package/dist/lib/routes/BaseNoteRoute.js.map +1 -0
- package/dist/lib/routes/BasePipelineRoute.js +149 -0
- package/dist/lib/routes/BasePipelineRoute.js.map +1 -0
- package/dist/lib/routes/BasePropertyDefinitionRoute.js +140 -0
- package/dist/lib/routes/BasePropertyDefinitionRoute.js.map +1 -0
- package/dist/lib/routes/BasePublicRoute.js +528 -0
- package/dist/lib/routes/BasePublicRoute.js.map +1 -0
- package/dist/lib/routes/BaseSavedBlockRoute.js +39 -0
- package/dist/lib/routes/BaseSavedBlockRoute.js.map +1 -0
- package/dist/lib/routes/BaseScoringRuleRoute.js +146 -0
- package/dist/lib/routes/BaseScoringRuleRoute.js.map +1 -0
- package/dist/lib/routes/BaseSegmentRoute.js +136 -0
- package/dist/lib/routes/BaseSegmentRoute.js.map +1 -0
- package/dist/lib/routes/BaseSubscriptionRoute.js +92 -0
- package/dist/lib/routes/BaseSubscriptionRoute.js.map +1 -0
- package/dist/lib/routes/BaseSuppressionRoute.js +48 -0
- package/dist/lib/routes/BaseSuppressionRoute.js.map +1 -0
- package/dist/lib/routes/BaseTaggedRecordRoute.js +312 -0
- package/dist/lib/routes/BaseTaggedRecordRoute.js.map +1 -0
- package/dist/lib/routes/BaseTaskRoute.js +116 -0
- package/dist/lib/routes/BaseTaskRoute.js.map +1 -0
- package/dist/lib/routes/BaseTemplateRoute.js +207 -0
- package/dist/lib/routes/BaseTemplateRoute.js.map +1 -0
- package/dist/lib/routes/BaseTimelineRoute.js +47 -0
- package/dist/lib/routes/BaseTimelineRoute.js.map +1 -0
- package/dist/lib/routes/BaseTrackingRoute.js +106 -0
- package/dist/lib/routes/BaseTrackingRoute.js.map +1 -0
- package/dist/lib/routes/BaseWebhookRoute.js +173 -0
- package/dist/lib/routes/BaseWebhookRoute.js.map +1 -0
- package/dist/lib/routes/BaseWorkspaceRecordRoute.js +220 -0
- package/dist/lib/routes/BaseWorkspaceRecordRoute.js.map +1 -0
- package/dist/lib/routes/BaseWorkspaceRoute.js +540 -0
- package/dist/lib/routes/BaseWorkspaceRoute.js.map +1 -0
- package/dist/lib/routes/CrmRouteBase.js +261 -0
- package/dist/lib/routes/CrmRouteBase.js.map +1 -0
- package/dist/lib/routes/mongo/AnalyticsRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/AnalyticsRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/ApiKeyRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/ApiKeyRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/AutomationRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/AutomationRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/CampaignRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/CampaignRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/CompanyRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/CompanyRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/ContactRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/ContactRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/CrmAdminRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/CrmAdminRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/DealRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/DealRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/FormRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/FormRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/ImportRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/ImportRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/IntegrationRouteMongo.js +28 -0
- package/dist/lib/routes/mongo/IntegrationRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/ListRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/ListRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/NoteRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/NoteRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/PipelineRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/PipelineRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/PropertyDefinitionRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/PropertyDefinitionRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/PublicRouteMongo.js +28 -0
- package/dist/lib/routes/mongo/PublicRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/SavedBlockRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/SavedBlockRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/ScoringRuleRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/ScoringRuleRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/SegmentRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/SegmentRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/SubscriptionRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/SubscriptionRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/SuppressionRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/SuppressionRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/TaskRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/TaskRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/TemplateRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/TemplateRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/TimelineRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/TimelineRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/TrackingRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/TrackingRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/WebhookRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/WebhookRouteMongo.js.map +1 -0
- package/dist/lib/routes/mongo/WorkspaceRouteMongo.js +26 -0
- package/dist/lib/routes/mongo/WorkspaceRouteMongo.js.map +1 -0
- package/dist/lib/routes/sql/AnalyticsRouteSQL.js +26 -0
- package/dist/lib/routes/sql/AnalyticsRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/ApiKeyRouteSQL.js +26 -0
- package/dist/lib/routes/sql/ApiKeyRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/AutomationRouteSQL.js +26 -0
- package/dist/lib/routes/sql/AutomationRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/CampaignRouteSQL.js +26 -0
- package/dist/lib/routes/sql/CampaignRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/CompanyRouteSQL.js +26 -0
- package/dist/lib/routes/sql/CompanyRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/ContactRouteSQL.js +26 -0
- package/dist/lib/routes/sql/ContactRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/CrmAdminRouteSQL.js +26 -0
- package/dist/lib/routes/sql/CrmAdminRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/DealRouteSQL.js +26 -0
- package/dist/lib/routes/sql/DealRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/FormRouteSQL.js +26 -0
- package/dist/lib/routes/sql/FormRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/ImportRouteSQL.js +26 -0
- package/dist/lib/routes/sql/ImportRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/IntegrationRouteSQL.js +28 -0
- package/dist/lib/routes/sql/IntegrationRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/ListRouteSQL.js +26 -0
- package/dist/lib/routes/sql/ListRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/NoteRouteSQL.js +26 -0
- package/dist/lib/routes/sql/NoteRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/PipelineRouteSQL.js +26 -0
- package/dist/lib/routes/sql/PipelineRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/PropertyDefinitionRouteSQL.js +26 -0
- package/dist/lib/routes/sql/PropertyDefinitionRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/PublicRouteSQL.js +28 -0
- package/dist/lib/routes/sql/PublicRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/SavedBlockRouteSQL.js +26 -0
- package/dist/lib/routes/sql/SavedBlockRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/ScoringRuleRouteSQL.js +26 -0
- package/dist/lib/routes/sql/ScoringRuleRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/SegmentRouteSQL.js +26 -0
- package/dist/lib/routes/sql/SegmentRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/SubscriptionRouteSQL.js +26 -0
- package/dist/lib/routes/sql/SubscriptionRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/SuppressionRouteSQL.js +26 -0
- package/dist/lib/routes/sql/SuppressionRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/TaskRouteSQL.js +26 -0
- package/dist/lib/routes/sql/TaskRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/TemplateRouteSQL.js +26 -0
- package/dist/lib/routes/sql/TemplateRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/TimelineRouteSQL.js +26 -0
- package/dist/lib/routes/sql/TimelineRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/TrackingRouteSQL.js +26 -0
- package/dist/lib/routes/sql/TrackingRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/WebhookRouteSQL.js +26 -0
- package/dist/lib/routes/sql/WebhookRouteSQL.js.map +1 -0
- package/dist/lib/routes/sql/WorkspaceRouteSQL.js +26 -0
- package/dist/lib/routes/sql/WorkspaceRouteSQL.js.map +1 -0
- package/dist/lib/scoring/Scoring.js +105 -0
- package/dist/lib/scoring/Scoring.js.map +1 -0
- package/dist/lib/segments/Segments.js +125 -0
- package/dist/lib/segments/Segments.js.map +1 -0
- package/dist/lib/sending/Audience.js +87 -0
- package/dist/lib/sending/Audience.js.map +1 -0
- package/dist/lib/sending/CampaignRenderer.js +123 -0
- package/dist/lib/sending/CampaignRenderer.js.map +1 -0
- package/dist/lib/sending/Engagement.js +216 -0
- package/dist/lib/sending/Engagement.js.map +1 -0
- package/dist/lib/sending/Stats.js +70 -0
- package/dist/lib/sending/Stats.js.map +1 -0
- package/dist/lib/sending/Tracking.js +98 -0
- package/dist/lib/sending/Tracking.js.map +1 -0
- package/dist/lib/sql.js +80 -0
- package/dist/lib/sql.js.map +1 -0
- package/dist/lib/templates/Design.js +278 -0
- package/dist/lib/templates/Design.js.map +1 -0
- package/dist/lib/templates/MergeContext.js +57 -0
- package/dist/lib/templates/MergeContext.js.map +1 -0
- package/dist/lib/templates/Render.js +147 -0
- package/dist/lib/templates/Render.js.map +1 -0
- package/dist/lib/templates/Sanitize.js +98 -0
- package/dist/lib/templates/Sanitize.js.map +1 -0
- package/dist/lib/util/Csv.js +128 -0
- package/dist/lib/util/Csv.js.map +1 -0
- package/dist/lib/util/ImportMapping.js +206 -0
- package/dist/lib/util/ImportMapping.js.map +1 -0
- package/dist/lib/util/Mailer.js +43 -0
- package/dist/lib/util/Mailer.js.map +1 -0
- package/dist/lib/util/PropertyValues.js +145 -0
- package/dist/lib/util/PropertyValues.js.map +1 -0
- package/dist/lib/util/Secrets.js +31 -0
- package/dist/lib/util/Secrets.js.map +1 -0
- package/dist/lib/util/Tokens.js +58 -0
- package/dist/lib/util/Tokens.js.map +1 -0
- package/dist/lib/util/Validation.js +194 -0
- package/dist/lib/util/Validation.js.map +1 -0
- package/dist/lib/util/WorkspaceAccess.js +55 -0
- package/dist/lib/util/WorkspaceAccess.js.map +1 -0
- package/dist/lib/webhooks/Deliveries.js +47 -0
- package/dist/lib/webhooks/Deliveries.js.map +1 -0
- package/dist/lib/webhooks/Webhooks.js +132 -0
- package/dist/lib/webhooks/Webhooks.js.map +1 -0
- package/dist/types/automation/Dates.d.ts +42 -0
- package/dist/types/automation/Engine.d.ts +63 -0
- package/dist/types/automation/Events.d.ts +43 -0
- package/dist/types/automation/Graph.d.ts +77 -0
- package/dist/types/filters/Filter.d.ts +83 -0
- package/dist/types/filters/fields.d.ts +9 -0
- package/dist/types/index.d.ts +81 -0
- package/dist/types/jobs/AutomationRunJob.d.ts +18 -0
- package/dist/types/jobs/AutomationTriggerJob.d.ts +23 -0
- package/dist/types/jobs/CampaignJob.d.ts +45 -0
- package/dist/types/jobs/CrmImportJob.d.ts +44 -0
- package/dist/types/jobs/CrmJobBase.d.ts +26 -0
- package/dist/types/jobs/CrmMailEventJob.d.ts +102 -0
- package/dist/types/jobs/DateTriggerJob.d.ts +21 -0
- package/dist/types/jobs/ScoringJob.d.ts +13 -0
- package/dist/types/jobs/SegmentRefreshJob.d.ts +16 -0
- package/dist/types/jobs/SendDispatchJob.d.ts +52 -0
- package/dist/types/jobs/TaskReminderJob.d.ts +12 -0
- package/dist/types/jobs/WebhookDeliveryJob.d.ts +22 -0
- package/dist/types/jobs/mongo/AutomationRunJobMongo.d.ts +7 -0
- package/dist/types/jobs/mongo/AutomationTriggerJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/CampaignJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/CrmImportJobMongo.d.ts +8 -0
- package/dist/types/jobs/mongo/CrmMailEventJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/DateTriggerJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/ScoringJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/SegmentRefreshJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/SendDispatchJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/TaskReminderJobMongo.d.ts +6 -0
- package/dist/types/jobs/mongo/WebhookDeliveryJobMongo.d.ts +6 -0
- package/dist/types/jobs/sql/AutomationRunJobSQL.d.ts +7 -0
- package/dist/types/jobs/sql/AutomationTriggerJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/CampaignJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/CrmImportJobSQL.d.ts +8 -0
- package/dist/types/jobs/sql/CrmMailEventJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/DateTriggerJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/ScoringJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/SegmentRefreshJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/SendDispatchJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/TaskReminderJobSQL.d.ts +6 -0
- package/dist/types/jobs/sql/WebhookDeliveryJobSQL.d.ts +6 -0
- package/dist/types/models/CrmModelClasses.d.ts +63 -0
- package/dist/types/models/mongo/ApiKeyMongo.d.ts +19 -0
- package/dist/types/models/mongo/AutomationMongo.d.ts +22 -0
- package/dist/types/models/mongo/AutomationVersionMongo.d.ts +16 -0
- package/dist/types/models/mongo/CampaignMongo.d.ts +34 -0
- package/dist/types/models/mongo/CrmCompanyMongo.d.ts +22 -0
- package/dist/types/models/mongo/CrmContactMongo.d.ts +26 -0
- package/dist/types/models/mongo/CrmEventMongo.d.ts +17 -0
- package/dist/types/models/mongo/CrmFormMongo.d.ts +24 -0
- package/dist/types/models/mongo/CrmImportMongo.d.ts +31 -0
- package/dist/types/models/mongo/CrmNoteMongo.d.ts +17 -0
- package/dist/types/models/mongo/CrmSettingMongo.d.ts +13 -0
- package/dist/types/models/mongo/CrmTaskMongo.d.ts +23 -0
- package/dist/types/models/mongo/DealMongo.d.ts +27 -0
- package/dist/types/models/mongo/EmailTemplateMongo.d.ts +17 -0
- package/dist/types/models/mongo/EngagementEventMongo.d.ts +20 -0
- package/dist/types/models/mongo/EnrollmentMongo.d.ts +25 -0
- package/dist/types/models/mongo/MailingListMongo.d.ts +19 -0
- package/dist/types/models/mongo/OutboundSendMongo.d.ts +41 -0
- package/dist/types/models/mongo/PipelineMongo.d.ts +15 -0
- package/dist/types/models/mongo/PropertyDefinitionMongo.d.ts +19 -0
- package/dist/types/models/mongo/PropertyValueMongo.d.ts +18 -0
- package/dist/types/models/mongo/SavedBlockMongo.d.ts +14 -0
- package/dist/types/models/mongo/ScoringRuleMongo.d.ts +20 -0
- package/dist/types/models/mongo/SegmentMongo.d.ts +20 -0
- package/dist/types/models/mongo/SubscriptionMongo.d.ts +20 -0
- package/dist/types/models/mongo/SuppressionMongo.d.ts +15 -0
- package/dist/types/models/mongo/TimelineEventMongo.d.ts +20 -0
- package/dist/types/models/mongo/WebhookDeliveryMongo.d.ts +22 -0
- package/dist/types/models/mongo/WebhookEndpointMongo.d.ts +21 -0
- package/dist/types/models/mongo/WorkspaceMemberMongo.d.ts +17 -0
- package/dist/types/models/mongo/WorkspaceMongo.d.ts +21 -0
- package/dist/types/models/mongo/WorkspaceSenderMongo.d.ts +18 -0
- package/dist/types/models/mongo/index.d.ts +3 -0
- package/dist/types/models/sql/ApiKeySQL.d.ts +19 -0
- package/dist/types/models/sql/AutomationSQL.d.ts +22 -0
- package/dist/types/models/sql/AutomationVersionSQL.d.ts +16 -0
- package/dist/types/models/sql/CampaignSQL.d.ts +34 -0
- package/dist/types/models/sql/CrmCompanySQL.d.ts +22 -0
- package/dist/types/models/sql/CrmContactSQL.d.ts +26 -0
- package/dist/types/models/sql/CrmEventSQL.d.ts +17 -0
- package/dist/types/models/sql/CrmFormSQL.d.ts +24 -0
- package/dist/types/models/sql/CrmImportSQL.d.ts +31 -0
- package/dist/types/models/sql/CrmNoteSQL.d.ts +17 -0
- package/dist/types/models/sql/CrmSettingSQL.d.ts +13 -0
- package/dist/types/models/sql/CrmTaskSQL.d.ts +23 -0
- package/dist/types/models/sql/DealSQL.d.ts +27 -0
- package/dist/types/models/sql/EmailTemplateSQL.d.ts +17 -0
- package/dist/types/models/sql/EngagementEventSQL.d.ts +20 -0
- package/dist/types/models/sql/EnrollmentSQL.d.ts +25 -0
- package/dist/types/models/sql/MailingListSQL.d.ts +19 -0
- package/dist/types/models/sql/OutboundSendSQL.d.ts +41 -0
- package/dist/types/models/sql/PipelineSQL.d.ts +15 -0
- package/dist/types/models/sql/PropertyDefinitionSQL.d.ts +19 -0
- package/dist/types/models/sql/PropertyValueSQL.d.ts +18 -0
- package/dist/types/models/sql/SavedBlockSQL.d.ts +14 -0
- package/dist/types/models/sql/ScoringRuleSQL.d.ts +20 -0
- package/dist/types/models/sql/SegmentSQL.d.ts +20 -0
- package/dist/types/models/sql/SubscriptionSQL.d.ts +20 -0
- package/dist/types/models/sql/SuppressionSQL.d.ts +15 -0
- package/dist/types/models/sql/TimelineEventSQL.d.ts +20 -0
- package/dist/types/models/sql/WebhookDeliverySQL.d.ts +22 -0
- package/dist/types/models/sql/WebhookEndpointSQL.d.ts +21 -0
- package/dist/types/models/sql/WorkspaceMemberSQL.d.ts +17 -0
- package/dist/types/models/sql/WorkspaceSQL.d.ts +21 -0
- package/dist/types/models/sql/WorkspaceSenderSQL.d.ts +18 -0
- package/dist/types/models/sql/index.d.ts +3 -0
- package/dist/types/models/types.d.ts +902 -0
- package/dist/types/mongo.d.ts +75 -0
- package/dist/types/purge.d.ts +32 -0
- package/dist/types/routes/BaseAnalyticsRoute.d.ts +87 -0
- package/dist/types/routes/BaseApiKeyRoute.d.ts +31 -0
- package/dist/types/routes/BaseAutomationRoute.d.ts +56 -0
- package/dist/types/routes/BaseCampaignRoute.d.ts +66 -0
- package/dist/types/routes/BaseCompanyRoute.d.ts +30 -0
- package/dist/types/routes/BaseContactRoute.d.ts +42 -0
- package/dist/types/routes/BaseCrmAdminRoute.d.ts +41 -0
- package/dist/types/routes/BaseDealRoute.d.ts +65 -0
- package/dist/types/routes/BaseFormRoute.d.ts +25 -0
- package/dist/types/routes/BaseImportRoute.d.ts +39 -0
- package/dist/types/routes/BaseIntegrationRoute.d.ts +46 -0
- package/dist/types/routes/BaseListRoute.d.ts +26 -0
- package/dist/types/routes/BaseNoteRoute.d.ts +15 -0
- package/dist/types/routes/BasePipelineRoute.d.ts +31 -0
- package/dist/types/routes/BasePropertyDefinitionRoute.d.ts +24 -0
- package/dist/types/routes/BasePublicRoute.d.ts +129 -0
- package/dist/types/routes/BaseSavedBlockRoute.d.ts +16 -0
- package/dist/types/routes/BaseScoringRuleRoute.d.ts +33 -0
- package/dist/types/routes/BaseSegmentRoute.d.ts +36 -0
- package/dist/types/routes/BaseSubscriptionRoute.d.ts +20 -0
- package/dist/types/routes/BaseSuppressionRoute.d.ts +17 -0
- package/dist/types/routes/BaseTaggedRecordRoute.d.ts +85 -0
- package/dist/types/routes/BaseTaskRoute.d.ts +18 -0
- package/dist/types/routes/BaseTemplateRoute.d.ts +52 -0
- package/dist/types/routes/BaseTimelineRoute.d.ts +10 -0
- package/dist/types/routes/BaseTrackingRoute.d.ts +21 -0
- package/dist/types/routes/BaseWebhookRoute.d.ts +49 -0
- package/dist/types/routes/BaseWorkspaceRecordRoute.d.ts +78 -0
- package/dist/types/routes/BaseWorkspaceRoute.d.ts +78 -0
- package/dist/types/routes/CrmRouteBase.d.ts +95 -0
- package/dist/types/routes/mongo/AnalyticsRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/ApiKeyRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/AutomationRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/CampaignRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/CompanyRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/ContactRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/CrmAdminRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/DealRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/FormRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/ImportRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/IntegrationRouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/ListRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/NoteRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/PipelineRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/PropertyDefinitionRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/PublicRouteMongo.d.ts +7 -0
- package/dist/types/routes/mongo/SavedBlockRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/ScoringRuleRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/SegmentRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/SubscriptionRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/SuppressionRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/TaskRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/TemplateRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/TimelineRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/TrackingRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/WebhookRouteMongo.d.ts +6 -0
- package/dist/types/routes/mongo/WorkspaceRouteMongo.d.ts +6 -0
- package/dist/types/routes/sql/AnalyticsRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/ApiKeyRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/AutomationRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/CampaignRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/CompanyRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/ContactRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/CrmAdminRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/DealRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/FormRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/ImportRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/IntegrationRouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/ListRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/NoteRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/PipelineRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/PropertyDefinitionRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/PublicRouteSQL.d.ts +7 -0
- package/dist/types/routes/sql/SavedBlockRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/ScoringRuleRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/SegmentRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/SubscriptionRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/SuppressionRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/TaskRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/TemplateRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/TimelineRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/TrackingRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/WebhookRouteSQL.d.ts +6 -0
- package/dist/types/routes/sql/WorkspaceRouteSQL.d.ts +6 -0
- package/dist/types/scoring/Scoring.d.ts +14 -0
- package/dist/types/segments/Segments.d.ts +46 -0
- package/dist/types/sending/Audience.d.ts +39 -0
- package/dist/types/sending/CampaignRenderer.d.ts +40 -0
- package/dist/types/sending/Engagement.d.ts +50 -0
- package/dist/types/sending/Stats.d.ts +17 -0
- package/dist/types/sending/Tracking.d.ts +39 -0
- package/dist/types/sql.d.ts +75 -0
- package/dist/types/templates/Design.d.ts +138 -0
- package/dist/types/templates/MergeContext.d.ts +27 -0
- package/dist/types/templates/Render.d.ts +46 -0
- package/dist/types/templates/Sanitize.d.ts +18 -0
- package/dist/types/util/Csv.d.ts +26 -0
- package/dist/types/util/ImportMapping.d.ts +23 -0
- package/dist/types/util/Mailer.d.ts +24 -0
- package/dist/types/util/PropertyValues.d.ts +31 -0
- package/dist/types/util/Secrets.d.ts +10 -0
- package/dist/types/util/Tokens.d.ts +30 -0
- package/dist/types/util/Validation.d.ts +59 -0
- package/dist/types/util/WorkspaceAccess.d.ts +24 -0
- package/dist/types/webhooks/Deliveries.d.ts +26 -0
- package/dist/types/webhooks/Webhooks.d.ts +43 -0
- package/package.json +226 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
2
|
+
// Copyright (C) 2026 Jean-Philippe Steinmetz. All rights reserved.
|
|
3
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
4
|
+
///////////////////////////////////////////////////////////////////////////////
|
|
5
|
+
import * as crypto from "crypto";
|
|
6
|
+
import { promises as dns } from "dns";
|
|
7
|
+
import * as https from "https";
|
|
8
|
+
import * as net from "net";
|
|
9
|
+
/** How long a webhook request may take. */
|
|
10
|
+
export const WEBHOOK_TIMEOUT_MS = 10000;
|
|
11
|
+
/** The largest body a webhook posts. */
|
|
12
|
+
export const MAX_PAYLOAD_BYTES = 256 * 1024;
|
|
13
|
+
/** A new endpoint secret. */
|
|
14
|
+
export function newWebhookSecret() {
|
|
15
|
+
return `whsec_${crypto.randomBytes(24).toString("base64url")}`;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* The signature header of a webhook body: `t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<body>">` - the timestamp is signed too, so a
|
|
19
|
+
* receiver can refuse replays.
|
|
20
|
+
*/
|
|
21
|
+
export function signWebhook(secret, body, timestamp = Math.floor(Date.now() / 1000)) {
|
|
22
|
+
return `t=${timestamp},v1=${crypto.createHmac("sha256", secret).update(`${timestamp}.${body}`).digest("hex")}`;
|
|
23
|
+
}
|
|
24
|
+
/** An IPv4 address as a 32-bit number. */
|
|
25
|
+
function ipv4Number(address) {
|
|
26
|
+
return address.split(".").reduce((value, part) => value * 256 + Number(part), 0);
|
|
27
|
+
}
|
|
28
|
+
const PRIVATE_V4 = [
|
|
29
|
+
["0.0.0.0", 8],
|
|
30
|
+
["10.0.0.0", 8],
|
|
31
|
+
["100.64.0.0", 10],
|
|
32
|
+
["127.0.0.0", 8],
|
|
33
|
+
["169.254.0.0", 16],
|
|
34
|
+
["172.16.0.0", 12],
|
|
35
|
+
["192.0.0.0", 24],
|
|
36
|
+
["192.0.2.0", 24],
|
|
37
|
+
["192.168.0.0", 16],
|
|
38
|
+
["198.18.0.0", 15],
|
|
39
|
+
["198.51.100.0", 24],
|
|
40
|
+
["203.0.113.0", 24],
|
|
41
|
+
["224.0.0.0", 4],
|
|
42
|
+
["240.0.0.0", 4],
|
|
43
|
+
];
|
|
44
|
+
/**
|
|
45
|
+
* Whether `address` (an IP) is on the public internet: not loopback, private, link-local, carrier-grade NAT, documentation,
|
|
46
|
+
* multicast or reserved - IPv4, IPv6, and IPv4 mapped into IPv6.
|
|
47
|
+
*/
|
|
48
|
+
export function isPublicAddress(address) {
|
|
49
|
+
if (net.isIPv4(address)) {
|
|
50
|
+
const value = ipv4Number(address);
|
|
51
|
+
return !PRIVATE_V4.some(([base, bits]) => Math.floor(value / 2 ** (32 - bits)) === Math.floor(ipv4Number(base) / 2 ** (32 - bits)));
|
|
52
|
+
}
|
|
53
|
+
if (!net.isIPv6(address)) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
const lower = address.toLowerCase();
|
|
57
|
+
const mapped = /^::ffff:(\d+\.\d+\.\d+\.\d+)$/.exec(lower);
|
|
58
|
+
if (mapped) {
|
|
59
|
+
return isPublicAddress(mapped[1]);
|
|
60
|
+
}
|
|
61
|
+
if (lower === "::" || lower === "::1") {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const first = parseInt(lower.split(":")[0] || "0", 16);
|
|
65
|
+
// fc00::/7 unique local, fe80::/10 link-local, ff00::/8 multicast, 2001:db8::/32 documentation.
|
|
66
|
+
return !((first & 0xfe00) === 0xfc00 || (first & 0xffc0) === 0xfe80 || (first & 0xff00) === 0xff00 || lower.startsWith("2001:db8:"));
|
|
67
|
+
}
|
|
68
|
+
/** Refuses (throws) a webhook address that isn't `https://` on a host name or public address. */
|
|
69
|
+
export function checkWebhookUrl(raw) {
|
|
70
|
+
let url;
|
|
71
|
+
try {
|
|
72
|
+
url = new URL(raw);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw new Error("The address isn't a valid URL.");
|
|
76
|
+
}
|
|
77
|
+
if (url.protocol !== "https:") {
|
|
78
|
+
throw new Error("The address must start with https://.");
|
|
79
|
+
}
|
|
80
|
+
if (url.username || url.password) {
|
|
81
|
+
throw new Error("The address can't hold a user name or password.");
|
|
82
|
+
}
|
|
83
|
+
const host = url.hostname.replace(/^\[|\]$/g, "");
|
|
84
|
+
if (net.isIP(host) && !isPublicAddress(host)) {
|
|
85
|
+
throw new Error("The address must be on the public internet.");
|
|
86
|
+
}
|
|
87
|
+
if (/^(localhost|.*\.localhost|.*\.local|.*\.internal)$/i.test(host)) {
|
|
88
|
+
throw new Error("The address must be on the public internet.");
|
|
89
|
+
}
|
|
90
|
+
return url;
|
|
91
|
+
}
|
|
92
|
+
export const defaultLookup = async (hostname) => await dns.lookup(hostname, { all: true, verbatim: true });
|
|
93
|
+
/**
|
|
94
|
+
* Posts `body` to `rawUrl`, signed with `secret`. The host is resolved first and every address it resolves to must be public; the
|
|
95
|
+
* request then goes to the first of those addresses (with the host name kept for TLS and `Host`), so a name can't be switched to an
|
|
96
|
+
* internal address between the check and the connection. Redirects aren't followed. Throws on a refused address, a network error or
|
|
97
|
+
* a timeout; answers the status otherwise (the caller decides what counts as delivered).
|
|
98
|
+
*/
|
|
99
|
+
export async function postWebhook(rawUrl, body, secret, options = {}) {
|
|
100
|
+
const { lookup = defaultLookup, timeoutMs = WEBHOOK_TIMEOUT_MS, request: send = https.request } = options;
|
|
101
|
+
const url = checkWebhookUrl(rawUrl);
|
|
102
|
+
const host = url.hostname.replace(/^\[|\]$/g, "");
|
|
103
|
+
const addresses = net.isIP(host) ? [{ address: host, family: net.isIP(host) }] : await lookup(host);
|
|
104
|
+
if (addresses.length === 0 || addresses.some((entry) => !isPublicAddress(entry.address))) {
|
|
105
|
+
throw new Error("The address resolves to a private network.");
|
|
106
|
+
}
|
|
107
|
+
const target = addresses[0];
|
|
108
|
+
return await new Promise((resolve, reject) => {
|
|
109
|
+
const request = send({
|
|
110
|
+
protocol: "https:",
|
|
111
|
+
hostname: host,
|
|
112
|
+
port: url.port || 443,
|
|
113
|
+
path: `${url.pathname}${url.search}`,
|
|
114
|
+
method: "POST",
|
|
115
|
+
headers: {
|
|
116
|
+
"content-type": "application/json",
|
|
117
|
+
"content-length": Buffer.byteLength(body),
|
|
118
|
+
"user-agent": "RapidMX-CRM-Webhooks/1",
|
|
119
|
+
"x-rapidmx-signature": signWebhook(secret, body),
|
|
120
|
+
},
|
|
121
|
+
timeout: timeoutMs,
|
|
122
|
+
lookup: (_hostname, _options, callback) => callback(null, target.address, target.family),
|
|
123
|
+
}, (response) => {
|
|
124
|
+
response.resume();
|
|
125
|
+
resolve({ status: response.statusCode ?? 0 });
|
|
126
|
+
});
|
|
127
|
+
request.on("timeout", () => request.destroy(new Error(`No answer within ${timeoutMs / 1000} seconds.`)));
|
|
128
|
+
request.on("error", reject);
|
|
129
|
+
request.end(body);
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=Webhooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Webhooks.js","sourceRoot":"","sources":["../../../src/webhooks/Webhooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** The contact's own date fields a date trigger can use, besides custom date properties (`properties.<key>`). */
|
|
2
|
+
export declare const DATE_TRIGGER_FIELDS: readonly string[];
|
|
3
|
+
/** How far before (negative) or after the date a trigger may fire, in days. */
|
|
4
|
+
export declare const MAX_DATE_OFFSET = 365;
|
|
5
|
+
/** How a date trigger repeats. */
|
|
6
|
+
export declare enum DateRepeat {
|
|
7
|
+
/** On the date's anniversary each year (birthdays, renewals, signup anniversaries). */
|
|
8
|
+
YEARLY = "yearly",
|
|
9
|
+
/** On the date itself, once. */
|
|
10
|
+
ONCE = "once"
|
|
11
|
+
}
|
|
12
|
+
/** A date trigger's settings, as checked. */
|
|
13
|
+
export interface DateTrigger {
|
|
14
|
+
/** `dateCreated`, `lastEngagedAt` or `properties.<key>` of a date property. */
|
|
15
|
+
field: string;
|
|
16
|
+
/** Days after the date (negative: before). */
|
|
17
|
+
offsetDays: number;
|
|
18
|
+
repeat: DateRepeat;
|
|
19
|
+
/** The hour of the day (in the workspace's time zone) from which contacts are put in. */
|
|
20
|
+
hour: number;
|
|
21
|
+
}
|
|
22
|
+
/** A date trigger's settings from a trigger step's config, or a 400 naming `where`. */
|
|
23
|
+
export declare function readDateTrigger(config: Record<string, unknown>, where: string): DateTrigger;
|
|
24
|
+
/** `now`'s calendar day (`YYYY-MM-DD`) and hour in `timeZone` (UTC if it isn't one). */
|
|
25
|
+
export declare function localTime(now: Date, timeZone: string): {
|
|
26
|
+
date: string;
|
|
27
|
+
hour: number;
|
|
28
|
+
};
|
|
29
|
+
/** The day `days` after (before, if negative) `date`, both `YYYY-MM-DD`. */
|
|
30
|
+
export declare function addDays(date: string, days: number): string;
|
|
31
|
+
/**
|
|
32
|
+
* Whether the day `target` is an anniversary of `date` (both `YYYY-MM-DD`): the same month and day in a later year. A 29 February
|
|
33
|
+
* comes round on 28 February in other years.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isAnniversary(date: string, target: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* The calendar day of a date value: a custom date property holds a day (kept as UTC midnight), so its UTC day; the contact's own
|
|
38
|
+
* fields are moments, so their day in the workspace's time zone.
|
|
39
|
+
*/
|
|
40
|
+
export declare function dayOf(value: Date | string, field: string, timeZone: string): string;
|
|
41
|
+
/** Whether a date value `day` (`YYYY-MM-DD`) makes a trigger fire on `today`. */
|
|
42
|
+
export declare function dateFires(trigger: Pick<DateTrigger, "offsetDays" | "repeat">, day: string, today: string): boolean;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { NotificationUtils } from "@rapidrest/service-core";
|
|
2
|
+
import type { CrmModelClasses, CrmRepos } from "../models/CrmModelClasses.js";
|
|
3
|
+
import { Automation, AutomationVersion, CrmContact, CrmEvent, Enrollment, OutboundSend } from "../models/types.js";
|
|
4
|
+
import type { BaseContactRoute } from "../routes/BaseContactRoute.js";
|
|
5
|
+
import { AutomationGraph, AutomationNode } from "./Graph.js";
|
|
6
|
+
/** How many steps one run takes an enrollment through before handing it to the next run. */
|
|
7
|
+
export declare const STEPS_PER_RUN = 25;
|
|
8
|
+
/** How many steps an enrollment may take in all: a contact going round a loop this often has gone wrong. */
|
|
9
|
+
export declare const MAX_STEPS = 1000;
|
|
10
|
+
/** How many recent steps an enrollment keeps. */
|
|
11
|
+
export declare const HISTORY_SIZE = 50;
|
|
12
|
+
/** Whether `contact` matches the contact filter `filter` (checked in memory, as `compileFilter()` would in a query). */
|
|
13
|
+
export declare function contactMatches(repos: CrmRepos, contact: CrmContact, filter: unknown): Promise<boolean>;
|
|
14
|
+
/** Whether `event` starts an automation whose trigger step is `trigger` - before the trigger's contact filter, if it has one. */
|
|
15
|
+
export declare function triggerMatches(trigger: AutomationNode, event: Pick<CrmEvent, "type" | "data">): boolean;
|
|
16
|
+
/** A graph's trigger step. */
|
|
17
|
+
export declare function triggerOf(graph: AutomationGraph): AutomationNode | undefined;
|
|
18
|
+
/** What the engine needs from its job or route. */
|
|
19
|
+
export interface EngineContext {
|
|
20
|
+
repos: CrmRepos;
|
|
21
|
+
classes: CrmModelClasses;
|
|
22
|
+
/** The backend's contact route, for changes that must run the route's own logic (tags, subscriptions, the timeline). */
|
|
23
|
+
contactRoute?: () => Promise<BaseContactRoute>;
|
|
24
|
+
notificationUtils?: NotificationUtils;
|
|
25
|
+
logger?: any;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Enrolls contacts in automations and takes them through their steps. Shared by the jobs (`AutomationTriggerJob`,
|
|
29
|
+
* `AutomationRunJob`) and the automation route (enrolling by hand).
|
|
30
|
+
*/
|
|
31
|
+
export declare class AutomationEngine {
|
|
32
|
+
private readonly context;
|
|
33
|
+
constructor(context: EngineContext);
|
|
34
|
+
private repo;
|
|
35
|
+
/**
|
|
36
|
+
* Puts `contactUid` into `automation`'s published version, at the step after its trigger - unless the automation's re-entry rule
|
|
37
|
+
* says no (`never`: they were ever in it; `after_exit`: they are in it now). Returns the enrollment, or `undefined`.
|
|
38
|
+
*/
|
|
39
|
+
enroll(automation: Automation, version: AutomationVersion, contactUid: string, outcome: string): Promise<Enrollment | undefined>;
|
|
40
|
+
/**
|
|
41
|
+
* Takes a claimed enrollment through as many steps as it can now (at most `STEPS_PER_RUN`): up to a delay or a wait, or to the end.
|
|
42
|
+
* Returns the enrollment's changes, to save with its lease released.
|
|
43
|
+
*/
|
|
44
|
+
advance(enrollment: Enrollment, automation: Automation, graph: AutomationGraph): Promise<Partial<Enrollment>>;
|
|
45
|
+
/**
|
|
46
|
+
* Resumes the enrollments of `event.contactUid` waiting for this event about this message, by their wait's `matched` way.
|
|
47
|
+
* Returns how many were resumed.
|
|
48
|
+
*/
|
|
49
|
+
resumeWaiting(event: Pick<CrmEvent, "type" | "contactUid" | "data">): Promise<number>;
|
|
50
|
+
/** Runs one step. */
|
|
51
|
+
private execute;
|
|
52
|
+
/** The message this enrollment's `send_email` step `nodeId` queued, if it did. */
|
|
53
|
+
private sendOf;
|
|
54
|
+
/** Queues the step's email for the contact - once per enrollment and step, however often the step is run again. */
|
|
55
|
+
private queueEmail;
|
|
56
|
+
private contact;
|
|
57
|
+
/** Changes the contact through the contact route, so tags, the timeline and events follow as for any change. */
|
|
58
|
+
private updateContact;
|
|
59
|
+
private finished;
|
|
60
|
+
private timeline;
|
|
61
|
+
}
|
|
62
|
+
/** Whether what a wait waits for already happened to `send`. */
|
|
63
|
+
export declare function happened(send: OutboundSend, event: string): boolean;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { CrmModelClasses, CrmRepos } from "../models/CrmModelClasses.js";
|
|
2
|
+
/** The events automations can start from or wait for. */
|
|
3
|
+
export declare enum CrmEventType {
|
|
4
|
+
CONTACT_CREATED = "contact.created",
|
|
5
|
+
CONTACT_UPDATED = "contact.updated",
|
|
6
|
+
LIST_SUBSCRIBED = "list.subscribed",
|
|
7
|
+
LIST_UNSUBSCRIBED = "list.unsubscribed",
|
|
8
|
+
FORM_SUBMITTED = "form.submitted",
|
|
9
|
+
SEGMENT_ENTERED = "segment.entered",
|
|
10
|
+
SEGMENT_LEFT = "segment.left",
|
|
11
|
+
EMAIL_SENT = "email.sent",
|
|
12
|
+
EMAIL_OPENED = "email.opened",
|
|
13
|
+
EMAIL_CLICKED = "email.clicked",
|
|
14
|
+
EMAIL_REPLIED = "email.replied",
|
|
15
|
+
EMAIL_BOUNCED = "email.bounced",
|
|
16
|
+
EMAIL_UNSUBSCRIBED = "email.unsubscribed",
|
|
17
|
+
DEAL_CREATED = "deal.created",
|
|
18
|
+
DEAL_STAGE_CHANGED = "deal.stage_changed",
|
|
19
|
+
DEAL_WON = "deal.won",
|
|
20
|
+
DEAL_LOST = "deal.lost",
|
|
21
|
+
/** Something the workspace's own systems reported through the integration API (`data.name` says what). */
|
|
22
|
+
CUSTOM = "custom",
|
|
23
|
+
/**
|
|
24
|
+
* A contact reached a date (a birthday, a renewal, their signup anniversary): never an event of its own - `DateTriggerJob` puts
|
|
25
|
+
* contacts into automations with this trigger directly.
|
|
26
|
+
*/
|
|
27
|
+
DATE_REACHED = "date.reached",
|
|
28
|
+
/** A member put the contact in (`POST /automations/:ws/:uid/enroll`, or another automation's `enroll` step). */
|
|
29
|
+
MANUAL = "manual"
|
|
30
|
+
}
|
|
31
|
+
/** One event, before it's stored. */
|
|
32
|
+
export interface CrmEventInput {
|
|
33
|
+
workspaceUid: string;
|
|
34
|
+
type: CrmEventType;
|
|
35
|
+
contactUid: string;
|
|
36
|
+
/** What the triggers and waits match on: `listUid`, `formUid`, `segmentUid`, `sendUid`, `sourceUid`, `fields`... */
|
|
37
|
+
data?: Record<string, unknown>;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Records that something happened to a contact, for automations (`AutomationTriggerJob`). Never throws: an event that can't be
|
|
41
|
+
* recorded is logged, and whatever caused it still happens.
|
|
42
|
+
*/
|
|
43
|
+
export declare function recordCrmEvent(repos: CrmRepos, classes: CrmModelClasses, event: CrmEventInput, logger?: any): Promise<void>;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { CrmEventType } from "./Events.js";
|
|
2
|
+
/** What an automation step does. */
|
|
3
|
+
export declare enum NodeType {
|
|
4
|
+
TRIGGER = "trigger",
|
|
5
|
+
DELAY = "delay",
|
|
6
|
+
WAIT = "wait",
|
|
7
|
+
CONDITION = "condition",
|
|
8
|
+
SPLIT = "split",
|
|
9
|
+
SEND_EMAIL = "send_email",
|
|
10
|
+
SET_FIELD = "set_field",
|
|
11
|
+
ADD_TAG = "add_tag",
|
|
12
|
+
REMOVE_TAG = "remove_tag",
|
|
13
|
+
SUBSCRIBE = "subscribe",
|
|
14
|
+
UNSUBSCRIBE = "unsubscribe",
|
|
15
|
+
CREATE_TASK = "create_task",
|
|
16
|
+
NOTIFY = "notify",
|
|
17
|
+
ENROLL = "enroll",
|
|
18
|
+
WEBHOOK = "webhook",
|
|
19
|
+
EXIT = "exit"
|
|
20
|
+
}
|
|
21
|
+
/** One step of an automation. `config` depends on `type` - see `NODE_SPECS`. */
|
|
22
|
+
export interface AutomationNode {
|
|
23
|
+
id: string;
|
|
24
|
+
type: NodeType;
|
|
25
|
+
config: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
/** A way from one step to the next: out of `from` by `port` (`next`, or a branch: `yes`/`no`, `a`/`b`, `matched`/`timeout`). */
|
|
28
|
+
export interface AutomationEdge {
|
|
29
|
+
from: string;
|
|
30
|
+
to: string;
|
|
31
|
+
port: string;
|
|
32
|
+
}
|
|
33
|
+
export interface AutomationGraph {
|
|
34
|
+
nodes: AutomationNode[];
|
|
35
|
+
edges: AutomationEdge[];
|
|
36
|
+
}
|
|
37
|
+
/** The events a trigger can start from. */
|
|
38
|
+
export declare const TRIGGER_EVENTS: readonly CrmEventType[];
|
|
39
|
+
/** The events a wait can wait for: something done with a message an earlier step sent. */
|
|
40
|
+
export declare const WAIT_EVENTS: readonly CrmEventType[];
|
|
41
|
+
/** The contact fields a `set_field` step may set. */
|
|
42
|
+
export declare const SETTABLE_FIELDS: readonly string[];
|
|
43
|
+
/** Units of time a delay or a wait's timeout counts in, in milliseconds. */
|
|
44
|
+
export declare const TIME_UNITS: Readonly<Record<string, number>>;
|
|
45
|
+
/** The ports out of each node type. */
|
|
46
|
+
export declare const PORTS: Readonly<Record<NodeType, readonly string[]>>;
|
|
47
|
+
/** How big a graph may get. */
|
|
48
|
+
export declare const MAX_NODES = 200;
|
|
49
|
+
/**
|
|
50
|
+
* `raw` as an automation graph, checked for shape only - node ids, types, edges between existing nodes on the ports their type has,
|
|
51
|
+
* one edge per port - so a half-built draft can be saved. `validateForPublish()` checks the rest.
|
|
52
|
+
*/
|
|
53
|
+
export declare function validateGraph(raw: unknown): AutomationGraph;
|
|
54
|
+
/** The node `port` of `nodeId` leads to, if any. */
|
|
55
|
+
export declare function nextNode(graph: AutomationGraph, nodeId: string, port?: string): string | undefined;
|
|
56
|
+
/** The references a published graph makes, for the caller to check exist in the workspace. */
|
|
57
|
+
export interface GraphReferences {
|
|
58
|
+
templates: Set<string>;
|
|
59
|
+
senders: Set<string>;
|
|
60
|
+
lists: Set<string>;
|
|
61
|
+
forms: Set<string>;
|
|
62
|
+
segments: Set<string>;
|
|
63
|
+
automations: Set<string>;
|
|
64
|
+
members: Set<string>;
|
|
65
|
+
pipelines: Set<string>;
|
|
66
|
+
webhooks: Set<string>;
|
|
67
|
+
/** Custom contact properties date triggers start from (their keys), to check are date properties. */
|
|
68
|
+
dateProperties: Set<string>;
|
|
69
|
+
/** Contact filters (triggers, conditions), to validate against the workspace's fields. */
|
|
70
|
+
filters: unknown[];
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Checks that `graph` can be published: one trigger that nothing leads back to, every step reachable from it, every step's settings
|
|
74
|
+
* complete, every wait waiting on a message an earlier step sends, and no loop that doesn't pass a delay or a wait (a contact would
|
|
75
|
+
* spin through it). Returns what the settings refer to, for the caller to check.
|
|
76
|
+
*/
|
|
77
|
+
export declare function validateForPublish(graph: AutomationGraph): GraphReferences;
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { type RepoUtils } from "@rapidrest/service-core";
|
|
2
|
+
import { CrmObjectType, PropertyDefinition, PropertyType } from "../models/types.js";
|
|
3
|
+
/**
|
|
4
|
+
* The comparisons a filter condition can make. `contains`/`notContains`/`startsWith` are case-insensitive text matches; `in`/`notIn`
|
|
5
|
+
* take a list; `between` takes `[low, high]` (inclusive); `isSet`/`isNotSet` take no value. On a multi-valued field (`tags`, a
|
|
6
|
+
* multi-select property) `eq` means "has this value", `ne` "doesn't have it", `in` "has any of these" and `notIn` "has none of them".
|
|
7
|
+
*/
|
|
8
|
+
export type FilterOp = "eq" | "ne" | "contains" | "notContains" | "startsWith" | "gt" | "gte" | "lt" | "lte" | "between" | "in" | "notIn" | "isSet" | "isNotSet";
|
|
9
|
+
/** One comparison of one field: a record field (`email`), a custom property (`properties.<key>`) or `tags`. */
|
|
10
|
+
export interface FilterCondition {
|
|
11
|
+
field: string;
|
|
12
|
+
op: FilterOp;
|
|
13
|
+
value?: unknown;
|
|
14
|
+
}
|
|
15
|
+
/** Conditions and groups combined: every one of `and`, or any one of `or`. A group has exactly one of the two. */
|
|
16
|
+
export interface FilterGroup {
|
|
17
|
+
and?: FilterNode[];
|
|
18
|
+
or?: FilterNode[];
|
|
19
|
+
}
|
|
20
|
+
export type FilterNode = FilterCondition | FilterGroup;
|
|
21
|
+
/** The value types a filterable field can hold. */
|
|
22
|
+
export type FilterValueType = "string" | "number" | "date" | "boolean";
|
|
23
|
+
/** A field a filter may name, and how. */
|
|
24
|
+
export interface FilterField {
|
|
25
|
+
type: FilterValueType;
|
|
26
|
+
/** Stored as `PropertyValue` rows (custom properties and tags) rather than on the record itself. */
|
|
27
|
+
stored: "record" | "values";
|
|
28
|
+
/** One row per value (`tags`, a multi-select property). */
|
|
29
|
+
multi?: boolean;
|
|
30
|
+
/** For a select or enum field: the values it may hold. */
|
|
31
|
+
options?: readonly string[];
|
|
32
|
+
/** The `PropertyValue.key` of a `values` field. */
|
|
33
|
+
key?: string;
|
|
34
|
+
}
|
|
35
|
+
/** How deep groups may nest, and how many conditions and groups one filter may have. */
|
|
36
|
+
export declare const MAX_FILTER_DEPTH = 5;
|
|
37
|
+
export declare const MAX_FILTER_NODES = 50;
|
|
38
|
+
/** How many values an `in`/`notIn` list may have. */
|
|
39
|
+
export declare const MAX_FILTER_LIST = 200;
|
|
40
|
+
/** How many records a condition on a custom property or tag may match before the filter is refused as too broad. */
|
|
41
|
+
export declare const MAX_VALUE_MATCHES = 20000;
|
|
42
|
+
/** The `PropertyValue` column a value of `type` is stored in. */
|
|
43
|
+
export declare function valueColumn(type: FilterValueType): "stringValue" | "numberValue" | "dateValue";
|
|
44
|
+
/** The filter value type a custom property's values are compared as. */
|
|
45
|
+
export declare function propertyValueType(type: PropertyType): FilterValueType;
|
|
46
|
+
/**
|
|
47
|
+
* Every field a filter on `objectType` records may name: the record's own `fields`, `tags`, `lists` and `segments` for contacts (the
|
|
48
|
+
* uids of the lists they are subscribed to and the segments they are in), and `properties.<key>` for each of the workspace's custom property `definitions` of that type.
|
|
49
|
+
*/
|
|
50
|
+
export declare function filterFields(fields: Readonly<Record<string, FilterField>>, definitions: readonly Pick<PropertyDefinition, "key" | "type" | "options" | "objectType">[], objectType: CrmObjectType): Record<string, FilterField>;
|
|
51
|
+
/**
|
|
52
|
+
* Checks `node` against `fields` and returns it normalized: every condition's value coerced to its field's type (dates as `Date`s,
|
|
53
|
+
* tags lowercased), and nothing but `field`/`op`/`value` and `and`/`or` kept. A malformed filter, an unknown field, a comparison
|
|
54
|
+
* the field's type doesn't allow, or one that's too big is a 400.
|
|
55
|
+
*/
|
|
56
|
+
export declare function validateFilter(node: unknown, fields: Readonly<Record<string, FilterField>>): FilterNode;
|
|
57
|
+
/** What `compileFilter()` needs to resolve conditions on custom properties and tags, and on record text it can't negate directly. */
|
|
58
|
+
export interface FilterCompileContext {
|
|
59
|
+
workspaceUid: string;
|
|
60
|
+
objectType: CrmObjectType;
|
|
61
|
+
/** The workspace's `PropertyValue`s. */
|
|
62
|
+
valueRepo: RepoUtils<any>;
|
|
63
|
+
/** The records being filtered - for `notContains` on a record's own text, which is compiled as "not one of those that contain". */
|
|
64
|
+
recordRepo: RepoUtils<any>;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Compiles a validated filter (`validateFilter()`) into a query `RepoUtils.find()`/`count()` runs on both Mongo and SQL: record fields
|
|
68
|
+
* become column comparisons combined with `$and`/`$or`. A condition on a custom property or tag is resolved first against the
|
|
69
|
+
* `PropertyValue` rows (with an index) to the uids of the records it matches, and becomes `uid in (...)`. A negated condition on
|
|
70
|
+
* one (`ne`, `notIn`, `isNotSet`) - and `notContains` on a record's own text, which SQL can't express - becomes `uid not in` the
|
|
71
|
+
* records matching its positive form, so a record with no value at all counts as "not equal".
|
|
72
|
+
*
|
|
73
|
+
* The result doesn't restrict the workspace - `workspaceQuery()` adds that.
|
|
74
|
+
*/
|
|
75
|
+
export declare function compileFilter(node: FilterNode, fields: Readonly<Record<string, FilterField>>, context: FilterCompileContext): Promise<Record<string, unknown>>;
|
|
76
|
+
/** `filter` limited to `workspaceUid`'s records: `{ workspaceUid, $and: [filter] }`, or just the workspace with no filter. */
|
|
77
|
+
export declare function workspaceQuery(workspaceUid: string, filter?: Record<string, unknown>): Record<string, unknown>;
|
|
78
|
+
/**
|
|
79
|
+
* Whether `record` (with its custom property values and tags in `values`, keyed by `PropertyValue.key`) matches a validated filter -
|
|
80
|
+
* the same answer `compileFilter()`'s query gives, for checking one record without a query (automation conditions, segment
|
|
81
|
+
* membership). Text comparisons ignore case like the query's `like()` does; `eq` on text is exact, as it is in the query.
|
|
82
|
+
*/
|
|
83
|
+
export declare function evaluateFilter(node: FilterNode, fields: Readonly<Record<string, FilterField>>, record: Record<string, unknown>, values: Readonly<Record<string, readonly unknown[]>>): boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { FilterField } from "./Filter.js";
|
|
2
|
+
/** The fields of a `CrmContact` a filter may compare (besides `tags` and custom properties - see `filterFields()`). */
|
|
3
|
+
export declare const CONTACT_FIELDS: Readonly<Record<string, FilterField>>;
|
|
4
|
+
/** The fields of a `CrmCompany` a filter may compare (besides `tags` and custom properties). */
|
|
5
|
+
export declare const COMPANY_FIELDS: Readonly<Record<string, FilterField>>;
|
|
6
|
+
/** A contact's own fields, in the order exports list them. */
|
|
7
|
+
export declare const CONTACT_EXPORT_FIELDS: readonly string[];
|
|
8
|
+
/** A company's own fields, in the order exports list them. */
|
|
9
|
+
export declare const COMPANY_EXPORT_FIELDS: readonly string[];
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A customer relationship management platform for a `@rapidmx/restapi`-based mail server: shared workspaces of contacts and
|
|
3
|
+
* companies with custom properties, tags, notes, tasks, an activity timeline, filtered search and CSV import and export; mailing
|
|
4
|
+
* lists, subscriptions with double opt-in, suppressions, signup forms and a subscriber preference center; a template designer,
|
|
5
|
+
* campaigns with tracking and A/B tests, segments, lead scoring, automations, sales pipelines, reports, webhooks and an integration
|
|
6
|
+
* API.
|
|
7
|
+
*
|
|
8
|
+
* This module exports only the backend-agnostic surface: the entity interfaces, the filter engine, the utilities and the abstract
|
|
9
|
+
* routes and jobs. The concrete Mongo/SQL classes a server loads come from this package's `./mongo` and `./sql` entry points.
|
|
10
|
+
*/
|
|
11
|
+
export * from "./models/types.js";
|
|
12
|
+
export * from "./models/CrmModelClasses.js";
|
|
13
|
+
export * from "./filters/Filter.js";
|
|
14
|
+
export * from "./filters/fields.js";
|
|
15
|
+
export * from "./util/Csv.js";
|
|
16
|
+
export * from "./util/Mailer.js";
|
|
17
|
+
export * from "./util/Tokens.js";
|
|
18
|
+
export * from "./util/Secrets.js";
|
|
19
|
+
export * from "./util/ImportMapping.js";
|
|
20
|
+
export * from "./util/PropertyValues.js";
|
|
21
|
+
export * from "./util/Validation.js";
|
|
22
|
+
export * from "./util/WorkspaceAccess.js";
|
|
23
|
+
export * from "./routes/CrmRouteBase.js";
|
|
24
|
+
export * from "./routes/BaseWorkspaceRoute.js";
|
|
25
|
+
export * from "./routes/BaseWorkspaceRecordRoute.js";
|
|
26
|
+
export * from "./routes/BaseTaggedRecordRoute.js";
|
|
27
|
+
export * from "./routes/BaseContactRoute.js";
|
|
28
|
+
export * from "./routes/BaseCompanyRoute.js";
|
|
29
|
+
export * from "./routes/BasePropertyDefinitionRoute.js";
|
|
30
|
+
export * from "./routes/BaseNoteRoute.js";
|
|
31
|
+
export * from "./routes/BaseTaskRoute.js";
|
|
32
|
+
export * from "./routes/BaseTimelineRoute.js";
|
|
33
|
+
export * from "./routes/BaseImportRoute.js";
|
|
34
|
+
export * from "./routes/BaseListRoute.js";
|
|
35
|
+
export * from "./routes/BaseSubscriptionRoute.js";
|
|
36
|
+
export * from "./routes/BaseSuppressionRoute.js";
|
|
37
|
+
export * from "./routes/BaseFormRoute.js";
|
|
38
|
+
export * from "./routes/BasePublicRoute.js";
|
|
39
|
+
export * from "./routes/BaseTemplateRoute.js";
|
|
40
|
+
export * from "./routes/BaseSavedBlockRoute.js";
|
|
41
|
+
export * from "./routes/BaseCampaignRoute.js";
|
|
42
|
+
export * from "./routes/BaseTrackingRoute.js";
|
|
43
|
+
export * from "./routes/BaseSegmentRoute.js";
|
|
44
|
+
export * from "./routes/BaseScoringRuleRoute.js";
|
|
45
|
+
export * from "./routes/BaseAutomationRoute.js";
|
|
46
|
+
export * from "./routes/BasePipelineRoute.js";
|
|
47
|
+
export * from "./routes/BaseDealRoute.js";
|
|
48
|
+
export * from "./routes/BaseAnalyticsRoute.js";
|
|
49
|
+
export * from "./routes/BaseWebhookRoute.js";
|
|
50
|
+
export * from "./routes/BaseApiKeyRoute.js";
|
|
51
|
+
export * from "./routes/BaseIntegrationRoute.js";
|
|
52
|
+
export * from "./routes/BaseCrmAdminRoute.js";
|
|
53
|
+
export * from "./automation/Events.js";
|
|
54
|
+
export * from "./automation/Graph.js";
|
|
55
|
+
export * from "./automation/Engine.js";
|
|
56
|
+
export * from "./automation/Dates.js";
|
|
57
|
+
export * from "./segments/Segments.js";
|
|
58
|
+
export * from "./scoring/Scoring.js";
|
|
59
|
+
export * from "./sending/Audience.js";
|
|
60
|
+
export * from "./sending/CampaignRenderer.js";
|
|
61
|
+
export * from "./sending/Engagement.js";
|
|
62
|
+
export * from "./sending/Stats.js";
|
|
63
|
+
export * from "./sending/Tracking.js";
|
|
64
|
+
export * from "./templates/Design.js";
|
|
65
|
+
export * from "./templates/MergeContext.js";
|
|
66
|
+
export * from "./templates/Render.js";
|
|
67
|
+
export * from "./templates/Sanitize.js";
|
|
68
|
+
export * from "./jobs/CrmImportJob.js";
|
|
69
|
+
export * from "./jobs/CrmJobBase.js";
|
|
70
|
+
export * from "./jobs/CampaignJob.js";
|
|
71
|
+
export * from "./jobs/SendDispatchJob.js";
|
|
72
|
+
export * from "./jobs/CrmMailEventJob.js";
|
|
73
|
+
export * from "./jobs/SegmentRefreshJob.js";
|
|
74
|
+
export * from "./jobs/ScoringJob.js";
|
|
75
|
+
export * from "./jobs/AutomationTriggerJob.js";
|
|
76
|
+
export * from "./jobs/AutomationRunJob.js";
|
|
77
|
+
export * from "./jobs/TaskReminderJob.js";
|
|
78
|
+
export * from "./jobs/WebhookDeliveryJob.js";
|
|
79
|
+
export * from "./jobs/DateTriggerJob.js";
|
|
80
|
+
export * from "./webhooks/Webhooks.js";
|
|
81
|
+
export * from "./webhooks/Deliveries.js";
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { CrmJobBase } from "./CrmJobBase.js";
|
|
2
|
+
/**
|
|
3
|
+
* Takes due enrollments through their automations (`AutomationEngine.advance()`): those whose delay is over, whose wait timed out,
|
|
4
|
+
* or that have steps left. One replica per enrollment: an enrollment is leased with a version-checked update, and its changes are
|
|
5
|
+
* saved with the lease released. A paused automation's enrollments wait, checked again every `paused_retry_seconds`; a deleted
|
|
6
|
+
* automation's are ended.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class AutomationRunJob extends CrmJobBase {
|
|
9
|
+
protected abstract contactRouteClass: any;
|
|
10
|
+
protected scheduleExpr: string;
|
|
11
|
+
protected batchSize: number;
|
|
12
|
+
protected leaseSeconds: number;
|
|
13
|
+
protected pausedRetrySeconds: number;
|
|
14
|
+
private contactRoute?;
|
|
15
|
+
get schedule(): string | undefined;
|
|
16
|
+
run(): Promise<void>;
|
|
17
|
+
private findOne;
|
|
18
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { AutomationEngine } from "../automation/Engine.js";
|
|
2
|
+
import { CrmJobBase } from "./CrmJobBase.js";
|
|
3
|
+
/**
|
|
4
|
+
* Hands each new `CrmEvent` to its workspace's automations, once (an event is claimed by stamping `dispatchedAt`, version-checked):
|
|
5
|
+
* - it **enrolls** the contact in every active automation whose trigger matches the event (and whose trigger filter, if any, the
|
|
6
|
+
* contact matches), as the automation's re-entry rule allows;
|
|
7
|
+
* - it **resumes** the contact's enrollments waiting for this event about this message (`AutomationEngine.resumeWaiting()`);
|
|
8
|
+
* - it **queues webhooks** for the workspace's enabled endpoints that take the event's type (`WebhookDeliveryJob` posts them).
|
|
9
|
+
*
|
|
10
|
+
* Dispatched events are deleted after `retention_days`.
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class AutomationTriggerJob extends CrmJobBase {
|
|
13
|
+
protected scheduleExpr: string;
|
|
14
|
+
protected batchSize: number;
|
|
15
|
+
protected retentionDays: number;
|
|
16
|
+
get schedule(): string | undefined;
|
|
17
|
+
/** The engine: enrolling and resuming waits change no contact, so it needs no contact route. */
|
|
18
|
+
protected engine(): AutomationEngine;
|
|
19
|
+
run(): Promise<void>;
|
|
20
|
+
private dispatch;
|
|
21
|
+
/** The workspace's active automations and their published versions. */
|
|
22
|
+
private liveAutomations;
|
|
23
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { AbMetric, CampaignCounts } from "../models/types.js";
|
|
2
|
+
import { CrmJobBase } from "./CrmJobBase.js";
|
|
3
|
+
/**
|
|
4
|
+
* Moves campaigns along, on every replica but one campaign on one replica at a time (version-checked claims with a lease):
|
|
5
|
+
* 1. **Starts** scheduled campaigns once due (`preparing`).
|
|
6
|
+
* 2. **Prepares** them: reads the audience page by page (resumable from `audienceCursor`), creating one queued `OutboundSend` per
|
|
7
|
+
* contact - unique per campaign and contact - or a held one, for an A/B test's remainder. Then `sending`, or straight to `sent`
|
|
8
|
+
* when nobody was left to send to.
|
|
9
|
+
* 3. **Decides A/B tests** once `testHours` have passed since starting, by the best `metric` rate among the test messages sent, and
|
|
10
|
+
* releases the held messages as the winner.
|
|
11
|
+
* 4. **Drops** the unsent messages of cancelled campaigns.
|
|
12
|
+
* 5. **Finishes** campaigns with nothing left to send.
|
|
13
|
+
* 6. **Counts** the stats of campaigns going out or recently finished, at most every `stats_seconds`.
|
|
14
|
+
*/
|
|
15
|
+
export declare abstract class CampaignJob extends CrmJobBase {
|
|
16
|
+
protected scheduleExpr: string;
|
|
17
|
+
protected leaseSeconds: number;
|
|
18
|
+
/** How many audience pages one run prepares per campaign, so a run stays short. */
|
|
19
|
+
protected pagesPerRun: number;
|
|
20
|
+
/** How many subscriptions one audience page reads. */
|
|
21
|
+
protected audiencePageSize: number;
|
|
22
|
+
protected statsSeconds: number;
|
|
23
|
+
get schedule(): string | undefined;
|
|
24
|
+
run(): Promise<void>;
|
|
25
|
+
private campaigns;
|
|
26
|
+
/** `campaign` with `changes`, or `undefined` when someone changed it first (a member paused or cancelled it, another replica). */
|
|
27
|
+
private save;
|
|
28
|
+
private lease;
|
|
29
|
+
private startDue;
|
|
30
|
+
private prepare;
|
|
31
|
+
/** Reads one audience page into sends. Returns the campaign as saved, or `undefined` when it was changed behind the job's back. */
|
|
32
|
+
private preparePage;
|
|
33
|
+
/** Creates a send for each contact the campaign has none for yet. Returns how many were created. */
|
|
34
|
+
private createSends;
|
|
35
|
+
private decideTests;
|
|
36
|
+
private releaseHeld;
|
|
37
|
+
private dropCancelled;
|
|
38
|
+
/** Changes up to `MOVE_BATCH` of the campaign's sends in `from`. A send a replica holds a lease on is left for later. */
|
|
39
|
+
private moveSends;
|
|
40
|
+
private finishDone;
|
|
41
|
+
private countStats;
|
|
42
|
+
private stats;
|
|
43
|
+
}
|
|
44
|
+
/** The share of a variant's sent messages its metric happened to (0 with none sent). */
|
|
45
|
+
export declare function metricRate(counts: CampaignCounts, metric: AbMetric): number;
|