@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,188 @@
|
|
|
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
|
+
* Host naming guards (AGL-147): one shared subdomain policy for the create
|
|
18
|
+
* API, the rename/validate API, and the console dialogs — pattern, reserved
|
|
19
|
+
* + profanity blocklists, a display-name → subdomain generator, and
|
|
20
|
+
* taken-name suggestions.
|
|
21
|
+
*/ /** 3–30 chars, lowercase alphanumeric + dashes, no leading dash. */ export const SUBDOMAIN_PATTERN = /^[a-z0-9][a-z0-9-]{2,29}$/;
|
|
22
|
+
/** Platform/system names a tenant must not squat. */ export const RESERVED_SUBDOMAINS = new Set([
|
|
23
|
+
'www',
|
|
24
|
+
'app',
|
|
25
|
+
'api',
|
|
26
|
+
'admin',
|
|
27
|
+
'console',
|
|
28
|
+
'mail',
|
|
29
|
+
'demo',
|
|
30
|
+
'staging',
|
|
31
|
+
'dev',
|
|
32
|
+
'test',
|
|
33
|
+
'docs',
|
|
34
|
+
'blog',
|
|
35
|
+
'help',
|
|
36
|
+
'support',
|
|
37
|
+
'status',
|
|
38
|
+
'cdn',
|
|
39
|
+
'assets',
|
|
40
|
+
'static',
|
|
41
|
+
'ftp',
|
|
42
|
+
'smtp',
|
|
43
|
+
'ns1',
|
|
44
|
+
'ns2',
|
|
45
|
+
'aglyn',
|
|
46
|
+
'billing',
|
|
47
|
+
'account',
|
|
48
|
+
'login',
|
|
49
|
+
'signup',
|
|
50
|
+
'auth'
|
|
51
|
+
]);
|
|
52
|
+
/**
|
|
53
|
+
* Profanity fragments blocked as substrings in generated or typed
|
|
54
|
+
* subdomains. Deliberately short: obvious slurs and vulgarity only —
|
|
55
|
+
* substring matching is aggressive, so entries must be unambiguous.
|
|
56
|
+
*/ const BLOCKED_FRAGMENTS = [
|
|
57
|
+
'fuck',
|
|
58
|
+
'shit',
|
|
59
|
+
'cunt',
|
|
60
|
+
'nigger',
|
|
61
|
+
'faggot',
|
|
62
|
+
'bitch',
|
|
63
|
+
'porn',
|
|
64
|
+
'nazi'
|
|
65
|
+
];
|
|
66
|
+
/** True when the subdomain is reserved or contains a blocked fragment. */ export function isBlockedSubdomain(subdomain) {
|
|
67
|
+
const normalized = subdomain.toLowerCase();
|
|
68
|
+
if (RESERVED_SUBDOMAINS.has(normalized)) return true;
|
|
69
|
+
const collapsed = normalized.replace(/[^a-z0-9]/g, '');
|
|
70
|
+
return BLOCKED_FRAGMENTS.some((fragment)=>collapsed.includes(fragment));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Best-effort subdomain from a display name: lowercase, spaces/symbols to
|
|
74
|
+
* dashes, collapsed, trimmed to the pattern's 30-char cap. Returns '' when
|
|
75
|
+
* nothing usable remains (caller falls back to manual entry).
|
|
76
|
+
*/ export function generateSubdomain(displayName) {
|
|
77
|
+
const slug = displayName.toLowerCase().normalize('NFKD').replace(/[̀-ͯ]/g, '').replace(/[^a-z0-9]+/g, '-').replace(/-{2,}/g, '-').replace(/^-+|-+$/g, '').slice(0, 30).replace(/-+$/, '');
|
|
78
|
+
if (!SUBDOMAIN_PATTERN.test(slug) || isBlockedSubdomain(slug)) return '';
|
|
79
|
+
return slug;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Alternatives for a taken subdomain: `name-2`, `name-<year>`, `name-site`.
|
|
83
|
+
* Candidates are truncated to fit the pattern; blocked names are dropped.
|
|
84
|
+
* Availability is the caller's job (needs a Firestore query).
|
|
85
|
+
*/ export function suggestSubdomains(base, year = new Date().getFullYear()) {
|
|
86
|
+
const stem = base.toLowerCase().replace(/-+$/, '');
|
|
87
|
+
const withSuffix = (suffix)=>`${stem.slice(0, 30 - suffix.length - 1)}-${suffix}`.replace(/-{2,}/g, '-');
|
|
88
|
+
const candidates = [
|
|
89
|
+
withSuffix('2'),
|
|
90
|
+
withSuffix(String(year)),
|
|
91
|
+
withSuffix('site')
|
|
92
|
+
];
|
|
93
|
+
return [
|
|
94
|
+
...new Set(candidates.filter((candidate)=>SUBDOMAIN_PATTERN.test(candidate) && !isBlockedSubdomain(candidate)))
|
|
95
|
+
];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The apex tenant sites are served from. Console lives on `app.aglyn.com`.
|
|
99
|
+
*
|
|
100
|
+
* CONFIGURABLE, not a literal (AGL-2121). AGL-2022 moved the console's
|
|
101
|
+
* *display* links onto `NEXT_PUBLIC_TENANT_DOMAIN` and shipped a green spec
|
|
102
|
+
* for it; this constant — which every OTHER consumer reads — stayed a bare
|
|
103
|
+
* `'aglyn.app'`. So a self-hoster who set the variable got correct "View live"
|
|
104
|
+
* links in their own console while the software went on emitting our apex
|
|
105
|
+
* everywhere that actually reaches the public: `<link rel="canonical">`,
|
|
106
|
+
* `/api/sitemap`, `/api/robots`, `/api/collections-rss` item links,
|
|
107
|
+
* `/api/manifest`, `og:image`, and the origin inbox-bound `<img src>` resolves
|
|
108
|
+
* against. Their customers' sites told Google, every feed reader and every
|
|
109
|
+
* inbox that they lived at a name the operator does not control and we do not
|
|
110
|
+
* serve for them.
|
|
111
|
+
*
|
|
112
|
+
* Same variable and same default as `tenant-links.ts` — one value, one name
|
|
113
|
+
* (AGL-733). Dot notation is load-bearing: this module reaches client bundles,
|
|
114
|
+
* and Next inlines `NEXT_PUBLIC_*` by substituting `process.env.NAME`
|
|
115
|
+
* textually; the bracket form is never substituted and would read `undefined`
|
|
116
|
+
* in the browser. Trimmed so a half-finished `.env` line reads as absent
|
|
117
|
+
* rather than as a whitespace apex.
|
|
118
|
+
*
|
|
119
|
+
* The asymmetry with `operator-identity.ts` — which refuses to default at all
|
|
120
|
+
* — is deliberate. A wrong apex is visible to the operator on the first click
|
|
121
|
+
* in their own console, so a default they can see and correct is a default. A
|
|
122
|
+
* wrong contact address fails silently and off-site, which is why that one
|
|
123
|
+
* refuses to guess.
|
|
124
|
+
*/ export const TENANT_APEX = (process.env.NEXT_PUBLIC_TENANT_DOMAIN || '').trim() || 'aglyn.app';
|
|
125
|
+
/**
|
|
126
|
+
* The absolute origin a published site is reachable at (AGL-1224).
|
|
127
|
+
*
|
|
128
|
+
* A custom domain wins over the platform subdomain, matching what the tenant
|
|
129
|
+
* renderer already emits as `<link rel="canonical">` — a site on a custom
|
|
130
|
+
* domain that advertised its `.aglyn.app` origin would be describing itself
|
|
131
|
+
* by a name its visitors never see.
|
|
132
|
+
*
|
|
133
|
+
* Returns undefined rather than a half-built URL when a host has neither, so
|
|
134
|
+
* a caller that needs an absolute URL can tell it does not have one. Emails
|
|
135
|
+
* are the sharp case: an image `src` that is site-relative resolves against
|
|
136
|
+
* nothing in an inbox, so "no origin" has to be answerable.
|
|
137
|
+
*/ export function hostPublicOrigin(host) {
|
|
138
|
+
if (host == null ? void 0 : host.cname) return `https://${host.cname}`;
|
|
139
|
+
if (host == null ? void 0 : host.subdomain) return `https://${host.subdomain}.${TENANT_APEX}`;
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
/** A bare hostname: labels of a-z0-9/dash, at least two of them. */ const CUSTOM_DOMAIN_PATTERN = /^(?!-)[a-z0-9-]{1,63}(\.(?!-)[a-z0-9-]{1,63})+$/;
|
|
143
|
+
/**
|
|
144
|
+
* The custom domain a host is actually **serving on**, or undefined (AGL-1272).
|
|
145
|
+
*
|
|
146
|
+
* Deliberately stricter than `hostPublicOrigin`, which answers "what name does
|
|
147
|
+
* this site call itself" and is right to prefer `cname` the moment it exists.
|
|
148
|
+
* This answers a load-bearing question instead — "is it safe to send visitors
|
|
149
|
+
* away from the platform subdomain and onto this name" — and the cost of
|
|
150
|
+
* getting it wrong is the whole site, not a wrong URL in an email.
|
|
151
|
+
*
|
|
152
|
+
* So every reason to doubt the domain is a refusal:
|
|
153
|
+
*
|
|
154
|
+
* - `cnameAttachmentPending` means the Vercel attach never landed (missing
|
|
155
|
+
* env, or a 5xx). The domain is claimed in Firestore and serves nothing:
|
|
156
|
+
* no certificate, no routing. This is precisely the "attached but not
|
|
157
|
+
* live" state, and redirecting to it strands the site on a dead host.
|
|
158
|
+
* - `cnameDetachmentPending` means the customer asked to disconnect and the
|
|
159
|
+
* platform release failed. The name may still resolve, but the customer's
|
|
160
|
+
* stated intent is to leave it, so we stop advertising it.
|
|
161
|
+
* - A name inside `aglyn.app` is refused outright. `{sub}.aglyn.app` is the
|
|
162
|
+
* very origin we redirect FROM, and the tenant middleware resolves that
|
|
163
|
+
* space by `subdomain` before it ever considers `cname` — so a host whose
|
|
164
|
+
* cname pointed back into it would redirect to itself forever.
|
|
165
|
+
* - A name that is not hostname-shaped is refused. `/api/domains/attach`
|
|
166
|
+
* lowercases and trims what the wizard sends but never pattern-checks it
|
|
167
|
+
* (only `/api/domains/verify` does), so a junk value can reach Firestore.
|
|
168
|
+
* A junk value reaching a `Location:` header is a different class of
|
|
169
|
+
* problem again.
|
|
170
|
+
*
|
|
171
|
+
* Note what this CANNOT tell you: DNS was verified once, at connect time, and
|
|
172
|
+
* nothing re-checks it. A domain whose DNS is later repointed or whose
|
|
173
|
+
* registration lapses still reads as live here. That residual risk is why the
|
|
174
|
+
* redirect built on this is temporary and revocable rather than permanent.
|
|
175
|
+
*/ export function liveCustomDomain(host) {
|
|
176
|
+
var _host_cname;
|
|
177
|
+
if (!host) return undefined;
|
|
178
|
+
if (host.cnameAttachmentPending === true) return undefined;
|
|
179
|
+
if (host.cnameDetachmentPending === true) return undefined;
|
|
180
|
+
const domain = String((_host_cname = host.cname) != null ? _host_cname : '').trim().toLowerCase();
|
|
181
|
+
if (!CUSTOM_DOMAIN_PATTERN.test(domain)) return undefined;
|
|
182
|
+
if (domain === TENANT_APEX || domain.endsWith(`.${TENANT_APEX}`)) {
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
return domain;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
//# sourceMappingURL=host-naming.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/host-naming.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 * Host naming guards (AGL-147): one shared subdomain policy for the create\n * API, the rename/validate API, and the console dialogs — pattern, reserved\n * + profanity blocklists, a display-name → subdomain generator, and\n * taken-name suggestions.\n */\n\n/** 3–30 chars, lowercase alphanumeric + dashes, no leading dash. */\nexport const SUBDOMAIN_PATTERN = /^[a-z0-9][a-z0-9-]{2,29}$/\n\n/** Platform/system names a tenant must not squat. */\nexport const RESERVED_SUBDOMAINS = new Set([\n 'www',\n 'app',\n 'api',\n 'admin',\n 'console',\n 'mail',\n 'demo',\n 'staging',\n 'dev',\n 'test',\n 'docs',\n 'blog',\n 'help',\n 'support',\n 'status',\n 'cdn',\n 'assets',\n 'static',\n 'ftp',\n 'smtp',\n 'ns1',\n 'ns2',\n 'aglyn',\n 'billing',\n 'account',\n 'login',\n 'signup',\n 'auth',\n])\n\n/**\n * Profanity fragments blocked as substrings in generated or typed\n * subdomains. Deliberately short: obvious slurs and vulgarity only —\n * substring matching is aggressive, so entries must be unambiguous.\n */\nconst BLOCKED_FRAGMENTS = [\n 'fuck',\n 'shit',\n 'cunt',\n 'nigger',\n 'faggot',\n 'bitch',\n 'porn',\n 'nazi',\n]\n\n/** True when the subdomain is reserved or contains a blocked fragment. */\nexport function isBlockedSubdomain(subdomain: string): boolean {\n const normalized = subdomain.toLowerCase()\n if (RESERVED_SUBDOMAINS.has(normalized)) return true\n const collapsed = normalized.replace(/[^a-z0-9]/g, '')\n return BLOCKED_FRAGMENTS.some((fragment) => collapsed.includes(fragment))\n}\n\n/**\n * Best-effort subdomain from a display name: lowercase, spaces/symbols to\n * dashes, collapsed, trimmed to the pattern's 30-char cap. Returns '' when\n * nothing usable remains (caller falls back to manual entry).\n */\nexport function generateSubdomain(displayName: string): string {\n const slug = displayName\n .toLowerCase()\n .normalize('NFKD')\n .replace(/[̀-ͯ]/g, '')\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/-{2,}/g, '-')\n .replace(/^-+|-+$/g, '')\n .slice(0, 30)\n .replace(/-+$/, '')\n if (!SUBDOMAIN_PATTERN.test(slug) || isBlockedSubdomain(slug)) return ''\n return slug\n}\n\n/**\n * Alternatives for a taken subdomain: `name-2`, `name-<year>`, `name-site`.\n * Candidates are truncated to fit the pattern; blocked names are dropped.\n * Availability is the caller's job (needs a Firestore query).\n */\nexport function suggestSubdomains(base: string, year = new Date().getFullYear()): string[] {\n const stem = base.toLowerCase().replace(/-+$/, '')\n const withSuffix = (suffix: string) =>\n `${stem.slice(0, 30 - suffix.length - 1)}-${suffix}`.replace(/-{2,}/g, '-')\n const candidates = [withSuffix('2'), withSuffix(String(year)), withSuffix('site')]\n return [\n ...new Set(\n candidates.filter(\n (candidate) =>\n SUBDOMAIN_PATTERN.test(candidate) && !isBlockedSubdomain(candidate),\n ),\n ),\n ]\n}\n\n/**\n * The apex tenant sites are served from. Console lives on `app.aglyn.com`.\n *\n * CONFIGURABLE, not a literal (AGL-2121). AGL-2022 moved the console's\n * *display* links onto `NEXT_PUBLIC_TENANT_DOMAIN` and shipped a green spec\n * for it; this constant — which every OTHER consumer reads — stayed a bare\n * `'aglyn.app'`. So a self-hoster who set the variable got correct \"View live\"\n * links in their own console while the software went on emitting our apex\n * everywhere that actually reaches the public: `<link rel=\"canonical\">`,\n * `/api/sitemap`, `/api/robots`, `/api/collections-rss` item links,\n * `/api/manifest`, `og:image`, and the origin inbox-bound `<img src>` resolves\n * against. Their customers' sites told Google, every feed reader and every\n * inbox that they lived at a name the operator does not control and we do not\n * serve for them.\n *\n * Same variable and same default as `tenant-links.ts` — one value, one name\n * (AGL-733). Dot notation is load-bearing: this module reaches client bundles,\n * and Next inlines `NEXT_PUBLIC_*` by substituting `process.env.NAME`\n * textually; the bracket form is never substituted and would read `undefined`\n * in the browser. Trimmed so a half-finished `.env` line reads as absent\n * rather than as a whitespace apex.\n *\n * The asymmetry with `operator-identity.ts` — which refuses to default at all\n * — is deliberate. A wrong apex is visible to the operator on the first click\n * in their own console, so a default they can see and correct is a default. A\n * wrong contact address fails silently and off-site, which is why that one\n * refuses to guess.\n */\nexport const TENANT_APEX =\n (process.env.NEXT_PUBLIC_TENANT_DOMAIN || '').trim() || 'aglyn.app'\n\n/**\n * The absolute origin a published site is reachable at (AGL-1224).\n *\n * A custom domain wins over the platform subdomain, matching what the tenant\n * renderer already emits as `<link rel=\"canonical\">` — a site on a custom\n * domain that advertised its `.aglyn.app` origin would be describing itself\n * by a name its visitors never see.\n *\n * Returns undefined rather than a half-built URL when a host has neither, so\n * a caller that needs an absolute URL can tell it does not have one. Emails\n * are the sharp case: an image `src` that is site-relative resolves against\n * nothing in an inbox, so \"no origin\" has to be answerable.\n */\nexport function hostPublicOrigin(\n host:\n | { cname?: string | null; subdomain?: string | null }\n | null\n | undefined,\n): string | undefined {\n if (host?.cname) return `https://${host.cname}`\n if (host?.subdomain) return `https://${host.subdomain}.${TENANT_APEX}`\n return undefined\n}\n\n/**\n * The custom-domain lifecycle as it is actually persisted on the host doc.\n *\n * There is no `verifiedAt`, no `status`, no `sslReady` — the console's\n * `/api/domains/*` routes write exactly these three fields, so this is the\n * whole vocabulary anything downstream has to reason from.\n */\nexport interface HostCustomDomainState {\n cname?: string | null\n /** Vercel attach failed or was unconfigured — the domain does NOT serve. */\n cnameAttachmentPending?: boolean | null\n /** Vercel detach failed — the customer is mid-disconnect. */\n cnameDetachmentPending?: boolean | null\n subdomain?: string | null\n}\n\n/** A bare hostname: labels of a-z0-9/dash, at least two of them. */\nconst CUSTOM_DOMAIN_PATTERN = /^(?!-)[a-z0-9-]{1,63}(\\.(?!-)[a-z0-9-]{1,63})+$/\n\n/**\n * The custom domain a host is actually **serving on**, or undefined (AGL-1272).\n *\n * Deliberately stricter than `hostPublicOrigin`, which answers \"what name does\n * this site call itself\" and is right to prefer `cname` the moment it exists.\n * This answers a load-bearing question instead — \"is it safe to send visitors\n * away from the platform subdomain and onto this name\" — and the cost of\n * getting it wrong is the whole site, not a wrong URL in an email.\n *\n * So every reason to doubt the domain is a refusal:\n *\n * - `cnameAttachmentPending` means the Vercel attach never landed (missing\n * env, or a 5xx). The domain is claimed in Firestore and serves nothing:\n * no certificate, no routing. This is precisely the \"attached but not\n * live\" state, and redirecting to it strands the site on a dead host.\n * - `cnameDetachmentPending` means the customer asked to disconnect and the\n * platform release failed. The name may still resolve, but the customer's\n * stated intent is to leave it, so we stop advertising it.\n * - A name inside `aglyn.app` is refused outright. `{sub}.aglyn.app` is the\n * very origin we redirect FROM, and the tenant middleware resolves that\n * space by `subdomain` before it ever considers `cname` — so a host whose\n * cname pointed back into it would redirect to itself forever.\n * - A name that is not hostname-shaped is refused. `/api/domains/attach`\n * lowercases and trims what the wizard sends but never pattern-checks it\n * (only `/api/domains/verify` does), so a junk value can reach Firestore.\n * A junk value reaching a `Location:` header is a different class of\n * problem again.\n *\n * Note what this CANNOT tell you: DNS was verified once, at connect time, and\n * nothing re-checks it. A domain whose DNS is later repointed or whose\n * registration lapses still reads as live here. That residual risk is why the\n * redirect built on this is temporary and revocable rather than permanent.\n */\nexport function liveCustomDomain(\n host: HostCustomDomainState | null | undefined,\n): string | undefined {\n if (!host) return undefined\n if (host.cnameAttachmentPending === true) return undefined\n if (host.cnameDetachmentPending === true) return undefined\n const domain = String(host.cname ?? '')\n .trim()\n .toLowerCase()\n if (!CUSTOM_DOMAIN_PATTERN.test(domain)) return undefined\n if (domain === TENANT_APEX || domain.endsWith(`.${TENANT_APEX}`)) {\n return undefined\n }\n return domain\n}\n"],"names":["SUBDOMAIN_PATTERN","RESERVED_SUBDOMAINS","Set","BLOCKED_FRAGMENTS","isBlockedSubdomain","subdomain","normalized","toLowerCase","has","collapsed","replace","some","fragment","includes","generateSubdomain","displayName","slug","normalize","slice","test","suggestSubdomains","base","year","Date","getFullYear","stem","withSuffix","suffix","length","candidates","String","filter","candidate","TENANT_APEX","process","env","NEXT_PUBLIC_TENANT_DOMAIN","trim","hostPublicOrigin","host","cname","undefined","CUSTOM_DOMAIN_PATTERN","liveCustomDomain","cnameAttachmentPending","cnameDetachmentPending","domain","endsWith"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;CAKC,GAED,kEAAkE,GAClE,OAAO,MAAMA,oBAAoB,4BAA2B;AAE5D,mDAAmD,GACnD,OAAO,MAAMC,sBAAsB,IAAIC,IAAI;IACzC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,EAAC;AAEF;;;;CAIC,GACD,MAAMC,oBAAoB;IACxB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,wEAAwE,GACxE,OAAO,SAASC,mBAAmBC,SAAiB;IAClD,MAAMC,aAAaD,UAAUE,WAAW;IACxC,IAAIN,oBAAoBO,GAAG,CAACF,aAAa,OAAO;IAChD,MAAMG,YAAYH,WAAWI,OAAO,CAAC,cAAc;IACnD,OAAOP,kBAAkBQ,IAAI,CAAC,CAACC,WAAaH,UAAUI,QAAQ,CAACD;AACjE;AAEA;;;;CAIC,GACD,OAAO,SAASE,kBAAkBC,WAAmB;IACnD,MAAMC,OAAOD,YACVR,WAAW,GACXU,SAAS,CAAC,QACVP,OAAO,CAAC,UAAU,IAClBA,OAAO,CAAC,eAAe,KACvBA,OAAO,CAAC,UAAU,KAClBA,OAAO,CAAC,YAAY,IACpBQ,KAAK,CAAC,GAAG,IACTR,OAAO,CAAC,OAAO;IAClB,IAAI,CAACV,kBAAkBmB,IAAI,CAACH,SAASZ,mBAAmBY,OAAO,OAAO;IACtE,OAAOA;AACT;AAEA;;;;CAIC,GACD,OAAO,SAASI,kBAAkBC,IAAY,EAAEC,OAAO,IAAIC,OAAOC,WAAW,EAAE;IAC7E,MAAMC,OAAOJ,KAAKd,WAAW,GAAGG,OAAO,CAAC,OAAO;IAC/C,MAAMgB,aAAa,CAACC,SAClB,GAAGF,KAAKP,KAAK,CAAC,GAAG,KAAKS,OAAOC,MAAM,GAAG,GAAG,CAAC,EAAED,QAAQ,CAACjB,OAAO,CAAC,UAAU;IACzE,MAAMmB,aAAa;QAACH,WAAW;QAAMA,WAAWI,OAAOR;QAAQI,WAAW;KAAQ;IAClF,OAAO;WACF,IAAIxB,IACL2B,WAAWE,MAAM,CACf,CAACC,YACChC,kBAAkBmB,IAAI,CAACa,cAAc,CAAC5B,mBAAmB4B;KAGhE;AACH;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,MAAMC,cACX,AAACC,CAAAA,QAAQC,GAAG,CAACC,yBAAyB,IAAI,EAAC,EAAGC,IAAI,MAAM,YAAW;AAErE;;;;;;;;;;;;CAYC,GACD,OAAO,SAASC,iBACdC,IAGa;IAEb,IAAIA,wBAAAA,KAAMC,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAED,KAAKC,KAAK,EAAE;IAC/C,IAAID,wBAAAA,KAAMlC,SAAS,EAAE,OAAO,CAAC,QAAQ,EAAEkC,KAAKlC,SAAS,CAAC,CAAC,EAAE4B,aAAa;IACtE,OAAOQ;AACT;AAkBA,kEAAkE,GAClE,MAAMC,wBAAwB;AAE9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCC,GACD,OAAO,SAASC,iBACdJ,IAA8C;QAKxBA;IAHtB,IAAI,CAACA,MAAM,OAAOE;IAClB,IAAIF,KAAKK,sBAAsB,KAAK,MAAM,OAAOH;IACjD,IAAIF,KAAKM,sBAAsB,KAAK,MAAM,OAAOJ;IACjD,MAAMK,SAAShB,QAAOS,cAAAA,KAAKC,KAAK,YAAVD,cAAc,IACjCF,IAAI,GACJ9B,WAAW;IACd,IAAI,CAACmC,sBAAsBvB,IAAI,CAAC2B,SAAS,OAAOL;IAChD,IAAIK,WAAWb,eAAea,OAAOC,QAAQ,CAAC,CAAC,CAAC,EAAEd,aAAa,GAAG;QAChE,OAAOQ;IACT;IACA,OAAOK;AACT"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import type { AglynOrgMember, HostAccessRole, HostPermissionKey, HostUid } from '../foundation';
|
|
18
|
+
import { type AglynOrgCustomRole } from './org-permissions';
|
|
19
|
+
/**
|
|
20
|
+
* Catalog keys a site collaborator holds PER SITE (AGL-2984), resolved on one
|
|
21
|
+
* of two axes.
|
|
22
|
+
*
|
|
23
|
+
* A plugin that declares a catalog key with `hostRoleDefaults` makes it a
|
|
24
|
+
* per-site key. For the people whose membership spans the workspace, the key
|
|
25
|
+
* is an ordinary catalog key: their org role's default, refined by a custom
|
|
26
|
+
* role and by per-member overrides, the same on every site. A site
|
|
27
|
+
* collaborator has no org standing to refine — their membership exists only
|
|
28
|
+
* to carry access to named sites — so for them the key is decided PER SITE,
|
|
29
|
+
* from the host role they hold there, refined by `hostPermissions[hostId]` on
|
|
30
|
+
* their member document.
|
|
31
|
+
*
|
|
32
|
+
* Which axis applies is `isOrgWideMember`, the predicate the rules projection
|
|
33
|
+
* and the scope resolver already share. A collaborator asked about a site
|
|
34
|
+
* they were never granted resolves to nothing, and so does one whose request
|
|
35
|
+
* names no site at all: there is no host role to read a default from, and
|
|
36
|
+
* guessing one would let a request reach around the per-site toggle by
|
|
37
|
+
* omitting the site.
|
|
38
|
+
*/
|
|
39
|
+
/** The catalog keys a collaborator can hold per site, in catalog order. */
|
|
40
|
+
export declare function hostPermissionKeys(): HostPermissionKey[];
|
|
41
|
+
/** What a host role grants for every per-site key, before any toggle. */
|
|
42
|
+
export declare function hostRolePermissionDefaults(role: HostAccessRole): Record<HostPermissionKey, boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* A collaborator's verdict on ONE site for every per-site key, or null where
|
|
45
|
+
* they have no access to that site at all. An absent toggle reads as the host
|
|
46
|
+
* role's default, which is what makes a member document written before
|
|
47
|
+
* `hostPermissions` existed resolve exactly as it did before.
|
|
48
|
+
*/
|
|
49
|
+
export declare function resolveCollaboratorHostPermissions(member: Partial<AglynOrgMember> | null | undefined, hostId: HostUid | null | undefined): Record<HostPermissionKey, boolean> | null;
|
|
50
|
+
/**
|
|
51
|
+
* A member's verdict for every per-site key, on whichever axis their
|
|
52
|
+
* membership is on.
|
|
53
|
+
*
|
|
54
|
+
* `customRole` is the member's custom role document when they carry a
|
|
55
|
+
* `roleId` and the caller has it in hand, and is ignored for a collaborator,
|
|
56
|
+
* whose org role is a seat-accounting fact rather than a grant. `hostId` is
|
|
57
|
+
* the site the request is about; an org-wide member resolves the same on
|
|
58
|
+
* every site and with none named.
|
|
59
|
+
*/
|
|
60
|
+
export declare function resolveMemberHostPermissions(options: {
|
|
61
|
+
member: Partial<AglynOrgMember> | null | undefined;
|
|
62
|
+
customRole?: AglynOrgCustomRole | null;
|
|
63
|
+
hostId?: HostUid | null;
|
|
64
|
+
}): Record<HostPermissionKey, boolean>;
|
|
65
|
+
/**
|
|
66
|
+
* The `memberPermissions` projection stamped on a host document beside
|
|
67
|
+
* `memberRoles`: every member who can reach the site, with the verdict for
|
|
68
|
+
* every per-site key they hold ON it. Org-wide members are resolved against
|
|
69
|
+
* the custom roles the caller loaded (one read per distinct role, as
|
|
70
|
+
* `syncOrgAuthProjections` already does for `resolvedPermissions`);
|
|
71
|
+
* collaborators against their host role. A member who cannot reach the site
|
|
72
|
+
* has no entry, matching `projectHostMemberRoles`.
|
|
73
|
+
*/
|
|
74
|
+
export declare function projectHostMemberPermissions(members: ReadonlyArray<Partial<AglynOrgMember> & {
|
|
75
|
+
$id: string;
|
|
76
|
+
}>, hostId: HostUid, customRoles: ReadonlyMap<string, AglynOrgCustomRole | null>): Record<string, Record<HostPermissionKey, boolean>>;
|
|
@@ -0,0 +1,119 @@
|
|
|
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 { listPluginOrgPermissions } from "../plugin-manager/plugin-entitlements.js";
|
|
17
|
+
import { hostRoleFor, isOrgWideMember } from "./organizations.js";
|
|
18
|
+
import { resolveOrgPermissions } from "./org-permissions.js";
|
|
19
|
+
/**
|
|
20
|
+
* Catalog keys a site collaborator holds PER SITE (AGL-2984), resolved on one
|
|
21
|
+
* of two axes.
|
|
22
|
+
*
|
|
23
|
+
* A plugin that declares a catalog key with `hostRoleDefaults` makes it a
|
|
24
|
+
* per-site key. For the people whose membership spans the workspace, the key
|
|
25
|
+
* is an ordinary catalog key: their org role's default, refined by a custom
|
|
26
|
+
* role and by per-member overrides, the same on every site. A site
|
|
27
|
+
* collaborator has no org standing to refine — their membership exists only
|
|
28
|
+
* to carry access to named sites — so for them the key is decided PER SITE,
|
|
29
|
+
* from the host role they hold there, refined by `hostPermissions[hostId]` on
|
|
30
|
+
* their member document.
|
|
31
|
+
*
|
|
32
|
+
* Which axis applies is `isOrgWideMember`, the predicate the rules projection
|
|
33
|
+
* and the scope resolver already share. A collaborator asked about a site
|
|
34
|
+
* they were never granted resolves to nothing, and so does one whose request
|
|
35
|
+
* names no site at all: there is no host role to read a default from, and
|
|
36
|
+
* guessing one would let a request reach around the per-site toggle by
|
|
37
|
+
* omitting the site.
|
|
38
|
+
*/ /** The catalog keys a collaborator can hold per site, in catalog order. */ export function hostPermissionKeys() {
|
|
39
|
+
return listPluginOrgPermissions().filter((permission)=>permission.hostRoleDefaults !== undefined).map((permission)=>permission.key);
|
|
40
|
+
}
|
|
41
|
+
/** What a host role grants for every per-site key, before any toggle. */ export function hostRolePermissionDefaults(role) {
|
|
42
|
+
const defaults = {};
|
|
43
|
+
for (const permission of listPluginOrgPermissions()){
|
|
44
|
+
if (!permission.hostRoleDefaults) continue;
|
|
45
|
+
defaults[permission.key] = permission.hostRoleDefaults[role] === true;
|
|
46
|
+
}
|
|
47
|
+
return defaults;
|
|
48
|
+
}
|
|
49
|
+
/** Every per-site key, refused. */ function noHostPermissions() {
|
|
50
|
+
return Object.fromEntries(hostPermissionKeys().map((key)=>[
|
|
51
|
+
key,
|
|
52
|
+
false
|
|
53
|
+
]));
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* A collaborator's verdict on ONE site for every per-site key, or null where
|
|
57
|
+
* they have no access to that site at all. An absent toggle reads as the host
|
|
58
|
+
* role's default, which is what makes a member document written before
|
|
59
|
+
* `hostPermissions` existed resolve exactly as it did before.
|
|
60
|
+
*/ export function resolveCollaboratorHostPermissions(member, hostId) {
|
|
61
|
+
var _member_hostPermissions;
|
|
62
|
+
if (!member || !hostId) return null;
|
|
63
|
+
const role = hostRoleFor(member, hostId);
|
|
64
|
+
if (!role) return null;
|
|
65
|
+
const merged = hostRolePermissionDefaults(role);
|
|
66
|
+
const toggles = (_member_hostPermissions = member.hostPermissions) == null ? void 0 : _member_hostPermissions[hostId];
|
|
67
|
+
if (toggles) {
|
|
68
|
+
for (const key of Object.keys(merged)){
|
|
69
|
+
const value = toggles[key];
|
|
70
|
+
if (typeof value === 'boolean') merged[key] = value;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return merged;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* A member's verdict for every per-site key, on whichever axis their
|
|
77
|
+
* membership is on.
|
|
78
|
+
*
|
|
79
|
+
* `customRole` is the member's custom role document when they carry a
|
|
80
|
+
* `roleId` and the caller has it in hand, and is ignored for a collaborator,
|
|
81
|
+
* whose org role is a seat-accounting fact rather than a grant. `hostId` is
|
|
82
|
+
* the site the request is about; an org-wide member resolves the same on
|
|
83
|
+
* every site and with none named.
|
|
84
|
+
*/ export function resolveMemberHostPermissions(options) {
|
|
85
|
+
var _resolveCollaboratorHostPermissions;
|
|
86
|
+
const { member, customRole, hostId } = options;
|
|
87
|
+
if (!member) return noHostPermissions();
|
|
88
|
+
if (isOrgWideMember(member)) {
|
|
89
|
+
const granted = resolveOrgPermissions(member, customRole != null ? customRole : null);
|
|
90
|
+
return Object.fromEntries(hostPermissionKeys().map((key)=>[
|
|
91
|
+
key,
|
|
92
|
+
granted[key] === true
|
|
93
|
+
]));
|
|
94
|
+
}
|
|
95
|
+
return (_resolveCollaboratorHostPermissions = resolveCollaboratorHostPermissions(member, hostId)) != null ? _resolveCollaboratorHostPermissions : noHostPermissions();
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The `memberPermissions` projection stamped on a host document beside
|
|
99
|
+
* `memberRoles`: every member who can reach the site, with the verdict for
|
|
100
|
+
* every per-site key they hold ON it. Org-wide members are resolved against
|
|
101
|
+
* the custom roles the caller loaded (one read per distinct role, as
|
|
102
|
+
* `syncOrgAuthProjections` already does for `resolvedPermissions`);
|
|
103
|
+
* collaborators against their host role. A member who cannot reach the site
|
|
104
|
+
* has no entry, matching `projectHostMemberRoles`.
|
|
105
|
+
*/ export function projectHostMemberPermissions(members, hostId, customRoles) {
|
|
106
|
+
const projection = {};
|
|
107
|
+
for (const member of members){
|
|
108
|
+
var _customRoles_get;
|
|
109
|
+
if (!hostRoleFor(member, hostId)) continue;
|
|
110
|
+
projection[member.$id] = resolveMemberHostPermissions({
|
|
111
|
+
member,
|
|
112
|
+
customRole: member.roleId ? (_customRoles_get = customRoles.get(member.roleId)) != null ? _customRoles_get : null : null,
|
|
113
|
+
hostId
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return projection;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=host-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/host-permissions.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 type {\n AglynOrgMember,\n HostAccessRole,\n HostPermissionKey,\n HostUid,\n} from '../foundation'\nimport { listPluginOrgPermissions } from '../plugin-manager/plugin-entitlements'\nimport { hostRoleFor, isOrgWideMember } from './organizations'\nimport { resolveOrgPermissions, type AglynOrgCustomRole } from './org-permissions'\n\n/**\n * Catalog keys a site collaborator holds PER SITE (AGL-2984), resolved on one\n * of two axes.\n *\n * A plugin that declares a catalog key with `hostRoleDefaults` makes it a\n * per-site key. For the people whose membership spans the workspace, the key\n * is an ordinary catalog key: their org role's default, refined by a custom\n * role and by per-member overrides, the same on every site. A site\n * collaborator has no org standing to refine — their membership exists only\n * to carry access to named sites — so for them the key is decided PER SITE,\n * from the host role they hold there, refined by `hostPermissions[hostId]` on\n * their member document.\n *\n * Which axis applies is `isOrgWideMember`, the predicate the rules projection\n * and the scope resolver already share. A collaborator asked about a site\n * they were never granted resolves to nothing, and so does one whose request\n * names no site at all: there is no host role to read a default from, and\n * guessing one would let a request reach around the per-site toggle by\n * omitting the site.\n */\n\n/** The catalog keys a collaborator can hold per site, in catalog order. */\nexport function hostPermissionKeys(): HostPermissionKey[] {\n return listPluginOrgPermissions()\n .filter((permission) => permission.hostRoleDefaults !== undefined)\n .map((permission) => permission.key)\n}\n\n/** What a host role grants for every per-site key, before any toggle. */\nexport function hostRolePermissionDefaults(\n role: HostAccessRole,\n): Record<HostPermissionKey, boolean> {\n const defaults: Record<HostPermissionKey, boolean> = {}\n for (const permission of listPluginOrgPermissions()) {\n if (!permission.hostRoleDefaults) continue\n defaults[permission.key] = permission.hostRoleDefaults[role] === true\n }\n return defaults\n}\n\n/** Every per-site key, refused. */\nfunction noHostPermissions(): Record<HostPermissionKey, boolean> {\n return Object.fromEntries(hostPermissionKeys().map((key) => [key, false]))\n}\n\n/**\n * A collaborator's verdict on ONE site for every per-site key, or null where\n * they have no access to that site at all. An absent toggle reads as the host\n * role's default, which is what makes a member document written before\n * `hostPermissions` existed resolve exactly as it did before.\n */\nexport function resolveCollaboratorHostPermissions(\n member: Partial<AglynOrgMember> | null | undefined,\n hostId: HostUid | null | undefined,\n): Record<HostPermissionKey, boolean> | null {\n if (!member || !hostId) return null\n const role = hostRoleFor(member, hostId)\n if (!role) return null\n const merged = hostRolePermissionDefaults(role)\n const toggles = member.hostPermissions?.[hostId]\n if (toggles) {\n for (const key of Object.keys(merged)) {\n const value = toggles[key]\n if (typeof value === 'boolean') merged[key] = value\n }\n }\n return merged\n}\n\n/**\n * A member's verdict for every per-site key, on whichever axis their\n * membership is on.\n *\n * `customRole` is the member's custom role document when they carry a\n * `roleId` and the caller has it in hand, and is ignored for a collaborator,\n * whose org role is a seat-accounting fact rather than a grant. `hostId` is\n * the site the request is about; an org-wide member resolves the same on\n * every site and with none named.\n */\nexport function resolveMemberHostPermissions(options: {\n member: Partial<AglynOrgMember> | null | undefined\n customRole?: AglynOrgCustomRole | null\n hostId?: HostUid | null\n}): Record<HostPermissionKey, boolean> {\n const { member, customRole, hostId } = options\n if (!member) return noHostPermissions()\n if (isOrgWideMember(member)) {\n const granted = resolveOrgPermissions(member, customRole ?? null)\n return Object.fromEntries(\n hostPermissionKeys().map((key) => [key, granted[key] === true]),\n )\n }\n return resolveCollaboratorHostPermissions(member, hostId) ?? noHostPermissions()\n}\n\n/**\n * The `memberPermissions` projection stamped on a host document beside\n * `memberRoles`: every member who can reach the site, with the verdict for\n * every per-site key they hold ON it. Org-wide members are resolved against\n * the custom roles the caller loaded (one read per distinct role, as\n * `syncOrgAuthProjections` already does for `resolvedPermissions`);\n * collaborators against their host role. A member who cannot reach the site\n * has no entry, matching `projectHostMemberRoles`.\n */\nexport function projectHostMemberPermissions(\n members: ReadonlyArray<Partial<AglynOrgMember> & { $id: string }>,\n hostId: HostUid,\n customRoles: ReadonlyMap<string, AglynOrgCustomRole | null>,\n): Record<string, Record<HostPermissionKey, boolean>> {\n const projection: Record<string, Record<HostPermissionKey, boolean>> = {}\n for (const member of members) {\n if (!hostRoleFor(member, hostId)) continue\n projection[member.$id] = resolveMemberHostPermissions({\n member,\n customRole: member.roleId ? (customRoles.get(member.roleId) ?? null) : null,\n hostId,\n })\n }\n return projection\n}\n"],"names":["listPluginOrgPermissions","hostRoleFor","isOrgWideMember","resolveOrgPermissions","hostPermissionKeys","filter","permission","hostRoleDefaults","undefined","map","key","hostRolePermissionDefaults","role","defaults","noHostPermissions","Object","fromEntries","resolveCollaboratorHostPermissions","member","hostId","merged","toggles","hostPermissions","keys","value","resolveMemberHostPermissions","options","customRole","granted","projectHostMemberPermissions","members","customRoles","projection","$id","roleId","get"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAQD,SAASA,wBAAwB,QAAQ,2CAAuC;AAChF,SAASC,WAAW,EAAEC,eAAe,QAAQ,qBAAiB;AAC9D,SAASC,qBAAqB,QAAiC,uBAAmB;AAElF;;;;;;;;;;;;;;;;;;;CAmBC,GAED,yEAAyE,GACzE,OAAO,SAASC;IACd,OAAOJ,2BACJK,MAAM,CAAC,CAACC,aAAeA,WAAWC,gBAAgB,KAAKC,WACvDC,GAAG,CAAC,CAACH,aAAeA,WAAWI,GAAG;AACvC;AAEA,uEAAuE,GACvE,OAAO,SAASC,2BACdC,IAAoB;IAEpB,MAAMC,WAA+C,CAAC;IACtD,KAAK,MAAMP,cAAcN,2BAA4B;QACnD,IAAI,CAACM,WAAWC,gBAAgB,EAAE;QAClCM,QAAQ,CAACP,WAAWI,GAAG,CAAC,GAAGJ,WAAWC,gBAAgB,CAACK,KAAK,KAAK;IACnE;IACA,OAAOC;AACT;AAEA,iCAAiC,GACjC,SAASC;IACP,OAAOC,OAAOC,WAAW,CAACZ,qBAAqBK,GAAG,CAAC,CAACC,MAAQ;YAACA;YAAK;SAAM;AAC1E;AAEA;;;;;CAKC,GACD,OAAO,SAASO,mCACdC,MAAkD,EAClDC,MAAkC;QAMlBD;IAJhB,IAAI,CAACA,UAAU,CAACC,QAAQ,OAAO;IAC/B,MAAMP,OAAOX,YAAYiB,QAAQC;IACjC,IAAI,CAACP,MAAM,OAAO;IAClB,MAAMQ,SAAST,2BAA2BC;IAC1C,MAAMS,WAAUH,0BAAAA,OAAOI,eAAe,qBAAtBJ,uBAAwB,CAACC,OAAO;IAChD,IAAIE,SAAS;QACX,KAAK,MAAMX,OAAOK,OAAOQ,IAAI,CAACH,QAAS;YACrC,MAAMI,QAAQH,OAAO,CAACX,IAAI;YAC1B,IAAI,OAAOc,UAAU,WAAWJ,MAAM,CAACV,IAAI,GAAGc;QAChD;IACF;IACA,OAAOJ;AACT;AAEA;;;;;;;;;CASC,GACD,OAAO,SAASK,6BAA6BC,OAI5C;QASQT;IARP,MAAM,EAAEC,MAAM,EAAES,UAAU,EAAER,MAAM,EAAE,GAAGO;IACvC,IAAI,CAACR,QAAQ,OAAOJ;IACpB,IAAIZ,gBAAgBgB,SAAS;QAC3B,MAAMU,UAAUzB,sBAAsBe,QAAQS,qBAAAA,aAAc;QAC5D,OAAOZ,OAAOC,WAAW,CACvBZ,qBAAqBK,GAAG,CAAC,CAACC,MAAQ;gBAACA;gBAAKkB,OAAO,CAAClB,IAAI,KAAK;aAAK;IAElE;IACA,QAAOO,sCAAAA,mCAAmCC,QAAQC,mBAA3CF,sCAAsDH;AAC/D;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASe,6BACdC,OAAiE,EACjEX,MAAe,EACfY,WAA2D;IAE3D,MAAMC,aAAiE,CAAC;IACxE,KAAK,MAAMd,UAAUY,QAAS;YAIGC;QAH/B,IAAI,CAAC9B,YAAYiB,QAAQC,SAAS;QAClCa,UAAU,CAACd,OAAOe,GAAG,CAAC,GAAGR,6BAA6B;YACpDP;YACAS,YAAYT,OAAOgB,MAAM,IAAIH,mBAAAA,YAAYI,GAAG,CAACjB,OAAOgB,MAAM,aAA7BH,mBAAkC,OAAQ;YACvEZ;QACF;IACF;IACA,OAAOa;AACT"}
|
|
@@ -0,0 +1,228 @@
|
|
|
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
|
+
* Host variables — publisher templates that fill themselves in (AGL-1022).
|
|
19
|
+
*
|
|
20
|
+
* A publisher writing an email template cannot reference the installing site,
|
|
21
|
+
* so every install begins with the same chore: swap the placeholder logo, fix
|
|
22
|
+
* the business name, correct the links. Miss one and the site sends an email
|
|
23
|
+
* carrying someone else's branding.
|
|
24
|
+
*
|
|
25
|
+
* `host.*` gives artifacts a way to NAME the host instead of hard-coding it.
|
|
26
|
+
* The author writes `{{host.businessName}}`; the installing site fills it in,
|
|
27
|
+
* and it stays filled in when that site rebrands.
|
|
28
|
+
*
|
|
29
|
+
* ## The namespace IS the security boundary
|
|
30
|
+
*
|
|
31
|
+
* This is publisher-authored content resolving against tenant data, so the
|
|
32
|
+
* registry is CLOSED and each token reads through a hand-written function
|
|
33
|
+
* rather than a path into the document. That is the whole design: a token
|
|
34
|
+
* cannot address `stripeAccountId`, or `memberRoles`, or anything else, because
|
|
35
|
+
* there is no path syntax to express it — `host.` is followed by a key that
|
|
36
|
+
* either appears in {@link HOST_TOKENS} or resolves to nothing at all. Adding a
|
|
37
|
+
* token is a deliberate edit here, reviewable as a diff.
|
|
38
|
+
*
|
|
39
|
+
* A path-based registry ("allow `host.seo.title`") would have been shorter and
|
|
40
|
+
* is the version to refuse: allowlisting prefixes is how a namespace grows a
|
|
41
|
+
* hole, and the first `host.orgId` would be a data leak with a plausible commit
|
|
42
|
+
* message.
|
|
43
|
+
*
|
|
44
|
+
* ## Resolve LATE
|
|
45
|
+
*
|
|
46
|
+
* At render and at send, never at install. Freezing values into the artifact
|
|
47
|
+
* would make a rebrand stop propagating silently — the site would keep sending
|
|
48
|
+
* last year's business name from a template nobody remembers is a template.
|
|
49
|
+
*
|
|
50
|
+
* ## Every token defines what "empty" does
|
|
51
|
+
*
|
|
52
|
+
* A site with no logo must produce something deliberate. Never an empty image,
|
|
53
|
+
* and never the literal `{{host.logo}}` reaching a visitor — a leaked token is
|
|
54
|
+
* the most embarrassing possible failure for a feature whose entire purpose is
|
|
55
|
+
* to stop templates looking unfinished.
|
|
56
|
+
*/
|
|
57
|
+
/**
|
|
58
|
+
* What a token yields, so a renderer knows how to place it and the authoring
|
|
59
|
+
* surface can refuse it in the wrong slot.
|
|
60
|
+
*
|
|
61
|
+
* `text` is the only type safe to drop into arbitrary copy. The others carry a
|
|
62
|
+
* shape a slot has to understand — an `image` in a paragraph is a URL sitting
|
|
63
|
+
* in the middle of a sentence, which is exactly the "fails in a sent email"
|
|
64
|
+
* outcome this typing exists to move to authoring time.
|
|
65
|
+
*/
|
|
66
|
+
export type HostTokenType = 'text' | 'url' | 'email' | 'image' | 'address';
|
|
67
|
+
/** What a renderer should do when a token resolves to nothing. */
|
|
68
|
+
export type HostTokenEmptyBehaviour =
|
|
69
|
+
/** Render nothing in its place; the surrounding copy still makes sense. */
|
|
70
|
+
'blank'
|
|
71
|
+
/**
|
|
72
|
+
* The block holding it should be dropped entirely. An `<img src="">` is a
|
|
73
|
+
* broken-image icon in every mail client, which is worse than no logo.
|
|
74
|
+
*/
|
|
75
|
+
| 'omit-block';
|
|
76
|
+
/** The site fields a token may read. A closed, explicit surface. */
|
|
77
|
+
export interface HostTokenSource {
|
|
78
|
+
displayName?: string;
|
|
79
|
+
logoUrl?: string;
|
|
80
|
+
subdomain?: string;
|
|
81
|
+
cname?: string;
|
|
82
|
+
/** Contact details a publisher template can reference (AGL-1022). */
|
|
83
|
+
business?: {
|
|
84
|
+
supportEmail?: string;
|
|
85
|
+
address?: string;
|
|
86
|
+
socialLinks?: Array<{
|
|
87
|
+
label?: string;
|
|
88
|
+
url?: string;
|
|
89
|
+
}>;
|
|
90
|
+
};
|
|
91
|
+
seo?: {
|
|
92
|
+
entity?: {
|
|
93
|
+
name?: string;
|
|
94
|
+
logo?: string;
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export interface HostTokenDefinition {
|
|
99
|
+
/** The key after `host.` */
|
|
100
|
+
key: string;
|
|
101
|
+
type: HostTokenType;
|
|
102
|
+
label: string;
|
|
103
|
+
description: string;
|
|
104
|
+
/** Reads the value. Hand-written per token — never a path into the document. */
|
|
105
|
+
resolve: (host: HostTokenSource) => string | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* A deliberate second choice when `resolve` finds nothing.
|
|
108
|
+
*
|
|
109
|
+
* Not a nicety: "fall back to the business name" is what turns a missing logo
|
|
110
|
+
* from a hole in the page into a wordmark, which is what a careful designer
|
|
111
|
+
* would have done by hand.
|
|
112
|
+
*/
|
|
113
|
+
fallback?: (host: HostTokenSource) => string | undefined;
|
|
114
|
+
whenEmpty: HostTokenEmptyBehaviour;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* The closed registry.
|
|
118
|
+
*
|
|
119
|
+
* Ordered as an author would look for them. Every entry is reachable from a
|
|
120
|
+
* field a site can actually set — a token that can never resolve is worse than
|
|
121
|
+
* an absent one, because it teaches people the feature does not work.
|
|
122
|
+
*/
|
|
123
|
+
export declare const HOST_TOKENS: Record<string, HostTokenDefinition>;
|
|
124
|
+
/**
|
|
125
|
+
* The registry's entry for `key`, or undefined when it declares none.
|
|
126
|
+
*
|
|
127
|
+
* An OWN entry only. `HOST_TOKENS` is an object literal, so a bare index also
|
|
128
|
+
* finds the `Object.prototype` members — `constructor`, `toString`, `valueOf` —
|
|
129
|
+
* and every one of those names matches {@link HOST_TOKEN_PATTERN}. Read that
|
|
130
|
+
* way, `{{host.constructor}}` answers the `Object` function where a definition
|
|
131
|
+
* belongs, and calling its `resolve` throws in the middle of a render. A name
|
|
132
|
+
* the registry does not declare resolves to nothing, whatever the name is.
|
|
133
|
+
*/
|
|
134
|
+
export declare function hostTokenDefinition(key: string): HostTokenDefinition | undefined;
|
|
135
|
+
/**
|
|
136
|
+
* `{{host.key}}` — whitespace-tolerant, and deliberately NOT dotted beyond one
|
|
137
|
+
* segment. `host.a.b` does not match, so there is no path syntax to abuse.
|
|
138
|
+
*/
|
|
139
|
+
export declare const HOST_TOKEN_PATTERN: RegExp;
|
|
140
|
+
/** Every `host.*` token in a string, in order, including unknown ones. */
|
|
141
|
+
export declare function hostTokensIn(text: string): string[];
|
|
142
|
+
/** The resolved value of one token, or undefined when the site has none. */
|
|
143
|
+
export declare function resolveHostToken(key: string, host: HostTokenSource | null | undefined): string | undefined;
|
|
144
|
+
/**
|
|
145
|
+
* Replaces every `host.*` token with the installing site's value.
|
|
146
|
+
*
|
|
147
|
+
* An unresolved token — unknown key, or a site that has not set the field —
|
|
148
|
+
* renders EMPTY, never the literal. Leaking `{{host.logo}}` into a sent email
|
|
149
|
+
* is the failure this feature exists to prevent, so it cannot be the fallback
|
|
150
|
+
* for the feature's own gaps. The authoring-time check
|
|
151
|
+
* ({@link validateHostTokens}) is where a typo is meant to be caught, while the
|
|
152
|
+
* writer can still fix it.
|
|
153
|
+
*/
|
|
154
|
+
export declare function resolveHostTokens(text: string, host: HostTokenSource | null | undefined): string;
|
|
155
|
+
export interface HostTokenIssue {
|
|
156
|
+
key: string;
|
|
157
|
+
/**
|
|
158
|
+
* `unknown` — no such token; it will render empty.
|
|
159
|
+
* `wrong-slot` — the token's type cannot be placed here.
|
|
160
|
+
*/
|
|
161
|
+
kind: 'unknown' | 'wrong-slot';
|
|
162
|
+
message: string;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Authoring-time check: catch a token before it reaches a visitor.
|
|
166
|
+
*
|
|
167
|
+
* The two things worth failing on are a typo (which would silently render
|
|
168
|
+
* nothing) and a type mismatch (an image URL dropped into a sentence). Both are
|
|
169
|
+
* invisible at authoring time without this and obvious afterwards, which is the
|
|
170
|
+
* wrong way round for something that ends up in a sent email.
|
|
171
|
+
*
|
|
172
|
+
* `allow` names the types this slot can take. Omit it for free text, where only
|
|
173
|
+
* `text` and the string-ish types make sense.
|
|
174
|
+
*/
|
|
175
|
+
export declare function validateHostTokens(text: string, options?: {
|
|
176
|
+
allow?: readonly HostTokenType[];
|
|
177
|
+
}): HostTokenIssue[];
|
|
178
|
+
/**
|
|
179
|
+
* Whether a block containing these tokens should be dropped for this site.
|
|
180
|
+
*
|
|
181
|
+
* The other half of "every token needs a defined empty behaviour": a logo block
|
|
182
|
+
* on a site with no logo should not render an empty image, and the renderer
|
|
183
|
+
* cannot know that from the resolved string alone — `''` is both "no value" and
|
|
184
|
+
* "a value that happens to be empty". Asking here keeps the rule with the
|
|
185
|
+
* token definition rather than spread across the surfaces that render it.
|
|
186
|
+
*/
|
|
187
|
+
export declare function shouldOmitBlock(text: string, host: HostTokenSource | null | undefined): boolean;
|
|
188
|
+
/**
|
|
189
|
+
* Every token with its resolved value for one site, for an authoring picker
|
|
190
|
+
* that shows what each will actually produce here.
|
|
191
|
+
*
|
|
192
|
+
* A picker listing token names alone makes the author guess; showing the value
|
|
193
|
+
* this site would render is what turns "is it businessName or business_name"
|
|
194
|
+
* into a question nobody has to ask.
|
|
195
|
+
*/
|
|
196
|
+
export declare function describeHostTokens(host: HostTokenSource | null | undefined): Array<HostTokenDefinition & {
|
|
197
|
+
token: string;
|
|
198
|
+
value?: string;
|
|
199
|
+
set: boolean;
|
|
200
|
+
}>;
|
|
201
|
+
/**
|
|
202
|
+
* The `host.*` values as a merge-token map, for surfaces that already have a
|
|
203
|
+
* token substituter of their own.
|
|
204
|
+
*
|
|
205
|
+
* This is how EMAIL gets host variables without the email library depending on
|
|
206
|
+
* this one: `substituteMergeTokens` already matches `{{a.b}}`, so a caller
|
|
207
|
+
* spreads this into the merge map it was passing anyway. One registry, two
|
|
208
|
+
* surfaces, no second substitution engine to drift.
|
|
209
|
+
*
|
|
210
|
+
* Every registered token appears, INCLUDING the ones this site has not set —
|
|
211
|
+
* as `''`. Omitting them would leave `{{host.supportEmail}}` for the generic
|
|
212
|
+
* catch-all to blank, which works today and works by accident: the moment a
|
|
213
|
+
* surface without that catch-all uses this map, the literal token ships.
|
|
214
|
+
*/
|
|
215
|
+
export declare function hostTokenMerge(host: HostTokenSource | null | undefined): Record<string, string>;
|
|
216
|
+
/**
|
|
217
|
+
* Resolves `host.*` tokens across every string prop of a normalized node map.
|
|
218
|
+
*
|
|
219
|
+
* Mirrors `resolveNodesBindings` deliberately — same shallow-copy discipline,
|
|
220
|
+
* same string-props-only rule — so a screen and an email resolve the same token
|
|
221
|
+
* to the same value. The issue's warning is the reason: two resolvers drift,
|
|
222
|
+
* and then the same token means different things depending on where an author
|
|
223
|
+
* typed it.
|
|
224
|
+
*
|
|
225
|
+
* Returns the input untouched when the site has nothing to substitute, so a
|
|
226
|
+
* binding-free tree costs one `Object.entries`.
|
|
227
|
+
*/
|
|
228
|
+
export declare function resolveNodesHostTokens<T extends Record<string, any>>(nodes: T, host: HostTokenSource | null | undefined): T;
|