@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 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/email-topics.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 * EMAIL TOPICS — the streams a recipient can leave one at a time.\n *\n * ## The gap this closes\n *\n * `docs/specs/email-competitive-gaps.md` §1f records the only row in that\n * table where every competitor has something and we have nothing: \"Preference\n * center / subscription topics — unsubscribe is all-or-nothing per site\".\n * A recipient who wanted the newsletter but not the sales mail had exactly one\n * lever, and pulling it took the newsletter too. The lever people reach for\n * when the only unsubscribe is total is \"report spam\", which is a complaint,\n * which is the sending domain's problem and therefore every tenant's.\n *\n * ## Scope: definitions are ORG-shared, opt-outs are PER-SITE\n *\n * The topic CATALOG lives at `orgs/{orgId}/emailTopics`, which is where\n * `lists` live (AGL-254) and for the same reason: a topic is authored\n * editorial content — a name and a sentence of description — that an agency\n * writes once and points several sites at. Following `lists` also means the\n * console surface that manages topics inherits a scoping question that has\n * already been answered, rather than inventing a second answer.\n *\n * A recipient's OPT-OUT is per site, at `hosts/{hostId}/topicOptOuts`. It sits\n * beside `hosts/{hostId}/suppressions`, which is per site, and it answers the\n * same shape of question one notch finer: the suppression says \"nothing from\n * this site\", the opt-out says \"not this stream from this site\". Two facts\n * about one person that live at different scopes would make \"may I mail this\n * person about product updates\" a question with two answers. It also keeps\n * the unauthenticated preference page honest — the signed link names a host\n * and nothing else, so a per-site read is exactly what the link authorizes.\n *\n * ## Why the defaults are code and not seeded documents\n *\n * Every tenant that exists today has an empty `emailTopics` collection. A\n * seeding migration would have to run against every org, would leave any org\n * created while it was mid-flight with none, and — like every backfill — is a\n * thing that gets written and then not run. So {@link DEFAULT_EMAIL_TOPICS} is\n * the floor of the catalog rather than its initial contents: it is present for\n * every org from the moment this ships, with no write anywhere, and a stored\n * document at the same id renames, re-describes or archives one. The catalog a\n * reader sees is {@link mergeEmailTopics} of the two.\n */\n\n/** One subscribable stream. */\nexport interface EmailTopic {\n /**\n * The stored id. Rides in the unsubscribe link's `tid` and is covered by\n * its signature, so it is treated as persisted — rename the {@link name},\n * never the id.\n */\n id: string\n /** What the recipient sees on the preference page. */\n name: string\n /** One sentence of \"what will I get\", shown under the name. */\n description: string\n /**\n * Retired. An archived topic stays in the catalog for the send path and the\n * preference page's history, and is hidden from the composer's picker —\n * campaigns already sent under it must go on resolving, or their unsubscribe\n * links stop naming anything.\n */\n archived?: boolean\n /**\n * Whether joining this stream needs a confirmation click.\n *\n * `undefined` — the ordinary state — means \"whatever the site says\", which\n * is what {@link topicRequiresDoubleOptIn} resolves. A stored `true` or\n * `false` is a decision made about THIS stream and overrides the site: a\n * merchant who confirms their newsletter and not their order-related\n * product updates is expressing something real, and a per-site switch alone\n * cannot hold it.\n */\n doubleOptIn?: boolean\n}\n\n/**\n * DOUBLE OPT-IN — per topic, defaulting per site.\n *\n * `docs/specs/email-competitive-gaps.md` P8. Of the ten vendors surveyed\n * **none mandates it**, so this is an option and never a default: the field\n * above is absent everywhere until a merchant turns it on, and the site\n * default is off.\n *\n * ## Why per topic, with a per-site default\n *\n * Three reasons, and the first is the one that decides it.\n *\n * The recipient-facing vocabulary is ALREADY per topic. The signed link\n * carries `tid`, the opt-out record is keyed by topic, and the preference\n * page is a list of topics. A confirmation scoped to anything else would need\n * a second vocabulary to express \"confirmed for what\", and the recipient\n * would meet both.\n *\n * It is also the axis the compared products chose — Brevo and Klaviyo offer\n * double opt-in per LIST — and a topic is our per-list.\n *\n * The site default exists because the merchant who wants this usually wants\n * it everywhere: in the jurisdictions where a DOI is the accepted proof of\n * consent, \"on for the newsletter but not for the four others\" is not the\n * answer they are after, and asking them to set it on each topic they now\n * have plus each one they later add is the shape that gets half-done.\n *\n * ## What it must have to be worth anything\n *\n * ActiveCampaign is the implementation worth copying because it has teeth:\n * an unconfirmed subscriber lands in a real quarantine and \"you cannot send\n * any emails to contacts that have this status\". Recording a pending\n * confirmation that the send path then ignores is Customer.io's DIY recipe,\n * whose own documentation warns that it \"doesn't automatically check this\n * attribute before sending messages\" — a fact stored and not enforced. So the\n * state below is read by `filterTopicSendable`, in the same pass that reads\n * the opt-outs.\n *\n * ## On the law, precisely\n *\n * No jurisdiction verified requires double opt-in by statute. They require\n * prior express consent plus a burden of proof on the sender — EU ePrivacy\n * Art. 13(1), German UWG §7(2), Canada's CASL s.13. Germany's own\n * certification body says a DOI is not required by law and then explains why\n * everyone does it anyway: the proof has so far been recognized by the courts\n * exclusively via a DOI. The law requires provable consent; a DOI is the\n * accepted proof.\n */\nexport const DEFAULT_SITE_DOUBLE_OPT_IN = false\n\n/**\n * How long a confirmation link stays good.\n *\n * 72 hours, Klaviyo's number rather than one of our own. Brevo's is 30 days,\n * which is long enough that the click stops being evidence of anything\n * contemporaneous; the point of the confirmation is to show that the person\n * holding that mailbox wanted this, and a month-old click shows it much less\n * well than a same-day one.\n *\n * Expiry stops the LINK working. It does not make an unconfirmed address\n * mailable — see {@link readTopicSubscriptionState}, where the two are\n * deliberately separate questions.\n */\nexport const DOUBLE_OPT_IN_EXPIRY_MS = 72 * 60 * 60 * 1000\n\n/**\n * Whether joining `topic` on this site needs a confirmation click.\n *\n * The topic's own setting when it has one, the site's otherwise. `false`\n * stored on a topic is a real answer and not an absence, which is what lets a\n * merchant confirm everything except their order-related stream.\n */\nexport function topicRequiresDoubleOptIn(\n topic: Pick<EmailTopic, 'doubleOptIn'> | null | undefined,\n siteDefault: boolean = DEFAULT_SITE_DOUBLE_OPT_IN,\n): boolean {\n return typeof topic?.doubleOptIn === 'boolean'\n ? topic.doubleOptIn\n : siteDefault === true\n}\n\n/** What one person's record says about one stream on one site. */\nexport type TopicSubscriptionState =\n /** They may be mailed about this. */\n | 'subscribed'\n /** Asked to join and has not confirmed. NOT mailable. */\n | 'pending'\n /** Left this stream and has not rejoined. NOT mailable. */\n | 'opted-out'\n\n/** One entry in a `topicOptOuts` document's `topics` map, as stored. */\nexport interface TopicSubscriptionEntry {\n optedOutAt?: unknown\n resubscribedAt?: unknown\n /** When a confirmation was asked for. */\n pendingAt?: unknown\n /** When they confirmed, or absent/null while they have not. */\n confirmedAt?: unknown\n}\n\n/**\n * What an entry means, in one place, for every reader.\n *\n * ## Why this is a function and not a field test at each site\n *\n * There were two fields and one test — \"an entry with no `resubscribedAt` is a\n * live opt-out\" — written out at three call sites. Adding a third and fourth\n * field breaks that test everywhere it appears at once: a CONFIRMED entry\n * carries `pendingAt` and `confirmedAt` and no `resubscribedAt`, so the old\n * shorthand reads it as somebody who left. Nobody would find that by reading\n * one call site.\n *\n * ## Precedence: a refusal outranks a pending confirmation\n *\n * Somebody who left a stream and never rejoined is opted out even if a\n * confirmation was once asked of them, because leaving is the more recent and\n * more explicit act — and because a pending confirmation that could outrank a\n * refusal would be a way to re-arm sending by asking again.\n *\n * ## An EXPIRED confirmation is still not a subscriber\n *\n * Expiry stops the link working; it does not admit anybody. The alternative —\n * treating a lapsed pending record as subscribed — would make the whole\n * mechanism a delay rather than a gate, and waiting it out would be the way\n * past it.\n */\nexport function readTopicSubscriptionState(\n entry: TopicSubscriptionEntry | null | undefined,\n): TopicSubscriptionState {\n if (!entry) return 'subscribed'\n if (entry.optedOutAt && !entry.resubscribedAt) return 'opted-out'\n if (entry.pendingAt && !entry.confirmedAt) return 'pending'\n return 'subscribed'\n}\n\n/**\n * Whether a confirmation request is too old to be acted on.\n *\n * A separate question from {@link readTopicSubscriptionState} on purpose: one\n * answers \"may we mail them\", the other answers \"does this link still work\",\n * and collapsing them is how an expiry comes to admit somebody.\n */\nexport function doubleOptInExpired(\n pendingAtMs: number | null | undefined,\n nowMs: number,\n): boolean {\n const at = Number(pendingAtMs)\n if (!Number.isFinite(at) || at <= 0) return true\n return nowMs - at > DOUBLE_OPT_IN_EXPIRY_MS\n}\n\n/** `orgs/{orgId}/emailTopics` — the catalog, org-shared like `lists`. */\nexport const EMAIL_TOPICS_COLLECTION = 'emailTopics'\n\n/** `hosts/{hostId}/topicOptOuts/{emailKey}` — one document per recipient. */\nexport const TOPIC_OPT_OUTS_SUBCOLLECTION = 'topicOptOuts'\n\n/*==========================================\n * THE BUILT-IN STREAM IDS.\n *\n * Named rather than written as literals wherever a send declares which stream\n * it belongs to, because a mistyped id does not fail loudly. It names a\n * stream nobody has opted out of, so `filterTopicSendable` finds no opt-out\n * and the send goes to everybody — the control silently doing nothing, which\n * is the failure mode a topic filter is least able to reveal.\n *\n * The value is also a Firestore path component and a colon-joined component\n * of the unsubscribe link's signed subject, so it is a wire format: changing\n * one of these strings orphans every opt-out already recorded against it.\n *=========================================*/\n\n/** Sales, discounts, seasonal campaigns — and the cart a shopper left. */\nexport const EMAIL_TOPIC_MARKETING = 'marketing'\n/** Regular news and stories, including a site's posts to its members. */\nexport const EMAIL_TOPIC_NEWSLETTER = 'newsletter'\n/** New products, restocks, and changes to what a site offers. */\nexport const EMAIL_TOPIC_PRODUCT_UPDATES = 'product-updates'\n/** One person here writing to another about working together. */\nexport const EMAIL_TOPIC_SALES = 'sales'\n\n/**\n * The catalog every org has before anyone opens the console.\n *\n * Four, not twelve. A preference page whose value is \"leave one stream without\n * leaving all of them\" stops working the moment the list is long enough that\n * reading it is a chore, and a merchant who needs a fifth can add one. The ids\n * are the generic names an unsubscribing recipient can recognize without\n * knowing anything about the sender's internal vocabulary.\n */\nexport const DEFAULT_EMAIL_TOPICS: readonly EmailTopic[] = [\n {\n id: EMAIL_TOPIC_MARKETING,\n name: 'Promotions and offers',\n description: 'Sales, discounts and seasonal campaigns.',\n },\n {\n id: EMAIL_TOPIC_NEWSLETTER,\n name: 'Newsletter',\n description: 'Regular news and stories from us.',\n },\n {\n id: EMAIL_TOPIC_PRODUCT_UPDATES,\n name: 'Product updates',\n description: 'New products, restocks and changes to what we offer.',\n },\n {\n id: EMAIL_TOPIC_SALES,\n name: 'Sales outreach',\n description: 'Messages from a person here about working together.',\n },\n]\n\n/**\n * The topic a campaign carries when its author picked none.\n *\n * Every campaign resolves to SOME topic, because a campaign with no topic\n * would mint an unsubscribe link the preference page cannot place — it could\n * offer the catalog but not say which entry this message was, which is the one\n * thing the recipient came to the page knowing.\n */\nexport const DEFAULT_CAMPAIGN_TOPIC_ID = EMAIL_TOPIC_MARKETING\n\n/**\n * WHICH STREAM AN AUTOMATED EMAIL BELONGS TO — the one answer, named once.\n *\n * An immediate reply belongs to no stream unless the step named one; anything\n * that goes out on the merchant's schedule belongs to the default stream, as a\n * campaign does. See `FlowEmailScope` for why the two differ.\n *\n * The rule is read TWICE per send — the flow gate filters on it, and the\n * executor signs it into the opt-out link so the preference page opens on the\n * stream the recipient was trying to leave rather than on a list they have to\n * search — so it lives here, in the pure leaf both sides can import, rather\n * than beside either reader. Two spellings of it is how a link comes to name\n * a stream the gate did not check.\n *\n * @returns the topic id, or `''` for a message that belongs to no stream —\n * which is not \"the default topic\", and must not be signed into a\n * link as one.\n */\nexport function flowEmailTopicId(\n topicId: string | null | undefined,\n scope?: 'scheduled' | 'immediate',\n): string {\n const named = String(topicId ?? '').trim()\n return scope === 'immediate' ? named : named || DEFAULT_CAMPAIGN_TOPIC_ID\n}\n\n/**\n * Whether `value` may be a topic id.\n *\n * Two constraints, and the second is the load-bearing one. The id becomes a\n * Firestore path component, so it carries `isDocumentId`'s rules; and it\n * becomes a COLON-JOINED component of the unsubscribe link's signed subject,\n * so a colon inside it would let one signed subject be read as two different\n * parameter tuples. See `signatureMatches` in the email plugin's\n * `unsubscribe-link.ts` for what that ambiguity would buy.\n */\nexport function isEmailTopicId(value: unknown): value is string {\n return (\n typeof value === 'string' &&\n value.length > 0 &&\n value.length <= 120 &&\n !value.includes('/') &&\n !value.includes(':') &&\n value !== '.' &&\n value !== '..' &&\n !/^__.*__$/.test(value)\n )\n}\n\n/** Coerces one stored document into a topic, or `null` if it is not one. */\nexport function normalizeEmailTopic(\n id: unknown,\n data: Record<string, unknown> | null | undefined,\n): EmailTopic | null {\n if (!isEmailTopicId(id)) return null\n const name = String(data?.['name'] ?? '').trim()\n return {\n id,\n // A nameless stored document falls back to the id rather than rendering a\n // blank checkbox on the preference page. The console refuses to create\n // one; a restore or an API write is not bound by that.\n name: name || id,\n description: String(data?.['description'] ?? '').trim(),\n ...(data?.['archived'] === true ? { archived: true as const } : {}),\n /*\n * Carried only when the document actually holds a boolean.\n *\n * A missing field and a stored `false` are different answers here —\n * `topicRequiresDoubleOptIn` reads absence as \"ask the site\" and `false`\n * as \"not this stream, whatever the site says\" — so coercing with `===\n * true` the way `archived` does would erase the second of the three\n * states this field has.\n */\n ...(typeof data?.['doubleOptIn'] === 'boolean'\n ? { doubleOptIn: data['doubleOptIn'] as boolean }\n : {}),\n }\n}\n\n/**\n * The catalog a reader sees: the built-in floor, overlaid by whatever the org\n * has stored, plus the org's own topics.\n *\n * Overlay rather than replace, so an org that adds one custom topic does not\n * thereby delete the four every one of its recipients has been unsubscribing\n * against. A built-in is removed by storing it `archived`, which is a\n * decision someone made rather than a side effect of making a different one.\n *\n * Sorted with the built-ins first in their declared order and custom topics\n * alphabetically after, so the preference page's checkbox order is stable\n * across renders and across sites.\n */\nexport function mergeEmailTopics(\n stored: readonly EmailTopic[] | null | undefined,\n): EmailTopic[] {\n const overrides = new Map<string, EmailTopic>()\n for (const topic of stored ?? []) {\n if (isEmailTopicId(topic?.id)) overrides.set(topic.id, topic)\n }\n const builtIn = DEFAULT_EMAIL_TOPICS.map(\n (topic) => overrides.get(topic.id) ?? topic,\n )\n const custom = [...overrides.values()]\n .filter((topic) => !DEFAULT_EMAIL_TOPICS.some((it) => it.id === topic.id))\n .sort((a, b) => a.name.localeCompare(b.name))\n return [...builtIn, ...custom]\n}\n\n/**\n * The catalog minus retired topics — what a composer's picker and a\n * preference page's checkboxes offer.\n *\n * The send path deliberately does NOT filter through this: a scheduled\n * campaign whose topic was archived between scheduling and sending still\n * belongs to that topic, and re-pointing it at something else would attribute\n * the unsubscribes to the wrong stream.\n */\nexport function activeEmailTopics(\n topics: readonly EmailTopic[],\n): EmailTopic[] {\n return topics.filter((topic) => !topic.archived)\n}\n\n/**\n * The topic a campaign belongs to, given what it stored and what the org\n * offers.\n *\n * Resolves an unknown or missing id to the default rather than to nothing: a\n * campaign sent before topics existed carries no `topicId`, and its\n * unsubscribe links are in inboxes right now. They must land on a preference\n * page that names A topic, not on one that says the message came from\n * nowhere.\n */\nexport function resolveCampaignTopic(\n topicId: string | null | undefined,\n topics: readonly EmailTopic[],\n): EmailTopic {\n const found = topicId\n ? topics.find((topic) => topic.id === topicId)\n : undefined\n if (found) return found\n return (\n topics.find((topic) => topic.id === DEFAULT_CAMPAIGN_TOPIC_ID) ??\n topics[0] ?? {\n id: DEFAULT_CAMPAIGN_TOPIC_ID,\n name: 'Email',\n description: '',\n }\n )\n}\n"],"names":["DEFAULT_SITE_DOUBLE_OPT_IN","DOUBLE_OPT_IN_EXPIRY_MS","topicRequiresDoubleOptIn","topic","siteDefault","doubleOptIn","readTopicSubscriptionState","entry","optedOutAt","resubscribedAt","pendingAt","confirmedAt","doubleOptInExpired","pendingAtMs","nowMs","at","Number","isFinite","EMAIL_TOPICS_COLLECTION","TOPIC_OPT_OUTS_SUBCOLLECTION","EMAIL_TOPIC_MARKETING","EMAIL_TOPIC_NEWSLETTER","EMAIL_TOPIC_PRODUCT_UPDATES","EMAIL_TOPIC_SALES","DEFAULT_EMAIL_TOPICS","id","name","description","DEFAULT_CAMPAIGN_TOPIC_ID","flowEmailTopicId","topicId","scope","named","String","trim","isEmailTopicId","value","length","includes","test","normalizeEmailTopic","data","archived","mergeEmailTopics","stored","overrides","Map","set","builtIn","map","get","custom","values","filter","some","it","sort","a","b","localeCompare","activeEmailTopics","topics","resolveCampaignTopic","found","find","undefined"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyCC,GAED,6BAA6B;AAgC7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CC,GACD,OAAO,MAAMA,6BAA6B,MAAK;AAE/C;;;;;;;;;;;;CAYC,GACD,OAAO,MAAMC,0BAA0B,KAAK,KAAK,KAAK,KAAI;AAE1D;;;;;;CAMC,GACD,OAAO,SAASC,yBACdC,KAAyD,EACzDC,cAAuBJ,0BAA0B;IAEjD,OAAO,QAAOG,yBAAAA,MAAOE,WAAW,MAAK,YACjCF,MAAME,WAAW,GACjBD,gBAAgB;AACtB;AAqBA;;;;;;;;;;;;;;;;;;;;;;;;;CAyBC,GACD,OAAO,SAASE,2BACdC,KAAgD;IAEhD,IAAI,CAACA,OAAO,OAAO;IACnB,IAAIA,MAAMC,UAAU,IAAI,CAACD,MAAME,cAAc,EAAE,OAAO;IACtD,IAAIF,MAAMG,SAAS,IAAI,CAACH,MAAMI,WAAW,EAAE,OAAO;IAClD,OAAO;AACT;AAEA;;;;;;CAMC,GACD,OAAO,SAASC,mBACdC,WAAsC,EACtCC,KAAa;IAEb,MAAMC,KAAKC,OAAOH;IAClB,IAAI,CAACG,OAAOC,QAAQ,CAACF,OAAOA,MAAM,GAAG,OAAO;IAC5C,OAAOD,QAAQC,KAAKd;AACtB;AAEA,uEAAuE,GACvE,OAAO,MAAMiB,0BAA0B,cAAa;AAEpD,2EAA2E,GAC3E,OAAO,MAAMC,+BAA+B,eAAc;AAE1D;;;;;;;;;;;;2CAY2C,GAE3C,wEAAwE,GACxE,OAAO,MAAMC,wBAAwB,YAAW;AAChD,uEAAuE,GACvE,OAAO,MAAMC,yBAAyB,aAAY;AAClD,+DAA+D,GAC/D,OAAO,MAAMC,8BAA8B,kBAAiB;AAC5D,+DAA+D,GAC/D,OAAO,MAAMC,oBAAoB,QAAO;AAExC;;;;;;;;CAQC,GACD,OAAO,MAAMC,uBAA8C;IACzD;QACEC,IAAIL;QACJM,MAAM;QACNC,aAAa;IACf;IACA;QACEF,IAAIJ;QACJK,MAAM;QACNC,aAAa;IACf;IACA;QACEF,IAAIH;QACJI,MAAM;QACNC,aAAa;IACf;IACA;QACEF,IAAIF;QACJG,MAAM;QACNC,aAAa;IACf;CACD,CAAA;AAED;;;;;;;CAOC,GACD,OAAO,MAAMC,4BAA4BR,sBAAqB;AAE9D;;;;;;;;;;;;;;;;;CAiBC,GACD,OAAO,SAASS,iBACdC,OAAkC,EAClCC,KAAiC;IAEjC,MAAMC,QAAQC,OAAOH,kBAAAA,UAAW,IAAII,IAAI;IACxC,OAAOH,UAAU,cAAcC,QAAQA,SAASJ;AAClD;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASO,eAAeC,KAAc;IAC3C,OACE,OAAOA,UAAU,YACjBA,MAAMC,MAAM,GAAG,KACfD,MAAMC,MAAM,IAAI,OAChB,CAACD,MAAME,QAAQ,CAAC,QAChB,CAACF,MAAME,QAAQ,CAAC,QAChBF,UAAU,OACVA,UAAU,QACV,CAAC,WAAWG,IAAI,CAACH;AAErB;AAEA,0EAA0E,GAC1E,OAAO,SAASI,oBACdf,EAAW,EACXgB,IAAgD;;IAEhD,IAAI,CAACN,eAAeV,KAAK,OAAO;IAChC,MAAMC,OAAOO,eAAOQ,wBAAAA,IAAM,CAAC,OAAO,mBAAI,IAAIP,IAAI;IAC9C,OAAO;QACLT;QACA,0EAA0E;QAC1E,uEAAuE;QACvE,uDAAuD;QACvDC,MAAMA,QAAQD;QACdE,aAAaM,gBAAOQ,wBAAAA,IAAM,CAAC,cAAc,oBAAI,IAAIP,IAAI;OACjDO,CAAAA,wBAAAA,IAAM,CAAC,WAAW,MAAK,OAAO;QAAEC,UAAU;IAAc,IAAI,CAAC,GAU7D,QAAOD,wBAAAA,IAAM,CAAC,cAAc,MAAK,YACjC;QAAEpC,aAAaoC,IAAI,CAAC,cAAc;IAAY,IAC9C,CAAC;AAET;AAEA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASE,iBACdC,MAAgD;IAEhD,MAAMC,YAAY,IAAIC;IACtB,KAAK,MAAM3C,SAASyC,iBAAAA,SAAU,EAAE,CAAE;QAChC,IAAIT,eAAehC,yBAAAA,MAAOsB,EAAE,GAAGoB,UAAUE,GAAG,CAAC5C,MAAMsB,EAAE,EAAEtB;IACzD;IACA,MAAM6C,UAAUxB,qBAAqByB,GAAG,CACtC,CAAC9C;YAAU0C;gBAAAA,iBAAAA,UAAUK,GAAG,CAAC/C,MAAMsB,EAAE,aAAtBoB,iBAA2B1C;;IAExC,MAAMgD,SAAS;WAAIN,UAAUO,MAAM;KAAG,CACnCC,MAAM,CAAC,CAAClD,QAAU,CAACqB,qBAAqB8B,IAAI,CAAC,CAACC,KAAOA,GAAG9B,EAAE,KAAKtB,MAAMsB,EAAE,GACvE+B,IAAI,CAAC,CAACC,GAAGC,IAAMD,EAAE/B,IAAI,CAACiC,aAAa,CAACD,EAAEhC,IAAI;IAC7C,OAAO;WAAIsB;WAAYG;KAAO;AAChC;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASS,kBACdC,MAA6B;IAE7B,OAAOA,OAAOR,MAAM,CAAC,CAAClD,QAAU,CAACA,MAAMuC,QAAQ;AACjD;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASoB,qBACdhC,OAAkC,EAClC+B,MAA6B;QAO3BA,MAAAA;IALF,MAAME,QAAQjC,UACV+B,OAAOG,IAAI,CAAC,CAAC7D,QAAUA,MAAMsB,EAAE,KAAKK,WACpCmC;IACJ,IAAIF,OAAO,OAAOA;IAClB,QACEF,QAAAA,eAAAA,OAAOG,IAAI,CAAC,CAAC7D,QAAUA,MAAMsB,EAAE,KAAKG,sCAApCiC,eACAA,MAAM,CAAC,EAAE,YADTA,OACa;QACXpC,IAAIG;QACJF,MAAM;QACNC,aAAa;IACf;AAEJ"}
|
|
@@ -0,0 +1,100 @@
|
|
|
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
|
+
* The EDITOR's view of per-site plugin enablement (AGL-1014).
|
|
19
|
+
*
|
|
20
|
+
* `enabledPlugins` is a boundary, not a preference, and the issue names four
|
|
21
|
+
* surfaces that must enforce it identically: console navigation, the editor,
|
|
22
|
+
* published sites, and API dispatch. The other three read
|
|
23
|
+
* `resolveHostEnabledPlugins` on the server or subtract the deny-list in the
|
|
24
|
+
* console shell. This context is how the same answer reaches the besigner —
|
|
25
|
+
* the host app resolves it (only it can read an org and a host) and publishes
|
|
26
|
+
* it; the designer stays storage-agnostic.
|
|
27
|
+
*
|
|
28
|
+
* It has to be a READ-TIME filter rather than a narrower load. The preset
|
|
29
|
+
* registry is a module-global union that only ever grows: `consolePluginLoader`
|
|
30
|
+
* never unloads a bundle, and a plugin whose site components registered while
|
|
31
|
+
* editing site A goes on offering palette entries on site B. Loading less
|
|
32
|
+
* cannot un-register what is already there, so the component drawer filters
|
|
33
|
+
* every entry against this set instead.
|
|
34
|
+
*
|
|
35
|
+
* `undefined` means no set was supplied and leaves consumers unfiltered — the
|
|
36
|
+
* same opt-in shape `listConsoleExtensions` uses, so surfaces with no host
|
|
37
|
+
* (the platform email editor, tests) behave exactly as before.
|
|
38
|
+
*/
|
|
39
|
+
export declare const EnabledPluginsContext: import("react").Context<readonly string[]>;
|
|
40
|
+
/** The edited site's effective plugin ids, or undefined where none is set. */
|
|
41
|
+
export declare function useEnabledPlugins(): readonly string[] | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Whether a registry entry's owning plugin runs on the site being edited.
|
|
44
|
+
*
|
|
45
|
+
* An entry with no `pluginId` belongs to no plugin, so no deny-list entry can
|
|
46
|
+
* name it and it passes; so does everything when no set was supplied.
|
|
47
|
+
*/
|
|
48
|
+
/**
|
|
49
|
+
* Component categories whose entries follow a per-site CAPABILITY rather
|
|
50
|
+
* than the bundle that ships them (AGL-2486).
|
|
51
|
+
*
|
|
52
|
+
* The Members blocks — Member sign-in, Member sign-up, Password recovery —
|
|
53
|
+
* are registered by the COMMERCE bundle, so `pluginId` alone said "commerce
|
|
54
|
+
* is on, offer them" on sites whose `/signin`, `/signup` and `/recover`
|
|
55
|
+
* return 404. An author drops a sign-in block on a page, publishes it, and
|
|
56
|
+
* finds out from a visitor.
|
|
57
|
+
*
|
|
58
|
+
* Attribution by category rather than by re-registering the components
|
|
59
|
+
* under the `accounts` id: re-registering moves where they LOAD from and
|
|
60
|
+
* would change what sites already using those blocks serve. This map is
|
|
61
|
+
* read-time only — it decides what the picker OFFERS, never what a page
|
|
62
|
+
* that already contains one renders.
|
|
63
|
+
*/
|
|
64
|
+
export declare const CATEGORY_REQUIRED_CAPABILITY: Readonly<Record<string, string>>;
|
|
65
|
+
/**
|
|
66
|
+
* Whether a category's required capability (if it has one) runs on the site
|
|
67
|
+
* being edited. Categories with no requirement always pass, as does
|
|
68
|
+
* everything when no set was supplied.
|
|
69
|
+
*/
|
|
70
|
+
export declare function isCategoryCapabilityEnabled(category: string | undefined, enabledPluginIds: readonly string[] | undefined): boolean;
|
|
71
|
+
export declare function isFromEnabledPlugin(item: {
|
|
72
|
+
pluginId?: string;
|
|
73
|
+
} | undefined, enabledPluginIds: readonly string[] | undefined): boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Whether a REGISTERED component must be drawn as though it were not
|
|
76
|
+
* registered at all, because its first-party plugin does not run on the site
|
|
77
|
+
* being rendered (AGL-3033).
|
|
78
|
+
*
|
|
79
|
+
* The component registry is process-global and only grows. On a server that
|
|
80
|
+
* serves many sites, a bundle one site's page loaded stays registered for
|
|
81
|
+
* every later render, so asking the registry alone draws a switched-off
|
|
82
|
+
* plugin's elements in full on a site that switched it off — while that
|
|
83
|
+
* site's browser, which never loads the bundle, draws the unregistered
|
|
84
|
+
* fallback. The HTML shows what the site switched off, and hydration fails on
|
|
85
|
+
* the difference. Asking the rendered site's plugin set as well makes the
|
|
86
|
+
* server and the browser give one answer.
|
|
87
|
+
*
|
|
88
|
+
* Only a FIRST-PARTY id is asked about. A marketplace bundle's components name
|
|
89
|
+
* the id in its manifest, which is not the listing id the site's set carries,
|
|
90
|
+
* and a component naming no plugin belongs to none. Both render as registered,
|
|
91
|
+
* as does the base library, which no site can switch off.
|
|
92
|
+
*
|
|
93
|
+
* An EMPTY set is no answer. Every set a site resolves carries the base
|
|
94
|
+
* library, so an empty one is a surface saying it has no site to answer for —
|
|
95
|
+
* the console's editor gate publishes `[]` while the URL names no workspace it
|
|
96
|
+
* has resolved — and drawing every element there as unregistered would blank
|
|
97
|
+
* the canvas. It renders as though no set was supplied.
|
|
98
|
+
*/
|
|
99
|
+
export declare function isSwitchedOffForRenderedSite(pluginId: string | undefined, enabledPluginIds: readonly string[] | undefined): boolean;
|
|
100
|
+
export default EnabledPluginsContext;
|
|
@@ -0,0 +1,113 @@
|
|
|
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
|
+
*/ import { createContext, useContext } from "react";
|
|
17
|
+
import { ComponentCategory } from "../foundation/constants/components.js";
|
|
18
|
+
import { ACCOUNTS_PLUGIN_ID, isFirstPartyPlugin, isLockedOnForSite } from "../plugin-manager/enabled-plugins.js";
|
|
19
|
+
/**
|
|
20
|
+
* The EDITOR's view of per-site plugin enablement (AGL-1014).
|
|
21
|
+
*
|
|
22
|
+
* `enabledPlugins` is a boundary, not a preference, and the issue names four
|
|
23
|
+
* surfaces that must enforce it identically: console navigation, the editor,
|
|
24
|
+
* published sites, and API dispatch. The other three read
|
|
25
|
+
* `resolveHostEnabledPlugins` on the server or subtract the deny-list in the
|
|
26
|
+
* console shell. This context is how the same answer reaches the besigner —
|
|
27
|
+
* the host app resolves it (only it can read an org and a host) and publishes
|
|
28
|
+
* it; the designer stays storage-agnostic.
|
|
29
|
+
*
|
|
30
|
+
* It has to be a READ-TIME filter rather than a narrower load. The preset
|
|
31
|
+
* registry is a module-global union that only ever grows: `consolePluginLoader`
|
|
32
|
+
* never unloads a bundle, and a plugin whose site components registered while
|
|
33
|
+
* editing site A goes on offering palette entries on site B. Loading less
|
|
34
|
+
* cannot un-register what is already there, so the component drawer filters
|
|
35
|
+
* every entry against this set instead.
|
|
36
|
+
*
|
|
37
|
+
* `undefined` means no set was supplied and leaves consumers unfiltered — the
|
|
38
|
+
* same opt-in shape `listConsoleExtensions` uses, so surfaces with no host
|
|
39
|
+
* (the platform email editor, tests) behave exactly as before.
|
|
40
|
+
*/ export const EnabledPluginsContext = createContext(undefined);
|
|
41
|
+
EnabledPluginsContext.displayName = 'EnabledPluginsContext';
|
|
42
|
+
/** The edited site's effective plugin ids, or undefined where none is set. */ export function useEnabledPlugins() {
|
|
43
|
+
return useContext(EnabledPluginsContext);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Whether a registry entry's owning plugin runs on the site being edited.
|
|
47
|
+
*
|
|
48
|
+
* An entry with no `pluginId` belongs to no plugin, so no deny-list entry can
|
|
49
|
+
* name it and it passes; so does everything when no set was supplied.
|
|
50
|
+
*/ /**
|
|
51
|
+
* Component categories whose entries follow a per-site CAPABILITY rather
|
|
52
|
+
* than the bundle that ships them (AGL-2486).
|
|
53
|
+
*
|
|
54
|
+
* The Members blocks — Member sign-in, Member sign-up, Password recovery —
|
|
55
|
+
* are registered by the COMMERCE bundle, so `pluginId` alone said "commerce
|
|
56
|
+
* is on, offer them" on sites whose `/signin`, `/signup` and `/recover`
|
|
57
|
+
* return 404. An author drops a sign-in block on a page, publishes it, and
|
|
58
|
+
* finds out from a visitor.
|
|
59
|
+
*
|
|
60
|
+
* Attribution by category rather than by re-registering the components
|
|
61
|
+
* under the `accounts` id: re-registering moves where they LOAD from and
|
|
62
|
+
* would change what sites already using those blocks serve. This map is
|
|
63
|
+
* read-time only — it decides what the picker OFFERS, never what a page
|
|
64
|
+
* that already contains one renders.
|
|
65
|
+
*/ export const CATEGORY_REQUIRED_CAPABILITY = {
|
|
66
|
+
[ComponentCategory.MEMBERS]: ACCOUNTS_PLUGIN_ID
|
|
67
|
+
};
|
|
68
|
+
/**
|
|
69
|
+
* Whether a category's required capability (if it has one) runs on the site
|
|
70
|
+
* being edited. Categories with no requirement always pass, as does
|
|
71
|
+
* everything when no set was supplied.
|
|
72
|
+
*/ export function isCategoryCapabilityEnabled(category, enabledPluginIds) {
|
|
73
|
+
if (!enabledPluginIds) return true;
|
|
74
|
+
const required = category ? CATEGORY_REQUIRED_CAPABILITY[category] : undefined;
|
|
75
|
+
return !required || enabledPluginIds.includes(required);
|
|
76
|
+
}
|
|
77
|
+
export function isFromEnabledPlugin(item, enabledPluginIds) {
|
|
78
|
+
if (!enabledPluginIds) return true;
|
|
79
|
+
const pluginId = item == null ? void 0 : item.pluginId;
|
|
80
|
+
return !pluginId || enabledPluginIds.includes(pluginId);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Whether a REGISTERED component must be drawn as though it were not
|
|
84
|
+
* registered at all, because its first-party plugin does not run on the site
|
|
85
|
+
* being rendered (AGL-3033).
|
|
86
|
+
*
|
|
87
|
+
* The component registry is process-global and only grows. On a server that
|
|
88
|
+
* serves many sites, a bundle one site's page loaded stays registered for
|
|
89
|
+
* every later render, so asking the registry alone draws a switched-off
|
|
90
|
+
* plugin's elements in full on a site that switched it off — while that
|
|
91
|
+
* site's browser, which never loads the bundle, draws the unregistered
|
|
92
|
+
* fallback. The HTML shows what the site switched off, and hydration fails on
|
|
93
|
+
* the difference. Asking the rendered site's plugin set as well makes the
|
|
94
|
+
* server and the browser give one answer.
|
|
95
|
+
*
|
|
96
|
+
* Only a FIRST-PARTY id is asked about. A marketplace bundle's components name
|
|
97
|
+
* the id in its manifest, which is not the listing id the site's set carries,
|
|
98
|
+
* and a component naming no plugin belongs to none. Both render as registered,
|
|
99
|
+
* as does the base library, which no site can switch off.
|
|
100
|
+
*
|
|
101
|
+
* An EMPTY set is no answer. Every set a site resolves carries the base
|
|
102
|
+
* library, so an empty one is a surface saying it has no site to answer for —
|
|
103
|
+
* the console's editor gate publishes `[]` while the URL names no workspace it
|
|
104
|
+
* has resolved — and drawing every element there as unregistered would blank
|
|
105
|
+
* the canvas. It renders as though no set was supplied.
|
|
106
|
+
*/ export function isSwitchedOffForRenderedSite(pluginId, enabledPluginIds) {
|
|
107
|
+
if (!pluginId || !(enabledPluginIds == null ? void 0 : enabledPluginIds.length)) return false;
|
|
108
|
+
if (isLockedOnForSite(pluginId)) return false;
|
|
109
|
+
return isFirstPartyPlugin(pluginId) && !enabledPluginIds.includes(pluginId);
|
|
110
|
+
}
|
|
111
|
+
export default EnabledPluginsContext;
|
|
112
|
+
|
|
113
|
+
//# sourceMappingURL=enabled-plugins-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/enabled-plugins-context.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\nimport { createContext, useContext } from 'react'\nimport { ComponentCategory } from '../foundation/constants/components'\nimport {\n ACCOUNTS_PLUGIN_ID,\n isFirstPartyPlugin,\n isLockedOnForSite,\n} from '../plugin-manager/enabled-plugins'\n\n/**\n * The EDITOR's view of per-site plugin enablement (AGL-1014).\n *\n * `enabledPlugins` is a boundary, not a preference, and the issue names four\n * surfaces that must enforce it identically: console navigation, the editor,\n * published sites, and API dispatch. The other three read\n * `resolveHostEnabledPlugins` on the server or subtract the deny-list in the\n * console shell. This context is how the same answer reaches the besigner —\n * the host app resolves it (only it can read an org and a host) and publishes\n * it; the designer stays storage-agnostic.\n *\n * It has to be a READ-TIME filter rather than a narrower load. The preset\n * registry is a module-global union that only ever grows: `consolePluginLoader`\n * never unloads a bundle, and a plugin whose site components registered while\n * editing site A goes on offering palette entries on site B. Loading less\n * cannot un-register what is already there, so the component drawer filters\n * every entry against this set instead.\n *\n * `undefined` means no set was supplied and leaves consumers unfiltered — the\n * same opt-in shape `listConsoleExtensions` uses, so surfaces with no host\n * (the platform email editor, tests) behave exactly as before.\n */\nexport const EnabledPluginsContext = createContext<\n readonly string[] | undefined\n>(undefined)\nEnabledPluginsContext.displayName = 'EnabledPluginsContext'\n\n/** The edited site's effective plugin ids, or undefined where none is set. */\nexport function useEnabledPlugins(): readonly string[] | undefined {\n return useContext(EnabledPluginsContext)\n}\n\n/**\n * Whether a registry entry's owning plugin runs on the site being edited.\n *\n * An entry with no `pluginId` belongs to no plugin, so no deny-list entry can\n * name it and it passes; so does everything when no set was supplied.\n */\n/**\n * Component categories whose entries follow a per-site CAPABILITY rather\n * than the bundle that ships them (AGL-2486).\n *\n * The Members blocks — Member sign-in, Member sign-up, Password recovery —\n * are registered by the COMMERCE bundle, so `pluginId` alone said \"commerce\n * is on, offer them\" on sites whose `/signin`, `/signup` and `/recover`\n * return 404. An author drops a sign-in block on a page, publishes it, and\n * finds out from a visitor.\n *\n * Attribution by category rather than by re-registering the components\n * under the `accounts` id: re-registering moves where they LOAD from and\n * would change what sites already using those blocks serve. This map is\n * read-time only — it decides what the picker OFFERS, never what a page\n * that already contains one renders.\n */\nexport const CATEGORY_REQUIRED_CAPABILITY: Readonly<Record<string, string>> = {\n [ComponentCategory.MEMBERS]: ACCOUNTS_PLUGIN_ID,\n}\n\n/**\n * Whether a category's required capability (if it has one) runs on the site\n * being edited. Categories with no requirement always pass, as does\n * everything when no set was supplied.\n */\nexport function isCategoryCapabilityEnabled(\n category: string | undefined,\n enabledPluginIds: readonly string[] | undefined,\n): boolean {\n if (!enabledPluginIds) return true\n const required = category ? CATEGORY_REQUIRED_CAPABILITY[category] : undefined\n return !required || enabledPluginIds.includes(required)\n}\n\nexport function isFromEnabledPlugin(\n item: { pluginId?: string } | undefined,\n enabledPluginIds: readonly string[] | undefined,\n): boolean {\n if (!enabledPluginIds) return true\n const pluginId = item?.pluginId\n return !pluginId || enabledPluginIds.includes(pluginId)\n}\n\n/**\n * Whether a REGISTERED component must be drawn as though it were not\n * registered at all, because its first-party plugin does not run on the site\n * being rendered (AGL-3033).\n *\n * The component registry is process-global and only grows. On a server that\n * serves many sites, a bundle one site's page loaded stays registered for\n * every later render, so asking the registry alone draws a switched-off\n * plugin's elements in full on a site that switched it off — while that\n * site's browser, which never loads the bundle, draws the unregistered\n * fallback. The HTML shows what the site switched off, and hydration fails on\n * the difference. Asking the rendered site's plugin set as well makes the\n * server and the browser give one answer.\n *\n * Only a FIRST-PARTY id is asked about. A marketplace bundle's components name\n * the id in its manifest, which is not the listing id the site's set carries,\n * and a component naming no plugin belongs to none. Both render as registered,\n * as does the base library, which no site can switch off.\n *\n * An EMPTY set is no answer. Every set a site resolves carries the base\n * library, so an empty one is a surface saying it has no site to answer for —\n * the console's editor gate publishes `[]` while the URL names no workspace it\n * has resolved — and drawing every element there as unregistered would blank\n * the canvas. It renders as though no set was supplied.\n */\nexport function isSwitchedOffForRenderedSite(\n pluginId: string | undefined,\n enabledPluginIds: readonly string[] | undefined,\n): boolean {\n if (!pluginId || !enabledPluginIds?.length) return false\n if (isLockedOnForSite(pluginId)) return false\n return isFirstPartyPlugin(pluginId) && !enabledPluginIds.includes(pluginId)\n}\n\nexport default EnabledPluginsContext\n"],"names":["createContext","useContext","ComponentCategory","ACCOUNTS_PLUGIN_ID","isFirstPartyPlugin","isLockedOnForSite","EnabledPluginsContext","undefined","displayName","useEnabledPlugins","CATEGORY_REQUIRED_CAPABILITY","MEMBERS","isCategoryCapabilityEnabled","category","enabledPluginIds","required","includes","isFromEnabledPlugin","item","pluginId","isSwitchedOffForRenderedSite","length"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,aAAa,EAAEC,UAAU,QAAQ,QAAO;AACjD,SAASC,iBAAiB,QAAQ,wCAAoC;AACtE,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,iBAAiB,QACZ,uCAAmC;AAE1C;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,MAAMC,wBAAwBN,cAEnCO,WAAU;AACZD,sBAAsBE,WAAW,GAAG;AAEpC,4EAA4E,GAC5E,OAAO,SAASC;IACd,OAAOR,WAAWK;AACpB;AAEA;;;;;CAKC,GACD;;;;;;;;;;;;;;;CAeC,GACD,OAAO,MAAMI,+BAAiE;IAC5E,CAACR,kBAAkBS,OAAO,CAAC,EAAER;AAC/B,EAAC;AAED;;;;CAIC,GACD,OAAO,SAASS,4BACdC,QAA4B,EAC5BC,gBAA+C;IAE/C,IAAI,CAACA,kBAAkB,OAAO;IAC9B,MAAMC,WAAWF,WAAWH,4BAA4B,CAACG,SAAS,GAAGN;IACrE,OAAO,CAACQ,YAAYD,iBAAiBE,QAAQ,CAACD;AAChD;AAEA,OAAO,SAASE,oBACdC,IAAuC,EACvCJ,gBAA+C;IAE/C,IAAI,CAACA,kBAAkB,OAAO;IAC9B,MAAMK,WAAWD,wBAAAA,KAAMC,QAAQ;IAC/B,OAAO,CAACA,YAAYL,iBAAiBE,QAAQ,CAACG;AAChD;AAEA;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GACD,OAAO,SAASC,6BACdD,QAA4B,EAC5BL,gBAA+C;IAE/C,IAAI,CAACK,YAAY,EAACL,oCAAAA,iBAAkBO,MAAM,GAAE,OAAO;IACnD,IAAIhB,kBAAkBc,WAAW,OAAO;IACxC,OAAOf,mBAAmBe,aAAa,CAACL,iBAAiBE,QAAQ,CAACG;AACpE;AAEA,eAAeb,sBAAqB"}
|
|
@@ -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
|
+
type Nodes = Record<string, any>;
|
|
18
|
+
/**
|
|
19
|
+
* Guarantee the canvas gets a root (AGL-931).
|
|
20
|
+
*
|
|
21
|
+
* `setNodes` stores whatever it is handed and `rootNode` looks up
|
|
22
|
+
* `_@_` exactly, so a map without it leaves the editor with no root: the
|
|
23
|
+
* hierarchy renders 'Invalid node' and Add Element is disabled. That is not
|
|
24
|
+
* merely an empty editor — it is one with no way out, so the document can
|
|
25
|
+
* never be repaired from the UI. AGL-753 hit this with a component stored as
|
|
26
|
+
* `nodes: {}`; screens and layouts had no equivalent guard at all.
|
|
27
|
+
*
|
|
28
|
+
* A rootless map keeps its content rather than being replaced: every node
|
|
29
|
+
* with no resolvable parent is adopted by the synthetic root. Recovering
|
|
30
|
+
* into an editable document beats discarding what is there, and for a screen
|
|
31
|
+
* or layout the result is the shape it should have had all along.
|
|
32
|
+
*
|
|
33
|
+
* Deliberately NOT `definitionToCanvasTree`: that one is about the
|
|
34
|
+
* definition shape, where a single promoted root is wrapped and unwrapped
|
|
35
|
+
* again on publish. This is the shared floor under every editor.
|
|
36
|
+
*/
|
|
37
|
+
export declare function ensureCanvasRoot(nodes: Nodes | undefined): Nodes;
|
|
38
|
+
export default ensureCanvasRoot;
|
|
@@ -0,0 +1,61 @@
|
|
|
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
|
+
*/ import { CANVAS_ROOT_ELEMENT_ID } from "../foundation/constants/canvas.js";
|
|
18
|
+
/**
|
|
19
|
+
* Guarantee the canvas gets a root (AGL-931).
|
|
20
|
+
*
|
|
21
|
+
* `setNodes` stores whatever it is handed and `rootNode` looks up
|
|
22
|
+
* `_@_` exactly, so a map without it leaves the editor with no root: the
|
|
23
|
+
* hierarchy renders 'Invalid node' and Add Element is disabled. That is not
|
|
24
|
+
* merely an empty editor — it is one with no way out, so the document can
|
|
25
|
+
* never be repaired from the UI. AGL-753 hit this with a component stored as
|
|
26
|
+
* `nodes: {}`; screens and layouts had no equivalent guard at all.
|
|
27
|
+
*
|
|
28
|
+
* A rootless map keeps its content rather than being replaced: every node
|
|
29
|
+
* with no resolvable parent is adopted by the synthetic root. Recovering
|
|
30
|
+
* into an editable document beats discarding what is there, and for a screen
|
|
31
|
+
* or layout the result is the shape it should have had all along.
|
|
32
|
+
*
|
|
33
|
+
* Deliberately NOT `definitionToCanvasTree`: that one is about the
|
|
34
|
+
* definition shape, where a single promoted root is wrapped and unwrapped
|
|
35
|
+
* again on publish. This is the shared floor under every editor.
|
|
36
|
+
*/ export function ensureCanvasRoot(nodes) {
|
|
37
|
+
const map = nodes != null ? nodes : {};
|
|
38
|
+
if (map[CANVAS_ROOT_ELEMENT_ID]) return map;
|
|
39
|
+
// A parent that is not itself in the map is no parent — that node is as
|
|
40
|
+
// much a root as one with no `parentId` at all.
|
|
41
|
+
const roots = Object.keys(map).filter((id)=>{
|
|
42
|
+
var _map_id;
|
|
43
|
+
return !((_map_id = map[id]) == null ? void 0 : _map_id.parentId) || !map[map[id].parentId];
|
|
44
|
+
});
|
|
45
|
+
return _extends({}, Object.fromEntries(Object.entries(map).map(([id, node])=>[
|
|
46
|
+
id,
|
|
47
|
+
roots.includes(id) ? _extends({}, node, {
|
|
48
|
+
parentId: CANVAS_ROOT_ELEMENT_ID
|
|
49
|
+
}) : node
|
|
50
|
+
])), {
|
|
51
|
+
[CANVAS_ROOT_ELEMENT_ID]: {
|
|
52
|
+
$id: CANVAS_ROOT_ELEMENT_ID,
|
|
53
|
+
componentId: 'div',
|
|
54
|
+
parentId: null,
|
|
55
|
+
nodes: roots
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
export default ensureCanvasRoot;
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=ensure-canvas-root.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/ensure-canvas-root.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\nimport { CANVAS_ROOT_ELEMENT_ID } from '../foundation/constants/canvas'\n\ntype Nodes = Record<string, any>\n\n/**\n * Guarantee the canvas gets a root (AGL-931).\n *\n * `setNodes` stores whatever it is handed and `rootNode` looks up\n * `_@_` exactly, so a map without it leaves the editor with no root: the\n * hierarchy renders 'Invalid node' and Add Element is disabled. That is not\n * merely an empty editor — it is one with no way out, so the document can\n * never be repaired from the UI. AGL-753 hit this with a component stored as\n * `nodes: {}`; screens and layouts had no equivalent guard at all.\n *\n * A rootless map keeps its content rather than being replaced: every node\n * with no resolvable parent is adopted by the synthetic root. Recovering\n * into an editable document beats discarding what is there, and for a screen\n * or layout the result is the shape it should have had all along.\n *\n * Deliberately NOT `definitionToCanvasTree`: that one is about the\n * definition shape, where a single promoted root is wrapped and unwrapped\n * again on publish. This is the shared floor under every editor.\n */\nexport function ensureCanvasRoot(nodes: Nodes | undefined): Nodes {\n const map = nodes ?? {}\n if (map[CANVAS_ROOT_ELEMENT_ID]) return map\n\n // A parent that is not itself in the map is no parent — that node is as\n // much a root as one with no `parentId` at all.\n const roots = Object.keys(map).filter(\n (id) => !map[id]?.parentId || !map[map[id].parentId],\n )\n\n return {\n ...Object.fromEntries(\n Object.entries(map).map(([id, node]) => [\n id,\n roots.includes(id) ? { ...node, parentId: CANVAS_ROOT_ELEMENT_ID } : node,\n ]),\n ),\n [CANVAS_ROOT_ELEMENT_ID]: {\n $id: CANVAS_ROOT_ELEMENT_ID,\n componentId: 'div',\n parentId: null,\n nodes: roots,\n },\n }\n}\n\nexport default ensureCanvasRoot\n"],"names":["CANVAS_ROOT_ELEMENT_ID","ensureCanvasRoot","nodes","map","roots","Object","keys","filter","id","parentId","fromEntries","entries","node","includes","$id","componentId"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED,SAASA,sBAAsB,QAAQ,oCAAgC;AAIvE;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,SAASC,iBAAiBC,KAAwB;IACvD,MAAMC,MAAMD,gBAAAA,QAAS,CAAC;IACtB,IAAIC,GAAG,CAACH,uBAAuB,EAAE,OAAOG;IAExC,wEAAwE;IACxE,gDAAgD;IAChD,MAAMC,QAAQC,OAAOC,IAAI,CAACH,KAAKI,MAAM,CACnC,CAACC;YAAQL;eAAD,GAACA,UAAAA,GAAG,CAACK,GAAG,qBAAPL,QAASM,QAAQ,KAAI,CAACN,GAAG,CAACA,GAAG,CAACK,GAAG,CAACC,QAAQ,CAAC;;IAGtD,OAAO,aACFJ,OAAOK,WAAW,CACnBL,OAAOM,OAAO,CAACR,KAAKA,GAAG,CAAC,CAAC,CAACK,IAAII,KAAK,GAAK;YACtCJ;YACAJ,MAAMS,QAAQ,CAACL,MAAM,aAAKI;gBAAMH,UAAUT;iBAA2BY;SACtE;QAEH,CAACZ,uBAAuB,EAAE;YACxBc,KAAKd;YACLe,aAAa;YACbN,UAAU;YACVP,OAAOE;QACT;;AAEJ;AAEA,eAAeH,iBAAgB"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
export interface EntityOption {
|
|
2
|
+
/** Stable document id — the persisted reference (AGL-343/344). */
|
|
3
|
+
id: string;
|
|
4
|
+
/** Current display name, resolved at edit time. */
|
|
5
|
+
label: string;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Edit-time option lists for id-based entity pickers in component
|
|
9
|
+
* attributes (products, collections, categories, datasets, forms). Names are
|
|
10
|
+
* display-only; nodes persist the id, so renames never break references —
|
|
11
|
+
* the same contract as {@link ScreenLinkContext}. Provided by the
|
|
12
|
+
* console's besigner/preview surfaces; absent on the tenant (the tenant
|
|
13
|
+
* only resolves ids, never lists them).
|
|
14
|
+
*/
|
|
15
|
+
/** The lists a picker can ask for. */
|
|
16
|
+
export type EntityPickerKind = 'products' | 'collections' | 'categories' | 'datasets' | 'forms';
|
|
17
|
+
/**
|
|
18
|
+
* How much an empty list is worth believing.
|
|
19
|
+
*
|
|
20
|
+
* Every one of these renders as a dropdown with no entries, and an author
|
|
21
|
+
* looking at four identical empty dropdowns cannot tell "this site has no
|
|
22
|
+
* forms yet" from "the read failed" from "this editor never lists forms at
|
|
23
|
+
* all". Only the first of those is a fact about their site; the other two
|
|
24
|
+
* are the picker being broken, and a picker that cannot say which it is
|
|
25
|
+
* sends the author looking for a form they already made.
|
|
26
|
+
*
|
|
27
|
+
* - `unavailable` — no provider is mounted, so nothing on this surface can
|
|
28
|
+
* list entities. The tenant, and any editor outside a host.
|
|
29
|
+
* - `loading` — a read is open or about to be, and no answer has arrived.
|
|
30
|
+
* Also the state of a list nothing has asked for yet: demand is declared
|
|
31
|
+
* on the same commit that would display it, so "not asked" and "asked,
|
|
32
|
+
* unanswered" are the same beat.
|
|
33
|
+
* - `ready` — the read settled. An empty list here IS the site's answer.
|
|
34
|
+
* - `error` — the read failed. Empty means nothing.
|
|
35
|
+
*/
|
|
36
|
+
export type EntityListState = 'unavailable' | 'loading' | 'ready' | 'error';
|
|
37
|
+
/**
|
|
38
|
+
* How many documents a picker BROWSES.
|
|
39
|
+
*
|
|
40
|
+
* A picker is not a catalog viewer. It is a dropdown on a besigner surface
|
|
41
|
+
* where the author is placing one element, and no table in the console offers
|
|
42
|
+
* a page past `TABLE_PAGE_SIZE_OPTIONS` — a dropdown is the smaller surface of
|
|
43
|
+
* the two, not the larger.
|
|
44
|
+
*
|
|
45
|
+
* The middle of that range rather than its floor: a table has a pager under it
|
|
46
|
+
* and a dropdown does not, so the page a reader cannot advance is worth more
|
|
47
|
+
* rows than the one they can.
|
|
48
|
+
*
|
|
49
|
+
* What makes this size SAFE is that browsing is the only job it does. A stored
|
|
50
|
+
* value is named by {@link EntityPickerContextValue.resolve} — one keyed read
|
|
51
|
+
* for the one document, exact at any catalog size — so nothing here has to be
|
|
52
|
+
* wide enough to contain whatever an author picked last month. A window that
|
|
53
|
+
* carried both jobs would have to be, and would still render a bound element
|
|
54
|
+
* as unbound past its own width; widening this cannot fix that, only make it
|
|
55
|
+
* rarer and more expensive.
|
|
56
|
+
*/
|
|
57
|
+
export declare const ENTITY_PICKER_BROWSE_LIMIT = 25;
|
|
58
|
+
/**
|
|
59
|
+
* How many documents a server-side name search may return.
|
|
60
|
+
*
|
|
61
|
+
* The same size as the browse window, for the same reason: a reader who has
|
|
62
|
+
* typed a query and still faces 25 rows narrows it further rather than
|
|
63
|
+
* scrolling. Only the kinds in {@link EntityPickerContextValue.searchable}
|
|
64
|
+
* spend this at all.
|
|
65
|
+
*/
|
|
66
|
+
export declare const ENTITY_PICKER_SEARCH_LIMIT = 25;
|
|
67
|
+
export interface EntityPickerContextValue {
|
|
68
|
+
products?: EntityOption[];
|
|
69
|
+
collections?: EntityOption[];
|
|
70
|
+
categories?: EntityOption[];
|
|
71
|
+
datasets?: EntityOption[];
|
|
72
|
+
/** The host's form entities, id-first, feeding FORM_SELECT attributes. */
|
|
73
|
+
forms?: EntityOption[];
|
|
74
|
+
/**
|
|
75
|
+
* Per-dataset model fields (AGL-556), keyed by dataset id, in model
|
|
76
|
+
* order: id = stable model fieldId, label = current display name. Feeds
|
|
77
|
+
* DATASET_FIELD_SELECT attributes (e.g. a form field's "Maps to schema
|
|
78
|
+
* field" picker).
|
|
79
|
+
*/
|
|
80
|
+
datasetFields?: Record<string, EntityOption[]>;
|
|
81
|
+
/**
|
|
82
|
+
* Declare that a picker of this kind is on screen (AGL-703).
|
|
83
|
+
*
|
|
84
|
+
* The provider reads these lists from Firestore, and it used to read ALL of
|
|
85
|
+
* them the moment the besigner opened — up to 300 products, 200 catalog
|
|
86
|
+
* collections, 200 categories and 200 datasets, on a site with a real
|
|
87
|
+
* catalog, for pickers most editing sessions never open. Nothing about
|
|
88
|
+
* moving a heading needs the product list.
|
|
89
|
+
*
|
|
90
|
+
* So the lists are demand-driven now, and the demand signal is the thing
|
|
91
|
+
* that would DISPLAY one: a selected node whose schema declares a
|
|
92
|
+
* `PRODUCT_SELECT`, a repeat bound to a dataset. Call this when that is
|
|
93
|
+
* true and read the list on the render after; until then the list is
|
|
94
|
+
* absent, exactly as it is for the beat before any listener syncs.
|
|
95
|
+
*
|
|
96
|
+
* Optional, and absent on the tenant — which resolves ids and never lists
|
|
97
|
+
* them, so nothing there has a picker to ask for.
|
|
98
|
+
*/
|
|
99
|
+
request?: (kind: EntityPickerKind) => void;
|
|
100
|
+
/**
|
|
101
|
+
* Per-kind read state, so a picker can say WHY it has nothing to offer.
|
|
102
|
+
* A kind the provider omits reads as `loading`; see {@link entityListState}.
|
|
103
|
+
*/
|
|
104
|
+
status?: Partial<Record<EntityPickerKind, EntityListState>>;
|
|
105
|
+
/**
|
|
106
|
+
* The browse window came back FULL for this kind, so the list above is a
|
|
107
|
+
* page of the site's catalog and not the whole of it.
|
|
108
|
+
*
|
|
109
|
+
* Measured with a probe — the read asks for one document past
|
|
110
|
+
* {@link ENTITY_PICKER_BROWSE_LIMIT} and the extra one is never offered —
|
|
111
|
+
* so this is a fact about the collection rather than a guess from the
|
|
112
|
+
* window being exactly full.
|
|
113
|
+
*
|
|
114
|
+
* A picker owes the reader this sentence for the same reason the inbox's
|
|
115
|
+
* form filter does: "not in the picker" and "does not exist" are the same
|
|
116
|
+
* empty dropdown, and only one of them is a fact about their site.
|
|
117
|
+
*/
|
|
118
|
+
truncated?: Partial<Record<EntityPickerKind, boolean>>;
|
|
119
|
+
/**
|
|
120
|
+
* This kind's documents carry the name-search keys, so a typed query
|
|
121
|
+
* reaches the WHOLE collection rather than only the browse window.
|
|
122
|
+
*
|
|
123
|
+
* True for products alone today: `nameTokens`/`nameLower` are stamped by
|
|
124
|
+
* the catalog's own write path, and `hosts/{host}/resources` deliberately
|
|
125
|
+
* does not stamp them on the other four kinds. A picker for a kind that is
|
|
126
|
+
* absent here must say its search covers the window only — claiming
|
|
127
|
+
* otherwise would let an unfound entity read as a nonexistent one.
|
|
128
|
+
*/
|
|
129
|
+
searchable?: Partial<Record<EntityPickerKind, boolean>>;
|
|
130
|
+
/**
|
|
131
|
+
* Narrow this kind's offered list to what somebody typed.
|
|
132
|
+
*
|
|
133
|
+
* Matching is the provider's, not the dropdown's: it is the only side that
|
|
134
|
+
* can merge the window's own matches with the ones a server query found
|
|
135
|
+
* past it, and it uses `scoreMatch` so a query matches a word ANYWHERE in a
|
|
136
|
+
* name — the same rule the switchers and global search follow.
|
|
137
|
+
*
|
|
138
|
+
* Passing an empty string restores the browse window.
|
|
139
|
+
*/
|
|
140
|
+
search?: (kind: EntityPickerKind, text: string) => void;
|
|
141
|
+
/**
|
|
142
|
+
* Resolve ONE stored id to its current name, whatever the browse window
|
|
143
|
+
* holds.
|
|
144
|
+
*
|
|
145
|
+
* Deliberately NOT a job for the browse list, though a bulk read could do
|
|
146
|
+
* both. Sharing one read makes the list's width the limit on which stored
|
|
147
|
+
* values can be named, and past that width a picker renders a bound element
|
|
148
|
+
* as UNBOUND rather than as its label — an empty control on an element that
|
|
149
|
+
* is set, which an author repairs by picking again. That is how a correct
|
|
150
|
+
* reference gets replaced with a different one.
|
|
151
|
+
*
|
|
152
|
+
* One keyed `getDoc` for one document instead: exact at any catalog size,
|
|
153
|
+
* and asked for only when a node actually carries a value. Results land in
|
|
154
|
+
* {@link resolved} and are never re-read.
|
|
155
|
+
*/
|
|
156
|
+
resolve?: (kind: EntityPickerKind, id: string) => void;
|
|
157
|
+
/**
|
|
158
|
+
* What {@link resolve} found, keyed by kind and then by id.
|
|
159
|
+
*
|
|
160
|
+
* Three states, and the picker renders a different label for each: an
|
|
161
|
+
* `EntityOption` is the resolved name, `null` is a settled read that found
|
|
162
|
+
* NO such document, and an absent key is a resolution still in flight.
|
|
163
|
+
* Absent must never render as missing — a picker that flashed "unavailable"
|
|
164
|
+
* over every live reference for the beat before its read landed would teach
|
|
165
|
+
* authors to ignore the one warning that matters.
|
|
166
|
+
*/
|
|
167
|
+
resolved?: Partial<Record<EntityPickerKind, Readonly<Record<string, EntityOption | null>>>>;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* What the picker for `kind` should believe about its own emptiness.
|
|
171
|
+
*
|
|
172
|
+
* `request` is the "a provider is mounted" signal — it is the one member the
|
|
173
|
+
* contract already says is absent wherever nothing lists entities — so a
|
|
174
|
+
* surface with no provider resolves to `unavailable` rather than passing an
|
|
175
|
+
* empty list off as the site's answer.
|
|
176
|
+
*/
|
|
177
|
+
export declare function entityListState(context: EntityPickerContextValue | undefined, kind: EntityPickerKind): EntityListState;
|
|
178
|
+
/**
|
|
179
|
+
* The id whose label a picker still needs a keyed read to learn, if any.
|
|
180
|
+
*
|
|
181
|
+
* Part of the contract rather than of one screen, because two surfaces ask
|
|
182
|
+
* it — the attributes panel about a node's picker value, and the insert-token
|
|
183
|
+
* menu about the dataset a repeat is bound to — and an answer that differed
|
|
184
|
+
* between them would be a second keyed read for a document one of them
|
|
185
|
+
* already had.
|
|
186
|
+
*
|
|
187
|
+
* Four cases resolve to "ask nobody", and each is a read not spent: there is
|
|
188
|
+
* no value; the browse window already carries it, which is the common case on
|
|
189
|
+
* a small site; a resolution has already answered, including the answer that
|
|
190
|
+
* the document is gone; or the browse read has not settled, so the window may
|
|
191
|
+
* be about to supply it for free.
|
|
192
|
+
*
|
|
193
|
+
* The last is the one worth stating. Asking while the listener is still
|
|
194
|
+
* loading would spend a keyed read on nearly every picker on every site,
|
|
195
|
+
* which is the cost splitting these two jobs exists to remove rather than to
|
|
196
|
+
* move.
|
|
197
|
+
*/
|
|
198
|
+
export declare function entityValueNeedsResolution(context: EntityPickerContextValue | undefined, kind: EntityPickerKind, value: unknown): string | undefined;
|
|
199
|
+
export declare const EntityPickerContext: import("react").Context<EntityPickerContextValue>;
|