@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,216 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* ONE MESSAGE FOR ONE RECIPIENT, RENDERED — the step between a composed email
|
|
19
|
+
* and the two parts that reach an inbox.
|
|
20
|
+
*
|
|
21
|
+
* It sits on the platform's mail rail, in the core, because more than one
|
|
22
|
+
* plugin needs the SAME rendering: the plugin that sends a campaign renders
|
|
23
|
+
* each recipient's copy through it, and the plugin that designs an email
|
|
24
|
+
* checks a design through it before anything is sent. Neither may import the
|
|
25
|
+
* other, and a second renderer in either would be a preview of something else.
|
|
26
|
+
* It composes `@aglyn/shared-util-email`'s primitives with the core's HTML
|
|
27
|
+
* sanitizer, which is why it cannot live in `shared`. Imported by its own
|
|
28
|
+
* subpath; it is not in the barrel.
|
|
29
|
+
*
|
|
30
|
+
* It exists as a shared function because a preview that renders the message a
|
|
31
|
+
* second way is a preview of something else. The class of defect it is meant
|
|
32
|
+
* to catch has bitten twice on this send path — a designed campaign mailed
|
|
33
|
+
* with its product blocks missing, and merge tags that resolved to empty
|
|
34
|
+
* strings for an entire member audience — and neither would have been visible
|
|
35
|
+
* in a preview that did not go through the same renderer, the same merge-tag
|
|
36
|
+
* resolution and the same plain-text synthesis as the send.
|
|
37
|
+
*
|
|
38
|
+
* PURE, and free of `firebase-admin`, so the same call answers in three
|
|
39
|
+
* places: the per-recipient loop in `campaign-send.ts`, the composer's
|
|
40
|
+
* `renderPreview` action, and the console's own client components. Its inputs
|
|
41
|
+
* are already-loaded data — a node map, resolved products, a recipient — and
|
|
42
|
+
* the loading stays with the caller that has the credentials for it.
|
|
43
|
+
*/
|
|
44
|
+
import { type EmailRenderProduct } from '@aglyn/shared-util-email/email-render';
|
|
45
|
+
import { type MergeTagRecipient } from '@aglyn/shared-util-email/email-merge';
|
|
46
|
+
/**
|
|
47
|
+
* A designed email, loaded. `nodes` is the DECODED besigner map: the stored
|
|
48
|
+
* form is compressed msgpack from the first designer save onward, and a
|
|
49
|
+
* caller that passes the raw value renders an empty shell.
|
|
50
|
+
*/
|
|
51
|
+
export interface DesignedEmailTemplate {
|
|
52
|
+
nodes: Record<string, unknown>;
|
|
53
|
+
products?: Record<string, EmailRenderProduct | undefined>;
|
|
54
|
+
/** The template's own preview line, used when the campaign names none. */
|
|
55
|
+
preheader?: string;
|
|
56
|
+
/** The template's own subject, used when the campaign names none. */
|
|
57
|
+
subject?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* WHERE THE MESSAGE COMES FROM — one source, named.
|
|
61
|
+
*
|
|
62
|
+
* A union rather than two optional fields, and that is the whole point. The
|
|
63
|
+
* design already supplies BOTH parts an inbox receives: `renderEmailHtml`
|
|
64
|
+
* returns the HTML and a plain-text rendering of the same nodes, links
|
|
65
|
+
* included. So on a designed send a typed BODY — the whole message of a
|
|
66
|
+
* plain-text email — has no part to occupy, and the earlier shape, which
|
|
67
|
+
* accepted both and read the body only when no template was given, computed it
|
|
68
|
+
* and threw it away without saying so.
|
|
69
|
+
*
|
|
70
|
+
* What an author actually wants there is named for its job instead:
|
|
71
|
+
* `plainText`, the text HALF of a designed message, generated from the design
|
|
72
|
+
* by default. That is a different offer from reinterpreting a body, and
|
|
73
|
+
* deliberately — see the field.
|
|
74
|
+
*
|
|
75
|
+
* Two members and not three: a saved TEMPLATE is a besigner email screen, the
|
|
76
|
+
* same document the design picker offers, so "designed" and "from a template"
|
|
77
|
+
* name one thing.
|
|
78
|
+
*
|
|
79
|
+
* With the two collapsed into a union the discard is not merely refused, it is
|
|
80
|
+
* unsayable: the designed branch has no `body` in scope to drop, and a caller
|
|
81
|
+
* holding both has to decide which it means before it can call at all.
|
|
82
|
+
*/
|
|
83
|
+
export type RecipientEmailContent = {
|
|
84
|
+
/** Written in the composer; the HTML part is synthesized from it. */
|
|
85
|
+
mode: 'text';
|
|
86
|
+
/** The plain-text body, after any A/B variant override. */
|
|
87
|
+
body: string;
|
|
88
|
+
} | {
|
|
89
|
+
/** Built in the besigner; the HTML part comes from the nodes. */
|
|
90
|
+
mode: 'design';
|
|
91
|
+
template: DesignedEmailTemplate;
|
|
92
|
+
/**
|
|
93
|
+
* The author's OWN plain-text part, replacing the one the design
|
|
94
|
+
* generates. Absent — not empty — means generated.
|
|
95
|
+
*
|
|
96
|
+
* Presence is the whole signal, which is why this is a separate
|
|
97
|
+
* optional field rather than a flag beside a string: a flag and a value
|
|
98
|
+
* are two things that can disagree, and the disagreement is invisible.
|
|
99
|
+
*
|
|
100
|
+
* Worth having because the generated text is good but not perfect. A
|
|
101
|
+
* button and a product keep their URLs in it; an inline link inside an
|
|
102
|
+
* `emailRichtext` block does not — the synthesis strips tags, so the
|
|
103
|
+
* href goes with them. An author who cares about what a text-only
|
|
104
|
+
* reader can actually follow needs a way to say so.
|
|
105
|
+
*/
|
|
106
|
+
plainText?: string;
|
|
107
|
+
};
|
|
108
|
+
/** Which of the two ways one email is written. */
|
|
109
|
+
export type EmailMessageMode = RecipientEmailContent['mode'];
|
|
110
|
+
/**
|
|
111
|
+
* Which mode a stored email is in, from the one field that decides it.
|
|
112
|
+
*
|
|
113
|
+
* Naming a template IS being designed — there is no separate flag, and adding
|
|
114
|
+
* one would be a second answer to drift from this one. Read by the composer,
|
|
115
|
+
* by the surfaces that describe a message and by the send path, so a record
|
|
116
|
+
* cannot be shown as one thing and mailed as another.
|
|
117
|
+
*/
|
|
118
|
+
export declare function emailMessageMode(record: {
|
|
119
|
+
templateScreenId?: string | null;
|
|
120
|
+
}): EmailMessageMode;
|
|
121
|
+
export interface RecipientEmailRenderInput {
|
|
122
|
+
/** The campaign's subject, after any A/B variant override. */
|
|
123
|
+
subject: string;
|
|
124
|
+
/** The one source this message is written from. */
|
|
125
|
+
content: RecipientEmailContent;
|
|
126
|
+
/** The composer's preview line; overrides the template's own. */
|
|
127
|
+
preheader?: string;
|
|
128
|
+
/** Who this copy is being personalized for. */
|
|
129
|
+
recipient: MergeTagRecipient;
|
|
130
|
+
/** The site's own public origin, absolutizing media and product links. */
|
|
131
|
+
siteBase?: string;
|
|
132
|
+
/** Qualifies an org-scoped media asset for the unauthenticated CDN. */
|
|
133
|
+
hostId?: string;
|
|
134
|
+
/** The recipient's signed opt-out link, appended to the text part. */
|
|
135
|
+
unsubscribeUrl?: string;
|
|
136
|
+
}
|
|
137
|
+
export interface RenderedRecipientEmail {
|
|
138
|
+
/** The subject with this recipient's merge values resolved. */
|
|
139
|
+
subject: string;
|
|
140
|
+
/** The HTML part, which every campaign message carries. */
|
|
141
|
+
html: string;
|
|
142
|
+
/** The plain-text part, ending in the opt-out line. */
|
|
143
|
+
text: string;
|
|
144
|
+
/**
|
|
145
|
+
* The message's own plain text, WITHOUT the opt-out line.
|
|
146
|
+
*
|
|
147
|
+
* What the composer fills an authored plain-text part from. Prefilling from
|
|
148
|
+
* `text` would fold this send's footer into the stored override, and the
|
|
149
|
+
* next send would append a second one — so the two are reported apart
|
|
150
|
+
* rather than the caller trying to trim one off the other.
|
|
151
|
+
*/
|
|
152
|
+
messageText: string;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* WHERE A DESIGNED EMAIL'S PLAIN-TEXT PART COMES FROM, and whether it still
|
|
156
|
+
* describes the design.
|
|
157
|
+
*
|
|
158
|
+
* Two facts a composer has to state rather than imply. An authored text part
|
|
159
|
+
* is not overwritten when the design is edited — losing somebody's writing
|
|
160
|
+
* because they touched the canvas afterwards is not a trade worth making —
|
|
161
|
+
* which leaves the other half of the problem: an override written against a
|
|
162
|
+
* design that has since changed says something the HTML no longer says, and
|
|
163
|
+
* nothing about it is visible. A value that cannot be read scores the same as
|
|
164
|
+
* one that is absent, which is the shape of the defect this whole area is
|
|
165
|
+
* being fixed for.
|
|
166
|
+
*
|
|
167
|
+
* So the design's VERSION is recorded beside the override, and the two are
|
|
168
|
+
* compared here. Pure, and read by the composer, so the notice a merchant sees
|
|
169
|
+
* and the state the record is in cannot disagree.
|
|
170
|
+
*/
|
|
171
|
+
export interface EmailPlainTextState {
|
|
172
|
+
/** `authored` when somebody wrote it; `generated` from the design. */
|
|
173
|
+
source: 'generated' | 'authored';
|
|
174
|
+
/**
|
|
175
|
+
* An authored part written against a design that has moved since.
|
|
176
|
+
*
|
|
177
|
+
* False for a generated part, which cannot go stale — it is derived from
|
|
178
|
+
* whatever the design says at send time — and false when either version is
|
|
179
|
+
* unknown, because an unanswerable question must not render as a warning.
|
|
180
|
+
*/
|
|
181
|
+
stale: boolean;
|
|
182
|
+
}
|
|
183
|
+
export declare function emailPlainTextState(record: {
|
|
184
|
+
plainText?: string | null;
|
|
185
|
+
/** The design version the override was written against. */
|
|
186
|
+
plainTextVersionId?: string | null;
|
|
187
|
+
},
|
|
188
|
+
/** The design's version as it stands now. */
|
|
189
|
+
currentVersionId?: string | null): EmailPlainTextState;
|
|
190
|
+
/**
|
|
191
|
+
* Renders one campaign message for one recipient.
|
|
192
|
+
*
|
|
193
|
+
* The HTML part is produced here rather than left to `sendEmail`'s fallback
|
|
194
|
+
* so that a caller can SEE it. `sendEmail` synthesizes an HTML part from the
|
|
195
|
+
* text of any message that arrives without one — a text-only message has no
|
|
196
|
+
* anchors, so its links are inert and click tracking has nothing to rewrite —
|
|
197
|
+
* and this calls the same `renderTextEmailHtml` with the same text and
|
|
198
|
+
* subject, so a plain-text campaign is byte-identical either way.
|
|
199
|
+
*/
|
|
200
|
+
export declare function renderRecipientEmail(input: RecipientEmailRenderInput): RenderedRecipientEmail;
|
|
201
|
+
/**
|
|
202
|
+
* The merge tags the send path resolves, for the composer to offer.
|
|
203
|
+
*
|
|
204
|
+
* Kept beside the renderer because `resolveMergeTags` recognizes exactly
|
|
205
|
+
* these three and substitutes the fallback for anything else: a tag a
|
|
206
|
+
* merchant types from memory that is not on this list does not fail, it
|
|
207
|
+
* silently renders as nothing in mail that has already gone out. A composer
|
|
208
|
+
* that lists them is the difference between a documented feature and a
|
|
209
|
+
* guess.
|
|
210
|
+
*/
|
|
211
|
+
export declare const EMAIL_MERGE_TAGS: ReadonlyArray<{
|
|
212
|
+
/** The full token, fallback included, as it should be typed. */
|
|
213
|
+
token: string;
|
|
214
|
+
/** What it resolves to, per recipient. */
|
|
215
|
+
description: string;
|
|
216
|
+
}>;
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ /**
|
|
18
|
+
* ONE MESSAGE FOR ONE RECIPIENT, RENDERED — the step between a composed email
|
|
19
|
+
* and the two parts that reach an inbox.
|
|
20
|
+
*
|
|
21
|
+
* It sits on the platform's mail rail, in the core, because more than one
|
|
22
|
+
* plugin needs the SAME rendering: the plugin that sends a campaign renders
|
|
23
|
+
* each recipient's copy through it, and the plugin that designs an email
|
|
24
|
+
* checks a design through it before anything is sent. Neither may import the
|
|
25
|
+
* other, and a second renderer in either would be a preview of something else.
|
|
26
|
+
* It composes `@aglyn/shared-util-email`'s primitives with the core's HTML
|
|
27
|
+
* sanitizer, which is why it cannot live in `shared`. Imported by its own
|
|
28
|
+
* subpath; it is not in the barrel.
|
|
29
|
+
*
|
|
30
|
+
* It exists as a shared function because a preview that renders the message a
|
|
31
|
+
* second way is a preview of something else. The class of defect it is meant
|
|
32
|
+
* to catch has bitten twice on this send path — a designed campaign mailed
|
|
33
|
+
* with its product blocks missing, and merge tags that resolved to empty
|
|
34
|
+
* strings for an entire member audience — and neither would have been visible
|
|
35
|
+
* in a preview that did not go through the same renderer, the same merge-tag
|
|
36
|
+
* resolution and the same plain-text synthesis as the send.
|
|
37
|
+
*
|
|
38
|
+
* PURE, and free of `firebase-admin`, so the same call answers in three
|
|
39
|
+
* places: the per-recipient loop in `campaign-send.ts`, the composer's
|
|
40
|
+
* `renderPreview` action, and the console's own client components. Its inputs
|
|
41
|
+
* are already-loaded data — a node map, resolved products, a recipient — and
|
|
42
|
+
* the loading stays with the caller that has the credentials for it.
|
|
43
|
+
*/ // By leaf, never the library's index: the index reaches the sender and the
|
|
44
|
+
// health check, which this module has no use for.
|
|
45
|
+
import { EMAIL_NODE_ROOT_ID, renderEmailHtml } from "@aglyn/shared-util-email/email-render";
|
|
46
|
+
import { resolveMergeTags } from "@aglyn/shared-util-email/email-merge";
|
|
47
|
+
import { appendUnsubscribeHtml, UNSUBSCRIBE_FOOTER_LABEL } from "@aglyn/shared-util-email/marketing-send";
|
|
48
|
+
import { renderTextEmailHtml } from "@aglyn/shared-util-email/text-email-html";
|
|
49
|
+
/*
|
|
50
|
+
* The LEAF app-util, not `@aglyn/aglyn/server`: this module is pure and is
|
|
51
|
+
* imported by client components, so a server entry point here would pull the
|
|
52
|
+
* Admin SDK into a browser bundle. The email blocks the besigner previews
|
|
53
|
+
* these same nodes under call this same function — so the mailed copy and the
|
|
54
|
+
* previewed copy are one policy over one string rather than two kept in step
|
|
55
|
+
* by hand.
|
|
56
|
+
*/ import { sanitizeAuthorHtml } from "./author-html.js";
|
|
57
|
+
/**
|
|
58
|
+
* Which mode a stored email is in, from the one field that decides it.
|
|
59
|
+
*
|
|
60
|
+
* Naming a template IS being designed — there is no separate flag, and adding
|
|
61
|
+
* one would be a second answer to drift from this one. Read by the composer,
|
|
62
|
+
* by the surfaces that describe a message and by the send path, so a record
|
|
63
|
+
* cannot be shown as one thing and mailed as another.
|
|
64
|
+
*/ export function emailMessageMode(record) {
|
|
65
|
+
return record.templateScreenId ? 'design' : 'text';
|
|
66
|
+
}
|
|
67
|
+
export function emailPlainTextState(record, /** The design's version as it stands now. */ currentVersionId) {
|
|
68
|
+
var _record_plainTextVersionId;
|
|
69
|
+
var _record_plainText;
|
|
70
|
+
if (!((_record_plainText = record.plainText) == null ? void 0 : _record_plainText.trim())) return {
|
|
71
|
+
source: 'generated',
|
|
72
|
+
stale: false
|
|
73
|
+
};
|
|
74
|
+
const written = (_record_plainTextVersionId = record.plainTextVersionId) != null ? _record_plainTextVersionId : '';
|
|
75
|
+
return {
|
|
76
|
+
source: 'authored',
|
|
77
|
+
stale: Boolean(written && currentVersionId && written !== currentVersionId)
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Renders one campaign message for one recipient.
|
|
82
|
+
*
|
|
83
|
+
* The HTML part is produced here rather than left to `sendEmail`'s fallback
|
|
84
|
+
* so that a caller can SEE it. `sendEmail` synthesizes an HTML part from the
|
|
85
|
+
* text of any message that arrives without one — a text-only message has no
|
|
86
|
+
* anchors, so its links are inert and click tracking has nothing to rewrite —
|
|
87
|
+
* and this calls the same `renderTextEmailHtml` with the same text and
|
|
88
|
+
* subject, so a plain-text campaign is byte-identical either way.
|
|
89
|
+
*/ export function renderRecipientEmail(input) {
|
|
90
|
+
var _recipient_name, _name_split_, _content_template_products;
|
|
91
|
+
var _input_preheader, _content_plainText;
|
|
92
|
+
const { content, recipient, siteBase = '', hostId, unsubscribeUrl } = input;
|
|
93
|
+
const template = content.mode === 'design' ? content.template : null;
|
|
94
|
+
const subject = resolveMergeTags(input.subject || (template == null ? void 0 : template.subject) || '', recipient);
|
|
95
|
+
const preheader = ((_input_preheader = input.preheader) == null ? void 0 : _input_preheader.trim()) || (template == null ? void 0 : template.preheader) || '';
|
|
96
|
+
const name = ((_recipient_name = recipient.name) != null ? _recipient_name : '').trim();
|
|
97
|
+
/*
|
|
98
|
+
* The plain-text footer, named for what the link actually opens — see
|
|
99
|
+
* {@link UNSUBSCRIBE_FOOTER_LABEL}, which the non-campaign marketing paths
|
|
100
|
+
* write into their own footers from the same constant.
|
|
101
|
+
*/ const unsubscribeLine = unsubscribeUrl ? `\n\n—\n${UNSUBSCRIBE_FOOTER_LABEL}: ${unsubscribeUrl}` : '';
|
|
102
|
+
if (content.mode === 'text') {
|
|
103
|
+
const messageText = resolveMergeTags(content.body, recipient);
|
|
104
|
+
const text = `${messageText}${unsubscribeLine}`;
|
|
105
|
+
return {
|
|
106
|
+
subject,
|
|
107
|
+
/*
|
|
108
|
+
* THE HTML FOOTER IS RENDERED, NOT LINKIFIED OUT OF THE TEXT.
|
|
109
|
+
*
|
|
110
|
+
* Synthesizing the HTML from `text` — footer included — used to work,
|
|
111
|
+
* and produced a footer whose visible words were the raw signed URL:
|
|
112
|
+
* `renderTextEmailHtml` turns a bare URL into an anchor labelled with
|
|
113
|
+
* itself, which is right for a link the AUTHOR typed and wrong for the
|
|
114
|
+
* one line this renderer writes. A hundred characters of `hostId`,
|
|
115
|
+
* `sig` and `cid` is not a thing a person reads, and it buries the only
|
|
116
|
+
* sentence in the message that tells them they can leave one stream
|
|
117
|
+
* instead of all of them.
|
|
118
|
+
*
|
|
119
|
+
* So the message is linkified WITHOUT the footer, and the footer is
|
|
120
|
+
* appended by the same helper the designed branch uses — same styling,
|
|
121
|
+
* same words, tracking-rewritten by the provider exactly as before,
|
|
122
|
+
* because rewriting keys on the `href` and not on the label.
|
|
123
|
+
*
|
|
124
|
+
* The TEXT part keeps the bare URL. Markup is invisible there and an
|
|
125
|
+
* address a reader can copy is the only form that works.
|
|
126
|
+
*/ html: unsubscribeUrl ? appendUnsubscribeHtml(renderTextEmailHtml(messageText, subject, preheader), unsubscribeUrl) : renderTextEmailHtml(text, subject, preheader),
|
|
127
|
+
text,
|
|
128
|
+
messageText
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
const rendered = renderEmailHtml({
|
|
132
|
+
nodes: content.template.nodes,
|
|
133
|
+
// Besigner maps are rooted at `_@_`, not the renderer's default `root`:
|
|
134
|
+
// rendering one as `root` finds no root and emits an empty 600px shell.
|
|
135
|
+
rootId: EMAIL_NODE_ROOT_ID,
|
|
136
|
+
subject,
|
|
137
|
+
preheader,
|
|
138
|
+
sanitize: sanitizeAuthorHtml,
|
|
139
|
+
// An author-picked image is stored as a `media:` reference and resolves
|
|
140
|
+
// site-relative; an inbox has no page to resolve it against, so without an
|
|
141
|
+
// origin the renderer drops it.
|
|
142
|
+
mediaOrigin: siteBase || undefined,
|
|
143
|
+
mediaHostId: hostId,
|
|
144
|
+
merge: {
|
|
145
|
+
'contact.email': recipient.email,
|
|
146
|
+
'contact.name': name,
|
|
147
|
+
'contact.firstName': (_name_split_ = name.split(/\s+/)[0]) != null ? _name_split_ : '',
|
|
148
|
+
'site.url': siteBase,
|
|
149
|
+
unsubscribeUrl: unsubscribeUrl != null ? unsubscribeUrl : ''
|
|
150
|
+
},
|
|
151
|
+
products: Object.fromEntries(Object.entries((_content_template_products = content.template.products) != null ? _content_template_products : {}).map(([id, product])=>{
|
|
152
|
+
var _product_url;
|
|
153
|
+
return [
|
|
154
|
+
id,
|
|
155
|
+
product && _extends({}, product, {
|
|
156
|
+
url: ((_product_url = product.url) == null ? void 0 : _product_url.startsWith('/')) ? `${siteBase}${product.url}` : product.url
|
|
157
|
+
})
|
|
158
|
+
];
|
|
159
|
+
}))
|
|
160
|
+
});
|
|
161
|
+
/*
|
|
162
|
+
* THE PLAIN-TEXT PART: the design's own, unless somebody wrote one.
|
|
163
|
+
*
|
|
164
|
+
* Merge tags are resolved in an authored part exactly as they are in a
|
|
165
|
+
* plain-text campaign's body — a text part that ships `{{firstName|there}}`
|
|
166
|
+
* literally is worse than the generated one it replaced. The design's own
|
|
167
|
+
* text arrives already substituted, through `renderEmailHtml`'s `merge` map.
|
|
168
|
+
*
|
|
169
|
+
* The opt-out line is appended either way, and it is a BARE URL rather than
|
|
170
|
+
* an anchor: markup is invisible in a text part, so a link a text-only
|
|
171
|
+
* reader can copy is the only form that works. It is the one part of the
|
|
172
|
+
* footer an author cannot write away.
|
|
173
|
+
*/ const authored = (_content_plainText = content.plainText) == null ? void 0 : _content_plainText.trim();
|
|
174
|
+
const messageText = authored ? resolveMergeTags(authored, recipient) : rendered.text;
|
|
175
|
+
return {
|
|
176
|
+
subject,
|
|
177
|
+
/*
|
|
178
|
+
* THE HTML PART GETS THE SAME FOOTER THE TEXT PART GETS.
|
|
179
|
+
*
|
|
180
|
+
* A designed template carries an opt-out only if its author placed a
|
|
181
|
+
* `{{unsubscribeUrl}}` somewhere, and nothing made them: a template whose
|
|
182
|
+
* footer block says only the copyright line renders an HTML part with no
|
|
183
|
+
* way out of the list at all, which is the half of the message almost
|
|
184
|
+
* every recipient reads. The text part had the link and the HTML did not,
|
|
185
|
+
* so the defect was invisible to anyone reading their own test send.
|
|
186
|
+
*
|
|
187
|
+
* `appendUnsubscribeHtml` is idempotent by URL, so an author who DID
|
|
188
|
+
* place the merge token keeps their own placement and gets no second
|
|
189
|
+
* footer — the same rule `sendEmail` applies to every other marketing
|
|
190
|
+
* path, applied here because the campaign sender passes no `marketing`
|
|
191
|
+
* context and so never reaches that append.
|
|
192
|
+
*/ html: unsubscribeUrl ? appendUnsubscribeHtml(rendered.html, unsubscribeUrl) : rendered.html,
|
|
193
|
+
text: `${messageText}${unsubscribeLine}`,
|
|
194
|
+
messageText
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* The merge tags the send path resolves, for the composer to offer.
|
|
199
|
+
*
|
|
200
|
+
* Kept beside the renderer because `resolveMergeTags` recognizes exactly
|
|
201
|
+
* these three and substitutes the fallback for anything else: a tag a
|
|
202
|
+
* merchant types from memory that is not on this list does not fail, it
|
|
203
|
+
* silently renders as nothing in mail that has already gone out. A composer
|
|
204
|
+
* that lists them is the difference between a documented feature and a
|
|
205
|
+
* guess.
|
|
206
|
+
*/ export const EMAIL_MERGE_TAGS = [
|
|
207
|
+
{
|
|
208
|
+
token: '{{firstName|there}}',
|
|
209
|
+
description: 'The recipient’s first name, or “there” when none is stored'
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
token: '{{name}}',
|
|
213
|
+
description: 'The recipient’s full name, where the audience stores one'
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
token: '{{email}}',
|
|
217
|
+
description: 'The address this copy is going to'
|
|
218
|
+
}
|
|
219
|
+
];
|
|
220
|
+
|
|
221
|
+
//# sourceMappingURL=recipient-email-render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/recipient-email-render.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 * ONE MESSAGE FOR ONE RECIPIENT, RENDERED — the step between a composed email\n * and the two parts that reach an inbox.\n *\n * It sits on the platform's mail rail, in the core, because more than one\n * plugin needs the SAME rendering: the plugin that sends a campaign renders\n * each recipient's copy through it, and the plugin that designs an email\n * checks a design through it before anything is sent. Neither may import the\n * other, and a second renderer in either would be a preview of something else.\n * It composes `@aglyn/shared-util-email`'s primitives with the core's HTML\n * sanitizer, which is why it cannot live in `shared`. Imported by its own\n * subpath; it is not in the barrel.\n *\n * It exists as a shared function because a preview that renders the message a\n * second way is a preview of something else. The class of defect it is meant\n * to catch has bitten twice on this send path — a designed campaign mailed\n * with its product blocks missing, and merge tags that resolved to empty\n * strings for an entire member audience — and neither would have been visible\n * in a preview that did not go through the same renderer, the same merge-tag\n * resolution and the same plain-text synthesis as the send.\n *\n * PURE, and free of `firebase-admin`, so the same call answers in three\n * places: the per-recipient loop in `campaign-send.ts`, the composer's\n * `renderPreview` action, and the console's own client components. Its inputs\n * are already-loaded data — a node map, resolved products, a recipient — and\n * the loading stays with the caller that has the credentials for it.\n */\n\n// By leaf, never the library's index: the index reaches the sender and the\n// health check, which this module has no use for.\nimport {\n EMAIL_NODE_ROOT_ID,\n renderEmailHtml,\n type EmailRenderProduct,\n} from '@aglyn/shared-util-email/email-render'\nimport {\n resolveMergeTags,\n type MergeTagRecipient,\n} from '@aglyn/shared-util-email/email-merge'\nimport {\n appendUnsubscribeHtml,\n UNSUBSCRIBE_FOOTER_LABEL,\n} from '@aglyn/shared-util-email/marketing-send'\nimport { renderTextEmailHtml } from '@aglyn/shared-util-email/text-email-html'\n/*\n * The LEAF app-util, not `@aglyn/aglyn/server`: this module is pure and is\n * imported by client components, so a server entry point here would pull the\n * Admin SDK into a browser bundle. The email blocks the besigner previews\n * these same nodes under call this same function — so the mailed copy and the\n * previewed copy are one policy over one string rather than two kept in step\n * by hand.\n */\nimport { sanitizeAuthorHtml } from './author-html';\n\n/**\n * A designed email, loaded. `nodes` is the DECODED besigner map: the stored\n * form is compressed msgpack from the first designer save onward, and a\n * caller that passes the raw value renders an empty shell.\n */\nexport interface DesignedEmailTemplate {\n nodes: Record<string, unknown>\n products?: Record<string, EmailRenderProduct | undefined>\n /** The template's own preview line, used when the campaign names none. */\n preheader?: string\n /** The template's own subject, used when the campaign names none. */\n subject?: string\n}\n\n/**\n * WHERE THE MESSAGE COMES FROM — one source, named.\n *\n * A union rather than two optional fields, and that is the whole point. The\n * design already supplies BOTH parts an inbox receives: `renderEmailHtml`\n * returns the HTML and a plain-text rendering of the same nodes, links\n * included. So on a designed send a typed BODY — the whole message of a\n * plain-text email — has no part to occupy, and the earlier shape, which\n * accepted both and read the body only when no template was given, computed it\n * and threw it away without saying so.\n *\n * What an author actually wants there is named for its job instead:\n * `plainText`, the text HALF of a designed message, generated from the design\n * by default. That is a different offer from reinterpreting a body, and\n * deliberately — see the field.\n *\n * Two members and not three: a saved TEMPLATE is a besigner email screen, the\n * same document the design picker offers, so \"designed\" and \"from a template\"\n * name one thing.\n *\n * With the two collapsed into a union the discard is not merely refused, it is\n * unsayable: the designed branch has no `body` in scope to drop, and a caller\n * holding both has to decide which it means before it can call at all.\n */\nexport type RecipientEmailContent =\n | {\n /** Written in the composer; the HTML part is synthesized from it. */\n mode: 'text'\n /** The plain-text body, after any A/B variant override. */\n body: string\n }\n | {\n /** Built in the besigner; the HTML part comes from the nodes. */\n mode: 'design'\n template: DesignedEmailTemplate\n /**\n * The author's OWN plain-text part, replacing the one the design\n * generates. Absent — not empty — means generated.\n *\n * Presence is the whole signal, which is why this is a separate\n * optional field rather than a flag beside a string: a flag and a value\n * are two things that can disagree, and the disagreement is invisible.\n *\n * Worth having because the generated text is good but not perfect. A\n * button and a product keep their URLs in it; an inline link inside an\n * `emailRichtext` block does not — the synthesis strips tags, so the\n * href goes with them. An author who cares about what a text-only\n * reader can actually follow needs a way to say so.\n */\n plainText?: string\n }\n\n/** Which of the two ways one email is written. */\nexport type EmailMessageMode = RecipientEmailContent['mode']\n\n/**\n * Which mode a stored email is in, from the one field that decides it.\n *\n * Naming a template IS being designed — there is no separate flag, and adding\n * one would be a second answer to drift from this one. Read by the composer,\n * by the surfaces that describe a message and by the send path, so a record\n * cannot be shown as one thing and mailed as another.\n */\nexport function emailMessageMode(record: {\n templateScreenId?: string | null\n}): EmailMessageMode {\n return record.templateScreenId ? 'design' : 'text'\n}\n\nexport interface RecipientEmailRenderInput {\n /** The campaign's subject, after any A/B variant override. */\n subject: string\n /** The one source this message is written from. */\n content: RecipientEmailContent\n /** The composer's preview line; overrides the template's own. */\n preheader?: string\n /** Who this copy is being personalized for. */\n recipient: MergeTagRecipient\n /** The site's own public origin, absolutizing media and product links. */\n siteBase?: string\n /** Qualifies an org-scoped media asset for the unauthenticated CDN. */\n hostId?: string\n /** The recipient's signed opt-out link, appended to the text part. */\n unsubscribeUrl?: string\n}\n\nexport interface RenderedRecipientEmail {\n /** The subject with this recipient's merge values resolved. */\n subject: string\n /** The HTML part, which every campaign message carries. */\n html: string\n /** The plain-text part, ending in the opt-out line. */\n text: string\n /**\n * The message's own plain text, WITHOUT the opt-out line.\n *\n * What the composer fills an authored plain-text part from. Prefilling from\n * `text` would fold this send's footer into the stored override, and the\n * next send would append a second one — so the two are reported apart\n * rather than the caller trying to trim one off the other.\n */\n messageText: string\n}\n\n/**\n * WHERE A DESIGNED EMAIL'S PLAIN-TEXT PART COMES FROM, and whether it still\n * describes the design.\n *\n * Two facts a composer has to state rather than imply. An authored text part\n * is not overwritten when the design is edited — losing somebody's writing\n * because they touched the canvas afterwards is not a trade worth making —\n * which leaves the other half of the problem: an override written against a\n * design that has since changed says something the HTML no longer says, and\n * nothing about it is visible. A value that cannot be read scores the same as\n * one that is absent, which is the shape of the defect this whole area is\n * being fixed for.\n *\n * So the design's VERSION is recorded beside the override, and the two are\n * compared here. Pure, and read by the composer, so the notice a merchant sees\n * and the state the record is in cannot disagree.\n */\nexport interface EmailPlainTextState {\n /** `authored` when somebody wrote it; `generated` from the design. */\n source: 'generated' | 'authored'\n /**\n * An authored part written against a design that has moved since.\n *\n * False for a generated part, which cannot go stale — it is derived from\n * whatever the design says at send time — and false when either version is\n * unknown, because an unanswerable question must not render as a warning.\n */\n stale: boolean\n}\n\nexport function emailPlainTextState(\n record: {\n plainText?: string | null\n /** The design version the override was written against. */\n plainTextVersionId?: string | null\n },\n /** The design's version as it stands now. */\n currentVersionId?: string | null,\n): EmailPlainTextState {\n if (!record.plainText?.trim()) return { source: 'generated', stale: false }\n const written = record.plainTextVersionId ?? ''\n return {\n source: 'authored',\n stale: Boolean(written && currentVersionId && written !== currentVersionId),\n }\n}\n\n/**\n * Renders one campaign message for one recipient.\n *\n * The HTML part is produced here rather than left to `sendEmail`'s fallback\n * so that a caller can SEE it. `sendEmail` synthesizes an HTML part from the\n * text of any message that arrives without one — a text-only message has no\n * anchors, so its links are inert and click tracking has nothing to rewrite —\n * and this calls the same `renderTextEmailHtml` with the same text and\n * subject, so a plain-text campaign is byte-identical either way.\n */\nexport function renderRecipientEmail(\n input: RecipientEmailRenderInput,\n): RenderedRecipientEmail {\n const { content, recipient, siteBase = '', hostId, unsubscribeUrl } = input\n const template = content.mode === 'design' ? content.template : null\n const subject = resolveMergeTags(\n input.subject || template?.subject || '',\n recipient,\n )\n const preheader = input.preheader?.trim() || template?.preheader || ''\n const name = (recipient.name ?? '').trim()\n /*\n * The plain-text footer, named for what the link actually opens — see\n * {@link UNSUBSCRIBE_FOOTER_LABEL}, which the non-campaign marketing paths\n * write into their own footers from the same constant.\n */\n const unsubscribeLine = unsubscribeUrl\n ? `\\n\\n—\\n${UNSUBSCRIBE_FOOTER_LABEL}: ${unsubscribeUrl}`\n : ''\n\n if (content.mode === 'text') {\n const messageText = resolveMergeTags(content.body, recipient)\n const text = `${messageText}${unsubscribeLine}`\n return {\n subject,\n /*\n * THE HTML FOOTER IS RENDERED, NOT LINKIFIED OUT OF THE TEXT.\n *\n * Synthesizing the HTML from `text` — footer included — used to work,\n * and produced a footer whose visible words were the raw signed URL:\n * `renderTextEmailHtml` turns a bare URL into an anchor labelled with\n * itself, which is right for a link the AUTHOR typed and wrong for the\n * one line this renderer writes. A hundred characters of `hostId`,\n * `sig` and `cid` is not a thing a person reads, and it buries the only\n * sentence in the message that tells them they can leave one stream\n * instead of all of them.\n *\n * So the message is linkified WITHOUT the footer, and the footer is\n * appended by the same helper the designed branch uses — same styling,\n * same words, tracking-rewritten by the provider exactly as before,\n * because rewriting keys on the `href` and not on the label.\n *\n * The TEXT part keeps the bare URL. Markup is invisible there and an\n * address a reader can copy is the only form that works.\n */\n html: unsubscribeUrl\n ? appendUnsubscribeHtml(\n renderTextEmailHtml(messageText, subject, preheader),\n unsubscribeUrl,\n )\n : renderTextEmailHtml(text, subject, preheader),\n text,\n messageText,\n }\n }\n\n const rendered = renderEmailHtml({\n nodes: content.template.nodes as never,\n // Besigner maps are rooted at `_@_`, not the renderer's default `root`:\n // rendering one as `root` finds no root and emits an empty 600px shell.\n rootId: EMAIL_NODE_ROOT_ID,\n subject,\n preheader,\n sanitize: sanitizeAuthorHtml,\n // An author-picked image is stored as a `media:` reference and resolves\n // site-relative; an inbox has no page to resolve it against, so without an\n // origin the renderer drops it.\n mediaOrigin: siteBase || undefined,\n mediaHostId: hostId,\n merge: {\n 'contact.email': recipient.email,\n 'contact.name': name,\n 'contact.firstName': name.split(/\\s+/)[0] ?? '',\n 'site.url': siteBase,\n unsubscribeUrl: unsubscribeUrl ?? '',\n },\n products: Object.fromEntries(\n Object.entries(content.template.products ?? {}).map(([id, product]) => [\n id,\n product && {\n ...product,\n url: product.url?.startsWith('/')\n ? `${siteBase}${product.url}`\n : product.url,\n },\n ]),\n ),\n })\n /*\n * THE PLAIN-TEXT PART: the design's own, unless somebody wrote one.\n *\n * Merge tags are resolved in an authored part exactly as they are in a\n * plain-text campaign's body — a text part that ships `{{firstName|there}}`\n * literally is worse than the generated one it replaced. The design's own\n * text arrives already substituted, through `renderEmailHtml`'s `merge` map.\n *\n * The opt-out line is appended either way, and it is a BARE URL rather than\n * an anchor: markup is invisible in a text part, so a link a text-only\n * reader can copy is the only form that works. It is the one part of the\n * footer an author cannot write away.\n */\n const authored = content.plainText?.trim()\n const messageText = authored\n ? resolveMergeTags(authored, recipient)\n : rendered.text\n return {\n subject,\n /*\n * THE HTML PART GETS THE SAME FOOTER THE TEXT PART GETS.\n *\n * A designed template carries an opt-out only if its author placed a\n * `{{unsubscribeUrl}}` somewhere, and nothing made them: a template whose\n * footer block says only the copyright line renders an HTML part with no\n * way out of the list at all, which is the half of the message almost\n * every recipient reads. The text part had the link and the HTML did not,\n * so the defect was invisible to anyone reading their own test send.\n *\n * `appendUnsubscribeHtml` is idempotent by URL, so an author who DID\n * place the merge token keeps their own placement and gets no second\n * footer — the same rule `sendEmail` applies to every other marketing\n * path, applied here because the campaign sender passes no `marketing`\n * context and so never reaches that append.\n */\n html: unsubscribeUrl\n ? appendUnsubscribeHtml(rendered.html, unsubscribeUrl)\n : rendered.html,\n text: `${messageText}${unsubscribeLine}`,\n messageText,\n }\n}\n\n/**\n * The merge tags the send path resolves, for the composer to offer.\n *\n * Kept beside the renderer because `resolveMergeTags` recognizes exactly\n * these three and substitutes the fallback for anything else: a tag a\n * merchant types from memory that is not on this list does not fail, it\n * silently renders as nothing in mail that has already gone out. A composer\n * that lists them is the difference between a documented feature and a\n * guess.\n */\nexport const EMAIL_MERGE_TAGS: ReadonlyArray<{\n /** The full token, fallback included, as it should be typed. */\n token: string\n /** What it resolves to, per recipient. */\n description: string\n}> = [\n {\n token: '{{firstName|there}}',\n description: 'The recipient’s first name, or “there” when none is stored',\n },\n {\n token: '{{name}}',\n description: 'The recipient’s full name, where the audience stores one',\n },\n { token: '{{email}}', description: 'The address this copy is going to' },\n]\n"],"names":["EMAIL_NODE_ROOT_ID","renderEmailHtml","resolveMergeTags","appendUnsubscribeHtml","UNSUBSCRIBE_FOOTER_LABEL","renderTextEmailHtml","sanitizeAuthorHtml","emailMessageMode","record","templateScreenId","emailPlainTextState","currentVersionId","plainText","trim","source","stale","written","plainTextVersionId","Boolean","renderRecipientEmail","input","recipient","name","content","siteBase","hostId","unsubscribeUrl","template","mode","subject","preheader","unsubscribeLine","messageText","body","text","html","rendered","nodes","rootId","sanitize","mediaOrigin","undefined","mediaHostId","merge","email","split","products","Object","fromEntries","entries","map","id","product","url","startsWith","authored","EMAIL_MERGE_TAGS","token","description"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BC,GAED,2EAA2E;AAC3E,kDAAkD;AAClD,SACEA,kBAAkB,EAClBC,eAAe,QAEV,wCAAuC;AAC9C,SACEC,gBAAgB,QAEX,uCAAsC;AAC7C,SACEC,qBAAqB,EACrBC,wBAAwB,QACnB,0CAAyC;AAChD,SAASC,mBAAmB,QAAQ,2CAA0C;AAC9E;;;;;;;CAOC,GACD,SAASC,kBAAkB,QAAQ,mBAAgB;AAuEnD;;;;;;;CAOC,GACD,OAAO,SAASC,iBAAiBC,MAEhC;IACC,OAAOA,OAAOC,gBAAgB,GAAG,WAAW;AAC9C;AAmEA,OAAO,SAASC,oBACdF,MAIC,EACD,2CAA2C,GAC3CG,gBAAgC;QAGhBH;QADXA;IAAL,IAAI,GAACA,oBAAAA,OAAOI,SAAS,qBAAhBJ,kBAAkBK,IAAI,KAAI,OAAO;QAAEC,QAAQ;QAAaC,OAAO;IAAM;IAC1E,MAAMC,WAAUR,6BAAAA,OAAOS,kBAAkB,YAAzBT,6BAA6B;IAC7C,OAAO;QACLM,QAAQ;QACRC,OAAOG,QAAQF,WAAWL,oBAAoBK,YAAYL;IAC5D;AACF;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASQ,qBACdC,KAAgC;QASlBC,iBA8DWC,cAKNC;QApEDH,kBA4FDG;IAlGjB,MAAM,EAAEA,OAAO,EAAEF,SAAS,EAAEG,WAAW,EAAE,EAAEC,MAAM,EAAEC,cAAc,EAAE,GAAGN;IACtE,MAAMO,WAAWJ,QAAQK,IAAI,KAAK,WAAWL,QAAQI,QAAQ,GAAG;IAChE,MAAME,UAAU3B,iBACdkB,MAAMS,OAAO,KAAIF,4BAAAA,SAAUE,OAAO,KAAI,IACtCR;IAEF,MAAMS,YAAYV,EAAAA,mBAAAA,MAAMU,SAAS,qBAAfV,iBAAiBP,IAAI,QAAMc,4BAAAA,SAAUG,SAAS,KAAI;IACpE,MAAMR,OAAO,EAACD,kBAAAA,UAAUC,IAAI,YAAdD,kBAAkB,IAAIR,IAAI;IACxC;;;;GAIC,GACD,MAAMkB,kBAAkBL,iBACpB,CAAC,OAAO,EAAEtB,yBAAyB,EAAE,EAAEsB,gBAAgB,GACvD;IAEJ,IAAIH,QAAQK,IAAI,KAAK,QAAQ;QAC3B,MAAMI,cAAc9B,iBAAiBqB,QAAQU,IAAI,EAAEZ;QACnD,MAAMa,OAAO,GAAGF,cAAcD,iBAAiB;QAC/C,OAAO;YACLF;YACA;;;;;;;;;;;;;;;;;;;OAmBC,GACDM,MAAMT,iBACFvB,sBACEE,oBAAoB2B,aAAaH,SAASC,YAC1CJ,kBAEFrB,oBAAoB6B,MAAML,SAASC;YACvCI;YACAF;QACF;IACF;IAEA,MAAMI,WAAWnC,gBAAgB;QAC/BoC,OAAOd,QAAQI,QAAQ,CAACU,KAAK;QAC7B,wEAAwE;QACxE,wEAAwE;QACxEC,QAAQtC;QACR6B;QACAC;QACAS,UAAUjC;QACV,wEAAwE;QACxE,2EAA2E;QAC3E,gCAAgC;QAChCkC,aAAahB,YAAYiB;QACzBC,aAAajB;QACbkB,OAAO;YACL,iBAAiBtB,UAAUuB,KAAK;YAChC,gBAAgBtB;YAChB,mBAAmB,GAAEA,eAAAA,KAAKuB,KAAK,CAAC,MAAM,CAAC,EAAE,YAApBvB,eAAwB;YAC7C,YAAYE;YACZE,cAAc,EAAEA,yBAAAA,iBAAkB;QACpC;QACAoB,UAAUC,OAAOC,WAAW,CAC1BD,OAAOE,OAAO,EAAC1B,6BAAAA,QAAQI,QAAQ,CAACmB,QAAQ,YAAzBvB,6BAA6B,CAAC,GAAG2B,GAAG,CAAC,CAAC,CAACC,IAAIC,QAAQ;gBAIzDA;mBAJ8D;gBACrED;gBACAC,WAAW,aACNA;oBACHC,KAAKD,EAAAA,eAAAA,QAAQC,GAAG,qBAAXD,aAAaE,UAAU,CAAC,QACzB,GAAG9B,WAAW4B,QAAQC,GAAG,EAAE,GAC3BD,QAAQC,GAAG;;aAElB;;IAEL;IACA;;;;;;;;;;;;GAYC,GACD,MAAME,YAAWhC,qBAAAA,QAAQX,SAAS,qBAAjBW,mBAAmBV,IAAI;IACxC,MAAMmB,cAAcuB,WAChBrD,iBAAiBqD,UAAUlC,aAC3Be,SAASF,IAAI;IACjB,OAAO;QACLL;QACA;;;;;;;;;;;;;;;KAeC,GACDM,MAAMT,iBACFvB,sBAAsBiC,SAASD,IAAI,EAAET,kBACrCU,SAASD,IAAI;QACjBD,MAAM,GAAGF,cAAcD,iBAAiB;QACxCC;IACF;AACF;AAEA;;;;;;;;;CASC,GACD,OAAO,MAAMwB,mBAKR;IACH;QACEC,OAAO;QACPC,aAAa;IACf;IACA;QACED,OAAO;QACPC,aAAa;IACf;IACA;QAAED,OAAO;QAAaC,aAAa;IAAoC;CACxE,CAAA"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Put a CAUGHT error back on the path an uncaught one takes (AGL-1538).
|
|
19
|
+
*
|
|
20
|
+
* React 19 routes errors an error boundary catches to `console.error`, and
|
|
21
|
+
* only uncaught ones to `reportError` — so a boundary that renders quietly
|
|
22
|
+
* turns a reported crash into an invisible one. `reportError` dispatches an
|
|
23
|
+
* `error` event on `window`, which is the listener `installErrorBeacon`
|
|
24
|
+
* registers, so a re-dispatched failure lands in Cloud Error Reporting
|
|
25
|
+
* exactly as it would have without the boundary.
|
|
26
|
+
*
|
|
27
|
+
* Every error boundary in both apps needs this and each of them had grown its
|
|
28
|
+
* own copy of it. A module of its own rather than a function inside
|
|
29
|
+
* `error-beacon.ts`, which re-exports it: an error boundary importing one
|
|
30
|
+
* name off that file would drag the beacon's whole installer into its chunk,
|
|
31
|
+
* and a boundary's chunk is downloaded by every visitor whether or not
|
|
32
|
+
* anything ever throws.
|
|
33
|
+
*
|
|
34
|
+
* Optional and swallowed on both counts: jsdom and older Safari have no
|
|
35
|
+
* `reportError`, and reporting a failure may never be the thing that causes
|
|
36
|
+
* one.
|
|
37
|
+
*/
|
|
38
|
+
export declare function redispatchCaughtError(error: unknown): void;
|
|
@@ -0,0 +1,46 @@
|
|
|
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
|
+
* Put a CAUGHT error back on the path an uncaught one takes (AGL-1538).
|
|
18
|
+
*
|
|
19
|
+
* React 19 routes errors an error boundary catches to `console.error`, and
|
|
20
|
+
* only uncaught ones to `reportError` — so a boundary that renders quietly
|
|
21
|
+
* turns a reported crash into an invisible one. `reportError` dispatches an
|
|
22
|
+
* `error` event on `window`, which is the listener `installErrorBeacon`
|
|
23
|
+
* registers, so a re-dispatched failure lands in Cloud Error Reporting
|
|
24
|
+
* exactly as it would have without the boundary.
|
|
25
|
+
*
|
|
26
|
+
* Every error boundary in both apps needs this and each of them had grown its
|
|
27
|
+
* own copy of it. A module of its own rather than a function inside
|
|
28
|
+
* `error-beacon.ts`, which re-exports it: an error boundary importing one
|
|
29
|
+
* name off that file would drag the beacon's whole installer into its chunk,
|
|
30
|
+
* and a boundary's chunk is downloaded by every visitor whether or not
|
|
31
|
+
* anything ever throws.
|
|
32
|
+
*
|
|
33
|
+
* Optional and swallowed on both counts: jsdom and older Safari have no
|
|
34
|
+
* `reportError`, and reporting a failure may never be the thing that causes
|
|
35
|
+
* one.
|
|
36
|
+
*/ export function redispatchCaughtError(error) {
|
|
37
|
+
if (typeof window === 'undefined') return;
|
|
38
|
+
try {
|
|
39
|
+
;
|
|
40
|
+
window.reportError == null ? void 0 : window.reportError.call(window, error);
|
|
41
|
+
} catch (unused) {
|
|
42
|
+
// Reporting never breaks the page.
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=redispatch-caught-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/redispatch-caught-error.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 * Put a CAUGHT error back on the path an uncaught one takes (AGL-1538).\n *\n * React 19 routes errors an error boundary catches to `console.error`, and\n * only uncaught ones to `reportError` — so a boundary that renders quietly\n * turns a reported crash into an invisible one. `reportError` dispatches an\n * `error` event on `window`, which is the listener `installErrorBeacon`\n * registers, so a re-dispatched failure lands in Cloud Error Reporting\n * exactly as it would have without the boundary.\n *\n * Every error boundary in both apps needs this and each of them had grown its\n * own copy of it. A module of its own rather than a function inside\n * `error-beacon.ts`, which re-exports it: an error boundary importing one\n * name off that file would drag the beacon's whole installer into its chunk,\n * and a boundary's chunk is downloaded by every visitor whether or not\n * anything ever throws.\n *\n * Optional and swallowed on both counts: jsdom and older Safari have no\n * `reportError`, and reporting a failure may never be the thing that causes\n * one.\n */\nexport function redispatchCaughtError(error: unknown): void {\n if (typeof window === 'undefined') return\n try {\n ;(\n window as Window & { reportError?: (error: unknown) => void }\n ).reportError?.(error)\n } catch {\n // Reporting never breaks the page.\n }\n}\n"],"names":["redispatchCaughtError","error","window","reportError"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;CAoBC,GACD,OAAO,SAASA,sBAAsBC,KAAc;IAClD,IAAI,OAAOC,WAAW,aAAa;IACnC,IAAI;;QAEAA,OACAC,WAAW,oBAFZ,AACCD,OACAC,WAAW,MADXD,QACcD;IAClB,EAAE,eAAM;IACN,mCAAmC;IACrC;AACF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
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
|
+
export declare function setRegisteringPluginId(pluginId: string | undefined): void;
|
|
18
|
+
/** The plugin whose register fn is running, or undefined outside registration. */
|
|
19
|
+
export declare function getRegisteringPluginId(): string | undefined;
|
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
* Which plugin's register fn is currently running.
|
|
18
|
+
*
|
|
19
|
+
* A LEAF module on purpose — it imports nothing, so anything may import it
|
|
20
|
+
* without risking a cycle. This lived in `api-plugins`, which is reachable
|
|
21
|
+
* only through the `/server` entry; when `site-page-hooks` (in the shared
|
|
22
|
+
* plugin-manager barrel, client and server both) reached for it, the cycle
|
|
23
|
+
* that created left the binding missing at runtime and the server threw
|
|
24
|
+
* `ReferenceError: getRegisteringPluginId is not defined` (AGL-1289).
|
|
25
|
+
*
|
|
26
|
+
* The marker is set by the plugin loader around each register-fn call, so any
|
|
27
|
+
* registry can record who registered what: `registerPluginApiRoute` uses it
|
|
28
|
+
* for path→plugin ownership, `registerSitePageEnricher` for attributing a
|
|
29
|
+
* page contribution back to the plugin that produced it.
|
|
30
|
+
*/ let registeringPluginId;
|
|
31
|
+
export function setRegisteringPluginId(pluginId) {
|
|
32
|
+
registeringPluginId = pluginId;
|
|
33
|
+
}
|
|
34
|
+
/** The plugin whose register fn is running, or undefined outside registration. */ export function getRegisteringPluginId() {
|
|
35
|
+
return registeringPluginId;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=registering-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/registering-plugin.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 * Which plugin's register fn is currently running.\n *\n * A LEAF module on purpose — it imports nothing, so anything may import it\n * without risking a cycle. This lived in `api-plugins`, which is reachable\n * only through the `/server` entry; when `site-page-hooks` (in the shared\n * plugin-manager barrel, client and server both) reached for it, the cycle\n * that created left the binding missing at runtime and the server threw\n * `ReferenceError: getRegisteringPluginId is not defined` (AGL-1289).\n *\n * The marker is set by the plugin loader around each register-fn call, so any\n * registry can record who registered what: `registerPluginApiRoute` uses it\n * for path→plugin ownership, `registerSitePageEnricher` for attributing a\n * page contribution back to the plugin that produced it.\n */\nlet registeringPluginId: string | undefined\n\nexport function setRegisteringPluginId(pluginId: string | undefined): void {\n registeringPluginId = pluginId\n}\n\n/** The plugin whose register fn is running, or undefined outside registration. */\nexport function getRegisteringPluginId(): string | undefined {\n return registeringPluginId\n}\n"],"names":["registeringPluginId","setRegisteringPluginId","pluginId","getRegisteringPluginId"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;CAcC,GACD,IAAIA;AAEJ,OAAO,SAASC,uBAAuBC,QAA4B;IACjEF,sBAAsBE;AACxB;AAEA,gFAAgF,GAChF,OAAO,SAASC;IACd,OAAOH;AACT"}
|