@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,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /**
|
|
17
|
+
* Marketing consent for the PLATFORM's own product email (AGL-3185).
|
|
18
|
+
*
|
|
19
|
+
* The strict policy (`marketing-consent.ts`) means a person with no declared
|
|
20
|
+
* basis is unsendable, and until this module the only doors that declared
|
|
21
|
+
* one were the marketing site's forms. Somebody who created a console account
|
|
22
|
+
* — the warmest audience the platform has — was never asked. Three console
|
|
23
|
+
* doors ask now: a checkbox on the sign-up form, a switch in the account
|
|
24
|
+
* preferences, and a one-time prompt for accounts that predate the checkbox.
|
|
25
|
+
*
|
|
26
|
+
* ## One wording, versioned
|
|
27
|
+
*
|
|
28
|
+
* Every door shows {@link PLATFORM_MARKETING_CONSENT_TEXT} and every record
|
|
29
|
+
* stores {@link PLATFORM_MARKETING_CONSENT_TEXT_VERSION} beside the exact
|
|
30
|
+
* timestamp, so "what did this person agree to" is answered by a version and
|
|
31
|
+
* not by whatever the checkbox says today. Changing the sentence is a bump of
|
|
32
|
+
* the version in the same edit.
|
|
33
|
+
*
|
|
34
|
+
* ## The record lives in two places, and the two do not disagree
|
|
35
|
+
*
|
|
36
|
+
* The decision is written by the server onto the person's own `users/{uid}`
|
|
37
|
+
* document, so the console can show a preference without reading the
|
|
38
|
+
* operator's CRM, and onto the operator's marketing contact for the same
|
|
39
|
+
* person, so the send path sees a declared basis with provenance. The
|
|
40
|
+
* contact half is written only when the deployment names a marketing host
|
|
41
|
+
* (`PLATFORM_MARKETING_HOST_ID`, read in `@aglyn/tenant-data-admin`); a
|
|
42
|
+
* self-hosted install with no audience of its own records the preference
|
|
43
|
+
* and skips the contact.
|
|
44
|
+
*
|
|
45
|
+
* ## Absence is not refusal
|
|
46
|
+
*
|
|
47
|
+
* An unticked sign-up checkbox records nothing. A switch turned off and a
|
|
48
|
+
* prompt answered "no" record a refusal, which the strict policy already
|
|
49
|
+
* honors. A prompt dismissed without an answer records only the dismissal,
|
|
50
|
+
* and the prompt stays away for {@link PLATFORM_MARKETING_PROMPT_SNOOZE_MS}.
|
|
51
|
+
*
|
|
52
|
+
* Pure and dependency-light on purpose: the sign-up page renders the text,
|
|
53
|
+
* the console route validates the body, and the server library writes the
|
|
54
|
+
* record, all from this one module.
|
|
55
|
+
*/ import { MARKETING_CONSENT_FIELD, MARKETING_CONSENT_SOURCE_FIELD } from "./marketing-consent.js";
|
|
56
|
+
import { PLATFORM_BRAND_NAME } from "./platform-brand.js";
|
|
57
|
+
/** The console doors a decision can come through, as the record names them. */ export const PLATFORM_MARKETING_CONSENT_SOURCE_KINDS = [
|
|
58
|
+
'console-signup',
|
|
59
|
+
'console-preferences',
|
|
60
|
+
'console-prompt'
|
|
61
|
+
];
|
|
62
|
+
export function isPlatformMarketingConsentSourceKind(value) {
|
|
63
|
+
return PLATFORM_MARKETING_CONSENT_SOURCE_KINDS.includes(value);
|
|
64
|
+
}
|
|
65
|
+
/** What a door records: a grant or a refusal. Absence is never recorded. */ export const PLATFORM_MARKETING_CONSENT_DECISIONS = [
|
|
66
|
+
'granted',
|
|
67
|
+
'declined'
|
|
68
|
+
];
|
|
69
|
+
export function isPlatformMarketingConsentDecision(value) {
|
|
70
|
+
return PLATFORM_MARKETING_CONSENT_DECISIONS.includes(value);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* The version of the consent wording every door shows. Bumped in the same
|
|
74
|
+
* edit as {@link platformMarketingConsentText}; a record stores the version
|
|
75
|
+
* it was shown under, so the two must move together.
|
|
76
|
+
*/ export const PLATFORM_MARKETING_CONSENT_TEXT_VERSION = '2026-09-20';
|
|
77
|
+
/**
|
|
78
|
+
* The sentence the person agrees to, with the deployment's brand in it.
|
|
79
|
+
*
|
|
80
|
+
* Affirmative and standalone: it names what is sent, who sends it, and that
|
|
81
|
+
* it can be stopped — never bundled with the terms acceptance, and never
|
|
82
|
+
* pre-ticked anywhere it is rendered.
|
|
83
|
+
*/ export function platformMarketingConsentText(brandName) {
|
|
84
|
+
return `Send me product updates from ${brandName}. You can opt out any time.`;
|
|
85
|
+
}
|
|
86
|
+
/** {@link platformMarketingConsentText} for the brand this deployment wears. */ export const PLATFORM_MARKETING_CONSENT_TEXT = platformMarketingConsentText(PLATFORM_BRAND_NAME);
|
|
87
|
+
/**
|
|
88
|
+
* The `users/{uid}` fields the decision is mirrored onto.
|
|
89
|
+
*
|
|
90
|
+
* The same names the contact record uses for the same facts, so one reader
|
|
91
|
+
* can parse either document. The prompt-dismissal stamp has no contact
|
|
92
|
+
* counterpart: it is about what the console asked, not what the person
|
|
93
|
+
* agreed to.
|
|
94
|
+
*/ export const USER_MARKETING_CONSENT_FIELD = MARKETING_CONSENT_FIELD;
|
|
95
|
+
export const USER_MARKETING_CONSENT_AT_FIELD = 'marketingConsentAtMs';
|
|
96
|
+
export const USER_MARKETING_CONSENT_SOURCE_FIELD = MARKETING_CONSENT_SOURCE_FIELD;
|
|
97
|
+
export const USER_MARKETING_PROMPT_DISMISSED_AT_FIELD = 'marketingConsentPromptDismissedAtMs';
|
|
98
|
+
/** How long a dismissed prompt stays away: ninety days. */ export const PLATFORM_MARKETING_PROMPT_SNOOZE_MS = 90 * 24 * 60 * 60 * 1000;
|
|
99
|
+
function finiteOrNull(value) {
|
|
100
|
+
return typeof value === 'number' && Number.isFinite(value) ? value : null;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Reads the decision off a `users/{uid}` document, or off no document.
|
|
104
|
+
*
|
|
105
|
+
* Every unusable value reads as its absent case rather than throwing: a
|
|
106
|
+
* malformed field must degrade to "nothing recorded", which asks again,
|
|
107
|
+
* never to a grant.
|
|
108
|
+
*/ export function readPlatformMarketingConsent(document) {
|
|
109
|
+
const consent = document == null ? void 0 : document[USER_MARKETING_CONSENT_FIELD];
|
|
110
|
+
const rawSource = document == null ? void 0 : document[USER_MARKETING_CONSENT_SOURCE_FIELD];
|
|
111
|
+
const source = rawSource && typeof rawSource === 'object' && !Array.isArray(rawSource) ? rawSource : null;
|
|
112
|
+
const textVersion = source == null ? void 0 : source['textVersion'];
|
|
113
|
+
return {
|
|
114
|
+
decision: consent === true ? 'granted' : consent === false ? 'declined' : null,
|
|
115
|
+
atMs: finiteOrNull(document == null ? void 0 : document[USER_MARKETING_CONSENT_AT_FIELD]),
|
|
116
|
+
textVersion: typeof textVersion === 'string' && textVersion ? textVersion : null,
|
|
117
|
+
sourceKind: isPlatformMarketingConsentSourceKind(source == null ? void 0 : source['kind']) ? source['kind'] : null,
|
|
118
|
+
promptDismissedAtMs: finiteOrNull(document == null ? void 0 : document[USER_MARKETING_PROMPT_DISMISSED_AT_FIELD])
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Whether the console should ask this person now.
|
|
123
|
+
*
|
|
124
|
+
* Never after a decision, in either direction: a "no" is an answer and a
|
|
125
|
+
* "yes" needs no repeating. A dismissal is not an answer, so the prompt
|
|
126
|
+
* returns once the snooze has run out.
|
|
127
|
+
*/ export function platformMarketingPromptDue(state, nowMs) {
|
|
128
|
+
if (state.decision !== null) return false;
|
|
129
|
+
if (state.promptDismissedAtMs === null) return true;
|
|
130
|
+
return nowMs - state.promptDismissedAtMs >= PLATFORM_MARKETING_PROMPT_SNOOZE_MS;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* What each door did, in prose, for whoever audits the record later.
|
|
134
|
+
*
|
|
135
|
+
* Keyed by door and decision so the sentence is decided once, here, and the
|
|
136
|
+
* three doors cannot describe the same act three different ways.
|
|
137
|
+
*/ const PROVENANCE_REASONS = {
|
|
138
|
+
'console-signup': {
|
|
139
|
+
granted: 'Ticked the product-updates checkbox on the console sign-up form.',
|
|
140
|
+
declined: 'Declined product updates on the console sign-up form.'
|
|
141
|
+
},
|
|
142
|
+
'console-preferences': {
|
|
143
|
+
granted: 'Turned product updates on in the console account preferences.',
|
|
144
|
+
declined: 'Turned product updates off in the console account preferences.'
|
|
145
|
+
},
|
|
146
|
+
'console-prompt': {
|
|
147
|
+
granted: 'Answered yes to the product-updates prompt in the console.',
|
|
148
|
+
declined: 'Answered no to the product-updates prompt in the console.'
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
/**
|
|
152
|
+
* The provenance stored with a console decision, on both documents.
|
|
153
|
+
*
|
|
154
|
+
* `actor: 'person'` is what keeps {@link MarketingConsentSource} honest here:
|
|
155
|
+
* the reader treats provenance as an operator's assertion unless it says
|
|
156
|
+
* otherwise, and this is the person's own click, carrying which door and
|
|
157
|
+
* which wording. `by` is the account that clicked — the subject and the
|
|
158
|
+
* actor are the same human, which is the fact the field records.
|
|
159
|
+
*/ export function platformMarketingConsentSource(input) {
|
|
160
|
+
return {
|
|
161
|
+
kind: input.kind,
|
|
162
|
+
by: input.uid,
|
|
163
|
+
atMs: input.atMs,
|
|
164
|
+
reason: PROVENANCE_REASONS[input.kind][input.decision],
|
|
165
|
+
textVersion: input.textVersion,
|
|
166
|
+
actor: 'person'
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The `users/{uid}` fields a decision writes, as one merge-able object.
|
|
171
|
+
*
|
|
172
|
+
* `false` for a refusal, not a deleted field: absence is the third state and
|
|
173
|
+
* means "never asked", which a person who said no must never read as again.
|
|
174
|
+
*/ export function platformMarketingUserFields(input) {
|
|
175
|
+
return {
|
|
176
|
+
[USER_MARKETING_CONSENT_FIELD]: input.decision === 'granted',
|
|
177
|
+
[USER_MARKETING_CONSENT_AT_FIELD]: input.atMs,
|
|
178
|
+
[USER_MARKETING_CONSENT_SOURCE_FIELD]: input.source
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
//# sourceMappingURL=platform-marketing-consent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/platform-marketing-consent.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Marketing consent for the PLATFORM's own product email (AGL-3185).\n *\n * The strict policy (`marketing-consent.ts`) means a person with no declared\n * basis is unsendable, and until this module the only doors that declared\n * one were the marketing site's forms. Somebody who created a console account\n * — the warmest audience the platform has — was never asked. Three console\n * doors ask now: a checkbox on the sign-up form, a switch in the account\n * preferences, and a one-time prompt for accounts that predate the checkbox.\n *\n * ## One wording, versioned\n *\n * Every door shows {@link PLATFORM_MARKETING_CONSENT_TEXT} and every record\n * stores {@link PLATFORM_MARKETING_CONSENT_TEXT_VERSION} beside the exact\n * timestamp, so \"what did this person agree to\" is answered by a version and\n * not by whatever the checkbox says today. Changing the sentence is a bump of\n * the version in the same edit.\n *\n * ## The record lives in two places, and the two do not disagree\n *\n * The decision is written by the server onto the person's own `users/{uid}`\n * document, so the console can show a preference without reading the\n * operator's CRM, and onto the operator's marketing contact for the same\n * person, so the send path sees a declared basis with provenance. The\n * contact half is written only when the deployment names a marketing host\n * (`PLATFORM_MARKETING_HOST_ID`, read in `@aglyn/tenant-data-admin`); a\n * self-hosted install with no audience of its own records the preference\n * and skips the contact.\n *\n * ## Absence is not refusal\n *\n * An unticked sign-up checkbox records nothing. A switch turned off and a\n * prompt answered \"no\" record a refusal, which the strict policy already\n * honors. A prompt dismissed without an answer records only the dismissal,\n * and the prompt stays away for {@link PLATFORM_MARKETING_PROMPT_SNOOZE_MS}.\n *\n * Pure and dependency-light on purpose: the sign-up page renders the text,\n * the console route validates the body, and the server library writes the\n * record, all from this one module.\n */\n\nimport {\n MARKETING_CONSENT_FIELD,\n MARKETING_CONSENT_SOURCE_FIELD,\n type MarketingConsentSource,\n} from './marketing-consent'\nimport { PLATFORM_BRAND_NAME } from './platform-brand'\n\n/** The console doors a decision can come through, as the record names them. */\nexport const PLATFORM_MARKETING_CONSENT_SOURCE_KINDS = [\n 'console-signup',\n 'console-preferences',\n 'console-prompt',\n] as const\n\nexport type PlatformMarketingConsentSourceKind =\n (typeof PLATFORM_MARKETING_CONSENT_SOURCE_KINDS)[number]\n\nexport function isPlatformMarketingConsentSourceKind(\n value: unknown,\n): value is PlatformMarketingConsentSourceKind {\n return (PLATFORM_MARKETING_CONSENT_SOURCE_KINDS as readonly unknown[]).includes(\n value,\n )\n}\n\n/** What a door records: a grant or a refusal. Absence is never recorded. */\nexport const PLATFORM_MARKETING_CONSENT_DECISIONS = ['granted', 'declined'] as const\n\nexport type PlatformMarketingConsentDecision =\n (typeof PLATFORM_MARKETING_CONSENT_DECISIONS)[number]\n\nexport function isPlatformMarketingConsentDecision(\n value: unknown,\n): value is PlatformMarketingConsentDecision {\n return (PLATFORM_MARKETING_CONSENT_DECISIONS as readonly unknown[]).includes(\n value,\n )\n}\n\n/**\n * The version of the consent wording every door shows. Bumped in the same\n * edit as {@link platformMarketingConsentText}; a record stores the version\n * it was shown under, so the two must move together.\n */\nexport const PLATFORM_MARKETING_CONSENT_TEXT_VERSION = '2026-09-20'\n\n/**\n * The sentence the person agrees to, with the deployment's brand in it.\n *\n * Affirmative and standalone: it names what is sent, who sends it, and that\n * it can be stopped — never bundled with the terms acceptance, and never\n * pre-ticked anywhere it is rendered.\n */\nexport function platformMarketingConsentText(brandName: string): string {\n return `Send me product updates from ${brandName}. You can opt out any time.`\n}\n\n/** {@link platformMarketingConsentText} for the brand this deployment wears. */\nexport const PLATFORM_MARKETING_CONSENT_TEXT = platformMarketingConsentText(\n PLATFORM_BRAND_NAME,\n)\n\n/**\n * The `users/{uid}` fields the decision is mirrored onto.\n *\n * The same names the contact record uses for the same facts, so one reader\n * can parse either document. The prompt-dismissal stamp has no contact\n * counterpart: it is about what the console asked, not what the person\n * agreed to.\n */\nexport const USER_MARKETING_CONSENT_FIELD = MARKETING_CONSENT_FIELD\nexport const USER_MARKETING_CONSENT_AT_FIELD = 'marketingConsentAtMs'\nexport const USER_MARKETING_CONSENT_SOURCE_FIELD = MARKETING_CONSENT_SOURCE_FIELD\nexport const USER_MARKETING_PROMPT_DISMISSED_AT_FIELD =\n 'marketingConsentPromptDismissedAtMs'\n\n/** How long a dismissed prompt stays away: ninety days. */\nexport const PLATFORM_MARKETING_PROMPT_SNOOZE_MS = 90 * 24 * 60 * 60 * 1000\n\n/** What the person's own document says about product email. */\nexport interface PlatformMarketingConsentState {\n /** `null` when nothing has been recorded — asked, but not answered. */\n decision: PlatformMarketingConsentDecision | null\n /** When the decision was recorded. */\n atMs: number | null\n /** The wording version the decision was made under. */\n textVersion: string | null\n /** Which console door recorded it; `null` for a record another writer left. */\n sourceKind: PlatformMarketingConsentSourceKind | null\n /** When the prompt was last dismissed without an answer. */\n promptDismissedAtMs: number | null\n}\n\nfunction finiteOrNull(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\n/**\n * Reads the decision off a `users/{uid}` document, or off no document.\n *\n * Every unusable value reads as its absent case rather than throwing: a\n * malformed field must degrade to \"nothing recorded\", which asks again,\n * never to a grant.\n */\nexport function readPlatformMarketingConsent(\n document: Record<string, unknown> | null | undefined,\n): PlatformMarketingConsentState {\n const consent = document?.[USER_MARKETING_CONSENT_FIELD]\n const rawSource = document?.[USER_MARKETING_CONSENT_SOURCE_FIELD]\n const source =\n rawSource && typeof rawSource === 'object' && !Array.isArray(rawSource)\n ? (rawSource as Record<string, unknown>)\n : null\n const textVersion = source?.['textVersion']\n return {\n decision: consent === true ? 'granted' : consent === false ? 'declined' : null,\n atMs: finiteOrNull(document?.[USER_MARKETING_CONSENT_AT_FIELD]),\n textVersion:\n typeof textVersion === 'string' && textVersion ? textVersion : null,\n sourceKind: isPlatformMarketingConsentSourceKind(source?.['kind'])\n ? source['kind']\n : null,\n promptDismissedAtMs: finiteOrNull(\n document?.[USER_MARKETING_PROMPT_DISMISSED_AT_FIELD],\n ),\n }\n}\n\n/**\n * Whether the console should ask this person now.\n *\n * Never after a decision, in either direction: a \"no\" is an answer and a\n * \"yes\" needs no repeating. A dismissal is not an answer, so the prompt\n * returns once the snooze has run out.\n */\nexport function platformMarketingPromptDue(\n state: Pick<PlatformMarketingConsentState, 'decision' | 'promptDismissedAtMs'>,\n nowMs: number,\n): boolean {\n if (state.decision !== null) return false\n if (state.promptDismissedAtMs === null) return true\n return nowMs - state.promptDismissedAtMs >= PLATFORM_MARKETING_PROMPT_SNOOZE_MS\n}\n\n/**\n * What each door did, in prose, for whoever audits the record later.\n *\n * Keyed by door and decision so the sentence is decided once, here, and the\n * three doors cannot describe the same act three different ways.\n */\nconst PROVENANCE_REASONS: Record<\n PlatformMarketingConsentSourceKind,\n Record<PlatformMarketingConsentDecision, string>\n> = {\n 'console-signup': {\n granted: 'Ticked the product-updates checkbox on the console sign-up form.',\n declined: 'Declined product updates on the console sign-up form.',\n },\n 'console-preferences': {\n granted: 'Turned product updates on in the console account preferences.',\n declined: 'Turned product updates off in the console account preferences.',\n },\n 'console-prompt': {\n granted: 'Answered yes to the product-updates prompt in the console.',\n declined: 'Answered no to the product-updates prompt in the console.',\n },\n}\n\n/**\n * The provenance stored with a console decision, on both documents.\n *\n * `actor: 'person'` is what keeps {@link MarketingConsentSource} honest here:\n * the reader treats provenance as an operator's assertion unless it says\n * otherwise, and this is the person's own click, carrying which door and\n * which wording. `by` is the account that clicked — the subject and the\n * actor are the same human, which is the fact the field records.\n */\nexport function platformMarketingConsentSource(input: {\n kind: PlatformMarketingConsentSourceKind\n decision: PlatformMarketingConsentDecision\n uid: string\n atMs: number\n textVersion: string\n}): MarketingConsentSource {\n return {\n kind: input.kind,\n by: input.uid,\n atMs: input.atMs,\n reason: PROVENANCE_REASONS[input.kind][input.decision],\n textVersion: input.textVersion,\n actor: 'person',\n }\n}\n\n/**\n * The `users/{uid}` fields a decision writes, as one merge-able object.\n *\n * `false` for a refusal, not a deleted field: absence is the third state and\n * means \"never asked\", which a person who said no must never read as again.\n */\nexport function platformMarketingUserFields(input: {\n decision: PlatformMarketingConsentDecision\n atMs: number\n source: MarketingConsentSource\n}): Record<string, unknown> {\n return {\n [USER_MARKETING_CONSENT_FIELD]: input.decision === 'granted',\n [USER_MARKETING_CONSENT_AT_FIELD]: input.atMs,\n [USER_MARKETING_CONSENT_SOURCE_FIELD]: input.source,\n }\n}\n"],"names":["MARKETING_CONSENT_FIELD","MARKETING_CONSENT_SOURCE_FIELD","PLATFORM_BRAND_NAME","PLATFORM_MARKETING_CONSENT_SOURCE_KINDS","isPlatformMarketingConsentSourceKind","value","includes","PLATFORM_MARKETING_CONSENT_DECISIONS","isPlatformMarketingConsentDecision","PLATFORM_MARKETING_CONSENT_TEXT_VERSION","platformMarketingConsentText","brandName","PLATFORM_MARKETING_CONSENT_TEXT","USER_MARKETING_CONSENT_FIELD","USER_MARKETING_CONSENT_AT_FIELD","USER_MARKETING_CONSENT_SOURCE_FIELD","USER_MARKETING_PROMPT_DISMISSED_AT_FIELD","PLATFORM_MARKETING_PROMPT_SNOOZE_MS","finiteOrNull","Number","isFinite","readPlatformMarketingConsent","document","consent","rawSource","source","Array","isArray","textVersion","decision","atMs","sourceKind","promptDismissedAtMs","platformMarketingPromptDue","state","nowMs","PROVENANCE_REASONS","granted","declined","platformMarketingConsentSource","input","kind","by","uid","reason","actor","platformMarketingUserFields"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuCC,GAED,SACEA,uBAAuB,EACvBC,8BAA8B,QAEzB,yBAAqB;AAC5B,SAASC,mBAAmB,QAAQ,sBAAkB;AAEtD,6EAA6E,GAC7E,OAAO,MAAMC,0CAA0C;IACrD;IACA;IACA;CACD,CAAS;AAKV,OAAO,SAASC,qCACdC,KAAc;IAEd,OAAO,AAACF,wCAA+DG,QAAQ,CAC7ED;AAEJ;AAEA,0EAA0E,GAC1E,OAAO,MAAME,uCAAuC;IAAC;IAAW;CAAW,CAAS;AAKpF,OAAO,SAASC,mCACdH,KAAc;IAEd,OAAO,AAACE,qCAA4DD,QAAQ,CAC1ED;AAEJ;AAEA;;;;CAIC,GACD,OAAO,MAAMI,0CAA0C,aAAY;AAEnE;;;;;;CAMC,GACD,OAAO,SAASC,6BAA6BC,SAAiB;IAC5D,OAAO,CAAC,6BAA6B,EAAEA,UAAU,2BAA2B,CAAC;AAC/E;AAEA,8EAA8E,GAC9E,OAAO,MAAMC,kCAAkCF,6BAC7CR,qBACD;AAED;;;;;;;CAOC,GACD,OAAO,MAAMW,+BAA+Bb,wBAAuB;AACnE,OAAO,MAAMc,kCAAkC,uBAAsB;AACrE,OAAO,MAAMC,sCAAsCd,+BAA8B;AACjF,OAAO,MAAMe,2CACX,sCAAqC;AAEvC,yDAAyD,GACzD,OAAO,MAAMC,sCAAsC,KAAK,KAAK,KAAK,KAAK,KAAI;AAgB3E,SAASC,aAAab,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYc,OAAOC,QAAQ,CAACf,SAASA,QAAQ;AACvE;AAEA;;;;;;CAMC,GACD,OAAO,SAASgB,6BACdC,QAAoD;IAEpD,MAAMC,UAAUD,4BAAAA,QAAU,CAACT,6BAA6B;IACxD,MAAMW,YAAYF,4BAAAA,QAAU,CAACP,oCAAoC;IACjE,MAAMU,SACJD,aAAa,OAAOA,cAAc,YAAY,CAACE,MAAMC,OAAO,CAACH,aACxDA,YACD;IACN,MAAMI,cAAcH,0BAAAA,MAAQ,CAAC,cAAc;IAC3C,OAAO;QACLI,UAAUN,YAAY,OAAO,YAAYA,YAAY,QAAQ,aAAa;QAC1EO,MAAMZ,aAAaI,4BAAAA,QAAU,CAACR,gCAAgC;QAC9Dc,aACE,OAAOA,gBAAgB,YAAYA,cAAcA,cAAc;QACjEG,YAAY3B,qCAAqCqB,0BAAAA,MAAQ,CAAC,OAAO,IAC7DA,MAAM,CAAC,OAAO,GACd;QACJO,qBAAqBd,aACnBI,4BAAAA,QAAU,CAACN,yCAAyC;IAExD;AACF;AAEA;;;;;;CAMC,GACD,OAAO,SAASiB,2BACdC,KAA8E,EAC9EC,KAAa;IAEb,IAAID,MAAML,QAAQ,KAAK,MAAM,OAAO;IACpC,IAAIK,MAAMF,mBAAmB,KAAK,MAAM,OAAO;IAC/C,OAAOG,QAAQD,MAAMF,mBAAmB,IAAIf;AAC9C;AAEA;;;;;CAKC,GACD,MAAMmB,qBAGF;IACF,kBAAkB;QAChBC,SAAS;QACTC,UAAU;IACZ;IACA,uBAAuB;QACrBD,SAAS;QACTC,UAAU;IACZ;IACA,kBAAkB;QAChBD,SAAS;QACTC,UAAU;IACZ;AACF;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASC,+BAA+BC,KAM9C;IACC,OAAO;QACLC,MAAMD,MAAMC,IAAI;QAChBC,IAAIF,MAAMG,GAAG;QACbb,MAAMU,MAAMV,IAAI;QAChBc,QAAQR,kBAAkB,CAACI,MAAMC,IAAI,CAAC,CAACD,MAAMX,QAAQ,CAAC;QACtDD,aAAaY,MAAMZ,WAAW;QAC9BiB,OAAO;IACT;AACF;AAEA;;;;;CAKC,GACD,OAAO,SAASC,4BAA4BN,KAI3C;IACC,OAAO;QACL,CAAC3B,6BAA6B,EAAE2B,MAAMX,QAAQ,KAAK;QACnD,CAACf,gCAAgC,EAAE0B,MAAMV,IAAI;QAC7C,CAACf,oCAAoC,EAAEyB,MAAMf,MAAM;IACrD;AACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { type VisitorConsentHost } from './visitor-consent';
|
|
18
|
+
/**
|
|
19
|
+
* The platform's own GA4 property. Public in every page the platform serves,
|
|
20
|
+
* so holding it in source discloses nothing.
|
|
21
|
+
*
|
|
22
|
+
* Hoisted out of `site-analytics.tsx` so the two behaviours already
|
|
23
|
+
* keyed on it and the advertising gate cannot drift onto different literals.
|
|
24
|
+
*/
|
|
25
|
+
export declare const PLATFORM_GA_MEASUREMENT_ID = "G-YW5PG16YTM";
|
|
26
|
+
/**
|
|
27
|
+
* Whether this resolved tenant host is Aglyn's own marketing site.
|
|
28
|
+
*
|
|
29
|
+
* `false` for every customer site, for every self-hosted deployment, and for
|
|
30
|
+
* an absent or malformed host document. The default is the safe one in the
|
|
31
|
+
* sense that matters: a feature scoped by this predicate does not run.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isPlatformMarketingHost(host: VisitorConsentHost | null | undefined): boolean;
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /**
|
|
17
|
+
* "Is this host AGLYN'S OWN marketing site, or a customer's?"
|
|
18
|
+
*
|
|
19
|
+
* `aglyn.com` is an ordinary tenant site on the platform — Firestore host
|
|
20
|
+
* `aglyn-marketing`, `cname: aglyn.com`, resolved through the `default:`
|
|
21
|
+
* custom-domain branch of `apps/tenant/middleware.ts`, which has no
|
|
22
|
+
* `aglyn.com` case at all. Nothing in the routing layer knows it is ours, and
|
|
23
|
+
* that is deliberate: the marketing site is dogfood, served by exactly the
|
|
24
|
+
* code a customer gets.
|
|
25
|
+
*
|
|
26
|
+
* So a feature that must run on our own site and NOWHERE else needs a
|
|
27
|
+
* discriminator, and this is the one the codebase already had.
|
|
28
|
+
*
|
|
29
|
+
* ## The mechanism: the GA4 property, not a hostname
|
|
30
|
+
*
|
|
31
|
+
* `site-analytics.tsx` has shipped this test twice already — for the
|
|
32
|
+
* marketing `content_group` axis (AGL-1857) and for the internal
|
|
33
|
+
* `traffic_type` stamp (AGL-2064) — with the argument written out both times:
|
|
34
|
+
* a customer's site configures its own measurement id, so **same-property IS
|
|
35
|
+
* the definition of "this is our surface"**. The id lived as a private
|
|
36
|
+
* constant in that file; it is hoisted here so the third reader shares the
|
|
37
|
+
* one definition rather than retyping the literal beside it.
|
|
38
|
+
*
|
|
39
|
+
* Reusing it buys three things a hostname literal would not:
|
|
40
|
+
*
|
|
41
|
+
* - **No new hardcoded host.** `selfhost-hardcoded-hosts.spec.ts` (AGL-2195)
|
|
42
|
+
* ratchets every `aglyn.(app|com|io)` occurrence in runtime source with an
|
|
43
|
+
* exact per-file count. A measurement id is not a hostname, so this module
|
|
44
|
+
* adds nothing to that allowlist and nothing for a self-hoster to edit.
|
|
45
|
+
* - **It is DATA, not a build constant.** The verdict is a property of the
|
|
46
|
+
* resolved host document. A self-hosted or white-label deployment points its
|
|
47
|
+
* sites at its own GA property and can never match, no matter what domain it
|
|
48
|
+
* serves — which is the correct answer, since it is not our marketing site.
|
|
49
|
+
* - **It cannot be claimed by a customer.** `gaMeasurementId` is customer
|
|
50
|
+
* writable, so in principle a customer could type our id into their own
|
|
51
|
+
* site's analytics field. {@link isAglynOperatedBrand} does not close that,
|
|
52
|
+
* and neither would a hostname check on a `cname` a customer also controls.
|
|
53
|
+
* What closes it is that this predicate only ever ADDS an Aglyn-owned tag to
|
|
54
|
+
* an Aglyn-owned property: the worst a customer achieves by pasting our id
|
|
55
|
+
* is polluting our own analytics, which they can already do and which
|
|
56
|
+
* AGL-2064's stamp exists to filter. It grants them nothing and exposes no
|
|
57
|
+
* Customer Personal Data — see `advertising-tags.ts` for why that boundary
|
|
58
|
+
* is the one that actually matters here.
|
|
59
|
+
*
|
|
60
|
+
* ## Why the brand check too
|
|
61
|
+
*
|
|
62
|
+
* Belt and braces for the self-host shape. A Docker operator who forked the
|
|
63
|
+
* repo keeps the literal below in their build; {@link isAglynOperatedBrand}
|
|
64
|
+
* is false the moment they set `NEXT_PUBLIC_PLATFORM_BRAND_NAME`, so the
|
|
65
|
+
* predicate is false for them even if a host document somehow carried our id.
|
|
66
|
+
* Two independent conditions, and the cheaper one is not the load-bearing one.
|
|
67
|
+
*
|
|
68
|
+
* ## What this deliberately does NOT decide
|
|
69
|
+
*
|
|
70
|
+
* Anything about the CONSOLE or the DOCS site. All three of Aglyn's domains
|
|
71
|
+
* report to this same GA4 property, so the id alone does not separate
|
|
72
|
+
* marketing from `app.aglyn.com`. It does not have to: this predicate takes a
|
|
73
|
+
* tenant HOST DOCUMENT, and the console and the docs site have none — neither
|
|
74
|
+
* is served by the tenant runtime and neither renders `SiteAnalytics`. The
|
|
75
|
+
* separation there is structural (no mount point), not a matter of this
|
|
76
|
+
* function getting it right.
|
|
77
|
+
*/ import { isAglynOperatedBrand } from "./platform-brand.js";
|
|
78
|
+
import { resolveGaMeasurementId } from "./visitor-consent.js";
|
|
79
|
+
/**
|
|
80
|
+
* The platform's own GA4 property. Public in every page the platform serves,
|
|
81
|
+
* so holding it in source discloses nothing.
|
|
82
|
+
*
|
|
83
|
+
* Hoisted out of `site-analytics.tsx` so the two behaviours already
|
|
84
|
+
* keyed on it and the advertising gate cannot drift onto different literals.
|
|
85
|
+
*/ export const PLATFORM_GA_MEASUREMENT_ID = 'G-YW5PG16YTM';
|
|
86
|
+
/**
|
|
87
|
+
* Whether this resolved tenant host is Aglyn's own marketing site.
|
|
88
|
+
*
|
|
89
|
+
* `false` for every customer site, for every self-hosted deployment, and for
|
|
90
|
+
* an absent or malformed host document. The default is the safe one in the
|
|
91
|
+
* sense that matters: a feature scoped by this predicate does not run.
|
|
92
|
+
*/ export function isPlatformMarketingHost(host) {
|
|
93
|
+
if (isAglynOperatedBrand() === false) return false;
|
|
94
|
+
return resolveGaMeasurementId(host) === PLATFORM_GA_MEASUREMENT_ID;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=platform-marketing-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/platform-marketing-host.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * \"Is this host AGLYN'S OWN marketing site, or a customer's?\"\n *\n * `aglyn.com` is an ordinary tenant site on the platform — Firestore host\n * `aglyn-marketing`, `cname: aglyn.com`, resolved through the `default:`\n * custom-domain branch of `apps/tenant/middleware.ts`, which has no\n * `aglyn.com` case at all. Nothing in the routing layer knows it is ours, and\n * that is deliberate: the marketing site is dogfood, served by exactly the\n * code a customer gets.\n *\n * So a feature that must run on our own site and NOWHERE else needs a\n * discriminator, and this is the one the codebase already had.\n *\n * ## The mechanism: the GA4 property, not a hostname\n *\n * `site-analytics.tsx` has shipped this test twice already — for the\n * marketing `content_group` axis (AGL-1857) and for the internal\n * `traffic_type` stamp (AGL-2064) — with the argument written out both times:\n * a customer's site configures its own measurement id, so **same-property IS\n * the definition of \"this is our surface\"**. The id lived as a private\n * constant in that file; it is hoisted here so the third reader shares the\n * one definition rather than retyping the literal beside it.\n *\n * Reusing it buys three things a hostname literal would not:\n *\n * - **No new hardcoded host.** `selfhost-hardcoded-hosts.spec.ts` (AGL-2195)\n * ratchets every `aglyn.(app|com|io)` occurrence in runtime source with an\n * exact per-file count. A measurement id is not a hostname, so this module\n * adds nothing to that allowlist and nothing for a self-hoster to edit.\n * - **It is DATA, not a build constant.** The verdict is a property of the\n * resolved host document. A self-hosted or white-label deployment points its\n * sites at its own GA property and can never match, no matter what domain it\n * serves — which is the correct answer, since it is not our marketing site.\n * - **It cannot be claimed by a customer.** `gaMeasurementId` is customer\n * writable, so in principle a customer could type our id into their own\n * site's analytics field. {@link isAglynOperatedBrand} does not close that,\n * and neither would a hostname check on a `cname` a customer also controls.\n * What closes it is that this predicate only ever ADDS an Aglyn-owned tag to\n * an Aglyn-owned property: the worst a customer achieves by pasting our id\n * is polluting our own analytics, which they can already do and which\n * AGL-2064's stamp exists to filter. It grants them nothing and exposes no\n * Customer Personal Data — see `advertising-tags.ts` for why that boundary\n * is the one that actually matters here.\n *\n * ## Why the brand check too\n *\n * Belt and braces for the self-host shape. A Docker operator who forked the\n * repo keeps the literal below in their build; {@link isAglynOperatedBrand}\n * is false the moment they set `NEXT_PUBLIC_PLATFORM_BRAND_NAME`, so the\n * predicate is false for them even if a host document somehow carried our id.\n * Two independent conditions, and the cheaper one is not the load-bearing one.\n *\n * ## What this deliberately does NOT decide\n *\n * Anything about the CONSOLE or the DOCS site. All three of Aglyn's domains\n * report to this same GA4 property, so the id alone does not separate\n * marketing from `app.aglyn.com`. It does not have to: this predicate takes a\n * tenant HOST DOCUMENT, and the console and the docs site have none — neither\n * is served by the tenant runtime and neither renders `SiteAnalytics`. The\n * separation there is structural (no mount point), not a matter of this\n * function getting it right.\n */\n\nimport { isAglynOperatedBrand } from './platform-brand'\nimport {\n resolveGaMeasurementId,\n type VisitorConsentHost,\n} from './visitor-consent'\n\n/**\n * The platform's own GA4 property. Public in every page the platform serves,\n * so holding it in source discloses nothing.\n *\n * Hoisted out of `site-analytics.tsx` so the two behaviours already\n * keyed on it and the advertising gate cannot drift onto different literals.\n */\nexport const PLATFORM_GA_MEASUREMENT_ID = 'G-YW5PG16YTM'\n\n/**\n * Whether this resolved tenant host is Aglyn's own marketing site.\n *\n * `false` for every customer site, for every self-hosted deployment, and for\n * an absent or malformed host document. The default is the safe one in the\n * sense that matters: a feature scoped by this predicate does not run.\n */\nexport function isPlatformMarketingHost(\n host: VisitorConsentHost | null | undefined,\n): boolean {\n if (isAglynOperatedBrand() === false) return false\n return resolveGaMeasurementId(host) === PLATFORM_GA_MEASUREMENT_ID\n}\n"],"names":["isAglynOperatedBrand","resolveGaMeasurementId","PLATFORM_GA_MEASUREMENT_ID","isPlatformMarketingHost","host"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6DC,GAED,SAASA,oBAAoB,QAAQ,sBAAkB;AACvD,SACEC,sBAAsB,QAEjB,uBAAmB;AAE1B;;;;;;CAMC,GACD,OAAO,MAAMC,6BAA6B,eAAc;AAExD;;;;;;CAMC,GACD,OAAO,SAASC,wBACdC,IAA2C;IAE3C,IAAIJ,2BAA2B,OAAO,OAAO;IAC7C,OAAOC,uBAAuBG,UAAUF;AAC1C"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import { type StoredVisitorConsent, type VisitorConsentPosture, type VisitorConsentStatus } from './visitor-consent';
|
|
18
|
+
/**
|
|
19
|
+
* The storage subject for the console's own consent record.
|
|
20
|
+
*
|
|
21
|
+
* `visitorConsentStorageKey` keys records by host id because preview
|
|
22
|
+
* deployments and localhost serve many customer sites from one origin. The
|
|
23
|
+
* console is a single surface, so it takes a constant — but it takes it
|
|
24
|
+
* through the same key builder, so a console record and a customer-site record
|
|
25
|
+
* can never collide, and a self-hosted console on the same origin as a site
|
|
26
|
+
* keeps its own.
|
|
27
|
+
*
|
|
28
|
+
* A name, not a hostname: the console is served from `app.aglyn.com`, from a
|
|
29
|
+
* custom console domain (AGL-1099c), and from localhost, and a visitor's
|
|
30
|
+
* choice is about the surface rather than about which of its origins they
|
|
31
|
+
* reached it through.
|
|
32
|
+
*/
|
|
33
|
+
export declare const PLATFORM_CONSENT_SUBJECT = "aglyn-console";
|
|
34
|
+
/**
|
|
35
|
+
* Where the client asks which country it is visiting from.
|
|
36
|
+
*
|
|
37
|
+
* The same path the tenant runtime uses, and for the same reason: the answer
|
|
38
|
+
* is a per-visitor request header, so it cannot be baked into a render. Each
|
|
39
|
+
* app serves its own route handler at this path.
|
|
40
|
+
*/
|
|
41
|
+
export declare const PLATFORM_CONSENT_REGION_ENDPOINT = "/api/consent/region";
|
|
42
|
+
/** Session-scoped region cache — one lookup per visit, not per pageview. */
|
|
43
|
+
export declare const PLATFORM_CONSENT_REGION_CACHE_KEY = "aglyn:consent:region";
|
|
44
|
+
/**
|
|
45
|
+
* Whether this surface asks its visitors about advertising storage.
|
|
46
|
+
*
|
|
47
|
+
* DERIVED from {@link PLATFORM_CONSENT_DEFAULT_COMMANDS} rather than declared
|
|
48
|
+
* as its own flag. Those commands are what the console tells gtag about ad
|
|
49
|
+
* storage, so the question and the declaration cannot drift: a surface that
|
|
50
|
+
* denies advertising in every region asks nothing, and one that grants it
|
|
51
|
+
* anywhere asks.
|
|
52
|
+
*
|
|
53
|
+
* A control whose answer changes nothing is decoration, and decoration is what
|
|
54
|
+
* teaches people to click past the controls that do matter — which is the
|
|
55
|
+
* whole reason this is derived rather than hardcoded either way.
|
|
56
|
+
*
|
|
57
|
+
* The console currently grants advertising outside the prior-consent regions,
|
|
58
|
+
* because Aglyn advertises, remarkets and retargets on its own surfaces and
|
|
59
|
+
* the Privacy Policy names this one among them. So the question IS asked, and
|
|
60
|
+
* a visitor who declines gets the signals denied and the tags torn down.
|
|
61
|
+
*
|
|
62
|
+
* `every`, so a single region-scoped grant is enough to make the question
|
|
63
|
+
* real. The console's whole visitor population is not asked about a category
|
|
64
|
+
* because one region's declaration happens to deny it.
|
|
65
|
+
*/
|
|
66
|
+
export declare function platformAsksAboutAdvertising(): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* The per-visitor posture for the console, from the country the region
|
|
69
|
+
* endpoint reports.
|
|
70
|
+
*
|
|
71
|
+
* Unknown region falls to `opt-in`, exactly as it does for a customer site:
|
|
72
|
+
* the asymmetry is a few lost analytics events on a rare headerless visit,
|
|
73
|
+
* against pre-consent tracking of a European visitor.
|
|
74
|
+
*
|
|
75
|
+
* A separate function from the tenant's `resolveConsentPosture` because it
|
|
76
|
+
* answers over a different country set (see the module comment) — and it reads
|
|
77
|
+
* that set from `platform-consent-default.ts` rather than restating it, so the
|
|
78
|
+
* console's gate and the console's consent-mode declaration can never disagree
|
|
79
|
+
* about which regions require asking first.
|
|
80
|
+
*/
|
|
81
|
+
export declare function platformConsentPosture(country: string | null | undefined): VisitorConsentPosture;
|
|
82
|
+
/**
|
|
83
|
+
* The cookie that carries a console visitor's answer between the sibling
|
|
84
|
+
* subdomains the console is served on.
|
|
85
|
+
*
|
|
86
|
+
* ## The defect this closes
|
|
87
|
+
*
|
|
88
|
+
* `localStorage` is per ORIGIN, and the console is one application served on
|
|
89
|
+
* several hostnames of one registrable domain: `app.<domain>` and
|
|
90
|
+
* `auth.<domain>`, which is where interactive sign-in is delegated to. So a
|
|
91
|
+
* record written on one is invisible to the other.
|
|
92
|
+
*
|
|
93
|
+
* For an accept that is only a second ask — annoying, and fail-safe, since an
|
|
94
|
+
* unread record means untracked. For a REFUSAL it is worse than annoying and
|
|
95
|
+
* not fail-safe at all: outside the prior-consent regions the sibling host
|
|
96
|
+
* finds no record, resolves the posture afresh and writes `implied`, so an
|
|
97
|
+
* explicit opt-out reverts to implied consent on the next hop. A visitor
|
|
98
|
+
* cannot be expected to say no once per hostname of an application they
|
|
99
|
+
* experience as one.
|
|
100
|
+
*
|
|
101
|
+
* ## Why a cookie, and why it carries the whole record
|
|
102
|
+
*
|
|
103
|
+
* A cookie is the only client-side store that spans subdomains, and the
|
|
104
|
+
* consent record is itself strictly necessary storage — it is how a "no" is
|
|
105
|
+
* remembered — so it needs no consent of its own. It carries the whole record
|
|
106
|
+
* rather than a flag because the record is what the shared reader validates:
|
|
107
|
+
* the mirror is re-read through `readStoredVisitorConsent`, never trusted, so
|
|
108
|
+
* a hand-edited cookie cannot grant what its status does not.
|
|
109
|
+
*/
|
|
110
|
+
export declare const PLATFORM_CONSENT_COOKIE = "aglyn_consent";
|
|
111
|
+
export declare function setPlatformConsentSharesAcrossSubdomains(shares: boolean): void;
|
|
112
|
+
/**
|
|
113
|
+
* Adopt a sibling host's answer into this origin, if this origin has none.
|
|
114
|
+
*
|
|
115
|
+
* Called ONCE at boot rather than from {@link readPlatformConsent}, because
|
|
116
|
+
* that reader is consulted synchronously from the analytics gate — during the
|
|
117
|
+
* services provider's first render, and again on every consent change — and a
|
|
118
|
+
* reader with a write in it would put a storage write in a render path and
|
|
119
|
+
* repeat it forever. Boot is also early enough by construction: module scope
|
|
120
|
+
* runs before the first render, so the gate's first read already sees it.
|
|
121
|
+
*
|
|
122
|
+
* The value is written into localStorage and then read back through
|
|
123
|
+
* {@link readPlatformConsent}, which is the whole reason this is safe. The
|
|
124
|
+
* shared reader re-derives both grants from the status and rejects an
|
|
125
|
+
* unrecognized shape, so a hand-edited cookie can only ever produce a record
|
|
126
|
+
* the status supports — the same guarantee the per-origin path has.
|
|
127
|
+
*
|
|
128
|
+
* Returns whether a record was adopted, which is what makes it assertable.
|
|
129
|
+
*/
|
|
130
|
+
export declare function hydratePlatformConsentFromMirror(): boolean;
|
|
131
|
+
/** The console visitor's stored record, or null when there is none. */
|
|
132
|
+
export declare function readPlatformConsent(): StoredVisitorConsent | null;
|
|
133
|
+
/**
|
|
134
|
+
* Record a console consent state.
|
|
135
|
+
*
|
|
136
|
+
* Delegates wholesale, which is what carries the withdrawal behaviour: the
|
|
137
|
+
* shared writer re-derives both grants from the status, silences any resident
|
|
138
|
+
* GA tag, sweeps the analytics and advertising cookies, drops the persistent
|
|
139
|
+
* visitor id, and dispatches `VISITOR_CONSENT_CHANGED_EVENT`. The console's
|
|
140
|
+
* analytics gate listens for that event, which is what makes a refusal act on
|
|
141
|
+
* this pageview instead of the next one.
|
|
142
|
+
*/
|
|
143
|
+
export declare function storePlatformConsent(state: {
|
|
144
|
+
status: VisitorConsentStatus;
|
|
145
|
+
country?: string | null;
|
|
146
|
+
advertising?: boolean;
|
|
147
|
+
}): StoredVisitorConsent;
|
|
148
|
+
/**
|
|
149
|
+
* The gate's whole verdict: may analytics run for this console visitor right
|
|
150
|
+
* now?
|
|
151
|
+
*
|
|
152
|
+
* Reads storage on every call rather than caching, because it is consulted
|
|
153
|
+
* synchronously from the Firebase services boot — before any effect has run,
|
|
154
|
+
* and again after a consent change — and a cached answer is exactly how a
|
|
155
|
+
* withdrawal fails to take effect until a reload.
|
|
156
|
+
*
|
|
157
|
+
* Absent record answers NO. That is the load-bearing half: an undecided
|
|
158
|
+
* visitor is a visitor the tag stays out of, whatever the reason for their
|
|
159
|
+
* being undecided, so the gate never has to ask WHY.
|
|
160
|
+
*/
|
|
161
|
+
export declare function platformAnalyticsAllowed(): boolean;
|
|
162
|
+
/** Whether advertising storage may run for this console visitor. */
|
|
163
|
+
export declare function platformAdvertisingAllowed(): boolean;
|
|
164
|
+
/** The console's resolution of a visitor, with no React in it. */
|
|
165
|
+
export interface ResolvedPlatformConsent {
|
|
166
|
+
stored: StoredVisitorConsent | null;
|
|
167
|
+
posture: VisitorConsentPosture | null;
|
|
168
|
+
country: string | null;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The country this visitor is in, or null when nothing can name one.
|
|
172
|
+
*
|
|
173
|
+
* The country half of {@link resolvePlatformConsentRegion}, kept because a
|
|
174
|
+
* caller that only wants a country should not have to know that a posture can
|
|
175
|
+
* arrive without one.
|
|
176
|
+
*/
|
|
177
|
+
export declare function resolvePlatformConsentCountry(): Promise<string | null>;
|
|
178
|
+
/**
|
|
179
|
+
* The region signal for this visit: a country when anything can name one, and
|
|
180
|
+
* a posture when the only signal available carries one without a country.
|
|
181
|
+
*
|
|
182
|
+
* Three sources, in strict order of authority, and the order is the whole
|
|
183
|
+
* design:
|
|
184
|
+
*
|
|
185
|
+
* 1. **The session cache** — a country already resolved this visit.
|
|
186
|
+
* 2. **The region endpoint** — an edge header, which is the only source that
|
|
187
|
+
* knows where the request actually came from.
|
|
188
|
+
* 3. **The browser's time zone** — {@link geoHintFromTimeZone}, and ONLY when
|
|
189
|
+
* the first two produced nothing. It exists for a deployment with no geo
|
|
190
|
+
* header at all: a self-hosted container behind a plain reverse proxy,
|
|
191
|
+
* where every visitor would otherwise be treated as unlocatable and asked
|
|
192
|
+
* to opt in. It is never consulted while a header answers, and a zone it
|
|
193
|
+
* does not recognize (`null`) is treated exactly as a missing header —
|
|
194
|
+
* strictest posture, never permission.
|
|
195
|
+
*/
|
|
196
|
+
export interface ResolvedConsentRegion {
|
|
197
|
+
/** The country, when a source could honestly name one. */
|
|
198
|
+
country: string | null;
|
|
199
|
+
/**
|
|
200
|
+
* A posture the country cannot express, or null to derive it from the
|
|
201
|
+
* country. Set only by the time-zone hint, which can say "not a
|
|
202
|
+
* prior-consent region" while refusing to name which country that is —
|
|
203
|
+
* `America/Chicago` is the United States in almost every case and is also
|
|
204
|
+
* Canadian and Mexican territory in places, and a country that is merely
|
|
205
|
+
* probable is worse on a stored record than an absent one.
|
|
206
|
+
*/
|
|
207
|
+
posture: VisitorConsentPosture | null;
|
|
208
|
+
}
|
|
209
|
+
export declare function resolvePlatformConsentRegion(): Promise<ResolvedConsentRegion>;
|
|
210
|
+
/**
|
|
211
|
+
* Resolve this visitor's console consent state, most binding signal first:
|
|
212
|
+
*
|
|
213
|
+
* 1. An EXPLICIT stored choice — theirs; keep it, and skip the region lookup.
|
|
214
|
+
* 2. GPC — the browser's opt-out overrides an implied default (it can arrive
|
|
215
|
+
* after one was recorded) but never an explicit accept.
|
|
216
|
+
* 3. Any other stored record — resolved on a previous visit.
|
|
217
|
+
* 4. Nothing stored: ask the region endpoint and apply the posture. `opt-out`
|
|
218
|
+
* records `implied` and analytics is live from this paint; `opt-in` leaves
|
|
219
|
+
* the visitor undecided, which keeps the tag out until the banner gets a
|
|
220
|
+
* yes.
|
|
221
|
+
*
|
|
222
|
+
* Idempotent: it reads and writes the same storage deterministically and the
|
|
223
|
+
* region lookup is session-cached, so running it twice costs one network call
|
|
224
|
+
* and reaches one answer.
|
|
225
|
+
*/
|
|
226
|
+
export declare function decidePlatformConsent(): Promise<ResolvedPlatformConsent>;
|
|
227
|
+
/**
|
|
228
|
+
* The refusal a "no" means for a visitor in this state.
|
|
229
|
+
*
|
|
230
|
+
* `opted-out` when they were defaulted in, `declined` when they were asked
|
|
231
|
+
* first. Same gate either way; distinct record, because "how many visitors
|
|
232
|
+
* were tracked before they said no" is a question the two answers separate.
|
|
233
|
+
*/
|
|
234
|
+
export declare function platformRefusalStatus(stored: StoredVisitorConsent | null, posture: VisitorConsentPosture | null): VisitorConsentStatus;
|
|
235
|
+
/**
|
|
236
|
+
* Whether a status the panel is about to write would grant analytics — used to
|
|
237
|
+
* label the control, never to decide the gate.
|
|
238
|
+
*/
|
|
239
|
+
export declare function platformStatusGrantsAnalytics(status: VisitorConsentStatus): boolean;
|
|
240
|
+
/**
|
|
241
|
+
* Start the resolution WITHOUT waiting for React to commit.
|
|
242
|
+
*
|
|
243
|
+
* The gate component's effect is the normal path and does this too. It is not
|
|
244
|
+
* enough on its own: an effect only runs if React commits, and a console that
|
|
245
|
+
* renders but never commits — a suspended provider above the tree — would
|
|
246
|
+
* otherwise leave a rest-of-world visitor permanently undecided and therefore
|
|
247
|
+
* permanently unmeasured. Fire-and-forget; the answer lands in storage, so
|
|
248
|
+
* whenever the component does run it reads it rather than asking again.
|
|
249
|
+
*/
|
|
250
|
+
export declare function primePlatformConsent(): void;
|
|
251
|
+
/** Test seam: forget which pageviews have already been primed. */
|
|
252
|
+
export declare function resetPlatformConsentPriming(): void;
|