@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,61 @@
|
|
|
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
|
+
* 403, not 401.
|
|
19
|
+
*
|
|
20
|
+
* The caller's credential is fine — that is the whole problem. What is
|
|
21
|
+
* refused is the ORIGIN it came from, and no re-authentication would change
|
|
22
|
+
* the answer, so `401 Unauthorized` (which invites a retry with credentials)
|
|
23
|
+
* would be a lie. Matches how the lockdown gate reasons about 423.
|
|
24
|
+
*/
|
|
25
|
+
export declare const CROSS_ORIGIN_REFUSED_STATUS = 403;
|
|
26
|
+
export interface CrossOriginWriteOptions {
|
|
27
|
+
/** Dispatcher path, e.g. `commerce/cart`. Decides visitor vs machine. */
|
|
28
|
+
path: string;
|
|
29
|
+
/** Read for its method, `origin`, `x-forwarded-host` and `host`. */
|
|
30
|
+
request: {
|
|
31
|
+
method?: string;
|
|
32
|
+
headers?: {
|
|
33
|
+
get?: (name: string) => unknown;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Is this a state-changing plugin-API request from another origin?
|
|
39
|
+
*
|
|
40
|
+
* Exported separately from the refusal so the decision can be asserted
|
|
41
|
+
* directly in tests and reused by the console dispatcher without either
|
|
42
|
+
* inheriting a `Response` shape it may not want.
|
|
43
|
+
*/
|
|
44
|
+
export declare function isCrossOriginPluginWrite(options: CrossOriginWriteOptions): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* The refusal a cross-origin plugin write returns, or null to proceed:
|
|
47
|
+
*
|
|
48
|
+
* const foreign = crossOriginPluginWriteRefusal({ path, request })
|
|
49
|
+
* if (foreign) return foreign
|
|
50
|
+
*
|
|
51
|
+
* Same "return it or carry on" contract as `visitorWriteRefusal` and
|
|
52
|
+
* `visitorWriteRateLimitRefusal`, so the dispatcher reads as one list of
|
|
53
|
+
* gates rather than three shapes.
|
|
54
|
+
*
|
|
55
|
+
* The body names the reason. Unlike the rate limiter — which is deliberately
|
|
56
|
+
* mute because it faces abusers and every detail is a hint — this refusal is
|
|
57
|
+
* one a legitimate integrator can hit by calling from the wrong host, and a
|
|
58
|
+
* bare 403 would cost them an afternoon. It discloses nothing an attacker did
|
|
59
|
+
* not already know, having chosen the origin themselves.
|
|
60
|
+
*/
|
|
61
|
+
export declare function crossOriginPluginWriteRefusal(options: CrossOriginWriteOptions): Response | null;
|
|
@@ -0,0 +1,202 @@
|
|
|
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
|
+
* Same-origin policy for visitor-facing plugin-API WRITES (AGL-1880).
|
|
18
|
+
*
|
|
19
|
+
* Pure and dependency-free, beside `plugin-api-rate-limit` and for the same
|
|
20
|
+
* reason: the dispatcher gate is one line, and the reasoning it encodes is
|
|
21
|
+
* unit-testable without a route harness.
|
|
22
|
+
*
|
|
23
|
+
* ## The hole this closes
|
|
24
|
+
*
|
|
25
|
+
* The standing claim — recorded on 2026-07-24 when CSRF was considered and
|
|
26
|
+
* deliberately NOT added — was that CSRF is *structurally impossible* here
|
|
27
|
+
* because every API route authorizes with `Authorization: Bearer <idToken>`,
|
|
28
|
+
* which a browser never attaches on its own. That claim was audited against
|
|
29
|
+
* the tree on 2026-08-19 and it holds for all 140 console routes. It does not
|
|
30
|
+
* hold for the tenant plugin-API dispatcher, and the exception was never an
|
|
31
|
+
* exception anyone wrote down:
|
|
32
|
+
*
|
|
33
|
+
* - `libs/plugins/commerce/**` handlers authorize by COOKIE, not Bearer —
|
|
34
|
+
* `aglyn_member_{hostId}` for `membership/account`, `membership/wishlist`,
|
|
35
|
+
* `membership/logout`, `commerce/stream`, `commerce/subscription-portal`,
|
|
36
|
+
* and `aglyn_cart_{hostId}` for `commerce/cart`, `commerce/cart-checkout`.
|
|
37
|
+
* - Several of those MUTATE: `membership/account` writes `displayName` and
|
|
38
|
+
* the address book, `membership/wishlist` writes the wishlist,
|
|
39
|
+
* `commerce/cart` writes cart lines.
|
|
40
|
+
* - `api-adapter` parses `application/x-www-form-urlencoded` into `req.body`,
|
|
41
|
+
* and the handlers read `hostId` from `req.body`. That content type is a
|
|
42
|
+
* CORS-*simple* request, so a cross-origin HTML form POST reaches the
|
|
43
|
+
* handler with **no preflight** to refuse it.
|
|
44
|
+
*
|
|
45
|
+
* ## Why `SameSite=Lax` is not already the answer
|
|
46
|
+
*
|
|
47
|
+
* It is the only thing standing there today, and it stops the ordinary case:
|
|
48
|
+
* a POST from an unrelated site is cross-SITE, so the cookie is withheld.
|
|
49
|
+
*
|
|
50
|
+
* It does not stop the case this platform creates. Every published tenant
|
|
51
|
+
* lives under `*.aglyn.app`, and sibling subdomains of one registrable domain
|
|
52
|
+
* are same-SITE. `SameSite` is not `SameOrigin`. So a form POST from
|
|
53
|
+
* `evil.aglyn.app` to `victim.aglyn.app/api/membership/account` carries
|
|
54
|
+
* `aglyn_member_victim` in full, and the tenant who authored `evil` is an
|
|
55
|
+
* ordinary customer who signed up. The cookie flag is doing exactly what it
|
|
56
|
+
* documents; it is simply the wrong boundary for a multi-tenant apex.
|
|
57
|
+
*
|
|
58
|
+
* ## The rule
|
|
59
|
+
*
|
|
60
|
+
* A state-changing plugin-API request must be same-ORIGIN. Reads are
|
|
61
|
+
* untouched — a cross-origin GET carries no authority a cross-origin
|
|
62
|
+
* `<img>`/`<script>` did not already have, and the console's preview surface
|
|
63
|
+
* reads these paths legitimately.
|
|
64
|
+
*
|
|
65
|
+
* An ABSENT `Origin` header is allowed, and that is the one judgement call
|
|
66
|
+
* worth stating plainly. CSRF is an attack a browser is tricked into
|
|
67
|
+
* performing, and a browser always sends `Origin` on a cross-origin request
|
|
68
|
+
* — including the form POST above, and including every no-preflight simple
|
|
69
|
+
* request. Absence therefore means a non-browser caller: `curl`, a webhook,
|
|
70
|
+
* the server-to-server `commerce/supplier-update` hop. Refusing those would
|
|
71
|
+
* break real integrations to defend against a client that, by definition,
|
|
72
|
+
* chooses its own headers and would simply omit the one we demanded. Header
|
|
73
|
+
* presence is not a credential — the same reasoning `plugin-api-rate-limit`
|
|
74
|
+
* uses to refuse to exempt on `authorization` being present.
|
|
75
|
+
*
|
|
76
|
+
* A literal `Origin: null` is NOT allowed through ON ITS OWN. It is an opaque
|
|
77
|
+
* origin — a sandboxed iframe, or a POST that arrived via a redirect — and it
|
|
78
|
+
* is precisely the shape an attacker reaches for once a plain cross-origin
|
|
79
|
+
* POST is refused. `null` is never same-origin with anything, so it fails the
|
|
80
|
+
* comparison rather than needing a special case; the constant exists so the
|
|
81
|
+
* intent is legible.
|
|
82
|
+
*
|
|
83
|
+
* ## ⚠️ `Sec-Fetch-Site`, and the same-origin form this rule used to refuse
|
|
84
|
+
*
|
|
85
|
+
* `Origin: null` is not only an attacker's shape. A page served with
|
|
86
|
+
* `Referrer-Policy: no-referrer` sends `Origin: null` on its OWN top-level
|
|
87
|
+
* form POST — the referrer policy governs the Origin header on a navigation,
|
|
88
|
+
* so a form submitting to the very page that rendered it arrives opaque.
|
|
89
|
+
*
|
|
90
|
+
* That is not a hypothetical. Every recipient-facing email page —
|
|
91
|
+
* `email/preferences`, `email/unsubscribe`, `email/resubscribe` — sets
|
|
92
|
+
* `no-referrer` deliberately, so a signed opt-out URL cannot leak through a
|
|
93
|
+
* `Referer` header. The result was that the preference centre's own "Save my
|
|
94
|
+
* preferences" button was refused 403 as cross-site, while a `fetch()` from
|
|
95
|
+
* the same document succeeded: a recipient could open the page, untick a
|
|
96
|
+
* topic, press Save, and be shown a JSON error while nothing was written.
|
|
97
|
+
* The privacy hardening had disabled the control it was protecting.
|
|
98
|
+
*
|
|
99
|
+
* `Sec-Fetch-Site` is the discriminator, and it is the right one because the
|
|
100
|
+
* BROWSER computes it and page script cannot set it. `same-origin` and
|
|
101
|
+
* `none` (a user typing the URL or opening a bookmark) are both statements
|
|
102
|
+
* that this did not come from another site, and they are trustworthy in a way
|
|
103
|
+
* the Origin header — deliberately blanked by our own policy — no longer is
|
|
104
|
+
* here. It is consulted only to ALLOW: a `cross-site` or `same-site` value
|
|
105
|
+
* falls through to the origin comparison exactly as before, so nothing an
|
|
106
|
+
* attacker can send gets a new way in. A caller that omits the header is
|
|
107
|
+
* unchanged too, which keeps the non-browser allowance above intact.
|
|
108
|
+
*/ import { lockdownIntentForMethod } from "./lockdown.js";
|
|
109
|
+
import { isMachinePluginApiPath } from "./plugin-api-rate-limit.js";
|
|
110
|
+
/**
|
|
111
|
+
* 403, not 401.
|
|
112
|
+
*
|
|
113
|
+
* The caller's credential is fine — that is the whole problem. What is
|
|
114
|
+
* refused is the ORIGIN it came from, and no re-authentication would change
|
|
115
|
+
* the answer, so `401 Unauthorized` (which invites a retry with credentials)
|
|
116
|
+
* would be a lie. Matches how the lockdown gate reasons about 423.
|
|
117
|
+
*/ export const CROSS_ORIGIN_REFUSED_STATUS = 403;
|
|
118
|
+
/** The opaque origin. Never same-origin with anything, including itself. */ const OPAQUE_ORIGIN = 'null';
|
|
119
|
+
/** Host of an `Origin` header value, or `''` when it is absent/unparsable. */ function originHost(origin) {
|
|
120
|
+
const raw = String(origin != null ? origin : '').trim();
|
|
121
|
+
if (!raw || raw === OPAQUE_ORIGIN) return '';
|
|
122
|
+
try {
|
|
123
|
+
return new URL(raw).host.toLowerCase();
|
|
124
|
+
} catch (unused) {
|
|
125
|
+
return '';
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* The host this request was actually addressed to.
|
|
130
|
+
*
|
|
131
|
+
* `x-forwarded-host` first: behind Vercel that is the public hostname the
|
|
132
|
+
* visitor typed, while `host` can be the internal one. Falls back to `host`
|
|
133
|
+
* so the function is still correct off-platform (self-host, local dev), which
|
|
134
|
+
* `deployment-shape` makes a supported case rather than a hypothetical.
|
|
135
|
+
*/ function requestHost(headers) {
|
|
136
|
+
var _ref, _ref1;
|
|
137
|
+
var _String_split_, _headers_get, _headers_get1;
|
|
138
|
+
const forwarded = (_String_split_ = String((_ref = headers == null ? void 0 : (_headers_get = headers.get) == null ? void 0 : _headers_get.call(headers, 'x-forwarded-host')) != null ? _ref : '').split(',')[0]) == null ? void 0 : _String_split_.trim();
|
|
139
|
+
const host = forwarded || String((_ref1 = headers == null ? void 0 : (_headers_get1 = headers.get) == null ? void 0 : _headers_get1.call(headers, 'host')) != null ? _ref1 : '').trim();
|
|
140
|
+
return host.toLowerCase();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Is this a state-changing plugin-API request from another origin?
|
|
144
|
+
*
|
|
145
|
+
* Exported separately from the refusal so the decision can be asserted
|
|
146
|
+
* directly in tests and reused by the console dispatcher without either
|
|
147
|
+
* inheriting a `Response` shape it may not want.
|
|
148
|
+
*/ export function isCrossOriginPluginWrite(options) {
|
|
149
|
+
var _ref, _ref1;
|
|
150
|
+
var _options_request, _options_request1, _headers_get, _headers_get1;
|
|
151
|
+
if (lockdownIntentForMethod(options == null ? void 0 : (_options_request = options.request) == null ? void 0 : _options_request.method) === 'read') return false;
|
|
152
|
+
if (isMachinePluginApiPath(options == null ? void 0 : options.path)) return false;
|
|
153
|
+
const headers = (_ref = options == null ? void 0 : (_options_request1 = options.request) == null ? void 0 : _options_request1.headers) != null ? _ref : {};
|
|
154
|
+
/*
|
|
155
|
+
* The browser's own statement about where this came from, trusted before
|
|
156
|
+
* the Origin header because our own `no-referrer` policy blanks that one.
|
|
157
|
+
* ALLOW-only: any other value falls through to the comparison below.
|
|
158
|
+
*/ const site = String((_ref1 = headers == null ? void 0 : (_headers_get = headers.get) == null ? void 0 : _headers_get.call(headers, 'sec-fetch-site')) != null ? _ref1 : '').trim().toLowerCase();
|
|
159
|
+
if (site === 'same-origin' || site === 'none') return false;
|
|
160
|
+
const origin = headers == null ? void 0 : (_headers_get1 = headers.get) == null ? void 0 : _headers_get1.call(headers, 'origin');
|
|
161
|
+
// Absent Origin: a non-browser caller. See the module note — this is the
|
|
162
|
+
// deliberate allowance, not an oversight.
|
|
163
|
+
if (origin === null || origin === undefined || String(origin).trim() === '') {
|
|
164
|
+
return false;
|
|
165
|
+
}
|
|
166
|
+
const from = originHost(String(origin));
|
|
167
|
+
const to = requestHost(headers);
|
|
168
|
+
// An unparsable or opaque Origin yields `''`, which can never equal a real
|
|
169
|
+
// host, so it lands here as cross-origin — the intended outcome.
|
|
170
|
+
if (!to) {
|
|
171
|
+
// No host to compare against. Refusing every write on a malformed request
|
|
172
|
+
// would be a worse failure than the one being prevented, and a request
|
|
173
|
+
// with no Host reached no tenant site to begin with.
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
return from !== to;
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* The refusal a cross-origin plugin write returns, or null to proceed:
|
|
180
|
+
*
|
|
181
|
+
* const foreign = crossOriginPluginWriteRefusal({ path, request })
|
|
182
|
+
* if (foreign) return foreign
|
|
183
|
+
*
|
|
184
|
+
* Same "return it or carry on" contract as `visitorWriteRefusal` and
|
|
185
|
+
* `visitorWriteRateLimitRefusal`, so the dispatcher reads as one list of
|
|
186
|
+
* gates rather than three shapes.
|
|
187
|
+
*
|
|
188
|
+
* The body names the reason. Unlike the rate limiter — which is deliberately
|
|
189
|
+
* mute because it faces abusers and every detail is a hint — this refusal is
|
|
190
|
+
* one a legitimate integrator can hit by calling from the wrong host, and a
|
|
191
|
+
* bare 403 would cost them an afternoon. It discloses nothing an attacker did
|
|
192
|
+
* not already know, having chosen the origin themselves.
|
|
193
|
+
*/ export function crossOriginPluginWriteRefusal(options) {
|
|
194
|
+
if (!isCrossOriginPluginWrite(options)) return null;
|
|
195
|
+
return Response.json({
|
|
196
|
+
error: 'Cross-origin writes are not allowed.'
|
|
197
|
+
}, {
|
|
198
|
+
status: CROSS_ORIGIN_REFUSED_STATUS
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
//# sourceMappingURL=plugin-api-cross-origin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/plugin-api-cross-origin.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 * Same-origin policy for visitor-facing plugin-API WRITES (AGL-1880).\n *\n * Pure and dependency-free, beside `plugin-api-rate-limit` and for the same\n * reason: the dispatcher gate is one line, and the reasoning it encodes is\n * unit-testable without a route harness.\n *\n * ## The hole this closes\n *\n * The standing claim — recorded on 2026-07-24 when CSRF was considered and\n * deliberately NOT added — was that CSRF is *structurally impossible* here\n * because every API route authorizes with `Authorization: Bearer <idToken>`,\n * which a browser never attaches on its own. That claim was audited against\n * the tree on 2026-08-19 and it holds for all 140 console routes. It does not\n * hold for the tenant plugin-API dispatcher, and the exception was never an\n * exception anyone wrote down:\n *\n * - `libs/plugins/commerce/**` handlers authorize by COOKIE, not Bearer —\n * `aglyn_member_{hostId}` for `membership/account`, `membership/wishlist`,\n * `membership/logout`, `commerce/stream`, `commerce/subscription-portal`,\n * and `aglyn_cart_{hostId}` for `commerce/cart`, `commerce/cart-checkout`.\n * - Several of those MUTATE: `membership/account` writes `displayName` and\n * the address book, `membership/wishlist` writes the wishlist,\n * `commerce/cart` writes cart lines.\n * - `api-adapter` parses `application/x-www-form-urlencoded` into `req.body`,\n * and the handlers read `hostId` from `req.body`. That content type is a\n * CORS-*simple* request, so a cross-origin HTML form POST reaches the\n * handler with **no preflight** to refuse it.\n *\n * ## Why `SameSite=Lax` is not already the answer\n *\n * It is the only thing standing there today, and it stops the ordinary case:\n * a POST from an unrelated site is cross-SITE, so the cookie is withheld.\n *\n * It does not stop the case this platform creates. Every published tenant\n * lives under `*.aglyn.app`, and sibling subdomains of one registrable domain\n * are same-SITE. `SameSite` is not `SameOrigin`. So a form POST from\n * `evil.aglyn.app` to `victim.aglyn.app/api/membership/account` carries\n * `aglyn_member_victim` in full, and the tenant who authored `evil` is an\n * ordinary customer who signed up. The cookie flag is doing exactly what it\n * documents; it is simply the wrong boundary for a multi-tenant apex.\n *\n * ## The rule\n *\n * A state-changing plugin-API request must be same-ORIGIN. Reads are\n * untouched — a cross-origin GET carries no authority a cross-origin\n * `<img>`/`<script>` did not already have, and the console's preview surface\n * reads these paths legitimately.\n *\n * An ABSENT `Origin` header is allowed, and that is the one judgement call\n * worth stating plainly. CSRF is an attack a browser is tricked into\n * performing, and a browser always sends `Origin` on a cross-origin request\n * — including the form POST above, and including every no-preflight simple\n * request. Absence therefore means a non-browser caller: `curl`, a webhook,\n * the server-to-server `commerce/supplier-update` hop. Refusing those would\n * break real integrations to defend against a client that, by definition,\n * chooses its own headers and would simply omit the one we demanded. Header\n * presence is not a credential — the same reasoning `plugin-api-rate-limit`\n * uses to refuse to exempt on `authorization` being present.\n *\n * A literal `Origin: null` is NOT allowed through ON ITS OWN. It is an opaque\n * origin — a sandboxed iframe, or a POST that arrived via a redirect — and it\n * is precisely the shape an attacker reaches for once a plain cross-origin\n * POST is refused. `null` is never same-origin with anything, so it fails the\n * comparison rather than needing a special case; the constant exists so the\n * intent is legible.\n *\n * ## ⚠️ `Sec-Fetch-Site`, and the same-origin form this rule used to refuse\n *\n * `Origin: null` is not only an attacker's shape. A page served with\n * `Referrer-Policy: no-referrer` sends `Origin: null` on its OWN top-level\n * form POST — the referrer policy governs the Origin header on a navigation,\n * so a form submitting to the very page that rendered it arrives opaque.\n *\n * That is not a hypothetical. Every recipient-facing email page —\n * `email/preferences`, `email/unsubscribe`, `email/resubscribe` — sets\n * `no-referrer` deliberately, so a signed opt-out URL cannot leak through a\n * `Referer` header. The result was that the preference centre's own \"Save my\n * preferences\" button was refused 403 as cross-site, while a `fetch()` from\n * the same document succeeded: a recipient could open the page, untick a\n * topic, press Save, and be shown a JSON error while nothing was written.\n * The privacy hardening had disabled the control it was protecting.\n *\n * `Sec-Fetch-Site` is the discriminator, and it is the right one because the\n * BROWSER computes it and page script cannot set it. `same-origin` and\n * `none` (a user typing the URL or opening a bookmark) are both statements\n * that this did not come from another site, and they are trustworthy in a way\n * the Origin header — deliberately blanked by our own policy — no longer is\n * here. It is consulted only to ALLOW: a `cross-site` or `same-site` value\n * falls through to the origin comparison exactly as before, so nothing an\n * attacker can send gets a new way in. A caller that omits the header is\n * unchanged too, which keeps the non-browser allowance above intact.\n */\n\nimport { lockdownIntentForMethod } from './lockdown'\nimport { isMachinePluginApiPath } from './plugin-api-rate-limit'\n\n/**\n * 403, not 401.\n *\n * The caller's credential is fine — that is the whole problem. What is\n * refused is the ORIGIN it came from, and no re-authentication would change\n * the answer, so `401 Unauthorized` (which invites a retry with credentials)\n * would be a lie. Matches how the lockdown gate reasons about 423.\n */\nexport const CROSS_ORIGIN_REFUSED_STATUS = 403\n\n/** The opaque origin. Never same-origin with anything, including itself. */\nconst OPAQUE_ORIGIN = 'null'\n\n/** Host of an `Origin` header value, or `''` when it is absent/unparsable. */\nfunction originHost(origin: string | null | undefined): string {\n const raw = String(origin ?? '').trim()\n if (!raw || raw === OPAQUE_ORIGIN) return ''\n try {\n return new URL(raw).host.toLowerCase()\n } catch {\n return ''\n }\n}\n\n/**\n * The host this request was actually addressed to.\n *\n * `x-forwarded-host` first: behind Vercel that is the public hostname the\n * visitor typed, while `host` can be the internal one. Falls back to `host`\n * so the function is still correct off-platform (self-host, local dev), which\n * `deployment-shape` makes a supported case rather than a hypothetical.\n */\nfunction requestHost(headers: {\n get?: (name: string) => unknown\n}): string {\n const forwarded = String(headers?.get?.('x-forwarded-host') ?? '')\n .split(',')[0]\n ?.trim()\n const host = forwarded || String(headers?.get?.('host') ?? '').trim()\n return host.toLowerCase()\n}\n\nexport interface CrossOriginWriteOptions {\n /** Dispatcher path, e.g. `commerce/cart`. Decides visitor vs machine. */\n path: string\n /** Read for its method, `origin`, `x-forwarded-host` and `host`. */\n request: { method?: string; headers?: { get?: (name: string) => unknown } }\n}\n\n/**\n * Is this a state-changing plugin-API request from another origin?\n *\n * Exported separately from the refusal so the decision can be asserted\n * directly in tests and reused by the console dispatcher without either\n * inheriting a `Response` shape it may not want.\n */\nexport function isCrossOriginPluginWrite(\n options: CrossOriginWriteOptions,\n): boolean {\n if (lockdownIntentForMethod(options?.request?.method) === 'read') return false\n if (isMachinePluginApiPath(options?.path)) return false\n\n const headers = options?.request?.headers ?? {}\n\n /*\n * The browser's own statement about where this came from, trusted before\n * the Origin header because our own `no-referrer` policy blanks that one.\n * ALLOW-only: any other value falls through to the comparison below.\n */\n const site = String(headers?.get?.('sec-fetch-site') ?? '')\n .trim()\n .toLowerCase()\n if (site === 'same-origin' || site === 'none') return false\n\n const origin = headers?.get?.('origin')\n // Absent Origin: a non-browser caller. See the module note — this is the\n // deliberate allowance, not an oversight.\n if (origin === null || origin === undefined || String(origin).trim() === '') {\n return false\n }\n\n const from = originHost(String(origin))\n const to = requestHost(headers)\n // An unparsable or opaque Origin yields `''`, which can never equal a real\n // host, so it lands here as cross-origin — the intended outcome.\n if (!to) {\n // No host to compare against. Refusing every write on a malformed request\n // would be a worse failure than the one being prevented, and a request\n // with no Host reached no tenant site to begin with.\n return false\n }\n return from !== to\n}\n\n/**\n * The refusal a cross-origin plugin write returns, or null to proceed:\n *\n * const foreign = crossOriginPluginWriteRefusal({ path, request })\n * if (foreign) return foreign\n *\n * Same \"return it or carry on\" contract as `visitorWriteRefusal` and\n * `visitorWriteRateLimitRefusal`, so the dispatcher reads as one list of\n * gates rather than three shapes.\n *\n * The body names the reason. Unlike the rate limiter — which is deliberately\n * mute because it faces abusers and every detail is a hint — this refusal is\n * one a legitimate integrator can hit by calling from the wrong host, and a\n * bare 403 would cost them an afternoon. It discloses nothing an attacker did\n * not already know, having chosen the origin themselves.\n */\nexport function crossOriginPluginWriteRefusal(\n options: CrossOriginWriteOptions,\n): Response | null {\n if (!isCrossOriginPluginWrite(options)) return null\n return Response.json(\n { error: 'Cross-origin writes are not allowed.' },\n { status: CROSS_ORIGIN_REFUSED_STATUS },\n )\n}\n"],"names":["lockdownIntentForMethod","isMachinePluginApiPath","CROSS_ORIGIN_REFUSED_STATUS","OPAQUE_ORIGIN","originHost","origin","raw","String","trim","URL","host","toLowerCase","requestHost","headers","forwarded","get","split","isCrossOriginPluginWrite","options","request","method","path","site","undefined","from","to","crossOriginPluginWriteRefusal","Response","json","error","status"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4FC,GAED,SAASA,uBAAuB,QAAQ,gBAAY;AACpD,SAASC,sBAAsB,QAAQ,6BAAyB;AAEhE;;;;;;;CAOC,GACD,OAAO,MAAMC,8BAA8B,IAAG;AAE9C,0EAA0E,GAC1E,MAAMC,gBAAgB;AAEtB,4EAA4E,GAC5E,SAASC,WAAWC,MAAiC;IACnD,MAAMC,MAAMC,OAAOF,iBAAAA,SAAU,IAAIG,IAAI;IACrC,IAAI,CAACF,OAAOA,QAAQH,eAAe,OAAO;IAC1C,IAAI;QACF,OAAO,IAAIM,IAAIH,KAAKI,IAAI,CAACC,WAAW;IACtC,EAAE,eAAM;QACN,OAAO;IACT;AACF;AAEA;;;;;;;CAOC,GACD,SAASC,YAAYC,OAEpB;;QACmBN,gBAAOM,cAGQA;IAHjC,MAAMC,aAAYP,iBAAAA,eAAOM,4BAAAA,eAAAA,QAASE,GAAG,qBAAZF,kBAAAA,SAAe,sCAAuB,IAC5DG,KAAK,CAAC,IAAI,CAAC,EAAE,qBADET,eAEdC,IAAI;IACR,MAAME,OAAOI,aAAaP,gBAAOM,4BAAAA,gBAAAA,QAASE,GAAG,qBAAZF,mBAAAA,SAAe,2BAAW,IAAIL,IAAI;IACnE,OAAOE,KAAKC,WAAW;AACzB;AASA;;;;;;CAMC,GACD,OAAO,SAASM,yBACdC,OAAgC;;QAEJA,kBAGZA,mBAOIL,cAKLA;IAff,IAAIb,wBAAwBkB,4BAAAA,mBAAAA,QAASC,OAAO,qBAAhBD,iBAAkBE,MAAM,MAAM,QAAQ,OAAO;IACzE,IAAInB,uBAAuBiB,2BAAAA,QAASG,IAAI,GAAG,OAAO;IAElD,MAAMR,kBAAUK,4BAAAA,oBAAAA,QAASC,OAAO,qBAAhBD,kBAAkBL,OAAO,mBAAI,CAAC;IAE9C;;;;GAIC,GACD,MAAMS,OAAOf,gBAAOM,4BAAAA,eAAAA,QAASE,GAAG,qBAAZF,kBAAAA,SAAe,qCAAqB,IACrDL,IAAI,GACJG,WAAW;IACd,IAAIW,SAAS,iBAAiBA,SAAS,QAAQ,OAAO;IAEtD,MAAMjB,SAASQ,4BAAAA,gBAAAA,QAASE,GAAG,qBAAZF,mBAAAA,SAAe;IAC9B,yEAAyE;IACzE,0CAA0C;IAC1C,IAAIR,WAAW,QAAQA,WAAWkB,aAAahB,OAAOF,QAAQG,IAAI,OAAO,IAAI;QAC3E,OAAO;IACT;IAEA,MAAMgB,OAAOpB,WAAWG,OAAOF;IAC/B,MAAMoB,KAAKb,YAAYC;IACvB,2EAA2E;IAC3E,iEAAiE;IACjE,IAAI,CAACY,IAAI;QACP,0EAA0E;QAC1E,uEAAuE;QACvE,qDAAqD;QACrD,OAAO;IACT;IACA,OAAOD,SAASC;AAClB;AAEA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASC,8BACdR,OAAgC;IAEhC,IAAI,CAACD,yBAAyBC,UAAU,OAAO;IAC/C,OAAOS,SAASC,IAAI,CAClB;QAAEC,OAAO;IAAuC,GAChD;QAAEC,QAAQ5B;IAA4B;AAE1C"}
|
|
@@ -0,0 +1,192 @@
|
|
|
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
|
+
* Policy for the tenant plugin-API dispatcher's visitor-write rate limit
|
|
19
|
+
* (AGL-1770). Pure and dependency-free so it is unit-testable without a route
|
|
20
|
+
* harness — the durable half lives in `@aglyn/tenant-data-admin` beside
|
|
21
|
+
* `visitorWriteRefusal`, exactly like the lockdown split.
|
|
22
|
+
*
|
|
23
|
+
* ## What this bounds
|
|
24
|
+
*
|
|
25
|
+
* `apps/tenant/app/api/[...pluginApi]/route.ts` dispatches every plugin's
|
|
26
|
+
* visitor-facing handler and, before this, applied no rate limit of any kind.
|
|
27
|
+
* The gates it did have each refuse something narrower: per-site enablement is
|
|
28
|
+
* skipped by an unresolvable `hostId`, the release gate only checks that the
|
|
29
|
+
* plugin is on, and `visitorWriteRefusal` refuses only a paused or suspended
|
|
30
|
+
* site. None of them bounds volume from a working, enabled site — which is
|
|
31
|
+
* every live merchant.
|
|
32
|
+
*
|
|
33
|
+
* AGL-1769 closed the *shape* of the unauthenticated cart write (the caller
|
|
34
|
+
* chose the document path) and was explicit that it did not bound the
|
|
35
|
+
* *quantity*: "id control never multiplied volume; it bought shape". This is
|
|
36
|
+
* the other half. The cost of the unbounded half lands in the merchant's own
|
|
37
|
+
* Firestore — document count and storage on a tenant who did nothing wrong.
|
|
38
|
+
*/
|
|
39
|
+
/**
|
|
40
|
+
* 120 writes per minute per (site, client IP).
|
|
41
|
+
*
|
|
42
|
+
* Deliberately generous, and the reasoning matters more than the number: a
|
|
43
|
+
* limit that trips on genuine use is worse than no limit, because it gets
|
|
44
|
+
* raised until it means nothing. Measured against what the storefront actually
|
|
45
|
+
* emits:
|
|
46
|
+
*
|
|
47
|
+
* - `cart.tsx:214` puts the line-quantity `TextField`'s `onChange` straight
|
|
48
|
+
* onto a POST with no debounce, so *typing* `100` into a quantity box is
|
|
49
|
+
* three cart writes. Editing a few lines is a genuine ten-to-twenty-write
|
|
50
|
+
* burst in a couple of seconds.
|
|
51
|
+
* - `experiments/track` is an A/B beacon: one exposure write per experiment
|
|
52
|
+
* per page view, so a visitor clicking through pages at ~1/s with two live
|
|
53
|
+
* experiments sustains ~2 writes/s legitimately.
|
|
54
|
+
* - Every visitor write on a site shares ONE budget (see the key below), so
|
|
55
|
+
* these add rather than each getting their own headroom.
|
|
56
|
+
*
|
|
57
|
+
* What a tighter number would actually buy is small. At 120/min a single
|
|
58
|
+
* source can still mint ~172k documents a day against one site; at 30/min it
|
|
59
|
+
* is ~43k. Neither is "safe" in absolute terms — what the cap buys is turning
|
|
60
|
+
* a one-line flood script from *millions* per day into something that needs a
|
|
61
|
+
* distributed botnet to stay interesting, and turning an incident from
|
|
62
|
+
* instantaneous into detectable. That property is bought at 120 as well as at
|
|
63
|
+
* 30, and 30 would refuse real shoppers.
|
|
64
|
+
*
|
|
65
|
+
* 120/60s is also `DEFAULT_RATE_LIMIT` / `DEFAULT_RATE_WINDOW_MS` — the same
|
|
66
|
+
* pair the public REST API enforces — so this adds no bespoke number.
|
|
67
|
+
*/
|
|
68
|
+
export declare const VISITOR_WRITE_RATE_LIMIT = 120;
|
|
69
|
+
/**
|
|
70
|
+
* Fixed 60s window, matching every other limiter in the codebase rather than
|
|
71
|
+
* improving on it. A fixed window admits up to 2× the cap across a boundary;
|
|
72
|
+
* consistency with the shared bucket ids, the degradation markers and
|
|
73
|
+
* `/api/health/rate-limits` is worth more here than closing that.
|
|
74
|
+
*/
|
|
75
|
+
export declare const VISITOR_WRITE_RATE_WINDOW_MS = 60000;
|
|
76
|
+
/**
|
|
77
|
+
* Is this dispatcher path a credentialed machine surface (exempt), rather
|
|
78
|
+
* than a visitor one (limited)? Unknown paths are visitor by default.
|
|
79
|
+
*/
|
|
80
|
+
export declare function isMachinePluginApiPath(path: string): boolean;
|
|
81
|
+
/**
|
|
82
|
+
* The limiter key: one bucket per (site, client IP).
|
|
83
|
+
*
|
|
84
|
+
* ## Why compound, and why NOT a second limiter in either direction
|
|
85
|
+
*
|
|
86
|
+
* **Per-site alone is rejected.** A single attacker would consume the whole
|
|
87
|
+
* merchant's allowance and every real shopper would then be refused — an
|
|
88
|
+
* attacker-triggered denial of service against the victim, cheaper to mount
|
|
89
|
+
* than the flood it replaces and costing the merchant *sales* rather than
|
|
90
|
+
* storage. That is strictly worse than the growth it guards.
|
|
91
|
+
*
|
|
92
|
+
* **Per-IP alone is rejected.** Trivially distributed, and it would let one
|
|
93
|
+
* merchant's traffic spend another's budget.
|
|
94
|
+
*
|
|
95
|
+
* **Compound is what "per-host and per-IP together" should mean here.** Each
|
|
96
|
+
* source is bounded on each site, and no source can affect another's budget,
|
|
97
|
+
* so the ceiling a site is exposed to is (distinct source IPs) × 120/min —
|
|
98
|
+
* the same shape legitimate traffic has. What it does not stop is a genuine
|
|
99
|
+
* botnet, and that is stated rather than papered over: bounding *that* needs
|
|
100
|
+
* an edge WAF, not an application limiter, and every application-level scheme
|
|
101
|
+
* that would catch it (a site-wide ceiling) reintroduces the self-DoS above.
|
|
102
|
+
*
|
|
103
|
+
* **A second, platform-wide per-IP limiter was considered and dropped.** It
|
|
104
|
+
* would bound one source sweeping many merchants, but costs a second
|
|
105
|
+
* Firestore transaction on every storefront write — tripling the ops on a
|
|
106
|
+
* legitimate add-to-cart — to bound an attack that the compound key already
|
|
107
|
+
* prices at one full budget per merchant. One transaction per visitor write
|
|
108
|
+
* is the established cost here (`forms/submit`, `protection/unlock`); two
|
|
109
|
+
* would be novel and is not paid for by what it buys.
|
|
110
|
+
*
|
|
111
|
+
* The path is **not** in the key, on purpose: one shared budget per (site,
|
|
112
|
+
* IP) across cart, reviews, newsletter, bookings and beacons. Keying per path
|
|
113
|
+
* would let a caller multiply its allowance by cycling endpoints, which is
|
|
114
|
+
* free to do and defeats the point.
|
|
115
|
+
*
|
|
116
|
+
* `hostId` is frequently `''` — the dispatcher only resolves one from the
|
|
117
|
+
* query or a JSON body, and a handler that self-gates may supply none. It is
|
|
118
|
+
* kept in the key rather than skipped: AGL-1769 named "an unresolvable
|
|
119
|
+
* `hostId` skips the gate" as an existing hole, and a limiter that a caller
|
|
120
|
+
* turns off by declining to name a site is not a limiter. Host-less writes
|
|
121
|
+
* simply share one bucket per IP.
|
|
122
|
+
*/
|
|
123
|
+
export declare function visitorWriteRateLimitKey(hostId: string, ip: string): string;
|
|
124
|
+
/**
|
|
125
|
+
* Policy for the CONSOLE plugin-API dispatcher's write rate limit.
|
|
126
|
+
*
|
|
127
|
+
* `apps/console/app/api/[...pluginApi]/route.ts` dispatches every plugin's
|
|
128
|
+
* console-facing handler — the marketplace installs and publishes, `ai/assist`,
|
|
129
|
+
* gift cards, POS orders, refunds, the email list previews and the suppression
|
|
130
|
+
* writes — and it carries no limiter of any kind. Its gates each refuse
|
|
131
|
+
* something narrower: per-site enablement needs a resolvable `hostId`, the
|
|
132
|
+
* release flag only asks whether the plugin is on, and lockdown only refuses
|
|
133
|
+
* during an incident. None of them bounds volume from an ordinary signed-in
|
|
134
|
+
* operator, which is every request the surface serves.
|
|
135
|
+
*
|
|
136
|
+
* The exposure is not the same one the visitor limiter closes. These handlers
|
|
137
|
+
* are authenticated, so nobody is minting documents anonymously; what they do
|
|
138
|
+
* instead is spend REAL money per call — a contact scan with a read budget, a
|
|
139
|
+
* bundle download and verify, a model call to a paid vendor — on a surface
|
|
140
|
+
* where a stuck retry loop in one console tab is indistinguishable from abuse.
|
|
141
|
+
*/
|
|
142
|
+
/**
|
|
143
|
+
* 120 requests per minute per console subject.
|
|
144
|
+
*
|
|
145
|
+
* `DEFAULT_RATE_LIMIT` / `DEFAULT_RATE_WINDOW_MS` again, and the same pair the
|
|
146
|
+
* visitor limiter and the public REST API use, so this introduces no bespoke
|
|
147
|
+
* number to reason about. It is far above a person pressing buttons: the
|
|
148
|
+
* costly routes on this surface are one-per-click, and the console's own
|
|
149
|
+
* page-load traffic reaches Firestore through the client SDK rather than
|
|
150
|
+
* through this dispatcher.
|
|
151
|
+
*
|
|
152
|
+
* Deliberately not tighter even though each call here costs more than a cart
|
|
153
|
+
* write. A limit that trips on genuine use gets raised until it means nothing,
|
|
154
|
+
* and the per-call cost is the wrong lever for that anyway — an entitlement or
|
|
155
|
+
* a quota bounds spend per org over a month, where this bounds a runaway loop
|
|
156
|
+
* over a minute. Two different jobs; this one only has to make the loop stop.
|
|
157
|
+
*/
|
|
158
|
+
export declare const CONSOLE_API_RATE_LIMIT = 120;
|
|
159
|
+
/** Fixed 60s window, matching every other limiter in the codebase. */
|
|
160
|
+
export declare const CONSOLE_API_RATE_WINDOW_MS = 60000;
|
|
161
|
+
/**
|
|
162
|
+
* The limiter key: one bucket per authenticated subject.
|
|
163
|
+
*
|
|
164
|
+
* ## Why this is NOT the visitor key
|
|
165
|
+
*
|
|
166
|
+
* `visitorWriteRateLimitKey` is compound because its surface is
|
|
167
|
+
* unauthenticated, and both halves of that argument are answers to anonymity.
|
|
168
|
+
* Per-site alone was rejected there because one attacker would spend a whole
|
|
169
|
+
* merchant's allowance and refuse real shoppers — an attacker-triggered denial
|
|
170
|
+
* of service against the victim. On the console the subject is a verified
|
|
171
|
+
* `uid`, so a caller can only ever refuse ITSELF: the self-DoS the compound key
|
|
172
|
+
* exists to prevent cannot be aimed at anyone else, and the isolation it buys
|
|
173
|
+
* is already bought by the identity.
|
|
174
|
+
*
|
|
175
|
+
* `hostId` is therefore left OUT rather than added, which is the opposite of
|
|
176
|
+
* the visitor key and for the reason the visitor key leaves the PATH out: an
|
|
177
|
+
* operator with fifty sites would otherwise hold fifty budgets and could
|
|
178
|
+
* multiply its allowance by cycling a field it controls. One person is one
|
|
179
|
+
* budget across every site they can reach.
|
|
180
|
+
*
|
|
181
|
+
* ## The unauthenticated fallback
|
|
182
|
+
*
|
|
183
|
+
* A caller whose bearer token did not decode — a plugin key, a POS device, an
|
|
184
|
+
* anonymous probe — has no `uid`, and its client address stands in. That
|
|
185
|
+
* bucket is shared by every such caller behind one address, which is the
|
|
186
|
+
* conservative direction: an unidentified caller on an authenticated surface
|
|
187
|
+
* should not get a private allowance for declining to identify itself. Keeping
|
|
188
|
+
* it counted at all is the point. A limiter a caller switches off by sending
|
|
189
|
+
* no credential is not a limiter, and this surface's whole exposure is what
|
|
190
|
+
* runs BEFORE a handler decides who is asking.
|
|
191
|
+
*/
|
|
192
|
+
export declare function consoleApiRateLimitKey(subject: string): string;
|