@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,155 @@
|
|
|
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
|
+
* Which origins may complete a signed direct-to-GCS upload (AGL-1452).
|
|
19
|
+
*
|
|
20
|
+
* ## The fact this module exists for
|
|
21
|
+
*
|
|
22
|
+
* **GCS matches the CORS `origin` list as an exact string.** There is no
|
|
23
|
+
* subtree form and no wildcard form short of `*`. Measured against the live
|
|
24
|
+
* bucket on 2026-08-20 by driving real preflights: `https://app.aglyn.com`
|
|
25
|
+
* answers with `Access-Control-Allow-Origin`, while `https://console.aglyn.com`,
|
|
26
|
+
* `https://app.aglyn.io`, `https://zgover.aglyn.com`, `http://app.aglyn.com`
|
|
27
|
+
* and `https://app.aglyn.com.evil.example` all answer 200 with **no CORS
|
|
28
|
+
* headers at all** — which is how the browser refuses the `PUT`.
|
|
29
|
+
*
|
|
30
|
+
* This is the OPPOSITE of the App Check reCAPTCHA allowlist, which matches a
|
|
31
|
+
* listed name and everything beneath it. Both are "allowed domains for the
|
|
32
|
+
* platform", so reasoning across from one to the other is the natural move and
|
|
33
|
+
* gives exactly the wrong answer.
|
|
34
|
+
*
|
|
35
|
+
* ## Why it bites, and only sometimes
|
|
36
|
+
*
|
|
37
|
+
* The signed direct-to-GCS path carries video, PDF and ZIP above
|
|
38
|
+
* `SIGNED_UPLOAD_MAX_BYTES`; ordinary images take the base64 route and are
|
|
39
|
+
* unaffected. So a missing origin fails **only on large files**, behind a
|
|
40
|
+
* generic "try again" snackbar with no diagnosable cause — the same silence
|
|
41
|
+
* that let AGL-1408 ship with no CORS rule at all.
|
|
42
|
+
*
|
|
43
|
+
* A console origin appears whenever a name is attached to the project WITHOUT
|
|
44
|
+
* a redirect. Attached WITH one, the browser never holds that origin — it is
|
|
45
|
+
* already at the redirect target when it uploads — which is why
|
|
46
|
+
* `console.aglyn.com` needs no entry and `zgover.aglyn.com` does.
|
|
47
|
+
*
|
|
48
|
+
* ## Why `*` is not on the table
|
|
49
|
+
*
|
|
50
|
+
* The signed URL carries the authorization. A wildcard would let any site on
|
|
51
|
+
* the internet spend one that leaks. {@link permitsUploadOrigin} still reports
|
|
52
|
+
* a wildcard as permitting, because its job is to describe the bucket
|
|
53
|
+
* truthfully — a check that called `*` "missing" would report a failure while
|
|
54
|
+
* the uploads it watches were in fact wide open. {@link mergeUploadOrigins} is
|
|
55
|
+
* where we refuse to ever write one.
|
|
56
|
+
*
|
|
57
|
+
* ## Why a MERGE
|
|
58
|
+
*
|
|
59
|
+
* `gcloud storage buckets update --cors-file` **replaces** the configuration
|
|
60
|
+
* rather than merging it. Automation that builds a fresh document from the
|
|
61
|
+
* origins it happens to know about silently drops every other customer's
|
|
62
|
+
* origin, and the symptom lands on them, days later, as a failed large upload
|
|
63
|
+
* nobody can attribute. Everything here is read-modify-write.
|
|
64
|
+
*/
|
|
65
|
+
export interface CorsRule {
|
|
66
|
+
origin?: string[];
|
|
67
|
+
method?: string[];
|
|
68
|
+
responseHeader?: string[];
|
|
69
|
+
maxAgeSeconds?: number;
|
|
70
|
+
}
|
|
71
|
+
/** The method the DAM uploader issues. Parsed out of it by `storage-cors.spec.ts`. */
|
|
72
|
+
export declare const UPLOAD_CORS_METHOD = "PUT";
|
|
73
|
+
/** The headers that `PUT` sets, which the preflight answers from. */
|
|
74
|
+
export declare const UPLOAD_CORS_RESPONSE_HEADERS: string[];
|
|
75
|
+
/** One hour, matching `cloud/storage-cors.json`. */
|
|
76
|
+
export declare const UPLOAD_CORS_MAX_AGE_SECONDS = 3600;
|
|
77
|
+
/**
|
|
78
|
+
* The origin a browser on `host` will actually put in the `Origin` header.
|
|
79
|
+
*
|
|
80
|
+
* Accepts a bare hostname or a URL, because callers hold both shapes: a
|
|
81
|
+
* console-domain claim stores a hostname and `NEXT_PUBLIC_CONSOLE_URL` carries
|
|
82
|
+
* a scheme. Null for anything that is not a hostname — including `*`, which is
|
|
83
|
+
* never a thing this function will hand onward.
|
|
84
|
+
*/
|
|
85
|
+
export declare function uploadOriginFor(host: string): string | null;
|
|
86
|
+
/**
|
|
87
|
+
* Would this bucket configuration let a browser at `origin` complete the
|
|
88
|
+
* signed `PUT`?
|
|
89
|
+
*
|
|
90
|
+
* Exact comparison, deliberately: matching loosely here would make this agree
|
|
91
|
+
* with the intuition and disagree with GCS, which is the whole failure being
|
|
92
|
+
* guarded against.
|
|
93
|
+
*/
|
|
94
|
+
export declare function permitsUploadOrigin(rules: CorsRule[] | null | undefined, origin: string): boolean;
|
|
95
|
+
/**
|
|
96
|
+
* The origins this configuration would refuse, in the order asked.
|
|
97
|
+
*
|
|
98
|
+
* A null configuration — the read failed, the bucket is unreachable — covers
|
|
99
|
+
* NOTHING. Reporting calm because we could not look is the shape of alarm that
|
|
100
|
+
* has already cost this repo three outages.
|
|
101
|
+
*/
|
|
102
|
+
export declare function missingUploadOrigins(rules: CorsRule[] | null | undefined, origins: string[]): string[];
|
|
103
|
+
/**
|
|
104
|
+
* The configuration to WRITE so `origins` can upload, preserving everything
|
|
105
|
+
* already permitted.
|
|
106
|
+
*
|
|
107
|
+
* Adds to the existing upload rule where there is one, so the policy does not
|
|
108
|
+
* grow a rule per customer. Throws on a wildcard rather than returning an
|
|
109
|
+
* error, because there is no caller for whom emitting one is the right
|
|
110
|
+
* outcome and a returned error is a thing a caller can ignore.
|
|
111
|
+
*/
|
|
112
|
+
export declare function mergeUploadOrigins(rules: CorsRule[], origins: string[]): {
|
|
113
|
+
rules: CorsRule[];
|
|
114
|
+
added: string[];
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* The configuration to WRITE so `origins` are no longer permitted, keeping
|
|
118
|
+
* everything else (AGL-1452).
|
|
119
|
+
*
|
|
120
|
+
* ## Why a detach has to do this
|
|
121
|
+
*
|
|
122
|
+
* An origin outlives the name unless something removes it. For an
|
|
123
|
+
* `*.aglyn.com` subdomain that is untidy. For a **white-label console domain**
|
|
124
|
+
* it is a standing permission on a bucket that accepts signed writes, granted
|
|
125
|
+
* to a host the customer keeps and we no longer serve — and the signed URL
|
|
126
|
+
* carries its own authorization, so that host can spend one that leaks. A
|
|
127
|
+
* stale CORS origin is therefore worse than a stale reCAPTCHA entry, not
|
|
128
|
+
* merely equivalent to one.
|
|
129
|
+
*
|
|
130
|
+
* ## `keep` is not optional in practice
|
|
131
|
+
*
|
|
132
|
+
* The platform origin is configured, not provisioned. Removing it would break
|
|
133
|
+
* large uploads for every customer at once — the platform-wide outage the
|
|
134
|
+
* read-modify-write warning is about, reached from the other direction. Every
|
|
135
|
+
* caller passes it.
|
|
136
|
+
*
|
|
137
|
+
* A rule left with no origins is DROPPED rather than written as `origin: []`.
|
|
138
|
+
* GCS accepts the empty form, and it reads to the next person like a rule that
|
|
139
|
+
* permits something.
|
|
140
|
+
*/
|
|
141
|
+
export declare function revokeUploadOrigins(rules: CorsRule[], origins: string[], { keep }?: {
|
|
142
|
+
keep?: string[];
|
|
143
|
+
}): {
|
|
144
|
+
rules: CorsRule[];
|
|
145
|
+
removed: string[];
|
|
146
|
+
refused: string[];
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* What a human must run when the automation could not.
|
|
150
|
+
*
|
|
151
|
+
* Carries the warning as well as the command: the obvious one-liner is the
|
|
152
|
+
* destructive one, and an instruction that omits that is how the read-modify-
|
|
153
|
+
* write rule gets skipped by the person following it in a hurry.
|
|
154
|
+
*/
|
|
155
|
+
export declare function uploadCorsRemedy(bucket: string, missing: string[]): string;
|
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /**
|
|
17
|
+
* Which origins may complete a signed direct-to-GCS upload (AGL-1452).
|
|
18
|
+
*
|
|
19
|
+
* ## The fact this module exists for
|
|
20
|
+
*
|
|
21
|
+
* **GCS matches the CORS `origin` list as an exact string.** There is no
|
|
22
|
+
* subtree form and no wildcard form short of `*`. Measured against the live
|
|
23
|
+
* bucket on 2026-08-20 by driving real preflights: `https://app.aglyn.com`
|
|
24
|
+
* answers with `Access-Control-Allow-Origin`, while `https://console.aglyn.com`,
|
|
25
|
+
* `https://app.aglyn.io`, `https://zgover.aglyn.com`, `http://app.aglyn.com`
|
|
26
|
+
* and `https://app.aglyn.com.evil.example` all answer 200 with **no CORS
|
|
27
|
+
* headers at all** — which is how the browser refuses the `PUT`.
|
|
28
|
+
*
|
|
29
|
+
* This is the OPPOSITE of the App Check reCAPTCHA allowlist, which matches a
|
|
30
|
+
* listed name and everything beneath it. Both are "allowed domains for the
|
|
31
|
+
* platform", so reasoning across from one to the other is the natural move and
|
|
32
|
+
* gives exactly the wrong answer.
|
|
33
|
+
*
|
|
34
|
+
* ## Why it bites, and only sometimes
|
|
35
|
+
*
|
|
36
|
+
* The signed direct-to-GCS path carries video, PDF and ZIP above
|
|
37
|
+
* `SIGNED_UPLOAD_MAX_BYTES`; ordinary images take the base64 route and are
|
|
38
|
+
* unaffected. So a missing origin fails **only on large files**, behind a
|
|
39
|
+
* generic "try again" snackbar with no diagnosable cause — the same silence
|
|
40
|
+
* that let AGL-1408 ship with no CORS rule at all.
|
|
41
|
+
*
|
|
42
|
+
* A console origin appears whenever a name is attached to the project WITHOUT
|
|
43
|
+
* a redirect. Attached WITH one, the browser never holds that origin — it is
|
|
44
|
+
* already at the redirect target when it uploads — which is why
|
|
45
|
+
* `console.aglyn.com` needs no entry and `zgover.aglyn.com` does.
|
|
46
|
+
*
|
|
47
|
+
* ## Why `*` is not on the table
|
|
48
|
+
*
|
|
49
|
+
* The signed URL carries the authorization. A wildcard would let any site on
|
|
50
|
+
* the internet spend one that leaks. {@link permitsUploadOrigin} still reports
|
|
51
|
+
* a wildcard as permitting, because its job is to describe the bucket
|
|
52
|
+
* truthfully — a check that called `*` "missing" would report a failure while
|
|
53
|
+
* the uploads it watches were in fact wide open. {@link mergeUploadOrigins} is
|
|
54
|
+
* where we refuse to ever write one.
|
|
55
|
+
*
|
|
56
|
+
* ## Why a MERGE
|
|
57
|
+
*
|
|
58
|
+
* `gcloud storage buckets update --cors-file` **replaces** the configuration
|
|
59
|
+
* rather than merging it. Automation that builds a fresh document from the
|
|
60
|
+
* origins it happens to know about silently drops every other customer's
|
|
61
|
+
* origin, and the symptom lands on them, days later, as a failed large upload
|
|
62
|
+
* nobody can attribute. Everything here is read-modify-write.
|
|
63
|
+
*/ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
64
|
+
/** The method the DAM uploader issues. Parsed out of it by `storage-cors.spec.ts`. */ export const UPLOAD_CORS_METHOD = 'PUT';
|
|
65
|
+
/** The headers that `PUT` sets, which the preflight answers from. */ export const UPLOAD_CORS_RESPONSE_HEADERS = [
|
|
66
|
+
'Content-Type',
|
|
67
|
+
'x-goog-resumable'
|
|
68
|
+
];
|
|
69
|
+
/** One hour, matching `cloud/storage-cors.json`. */ export const UPLOAD_CORS_MAX_AGE_SECONDS = 3600;
|
|
70
|
+
const HOSTNAME = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/;
|
|
71
|
+
/**
|
|
72
|
+
* The origin a browser on `host` will actually put in the `Origin` header.
|
|
73
|
+
*
|
|
74
|
+
* Accepts a bare hostname or a URL, because callers hold both shapes: a
|
|
75
|
+
* console-domain claim stores a hostname and `NEXT_PUBLIC_CONSOLE_URL` carries
|
|
76
|
+
* a scheme. Null for anything that is not a hostname — including `*`, which is
|
|
77
|
+
* never a thing this function will hand onward.
|
|
78
|
+
*/ export function uploadOriginFor(host) {
|
|
79
|
+
const raw = String(host != null ? host : '').trim().toLowerCase();
|
|
80
|
+
if (!raw) return null;
|
|
81
|
+
const bare = raw.replace(/^[a-z][a-z0-9+.-]*:\/\//, '').split(/[/?#]/)[0].replace(/\.$/, '');
|
|
82
|
+
return HOSTNAME.test(bare) ? `https://${bare}` : null;
|
|
83
|
+
}
|
|
84
|
+
function uploadRules(rules) {
|
|
85
|
+
return rules.filter((rule)=>{
|
|
86
|
+
var _rule_method;
|
|
87
|
+
return ((_rule_method = rule.method) != null ? _rule_method : []).some((method)=>method.toUpperCase() === UPLOAD_CORS_METHOD);
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Would this bucket configuration let a browser at `origin` complete the
|
|
92
|
+
* signed `PUT`?
|
|
93
|
+
*
|
|
94
|
+
* Exact comparison, deliberately: matching loosely here would make this agree
|
|
95
|
+
* with the intuition and disagree with GCS, which is the whole failure being
|
|
96
|
+
* guarded against.
|
|
97
|
+
*/ export function permitsUploadOrigin(rules, origin) {
|
|
98
|
+
if (!rules) return false;
|
|
99
|
+
return uploadRules(rules).some((rule)=>{
|
|
100
|
+
var _rule_origin;
|
|
101
|
+
return ((_rule_origin = rule.origin) != null ? _rule_origin : []).some((listed)=>listed === '*' || listed === origin);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The origins this configuration would refuse, in the order asked.
|
|
106
|
+
*
|
|
107
|
+
* A null configuration — the read failed, the bucket is unreachable — covers
|
|
108
|
+
* NOTHING. Reporting calm because we could not look is the shape of alarm that
|
|
109
|
+
* has already cost this repo three outages.
|
|
110
|
+
*/ export function missingUploadOrigins(rules, origins) {
|
|
111
|
+
return origins.filter((origin)=>!permitsUploadOrigin(rules, origin));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* The configuration to WRITE so `origins` can upload, preserving everything
|
|
115
|
+
* already permitted.
|
|
116
|
+
*
|
|
117
|
+
* Adds to the existing upload rule where there is one, so the policy does not
|
|
118
|
+
* grow a rule per customer. Throws on a wildcard rather than returning an
|
|
119
|
+
* error, because there is no caller for whom emitting one is the right
|
|
120
|
+
* outcome and a returned error is a thing a caller can ignore.
|
|
121
|
+
*/ export function mergeUploadOrigins(rules, origins) {
|
|
122
|
+
if (origins.some((origin)=>String(origin).includes('*'))) {
|
|
123
|
+
throw new Error('refusing to write a wildcard CORS origin: the signed URL carries the ' + 'authorization, so `*` lets any site spend one that leaks (AGL-1452)');
|
|
124
|
+
}
|
|
125
|
+
const wanted = [
|
|
126
|
+
...new Set(origins)
|
|
127
|
+
];
|
|
128
|
+
const missing = missingUploadOrigins(rules, wanted);
|
|
129
|
+
if (missing.length === 0) return {
|
|
130
|
+
rules,
|
|
131
|
+
added: []
|
|
132
|
+
};
|
|
133
|
+
const target = rules.findIndex((rule)=>uploadRules([
|
|
134
|
+
rule
|
|
135
|
+
]).length === 1);
|
|
136
|
+
if (target < 0) {
|
|
137
|
+
return {
|
|
138
|
+
rules: [
|
|
139
|
+
...rules,
|
|
140
|
+
{
|
|
141
|
+
origin: missing,
|
|
142
|
+
method: [
|
|
143
|
+
UPLOAD_CORS_METHOD
|
|
144
|
+
],
|
|
145
|
+
responseHeader: [
|
|
146
|
+
...UPLOAD_CORS_RESPONSE_HEADERS
|
|
147
|
+
],
|
|
148
|
+
maxAgeSeconds: UPLOAD_CORS_MAX_AGE_SECONDS
|
|
149
|
+
}
|
|
150
|
+
],
|
|
151
|
+
added: missing
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
const next = rules.map((rule, index)=>{
|
|
155
|
+
var _rule_origin;
|
|
156
|
+
return index === target ? _extends({}, rule, {
|
|
157
|
+
origin: [
|
|
158
|
+
...new Set([
|
|
159
|
+
...(_rule_origin = rule.origin) != null ? _rule_origin : [],
|
|
160
|
+
...missing
|
|
161
|
+
])
|
|
162
|
+
]
|
|
163
|
+
}) : rule;
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
rules: next,
|
|
167
|
+
added: missing
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* The configuration to WRITE so `origins` are no longer permitted, keeping
|
|
172
|
+
* everything else (AGL-1452).
|
|
173
|
+
*
|
|
174
|
+
* ## Why a detach has to do this
|
|
175
|
+
*
|
|
176
|
+
* An origin outlives the name unless something removes it. For an
|
|
177
|
+
* `*.aglyn.com` subdomain that is untidy. For a **white-label console domain**
|
|
178
|
+
* it is a standing permission on a bucket that accepts signed writes, granted
|
|
179
|
+
* to a host the customer keeps and we no longer serve — and the signed URL
|
|
180
|
+
* carries its own authorization, so that host can spend one that leaks. A
|
|
181
|
+
* stale CORS origin is therefore worse than a stale reCAPTCHA entry, not
|
|
182
|
+
* merely equivalent to one.
|
|
183
|
+
*
|
|
184
|
+
* ## `keep` is not optional in practice
|
|
185
|
+
*
|
|
186
|
+
* The platform origin is configured, not provisioned. Removing it would break
|
|
187
|
+
* large uploads for every customer at once — the platform-wide outage the
|
|
188
|
+
* read-modify-write warning is about, reached from the other direction. Every
|
|
189
|
+
* caller passes it.
|
|
190
|
+
*
|
|
191
|
+
* A rule left with no origins is DROPPED rather than written as `origin: []`.
|
|
192
|
+
* GCS accepts the empty form, and it reads to the next person like a rule that
|
|
193
|
+
* permits something.
|
|
194
|
+
*/ export function revokeUploadOrigins(rules, origins, { keep = [] } = {}) {
|
|
195
|
+
const protectedSet = new Set(keep);
|
|
196
|
+
const asked = [
|
|
197
|
+
...new Set(origins.map((origin)=>String(origin)))
|
|
198
|
+
];
|
|
199
|
+
const refused = asked.filter((origin)=>origin === '*' || protectedSet.has(origin));
|
|
200
|
+
const doomed = new Set(asked.filter((origin)=>!refused.includes(origin)));
|
|
201
|
+
if (doomed.size === 0) return {
|
|
202
|
+
rules,
|
|
203
|
+
removed: [],
|
|
204
|
+
refused
|
|
205
|
+
};
|
|
206
|
+
const removed = [];
|
|
207
|
+
const next = [];
|
|
208
|
+
for (const rule of rules){
|
|
209
|
+
var _rule_origin;
|
|
210
|
+
if (uploadRules([
|
|
211
|
+
rule
|
|
212
|
+
]).length !== 1) {
|
|
213
|
+
next.push(rule);
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
const kept = ((_rule_origin = rule.origin) != null ? _rule_origin : []).filter((origin)=>{
|
|
217
|
+
if (!doomed.has(String(origin))) return true;
|
|
218
|
+
removed.push(String(origin));
|
|
219
|
+
return false;
|
|
220
|
+
});
|
|
221
|
+
if (kept.length > 0) next.push(_extends({}, rule, {
|
|
222
|
+
origin: kept
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
return {
|
|
226
|
+
rules: next,
|
|
227
|
+
removed,
|
|
228
|
+
refused
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* What a human must run when the automation could not.
|
|
233
|
+
*
|
|
234
|
+
* Carries the warning as well as the command: the obvious one-liner is the
|
|
235
|
+
* destructive one, and an instruction that omits that is how the read-modify-
|
|
236
|
+
* write rule gets skipped by the person following it in a hurry.
|
|
237
|
+
*/ export function uploadCorsRemedy(bucket, missing) {
|
|
238
|
+
return [
|
|
239
|
+
`Large (resumable) uploads from ${missing.join(', ')} will fail until`,
|
|
240
|
+
`gs://${bucket} permits ${missing.length === 1 ? 'that origin' : 'those origins'}.`,
|
|
241
|
+
'GCS matches the CORS origin list EXACTLY — there is no subtree form, so',
|
|
242
|
+
'each origin needs its own entry.',
|
|
243
|
+
'',
|
|
244
|
+
' gcloud storage buckets describe gs://' + bucket + ' --format=json\\(cors_config\\) > cors.json',
|
|
245
|
+
' # edit cors.json: ADD the origins above to the rule whose method is PUT',
|
|
246
|
+
` gcloud storage buckets update gs://${bucket} --cors-file=cors.json`,
|
|
247
|
+
'',
|
|
248
|
+
'⚠️ --cors-file REPLACES the configuration rather than merging it. Read the',
|
|
249
|
+
'live document, add to it, write it back — building a fresh one drops every',
|
|
250
|
+
'other origin, and that failure lands on someone else, days later.'
|
|
251
|
+
].join('\n');
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
//# sourceMappingURL=upload-cors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/upload-cors.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Which origins may complete a signed direct-to-GCS upload (AGL-1452).\n *\n * ## The fact this module exists for\n *\n * **GCS matches the CORS `origin` list as an exact string.** There is no\n * subtree form and no wildcard form short of `*`. Measured against the live\n * bucket on 2026-08-20 by driving real preflights: `https://app.aglyn.com`\n * answers with `Access-Control-Allow-Origin`, while `https://console.aglyn.com`,\n * `https://app.aglyn.io`, `https://zgover.aglyn.com`, `http://app.aglyn.com`\n * and `https://app.aglyn.com.evil.example` all answer 200 with **no CORS\n * headers at all** — which is how the browser refuses the `PUT`.\n *\n * This is the OPPOSITE of the App Check reCAPTCHA allowlist, which matches a\n * listed name and everything beneath it. Both are \"allowed domains for the\n * platform\", so reasoning across from one to the other is the natural move and\n * gives exactly the wrong answer.\n *\n * ## Why it bites, and only sometimes\n *\n * The signed direct-to-GCS path carries video, PDF and ZIP above\n * `SIGNED_UPLOAD_MAX_BYTES`; ordinary images take the base64 route and are\n * unaffected. So a missing origin fails **only on large files**, behind a\n * generic \"try again\" snackbar with no diagnosable cause — the same silence\n * that let AGL-1408 ship with no CORS rule at all.\n *\n * A console origin appears whenever a name is attached to the project WITHOUT\n * a redirect. Attached WITH one, the browser never holds that origin — it is\n * already at the redirect target when it uploads — which is why\n * `console.aglyn.com` needs no entry and `zgover.aglyn.com` does.\n *\n * ## Why `*` is not on the table\n *\n * The signed URL carries the authorization. A wildcard would let any site on\n * the internet spend one that leaks. {@link permitsUploadOrigin} still reports\n * a wildcard as permitting, because its job is to describe the bucket\n * truthfully — a check that called `*` \"missing\" would report a failure while\n * the uploads it watches were in fact wide open. {@link mergeUploadOrigins} is\n * where we refuse to ever write one.\n *\n * ## Why a MERGE\n *\n * `gcloud storage buckets update --cors-file` **replaces** the configuration\n * rather than merging it. Automation that builds a fresh document from the\n * origins it happens to know about silently drops every other customer's\n * origin, and the symptom lands on them, days later, as a failed large upload\n * nobody can attribute. Everything here is read-modify-write.\n */\n\nexport interface CorsRule {\n origin?: string[]\n method?: string[]\n responseHeader?: string[]\n maxAgeSeconds?: number\n}\n\n/** The method the DAM uploader issues. Parsed out of it by `storage-cors.spec.ts`. */\nexport const UPLOAD_CORS_METHOD = 'PUT'\n\n/** The headers that `PUT` sets, which the preflight answers from. */\nexport const UPLOAD_CORS_RESPONSE_HEADERS = ['Content-Type', 'x-goog-resumable']\n\n/** One hour, matching `cloud/storage-cors.json`. */\nexport const UPLOAD_CORS_MAX_AGE_SECONDS = 3600\n\nconst HOSTNAME = /^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)+$/\n\n/**\n * The origin a browser on `host` will actually put in the `Origin` header.\n *\n * Accepts a bare hostname or a URL, because callers hold both shapes: a\n * console-domain claim stores a hostname and `NEXT_PUBLIC_CONSOLE_URL` carries\n * a scheme. Null for anything that is not a hostname — including `*`, which is\n * never a thing this function will hand onward.\n */\nexport function uploadOriginFor(host: string): string | null {\n const raw = String(host ?? '').trim().toLowerCase()\n if (!raw) return null\n const bare = raw\n .replace(/^[a-z][a-z0-9+.-]*:\\/\\//, '')\n .split(/[/?#]/)[0]\n .replace(/\\.$/, '')\n return HOSTNAME.test(bare) ? `https://${bare}` : null\n}\n\nfunction uploadRules(rules: CorsRule[]): CorsRule[] {\n return rules.filter((rule) =>\n (rule.method ?? []).some(\n (method) => method.toUpperCase() === UPLOAD_CORS_METHOD,\n ),\n )\n}\n\n/**\n * Would this bucket configuration let a browser at `origin` complete the\n * signed `PUT`?\n *\n * Exact comparison, deliberately: matching loosely here would make this agree\n * with the intuition and disagree with GCS, which is the whole failure being\n * guarded against.\n */\nexport function permitsUploadOrigin(\n rules: CorsRule[] | null | undefined,\n origin: string,\n): boolean {\n if (!rules) return false\n return uploadRules(rules).some((rule) =>\n (rule.origin ?? []).some((listed) => listed === '*' || listed === origin),\n )\n}\n\n/**\n * The origins this configuration would refuse, in the order asked.\n *\n * A null configuration — the read failed, the bucket is unreachable — covers\n * NOTHING. Reporting calm because we could not look is the shape of alarm that\n * has already cost this repo three outages.\n */\nexport function missingUploadOrigins(\n rules: CorsRule[] | null | undefined,\n origins: string[],\n): string[] {\n return origins.filter((origin) => !permitsUploadOrigin(rules, origin))\n}\n\n/**\n * The configuration to WRITE so `origins` can upload, preserving everything\n * already permitted.\n *\n * Adds to the existing upload rule where there is one, so the policy does not\n * grow a rule per customer. Throws on a wildcard rather than returning an\n * error, because there is no caller for whom emitting one is the right\n * outcome and a returned error is a thing a caller can ignore.\n */\nexport function mergeUploadOrigins(\n rules: CorsRule[],\n origins: string[],\n): { rules: CorsRule[]; added: string[] } {\n if (origins.some((origin) => String(origin).includes('*'))) {\n throw new Error(\n 'refusing to write a wildcard CORS origin: the signed URL carries the ' +\n 'authorization, so `*` lets any site spend one that leaks (AGL-1452)',\n )\n }\n const wanted = [...new Set(origins)]\n const missing = missingUploadOrigins(rules, wanted)\n if (missing.length === 0) return { rules, added: [] }\n\n const target = rules.findIndex((rule) => uploadRules([rule]).length === 1)\n if (target < 0) {\n return {\n rules: [\n ...rules,\n {\n origin: missing,\n method: [UPLOAD_CORS_METHOD],\n responseHeader: [...UPLOAD_CORS_RESPONSE_HEADERS],\n maxAgeSeconds: UPLOAD_CORS_MAX_AGE_SECONDS,\n },\n ],\n added: missing,\n }\n }\n const next = rules.map((rule, index) =>\n index === target\n ? { ...rule, origin: [...new Set([...(rule.origin ?? []), ...missing])] }\n : rule,\n )\n return { rules: next, added: missing }\n}\n\n/**\n * The configuration to WRITE so `origins` are no longer permitted, keeping\n * everything else (AGL-1452).\n *\n * ## Why a detach has to do this\n *\n * An origin outlives the name unless something removes it. For an\n * `*.aglyn.com` subdomain that is untidy. For a **white-label console domain**\n * it is a standing permission on a bucket that accepts signed writes, granted\n * to a host the customer keeps and we no longer serve — and the signed URL\n * carries its own authorization, so that host can spend one that leaks. A\n * stale CORS origin is therefore worse than a stale reCAPTCHA entry, not\n * merely equivalent to one.\n *\n * ## `keep` is not optional in practice\n *\n * The platform origin is configured, not provisioned. Removing it would break\n * large uploads for every customer at once — the platform-wide outage the\n * read-modify-write warning is about, reached from the other direction. Every\n * caller passes it.\n *\n * A rule left with no origins is DROPPED rather than written as `origin: []`.\n * GCS accepts the empty form, and it reads to the next person like a rule that\n * permits something.\n */\nexport function revokeUploadOrigins(\n rules: CorsRule[],\n origins: string[],\n { keep = [] }: { keep?: string[] } = {},\n): { rules: CorsRule[]; removed: string[]; refused: string[] } {\n const protectedSet = new Set(keep)\n const asked = [...new Set(origins.map((origin) => String(origin)))]\n const refused = asked.filter(\n (origin) => origin === '*' || protectedSet.has(origin),\n )\n const doomed = new Set(asked.filter((origin) => !refused.includes(origin)))\n if (doomed.size === 0) return { rules, removed: [], refused }\n\n const removed: string[] = []\n const next: CorsRule[] = []\n for (const rule of rules) {\n if (uploadRules([rule]).length !== 1) {\n next.push(rule)\n continue\n }\n const kept = (rule.origin ?? []).filter((origin) => {\n if (!doomed.has(String(origin))) return true\n removed.push(String(origin))\n return false\n })\n if (kept.length > 0) next.push({ ...rule, origin: kept })\n }\n return { rules: next, removed, refused }\n}\n\n/**\n * What a human must run when the automation could not.\n *\n * Carries the warning as well as the command: the obvious one-liner is the\n * destructive one, and an instruction that omits that is how the read-modify-\n * write rule gets skipped by the person following it in a hurry.\n */\nexport function uploadCorsRemedy(bucket: string, missing: string[]): string {\n return [\n `Large (resumable) uploads from ${missing.join(', ')} will fail until`,\n `gs://${bucket} permits ${missing.length === 1 ? 'that origin' : 'those origins'}.`,\n 'GCS matches the CORS origin list EXACTLY — there is no subtree form, so',\n 'each origin needs its own entry.',\n '',\n ' gcloud storage buckets describe gs://' + bucket + ' --format=json\\\\(cors_config\\\\) > cors.json',\n ' # edit cors.json: ADD the origins above to the rule whose method is PUT',\n ` gcloud storage buckets update gs://${bucket} --cors-file=cors.json`,\n '',\n '⚠️ --cors-file REPLACES the configuration rather than merging it. Read the',\n 'live document, add to it, write it back — building a fresh one drops every',\n 'other origin, and that failure lands on someone else, days later.',\n ].join('\\n')\n}\n"],"names":["UPLOAD_CORS_METHOD","UPLOAD_CORS_RESPONSE_HEADERS","UPLOAD_CORS_MAX_AGE_SECONDS","HOSTNAME","uploadOriginFor","host","raw","String","trim","toLowerCase","bare","replace","split","test","uploadRules","rules","filter","rule","method","some","toUpperCase","permitsUploadOrigin","origin","listed","missingUploadOrigins","origins","mergeUploadOrigins","includes","Error","wanted","Set","missing","length","added","target","findIndex","responseHeader","maxAgeSeconds","next","map","index","revokeUploadOrigins","keep","protectedSet","asked","refused","has","doomed","size","removed","push","kept","uploadCorsRemedy","bucket","join"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+CC;AASD,oFAAoF,GACpF,OAAO,MAAMA,qBAAqB,MAAK;AAEvC,mEAAmE,GACnE,OAAO,MAAMC,+BAA+B;IAAC;IAAgB;CAAmB,CAAA;AAEhF,kDAAkD,GAClD,OAAO,MAAMC,8BAA8B,KAAI;AAE/C,MAAMC,WAAW;AAEjB;;;;;;;CAOC,GACD,OAAO,SAASC,gBAAgBC,IAAY;IAC1C,MAAMC,MAAMC,OAAOF,eAAAA,OAAQ,IAAIG,IAAI,GAAGC,WAAW;IACjD,IAAI,CAACH,KAAK,OAAO;IACjB,MAAMI,OAAOJ,IACVK,OAAO,CAAC,2BAA2B,IACnCC,KAAK,CAAC,QAAQ,CAAC,EAAE,CACjBD,OAAO,CAAC,OAAO;IAClB,OAAOR,SAASU,IAAI,CAACH,QAAQ,CAAC,QAAQ,EAAEA,MAAM,GAAG;AACnD;AAEA,SAASI,YAAYC,KAAiB;IACpC,OAAOA,MAAMC,MAAM,CAAC,CAACC;YAClBA;eAAD,EAACA,eAAAA,KAAKC,MAAM,YAAXD,eAAe,EAAE,EAAEE,IAAI,CACtB,CAACD,SAAWA,OAAOE,WAAW,OAAOpB;;AAG3C;AAEA;;;;;;;CAOC,GACD,OAAO,SAASqB,oBACdN,KAAoC,EACpCO,MAAc;IAEd,IAAI,CAACP,OAAO,OAAO;IACnB,OAAOD,YAAYC,OAAOI,IAAI,CAAC,CAACF;YAC7BA;eAAD,EAACA,eAAAA,KAAKK,MAAM,YAAXL,eAAe,EAAE,EAAEE,IAAI,CAAC,CAACI,SAAWA,WAAW,OAAOA,WAAWD;;AAEtE;AAEA;;;;;;CAMC,GACD,OAAO,SAASE,qBACdT,KAAoC,EACpCU,OAAiB;IAEjB,OAAOA,QAAQT,MAAM,CAAC,CAACM,SAAW,CAACD,oBAAoBN,OAAOO;AAChE;AAEA;;;;;;;;CAQC,GACD,OAAO,SAASI,mBACdX,KAAiB,EACjBU,OAAiB;IAEjB,IAAIA,QAAQN,IAAI,CAAC,CAACG,SAAWf,OAAOe,QAAQK,QAAQ,CAAC,OAAO;QAC1D,MAAM,IAAIC,MACR,0EACE;IAEN;IACA,MAAMC,SAAS;WAAI,IAAIC,IAAIL;KAAS;IACpC,MAAMM,UAAUP,qBAAqBT,OAAOc;IAC5C,IAAIE,QAAQC,MAAM,KAAK,GAAG,OAAO;QAAEjB;QAAOkB,OAAO,EAAE;IAAC;IAEpD,MAAMC,SAASnB,MAAMoB,SAAS,CAAC,CAAClB,OAASH,YAAY;YAACG;SAAK,EAAEe,MAAM,KAAK;IACxE,IAAIE,SAAS,GAAG;QACd,OAAO;YACLnB,OAAO;mBACFA;gBACH;oBACEO,QAAQS;oBACRb,QAAQ;wBAAClB;qBAAmB;oBAC5BoC,gBAAgB;2BAAInC;qBAA6B;oBACjDoC,eAAenC;gBACjB;aACD;YACD+B,OAAOF;QACT;IACF;IACA,MAAMO,OAAOvB,MAAMwB,GAAG,CAAC,CAACtB,MAAMuB;YAEYvB;eADxCuB,UAAUN,SACN,aAAKjB;YAAMK,QAAQ;mBAAI,IAAIQ,IAAI;wBAAKb,eAAAA,KAAKK,MAAM,YAAXL,eAAe,EAAE;uBAAMc;iBAAQ;aAAE;aACrEd;;IAEN,OAAO;QAAEF,OAAOuB;QAAML,OAAOF;IAAQ;AACvC;AAEA;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GACD,OAAO,SAASU,oBACd1B,KAAiB,EACjBU,OAAiB,EACjB,EAAEiB,OAAO,EAAE,EAAuB,GAAG,CAAC,CAAC;IAEvC,MAAMC,eAAe,IAAIb,IAAIY;IAC7B,MAAME,QAAQ;WAAI,IAAId,IAAIL,QAAQc,GAAG,CAAC,CAACjB,SAAWf,OAAOe;KAAU;IACnE,MAAMuB,UAAUD,MAAM5B,MAAM,CAC1B,CAACM,SAAWA,WAAW,OAAOqB,aAAaG,GAAG,CAACxB;IAEjD,MAAMyB,SAAS,IAAIjB,IAAIc,MAAM5B,MAAM,CAAC,CAACM,SAAW,CAACuB,QAAQlB,QAAQ,CAACL;IAClE,IAAIyB,OAAOC,IAAI,KAAK,GAAG,OAAO;QAAEjC;QAAOkC,SAAS,EAAE;QAAEJ;IAAQ;IAE5D,MAAMI,UAAoB,EAAE;IAC5B,MAAMX,OAAmB,EAAE;IAC3B,KAAK,MAAMrB,QAAQF,MAAO;YAKVE;QAJd,IAAIH,YAAY;YAACG;SAAK,EAAEe,MAAM,KAAK,GAAG;YACpCM,KAAKY,IAAI,CAACjC;YACV;QACF;QACA,MAAMkC,OAAO,EAAClC,eAAAA,KAAKK,MAAM,YAAXL,eAAe,EAAE,EAAED,MAAM,CAAC,CAACM;YACvC,IAAI,CAACyB,OAAOD,GAAG,CAACvC,OAAOe,UAAU,OAAO;YACxC2B,QAAQC,IAAI,CAAC3C,OAAOe;YACpB,OAAO;QACT;QACA,IAAI6B,KAAKnB,MAAM,GAAG,GAAGM,KAAKY,IAAI,CAAC,aAAKjC;YAAMK,QAAQ6B;;IACpD;IACA,OAAO;QAAEpC,OAAOuB;QAAMW;QAASJ;IAAQ;AACzC;AAEA;;;;;;CAMC,GACD,OAAO,SAASO,iBAAiBC,MAAc,EAAEtB,OAAiB;IAChE,OAAO;QACL,CAAC,+BAA+B,EAAEA,QAAQuB,IAAI,CAAC,MAAM,gBAAgB,CAAC;QACtE,CAAC,KAAK,EAAED,OAAO,SAAS,EAAEtB,QAAQC,MAAM,KAAK,IAAI,gBAAgB,gBAAgB,CAAC,CAAC;QACnF;QACA;QACA;QACA,4CAA4CqB,SAAS;QACrD;QACA,CAAC,qCAAqC,EAAEA,OAAO,sBAAsB,CAAC;QACtE;QACA;QACA;QACA;KACD,CAACC,IAAI,CAAC;AACT"}
|
|
@@ -0,0 +1,159 @@
|
|
|
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
|
+
* STRUCTURAL upload inspection (AGL-1475).
|
|
19
|
+
*
|
|
20
|
+
* ## What this is, and what it is emphatically not
|
|
21
|
+
*
|
|
22
|
+
* This is **not** an antivirus scanner and no code in this module should ever
|
|
23
|
+
* be described as one. It does not have malware signatures, it does not
|
|
24
|
+
* emulate, unpack or detonate anything, and a novel trojan with a correct PDF
|
|
25
|
+
* header passes it without a murmur. It is *structural validation*: it reads
|
|
26
|
+
* the first few kilobytes of an upload and answers three questions the
|
|
27
|
+
* platform previously could not ask at all.
|
|
28
|
+
*
|
|
29
|
+
* 1. **Are these bytes an executable?** A Windows PE, an ELF binary, a Mach-O
|
|
30
|
+
* binary or an installer package is refused whatever it claims to be. This
|
|
31
|
+
* is the single highest-value check here: the Sept-1 risk is a customer's
|
|
32
|
+
* domain re-serving a trojan to a visitor's browser, and the overwhelming
|
|
33
|
+
* majority of that population is a plain executable with a lying name.
|
|
34
|
+
* 2. **Do the bytes match the declared type?** Media ingress trusted the
|
|
35
|
+
* caller's content type completely — AGL-2463 wrote that gap down. The
|
|
36
|
+
* allowlist bounded what a file *claimed* to be and nothing bounded what it
|
|
37
|
+
* *was*, so `Content-Type: application/pdf` over a `.exe` was stored,
|
|
38
|
+
* hashed, given a CDN path and served. It now has to be a PDF.
|
|
39
|
+
* 3. **Does an Office document carry a macro project?** AGL-1465 kept
|
|
40
|
+
* `.docm`/`.xlsm`/`.pptm` out **by content type**, which is a gate on a
|
|
41
|
+
* string the uploader chooses. Renaming a macro-enabled document to
|
|
42
|
+
* `.docx` walked straight past it. The archive is now checked for a
|
|
43
|
+
* `vbaProject.bin` entry, which is the thing that made those extensions
|
|
44
|
+
* worth excluding in the first place.
|
|
45
|
+
*
|
|
46
|
+
* Plus one signature, EICAR — see {@link EICAR_TEST_SIGNATURE}.
|
|
47
|
+
*
|
|
48
|
+
* ## What it therefore does not catch
|
|
49
|
+
*
|
|
50
|
+
* A malicious PDF that is a real PDF. A macro-free document that exploits a
|
|
51
|
+
* reader. Anything inside a plain `application/zip`, which is a brand kit and
|
|
52
|
+
* may legitimately contain a build tool. An obfuscated dropper in a JSON
|
|
53
|
+
* file. Real malware detection needs signatures and an engine, which needs a
|
|
54
|
+
* ClamAV service, which does not fit the budget this platform runs on — the
|
|
55
|
+
* cost work is in the issue. Nothing here should be allowed to read as though
|
|
56
|
+
* that decision went the other way.
|
|
57
|
+
*
|
|
58
|
+
* ## Why it is pure, and takes a window rather than a file
|
|
59
|
+
*
|
|
60
|
+
* Three of the four media chokepoints hold the whole file in memory and can
|
|
61
|
+
* pass it straight in. The fourth — signed direct-to-storage upload — never
|
|
62
|
+
* sees the bytes, because that is the entire reason it exists: a 200 MB video
|
|
63
|
+
* goes browser → bucket and downloading it back into the function to look at
|
|
64
|
+
* it would cost more than the feature. So that caller does two RANGED reads
|
|
65
|
+
* instead, a few KB from each end, and passes them as {@link
|
|
66
|
+
* InspectUploadInput.bytes} and {@link InspectUploadInput.tail}. Every
|
|
67
|
+
* signature this module knows lives in one of those two windows, so the
|
|
68
|
+
* signed route gets the same verdict for the price of a rounding error.
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* The EICAR standard antivirus test string.
|
|
72
|
+
*
|
|
73
|
+
* A 68-byte printable string, defined by the European Institute for Computer
|
|
74
|
+
* Antivirus Research, that every antivirus product agrees to flag and that is
|
|
75
|
+
* completely inert. It exists so that a pipeline can be tested end to end
|
|
76
|
+
* without anyone handling a live sample.
|
|
77
|
+
*
|
|
78
|
+
* It is matched here for exactly two reasons, and neither is malware
|
|
79
|
+
* detection. First, it makes this module's own tests honest without checking
|
|
80
|
+
* a real sample into the repository. Second, it is the probe a security
|
|
81
|
+
* reviewer or a customer will actually try, and answering it with silence
|
|
82
|
+
* would be a worse lie than answering it with a refusal — a refusal that says
|
|
83
|
+
* "structural check" is true, where a silent accept invites the reader to
|
|
84
|
+
* conclude nothing is checked at all.
|
|
85
|
+
*
|
|
86
|
+
* **This is a signature list of one. It is not an engine.** Do not add a
|
|
87
|
+
* second entry here and start calling the result malware scanning; if real
|
|
88
|
+
* signatures are wanted, they belong in a scanner service, not in a string
|
|
89
|
+
* constant.
|
|
90
|
+
*/
|
|
91
|
+
export declare const EICAR_TEST_SIGNATURE = "X5O!P%@AP[4\\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*";
|
|
92
|
+
/**
|
|
93
|
+
* How many leading bytes an inspection needs.
|
|
94
|
+
*
|
|
95
|
+
* Every magic number checked here sits in the first 16 bytes; the window is
|
|
96
|
+
* far larger so that the EICAR match and the small-file macro scan have room,
|
|
97
|
+
* and because the signed route's ranged GET costs the same for 4 KB as for
|
|
98
|
+
* 64 bytes.
|
|
99
|
+
*/
|
|
100
|
+
export declare const UPLOAD_INSPECTION_HEAD_BYTES = 4096;
|
|
101
|
+
/**
|
|
102
|
+
* How many trailing bytes an inspection wants for an Office document.
|
|
103
|
+
*
|
|
104
|
+
* A ZIP's central directory — the authoritative list of what is inside it —
|
|
105
|
+
* lives at the end of the file. 64 KB covers the directory of any document
|
|
106
|
+
* archive this platform accepts (the largest ceiling is a 50 MB `.pptx`, and
|
|
107
|
+
* its directory is a few KB even with hundreds of embedded images). A
|
|
108
|
+
* document whose directory is somehow larger than this window degrades to
|
|
109
|
+
* "macro not found", which is the pre-existing behaviour, not a regression.
|
|
110
|
+
*/
|
|
111
|
+
export declare const UPLOAD_INSPECTION_TAIL_BYTES = 65536;
|
|
112
|
+
export type UploadInspectionCode = 'signature_match' | 'executable_bytes' | 'type_mismatch' | 'macro_payload' | 'empty_file';
|
|
113
|
+
export interface UploadInspectionRefusal {
|
|
114
|
+
/** Stable machine code — for the API error body, logs and tests. */
|
|
115
|
+
code: UploadInspectionCode;
|
|
116
|
+
/** What the bytes turned out to be, in words rather than hex. */
|
|
117
|
+
detected: string;
|
|
118
|
+
/**
|
|
119
|
+
* The sentence the uploader sees. Names the file and what was found, so
|
|
120
|
+
* that a merchant who did nothing wrong can tell which of fifty dropped
|
|
121
|
+
* files was the problem and why.
|
|
122
|
+
*/
|
|
123
|
+
message: string;
|
|
124
|
+
}
|
|
125
|
+
export interface InspectUploadInput {
|
|
126
|
+
/**
|
|
127
|
+
* The whole file, or its leading {@link UPLOAD_INSPECTION_HEAD_BYTES}.
|
|
128
|
+
* Callers holding the whole file pass it and omit `tail`.
|
|
129
|
+
*/
|
|
130
|
+
bytes: Uint8Array;
|
|
131
|
+
/**
|
|
132
|
+
* The file's trailing bytes, supplied ONLY by a caller that passed a head
|
|
133
|
+
* window rather than the whole file. When absent, `bytes` is searched for
|
|
134
|
+
* the trailing structures too — which is correct precisely because a caller
|
|
135
|
+
* that omits it is one that handed over the entire file.
|
|
136
|
+
*/
|
|
137
|
+
tail?: Uint8Array | null;
|
|
138
|
+
/** The type the upload claims to be, already normalized by the caller. */
|
|
139
|
+
contentType: string;
|
|
140
|
+
/** For the message only. Never used to decide anything. */
|
|
141
|
+
fileName?: string | null;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Does a caller holding only a head window need to fetch the tail as well?
|
|
145
|
+
*
|
|
146
|
+
* Only the macro scan reads the end of a file, and only for document
|
|
147
|
+
* archives, so this is what lets the signed-upload route skip a second ranged
|
|
148
|
+
* GET for the 200 MB videos that route exists to carry — which is every
|
|
149
|
+
* object on it bar a handful of documents.
|
|
150
|
+
*/
|
|
151
|
+
export declare function uploadInspectionNeedsTail(contentType: string): boolean;
|
|
152
|
+
/**
|
|
153
|
+
* Inspect an upload's bytes against the type it claims to be.
|
|
154
|
+
*
|
|
155
|
+
* Returns `null` when nothing structural is wrong — which, to be explicit, is
|
|
156
|
+
* NOT a statement that the file is safe. See the module header.
|
|
157
|
+
*/
|
|
158
|
+
export declare function inspectUploadBytes(input: InspectUploadInput): UploadInspectionRefusal | null;
|
|
159
|
+
export default inspectUploadBytes;
|