@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,783 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ /**
|
|
18
|
+
* The READ side of marketing consent (`docs/specs/email-overhaul.md` §3f).
|
|
19
|
+
*
|
|
20
|
+
* `marketingConsent` has seven writers and, until this module, no reader on
|
|
21
|
+
* any send path: `performCampaignSend` filtered on the suppression list and
|
|
22
|
+
* on nothing else, so a recorded opt-in and a recorded opt-OUT reached the
|
|
23
|
+
* same inbox. This is the join that makes the field mean something.
|
|
24
|
+
*
|
|
25
|
+
* ## A basis is DECLARED, never inferred
|
|
26
|
+
*
|
|
27
|
+
* Nothing here treats an act as consent. Submitting a form, buying, booking,
|
|
28
|
+
* or holding an account are all things a person did for their own reasons,
|
|
29
|
+
* and none of them is an opt-in to marketing email. The only input is a
|
|
30
|
+
* stored `marketingConsent` written from a checkbox the person ticked. That
|
|
31
|
+
* is why {@link readMarketingBasis} takes a document rather than a silo name:
|
|
32
|
+
* there is no silo whose mere membership grants a basis.
|
|
33
|
+
*
|
|
34
|
+
* ## Three states, not two
|
|
35
|
+
*
|
|
36
|
+
* The field is written `true` by six capture paths and `false` by exactly one
|
|
37
|
+
* (`POST /v1/contacts`), so absence is not refusal — it is the far commoner
|
|
38
|
+
* case of a record captured before the checkbox existed. Collapsing absent
|
|
39
|
+
* into refused is what would empty an existing audience overnight; collapsing
|
|
40
|
+
* it into granted is what the product does today. Both are wrong, so the
|
|
41
|
+
* split is carried through to the caller as three counts rather than a
|
|
42
|
+
* boolean.
|
|
43
|
+
*
|
|
44
|
+
* ## A basis also records WHOSE act it was
|
|
45
|
+
*
|
|
46
|
+
* A basis an operator asserted over existing records — see
|
|
47
|
+
* `tools/scripts/backfill-marketing-consent.mjs` — is mailable, because an
|
|
48
|
+
* org that asserted it meant that data to be reachable. It is not, however,
|
|
49
|
+
* the same fact as a checkbox somebody ticked, and two fields that store
|
|
50
|
+
* only `true` and a date cannot tell the difference. So an asserted basis
|
|
51
|
+
* carries {@link MARKETING_CONSENT_SOURCE_FIELD} naming who asserted it,
|
|
52
|
+
* when, and why, and every reader gets that distinction back as
|
|
53
|
+
* {@link MarketingConsentRecord.assertedBy}. Consent is only evidence for as
|
|
54
|
+
* long as its origin survives with it.
|
|
55
|
+
*
|
|
56
|
+
* ## A basis also records WHICH BRAND it was given to
|
|
57
|
+
*
|
|
58
|
+
* Contacts are ORG-scoped and shared across every site in the org, which is
|
|
59
|
+
* deliberate: an agency running many client brands out of one account keeps
|
|
60
|
+
* one address book. Consent is not shareable on the same terms. It runs to a
|
|
61
|
+
* controller — the brand named on the form, in the sender line and in the
|
|
62
|
+
* privacy notice the person read — and not to the account that happens to
|
|
63
|
+
* hold the row. One boolean per person cannot express that, so somebody who
|
|
64
|
+
* opted in to one client's newsletter was mailable by every other client in
|
|
65
|
+
* the agency, on a basis none of them was given.
|
|
66
|
+
*
|
|
67
|
+
* So a basis is stored per (person, host), under
|
|
68
|
+
* {@link MARKETING_CONSENT_BY_HOST_FIELD}, and {@link readMarketingBasis}
|
|
69
|
+
* takes the host it is being read FOR. The host argument is required and has
|
|
70
|
+
* no default: a reader that has not said which brand is asking cannot
|
|
71
|
+
* compile, which is the same guarantee `newResourceScopeFields` gives on the
|
|
72
|
+
* write side of scoped resources.
|
|
73
|
+
*
|
|
74
|
+
* ## FIVE states, because collapsing any two of them is a bug in one
|
|
75
|
+
* direction or the other
|
|
76
|
+
*
|
|
77
|
+
* "This host has no basis for this person" and "another host has one" and "a
|
|
78
|
+
* grant exists that names no host at all" and "this person refused" are
|
|
79
|
+
* different facts, and every pair of them collapses into either a leak or a
|
|
80
|
+
* silent failure to mail somebody who did opt in. They are carried apart all
|
|
81
|
+
* the way to the caller as {@link MarketingConsentReason}, and
|
|
82
|
+
* {@link MarketingConsentSplit} counts them separately rather than reporting
|
|
83
|
+
* one `withheld` total that cannot be explained to a merchant.
|
|
84
|
+
*
|
|
85
|
+
* ## A REFUSAL over-applies; a GRANT never does
|
|
86
|
+
*
|
|
87
|
+
* The pre-host field is still read, and asymmetrically. A stored
|
|
88
|
+
* `marketingConsent: false` refuses for every host, because a refusal
|
|
89
|
+
* recorded against nobody in particular is most safely honored against
|
|
90
|
+
* everybody, and withholding mail is recoverable where sending it is not. A
|
|
91
|
+
* stored `marketingConsent: true` grants to NO host: it is a claim with no
|
|
92
|
+
* controller attached, and spreading it across an agency's unrelated clients
|
|
93
|
+
* is precisely the defect this module exists to end. Such a record reports
|
|
94
|
+
* {@link MarketingConsentRecord.otherGrant} as `'unscoped'` so a console can
|
|
95
|
+
* say why somebody stopped being mailable, and so
|
|
96
|
+
* `tools/scripts/backfill-consent-host.mjs` can find them.
|
|
97
|
+
*/ import { soloConsentGroup } from "./consent-groups.js";
|
|
98
|
+
/**
|
|
99
|
+
* The document field carrying WHO asserted a stored basis, and why.
|
|
100
|
+
*
|
|
101
|
+
* `marketingConsent` on its own records only WHAT the basis is. A record
|
|
102
|
+
* written by an operator and a record written from a checkbox a person
|
|
103
|
+
* ticked are the same two fields with the same two values, so nothing
|
|
104
|
+
* downstream — a console readout, an export, a regulator's question — can
|
|
105
|
+
* tell them apart. That is the difference between consent that is evidence
|
|
106
|
+
* and consent that is an assertion, so it is carried on the record itself
|
|
107
|
+
* rather than left to be reconstructed from when a script happened to run.
|
|
108
|
+
*
|
|
109
|
+
* Absent on every record written from a site's capture surface, which is why
|
|
110
|
+
* {@link readMarketingBasis} reads its absence as the person's own act: the
|
|
111
|
+
* six checkbox writers are the norm and an operator assertion is the thing
|
|
112
|
+
* that has to announce itself. The platform's own console doors (AGL-3185)
|
|
113
|
+
* do write it — which door, which wording version — and say whose act it
|
|
114
|
+
* describes with {@link MarketingConsentSource.actor}, so a record can carry
|
|
115
|
+
* provenance without being read as an assertion made on the person's behalf.
|
|
116
|
+
*/ export const MARKETING_CONSENT_SOURCE_FIELD = 'marketingConsentSource';
|
|
117
|
+
/**
|
|
118
|
+
* The `kind` an operator backfill stamps. A named constant because the
|
|
119
|
+
* script that writes it and the reader that finds it are in different
|
|
120
|
+
* languages and cannot share a type.
|
|
121
|
+
*/ export const OPERATOR_BACKFILL_CONSENT_KIND = 'operator-backfill';
|
|
122
|
+
/**
|
|
123
|
+
* The document field a LIST MEMBERSHIP carries beside `marketingConsent`,
|
|
124
|
+
* naming which of the two ways in produced it.
|
|
125
|
+
*
|
|
126
|
+
* `list-members.ts` writes it, with `'contact-opt-in'` for a basis carried
|
|
127
|
+
* across from the person's own record and
|
|
128
|
+
* {@link OPERATOR_ATTESTED_CONSENT_BASIS} for one a console account asserted.
|
|
129
|
+
* It is read here because a membership is a person record like any other to
|
|
130
|
+
* every reader in the send path, and a reader that knew only about
|
|
131
|
+
* {@link MARKETING_CONSENT_SOURCE_FIELD} would report an attestation as the
|
|
132
|
+
* person's own act.
|
|
133
|
+
*/ export const MARKETING_CONSENT_BASIS_FIELD = 'marketingConsentBasis';
|
|
134
|
+
/**
|
|
135
|
+
* The value of {@link MARKETING_CONSENT_BASIS_FIELD} that means an operator
|
|
136
|
+
* stated they have this person's permission.
|
|
137
|
+
*
|
|
138
|
+
* A string literal shared by the writer and the reader rather than a type,
|
|
139
|
+
* for the reason above: the enrollment path stores this on a document and
|
|
140
|
+
* this module reads it back off one, and a document has no types.
|
|
141
|
+
*/ export const OPERATOR_ATTESTED_CONSENT_BASIS = 'operator-attested';
|
|
142
|
+
/**
|
|
143
|
+
* The `kind` synthesized for an attested membership that carries no
|
|
144
|
+
* {@link MARKETING_CONSENT_SOURCE_FIELD} of its own.
|
|
145
|
+
*
|
|
146
|
+
* The console's one-address add path stores the attesting account in
|
|
147
|
+
* `marketingConsentByUid` and no provenance object, so the provenance a
|
|
148
|
+
* reader can honestly report for those rows is exactly "an account attested
|
|
149
|
+
* this" plus the account. Naming the kind rather than leaving the source
|
|
150
|
+
* `null` is what lets a console readout say WHO, which is the whole reason
|
|
151
|
+
* the attribution is stored.
|
|
152
|
+
*/ export const OPERATOR_ATTESTED_CONSENT_KIND = 'operator-attested';
|
|
153
|
+
/**
|
|
154
|
+
* The boolean field a basis has always been stored in.
|
|
155
|
+
*
|
|
156
|
+
* Named rather than spelled out at each site because it now appears in two
|
|
157
|
+
* positions — at the top of a person document, and again inside every entry
|
|
158
|
+
* of {@link MARKETING_CONSENT_BY_HOST_FIELD} — and the second position is
|
|
159
|
+
* only readable by the same parser as the first while both agree on the name.
|
|
160
|
+
*/ export const MARKETING_CONSENT_FIELD = 'marketingConsent';
|
|
161
|
+
/**
|
|
162
|
+
* The map field holding one consent entry per host: `{ [hostId]: entry }`,
|
|
163
|
+
* where an entry carries exactly the fields the top level carries.
|
|
164
|
+
*
|
|
165
|
+
* ## Why a map on the person document and not a subcollection
|
|
166
|
+
*
|
|
167
|
+
* The send path reads consent out of the audience sweep, while the person's
|
|
168
|
+
* document is already in hand — that placement is what keeps the consent join
|
|
169
|
+
* free. A subcollection would make it one extra read PER RECIPIENT PER
|
|
170
|
+
* CAMPAIGN, on the one path in the product whose cost scales with the size of
|
|
171
|
+
* a customer's list. The map rides along with a document that is being read
|
|
172
|
+
* anyway.
|
|
173
|
+
*
|
|
174
|
+
* ## Why keyed by host id
|
|
175
|
+
*
|
|
176
|
+
* `entry = map[hostId]` is a lookup that has no way to return another host's
|
|
177
|
+
* grant. A list of entries carrying a `hostId` field would have to be
|
|
178
|
+
* searched, and a search is something a caller can get wrong — a `.find()`
|
|
179
|
+
* whose predicate is dropped still returns a grant, just somebody else's.
|
|
180
|
+
* There is no expression of this shape that reads host B's consent while
|
|
181
|
+
* asking about host A.
|
|
182
|
+
*
|
|
183
|
+
* ## Why the entries repeat the top-level field names
|
|
184
|
+
*
|
|
185
|
+
* So that one parser reads both. Provenance, the attested-basis marker, the
|
|
186
|
+
* attesting account and the timestamp all mean the same thing wherever they
|
|
187
|
+
* sit, and a second set of names would be a second set of rules for the two
|
|
188
|
+
* positions to disagree about — which is how the attested-membership case
|
|
189
|
+
* came to be reported as a person's own act in the first place.
|
|
190
|
+
*/ export const MARKETING_CONSENT_BY_HOST_FIELD = 'marketingConsentByHost';
|
|
191
|
+
/**
|
|
192
|
+
* The field naming every host that has CAPTURED a person record.
|
|
193
|
+
*
|
|
194
|
+
* Not consent, and deliberately not stored with it. Somebody captured by one
|
|
195
|
+
* brand may go on to consent to two, or to none; conflating capture with
|
|
196
|
+
* permission is how an act a person took for their own reasons — booking a
|
|
197
|
+
* table, buying a thing — comes to be read as an opt-in. It is here because a
|
|
198
|
+
* grandfathered basis is a claim about WHEN a record was captured, and that
|
|
199
|
+
* claim only ever belonged to the brands that captured it.
|
|
200
|
+
*
|
|
201
|
+
* ## An ARRAY, and top-level, because it has to be a QUERY
|
|
202
|
+
*
|
|
203
|
+
* It serves both organizations from one field. An agency filters to "the
|
|
204
|
+
* people MY site captured"; a business running three sites as one asks for
|
|
205
|
+
* "everyone captured on A, B or C". Both are `array-contains-any` over this
|
|
206
|
+
* field, which is why it is a top-level array of ids and not a label on a
|
|
207
|
+
* detail page and not a map: Firestore can filter this shape and cannot
|
|
208
|
+
* filter an array of objects.
|
|
209
|
+
*
|
|
210
|
+
* It GROWS. A person who fills in a second site's form is captured by that
|
|
211
|
+
* site too, and the write is an `arrayUnion` on the merge branch as well as
|
|
212
|
+
* on the create — which is exactly what the create-only `hostId` beside it
|
|
213
|
+
* could never record.
|
|
214
|
+
*
|
|
215
|
+
* Read with the scalar `hostId` as a fallback on `contacts`, which has
|
|
216
|
+
* stamped its FIRST capturing host under that name since the collection
|
|
217
|
+
* existed. That is a strict subset of this fact under an older name, and a
|
|
218
|
+
* reader that ignored it would report every existing contact as unattributed.
|
|
219
|
+
*/ export const CAPTURED_BY_HOST_FIELD = 'capturedByHostIds';
|
|
220
|
+
/**
|
|
221
|
+
* The consent group a stored grant was given to, recorded ON THE ENTRY.
|
|
222
|
+
*
|
|
223
|
+
* The declaration lives on the org and can change; this is what was DISCLOSED
|
|
224
|
+
* to this person at the moment they agreed. Reading pooling from the org's
|
|
225
|
+
* current declaration instead would let adding a site to a group widen every
|
|
226
|
+
* grant ever made, which is the leak with a configuration screen in front of
|
|
227
|
+
* it. So the group travels with the grant, and a group that grows reaches
|
|
228
|
+
* only the captures that come after it.
|
|
229
|
+
*/ export const CONSENT_GROUP_ID_FIELD = 'consentGroupId';
|
|
230
|
+
/**
|
|
231
|
+
* The group's display name as the capture surface showed it.
|
|
232
|
+
*
|
|
233
|
+
* Stored beside the id because the id is not evidence: answering "what was
|
|
234
|
+
* this person told" with a document key is answering a different question.
|
|
235
|
+
* A group can also be renamed, and the name that matters is the one on the
|
|
236
|
+
* screen they were looking at.
|
|
237
|
+
*/ export const CONSENT_GROUP_NAME_FIELD = 'consentGroupName';
|
|
238
|
+
/**
|
|
239
|
+
* The default forward cutoff: 2026-09-01T00:00:00Z.
|
|
240
|
+
*
|
|
241
|
+
* A date rather than a per-org stamp, so the rule has an answer on an org that
|
|
242
|
+
* has never opened the setting.
|
|
243
|
+
*
|
|
244
|
+
* It divides the audience only under `'forward'`, where a record predating it
|
|
245
|
+
* grandfathers and every capture from the checkbox-bearing surfaces onward
|
|
246
|
+
* carries a basis or is withheld. Under `'strict'` it decides nothing, since
|
|
247
|
+
* no record grandfathers at any date.
|
|
248
|
+
*
|
|
249
|
+
* An org may move it later (a longer grace period) or earlier (voluntarily
|
|
250
|
+
* enforcing over more of its own back catalog) through
|
|
251
|
+
* {@link resolveMarketingConsentPolicy}.
|
|
252
|
+
*/ export const MARKETING_CONSENT_ENFORCED_FROM_MS = Date.UTC(2026, 8, 1);
|
|
253
|
+
/**
|
|
254
|
+
* The policy an org gets when it has never configured one.
|
|
255
|
+
*
|
|
256
|
+
* `'strict'` — every recipient needs a recorded basis, and nothing is
|
|
257
|
+
* grandfathered. That is defensible because of WHEN it ships: the product is
|
|
258
|
+
* pre-release with no real customers, so the population a retroactive rule
|
|
259
|
+
* removes is test and seeded demo data. The usual objection to retroactive
|
|
260
|
+
* enforcement — that it silently shrinks a live audience, sometimes to
|
|
261
|
+
* nothing — has nobody here to injure.
|
|
262
|
+
*
|
|
263
|
+
* ⚠️ It stops being defensible the moment real addresses exist. A deployment
|
|
264
|
+
* that has already collected an audience under the old rule sets `'forward'`
|
|
265
|
+
* on its orgs rather than inheriting this, because flipping to strict over a
|
|
266
|
+
* live back catalog withholds mail from people who were legitimately
|
|
267
|
+
* reachable the day before.
|
|
268
|
+
*
|
|
269
|
+
* `enforceFromMs` stays populated and is still read: under `'strict'` it
|
|
270
|
+
* decides nothing, but an org moving back to `'forward'` gets a real cutoff
|
|
271
|
+
* rather than a missing field.
|
|
272
|
+
*/ export const DEFAULT_MARKETING_CONSENT_POLICY = {
|
|
273
|
+
mode: 'strict',
|
|
274
|
+
enforceFromMs: MARKETING_CONSENT_ENFORCED_FROM_MS
|
|
275
|
+
};
|
|
276
|
+
/**
|
|
277
|
+
* Reads an org's stored `marketingConsentPolicy` into a usable policy.
|
|
278
|
+
*
|
|
279
|
+
* Every unusable value falls back to the default rather than to "off": there
|
|
280
|
+
* is no off. A malformed setting must not be a way to switch the join back
|
|
281
|
+
* out, because the failure mode of that is mail to people who declined.
|
|
282
|
+
*
|
|
283
|
+
* The fallback is {@link DEFAULT_MARKETING_CONSENT_POLICY} itself rather than
|
|
284
|
+
* a mode repeated here. This function is the ONLY path by which any send
|
|
285
|
+
* reaches a policy, so a literal in it would be the real default and the
|
|
286
|
+
* exported constant would be a decoration: changing the constant would move
|
|
287
|
+
* what `marketing-consent.spec.ts` asserts and nothing that mails anybody.
|
|
288
|
+
* Only the two modes a caller may actually store are honored, so a stored
|
|
289
|
+
* value that means neither lands on the default with everything else.
|
|
290
|
+
*/ export function resolveMarketingConsentPolicy(stored) {
|
|
291
|
+
const value = stored != null ? stored : {};
|
|
292
|
+
const mode = value['mode'] === 'strict' ? 'strict' : value['mode'] === 'forward' ? 'forward' : DEFAULT_MARKETING_CONSENT_POLICY.mode;
|
|
293
|
+
const enforceFromMs = Number(value['enforceFromMs']);
|
|
294
|
+
return {
|
|
295
|
+
mode,
|
|
296
|
+
enforceFromMs: Number.isFinite(enforceFromMs) ? enforceFromMs : MARKETING_CONSENT_ENFORCED_FROM_MS
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Coerces the several shapes a timestamp arrives in — epoch millis, a
|
|
301
|
+
* Firestore `Timestamp`, a `Date` — to millis, or `null`.
|
|
302
|
+
*
|
|
303
|
+
* `toMillis` is duck-typed rather than imported: this module is in the
|
|
304
|
+
* client-bundled barrel and must not pull in `firebase-admin`, and the two
|
|
305
|
+
* SDKs' `Timestamp` classes are different types with the same method anyway.
|
|
306
|
+
*/ function timestampMs(value) {
|
|
307
|
+
if (typeof value === 'number') return Number.isFinite(value) ? value : null;
|
|
308
|
+
if (value instanceof Date) return value.getTime();
|
|
309
|
+
const toMillis = value == null ? void 0 : value.toMillis;
|
|
310
|
+
if (typeof toMillis === 'function') {
|
|
311
|
+
const millis = Number(toMillis.call(value));
|
|
312
|
+
return Number.isFinite(millis) ? millis : null;
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Reads the consent facts off one person record from any silo.
|
|
318
|
+
*
|
|
319
|
+
* The field names differ by collection and the capture timestamp does too —
|
|
320
|
+
* `contacts`, `leads` and `siteMembers` stamp `createdAt`, a list membership
|
|
321
|
+
* stamps `addedAt` — so both are read from a small set of aliases rather than
|
|
322
|
+
* one name per caller. A caller that has to remember which name its silo uses
|
|
323
|
+
* is a caller that can read the wrong one and silently get `undefined`, which
|
|
324
|
+
* is exactly how `siteMembers` came to be addressed by a blank merge tag.
|
|
325
|
+
*
|
|
326
|
+
* ## TWO fields can say "an operator asserted this", and both are read
|
|
327
|
+
*
|
|
328
|
+
* A backfilled CRM record announces itself with {@link
|
|
329
|
+
* MARKETING_CONSENT_SOURCE_FIELD}; a LIST MEMBERSHIP announces itself with
|
|
330
|
+
* {@link MARKETING_CONSENT_BASIS_FIELD} set to {@link
|
|
331
|
+
* OPERATOR_ATTESTED_CONSENT_BASIS}, because the enrollment path stores what
|
|
332
|
+
* KIND of basis a membership carries and stores the attesting account beside
|
|
333
|
+
* it. Reading only the first would report every attested enrollment — every
|
|
334
|
+
* address a merchant added by hand, and every address an import brings in —
|
|
335
|
+
* as a checkbox the person ticked, which is precisely the conflation the
|
|
336
|
+
* attribution exists to prevent. The send-time consent join reads a
|
|
337
|
+
* membership through this function, so the wrong answer here is the wrong
|
|
338
|
+
* answer in a compliance response.
|
|
339
|
+
*
|
|
340
|
+
* ## The basis comes from `hostId`'s ENTRY, and from nowhere else
|
|
341
|
+
*
|
|
342
|
+
* `entry = map[hostId]` — a lookup with no way to reach another host's grant.
|
|
343
|
+
* The pre-host top-level field is consulted only for the asymmetry the module
|
|
344
|
+
* note states: a `false` there refuses for every host, a `true` there grants
|
|
345
|
+
* to none and reports itself as {@link MarketingConsentOtherGrant} `'unscoped'`
|
|
346
|
+
* instead.
|
|
347
|
+
*
|
|
348
|
+
* @param record any silo's person document data, or `null` for an address
|
|
349
|
+
* with no record behind it (a hand-typed manual audience).
|
|
350
|
+
* @param hostId the site asking. Required and undefaulted: a caller that has
|
|
351
|
+
* not said which brand wants to mail this person has not asked
|
|
352
|
+
* a question this function can answer.
|
|
353
|
+
*/ export function readMarketingBasis(record, group) {
|
|
354
|
+
var _byHost_hostId, _byHost_refusedInGroup, _readConsentSource, _timestampMs;
|
|
355
|
+
const { hostId } = group;
|
|
356
|
+
if (!record) {
|
|
357
|
+
return {
|
|
358
|
+
hostId,
|
|
359
|
+
groupId: group.groupId,
|
|
360
|
+
otherGrant: 'none',
|
|
361
|
+
capturedByHostIds: [],
|
|
362
|
+
capturedByGroup: false,
|
|
363
|
+
basis: 'unrecorded',
|
|
364
|
+
assertedBy: null,
|
|
365
|
+
source: null,
|
|
366
|
+
basisAtMs: null,
|
|
367
|
+
capturedAtMs: null
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
const byHost = readConsentByHost(record);
|
|
371
|
+
const entry = (_byHost_hostId = byHost[hostId]) != null ? _byHost_hostId : null;
|
|
372
|
+
const capturedBy = readCapturedByHosts(record);
|
|
373
|
+
/*
|
|
374
|
+
* THE REFUSAL IS READ ACROSS THE WHOLE GROUP, AND THE GRANT IS NOT.
|
|
375
|
+
*
|
|
376
|
+
* A grant is written forward: at capture, every site the disclosure named
|
|
377
|
+
* got its own entry, so `byHost[hostId]` is the complete answer and a group
|
|
378
|
+
* that GROWS later cannot retroactively widen what somebody agreed to.
|
|
379
|
+
*
|
|
380
|
+
* A refusal has to run the other way. Three sites presenting as one sender
|
|
381
|
+
* are one sender to the person unsubscribing from them, and making them do
|
|
382
|
+
* it twice more is hostile and legally wrong; a site that JOINS the group
|
|
383
|
+
* inherits the refusals already standing against its siblings. Reading the
|
|
384
|
+
* current group is what delivers that, and it can only ever withhold.
|
|
385
|
+
*
|
|
386
|
+
* The pre-host top-level `false` is read the same way and for the same
|
|
387
|
+
* reason: it names no controller, so it is honored against every one.
|
|
388
|
+
*/ const refusedUnscoped = record[MARKETING_CONSENT_FIELD] === false;
|
|
389
|
+
const refusedInGroup = group.hostIds.find((member)=>{
|
|
390
|
+
var _byHost_member;
|
|
391
|
+
return ((_byHost_member = byHost[member]) == null ? void 0 : _byHost_member[MARKETING_CONSENT_FIELD]) === false;
|
|
392
|
+
});
|
|
393
|
+
const consent = entry == null ? void 0 : entry[MARKETING_CONSENT_FIELD];
|
|
394
|
+
const basis = refusedUnscoped || refusedInGroup !== undefined ? 'declined' : consent === true ? 'granted' : 'unrecorded';
|
|
395
|
+
// Provenance is read off whichever position produced the basis, so a
|
|
396
|
+
// refusal inherited from a sibling site or from the pre-host field is not
|
|
397
|
+
// decorated with the attribution of some other host's grant.
|
|
398
|
+
const fields = refusedUnscoped ? record : refusedInGroup !== undefined ? (_byHost_refusedInGroup = byHost[refusedInGroup]) != null ? _byHost_refusedInGroup : {} : entry != null ? entry : {};
|
|
399
|
+
const basisAtMs = timestampMs(fields['marketingConsentAtMs']);
|
|
400
|
+
const source = (_readConsentSource = readConsentSource(fields[MARKETING_CONSENT_SOURCE_FIELD])) != null ? _readConsentSource : readAttestedBasis(fields, basisAtMs);
|
|
401
|
+
return {
|
|
402
|
+
hostId,
|
|
403
|
+
groupId: group.groupId,
|
|
404
|
+
otherGrant: readOtherGrant(record, byHost, group),
|
|
405
|
+
capturedByHostIds: capturedBy,
|
|
406
|
+
capturedByGroup: capturedBy.some((id)=>group.hostIds.includes(id)),
|
|
407
|
+
basis,
|
|
408
|
+
// A basis with no provenance is the person's own: the site capture
|
|
409
|
+
// surfaces write nothing here, so absence is the norm and an operator
|
|
410
|
+
// assertion is what has to be stated. Provenance that names the person
|
|
411
|
+
// as its own actor is the one other way to be the person's act — a
|
|
412
|
+
// console door records which door and which wording, and says so.
|
|
413
|
+
// Attributing an absent basis to nobody keeps `unrecorded` from reading
|
|
414
|
+
// as a person who declined to be attributed.
|
|
415
|
+
assertedBy: basis === 'unrecorded' ? null : source !== null && source.actor !== 'person' ? 'operator' : 'person',
|
|
416
|
+
source,
|
|
417
|
+
basisAtMs,
|
|
418
|
+
capturedAtMs: (_timestampMs = timestampMs(record['createdAt'])) != null ? _timestampMs : timestampMs(record['addedAt'])
|
|
419
|
+
};
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* The per-host consent map, as a plain object of entries.
|
|
423
|
+
*
|
|
424
|
+
* Anything that is not an object of objects reads as empty rather than
|
|
425
|
+
* throwing. A malformed map must degrade to "no host has a basis", which
|
|
426
|
+
* withholds; degrading toward a grant would make a corrupt value a way to
|
|
427
|
+
* mail people.
|
|
428
|
+
*/ function readConsentByHost(record) {
|
|
429
|
+
const raw = record[MARKETING_CONSENT_BY_HOST_FIELD];
|
|
430
|
+
if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return {};
|
|
431
|
+
const entries = {};
|
|
432
|
+
for (const [key, value] of Object.entries(raw)){
|
|
433
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
434
|
+
entries[key] = value;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
return entries;
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Which kind of grant this person holds that `hostId` may not use.
|
|
441
|
+
*
|
|
442
|
+
* Only GRANTS are reported. Another host's refusal is that host's preference
|
|
443
|
+
* and says nothing about this one — treating it as a signal here would spread
|
|
444
|
+
* an opt-out across an agency's unrelated clients, which is the same defect
|
|
445
|
+
* as spreading an opt-in, pointed the other way.
|
|
446
|
+
*/ function readOtherGrant(record, byHost, group) {
|
|
447
|
+
for (const [key, entry] of Object.entries(byHost)){
|
|
448
|
+
if (group.hostIds.includes(key)) continue;
|
|
449
|
+
if (entry[MARKETING_CONSENT_FIELD] === true) return 'other-host';
|
|
450
|
+
}
|
|
451
|
+
return record[MARKETING_CONSENT_FIELD] === true ? 'unscoped' : 'none';
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* The host that captured this record.
|
|
455
|
+
*
|
|
456
|
+
* {@link CAPTURED_BY_HOST_FIELD} first, then `hostId` — the older name for
|
|
457
|
+
* the same fact on `contacts`. `leads` and `siteMembers` live under a host
|
|
458
|
+
* and carry neither, which is why the absent case is a real answer rather
|
|
459
|
+
* than an error: see {@link MarketingConsentReason} for what it decides.
|
|
460
|
+
*/ function readCapturedByHosts(record) {
|
|
461
|
+
const found = new Set();
|
|
462
|
+
const array = record[CAPTURED_BY_HOST_FIELD];
|
|
463
|
+
if (Array.isArray(array)) {
|
|
464
|
+
for (const value of array){
|
|
465
|
+
if (typeof value === 'string' && value) found.add(value);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
// The older scalar name on `contacts`, which holds the FIRST capturing
|
|
469
|
+
// site. A subset of the same fact, so it is unioned rather than preferred.
|
|
470
|
+
const legacy = record['hostId'];
|
|
471
|
+
if (typeof legacy === 'string' && legacy) found.add(legacy);
|
|
472
|
+
return [
|
|
473
|
+
...found
|
|
474
|
+
];
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Every host that holds a GRANT for this person, sorted.
|
|
478
|
+
*
|
|
479
|
+
* The console readout and the API projection both need it, and the agency
|
|
480
|
+
* handoff is the third caller: "which of these rows are this client's" is
|
|
481
|
+
* this list intersected with one host.
|
|
482
|
+
*
|
|
483
|
+
* A refusal is not reported here. The question is which brands may mail this
|
|
484
|
+
* person, and an unscoped refusal answers it for all of them at once — see
|
|
485
|
+
* {@link readMarketingBasis}, which is where that asymmetry is decided.
|
|
486
|
+
*/ export function marketingConsentHostIds(record) {
|
|
487
|
+
if (!record || record[MARKETING_CONSENT_FIELD] === false) return [];
|
|
488
|
+
return Object.entries(readConsentByHost(record)).filter(([, entry])=>entry[MARKETING_CONSENT_FIELD] === true).map(([hostId])=>hostId).sort();
|
|
489
|
+
}
|
|
490
|
+
/**
|
|
491
|
+
* The document fields that RECORD a basis for one host, as a spreadable
|
|
492
|
+
* object to merge onto a person document.
|
|
493
|
+
*
|
|
494
|
+
* The one writer helper for eleven capture doors. They wrote
|
|
495
|
+
* `{ marketingConsent: true, marketingConsentAtMs: … }` inline, eleven times,
|
|
496
|
+
* and every one of those grants applied to every brand in the org. A helper
|
|
497
|
+
* that takes the host is what makes the omission impossible: there is no
|
|
498
|
+
* spelling of this call that records a grant without saying whose it is.
|
|
499
|
+
*
|
|
500
|
+
* ⛔ It writes a grant and never a refusal. An opt-out is not the inverse of
|
|
501
|
+
* an opt-in — it belongs beside the site's suppression list, has to survive a
|
|
502
|
+
* later capture that would otherwise overwrite it, and is recorded by
|
|
503
|
+
* `declineMarketingConsentFields` instead.
|
|
504
|
+
*
|
|
505
|
+
* Nested rather than dot-pathed so it composes with a `{ merge: true }` set,
|
|
506
|
+
* which deep-merges maps: writing one host's entry leaves every other host's
|
|
507
|
+
* untouched. A dotted `update` would do the same but cannot be spread into
|
|
508
|
+
* the object literals these doors already build, and cannot create the
|
|
509
|
+
* document when it is new.
|
|
510
|
+
*
|
|
511
|
+
* @param atMs when the person gave it. Defaulted by the caller, not here: a
|
|
512
|
+
* clock read hidden in a helper is one a test cannot pin.
|
|
513
|
+
*/ export function marketingConsentFieldsForGroup(group, atMs, extra) {
|
|
514
|
+
var _group_name;
|
|
515
|
+
var _group_hostIds;
|
|
516
|
+
if (!(group == null ? void 0 : (_group_hostIds = group.hostIds) == null ? void 0 : _group_hostIds.length)) {
|
|
517
|
+
throw new Error('[marketing-consent] a basis cannot be recorded for no host');
|
|
518
|
+
}
|
|
519
|
+
const entry = _extends({
|
|
520
|
+
[MARKETING_CONSENT_FIELD]: true,
|
|
521
|
+
marketingConsentAtMs: atMs
|
|
522
|
+
}, group.declared ? {
|
|
523
|
+
[CONSENT_GROUP_ID_FIELD]: group.groupId,
|
|
524
|
+
[CONSENT_GROUP_NAME_FIELD]: (_group_name = group.name) != null ? _group_name : ''
|
|
525
|
+
} : {}, extra != null ? extra : {});
|
|
526
|
+
/*
|
|
527
|
+
* ONE ENTRY PER DISCLOSED SITE, rather than one entry the reader has to
|
|
528
|
+
* search for a group it belongs to.
|
|
529
|
+
*
|
|
530
|
+
* `byHost[hostId]` stays a lookup with no way to reach another controller's
|
|
531
|
+
* grant, which is the guarantee the whole model rests on. A single entry
|
|
532
|
+
* carrying a list of covered sites would make every read a search, and a
|
|
533
|
+
* search is something a caller can get wrong in exactly one direction: a
|
|
534
|
+
* dropped predicate still returns a grant, just somebody else's.
|
|
535
|
+
*/ return {
|
|
536
|
+
[MARKETING_CONSENT_BY_HOST_FIELD]: Object.fromEntries(group.hostIds.map((hostId)=>[
|
|
537
|
+
hostId,
|
|
538
|
+
entry
|
|
539
|
+
]))
|
|
540
|
+
};
|
|
541
|
+
}
|
|
542
|
+
/**
|
|
543
|
+
* The group-of-one convenience, for a writer that has a site and no org.
|
|
544
|
+
*
|
|
545
|
+
* Narrow by construction, which is the safe direction: a door that should
|
|
546
|
+
* have pooled and did not withholds mail, where a door that pooled without a
|
|
547
|
+
* disclosure sends it.
|
|
548
|
+
*/ export function marketingConsentFieldsForHost(hostId, atMs, extra) {
|
|
549
|
+
return marketingConsentFieldsForGroup(soloConsentGroup(hostId), atMs, extra);
|
|
550
|
+
}
|
|
551
|
+
/**
|
|
552
|
+
* The document fields that record a REFUSAL for one host.
|
|
553
|
+
*
|
|
554
|
+
* Separate from the grant helper because the two are not one function with a
|
|
555
|
+
* boolean. A refusal is written by the unsubscribe path and by the API's
|
|
556
|
+
* explicit `marketingConsent: false`, neither of which carries provenance a
|
|
557
|
+
* person supplied, and — unlike a grant — the pre-host field is still honored
|
|
558
|
+
* against every host, so the two are not symmetric anywhere in this module.
|
|
559
|
+
*
|
|
560
|
+
* @param extra fields stored on the entry beside the refusal — the console
|
|
561
|
+
* doors pass the person's own provenance here (AGL-3185), the
|
|
562
|
+
* same way the grant helper takes it.
|
|
563
|
+
*/ export function declineMarketingConsentFields(hostId, atMs, extra) {
|
|
564
|
+
if (!hostId) {
|
|
565
|
+
throw new Error('[marketing-consent] a refusal cannot be recorded for no host');
|
|
566
|
+
}
|
|
567
|
+
/*
|
|
568
|
+
* Written against the ONE site the person acted on, and read across
|
|
569
|
+
* whatever group that site is in at send time — see
|
|
570
|
+
* {@link readMarketingBasis}. Denormalizing a refusal the way a grant is
|
|
571
|
+
* denormalized would freeze it to the group as it stood, so a site joining
|
|
572
|
+
* the group later would mail somebody who had already left the sender.
|
|
573
|
+
*/ return {
|
|
574
|
+
[MARKETING_CONSENT_BY_HOST_FIELD]: {
|
|
575
|
+
[hostId]: _extends({
|
|
576
|
+
[MARKETING_CONSENT_FIELD]: false,
|
|
577
|
+
marketingConsentAtMs: atMs
|
|
578
|
+
}, extra != null ? extra : {})
|
|
579
|
+
}
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
/**
|
|
583
|
+
* The provenance a list membership's own basis field carries, or `null`.
|
|
584
|
+
*
|
|
585
|
+
* `'contact-opt-in'` returns `null` deliberately and is not merely unhandled:
|
|
586
|
+
* that value means the membership carries the PERSON's opt-in, passed through
|
|
587
|
+
* with their own timestamp, so it is the strongest available statement that
|
|
588
|
+
* nobody asserted anything on their behalf.
|
|
589
|
+
*
|
|
590
|
+
* `by` falls back to the empty string rather than refusing when the account
|
|
591
|
+
* is missing. `readConsentSource` refuses an unattributed operator because
|
|
592
|
+
* its field's only writer always fills one; here the fact being read is the
|
|
593
|
+
* BASIS, which is unambiguous on its own, and losing the whole attestation
|
|
594
|
+
* because the uid did not survive would report the row as a person's own
|
|
595
|
+
* opt-in — the one direction this must never fail in.
|
|
596
|
+
*/ function readAttestedBasis(record, basisAtMs) {
|
|
597
|
+
if (record[MARKETING_CONSENT_BASIS_FIELD] !== OPERATOR_ATTESTED_CONSENT_BASIS) return null;
|
|
598
|
+
const by = record['marketingConsentByUid'];
|
|
599
|
+
return {
|
|
600
|
+
kind: OPERATOR_ATTESTED_CONSENT_KIND,
|
|
601
|
+
by: typeof by === 'string' ? by : '',
|
|
602
|
+
atMs: basisAtMs,
|
|
603
|
+
reason: typeof record['marketingConsentReason'] === 'string' ? record['marketingConsentReason'] : ''
|
|
604
|
+
};
|
|
605
|
+
}
|
|
606
|
+
/**
|
|
607
|
+
* Parses the provenance field, or `null` when there is none to parse.
|
|
608
|
+
*
|
|
609
|
+
* A malformed value reads as `null` — the person's own act — rather than as
|
|
610
|
+
* a nameless operator assertion, because the only writer of this field is a
|
|
611
|
+
* script that always fills `kind` and `by`. Inventing an unattributed
|
|
612
|
+
* operator out of a corrupt value would put a claim in the audit trail that
|
|
613
|
+
* nothing in the product ever made.
|
|
614
|
+
*/ function readConsentSource(value) {
|
|
615
|
+
if (!value || typeof value !== 'object') return null;
|
|
616
|
+
const source = value;
|
|
617
|
+
const kind = typeof source['kind'] === 'string' ? source['kind'] : '';
|
|
618
|
+
const by = typeof source['by'] === 'string' ? source['by'] : '';
|
|
619
|
+
if (!kind || !by) return null;
|
|
620
|
+
// Only the two literals the type names; anything else reads as absent,
|
|
621
|
+
// which is the operator default — a malformed actor must not turn an
|
|
622
|
+
// assertion into the person's own act.
|
|
623
|
+
const actor = source['actor'] === 'person' || source['actor'] === 'operator' ? source['actor'] : undefined;
|
|
624
|
+
const textVersion = typeof source['textVersion'] === 'string' && source['textVersion'] ? source['textVersion'] : undefined;
|
|
625
|
+
return _extends({
|
|
626
|
+
kind,
|
|
627
|
+
by,
|
|
628
|
+
atMs: timestampMs(source['atMs']),
|
|
629
|
+
reason: typeof source['reason'] === 'string' ? source['reason'] : ''
|
|
630
|
+
}, actor ? {
|
|
631
|
+
actor
|
|
632
|
+
} : {}, textVersion ? {
|
|
633
|
+
textVersion
|
|
634
|
+
} : {});
|
|
635
|
+
}
|
|
636
|
+
/**
|
|
637
|
+
* Applies a policy to one record. Pure, and the only place the rule lives.
|
|
638
|
+
*
|
|
639
|
+
* ## Grandfathering is a claim about a CAPTURE, so it belongs to the capturer
|
|
640
|
+
*
|
|
641
|
+
* Under `'forward'`, a record with no basis stays reachable because it
|
|
642
|
+
* predates enforcement. That argument is made on behalf of the brand that
|
|
643
|
+
* collected the address — it had a relationship with this person before there
|
|
644
|
+
* was a checkbox to tick. A sister brand in the same agency has no such
|
|
645
|
+
* history and inherits none by sharing an address book, so a record captured
|
|
646
|
+
* by another host does not grandfather here. Where no host is attributed the
|
|
647
|
+
* argument has nobody to belong to and nobody to exclude, so it holds: the
|
|
648
|
+
* unknown leans toward reachable, exactly as a missing capture DATE does.
|
|
649
|
+
*
|
|
650
|
+
* ## A grant elsewhere ends grandfathering outright
|
|
651
|
+
*
|
|
652
|
+
* `otherGrant` is evidence that consent WAS collected for this person and
|
|
653
|
+
* that this host is not who it was given to. Grandfathering on top of that
|
|
654
|
+
* would let the agency case back in through the one door the policy leaves
|
|
655
|
+
* open, which is the same leak in a longer sentence.
|
|
656
|
+
*/ export function marketingConsentDecision(record, policy) {
|
|
657
|
+
if (record.basis === 'granted') {
|
|
658
|
+
return {
|
|
659
|
+
verdict: 'consented',
|
|
660
|
+
reason: 'granted'
|
|
661
|
+
};
|
|
662
|
+
}
|
|
663
|
+
if (record.basis === 'declined') {
|
|
664
|
+
return {
|
|
665
|
+
verdict: 'withheld',
|
|
666
|
+
reason: 'declined'
|
|
667
|
+
};
|
|
668
|
+
}
|
|
669
|
+
if (record.otherGrant !== 'none') {
|
|
670
|
+
return {
|
|
671
|
+
verdict: 'withheld',
|
|
672
|
+
reason: 'other-host'
|
|
673
|
+
};
|
|
674
|
+
}
|
|
675
|
+
if (policy.mode === 'strict') {
|
|
676
|
+
return {
|
|
677
|
+
verdict: 'withheld',
|
|
678
|
+
reason: 'no-basis'
|
|
679
|
+
};
|
|
680
|
+
}
|
|
681
|
+
/*
|
|
682
|
+
* A capture attributed only to sites outside this group. The
|
|
683
|
+
* grandfathering argument belongs to whoever collected the address; a
|
|
684
|
+
* sister brand inherits none of it by sharing an address book, while a
|
|
685
|
+
* fellow member of a declared group collected it alongside. An EMPTY list
|
|
686
|
+
* has nobody to belong to and nobody to exclude, so it falls through and
|
|
687
|
+
* grandfathers — the same direction a missing capture date leans.
|
|
688
|
+
*/ if (record.capturedByHostIds.length && !record.capturedByGroup) {
|
|
689
|
+
return {
|
|
690
|
+
verdict: 'withheld',
|
|
691
|
+
reason: 'other-host'
|
|
692
|
+
};
|
|
693
|
+
}
|
|
694
|
+
// `null` grandfathers: see MarketingConsentPolicy.enforceFromMs for why the
|
|
695
|
+
// unknown leans toward reachable.
|
|
696
|
+
if (record.capturedAtMs === null) {
|
|
697
|
+
return {
|
|
698
|
+
verdict: 'grandfathered',
|
|
699
|
+
reason: 'grandfathered'
|
|
700
|
+
};
|
|
701
|
+
}
|
|
702
|
+
return record.capturedAtMs >= policy.enforceFromMs ? {
|
|
703
|
+
verdict: 'withheld',
|
|
704
|
+
reason: 'not-grandfathered'
|
|
705
|
+
} : {
|
|
706
|
+
verdict: 'grandfathered',
|
|
707
|
+
reason: 'grandfathered'
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
/**
|
|
711
|
+
* The verdict alone, for the callers that only decide whether to send.
|
|
712
|
+
*
|
|
713
|
+
* Delegated rather than reimplemented so there is one rule and not two that
|
|
714
|
+
* agree today.
|
|
715
|
+
*/ export function marketingConsentVerdict(record, policy) {
|
|
716
|
+
return marketingConsentDecision(record, policy).verdict;
|
|
717
|
+
}
|
|
718
|
+
/**
|
|
719
|
+
* Splits an audience into who may be mailed and who may not, FOR ONE HOST.
|
|
720
|
+
*
|
|
721
|
+
* Returns counts rather than addresses for the reported populations: the
|
|
722
|
+
* console surface that shows this figure is telling a merchant how their
|
|
723
|
+
* audience divides, and handing back the withheld ADDRESSES would turn a
|
|
724
|
+
* consent readout into a way to export the people who declined.
|
|
725
|
+
*
|
|
726
|
+
* ## The host argument, and why a mismatch throws
|
|
727
|
+
*
|
|
728
|
+
* A consent map is built where the person documents are read and consumed
|
|
729
|
+
* somewhere else. Between those two points the host can be lost — a helper
|
|
730
|
+
* that takes one hostId and passes another, a cached map reused for a second
|
|
731
|
+
* site, a merge of two audiences. The result would be host A's grants
|
|
732
|
+
* deciding host B's send, silently and with every count still adding up.
|
|
733
|
+
*
|
|
734
|
+
* So the host is stated at both ends and compared. A mismatch is a wiring
|
|
735
|
+
* defect that no runtime value can produce, and it fails loudly rather than
|
|
736
|
+
* mailing somebody on a basis they gave to a different company. This is the
|
|
737
|
+
* same refusal `newResourceScopeFields` makes over an empty scope, for the
|
|
738
|
+
* same reason: a caller that computed the wrong thing is worth a stack trace.
|
|
739
|
+
*
|
|
740
|
+
* @param emails normalized, de-duplicated recipient addresses.
|
|
741
|
+
* @param records consent facts by address, every one read for `hostId`; a
|
|
742
|
+
* missing entry reads as a record-less address.
|
|
743
|
+
* @param hostId the site sending. Every record must have been read for it.
|
|
744
|
+
*/ export function splitByMarketingConsent(emails, records, policy, group) {
|
|
745
|
+
const { hostId } = group;
|
|
746
|
+
const split = {
|
|
747
|
+
mailable: [],
|
|
748
|
+
consented: 0,
|
|
749
|
+
consentedByOperator: 0,
|
|
750
|
+
grandfathered: 0,
|
|
751
|
+
withheld: 0,
|
|
752
|
+
withheldDeclined: 0,
|
|
753
|
+
withheldOtherHost: 0,
|
|
754
|
+
withheldNoBasis: 0
|
|
755
|
+
};
|
|
756
|
+
for (const email of emails){
|
|
757
|
+
var _records_get;
|
|
758
|
+
const record = (_records_get = records.get(email)) != null ? _records_get : readMarketingBasis(null, group);
|
|
759
|
+
if (record.hostId !== hostId || record.groupId !== group.groupId) {
|
|
760
|
+
throw new Error('[marketing-consent] a consent record read for ' + `${record.hostId}/${record.groupId} cannot decide a send from ` + `${hostId}/${group.groupId}`);
|
|
761
|
+
}
|
|
762
|
+
const decision = marketingConsentDecision(record, policy);
|
|
763
|
+
switch(decision.verdict){
|
|
764
|
+
case 'consented':
|
|
765
|
+
split.mailable.push(email);
|
|
766
|
+
split.consented += 1;
|
|
767
|
+
if (record.assertedBy === 'operator') split.consentedByOperator += 1;
|
|
768
|
+
break;
|
|
769
|
+
case 'grandfathered':
|
|
770
|
+
split.mailable.push(email);
|
|
771
|
+
split.grandfathered += 1;
|
|
772
|
+
break;
|
|
773
|
+
default:
|
|
774
|
+
split.withheld += 1;
|
|
775
|
+
if (decision.reason === 'declined') split.withheldDeclined += 1;
|
|
776
|
+
else if (decision.reason === 'other-host') split.withheldOtherHost += 1;
|
|
777
|
+
else split.withheldNoBasis += 1;
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
return split;
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
//# sourceMappingURL=marketing-consent.js.map
|