@aglyn/aglyn 1.0.0-beta.143
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 +201 -0
- package/README.md +11 -0
- package/package.json +66 -0
- package/src/index.d.ts +25 -0
- package/src/index.js +26 -0
- package/src/index.js.map +1 -0
- package/src/lib/aglyn.d.ts +31 -0
- package/src/lib/aglyn.js +114 -0
- package/src/lib/aglyn.js.map +1 -0
- package/src/lib/app-utils/abuse-report.d.ts +193 -0
- package/src/lib/app-utils/abuse-report.js +321 -0
- package/src/lib/app-utils/abuse-report.js.map +1 -0
- package/src/lib/app-utils/accept-negotiation.d.ts +129 -0
- package/src/lib/app-utils/accept-negotiation.js +266 -0
- package/src/lib/app-utils/accept-negotiation.js.map +1 -0
- package/src/lib/app-utils/account-emails.d.ts +263 -0
- package/src/lib/app-utils/account-emails.js +264 -0
- package/src/lib/app-utils/account-emails.js.map +1 -0
- package/src/lib/app-utils/actions.d.ts +717 -0
- package/src/lib/app-utils/actions.js +1031 -0
- package/src/lib/app-utils/actions.js.map +1 -0
- package/src/lib/app-utils/activity-presenter.d.ts +152 -0
- package/src/lib/app-utils/activity-presenter.js +326 -0
- package/src/lib/app-utils/activity-presenter.js.map +1 -0
- package/src/lib/app-utils/advertising-tag-mounts.d.ts +133 -0
- package/src/lib/app-utils/advertising-tag-mounts.js +118 -0
- package/src/lib/app-utils/advertising-tag-mounts.js.map +1 -0
- package/src/lib/app-utils/advertising-tags.d.ts +307 -0
- package/src/lib/app-utils/advertising-tags.js +525 -0
- package/src/lib/app-utils/advertising-tags.js.map +1 -0
- package/src/lib/app-utils/agent-api-catalog.d.ts +94 -0
- package/src/lib/app-utils/agent-api-catalog.js +106 -0
- package/src/lib/app-utils/agent-api-catalog.js.map +1 -0
- package/src/lib/app-utils/agent-openapi.d.ts +103 -0
- package/src/lib/app-utils/agent-openapi.js +1128 -0
- package/src/lib/app-utils/agent-openapi.js.map +1 -0
- package/src/lib/app-utils/analytics-beacon.d.ts +154 -0
- package/src/lib/app-utils/analytics-beacon.js +152 -0
- package/src/lib/app-utils/analytics-beacon.js.map +1 -0
- package/src/lib/app-utils/analytics-environment.d.ts +133 -0
- package/src/lib/app-utils/analytics-environment.js +152 -0
- package/src/lib/app-utils/analytics-environment.js.map +1 -0
- package/src/lib/app-utils/analytics-events.d.ts +744 -0
- package/src/lib/app-utils/analytics-events.js +650 -0
- package/src/lib/app-utils/analytics-events.js.map +1 -0
- package/src/lib/app-utils/analytics-link-clicks.d.ts +102 -0
- package/src/lib/app-utils/analytics-link-clicks.js +267 -0
- package/src/lib/app-utils/analytics-link-clicks.js.map +1 -0
- package/src/lib/app-utils/analytics-path-key.d.ts +46 -0
- package/src/lib/app-utils/analytics-path-key.js +46 -0
- package/src/lib/app-utils/analytics-path-key.js.map +1 -0
- package/src/lib/app-utils/api-adapter.d.ts +47 -0
- package/src/lib/app-utils/api-adapter.js +367 -0
- package/src/lib/app-utils/api-adapter.js.map +1 -0
- package/src/lib/app-utils/api-idempotency.d.ts +169 -0
- package/src/lib/app-utils/api-idempotency.js +213 -0
- package/src/lib/app-utils/api-idempotency.js.map +1 -0
- package/src/lib/app-utils/api-plugins.d.ts +210 -0
- package/src/lib/app-utils/api-plugins.js +221 -0
- package/src/lib/app-utils/api-plugins.js.map +1 -0
- package/src/lib/app-utils/assist-credits.d.ts +482 -0
- package/src/lib/app-utils/assist-credits.js +509 -0
- package/src/lib/app-utils/assist-credits.js.map +1 -0
- package/src/lib/app-utils/attribution-attribute.d.ts +34 -0
- package/src/lib/app-utils/attribution-attribute.js +34 -0
- package/src/lib/app-utils/attribution-attribute.js.map +1 -0
- package/src/lib/app-utils/attribution-guard.d.ts +130 -0
- package/src/lib/app-utils/attribution-guard.js +410 -0
- package/src/lib/app-utils/attribution-guard.js.map +1 -0
- package/src/lib/app-utils/author-css.d.ts +123 -0
- package/src/lib/app-utils/author-css.js +275 -0
- package/src/lib/app-utils/author-css.js.map +1 -0
- package/src/lib/app-utils/author-html-markdown.d.ts +31 -0
- package/src/lib/app-utils/author-html-markdown.js +497 -0
- package/src/lib/app-utils/author-html-markdown.js.map +1 -0
- package/src/lib/app-utils/author-html.d.ts +135 -0
- package/src/lib/app-utils/author-html.js +1037 -0
- package/src/lib/app-utils/author-html.js.map +1 -0
- package/src/lib/app-utils/automation-placeholders.d.ts +72 -0
- package/src/lib/app-utils/automation-placeholders.js +207 -0
- package/src/lib/app-utils/automation-placeholders.js.map +1 -0
- package/src/lib/app-utils/bandwidth-cap.d.ts +183 -0
- package/src/lib/app-utils/bandwidth-cap.js +193 -0
- package/src/lib/app-utils/bandwidth-cap.js.map +1 -0
- package/src/lib/app-utils/binding-token-catalog.d.ts +82 -0
- package/src/lib/app-utils/binding-token-catalog.js +293 -0
- package/src/lib/app-utils/binding-token-catalog.js.map +1 -0
- package/src/lib/app-utils/binding-tokens.d.ts +157 -0
- package/src/lib/app-utils/binding-tokens.js +251 -0
- package/src/lib/app-utils/binding-tokens.js.map +1 -0
- package/src/lib/app-utils/breadcrumb-json-ld.d.ts +57 -0
- package/src/lib/app-utils/breadcrumb-json-ld.js +67 -0
- package/src/lib/app-utils/breadcrumb-json-ld.js.map +1 -0
- package/src/lib/app-utils/campaign-attribution.d.ts +117 -0
- package/src/lib/app-utils/campaign-attribution.js +162 -0
- package/src/lib/app-utils/campaign-attribution.js.map +1 -0
- package/src/lib/app-utils/campaign-forwarding.d.ts +220 -0
- package/src/lib/app-utils/campaign-forwarding.js +332 -0
- package/src/lib/app-utils/campaign-forwarding.js.map +1 -0
- package/src/lib/app-utils/campaign-membership.d.ts +109 -0
- package/src/lib/app-utils/campaign-membership.js +176 -0
- package/src/lib/app-utils/campaign-membership.js.map +1 -0
- package/src/lib/app-utils/campaign-touch.d.ts +206 -0
- package/src/lib/app-utils/campaign-touch.js +326 -0
- package/src/lib/app-utils/campaign-touch.js.map +1 -0
- package/src/lib/app-utils/child-contract-compose.d.ts +28 -0
- package/src/lib/app-utils/child-contract-compose.js +140 -0
- package/src/lib/app-utils/child-contract-compose.js.map +1 -0
- package/src/lib/app-utils/child-contract.d.ts +129 -0
- package/src/lib/app-utils/child-contract.js +153 -0
- package/src/lib/app-utils/child-contract.js.map +1 -0
- package/src/lib/app-utils/collection-delete.d.ts +113 -0
- package/src/lib/app-utils/collection-delete.js +120 -0
- package/src/lib/app-utils/collection-delete.js.map +1 -0
- package/src/lib/app-utils/collection-entries.d.ts +833 -0
- package/src/lib/app-utils/collection-entries.js +1285 -0
- package/src/lib/app-utils/collection-entries.js.map +1 -0
- package/src/lib/app-utils/collection-entry-date.d.ts +129 -0
- package/src/lib/app-utils/collection-entry-date.js +183 -0
- package/src/lib/app-utils/collection-entry-date.js.map +1 -0
- package/src/lib/app-utils/collection-kind.d.ts +55 -0
- package/src/lib/app-utils/collection-kind.js +69 -0
- package/src/lib/app-utils/collection-kind.js.map +1 -0
- package/src/lib/app-utils/collection-slug.d.ts +79 -0
- package/src/lib/app-utils/collection-slug.js +70 -0
- package/src/lib/app-utils/collection-slug.js.map +1 -0
- package/src/lib/app-utils/compose-layout-nodes.d.ts +147 -0
- package/src/lib/app-utils/compose-layout-nodes.js +261 -0
- package/src/lib/app-utils/compose-layout-nodes.js.map +1 -0
- package/src/lib/app-utils/compose-layout-props.d.ts +71 -0
- package/src/lib/app-utils/compose-layout-props.js +61 -0
- package/src/lib/app-utils/compose-layout-props.js.map +1 -0
- package/src/lib/app-utils/compose-reusable-components.d.ts +504 -0
- package/src/lib/app-utils/compose-reusable-components.js +1366 -0
- package/src/lib/app-utils/compose-reusable-components.js.map +1 -0
- package/src/lib/app-utils/compress.d.ts +35 -0
- package/src/lib/app-utils/compress.js +38 -0
- package/src/lib/app-utils/compress.js.map +1 -0
- package/src/lib/app-utils/consent-banner-ui.d.ts +226 -0
- package/src/lib/app-utils/consent-banner-ui.js +583 -0
- package/src/lib/app-utils/consent-banner-ui.js.map +1 -0
- package/src/lib/app-utils/consent-groups.d.ts +189 -0
- package/src/lib/app-utils/consent-groups.js +219 -0
- package/src/lib/app-utils/consent-groups.js.map +1 -0
- package/src/lib/app-utils/consent-preferences-dialog.d.ts +58 -0
- package/src/lib/app-utils/consent-preferences-dialog.js +106 -0
- package/src/lib/app-utils/consent-preferences-dialog.js.map +1 -0
- package/src/lib/app-utils/console-record-links.d.ts +163 -0
- package/src/lib/app-utils/console-record-links.js +178 -0
- package/src/lib/app-utils/console-record-links.js.map +1 -0
- package/src/lib/app-utils/console-routes.d.ts +658 -0
- package/src/lib/app-utils/console-routes.js +489 -0
- package/src/lib/app-utils/console-routes.js.map +1 -0
- package/src/lib/app-utils/console-widget-slot-context.d.ts +46 -0
- package/src/lib/app-utils/console-widget-slot-context.js +23 -0
- package/src/lib/app-utils/console-widget-slot-context.js.map +1 -0
- package/src/lib/app-utils/contact-custom-fields.d.ts +191 -0
- package/src/lib/app-utils/contact-custom-fields.js +349 -0
- package/src/lib/app-utils/contact-custom-fields.js.map +1 -0
- package/src/lib/app-utils/contact-holder.d.ts +52 -0
- package/src/lib/app-utils/contact-holder.js +98 -0
- package/src/lib/app-utils/contact-holder.js.map +1 -0
- package/src/lib/app-utils/contact-merge.d.ts +136 -0
- package/src/lib/app-utils/contact-merge.js +379 -0
- package/src/lib/app-utils/contact-merge.js.map +1 -0
- package/src/lib/app-utils/contacts.d.ts +554 -0
- package/src/lib/app-utils/contacts.js +401 -0
- package/src/lib/app-utils/contacts.js.map +1 -0
- package/src/lib/app-utils/content-author-profile.d.ts +68 -0
- package/src/lib/app-utils/content-author-profile.js +118 -0
- package/src/lib/app-utils/content-author-profile.js.map +1 -0
- package/src/lib/app-utils/content-authors.d.ts +662 -0
- package/src/lib/app-utils/content-authors.js +771 -0
- package/src/lib/app-utils/content-authors.js.map +1 -0
- package/src/lib/app-utils/content-schema-type.d.ts +81 -0
- package/src/lib/app-utils/content-schema-type.js +87 -0
- package/src/lib/app-utils/content-schema-type.js.map +1 -0
- package/src/lib/app-utils/contexts.d.ts +35 -0
- package/src/lib/app-utils/contexts.js +35 -0
- package/src/lib/app-utils/contexts.js.map +1 -0
- package/src/lib/app-utils/create-resource-uid.d.ts +18 -0
- package/src/lib/app-utils/create-resource-uid.js +23 -0
- package/src/lib/app-utils/create-resource-uid.js.map +1 -0
- package/src/lib/app-utils/crm-booking.d.ts +75 -0
- package/src/lib/app-utils/crm-booking.js +133 -0
- package/src/lib/app-utils/crm-booking.js.map +1 -0
- package/src/lib/app-utils/crm-csv.d.ts +232 -0
- package/src/lib/app-utils/crm-csv.js +432 -0
- package/src/lib/app-utils/crm-csv.js.map +1 -0
- package/src/lib/app-utils/crm-digest.d.ts +179 -0
- package/src/lib/app-utils/crm-digest.js +271 -0
- package/src/lib/app-utils/crm-digest.js.map +1 -0
- package/src/lib/app-utils/crm-email-templates.d.ts +172 -0
- package/src/lib/app-utils/crm-email-templates.js +382 -0
- package/src/lib/app-utils/crm-email-templates.js.map +1 -0
- package/src/lib/app-utils/crm-inbound.d.ts +245 -0
- package/src/lib/app-utils/crm-inbound.js +407 -0
- package/src/lib/app-utils/crm-inbound.js.map +1 -0
- package/src/lib/app-utils/crm-kinds.d.ts +73 -0
- package/src/lib/app-utils/crm-kinds.js +92 -0
- package/src/lib/app-utils/crm-kinds.js.map +1 -0
- package/src/lib/app-utils/crm-next-activity.d.ts +107 -0
- package/src/lib/app-utils/crm-next-activity.js +140 -0
- package/src/lib/app-utils/crm-next-activity.js.map +1 -0
- package/src/lib/app-utils/crm-reports.d.ts +479 -0
- package/src/lib/app-utils/crm-reports.js +680 -0
- package/src/lib/app-utils/crm-reports.js.map +1 -0
- package/src/lib/app-utils/crm-task-reminders.d.ts +129 -0
- package/src/lib/app-utils/crm-task-reminders.js +139 -0
- package/src/lib/app-utils/crm-task-reminders.js.map +1 -0
- package/src/lib/app-utils/crm.d.ts +1546 -0
- package/src/lib/app-utils/crm.js +1814 -0
- package/src/lib/app-utils/crm.js.map +1 -0
- package/src/lib/app-utils/csp-report.d.ts +84 -0
- package/src/lib/app-utils/csp-report.js +177 -0
- package/src/lib/app-utils/csp-report.js.map +1 -0
- package/src/lib/app-utils/csv-import.d.ts +192 -0
- package/src/lib/app-utils/csv-import.js +279 -0
- package/src/lib/app-utils/csv-import.js.map +1 -0
- package/src/lib/app-utils/dataset-csv.d.ts +109 -0
- package/src/lib/app-utils/dataset-csv.js +235 -0
- package/src/lib/app-utils/dataset-csv.js.map +1 -0
- package/src/lib/app-utils/dataset-models.d.ts +194 -0
- package/src/lib/app-utils/dataset-models.js +409 -0
- package/src/lib/app-utils/dataset-models.js.map +1 -0
- package/src/lib/app-utils/dataset-query.d.ts +57 -0
- package/src/lib/app-utils/dataset-query.js +126 -0
- package/src/lib/app-utils/dataset-query.js.map +1 -0
- package/src/lib/app-utils/datasets.d.ts +136 -0
- package/src/lib/app-utils/datasets.js +177 -0
- package/src/lib/app-utils/datasets.js.map +1 -0
- package/src/lib/app-utils/decompress.d.ts +36 -0
- package/src/lib/app-utils/decompress.js +32 -0
- package/src/lib/app-utils/decompress.js.map +1 -0
- package/src/lib/app-utils/dedicated-sending-domain.d.ts +47 -0
- package/src/lib/app-utils/dedicated-sending-domain.js +114 -0
- package/src/lib/app-utils/dedicated-sending-domain.js.map +1 -0
- package/src/lib/app-utils/deferred-image.d.ts +86 -0
- package/src/lib/app-utils/deferred-image.js +83 -0
- package/src/lib/app-utils/deferred-image.js.map +1 -0
- package/src/lib/app-utils/definition-canvas-tree.d.ts +61 -0
- package/src/lib/app-utils/definition-canvas-tree.js +126 -0
- package/src/lib/app-utils/definition-canvas-tree.js.map +1 -0
- package/src/lib/app-utils/deployment-shape.d.ts +167 -0
- package/src/lib/app-utils/deployment-shape.js +238 -0
- package/src/lib/app-utils/deployment-shape.js.map +1 -0
- package/src/lib/app-utils/detect-template-placeholders.d.ts +30 -0
- package/src/lib/app-utils/detect-template-placeholders.js +53 -0
- package/src/lib/app-utils/detect-template-placeholders.js.map +1 -0
- package/src/lib/app-utils/dmca-counter-notice.d.ts +185 -0
- package/src/lib/app-utils/dmca-counter-notice.js +277 -0
- package/src/lib/app-utils/dmca-counter-notice.js.map +1 -0
- package/src/lib/app-utils/docs-deflection.d.ts +156 -0
- package/src/lib/app-utils/docs-deflection.js +547 -0
- package/src/lib/app-utils/docs-deflection.js.map +1 -0
- package/src/lib/app-utils/docs-help.d.ts +57 -0
- package/src/lib/app-utils/docs-help.generated.d.ts +303 -0
- package/src/lib/app-utils/docs-help.generated.js +867 -0
- package/src/lib/app-utils/docs-help.generated.js.map +1 -0
- package/src/lib/app-utils/docs-help.js +46 -0
- package/src/lib/app-utils/docs-help.js.map +1 -0
- package/src/lib/app-utils/docs-index.generated.d.ts +29 -0
- package/src/lib/app-utils/docs-index.generated.js +8388 -0
- package/src/lib/app-utils/docs-index.generated.js.map +1 -0
- package/src/lib/app-utils/docs-retrieval.d.ts +67 -0
- package/src/lib/app-utils/docs-retrieval.js +188 -0
- package/src/lib/app-utils/docs-retrieval.js.map +1 -0
- package/src/lib/app-utils/document-landmark.d.ts +50 -0
- package/src/lib/app-utils/document-landmark.js +100 -0
- package/src/lib/app-utils/document-landmark.js.map +1 -0
- package/src/lib/app-utils/duplicate-resource.d.ts +101 -0
- package/src/lib/app-utils/duplicate-resource.js +206 -0
- package/src/lib/app-utils/duplicate-resource.js.map +1 -0
- package/src/lib/app-utils/dynamic-list-rule.d.ts +471 -0
- package/src/lib/app-utils/dynamic-list-rule.js +914 -0
- package/src/lib/app-utils/dynamic-list-rule.js.map +1 -0
- package/src/lib/app-utils/element-animation.d.ts +200 -0
- package/src/lib/app-utils/element-animation.js +233 -0
- package/src/lib/app-utils/element-animation.js.map +1 -0
- package/src/lib/app-utils/element-hidden-style.d.ts +46 -0
- package/src/lib/app-utils/element-hidden-style.js +48 -0
- package/src/lib/app-utils/element-hidden-style.js.map +1 -0
- package/src/lib/app-utils/element-ui.d.ts +243 -0
- package/src/lib/app-utils/element-ui.js +459 -0
- package/src/lib/app-utils/element-ui.js.map +1 -0
- package/src/lib/app-utils/email-starter-policy.d.ts +160 -0
- package/src/lib/app-utils/email-starter-policy.js +327 -0
- package/src/lib/app-utils/email-starter-policy.js.map +1 -0
- package/src/lib/app-utils/email-topics.d.ts +310 -0
- package/src/lib/app-utils/email-topics.js +336 -0
- package/src/lib/app-utils/email-topics.js.map +1 -0
- package/src/lib/app-utils/enabled-plugins-context.d.ts +100 -0
- package/src/lib/app-utils/enabled-plugins-context.js +113 -0
- package/src/lib/app-utils/enabled-plugins-context.js.map +1 -0
- package/src/lib/app-utils/ensure-canvas-root.d.ts +38 -0
- package/src/lib/app-utils/ensure-canvas-root.js +61 -0
- package/src/lib/app-utils/ensure-canvas-root.js.map +1 -0
- package/src/lib/app-utils/entity-picker-context.d.ts +199 -0
- package/src/lib/app-utils/entity-picker-context.js +93 -0
- package/src/lib/app-utils/entity-picker-context.js.map +1 -0
- package/src/lib/app-utils/error-beacon.d.ts +107 -0
- package/src/lib/app-utils/error-beacon.js +296 -0
- package/src/lib/app-utils/error-beacon.js.map +1 -0
- package/src/lib/app-utils/expand-repeatables.d.ts +172 -0
- package/src/lib/app-utils/expand-repeatables.js +299 -0
- package/src/lib/app-utils/expand-repeatables.js.map +1 -0
- package/src/lib/app-utils/foreign-script.d.ts +82 -0
- package/src/lib/app-utils/foreign-script.js +102 -0
- package/src/lib/app-utils/foreign-script.js.map +1 -0
- package/src/lib/app-utils/form-abuse-ceiling.d.ts +146 -0
- package/src/lib/app-utils/form-abuse-ceiling.js +158 -0
- package/src/lib/app-utils/form-abuse-ceiling.js.map +1 -0
- package/src/lib/app-utils/form-contract.d.ts +198 -0
- package/src/lib/app-utils/form-contract.js +282 -0
- package/src/lib/app-utils/form-contract.js.map +1 -0
- package/src/lib/app-utils/form-dataset-binding.d.ts +50 -0
- package/src/lib/app-utils/form-dataset-binding.js +74 -0
- package/src/lib/app-utils/form-dataset-binding.js.map +1 -0
- package/src/lib/app-utils/forms.d.ts +727 -0
- package/src/lib/app-utils/forms.js +777 -0
- package/src/lib/app-utils/forms.js.map +1 -0
- package/src/lib/app-utils/functions.d.ts +188 -0
- package/src/lib/app-utils/functions.js +529 -0
- package/src/lib/app-utils/functions.js.map +1 -0
- package/src/lib/app-utils/guarded-version-save.d.ts +91 -0
- package/src/lib/app-utils/guarded-version-save.js +131 -0
- package/src/lib/app-utils/guarded-version-save.js.map +1 -0
- package/src/lib/app-utils/health-report.d.ts +1766 -0
- package/src/lib/app-utils/health-report.js +2072 -0
- package/src/lib/app-utils/health-report.js.map +1 -0
- package/src/lib/app-utils/host-naming.d.ts +135 -0
- package/src/lib/app-utils/host-naming.js +188 -0
- package/src/lib/app-utils/host-naming.js.map +1 -0
- package/src/lib/app-utils/host-permissions.d.ts +76 -0
- package/src/lib/app-utils/host-permissions.js +119 -0
- package/src/lib/app-utils/host-permissions.js.map +1 -0
- package/src/lib/app-utils/host-tokens.d.ts +228 -0
- package/src/lib/app-utils/host-tokens.js +304 -0
- package/src/lib/app-utils/host-tokens.js.map +1 -0
- package/src/lib/app-utils/idp-profile.d.ts +83 -0
- package/src/lib/app-utils/idp-profile.js +268 -0
- package/src/lib/app-utils/idp-profile.js.map +1 -0
- package/src/lib/app-utils/image-upload-types.d.ts +49 -0
- package/src/lib/app-utils/image-upload-types.js +86 -0
- package/src/lib/app-utils/image-upload-types.js.map +1 -0
- package/src/lib/app-utils/index.d.ts +18 -0
- package/src/lib/app-utils/index.js +23 -0
- package/src/lib/app-utils/index.js.map +1 -0
- package/src/lib/app-utils/internal-traffic.d.ts +197 -0
- package/src/lib/app-utils/internal-traffic.js +288 -0
- package/src/lib/app-utils/internal-traffic.js.map +1 -0
- package/src/lib/app-utils/lineal-order.d.ts +62 -0
- package/src/lib/app-utils/lineal-order.js +65 -0
- package/src/lib/app-utils/lineal-order.js.map +1 -0
- package/src/lib/app-utils/link-references.d.ts +36 -0
- package/src/lib/app-utils/link-references.js +89 -0
- package/src/lib/app-utils/link-references.js.map +1 -0
- package/src/lib/app-utils/link-target-search-context.d.ts +123 -0
- package/src/lib/app-utils/link-target-search-context.js +221 -0
- package/src/lib/app-utils/link-target-search-context.js.map +1 -0
- package/src/lib/app-utils/list-assignment-policy.d.ts +169 -0
- package/src/lib/app-utils/list-assignment-policy.js +170 -0
- package/src/lib/app-utils/list-assignment-policy.js.map +1 -0
- package/src/lib/app-utils/list-import.d.ts +158 -0
- package/src/lib/app-utils/list-import.js +332 -0
- package/src/lib/app-utils/list-import.js.map +1 -0
- package/src/lib/app-utils/llms-txt.d.ts +104 -0
- package/src/lib/app-utils/llms-txt.js +144 -0
- package/src/lib/app-utils/llms-txt.js.map +1 -0
- package/src/lib/app-utils/local-storage-budget.d.ts +75 -0
- package/src/lib/app-utils/local-storage-budget.js +153 -0
- package/src/lib/app-utils/local-storage-budget.js.map +1 -0
- package/src/lib/app-utils/lockdown.d.ts +698 -0
- package/src/lib/app-utils/lockdown.js +929 -0
- package/src/lib/app-utils/lockdown.js.map +1 -0
- package/src/lib/app-utils/margin-utilization.d.ts +267 -0
- package/src/lib/app-utils/margin-utilization.js +351 -0
- package/src/lib/app-utils/margin-utilization.js.map +1 -0
- package/src/lib/app-utils/markdown-lite.d.ts +297 -0
- package/src/lib/app-utils/markdown-lite.js +705 -0
- package/src/lib/app-utils/markdown-lite.js.map +1 -0
- package/src/lib/app-utils/marketing-consent.d.ts +704 -0
- package/src/lib/app-utils/marketing-consent.js +783 -0
- package/src/lib/app-utils/marketing-consent.js.map +1 -0
- package/src/lib/app-utils/marketplace-listing-visibility.d.ts +120 -0
- package/src/lib/app-utils/marketplace-listing-visibility.js +139 -0
- package/src/lib/app-utils/marketplace-listing-visibility.js.map +1 -0
- package/src/lib/app-utils/marketplace-overrides.d.ts +271 -0
- package/src/lib/app-utils/marketplace-overrides.js +462 -0
- package/src/lib/app-utils/marketplace-overrides.js.map +1 -0
- package/src/lib/app-utils/marketplace-provenance.d.ts +150 -0
- package/src/lib/app-utils/marketplace-provenance.js +136 -0
- package/src/lib/app-utils/marketplace-provenance.js.map +1 -0
- package/src/lib/app-utils/marketplace-theme.d.ts +237 -0
- package/src/lib/app-utils/marketplace-theme.js +525 -0
- package/src/lib/app-utils/marketplace-theme.js.map +1 -0
- package/src/lib/app-utils/marketplace-update-state.d.ts +119 -0
- package/src/lib/app-utils/marketplace-update-state.js +132 -0
- package/src/lib/app-utils/marketplace-update-state.js.map +1 -0
- package/src/lib/app-utils/marketplace-verification.d.ts +95 -0
- package/src/lib/app-utils/marketplace-verification.js +81 -0
- package/src/lib/app-utils/marketplace-verification.js.map +1 -0
- package/src/lib/app-utils/measure-node-map.d.ts +76 -0
- package/src/lib/app-utils/measure-node-map.js +111 -0
- package/src/lib/app-utils/measure-node-map.js.map +1 -0
- package/src/lib/app-utils/media-alt.d.ts +55 -0
- package/src/lib/app-utils/media-alt.js +58 -0
- package/src/lib/app-utils/media-alt.js.map +1 -0
- package/src/lib/app-utils/media-asset-facts.d.ts +125 -0
- package/src/lib/app-utils/media-asset-facts.js +467 -0
- package/src/lib/app-utils/media-asset-facts.js.map +1 -0
- package/src/lib/app-utils/media-cdn-scope.d.ts +65 -0
- package/src/lib/app-utils/media-cdn-scope.js +75 -0
- package/src/lib/app-utils/media-cdn-scope.js.map +1 -0
- package/src/lib/app-utils/media-folders.d.ts +161 -0
- package/src/lib/app-utils/media-folders.js +230 -0
- package/src/lib/app-utils/media-folders.js.map +1 -0
- package/src/lib/app-utils/media-metadata.d.ts +277 -0
- package/src/lib/app-utils/media-metadata.js +388 -0
- package/src/lib/app-utils/media-metadata.js.map +1 -0
- package/src/lib/app-utils/media-picker-context.d.ts +93 -0
- package/src/lib/app-utils/media-picker-context.js +26 -0
- package/src/lib/app-utils/media-picker-context.js.map +1 -0
- package/src/lib/app-utils/media-quarantine.d.ts +247 -0
- package/src/lib/app-utils/media-quarantine.js +323 -0
- package/src/lib/app-utils/media-quarantine.js.map +1 -0
- package/src/lib/app-utils/media-ref.d.ts +661 -0
- package/src/lib/app-utils/media-ref.js +1055 -0
- package/src/lib/app-utils/media-ref.js.map +1 -0
- package/src/lib/app-utils/media-takedown-reach.d.ts +126 -0
- package/src/lib/app-utils/media-takedown-reach.js +143 -0
- package/src/lib/app-utils/media-takedown-reach.js.map +1 -0
- package/src/lib/app-utils/member-email-aliases.d.ts +180 -0
- package/src/lib/app-utils/member-email-aliases.js +217 -0
- package/src/lib/app-utils/member-email-aliases.js.map +1 -0
- package/src/lib/app-utils/merge-node-sx.d.ts +47 -0
- package/src/lib/app-utils/merge-node-sx.js +123 -0
- package/src/lib/app-utils/merge-node-sx.js.map +1 -0
- package/src/lib/app-utils/name-match.d.ts +155 -0
- package/src/lib/app-utils/name-match.js +175 -0
- package/src/lib/app-utils/name-match.js.map +1 -0
- package/src/lib/app-utils/name-search.d.ts +117 -0
- package/src/lib/app-utils/name-search.js +145 -0
- package/src/lib/app-utils/name-search.js.map +1 -0
- package/src/lib/app-utils/node-capabilities.d.ts +85 -0
- package/src/lib/app-utils/node-capabilities.js +88 -0
- package/src/lib/app-utils/node-capabilities.js.map +1 -0
- package/src/lib/app-utils/node-definition-sanitizer.d.ts +164 -0
- package/src/lib/app-utils/node-definition-sanitizer.js +402 -0
- package/src/lib/app-utils/node-definition-sanitizer.js.map +1 -0
- package/src/lib/app-utils/node-identity.d.ts +47 -0
- package/src/lib/app-utils/node-identity.js +50 -0
- package/src/lib/app-utils/node-identity.js.map +1 -0
- package/src/lib/app-utils/node-interactions.d.ts +102 -0
- package/src/lib/app-utils/node-interactions.js +192 -0
- package/src/lib/app-utils/node-interactions.js.map +1 -0
- package/src/lib/app-utils/node-url-policy.d.ts +54 -0
- package/src/lib/app-utils/node-url-policy.js +72 -0
- package/src/lib/app-utils/node-url-policy.js.map +1 -0
- package/src/lib/app-utils/notifications.d.ts +71 -0
- package/src/lib/app-utils/notifications.js +101 -0
- package/src/lib/app-utils/notifications.js.map +1 -0
- package/src/lib/app-utils/onboarding-deep-link.d.ts +120 -0
- package/src/lib/app-utils/onboarding-deep-link.js +142 -0
- package/src/lib/app-utils/onboarding-deep-link.js.map +1 -0
- package/src/lib/app-utils/operator-identity.d.ts +207 -0
- package/src/lib/app-utils/operator-identity.js +186 -0
- package/src/lib/app-utils/operator-identity.js.map +1 -0
- package/src/lib/app-utils/org-billing-doc.d.ts +231 -0
- package/src/lib/app-utils/org-billing-doc.js +238 -0
- package/src/lib/app-utils/org-billing-doc.js.map +1 -0
- package/src/lib/app-utils/org-override-reason.d.ts +100 -0
- package/src/lib/app-utils/org-override-reason.js +116 -0
- package/src/lib/app-utils/org-override-reason.js.map +1 -0
- package/src/lib/app-utils/org-permissions.d.ts +194 -0
- package/src/lib/app-utils/org-permissions.js +357 -0
- package/src/lib/app-utils/org-permissions.js.map +1 -0
- package/src/lib/app-utils/org-roles.d.ts +72 -0
- package/src/lib/app-utils/org-roles.js +131 -0
- package/src/lib/app-utils/org-roles.js.map +1 -0
- package/src/lib/app-utils/organizations.d.ts +407 -0
- package/src/lib/app-utils/organizations.js +511 -0
- package/src/lib/app-utils/organizations.js.map +1 -0
- package/src/lib/app-utils/page-header-actions-context.d.ts +83 -0
- package/src/lib/app-utils/page-header-actions-context.js +58 -0
- package/src/lib/app-utils/page-header-actions-context.js.map +1 -0
- package/src/lib/app-utils/page-header-record-context.d.ts +80 -0
- package/src/lib/app-utils/page-header-record-context.js +64 -0
- package/src/lib/app-utils/page-header-record-context.js.map +1 -0
- package/src/lib/app-utils/page-markdown.d.ts +103 -0
- package/src/lib/app-utils/page-markdown.js +385 -0
- package/src/lib/app-utils/page-markdown.js.map +1 -0
- package/src/lib/app-utils/paid-media-source.d.ts +90 -0
- package/src/lib/app-utils/paid-media-source.js +184 -0
- package/src/lib/app-utils/paid-media-source.js.map +1 -0
- package/src/lib/app-utils/palette-sx.d.ts +34 -0
- package/src/lib/app-utils/palette-sx.js +150 -0
- package/src/lib/app-utils/palette-sx.js.map +1 -0
- package/src/lib/app-utils/password-policy.d.ts +47 -0
- package/src/lib/app-utils/password-policy.js +46 -0
- package/src/lib/app-utils/password-policy.js.map +1 -0
- package/src/lib/app-utils/payments-configured.d.ts +84 -0
- package/src/lib/app-utils/payments-configured.js +88 -0
- package/src/lib/app-utils/payments-configured.js.map +1 -0
- package/src/lib/app-utils/person-erasure.d.ts +126 -0
- package/src/lib/app-utils/person-erasure.js +121 -0
- package/src/lib/app-utils/person-erasure.js.map +1 -0
- package/src/lib/app-utils/person-key.d.ts +32 -0
- package/src/lib/app-utils/person-key.js +62 -0
- package/src/lib/app-utils/person-key.js.map +1 -0
- package/src/lib/app-utils/plan-entitlements.d.ts +2756 -0
- package/src/lib/app-utils/plan-entitlements.js +4085 -0
- package/src/lib/app-utils/plan-entitlements.js.map +1 -0
- package/src/lib/app-utils/platform-ad-conversions.d.ts +122 -0
- package/src/lib/app-utils/platform-ad-conversions.js +174 -0
- package/src/lib/app-utils/platform-ad-conversions.js.map +1 -0
- package/src/lib/app-utils/platform-advertising-tags.d.ts +139 -0
- package/src/lib/app-utils/platform-advertising-tags.js +203 -0
- package/src/lib/app-utils/platform-advertising-tags.js.map +1 -0
- package/src/lib/app-utils/platform-brand.d.ts +151 -0
- package/src/lib/app-utils/platform-brand.js +175 -0
- package/src/lib/app-utils/platform-brand.js.map +1 -0
- package/src/lib/app-utils/platform-consent-default.d.ts +142 -0
- package/src/lib/app-utils/platform-consent-default.js +295 -0
- package/src/lib/app-utils/platform-consent-default.js.map +1 -0
- package/src/lib/app-utils/platform-marketing-consent.d.ts +151 -0
- package/src/lib/app-utils/platform-marketing-consent.js +182 -0
- package/src/lib/app-utils/platform-marketing-consent.js.map +1 -0
- package/src/lib/app-utils/platform-marketing-host.d.ts +33 -0
- package/src/lib/app-utils/platform-marketing-host.js +97 -0
- package/src/lib/app-utils/platform-marketing-host.js.map +1 -0
- package/src/lib/app-utils/platform-visitor-consent.d.ts +252 -0
- package/src/lib/app-utils/platform-visitor-consent.js +533 -0
- package/src/lib/app-utils/platform-visitor-consent.js.map +1 -0
- package/src/lib/app-utils/plugin-api-cross-origin.d.ts +61 -0
- package/src/lib/app-utils/plugin-api-cross-origin.js +202 -0
- package/src/lib/app-utils/plugin-api-cross-origin.js.map +1 -0
- package/src/lib/app-utils/plugin-api-rate-limit.d.ts +192 -0
- package/src/lib/app-utils/plugin-api-rate-limit.js +270 -0
- package/src/lib/app-utils/plugin-api-rate-limit.js.map +1 -0
- package/src/lib/app-utils/plugin-artifact-path.d.ts +32 -0
- package/src/lib/app-utils/plugin-artifact-path.js +33 -0
- package/src/lib/app-utils/plugin-artifact-path.js.map +1 -0
- package/src/lib/app-utils/plugin-bundle-checks.d.ts +148 -0
- package/src/lib/app-utils/plugin-bundle-checks.js +989 -0
- package/src/lib/app-utils/plugin-bundle-checks.js.map +1 -0
- package/src/lib/app-utils/plugin-manifest.d.ts +516 -0
- package/src/lib/app-utils/plugin-manifest.js +687 -0
- package/src/lib/app-utils/plugin-manifest.js.map +1 -0
- package/src/lib/app-utils/published-legal-pages.d.ts +71 -0
- package/src/lib/app-utils/published-legal-pages.js +90 -0
- package/src/lib/app-utils/published-legal-pages.js.map +1 -0
- package/src/lib/app-utils/publisher-agreement.d.ts +254 -0
- package/src/lib/app-utils/publisher-agreement.js +274 -0
- package/src/lib/app-utils/publisher-agreement.js.map +1 -0
- package/src/lib/app-utils/publisher-attestation.d.ts +99 -0
- package/src/lib/app-utils/publisher-attestation.js +158 -0
- package/src/lib/app-utils/publisher-attestation.js.map +1 -0
- package/src/lib/app-utils/recipient-email-render.d.ts +216 -0
- package/src/lib/app-utils/recipient-email-render.js +221 -0
- package/src/lib/app-utils/recipient-email-render.js.map +1 -0
- package/src/lib/app-utils/redispatch-caught-error.d.ts +38 -0
- package/src/lib/app-utils/redispatch-caught-error.js +46 -0
- package/src/lib/app-utils/redispatch-caught-error.js.map +1 -0
- package/src/lib/app-utils/registering-plugin.d.ts +19 -0
- package/src/lib/app-utils/registering-plugin.js +38 -0
- package/src/lib/app-utils/registering-plugin.js.map +1 -0
- package/src/lib/app-utils/release-flags.d.ts +283 -0
- package/src/lib/app-utils/release-flags.js +518 -0
- package/src/lib/app-utils/release-flags.js.map +1 -0
- package/src/lib/app-utils/repair-canvas-nodes.d.ts +130 -0
- package/src/lib/app-utils/repair-canvas-nodes.js +298 -0
- package/src/lib/app-utils/repair-canvas-nodes.js.map +1 -0
- package/src/lib/app-utils/repeat-infringer.d.ts +166 -0
- package/src/lib/app-utils/repeat-infringer.js +188 -0
- package/src/lib/app-utils/repeat-infringer.js.map +1 -0
- package/src/lib/app-utils/repeat-sources.d.ts +115 -0
- package/src/lib/app-utils/repeat-sources.js +86 -0
- package/src/lib/app-utils/repeat-sources.js.map +1 -0
- package/src/lib/app-utils/request-geo.d.ts +114 -0
- package/src/lib/app-utils/request-geo.js +247 -0
- package/src/lib/app-utils/request-geo.js.map +1 -0
- package/src/lib/app-utils/request-ip.d.ts +213 -0
- package/src/lib/app-utils/request-ip.js +344 -0
- package/src/lib/app-utils/request-ip.js.map +1 -0
- package/src/lib/app-utils/resolve-named-tokens.d.ts +26 -0
- package/src/lib/app-utils/resolve-named-tokens.js +59 -0
- package/src/lib/app-utils/resolve-named-tokens.js.map +1 -0
- package/src/lib/app-utils/responsive-typography-sx.d.ts +77 -0
- package/src/lib/app-utils/responsive-typography-sx.js +122 -0
- package/src/lib/app-utils/responsive-typography-sx.js.map +1 -0
- package/src/lib/app-utils/reusable-component-keys.d.ts +135 -0
- package/src/lib/app-utils/reusable-component-keys.js +140 -0
- package/src/lib/app-utils/reusable-component-keys.js.map +1 -0
- package/src/lib/app-utils/reusable-prop-values.d.ts +199 -0
- package/src/lib/app-utils/reusable-prop-values.js +494 -0
- package/src/lib/app-utils/reusable-prop-values.js.map +1 -0
- package/src/lib/app-utils/safe-json-ld.d.ts +29 -0
- package/src/lib/app-utils/safe-json-ld.js +37 -0
- package/src/lib/app-utils/safe-json-ld.js.map +1 -0
- package/src/lib/app-utils/sanitize-svg.d.ts +55 -0
- package/src/lib/app-utils/sanitize-svg.js +460 -0
- package/src/lib/app-utils/sanitize-svg.js.map +1 -0
- package/src/lib/app-utils/scheme-sx.d.ts +84 -0
- package/src/lib/app-utils/scheme-sx.js +148 -0
- package/src/lib/app-utils/scheme-sx.js.map +1 -0
- package/src/lib/app-utils/scope-tokens.d.ts +249 -0
- package/src/lib/app-utils/scope-tokens.js +331 -0
- package/src/lib/app-utils/scope-tokens.js.map +1 -0
- package/src/lib/app-utils/screen-link-context-value.d.ts +57 -0
- package/src/lib/app-utils/screen-link-context-value.js +43 -0
- package/src/lib/app-utils/screen-link-context-value.js.map +1 -0
- package/src/lib/app-utils/screen-link-context.d.ts +185 -0
- package/src/lib/app-utils/screen-link-context.js +304 -0
- package/src/lib/app-utils/screen-link-context.js.map +1 -0
- package/src/lib/app-utils/screen-link-value.d.ts +269 -0
- package/src/lib/app-utils/screen-link-value.js +384 -0
- package/src/lib/app-utils/screen-link-value.js.map +1 -0
- package/src/lib/app-utils/screen-route.d.ts +669 -0
- package/src/lib/app-utils/screen-route.js +751 -0
- package/src/lib/app-utils/screen-route.js.map +1 -0
- package/src/lib/app-utils/screen-seo-fields.d.ts +37 -0
- package/src/lib/app-utils/screen-seo-fields.js +42 -0
- package/src/lib/app-utils/screen-seo-fields.js.map +1 -0
- package/src/lib/app-utils/search-indexing.d.ts +162 -0
- package/src/lib/app-utils/search-indexing.js +207 -0
- package/src/lib/app-utils/search-indexing.js.map +1 -0
- package/src/lib/app-utils/seo-listing-fields.d.ts +70 -0
- package/src/lib/app-utils/seo-listing-fields.js +75 -0
- package/src/lib/app-utils/seo-listing-fields.js.map +1 -0
- package/src/lib/app-utils/seo-locale.d.ts +119 -0
- package/src/lib/app-utils/seo-locale.js +133 -0
- package/src/lib/app-utils/seo-locale.js.map +1 -0
- package/src/lib/app-utils/seo-title-variables.d.ts +149 -0
- package/src/lib/app-utils/seo-title-variables.js +190 -0
- package/src/lib/app-utils/seo-title-variables.js.map +1 -0
- package/src/lib/app-utils/seo-title.d.ts +70 -0
- package/src/lib/app-utils/seo-title.js +117 -0
- package/src/lib/app-utils/seo-title.js.map +1 -0
- package/src/lib/app-utils/server.d.ts +174 -0
- package/src/lib/app-utils/server.js +314 -0
- package/src/lib/app-utils/server.js.map +1 -0
- package/src/lib/app-utils/site-context.d.ts +106 -0
- package/src/lib/app-utils/site-context.js +100 -0
- package/src/lib/app-utils/site-context.js.map +1 -0
- package/src/lib/app-utils/sitemap.d.ts +117 -0
- package/src/lib/app-utils/sitemap.js +183 -0
- package/src/lib/app-utils/sitemap.js.map +1 -0
- package/src/lib/app-utils/social-image.d.ts +112 -0
- package/src/lib/app-utils/social-image.js +191 -0
- package/src/lib/app-utils/social-image.js.map +1 -0
- package/src/lib/app-utils/starter-templates.d.ts +99 -0
- package/src/lib/app-utils/starter-templates.js +579 -0
- package/src/lib/app-utils/starter-templates.js.map +1 -0
- package/src/lib/app-utils/stored-nodes.d.ts +120 -0
- package/src/lib/app-utils/stored-nodes.js +174 -0
- package/src/lib/app-utils/stored-nodes.js.map +1 -0
- package/src/lib/app-utils/strip-undefined.d.ts +59 -0
- package/src/lib/app-utils/strip-undefined.js +95 -0
- package/src/lib/app-utils/strip-undefined.js.map +1 -0
- package/src/lib/app-utils/stripe-deployment-mode.d.ts +47 -0
- package/src/lib/app-utils/stripe-deployment-mode.js +70 -0
- package/src/lib/app-utils/stripe-deployment-mode.js.map +1 -0
- package/src/lib/app-utils/support-tiers.d.ts +108 -0
- package/src/lib/app-utils/support-tiers.js +201 -0
- package/src/lib/app-utils/support-tiers.js.map +1 -0
- package/src/lib/app-utils/timezone-geo-hint.d.ts +36 -0
- package/src/lib/app-utils/timezone-geo-hint.js +180 -0
- package/src/lib/app-utils/timezone-geo-hint.js.map +1 -0
- package/src/lib/app-utils/upload-cors.d.ts +155 -0
- package/src/lib/app-utils/upload-cors.js +254 -0
- package/src/lib/app-utils/upload-cors.js.map +1 -0
- package/src/lib/app-utils/upload-inspection.d.ts +159 -0
- package/src/lib/app-utils/upload-inspection.js +539 -0
- package/src/lib/app-utils/upload-inspection.js.map +1 -0
- package/src/lib/app-utils/url-slug.d.ts +40 -0
- package/src/lib/app-utils/url-slug.js +42 -0
- package/src/lib/app-utils/url-slug.js.map +1 -0
- package/src/lib/app-utils/usage-budget.d.ts +429 -0
- package/src/lib/app-utils/usage-budget.js +421 -0
- package/src/lib/app-utils/usage-budget.js.map +1 -0
- package/src/lib/app-utils/variables.d.ts +96 -0
- package/src/lib/app-utils/variables.js +233 -0
- package/src/lib/app-utils/variables.js.map +1 -0
- package/src/lib/app-utils/video-asset-facts.d.ts +61 -0
- package/src/lib/app-utils/video-asset-facts.js +70 -0
- package/src/lib/app-utils/video-asset-facts.js.map +1 -0
- package/src/lib/app-utils/video-object.d.ts +89 -0
- package/src/lib/app-utils/video-object.js +245 -0
- package/src/lib/app-utils/video-object.js.map +1 -0
- package/src/lib/app-utils/visitor-consent.d.ts +757 -0
- package/src/lib/app-utils/visitor-consent.js +981 -0
- package/src/lib/app-utils/visitor-consent.js.map +1 -0
- package/src/lib/app-utils/visitor-record-ceiling.d.ts +223 -0
- package/src/lib/app-utils/visitor-record-ceiling.js +215 -0
- package/src/lib/app-utils/visitor-record-ceiling.js.map +1 -0
- package/src/lib/app-utils/web-vitals-rum.d.ts +53 -0
- package/src/lib/app-utils/web-vitals-rum.js +278 -0
- package/src/lib/app-utils/web-vitals-rum.js.map +1 -0
- package/src/lib/app-utils/webhook-delivery.d.ts +324 -0
- package/src/lib/app-utils/webhook-delivery.js +413 -0
- package/src/lib/app-utils/webhook-delivery.js.map +1 -0
- package/src/lib/app-utils/where-used.d.ts +57 -0
- package/src/lib/app-utils/where-used.js +59 -0
- package/src/lib/app-utils/where-used.js.map +1 -0
- package/src/lib/app-utils/wistia-embed.d.ts +86 -0
- package/src/lib/app-utils/wistia-embed.js +119 -0
- package/src/lib/app-utils/wistia-embed.js.map +1 -0
- package/src/lib/app-utils/workflows.d.ts +136 -0
- package/src/lib/app-utils/workflows.js +346 -0
- package/src/lib/app-utils/workflows.js.map +1 -0
- package/src/lib/canvas-manager/canvas-manager-tree.d.ts +109 -0
- package/src/lib/canvas-manager/canvas-manager-tree.js +139 -0
- package/src/lib/canvas-manager/canvas-manager-tree.js.map +1 -0
- package/src/lib/canvas-manager/canvas-manager.d.ts +549 -0
- package/src/lib/canvas-manager/canvas-manager.js +1311 -0
- package/src/lib/canvas-manager/canvas-manager.js.map +1 -0
- package/src/lib/canvas-manager/index.d.ts +20 -0
- package/src/lib/canvas-manager/index.js +21 -0
- package/src/lib/canvas-manager/index.js.map +1 -0
- package/src/lib/canvas-manager/stores/index.d.ts +17 -0
- package/src/lib/canvas-manager/stores/index.js +18 -0
- package/src/lib/canvas-manager/stores/index.js.map +1 -0
- package/src/lib/canvas-manager/stores/node.store.d.ts +30 -0
- package/src/lib/canvas-manager/stores/node.store.js +45 -0
- package/src/lib/canvas-manager/stores/node.store.js.map +1 -0
- package/src/lib/components-manager/components-manager.d.ts +56 -0
- package/src/lib/components-manager/components-manager.js +191 -0
- package/src/lib/components-manager/components-manager.js.map +1 -0
- package/src/lib/components-manager/index.d.ts +18 -0
- package/src/lib/components-manager/index.js +19 -0
- package/src/lib/components-manager/index.js.map +1 -0
- package/src/lib/emit-manager/emit-manager.d.ts +56 -0
- package/src/lib/emit-manager/emit-manager.js +60 -0
- package/src/lib/emit-manager/emit-manager.js.map +1 -0
- package/src/lib/emit-manager/index.d.ts +18 -0
- package/src/lib/emit-manager/index.js +19 -0
- package/src/lib/emit-manager/index.js.map +1 -0
- package/src/lib/foundation/constants/_internal.d.ts +18 -0
- package/src/lib/foundation/constants/_internal.js +62 -0
- package/src/lib/foundation/constants/_internal.js.map +1 -0
- package/src/lib/foundation/constants/app.d.ts +23 -0
- package/src/lib/foundation/constants/app.js +25 -0
- package/src/lib/foundation/constants/app.js.map +1 -0
- package/src/lib/foundation/constants/canvas.d.ts +18 -0
- package/src/lib/foundation/constants/canvas.js +18 -0
- package/src/lib/foundation/constants/canvas.js.map +1 -0
- package/src/lib/foundation/constants/components.d.ts +54 -0
- package/src/lib/foundation/constants/components.js +61 -0
- package/src/lib/foundation/constants/components.js.map +1 -0
- package/src/lib/foundation/constants/shared.d.ts +50 -0
- package/src/lib/foundation/constants/shared.js +49 -0
- package/src/lib/foundation/constants/shared.js.map +1 -0
- package/src/lib/foundation/constants/symbol.d.ts +63 -0
- package/src/lib/foundation/constants/symbol.js +75 -0
- package/src/lib/foundation/constants/symbol.js.map +1 -0
- package/src/lib/foundation/definitions/components.types.d.ts +372 -0
- package/src/lib/foundation/definitions/components.types.js +180 -0
- package/src/lib/foundation/definitions/components.types.js.map +1 -0
- package/src/lib/foundation/definitions/contact.types.d.ts +73 -0
- package/src/lib/foundation/definitions/contact.types.js +107 -0
- package/src/lib/foundation/definitions/contact.types.js.map +1 -0
- package/src/lib/foundation/definitions/host-content-collections.d.ts +137 -0
- package/src/lib/foundation/definitions/host-content-collections.js +219 -0
- package/src/lib/foundation/definitions/host-content-collections.js.map +1 -0
- package/src/lib/foundation/definitions/org-billing.types.d.ts +1361 -0
- package/src/lib/foundation/definitions/org-billing.types.js +77 -0
- package/src/lib/foundation/definitions/org-billing.types.js.map +1 -0
- package/src/lib/foundation/definitions/organization.types.d.ts +307 -0
- package/src/lib/foundation/definitions/organization.types.js +42 -0
- package/src/lib/foundation/definitions/organization.types.js.map +1 -0
- package/src/lib/foundation/definitions/platform.types.d.ts +1326 -0
- package/src/lib/foundation/definitions/platform.types.js +124 -0
- package/src/lib/foundation/definitions/platform.types.js.map +1 -0
- package/src/lib/foundation/definitions/property-kinds.d.ts +189 -0
- package/src/lib/foundation/definitions/property-kinds.js +565 -0
- package/src/lib/foundation/definitions/property-kinds.js.map +1 -0
- package/src/lib/foundation/definitions/shared.d.ts +23 -0
- package/src/lib/foundation/definitions/shared.js +18 -0
- package/src/lib/foundation/definitions/shared.js.map +1 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.d.ts +249 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.js +499 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.js.map +1 -0
- package/src/lib/foundation/index.d.ts +32 -0
- package/src/lib/foundation/index.js +67 -0
- package/src/lib/foundation/index.js.map +1 -0
- package/src/lib/lifecycle.d.ts +24 -0
- package/src/lib/lifecycle.js +39 -0
- package/src/lib/lifecycle.js.map +1 -0
- package/src/lib/mst/common.d.ts +17 -0
- package/src/lib/mst/common.js +23 -0
- package/src/lib/mst/common.js.map +1 -0
- package/src/lib/mst/index.d.ts +19 -0
- package/src/lib/mst/index.js +20 -0
- package/src/lib/mst/index.js.map +1 -0
- package/src/lib/mst/json.d.ts +22 -0
- package/src/lib/mst/json.js +23 -0
- package/src/lib/mst/json.js.map +1 -0
- package/src/lib/mst/types.d.ts +20 -0
- package/src/lib/mst/types.js +18 -0
- package/src/lib/mst/types.js.map +1 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.d.ts +77 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.js +55 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.js.map +1 -0
- package/src/lib/plugin-manager/commerce-zone-props.d.ts +172 -0
- package/src/lib/plugin-manager/commerce-zone-props.js +31 -0
- package/src/lib/plugin-manager/commerce-zone-props.js.map +1 -0
- package/src/lib/plugin-manager/custom-fields.d.ts +60 -0
- package/src/lib/plugin-manager/custom-fields.js +39 -0
- package/src/lib/plugin-manager/custom-fields.js.map +1 -0
- package/src/lib/plugin-manager/editor-sessions.d.ts +109 -0
- package/src/lib/plugin-manager/editor-sessions.js +137 -0
- package/src/lib/plugin-manager/editor-sessions.js.map +1 -0
- package/src/lib/plugin-manager/enabled-plugins.d.ts +438 -0
- package/src/lib/plugin-manager/enabled-plugins.js +403 -0
- package/src/lib/plugin-manager/enabled-plugins.js.map +1 -0
- package/src/lib/plugin-manager/feature-plugins.d.ts +1314 -0
- package/src/lib/plugin-manager/feature-plugins.js +609 -0
- package/src/lib/plugin-manager/feature-plugins.js.map +1 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +11 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js +149 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -0
- package/src/lib/plugin-manager/index.d.ts +42 -0
- package/src/lib/plugin-manager/index.js +46 -0
- package/src/lib/plugin-manager/index.js.map +1 -0
- package/src/lib/plugin-manager/install-presets.d.ts +93 -0
- package/src/lib/plugin-manager/install-presets.js +86 -0
- package/src/lib/plugin-manager/install-presets.js.map +1 -0
- package/src/lib/plugin-manager/media-delivery-provider.d.ts +124 -0
- package/src/lib/plugin-manager/media-delivery-provider.js +53 -0
- package/src/lib/plugin-manager/media-delivery-provider.js.map +1 -0
- package/src/lib/plugin-manager/order-fulfilment.d.ts +142 -0
- package/src/lib/plugin-manager/order-fulfilment.js +104 -0
- package/src/lib/plugin-manager/order-fulfilment.js.map +1 -0
- package/src/lib/plugin-manager/plugin-activity-actions.d.ts +122 -0
- package/src/lib/plugin-manager/plugin-activity-actions.js +140 -0
- package/src/lib/plugin-manager/plugin-activity-actions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-bridge.d.ts +98 -0
- package/src/lib/plugin-manager/plugin-bridge.js +154 -0
- package/src/lib/plugin-manager/plugin-bridge.js.map +1 -0
- package/src/lib/plugin-manager/plugin-config.d.ts +148 -0
- package/src/lib/plugin-manager/plugin-config.js +228 -0
- package/src/lib/plugin-manager/plugin-config.js.map +1 -0
- package/src/lib/plugin-manager/plugin-console-crons.d.ts +139 -0
- package/src/lib/plugin-manager/plugin-console-crons.js +177 -0
- package/src/lib/plugin-manager/plugin-console-crons.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contact-capture.d.ts +220 -0
- package/src/lib/plugin-manager/plugin-contact-capture.js +89 -0
- package/src/lib/plugin-manager/plugin-contact-capture.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contributions.d.ts +244 -0
- package/src/lib/plugin-manager/plugin-contributions.js +283 -0
- package/src/lib/plugin-manager/plugin-contributions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.d.ts +169 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.js +84 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.js.map +1 -0
- package/src/lib/plugin-manager/plugin-entitlements.d.ts +181 -0
- package/src/lib/plugin-manager/plugin-entitlements.js +188 -0
- package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -0
- package/src/lib/plugin-manager/plugin-events.d.ts +145 -0
- package/src/lib/plugin-manager/plugin-events.js +79 -0
- package/src/lib/plugin-manager/plugin-events.js.map +1 -0
- package/src/lib/plugin-manager/plugin-figures.d.ts +251 -0
- package/src/lib/plugin-manager/plugin-figures.js +252 -0
- package/src/lib/plugin-manager/plugin-figures.js.map +1 -0
- package/src/lib/plugin-manager/plugin-host-collections.d.ts +146 -0
- package/src/lib/plugin-manager/plugin-host-collections.js +116 -0
- package/src/lib/plugin-manager/plugin-host-collections.js.map +1 -0
- package/src/lib/plugin-manager/plugin-jobs.d.ts +130 -0
- package/src/lib/plugin-manager/plugin-jobs.js +182 -0
- package/src/lib/plugin-manager/plugin-jobs.js.map +1 -0
- package/src/lib/plugin-manager/plugin-loader.d.ts +86 -0
- package/src/lib/plugin-manager/plugin-loader.js +223 -0
- package/src/lib/plugin-manager/plugin-loader.js.map +1 -0
- package/src/lib/plugin-manager/plugin-manager.d.ts +95 -0
- package/src/lib/plugin-manager/plugin-manager.js +343 -0
- package/src/lib/plugin-manager/plugin-manager.js.map +1 -0
- package/src/lib/plugin-manager/plugin-metered-lines.d.ts +97 -0
- package/src/lib/plugin-manager/plugin-metered-lines.js +123 -0
- package/src/lib/plugin-manager/plugin-metered-lines.js.map +1 -0
- package/src/lib/plugin-manager/plugin-org-erasure.d.ts +52 -0
- package/src/lib/plugin-manager/plugin-org-erasure.js +100 -0
- package/src/lib/plugin-manager/plugin-org-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-permissions.d.ts +69 -0
- package/src/lib/plugin-manager/plugin-permissions.js +77 -0
- package/src/lib/plugin-manager/plugin-permissions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-person-erasure.d.ts +58 -0
- package/src/lib/plugin-manager/plugin-person-erasure.js +109 -0
- package/src/lib/plugin-manager/plugin-person-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-cards.d.ts +99 -0
- package/src/lib/plugin-manager/plugin-record-cards.js +59 -0
- package/src/lib/plugin-manager/plugin-record-cards.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-facts.d.ts +111 -0
- package/src/lib/plugin-manager/plugin-record-facts.js +51 -0
- package/src/lib/plugin-manager/plugin-record-facts.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-routes.d.ts +129 -0
- package/src/lib/plugin-manager/plugin-record-routes.js +93 -0
- package/src/lib/plugin-manager/plugin-record-routes.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-timeline.d.ts +147 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js +39 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js.map +1 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.d.ts +137 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.js +51 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.js.map +1 -0
- package/src/lib/plugin-manager/plugin-services.d.ts +94 -0
- package/src/lib/plugin-manager/plugin-services.js +153 -0
- package/src/lib/plugin-manager/plugin-services.js.map +1 -0
- package/src/lib/plugin-manager/plugin-styles-ui.d.ts +71 -0
- package/src/lib/plugin-manager/plugin-styles-ui.js +80 -0
- package/src/lib/plugin-manager/plugin-styles-ui.js.map +1 -0
- package/src/lib/plugin-manager/plugin-styles.d.ts +176 -0
- package/src/lib/plugin-manager/plugin-styles.js +186 -0
- package/src/lib/plugin-manager/plugin-styles.js.map +1 -0
- package/src/lib/plugin-manager/plugin-subprocessors.d.ts +135 -0
- package/src/lib/plugin-manager/plugin-subprocessors.js +129 -0
- package/src/lib/plugin-manager/plugin-subprocessors.js.map +1 -0
- package/src/lib/plugin-manager/plugin-tax-profile.d.ts +84 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js +39 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js.map +1 -0
- package/src/lib/plugin-manager/plugin-user-erasure.d.ts +53 -0
- package/src/lib/plugin-manager/plugin-user-erasure.js +84 -0
- package/src/lib/plugin-manager/plugin-user-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-zones.d.ts +121 -0
- package/src/lib/plugin-manager/plugin-zones.js +74 -0
- package/src/lib/plugin-manager/plugin-zones.js.map +1 -0
- package/src/lib/plugin-manager/realm-plugins.d.ts +112 -0
- package/src/lib/plugin-manager/realm-plugins.js +196 -0
- package/src/lib/plugin-manager/realm-plugins.js.map +1 -0
- package/src/lib/plugin-manager/realm-server.d.ts +54 -0
- package/src/lib/plugin-manager/realm-server.js +88 -0
- package/src/lib/plugin-manager/realm-server.js.map +1 -0
- package/src/lib/plugin-manager/record-zone-props.d.ts +126 -0
- package/src/lib/plugin-manager/record-zone-props.js +31 -0
- package/src/lib/plugin-manager/record-zone-props.js.map +1 -0
- package/src/lib/plugin-manager/site-page-hooks.d.ts +102 -0
- package/src/lib/plugin-manager/site-page-hooks.js +114 -0
- package/src/lib/plugin-manager/site-page-hooks.js.map +1 -0
- package/src/lib/plugin-manager/site-runtime.d.ts +57 -0
- package/src/lib/plugin-manager/site-runtime.js +25 -0
- package/src/lib/plugin-manager/site-runtime.js.map +1 -0
- package/src/lib/plugin-manager/usage-alert-contributors.d.ts +115 -0
- package/src/lib/plugin-manager/usage-alert-contributors.js +106 -0
- package/src/lib/plugin-manager/usage-alert-contributors.js.map +1 -0
- package/src/lib/types/ast.d.ts +199 -0
- package/src/lib/types/ast.js +20 -0
- package/src/lib/types/ast.js.map +1 -0
- package/src/lib/types/index.d.ts +20 -0
- package/src/lib/types/index.js +21 -0
- package/src/lib/types/index.js.map +1 -0
- package/src/lib/types/nodes.d.ts +608 -0
- package/src/lib/types/nodes.js +28 -0
- package/src/lib/types/nodes.js.map +1 -0
- package/src/lib/types/routing.d.ts +17 -0
- package/src/lib/types/routing.js +18 -0
- package/src/lib/types/routing.js.map +1 -0
- package/src/lib/types/screen.d.ts +23 -0
- package/src/lib/types/screen.js +18 -0
- package/src/lib/types/screen.js.map +1 -0
- package/src/lib/utils.d.ts +25 -0
- package/src/lib/utils.js +42 -0
- package/src/lib/utils.js.map +1 -0
- package/src/server.d.ts +37 -0
- package/src/server.js +55 -0
- package/src/server.js.map +1 -0
|
@@ -0,0 +1,310 @@
|
|
|
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
|
+
* EMAIL TOPICS — the streams a recipient can leave one at a time.
|
|
19
|
+
*
|
|
20
|
+
* ## The gap this closes
|
|
21
|
+
*
|
|
22
|
+
* `docs/specs/email-competitive-gaps.md` §1f records the only row in that
|
|
23
|
+
* table where every competitor has something and we have nothing: "Preference
|
|
24
|
+
* center / subscription topics — unsubscribe is all-or-nothing per site".
|
|
25
|
+
* A recipient who wanted the newsletter but not the sales mail had exactly one
|
|
26
|
+
* lever, and pulling it took the newsletter too. The lever people reach for
|
|
27
|
+
* when the only unsubscribe is total is "report spam", which is a complaint,
|
|
28
|
+
* which is the sending domain's problem and therefore every tenant's.
|
|
29
|
+
*
|
|
30
|
+
* ## Scope: definitions are ORG-shared, opt-outs are PER-SITE
|
|
31
|
+
*
|
|
32
|
+
* The topic CATALOG lives at `orgs/{orgId}/emailTopics`, which is where
|
|
33
|
+
* `lists` live (AGL-254) and for the same reason: a topic is authored
|
|
34
|
+
* editorial content — a name and a sentence of description — that an agency
|
|
35
|
+
* writes once and points several sites at. Following `lists` also means the
|
|
36
|
+
* console surface that manages topics inherits a scoping question that has
|
|
37
|
+
* already been answered, rather than inventing a second answer.
|
|
38
|
+
*
|
|
39
|
+
* A recipient's OPT-OUT is per site, at `hosts/{hostId}/topicOptOuts`. It sits
|
|
40
|
+
* beside `hosts/{hostId}/suppressions`, which is per site, and it answers the
|
|
41
|
+
* same shape of question one notch finer: the suppression says "nothing from
|
|
42
|
+
* this site", the opt-out says "not this stream from this site". Two facts
|
|
43
|
+
* about one person that live at different scopes would make "may I mail this
|
|
44
|
+
* person about product updates" a question with two answers. It also keeps
|
|
45
|
+
* the unauthenticated preference page honest — the signed link names a host
|
|
46
|
+
* and nothing else, so a per-site read is exactly what the link authorizes.
|
|
47
|
+
*
|
|
48
|
+
* ## Why the defaults are code and not seeded documents
|
|
49
|
+
*
|
|
50
|
+
* Every tenant that exists today has an empty `emailTopics` collection. A
|
|
51
|
+
* seeding migration would have to run against every org, would leave any org
|
|
52
|
+
* created while it was mid-flight with none, and — like every backfill — is a
|
|
53
|
+
* thing that gets written and then not run. So {@link DEFAULT_EMAIL_TOPICS} is
|
|
54
|
+
* the floor of the catalog rather than its initial contents: it is present for
|
|
55
|
+
* every org from the moment this ships, with no write anywhere, and a stored
|
|
56
|
+
* document at the same id renames, re-describes or archives one. The catalog a
|
|
57
|
+
* reader sees is {@link mergeEmailTopics} of the two.
|
|
58
|
+
*/
|
|
59
|
+
/** One subscribable stream. */
|
|
60
|
+
export interface EmailTopic {
|
|
61
|
+
/**
|
|
62
|
+
* The stored id. Rides in the unsubscribe link's `tid` and is covered by
|
|
63
|
+
* its signature, so it is treated as persisted — rename the {@link name},
|
|
64
|
+
* never the id.
|
|
65
|
+
*/
|
|
66
|
+
id: string;
|
|
67
|
+
/** What the recipient sees on the preference page. */
|
|
68
|
+
name: string;
|
|
69
|
+
/** One sentence of "what will I get", shown under the name. */
|
|
70
|
+
description: string;
|
|
71
|
+
/**
|
|
72
|
+
* Retired. An archived topic stays in the catalog for the send path and the
|
|
73
|
+
* preference page's history, and is hidden from the composer's picker —
|
|
74
|
+
* campaigns already sent under it must go on resolving, or their unsubscribe
|
|
75
|
+
* links stop naming anything.
|
|
76
|
+
*/
|
|
77
|
+
archived?: boolean;
|
|
78
|
+
/**
|
|
79
|
+
* Whether joining this stream needs a confirmation click.
|
|
80
|
+
*
|
|
81
|
+
* `undefined` — the ordinary state — means "whatever the site says", which
|
|
82
|
+
* is what {@link topicRequiresDoubleOptIn} resolves. A stored `true` or
|
|
83
|
+
* `false` is a decision made about THIS stream and overrides the site: a
|
|
84
|
+
* merchant who confirms their newsletter and not their order-related
|
|
85
|
+
* product updates is expressing something real, and a per-site switch alone
|
|
86
|
+
* cannot hold it.
|
|
87
|
+
*/
|
|
88
|
+
doubleOptIn?: boolean;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* DOUBLE OPT-IN — per topic, defaulting per site.
|
|
92
|
+
*
|
|
93
|
+
* `docs/specs/email-competitive-gaps.md` P8. Of the ten vendors surveyed
|
|
94
|
+
* **none mandates it**, so this is an option and never a default: the field
|
|
95
|
+
* above is absent everywhere until a merchant turns it on, and the site
|
|
96
|
+
* default is off.
|
|
97
|
+
*
|
|
98
|
+
* ## Why per topic, with a per-site default
|
|
99
|
+
*
|
|
100
|
+
* Three reasons, and the first is the one that decides it.
|
|
101
|
+
*
|
|
102
|
+
* The recipient-facing vocabulary is ALREADY per topic. The signed link
|
|
103
|
+
* carries `tid`, the opt-out record is keyed by topic, and the preference
|
|
104
|
+
* page is a list of topics. A confirmation scoped to anything else would need
|
|
105
|
+
* a second vocabulary to express "confirmed for what", and the recipient
|
|
106
|
+
* would meet both.
|
|
107
|
+
*
|
|
108
|
+
* It is also the axis the compared products chose — Brevo and Klaviyo offer
|
|
109
|
+
* double opt-in per LIST — and a topic is our per-list.
|
|
110
|
+
*
|
|
111
|
+
* The site default exists because the merchant who wants this usually wants
|
|
112
|
+
* it everywhere: in the jurisdictions where a DOI is the accepted proof of
|
|
113
|
+
* consent, "on for the newsletter but not for the four others" is not the
|
|
114
|
+
* answer they are after, and asking them to set it on each topic they now
|
|
115
|
+
* have plus each one they later add is the shape that gets half-done.
|
|
116
|
+
*
|
|
117
|
+
* ## What it must have to be worth anything
|
|
118
|
+
*
|
|
119
|
+
* ActiveCampaign is the implementation worth copying because it has teeth:
|
|
120
|
+
* an unconfirmed subscriber lands in a real quarantine and "you cannot send
|
|
121
|
+
* any emails to contacts that have this status". Recording a pending
|
|
122
|
+
* confirmation that the send path then ignores is Customer.io's DIY recipe,
|
|
123
|
+
* whose own documentation warns that it "doesn't automatically check this
|
|
124
|
+
* attribute before sending messages" — a fact stored and not enforced. So the
|
|
125
|
+
* state below is read by `filterTopicSendable`, in the same pass that reads
|
|
126
|
+
* the opt-outs.
|
|
127
|
+
*
|
|
128
|
+
* ## On the law, precisely
|
|
129
|
+
*
|
|
130
|
+
* No jurisdiction verified requires double opt-in by statute. They require
|
|
131
|
+
* prior express consent plus a burden of proof on the sender — EU ePrivacy
|
|
132
|
+
* Art. 13(1), German UWG §7(2), Canada's CASL s.13. Germany's own
|
|
133
|
+
* certification body says a DOI is not required by law and then explains why
|
|
134
|
+
* everyone does it anyway: the proof has so far been recognized by the courts
|
|
135
|
+
* exclusively via a DOI. The law requires provable consent; a DOI is the
|
|
136
|
+
* accepted proof.
|
|
137
|
+
*/
|
|
138
|
+
export declare const DEFAULT_SITE_DOUBLE_OPT_IN = false;
|
|
139
|
+
/**
|
|
140
|
+
* How long a confirmation link stays good.
|
|
141
|
+
*
|
|
142
|
+
* 72 hours, Klaviyo's number rather than one of our own. Brevo's is 30 days,
|
|
143
|
+
* which is long enough that the click stops being evidence of anything
|
|
144
|
+
* contemporaneous; the point of the confirmation is to show that the person
|
|
145
|
+
* holding that mailbox wanted this, and a month-old click shows it much less
|
|
146
|
+
* well than a same-day one.
|
|
147
|
+
*
|
|
148
|
+
* Expiry stops the LINK working. It does not make an unconfirmed address
|
|
149
|
+
* mailable — see {@link readTopicSubscriptionState}, where the two are
|
|
150
|
+
* deliberately separate questions.
|
|
151
|
+
*/
|
|
152
|
+
export declare const DOUBLE_OPT_IN_EXPIRY_MS: number;
|
|
153
|
+
/**
|
|
154
|
+
* Whether joining `topic` on this site needs a confirmation click.
|
|
155
|
+
*
|
|
156
|
+
* The topic's own setting when it has one, the site's otherwise. `false`
|
|
157
|
+
* stored on a topic is a real answer and not an absence, which is what lets a
|
|
158
|
+
* merchant confirm everything except their order-related stream.
|
|
159
|
+
*/
|
|
160
|
+
export declare function topicRequiresDoubleOptIn(topic: Pick<EmailTopic, 'doubleOptIn'> | null | undefined, siteDefault?: boolean): boolean;
|
|
161
|
+
/** What one person's record says about one stream on one site. */
|
|
162
|
+
export type TopicSubscriptionState =
|
|
163
|
+
/** They may be mailed about this. */
|
|
164
|
+
'subscribed'
|
|
165
|
+
/** Asked to join and has not confirmed. NOT mailable. */
|
|
166
|
+
| 'pending'
|
|
167
|
+
/** Left this stream and has not rejoined. NOT mailable. */
|
|
168
|
+
| 'opted-out';
|
|
169
|
+
/** One entry in a `topicOptOuts` document's `topics` map, as stored. */
|
|
170
|
+
export interface TopicSubscriptionEntry {
|
|
171
|
+
optedOutAt?: unknown;
|
|
172
|
+
resubscribedAt?: unknown;
|
|
173
|
+
/** When a confirmation was asked for. */
|
|
174
|
+
pendingAt?: unknown;
|
|
175
|
+
/** When they confirmed, or absent/null while they have not. */
|
|
176
|
+
confirmedAt?: unknown;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* What an entry means, in one place, for every reader.
|
|
180
|
+
*
|
|
181
|
+
* ## Why this is a function and not a field test at each site
|
|
182
|
+
*
|
|
183
|
+
* There were two fields and one test — "an entry with no `resubscribedAt` is a
|
|
184
|
+
* live opt-out" — written out at three call sites. Adding a third and fourth
|
|
185
|
+
* field breaks that test everywhere it appears at once: a CONFIRMED entry
|
|
186
|
+
* carries `pendingAt` and `confirmedAt` and no `resubscribedAt`, so the old
|
|
187
|
+
* shorthand reads it as somebody who left. Nobody would find that by reading
|
|
188
|
+
* one call site.
|
|
189
|
+
*
|
|
190
|
+
* ## Precedence: a refusal outranks a pending confirmation
|
|
191
|
+
*
|
|
192
|
+
* Somebody who left a stream and never rejoined is opted out even if a
|
|
193
|
+
* confirmation was once asked of them, because leaving is the more recent and
|
|
194
|
+
* more explicit act — and because a pending confirmation that could outrank a
|
|
195
|
+
* refusal would be a way to re-arm sending by asking again.
|
|
196
|
+
*
|
|
197
|
+
* ## An EXPIRED confirmation is still not a subscriber
|
|
198
|
+
*
|
|
199
|
+
* Expiry stops the link working; it does not admit anybody. The alternative —
|
|
200
|
+
* treating a lapsed pending record as subscribed — would make the whole
|
|
201
|
+
* mechanism a delay rather than a gate, and waiting it out would be the way
|
|
202
|
+
* past it.
|
|
203
|
+
*/
|
|
204
|
+
export declare function readTopicSubscriptionState(entry: TopicSubscriptionEntry | null | undefined): TopicSubscriptionState;
|
|
205
|
+
/**
|
|
206
|
+
* Whether a confirmation request is too old to be acted on.
|
|
207
|
+
*
|
|
208
|
+
* A separate question from {@link readTopicSubscriptionState} on purpose: one
|
|
209
|
+
* answers "may we mail them", the other answers "does this link still work",
|
|
210
|
+
* and collapsing them is how an expiry comes to admit somebody.
|
|
211
|
+
*/
|
|
212
|
+
export declare function doubleOptInExpired(pendingAtMs: number | null | undefined, nowMs: number): boolean;
|
|
213
|
+
/** `orgs/{orgId}/emailTopics` — the catalog, org-shared like `lists`. */
|
|
214
|
+
export declare const EMAIL_TOPICS_COLLECTION = "emailTopics";
|
|
215
|
+
/** `hosts/{hostId}/topicOptOuts/{emailKey}` — one document per recipient. */
|
|
216
|
+
export declare const TOPIC_OPT_OUTS_SUBCOLLECTION = "topicOptOuts";
|
|
217
|
+
/** Sales, discounts, seasonal campaigns — and the cart a shopper left. */
|
|
218
|
+
export declare const EMAIL_TOPIC_MARKETING = "marketing";
|
|
219
|
+
/** Regular news and stories, including a site's posts to its members. */
|
|
220
|
+
export declare const EMAIL_TOPIC_NEWSLETTER = "newsletter";
|
|
221
|
+
/** New products, restocks, and changes to what a site offers. */
|
|
222
|
+
export declare const EMAIL_TOPIC_PRODUCT_UPDATES = "product-updates";
|
|
223
|
+
/** One person here writing to another about working together. */
|
|
224
|
+
export declare const EMAIL_TOPIC_SALES = "sales";
|
|
225
|
+
/**
|
|
226
|
+
* The catalog every org has before anyone opens the console.
|
|
227
|
+
*
|
|
228
|
+
* Four, not twelve. A preference page whose value is "leave one stream without
|
|
229
|
+
* leaving all of them" stops working the moment the list is long enough that
|
|
230
|
+
* reading it is a chore, and a merchant who needs a fifth can add one. The ids
|
|
231
|
+
* are the generic names an unsubscribing recipient can recognize without
|
|
232
|
+
* knowing anything about the sender's internal vocabulary.
|
|
233
|
+
*/
|
|
234
|
+
export declare const DEFAULT_EMAIL_TOPICS: readonly EmailTopic[];
|
|
235
|
+
/**
|
|
236
|
+
* The topic a campaign carries when its author picked none.
|
|
237
|
+
*
|
|
238
|
+
* Every campaign resolves to SOME topic, because a campaign with no topic
|
|
239
|
+
* would mint an unsubscribe link the preference page cannot place — it could
|
|
240
|
+
* offer the catalog but not say which entry this message was, which is the one
|
|
241
|
+
* thing the recipient came to the page knowing.
|
|
242
|
+
*/
|
|
243
|
+
export declare const DEFAULT_CAMPAIGN_TOPIC_ID = "marketing";
|
|
244
|
+
/**
|
|
245
|
+
* WHICH STREAM AN AUTOMATED EMAIL BELONGS TO — the one answer, named once.
|
|
246
|
+
*
|
|
247
|
+
* An immediate reply belongs to no stream unless the step named one; anything
|
|
248
|
+
* that goes out on the merchant's schedule belongs to the default stream, as a
|
|
249
|
+
* campaign does. See `FlowEmailScope` for why the two differ.
|
|
250
|
+
*
|
|
251
|
+
* The rule is read TWICE per send — the flow gate filters on it, and the
|
|
252
|
+
* executor signs it into the opt-out link so the preference page opens on the
|
|
253
|
+
* stream the recipient was trying to leave rather than on a list they have to
|
|
254
|
+
* search — so it lives here, in the pure leaf both sides can import, rather
|
|
255
|
+
* than beside either reader. Two spellings of it is how a link comes to name
|
|
256
|
+
* a stream the gate did not check.
|
|
257
|
+
*
|
|
258
|
+
* @returns the topic id, or `''` for a message that belongs to no stream —
|
|
259
|
+
* which is not "the default topic", and must not be signed into a
|
|
260
|
+
* link as one.
|
|
261
|
+
*/
|
|
262
|
+
export declare function flowEmailTopicId(topicId: string | null | undefined, scope?: 'scheduled' | 'immediate'): string;
|
|
263
|
+
/**
|
|
264
|
+
* Whether `value` may be a topic id.
|
|
265
|
+
*
|
|
266
|
+
* Two constraints, and the second is the load-bearing one. The id becomes a
|
|
267
|
+
* Firestore path component, so it carries `isDocumentId`'s rules; and it
|
|
268
|
+
* becomes a COLON-JOINED component of the unsubscribe link's signed subject,
|
|
269
|
+
* so a colon inside it would let one signed subject be read as two different
|
|
270
|
+
* parameter tuples. See `signatureMatches` in the email plugin's
|
|
271
|
+
* `unsubscribe-link.ts` for what that ambiguity would buy.
|
|
272
|
+
*/
|
|
273
|
+
export declare function isEmailTopicId(value: unknown): value is string;
|
|
274
|
+
/** Coerces one stored document into a topic, or `null` if it is not one. */
|
|
275
|
+
export declare function normalizeEmailTopic(id: unknown, data: Record<string, unknown> | null | undefined): EmailTopic | null;
|
|
276
|
+
/**
|
|
277
|
+
* The catalog a reader sees: the built-in floor, overlaid by whatever the org
|
|
278
|
+
* has stored, plus the org's own topics.
|
|
279
|
+
*
|
|
280
|
+
* Overlay rather than replace, so an org that adds one custom topic does not
|
|
281
|
+
* thereby delete the four every one of its recipients has been unsubscribing
|
|
282
|
+
* against. A built-in is removed by storing it `archived`, which is a
|
|
283
|
+
* decision someone made rather than a side effect of making a different one.
|
|
284
|
+
*
|
|
285
|
+
* Sorted with the built-ins first in their declared order and custom topics
|
|
286
|
+
* alphabetically after, so the preference page's checkbox order is stable
|
|
287
|
+
* across renders and across sites.
|
|
288
|
+
*/
|
|
289
|
+
export declare function mergeEmailTopics(stored: readonly EmailTopic[] | null | undefined): EmailTopic[];
|
|
290
|
+
/**
|
|
291
|
+
* The catalog minus retired topics — what a composer's picker and a
|
|
292
|
+
* preference page's checkboxes offer.
|
|
293
|
+
*
|
|
294
|
+
* The send path deliberately does NOT filter through this: a scheduled
|
|
295
|
+
* campaign whose topic was archived between scheduling and sending still
|
|
296
|
+
* belongs to that topic, and re-pointing it at something else would attribute
|
|
297
|
+
* the unsubscribes to the wrong stream.
|
|
298
|
+
*/
|
|
299
|
+
export declare function activeEmailTopics(topics: readonly EmailTopic[]): EmailTopic[];
|
|
300
|
+
/**
|
|
301
|
+
* The topic a campaign belongs to, given what it stored and what the org
|
|
302
|
+
* offers.
|
|
303
|
+
*
|
|
304
|
+
* Resolves an unknown or missing id to the default rather than to nothing: a
|
|
305
|
+
* campaign sent before topics existed carries no `topicId`, and its
|
|
306
|
+
* unsubscribe links are in inboxes right now. They must land on a preference
|
|
307
|
+
* page that names A topic, not on one that says the message came from
|
|
308
|
+
* nowhere.
|
|
309
|
+
*/
|
|
310
|
+
export declare function resolveCampaignTopic(topicId: string | null | undefined, topics: readonly EmailTopic[]): EmailTopic;
|
|
@@ -0,0 +1,336 @@
|
|
|
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
|
+
* EMAIL TOPICS — the streams a recipient can leave one at a time.
|
|
18
|
+
*
|
|
19
|
+
* ## The gap this closes
|
|
20
|
+
*
|
|
21
|
+
* `docs/specs/email-competitive-gaps.md` §1f records the only row in that
|
|
22
|
+
* table where every competitor has something and we have nothing: "Preference
|
|
23
|
+
* center / subscription topics — unsubscribe is all-or-nothing per site".
|
|
24
|
+
* A recipient who wanted the newsletter but not the sales mail had exactly one
|
|
25
|
+
* lever, and pulling it took the newsletter too. The lever people reach for
|
|
26
|
+
* when the only unsubscribe is total is "report spam", which is a complaint,
|
|
27
|
+
* which is the sending domain's problem and therefore every tenant's.
|
|
28
|
+
*
|
|
29
|
+
* ## Scope: definitions are ORG-shared, opt-outs are PER-SITE
|
|
30
|
+
*
|
|
31
|
+
* The topic CATALOG lives at `orgs/{orgId}/emailTopics`, which is where
|
|
32
|
+
* `lists` live (AGL-254) and for the same reason: a topic is authored
|
|
33
|
+
* editorial content — a name and a sentence of description — that an agency
|
|
34
|
+
* writes once and points several sites at. Following `lists` also means the
|
|
35
|
+
* console surface that manages topics inherits a scoping question that has
|
|
36
|
+
* already been answered, rather than inventing a second answer.
|
|
37
|
+
*
|
|
38
|
+
* A recipient's OPT-OUT is per site, at `hosts/{hostId}/topicOptOuts`. It sits
|
|
39
|
+
* beside `hosts/{hostId}/suppressions`, which is per site, and it answers the
|
|
40
|
+
* same shape of question one notch finer: the suppression says "nothing from
|
|
41
|
+
* this site", the opt-out says "not this stream from this site". Two facts
|
|
42
|
+
* about one person that live at different scopes would make "may I mail this
|
|
43
|
+
* person about product updates" a question with two answers. It also keeps
|
|
44
|
+
* the unauthenticated preference page honest — the signed link names a host
|
|
45
|
+
* and nothing else, so a per-site read is exactly what the link authorizes.
|
|
46
|
+
*
|
|
47
|
+
* ## Why the defaults are code and not seeded documents
|
|
48
|
+
*
|
|
49
|
+
* Every tenant that exists today has an empty `emailTopics` collection. A
|
|
50
|
+
* seeding migration would have to run against every org, would leave any org
|
|
51
|
+
* created while it was mid-flight with none, and — like every backfill — is a
|
|
52
|
+
* thing that gets written and then not run. So {@link DEFAULT_EMAIL_TOPICS} is
|
|
53
|
+
* the floor of the catalog rather than its initial contents: it is present for
|
|
54
|
+
* every org from the moment this ships, with no write anywhere, and a stored
|
|
55
|
+
* document at the same id renames, re-describes or archives one. The catalog a
|
|
56
|
+
* reader sees is {@link mergeEmailTopics} of the two.
|
|
57
|
+
*/ /** One subscribable stream. */ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
58
|
+
/**
|
|
59
|
+
* DOUBLE OPT-IN — per topic, defaulting per site.
|
|
60
|
+
*
|
|
61
|
+
* `docs/specs/email-competitive-gaps.md` P8. Of the ten vendors surveyed
|
|
62
|
+
* **none mandates it**, so this is an option and never a default: the field
|
|
63
|
+
* above is absent everywhere until a merchant turns it on, and the site
|
|
64
|
+
* default is off.
|
|
65
|
+
*
|
|
66
|
+
* ## Why per topic, with a per-site default
|
|
67
|
+
*
|
|
68
|
+
* Three reasons, and the first is the one that decides it.
|
|
69
|
+
*
|
|
70
|
+
* The recipient-facing vocabulary is ALREADY per topic. The signed link
|
|
71
|
+
* carries `tid`, the opt-out record is keyed by topic, and the preference
|
|
72
|
+
* page is a list of topics. A confirmation scoped to anything else would need
|
|
73
|
+
* a second vocabulary to express "confirmed for what", and the recipient
|
|
74
|
+
* would meet both.
|
|
75
|
+
*
|
|
76
|
+
* It is also the axis the compared products chose — Brevo and Klaviyo offer
|
|
77
|
+
* double opt-in per LIST — and a topic is our per-list.
|
|
78
|
+
*
|
|
79
|
+
* The site default exists because the merchant who wants this usually wants
|
|
80
|
+
* it everywhere: in the jurisdictions where a DOI is the accepted proof of
|
|
81
|
+
* consent, "on for the newsletter but not for the four others" is not the
|
|
82
|
+
* answer they are after, and asking them to set it on each topic they now
|
|
83
|
+
* have plus each one they later add is the shape that gets half-done.
|
|
84
|
+
*
|
|
85
|
+
* ## What it must have to be worth anything
|
|
86
|
+
*
|
|
87
|
+
* ActiveCampaign is the implementation worth copying because it has teeth:
|
|
88
|
+
* an unconfirmed subscriber lands in a real quarantine and "you cannot send
|
|
89
|
+
* any emails to contacts that have this status". Recording a pending
|
|
90
|
+
* confirmation that the send path then ignores is Customer.io's DIY recipe,
|
|
91
|
+
* whose own documentation warns that it "doesn't automatically check this
|
|
92
|
+
* attribute before sending messages" — a fact stored and not enforced. So the
|
|
93
|
+
* state below is read by `filterTopicSendable`, in the same pass that reads
|
|
94
|
+
* the opt-outs.
|
|
95
|
+
*
|
|
96
|
+
* ## On the law, precisely
|
|
97
|
+
*
|
|
98
|
+
* No jurisdiction verified requires double opt-in by statute. They require
|
|
99
|
+
* prior express consent plus a burden of proof on the sender — EU ePrivacy
|
|
100
|
+
* Art. 13(1), German UWG §7(2), Canada's CASL s.13. Germany's own
|
|
101
|
+
* certification body says a DOI is not required by law and then explains why
|
|
102
|
+
* everyone does it anyway: the proof has so far been recognized by the courts
|
|
103
|
+
* exclusively via a DOI. The law requires provable consent; a DOI is the
|
|
104
|
+
* accepted proof.
|
|
105
|
+
*/ export const DEFAULT_SITE_DOUBLE_OPT_IN = false;
|
|
106
|
+
/**
|
|
107
|
+
* How long a confirmation link stays good.
|
|
108
|
+
*
|
|
109
|
+
* 72 hours, Klaviyo's number rather than one of our own. Brevo's is 30 days,
|
|
110
|
+
* which is long enough that the click stops being evidence of anything
|
|
111
|
+
* contemporaneous; the point of the confirmation is to show that the person
|
|
112
|
+
* holding that mailbox wanted this, and a month-old click shows it much less
|
|
113
|
+
* well than a same-day one.
|
|
114
|
+
*
|
|
115
|
+
* Expiry stops the LINK working. It does not make an unconfirmed address
|
|
116
|
+
* mailable — see {@link readTopicSubscriptionState}, where the two are
|
|
117
|
+
* deliberately separate questions.
|
|
118
|
+
*/ export const DOUBLE_OPT_IN_EXPIRY_MS = 72 * 60 * 60 * 1000;
|
|
119
|
+
/**
|
|
120
|
+
* Whether joining `topic` on this site needs a confirmation click.
|
|
121
|
+
*
|
|
122
|
+
* The topic's own setting when it has one, the site's otherwise. `false`
|
|
123
|
+
* stored on a topic is a real answer and not an absence, which is what lets a
|
|
124
|
+
* merchant confirm everything except their order-related stream.
|
|
125
|
+
*/ export function topicRequiresDoubleOptIn(topic, siteDefault = DEFAULT_SITE_DOUBLE_OPT_IN) {
|
|
126
|
+
return typeof (topic == null ? void 0 : topic.doubleOptIn) === 'boolean' ? topic.doubleOptIn : siteDefault === true;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* What an entry means, in one place, for every reader.
|
|
130
|
+
*
|
|
131
|
+
* ## Why this is a function and not a field test at each site
|
|
132
|
+
*
|
|
133
|
+
* There were two fields and one test — "an entry with no `resubscribedAt` is a
|
|
134
|
+
* live opt-out" — written out at three call sites. Adding a third and fourth
|
|
135
|
+
* field breaks that test everywhere it appears at once: a CONFIRMED entry
|
|
136
|
+
* carries `pendingAt` and `confirmedAt` and no `resubscribedAt`, so the old
|
|
137
|
+
* shorthand reads it as somebody who left. Nobody would find that by reading
|
|
138
|
+
* one call site.
|
|
139
|
+
*
|
|
140
|
+
* ## Precedence: a refusal outranks a pending confirmation
|
|
141
|
+
*
|
|
142
|
+
* Somebody who left a stream and never rejoined is opted out even if a
|
|
143
|
+
* confirmation was once asked of them, because leaving is the more recent and
|
|
144
|
+
* more explicit act — and because a pending confirmation that could outrank a
|
|
145
|
+
* refusal would be a way to re-arm sending by asking again.
|
|
146
|
+
*
|
|
147
|
+
* ## An EXPIRED confirmation is still not a subscriber
|
|
148
|
+
*
|
|
149
|
+
* Expiry stops the link working; it does not admit anybody. The alternative —
|
|
150
|
+
* treating a lapsed pending record as subscribed — would make the whole
|
|
151
|
+
* mechanism a delay rather than a gate, and waiting it out would be the way
|
|
152
|
+
* past it.
|
|
153
|
+
*/ export function readTopicSubscriptionState(entry) {
|
|
154
|
+
if (!entry) return 'subscribed';
|
|
155
|
+
if (entry.optedOutAt && !entry.resubscribedAt) return 'opted-out';
|
|
156
|
+
if (entry.pendingAt && !entry.confirmedAt) return 'pending';
|
|
157
|
+
return 'subscribed';
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Whether a confirmation request is too old to be acted on.
|
|
161
|
+
*
|
|
162
|
+
* A separate question from {@link readTopicSubscriptionState} on purpose: one
|
|
163
|
+
* answers "may we mail them", the other answers "does this link still work",
|
|
164
|
+
* and collapsing them is how an expiry comes to admit somebody.
|
|
165
|
+
*/ export function doubleOptInExpired(pendingAtMs, nowMs) {
|
|
166
|
+
const at = Number(pendingAtMs);
|
|
167
|
+
if (!Number.isFinite(at) || at <= 0) return true;
|
|
168
|
+
return nowMs - at > DOUBLE_OPT_IN_EXPIRY_MS;
|
|
169
|
+
}
|
|
170
|
+
/** `orgs/{orgId}/emailTopics` — the catalog, org-shared like `lists`. */ export const EMAIL_TOPICS_COLLECTION = 'emailTopics';
|
|
171
|
+
/** `hosts/{hostId}/topicOptOuts/{emailKey}` — one document per recipient. */ export const TOPIC_OPT_OUTS_SUBCOLLECTION = 'topicOptOuts';
|
|
172
|
+
/*==========================================
|
|
173
|
+
* THE BUILT-IN STREAM IDS.
|
|
174
|
+
*
|
|
175
|
+
* Named rather than written as literals wherever a send declares which stream
|
|
176
|
+
* it belongs to, because a mistyped id does not fail loudly. It names a
|
|
177
|
+
* stream nobody has opted out of, so `filterTopicSendable` finds no opt-out
|
|
178
|
+
* and the send goes to everybody — the control silently doing nothing, which
|
|
179
|
+
* is the failure mode a topic filter is least able to reveal.
|
|
180
|
+
*
|
|
181
|
+
* The value is also a Firestore path component and a colon-joined component
|
|
182
|
+
* of the unsubscribe link's signed subject, so it is a wire format: changing
|
|
183
|
+
* one of these strings orphans every opt-out already recorded against it.
|
|
184
|
+
*=========================================*/ /** Sales, discounts, seasonal campaigns — and the cart a shopper left. */ export const EMAIL_TOPIC_MARKETING = 'marketing';
|
|
185
|
+
/** Regular news and stories, including a site's posts to its members. */ export const EMAIL_TOPIC_NEWSLETTER = 'newsletter';
|
|
186
|
+
/** New products, restocks, and changes to what a site offers. */ export const EMAIL_TOPIC_PRODUCT_UPDATES = 'product-updates';
|
|
187
|
+
/** One person here writing to another about working together. */ export const EMAIL_TOPIC_SALES = 'sales';
|
|
188
|
+
/**
|
|
189
|
+
* The catalog every org has before anyone opens the console.
|
|
190
|
+
*
|
|
191
|
+
* Four, not twelve. A preference page whose value is "leave one stream without
|
|
192
|
+
* leaving all of them" stops working the moment the list is long enough that
|
|
193
|
+
* reading it is a chore, and a merchant who needs a fifth can add one. The ids
|
|
194
|
+
* are the generic names an unsubscribing recipient can recognize without
|
|
195
|
+
* knowing anything about the sender's internal vocabulary.
|
|
196
|
+
*/ export const DEFAULT_EMAIL_TOPICS = [
|
|
197
|
+
{
|
|
198
|
+
id: EMAIL_TOPIC_MARKETING,
|
|
199
|
+
name: 'Promotions and offers',
|
|
200
|
+
description: 'Sales, discounts and seasonal campaigns.'
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
id: EMAIL_TOPIC_NEWSLETTER,
|
|
204
|
+
name: 'Newsletter',
|
|
205
|
+
description: 'Regular news and stories from us.'
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: EMAIL_TOPIC_PRODUCT_UPDATES,
|
|
209
|
+
name: 'Product updates',
|
|
210
|
+
description: 'New products, restocks and changes to what we offer.'
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
id: EMAIL_TOPIC_SALES,
|
|
214
|
+
name: 'Sales outreach',
|
|
215
|
+
description: 'Messages from a person here about working together.'
|
|
216
|
+
}
|
|
217
|
+
];
|
|
218
|
+
/**
|
|
219
|
+
* The topic a campaign carries when its author picked none.
|
|
220
|
+
*
|
|
221
|
+
* Every campaign resolves to SOME topic, because a campaign with no topic
|
|
222
|
+
* would mint an unsubscribe link the preference page cannot place — it could
|
|
223
|
+
* offer the catalog but not say which entry this message was, which is the one
|
|
224
|
+
* thing the recipient came to the page knowing.
|
|
225
|
+
*/ export const DEFAULT_CAMPAIGN_TOPIC_ID = EMAIL_TOPIC_MARKETING;
|
|
226
|
+
/**
|
|
227
|
+
* WHICH STREAM AN AUTOMATED EMAIL BELONGS TO — the one answer, named once.
|
|
228
|
+
*
|
|
229
|
+
* An immediate reply belongs to no stream unless the step named one; anything
|
|
230
|
+
* that goes out on the merchant's schedule belongs to the default stream, as a
|
|
231
|
+
* campaign does. See `FlowEmailScope` for why the two differ.
|
|
232
|
+
*
|
|
233
|
+
* The rule is read TWICE per send — the flow gate filters on it, and the
|
|
234
|
+
* executor signs it into the opt-out link so the preference page opens on the
|
|
235
|
+
* stream the recipient was trying to leave rather than on a list they have to
|
|
236
|
+
* search — so it lives here, in the pure leaf both sides can import, rather
|
|
237
|
+
* than beside either reader. Two spellings of it is how a link comes to name
|
|
238
|
+
* a stream the gate did not check.
|
|
239
|
+
*
|
|
240
|
+
* @returns the topic id, or `''` for a message that belongs to no stream —
|
|
241
|
+
* which is not "the default topic", and must not be signed into a
|
|
242
|
+
* link as one.
|
|
243
|
+
*/ export function flowEmailTopicId(topicId, scope) {
|
|
244
|
+
const named = String(topicId != null ? topicId : '').trim();
|
|
245
|
+
return scope === 'immediate' ? named : named || DEFAULT_CAMPAIGN_TOPIC_ID;
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Whether `value` may be a topic id.
|
|
249
|
+
*
|
|
250
|
+
* Two constraints, and the second is the load-bearing one. The id becomes a
|
|
251
|
+
* Firestore path component, so it carries `isDocumentId`'s rules; and it
|
|
252
|
+
* becomes a COLON-JOINED component of the unsubscribe link's signed subject,
|
|
253
|
+
* so a colon inside it would let one signed subject be read as two different
|
|
254
|
+
* parameter tuples. See `signatureMatches` in the email plugin's
|
|
255
|
+
* `unsubscribe-link.ts` for what that ambiguity would buy.
|
|
256
|
+
*/ export function isEmailTopicId(value) {
|
|
257
|
+
return typeof value === 'string' && value.length > 0 && value.length <= 120 && !value.includes('/') && !value.includes(':') && value !== '.' && value !== '..' && !/^__.*__$/.test(value);
|
|
258
|
+
}
|
|
259
|
+
/** Coerces one stored document into a topic, or `null` if it is not one. */ export function normalizeEmailTopic(id, data) {
|
|
260
|
+
var _ref, _ref1;
|
|
261
|
+
if (!isEmailTopicId(id)) return null;
|
|
262
|
+
const name = String((_ref = data == null ? void 0 : data['name']) != null ? _ref : '').trim();
|
|
263
|
+
return _extends({
|
|
264
|
+
id,
|
|
265
|
+
// A nameless stored document falls back to the id rather than rendering a
|
|
266
|
+
// blank checkbox on the preference page. The console refuses to create
|
|
267
|
+
// one; a restore or an API write is not bound by that.
|
|
268
|
+
name: name || id,
|
|
269
|
+
description: String((_ref1 = data == null ? void 0 : data['description']) != null ? _ref1 : '').trim()
|
|
270
|
+
}, (data == null ? void 0 : data['archived']) === true ? {
|
|
271
|
+
archived: true
|
|
272
|
+
} : {}, typeof (data == null ? void 0 : data['doubleOptIn']) === 'boolean' ? {
|
|
273
|
+
doubleOptIn: data['doubleOptIn']
|
|
274
|
+
} : {});
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* The catalog a reader sees: the built-in floor, overlaid by whatever the org
|
|
278
|
+
* has stored, plus the org's own topics.
|
|
279
|
+
*
|
|
280
|
+
* Overlay rather than replace, so an org that adds one custom topic does not
|
|
281
|
+
* thereby delete the four every one of its recipients has been unsubscribing
|
|
282
|
+
* against. A built-in is removed by storing it `archived`, which is a
|
|
283
|
+
* decision someone made rather than a side effect of making a different one.
|
|
284
|
+
*
|
|
285
|
+
* Sorted with the built-ins first in their declared order and custom topics
|
|
286
|
+
* alphabetically after, so the preference page's checkbox order is stable
|
|
287
|
+
* across renders and across sites.
|
|
288
|
+
*/ export function mergeEmailTopics(stored) {
|
|
289
|
+
const overrides = new Map();
|
|
290
|
+
for (const topic of stored != null ? stored : []){
|
|
291
|
+
if (isEmailTopicId(topic == null ? void 0 : topic.id)) overrides.set(topic.id, topic);
|
|
292
|
+
}
|
|
293
|
+
const builtIn = DEFAULT_EMAIL_TOPICS.map((topic)=>{
|
|
294
|
+
var _overrides_get;
|
|
295
|
+
return (_overrides_get = overrides.get(topic.id)) != null ? _overrides_get : topic;
|
|
296
|
+
});
|
|
297
|
+
const custom = [
|
|
298
|
+
...overrides.values()
|
|
299
|
+
].filter((topic)=>!DEFAULT_EMAIL_TOPICS.some((it)=>it.id === topic.id)).sort((a, b)=>a.name.localeCompare(b.name));
|
|
300
|
+
return [
|
|
301
|
+
...builtIn,
|
|
302
|
+
...custom
|
|
303
|
+
];
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* The catalog minus retired topics — what a composer's picker and a
|
|
307
|
+
* preference page's checkboxes offer.
|
|
308
|
+
*
|
|
309
|
+
* The send path deliberately does NOT filter through this: a scheduled
|
|
310
|
+
* campaign whose topic was archived between scheduling and sending still
|
|
311
|
+
* belongs to that topic, and re-pointing it at something else would attribute
|
|
312
|
+
* the unsubscribes to the wrong stream.
|
|
313
|
+
*/ export function activeEmailTopics(topics) {
|
|
314
|
+
return topics.filter((topic)=>!topic.archived);
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* The topic a campaign belongs to, given what it stored and what the org
|
|
318
|
+
* offers.
|
|
319
|
+
*
|
|
320
|
+
* Resolves an unknown or missing id to the default rather than to nothing: a
|
|
321
|
+
* campaign sent before topics existed carries no `topicId`, and its
|
|
322
|
+
* unsubscribe links are in inboxes right now. They must land on a preference
|
|
323
|
+
* page that names A topic, not on one that says the message came from
|
|
324
|
+
* nowhere.
|
|
325
|
+
*/ export function resolveCampaignTopic(topicId, topics) {
|
|
326
|
+
var _ref, _topics_find;
|
|
327
|
+
const found = topicId ? topics.find((topic)=>topic.id === topicId) : undefined;
|
|
328
|
+
if (found) return found;
|
|
329
|
+
return (_ref = (_topics_find = topics.find((topic)=>topic.id === DEFAULT_CAMPAIGN_TOPIC_ID)) != null ? _topics_find : topics[0]) != null ? _ref : {
|
|
330
|
+
id: DEFAULT_CAMPAIGN_TOPIC_ID,
|
|
331
|
+
name: 'Email',
|
|
332
|
+
description: ''
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
//# sourceMappingURL=email-topics.js.map
|