@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,247 @@
|
|
|
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
|
+
* The ONE request-geo reader (AGL-1492/1498).
|
|
18
|
+
*
|
|
19
|
+
* Extracted from the console's sanctions module so the tenant's consent-mode
|
|
20
|
+
* endpoint reads the identical signal the sanctions gate does — two geo
|
|
21
|
+
* layers would eventually disagree about the same request. The sanctions
|
|
22
|
+
* POLICY (embargo sets, verdicts, the 451) stays in
|
|
23
|
+
* `apps/console/constants/sanctions-geo.ts`; this is only the signal.
|
|
24
|
+
*/ /**
|
|
25
|
+
* The headers carrying the request's country, subdivision and city, named by
|
|
26
|
+
* configuration with Vercel's own as the default (AGL-2436).
|
|
27
|
+
*
|
|
28
|
+
* These were bare `x-vercel-*` literals, under a comment calling them "the
|
|
29
|
+
* only geo signal this deployment has" — true of Aglyn's cloud and false of
|
|
30
|
+
* every self-host install, where no edge sets them. Nothing else supplies the
|
|
31
|
+
* signal, so on a container `readRequestGeo` returned `null` for every request
|
|
32
|
+
* and the two things built on it were off in production:
|
|
33
|
+
*
|
|
34
|
+
* - the sanctions gate FAILED OPEN on every request, logging it once per
|
|
35
|
+
* instance — an embargo control that is silently not running,
|
|
36
|
+
* - the tenant's consent-region endpoint had no region to answer with,
|
|
37
|
+
* - the new-device sign-in alert reported "Unknown location" to every user,
|
|
38
|
+
* and stored that string, so the breach-notification report that reads a
|
|
39
|
+
* data subject's country back off it counted nobody.
|
|
40
|
+
*
|
|
41
|
+
* An operator's proxy has the signal under its own name: Cloudflare sends
|
|
42
|
+
* `cf-ipcountry`, and Caddy/nginx/Traefik can set whatever they are told to.
|
|
43
|
+
* Naming the header is all that was missing.
|
|
44
|
+
*
|
|
45
|
+
* ⚠️ Read with DOT notation and mapped through the `env` block of both
|
|
46
|
+
* `next.config.js` files, because `apps/console/middleware.ts` imports the
|
|
47
|
+
* sanctions gate and therefore this module into the EDGE bundle. Next inlines
|
|
48
|
+
* `process.env.NAME` there at build time and never the bracket form (AGL-2037)
|
|
49
|
+
* — so these are fixed when the image is built, not when it starts, exactly
|
|
50
|
+
* like `AGLYN_TENANT_HOST_CNAME`.
|
|
51
|
+
*
|
|
52
|
+
* Lower-cased because the value is used as a `Vary` header, where it is echoed
|
|
53
|
+
* verbatim rather than matched case-insensitively.
|
|
54
|
+
*/ export const GEO_COUNTRY_HEADER = (process.env.AGLYN_GEO_COUNTRY_HEADER || 'x-vercel-ip-country').toLowerCase();
|
|
55
|
+
export const GEO_REGION_HEADER = (process.env.AGLYN_GEO_REGION_HEADER || 'x-vercel-ip-country-region').toLowerCase();
|
|
56
|
+
export const GEO_CITY_HEADER = (process.env.AGLYN_GEO_CITY_HEADER || 'x-vercel-ip-city').toLowerCase();
|
|
57
|
+
/**
|
|
58
|
+
* Normalize a subdivision code to the bare, zero-padded ISO 3166-2 form.
|
|
59
|
+
*
|
|
60
|
+
* Providers disagree on `UA-43` vs `43`, and on `9` vs `09` for Luhansk. All
|
|
61
|
+
* three spellings have to land on the same set member or a sub-country
|
|
62
|
+
* control silently answers "allowed" for a region it was written to catch.
|
|
63
|
+
*/ function normalizeRegion(raw) {
|
|
64
|
+
const upper = raw.trim().toUpperCase();
|
|
65
|
+
const bare = upper.includes('-') ? upper.slice(upper.indexOf('-') + 1) : upper;
|
|
66
|
+
return /^\d$/.test(bare) ? `0${bare}` : bare;
|
|
67
|
+
}
|
|
68
|
+
/** Reads the edge geo signal off a request's headers. */ /**
|
|
69
|
+
* The country headers tried after the configured one, in order.
|
|
70
|
+
*
|
|
71
|
+
* `GEO_COUNTRY_HEADER` is a single name fixed at BUILD time (see its comment —
|
|
72
|
+
* Next inlines `process.env.NAME` into the edge bundle), so an operator who
|
|
73
|
+
* did not set it before building has no way to supply the signal afterwards,
|
|
74
|
+
* and a deployment that later moves behind a different proxy silently loses
|
|
75
|
+
* it. Every consumer then reads "no country", which is the strictest consent
|
|
76
|
+
* posture and a sanctions gate that fails open.
|
|
77
|
+
*
|
|
78
|
+
* These are the names the common edges actually send. They are tried only
|
|
79
|
+
* AFTER the configured header, so an explicit configuration always wins and
|
|
80
|
+
* nothing here can override a deliberate choice.
|
|
81
|
+
*
|
|
82
|
+
* ⛔ Header-only, and deliberately so: no IP-geolocation lookup. Sending a
|
|
83
|
+
* visitor's address to a third party to decide what to ask them about privacy
|
|
84
|
+
* would be its own disclosure, and a subprocessor.
|
|
85
|
+
*/ const FALLBACK_COUNTRY_HEADERS = [
|
|
86
|
+
// Cloudflare.
|
|
87
|
+
'cf-ipcountry',
|
|
88
|
+
// Google Cloud: App Engine, and Cloud Run behind a load balancer.
|
|
89
|
+
'x-appengine-country',
|
|
90
|
+
'x-client-geo-country',
|
|
91
|
+
// AWS CloudFront.
|
|
92
|
+
'cloudfront-viewer-country',
|
|
93
|
+
// Fastly.
|
|
94
|
+
'fastly-geo-country',
|
|
95
|
+
// What a hand-rolled nginx/Caddy/Traefik rule is most often called.
|
|
96
|
+
'x-geo-country',
|
|
97
|
+
'x-country-code',
|
|
98
|
+
'x-country'
|
|
99
|
+
];
|
|
100
|
+
/**
|
|
101
|
+
* `XX` is Cloudflare's answer for "unknown", and `T1` for a Tor exit node —
|
|
102
|
+
* neither is a country, and treating them as one would place the visitor in a
|
|
103
|
+
* region nobody is in. `ZZ` appears from some proxies for the same purpose.
|
|
104
|
+
*/ const NON_COUNTRIES = [
|
|
105
|
+
'XX',
|
|
106
|
+
'T1',
|
|
107
|
+
'ZZ'
|
|
108
|
+
];
|
|
109
|
+
/**
|
|
110
|
+
* Every header consulted for the country, in order, configured one first.
|
|
111
|
+
*
|
|
112
|
+
* Exported because a caller that varies a cached response on the country has
|
|
113
|
+
* to name ALL of them: a `Vary` that lists only the configured header is
|
|
114
|
+
* correct on the one platform whose header that is, and on every other one it
|
|
115
|
+
* lets a CDN serve a US answer to a European visitor from cache. Aglyn is
|
|
116
|
+
* self-hostable on Docker with the operator's own Firebase and no particular
|
|
117
|
+
* edge, so "the one platform" is not an assumption this may make.
|
|
118
|
+
*/ export const GEO_COUNTRY_HEADERS = [
|
|
119
|
+
GEO_COUNTRY_HEADER,
|
|
120
|
+
...FALLBACK_COUNTRY_HEADERS
|
|
121
|
+
].filter((name, index, all)=>all.indexOf(name) === index);
|
|
122
|
+
const readCountry = (headers)=>{
|
|
123
|
+
for (const name of GEO_COUNTRY_HEADERS){
|
|
124
|
+
var _headers_get;
|
|
125
|
+
const value = ((_headers_get = headers.get(name)) != null ? _headers_get : '').trim().toUpperCase();
|
|
126
|
+
// Two letters exactly: a proxy that passes through a city name, a list or
|
|
127
|
+
// an IP under one of these names must not become a "country".
|
|
128
|
+
if (!/^[A-Z]{2}$/.test(value)) continue;
|
|
129
|
+
if (NON_COUNTRIES.indexOf(value) >= 0) continue;
|
|
130
|
+
return value;
|
|
131
|
+
}
|
|
132
|
+
return null;
|
|
133
|
+
};
|
|
134
|
+
/**
|
|
135
|
+
* The subdivision headers tried after the configured one, in order.
|
|
136
|
+
*
|
|
137
|
+
* The sub-country half of the embargo check — Crimea, Donetsk, Luhansk,
|
|
138
|
+
* Sevastopol — matches on this and on nothing else, so an operator who named
|
|
139
|
+
* a country header but no region header had the country gate running and the
|
|
140
|
+
* REGION gate quietly inert: a Donetsk request reads `UA`, which is not
|
|
141
|
+
* embargoed, and passes. Cloudflare sends no subdivision at all, so a
|
|
142
|
+
* deployment behind it has no sub-country signal by any name; the rest do.
|
|
143
|
+
*/ const FALLBACK_REGION_HEADERS = [
|
|
144
|
+
'x-appengine-region',
|
|
145
|
+
'x-client-geo-region',
|
|
146
|
+
'cloudfront-viewer-country-region',
|
|
147
|
+
'x-geo-region',
|
|
148
|
+
'x-region-code'
|
|
149
|
+
];
|
|
150
|
+
/** Every header consulted for the subdivision, in order, configured one first. */ export const GEO_REGION_HEADERS = [
|
|
151
|
+
GEO_REGION_HEADER,
|
|
152
|
+
...FALLBACK_REGION_HEADERS
|
|
153
|
+
].filter((name, index, all)=>all.indexOf(name) === index);
|
|
154
|
+
const rawRegion = (headers)=>{
|
|
155
|
+
for (const name of GEO_REGION_HEADERS){
|
|
156
|
+
var _headers_get;
|
|
157
|
+
const value = ((_headers_get = headers.get(name)) != null ? _headers_get : '').trim();
|
|
158
|
+
if (value) return value;
|
|
159
|
+
}
|
|
160
|
+
return '';
|
|
161
|
+
};
|
|
162
|
+
export function readRequestGeo(headers) {
|
|
163
|
+
const region = rawRegion(headers);
|
|
164
|
+
return {
|
|
165
|
+
country: readCountry(headers),
|
|
166
|
+
region: region ? normalizeRegion(region) : null
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* The subdivision as a person should read it, rather than as an embargo set
|
|
171
|
+
* matches it.
|
|
172
|
+
*
|
|
173
|
+
* `readRequestGeo().region` is upper-cased and zero-padded because
|
|
174
|
+
* `EMBARGOED_UA_REGIONS` is an exact-membership test that every spelling of a
|
|
175
|
+
* code has to land on. That normalization is wrong for anything a person
|
|
176
|
+
* reads: a proxy configured to send a subdivision NAME rather than a code
|
|
177
|
+
* reaches a user's security email shouting `CAPITAL`.
|
|
178
|
+
*
|
|
179
|
+
* Same headers, same precedence — only the normalization differs, so the two
|
|
180
|
+
* readers can never disagree about WHICH subdivision a request came from.
|
|
181
|
+
*/ export function readRequestRegionLabel(headers) {
|
|
182
|
+
const raw = rawRegion(headers);
|
|
183
|
+
if (!raw) return null;
|
|
184
|
+
const bare = raw.includes('-') ? raw.slice(raw.indexOf('-') + 1) : raw;
|
|
185
|
+
// Commas are the delimiter callers join these parts on; see `readRequestCity`.
|
|
186
|
+
const label = bare.replace(/,/g, ' ').replace(/\s+/g, ' ').trim();
|
|
187
|
+
return label || null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The city names the common edges send, tried after the configured one.
|
|
191
|
+
*
|
|
192
|
+
* Same ordering rule as the country list: the configured header wins, and
|
|
193
|
+
* these only fill in for an operator who never named one. Cloudflare's
|
|
194
|
+
* `cf-ipcity` arrives only on plans where the visitor-location transform is
|
|
195
|
+
* available, so its absence is normal rather than a misconfiguration.
|
|
196
|
+
*/ const FALLBACK_CITY_HEADERS = [
|
|
197
|
+
'cf-ipcity',
|
|
198
|
+
'x-appengine-city',
|
|
199
|
+
'x-client-geo-city',
|
|
200
|
+
'cloudfront-viewer-city',
|
|
201
|
+
'x-geo-city',
|
|
202
|
+
'x-city'
|
|
203
|
+
];
|
|
204
|
+
/** Every header consulted for the city, in order, configured one first. */ export const GEO_CITY_HEADERS = [
|
|
205
|
+
GEO_CITY_HEADER,
|
|
206
|
+
...FALLBACK_CITY_HEADERS
|
|
207
|
+
].filter((name, index, all)=>all.indexOf(name) === index);
|
|
208
|
+
/**
|
|
209
|
+
* The longest city name treated as a city.
|
|
210
|
+
*
|
|
211
|
+
* A proxy that passes something else through one of these names — a header
|
|
212
|
+
* list, a user agent, a path — would otherwise be rendered to a person as
|
|
213
|
+
* their sign-in location. 64 characters clears the longest real place names
|
|
214
|
+
* with room to spare.
|
|
215
|
+
*/ const MAX_CITY_LENGTH = 64;
|
|
216
|
+
/**
|
|
217
|
+
* The request's city, decoded, or `null` when no edge sent one.
|
|
218
|
+
*
|
|
219
|
+
* Percent-decoded because every edge that sends this header sends non-ASCII
|
|
220
|
+
* names encoded (`S%C3%A3o%20Paulo`), and an undecoded value reaches a person
|
|
221
|
+
* as mojibake in a security email. A value that is not valid percent-encoding
|
|
222
|
+
* is kept verbatim rather than dropped — a literal `%` in a name is not a
|
|
223
|
+
* reason to lose the city.
|
|
224
|
+
*
|
|
225
|
+
* Commas become spaces. Callers join city, region and country with `", "`
|
|
226
|
+
* into one stored string, and `deviceLocationCountry` reads the country back
|
|
227
|
+
* off the LAST comma-separated token; a comma arriving inside the city half
|
|
228
|
+
* would add a token to a string that a breach-notification report parses.
|
|
229
|
+
*/ export function readRequestCity(headers) {
|
|
230
|
+
for (const name of GEO_CITY_HEADERS){
|
|
231
|
+
var _headers_get;
|
|
232
|
+
const raw = ((_headers_get = headers.get(name)) != null ? _headers_get : '').trim();
|
|
233
|
+
if (!raw) continue;
|
|
234
|
+
let decoded;
|
|
235
|
+
try {
|
|
236
|
+
decoded = decodeURIComponent(raw);
|
|
237
|
+
} catch (unused) {
|
|
238
|
+
decoded = raw;
|
|
239
|
+
}
|
|
240
|
+
const city = decoded.replace(/,/g, ' ').replace(/\s+/g, ' ').trim();
|
|
241
|
+
if (!city || city.length > MAX_CITY_LENGTH) continue;
|
|
242
|
+
return city;
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
//# sourceMappingURL=request-geo.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/request-geo.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 * The ONE request-geo reader (AGL-1492/1498).\n *\n * Extracted from the console's sanctions module so the tenant's consent-mode\n * endpoint reads the identical signal the sanctions gate does — two geo\n * layers would eventually disagree about the same request. The sanctions\n * POLICY (embargo sets, verdicts, the 451) stays in\n * `apps/console/constants/sanctions-geo.ts`; this is only the signal.\n */\n\n/**\n * The headers carrying the request's country, subdivision and city, named by\n * configuration with Vercel's own as the default (AGL-2436).\n *\n * These were bare `x-vercel-*` literals, under a comment calling them \"the\n * only geo signal this deployment has\" — true of Aglyn's cloud and false of\n * every self-host install, where no edge sets them. Nothing else supplies the\n * signal, so on a container `readRequestGeo` returned `null` for every request\n * and the two things built on it were off in production:\n *\n * - the sanctions gate FAILED OPEN on every request, logging it once per\n * instance — an embargo control that is silently not running,\n * - the tenant's consent-region endpoint had no region to answer with,\n * - the new-device sign-in alert reported \"Unknown location\" to every user,\n * and stored that string, so the breach-notification report that reads a\n * data subject's country back off it counted nobody.\n *\n * An operator's proxy has the signal under its own name: Cloudflare sends\n * `cf-ipcountry`, and Caddy/nginx/Traefik can set whatever they are told to.\n * Naming the header is all that was missing.\n *\n * ⚠️ Read with DOT notation and mapped through the `env` block of both\n * `next.config.js` files, because `apps/console/middleware.ts` imports the\n * sanctions gate and therefore this module into the EDGE bundle. Next inlines\n * `process.env.NAME` there at build time and never the bracket form (AGL-2037)\n * — so these are fixed when the image is built, not when it starts, exactly\n * like `AGLYN_TENANT_HOST_CNAME`.\n *\n * Lower-cased because the value is used as a `Vary` header, where it is echoed\n * verbatim rather than matched case-insensitively.\n */\nexport const GEO_COUNTRY_HEADER = (\n process.env.AGLYN_GEO_COUNTRY_HEADER || 'x-vercel-ip-country'\n).toLowerCase()\nexport const GEO_REGION_HEADER = (\n process.env.AGLYN_GEO_REGION_HEADER || 'x-vercel-ip-country-region'\n).toLowerCase()\nexport const GEO_CITY_HEADER = (\n process.env.AGLYN_GEO_CITY_HEADER || 'x-vercel-ip-city'\n).toLowerCase()\n\nexport interface RequestGeo {\n /** ISO 3166-1 alpha-2, uppercased. `null` when the edge sent no signal. */\n country: string | null\n /** Bare ISO 3166-2 subdivision code, uppercased. `null` when absent. */\n region: string | null\n}\n\n/** A minimal `Headers`, so route handlers and middleware share one reader. */\nexport interface HeaderReader {\n get(name: string): string | null\n}\n\n/**\n * Normalize a subdivision code to the bare, zero-padded ISO 3166-2 form.\n *\n * Providers disagree on `UA-43` vs `43`, and on `9` vs `09` for Luhansk. All\n * three spellings have to land on the same set member or a sub-country\n * control silently answers \"allowed\" for a region it was written to catch.\n */\nfunction normalizeRegion(raw: string): string {\n const upper = raw.trim().toUpperCase()\n const bare = upper.includes('-') ? upper.slice(upper.indexOf('-') + 1) : upper\n return /^\\d$/.test(bare) ? `0${bare}` : bare\n}\n\n/** Reads the edge geo signal off a request's headers. */\n/**\n * The country headers tried after the configured one, in order.\n *\n * `GEO_COUNTRY_HEADER` is a single name fixed at BUILD time (see its comment —\n * Next inlines `process.env.NAME` into the edge bundle), so an operator who\n * did not set it before building has no way to supply the signal afterwards,\n * and a deployment that later moves behind a different proxy silently loses\n * it. Every consumer then reads \"no country\", which is the strictest consent\n * posture and a sanctions gate that fails open.\n *\n * These are the names the common edges actually send. They are tried only\n * AFTER the configured header, so an explicit configuration always wins and\n * nothing here can override a deliberate choice.\n *\n * ⛔ Header-only, and deliberately so: no IP-geolocation lookup. Sending a\n * visitor's address to a third party to decide what to ask them about privacy\n * would be its own disclosure, and a subprocessor.\n */\nconst FALLBACK_COUNTRY_HEADERS = [\n // Cloudflare.\n 'cf-ipcountry',\n // Google Cloud: App Engine, and Cloud Run behind a load balancer.\n 'x-appengine-country',\n 'x-client-geo-country',\n // AWS CloudFront.\n 'cloudfront-viewer-country',\n // Fastly.\n 'fastly-geo-country',\n // What a hand-rolled nginx/Caddy/Traefik rule is most often called.\n 'x-geo-country',\n 'x-country-code',\n 'x-country',\n] as const\n\n/**\n * `XX` is Cloudflare's answer for \"unknown\", and `T1` for a Tor exit node —\n * neither is a country, and treating them as one would place the visitor in a\n * region nobody is in. `ZZ` appears from some proxies for the same purpose.\n */\nconst NON_COUNTRIES = ['XX', 'T1', 'ZZ']\n\n/**\n * Every header consulted for the country, in order, configured one first.\n *\n * Exported because a caller that varies a cached response on the country has\n * to name ALL of them: a `Vary` that lists only the configured header is\n * correct on the one platform whose header that is, and on every other one it\n * lets a CDN serve a US answer to a European visitor from cache. Aglyn is\n * self-hostable on Docker with the operator's own Firebase and no particular\n * edge, so \"the one platform\" is not an assumption this may make.\n */\nexport const GEO_COUNTRY_HEADERS: readonly string[] = [\n GEO_COUNTRY_HEADER,\n ...FALLBACK_COUNTRY_HEADERS,\n].filter((name, index, all) => all.indexOf(name) === index)\n\nconst readCountry = (headers: HeaderReader): string | null => {\n for (const name of GEO_COUNTRY_HEADERS) {\n const value = (headers.get(name) ?? '').trim().toUpperCase()\n // Two letters exactly: a proxy that passes through a city name, a list or\n // an IP under one of these names must not become a \"country\".\n if (!/^[A-Z]{2}$/.test(value)) continue\n if (NON_COUNTRIES.indexOf(value) >= 0) continue\n return value\n }\n return null\n}\n\n/**\n * The subdivision headers tried after the configured one, in order.\n *\n * The sub-country half of the embargo check — Crimea, Donetsk, Luhansk,\n * Sevastopol — matches on this and on nothing else, so an operator who named\n * a country header but no region header had the country gate running and the\n * REGION gate quietly inert: a Donetsk request reads `UA`, which is not\n * embargoed, and passes. Cloudflare sends no subdivision at all, so a\n * deployment behind it has no sub-country signal by any name; the rest do.\n */\nconst FALLBACK_REGION_HEADERS = [\n 'x-appengine-region',\n 'x-client-geo-region',\n 'cloudfront-viewer-country-region',\n 'x-geo-region',\n 'x-region-code',\n] as const\n\n/** Every header consulted for the subdivision, in order, configured one first. */\nexport const GEO_REGION_HEADERS: readonly string[] = [\n GEO_REGION_HEADER,\n ...FALLBACK_REGION_HEADERS,\n].filter((name, index, all) => all.indexOf(name) === index)\n\nconst rawRegion = (headers: HeaderReader): string => {\n for (const name of GEO_REGION_HEADERS) {\n const value = (headers.get(name) ?? '').trim()\n if (value) return value\n }\n return ''\n}\n\nexport function readRequestGeo(headers: HeaderReader): RequestGeo {\n const region = rawRegion(headers)\n return {\n country: readCountry(headers),\n region: region ? normalizeRegion(region) : null,\n }\n}\n\n/**\n * The subdivision as a person should read it, rather than as an embargo set\n * matches it.\n *\n * `readRequestGeo().region` is upper-cased and zero-padded because\n * `EMBARGOED_UA_REGIONS` is an exact-membership test that every spelling of a\n * code has to land on. That normalization is wrong for anything a person\n * reads: a proxy configured to send a subdivision NAME rather than a code\n * reaches a user's security email shouting `CAPITAL`.\n *\n * Same headers, same precedence — only the normalization differs, so the two\n * readers can never disagree about WHICH subdivision a request came from.\n */\nexport function readRequestRegionLabel(headers: HeaderReader): string | null {\n const raw = rawRegion(headers)\n if (!raw) return null\n const bare = raw.includes('-') ? raw.slice(raw.indexOf('-') + 1) : raw\n // Commas are the delimiter callers join these parts on; see `readRequestCity`.\n const label = bare.replace(/,/g, ' ').replace(/\\s+/g, ' ').trim()\n return label || null\n}\n\n/**\n * The city names the common edges send, tried after the configured one.\n *\n * Same ordering rule as the country list: the configured header wins, and\n * these only fill in for an operator who never named one. Cloudflare's\n * `cf-ipcity` arrives only on plans where the visitor-location transform is\n * available, so its absence is normal rather than a misconfiguration.\n */\nconst FALLBACK_CITY_HEADERS = [\n 'cf-ipcity',\n 'x-appengine-city',\n 'x-client-geo-city',\n 'cloudfront-viewer-city',\n 'x-geo-city',\n 'x-city',\n] as const\n\n/** Every header consulted for the city, in order, configured one first. */\nexport const GEO_CITY_HEADERS: readonly string[] = [\n GEO_CITY_HEADER,\n ...FALLBACK_CITY_HEADERS,\n].filter((name, index, all) => all.indexOf(name) === index)\n\n/**\n * The longest city name treated as a city.\n *\n * A proxy that passes something else through one of these names — a header\n * list, a user agent, a path — would otherwise be rendered to a person as\n * their sign-in location. 64 characters clears the longest real place names\n * with room to spare.\n */\nconst MAX_CITY_LENGTH = 64\n\n/**\n * The request's city, decoded, or `null` when no edge sent one.\n *\n * Percent-decoded because every edge that sends this header sends non-ASCII\n * names encoded (`S%C3%A3o%20Paulo`), and an undecoded value reaches a person\n * as mojibake in a security email. A value that is not valid percent-encoding\n * is kept verbatim rather than dropped — a literal `%` in a name is not a\n * reason to lose the city.\n *\n * Commas become spaces. Callers join city, region and country with `\", \"`\n * into one stored string, and `deviceLocationCountry` reads the country back\n * off the LAST comma-separated token; a comma arriving inside the city half\n * would add a token to a string that a breach-notification report parses.\n */\nexport function readRequestCity(headers: HeaderReader): string | null {\n for (const name of GEO_CITY_HEADERS) {\n const raw = (headers.get(name) ?? '').trim()\n if (!raw) continue\n let decoded: string\n try {\n decoded = decodeURIComponent(raw)\n } catch {\n decoded = raw\n }\n const city = decoded.replace(/,/g, ' ').replace(/\\s+/g, ' ').trim()\n if (!city || city.length > MAX_CITY_LENGTH) continue\n return city\n }\n return null\n}\n"],"names":["GEO_COUNTRY_HEADER","process","env","AGLYN_GEO_COUNTRY_HEADER","toLowerCase","GEO_REGION_HEADER","AGLYN_GEO_REGION_HEADER","GEO_CITY_HEADER","AGLYN_GEO_CITY_HEADER","normalizeRegion","raw","upper","trim","toUpperCase","bare","includes","slice","indexOf","test","FALLBACK_COUNTRY_HEADERS","NON_COUNTRIES","GEO_COUNTRY_HEADERS","filter","name","index","all","readCountry","headers","value","get","FALLBACK_REGION_HEADERS","GEO_REGION_HEADERS","rawRegion","readRequestGeo","region","country","readRequestRegionLabel","label","replace","FALLBACK_CITY_HEADERS","GEO_CITY_HEADERS","MAX_CITY_LENGTH","readRequestCity","decoded","decodeURIComponent","city","length"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;CAQC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8BC,GACD,OAAO,MAAMA,qBAAqB,AAChCC,CAAAA,QAAQC,GAAG,CAACC,wBAAwB,IAAI,qBAAoB,EAC5DC,WAAW,GAAE;AACf,OAAO,MAAMC,oBAAoB,AAC/BJ,CAAAA,QAAQC,GAAG,CAACI,uBAAuB,IAAI,4BAA2B,EAClEF,WAAW,GAAE;AACf,OAAO,MAAMG,kBAAkB,AAC7BN,CAAAA,QAAQC,GAAG,CAACM,qBAAqB,IAAI,kBAAiB,EACtDJ,WAAW,GAAE;AAcf;;;;;;CAMC,GACD,SAASK,gBAAgBC,GAAW;IAClC,MAAMC,QAAQD,IAAIE,IAAI,GAAGC,WAAW;IACpC,MAAMC,OAAOH,MAAMI,QAAQ,CAAC,OAAOJ,MAAMK,KAAK,CAACL,MAAMM,OAAO,CAAC,OAAO,KAAKN;IACzE,OAAO,OAAOO,IAAI,CAACJ,QAAQ,CAAC,CAAC,EAAEA,MAAM,GAAGA;AAC1C;AAEA,uDAAuD,GACvD;;;;;;;;;;;;;;;;;CAiBC,GACD,MAAMK,2BAA2B;IAC/B,cAAc;IACd;IACA,kEAAkE;IAClE;IACA;IACA,kBAAkB;IAClB;IACA,UAAU;IACV;IACA,oEAAoE;IACpE;IACA;IACA;CACD;AAED;;;;CAIC,GACD,MAAMC,gBAAgB;IAAC;IAAM;IAAM;CAAK;AAExC;;;;;;;;;CASC,GACD,OAAO,MAAMC,sBAAyC;IACpDrB;OACGmB;CACJ,CAACG,MAAM,CAAC,CAACC,MAAMC,OAAOC,MAAQA,IAAIR,OAAO,CAACM,UAAUC,OAAM;AAE3D,MAAME,cAAc,CAACC;IACnB,KAAK,MAAMJ,QAAQF,oBAAqB;YACvBM;QAAf,MAAMC,QAAQ,EAACD,eAAAA,QAAQE,GAAG,CAACN,iBAAZI,eAAqB,IAAIf,IAAI,GAAGC,WAAW;QAC1D,0EAA0E;QAC1E,8DAA8D;QAC9D,IAAI,CAAC,aAAaK,IAAI,CAACU,QAAQ;QAC/B,IAAIR,cAAcH,OAAO,CAACW,UAAU,GAAG;QACvC,OAAOA;IACT;IACA,OAAO;AACT;AAEA;;;;;;;;;CASC,GACD,MAAME,0BAA0B;IAC9B;IACA;IACA;IACA;IACA;CACD;AAED,gFAAgF,GAChF,OAAO,MAAMC,qBAAwC;IACnD1B;OACGyB;CACJ,CAACR,MAAM,CAAC,CAACC,MAAMC,OAAOC,MAAQA,IAAIR,OAAO,CAACM,UAAUC,OAAM;AAE3D,MAAMQ,YAAY,CAACL;IACjB,KAAK,MAAMJ,QAAQQ,mBAAoB;YACtBJ;QAAf,MAAMC,QAAQ,EAACD,eAAAA,QAAQE,GAAG,CAACN,iBAAZI,eAAqB,IAAIf,IAAI;QAC5C,IAAIgB,OAAO,OAAOA;IACpB;IACA,OAAO;AACT;AAEA,OAAO,SAASK,eAAeN,OAAqB;IAClD,MAAMO,SAASF,UAAUL;IACzB,OAAO;QACLQ,SAAST,YAAYC;QACrBO,QAAQA,SAASzB,gBAAgByB,UAAU;IAC7C;AACF;AAEA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASE,uBAAuBT,OAAqB;IAC1D,MAAMjB,MAAMsB,UAAUL;IACtB,IAAI,CAACjB,KAAK,OAAO;IACjB,MAAMI,OAAOJ,IAAIK,QAAQ,CAAC,OAAOL,IAAIM,KAAK,CAACN,IAAIO,OAAO,CAAC,OAAO,KAAKP;IACnE,+EAA+E;IAC/E,MAAM2B,QAAQvB,KAAKwB,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,QAAQ,KAAK1B,IAAI;IAC/D,OAAOyB,SAAS;AAClB;AAEA;;;;;;;CAOC,GACD,MAAME,wBAAwB;IAC5B;IACA;IACA;IACA;IACA;IACA;CACD;AAED,yEAAyE,GACzE,OAAO,MAAMC,mBAAsC;IACjDjC;OACGgC;CACJ,CAACjB,MAAM,CAAC,CAACC,MAAMC,OAAOC,MAAQA,IAAIR,OAAO,CAACM,UAAUC,OAAM;AAE3D;;;;;;;CAOC,GACD,MAAMiB,kBAAkB;AAExB;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASC,gBAAgBf,OAAqB;IACnD,KAAK,MAAMJ,QAAQiB,iBAAkB;YACtBb;QAAb,MAAMjB,MAAM,EAACiB,eAAAA,QAAQE,GAAG,CAACN,iBAAZI,eAAqB,IAAIf,IAAI;QAC1C,IAAI,CAACF,KAAK;QACV,IAAIiC;QACJ,IAAI;YACFA,UAAUC,mBAAmBlC;QAC/B,EAAE,eAAM;YACNiC,UAAUjC;QACZ;QACA,MAAMmC,OAAOF,QAAQL,OAAO,CAAC,MAAM,KAAKA,OAAO,CAAC,QAAQ,KAAK1B,IAAI;QACjE,IAAI,CAACiC,QAAQA,KAAKC,MAAM,GAAGL,iBAAiB;QAC5C,OAAOI;IACT;IACA,OAAO;AACT"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* The ONE client-address reader (AGL-2014).
|
|
19
|
+
*
|
|
20
|
+
* Sits beside `request-geo.ts` and does the same job for a different signal:
|
|
21
|
+
* read a fact about the caller off the request, vendor-neutrally, and return
|
|
22
|
+
* nothing rather than a guess when it cannot.
|
|
23
|
+
*
|
|
24
|
+
* ## The failure this exists for
|
|
25
|
+
*
|
|
26
|
+
* Roughly twenty call sites read `x-forwarded-for` and took element `[0]` as
|
|
27
|
+
* the visitor's address. That is correct only where the edge OVERWRITES the
|
|
28
|
+
* header. A default self-host does not overwrite it: nginx's
|
|
29
|
+
* `$proxy_add_x_forwarded_for` and the usual Traefik/Caddy chains APPEND, so a
|
|
30
|
+
* caller who sends `X-Forwarded-For: 1.2.3.4` arrives at the app as
|
|
31
|
+
* `1.2.3.4, <their real address>` and element `[0]` is whatever they typed.
|
|
32
|
+
*
|
|
33
|
+
* Every rate limiter in the product keys on that value, so on a default Docker
|
|
34
|
+
* install it was a rate-limit bypass by header: change one character per
|
|
35
|
+
* request and every limiter hands out a fresh budget. Nothing errors and
|
|
36
|
+
* nothing is logged. The same value is stored as clickwrap evidence and shown
|
|
37
|
+
* to an account owner in a new-device sign-in alert, where a forged address is
|
|
38
|
+
* durable rather than merely a bypass.
|
|
39
|
+
*
|
|
40
|
+
* Binding the containers to loopback in `docker-compose.yml` forces traffic
|
|
41
|
+
* through the operator's proxy. It does not help here: the proxy appending is
|
|
42
|
+
* exactly the case that remains.
|
|
43
|
+
*
|
|
44
|
+
* ## Which hop is the client
|
|
45
|
+
*
|
|
46
|
+
* With N appending proxies in front, the last N entries of `x-forwarded-for`
|
|
47
|
+
* were written by those proxies and are the only ones a caller cannot forge.
|
|
48
|
+
* The outermost trusted proxy wrote the address IT saw — the real client — so
|
|
49
|
+
* the client is the Nth entry counted from the RIGHT, and everything to its
|
|
50
|
+
* left is caller-supplied text that must be ignored.
|
|
51
|
+
*
|
|
52
|
+
* The count is the configuration, because it is the only thing the app cannot
|
|
53
|
+
* work out for itself. It is deliberately not an index: an operator running
|
|
54
|
+
* one reverse proxy sets `1`, and never has to reason about which end of the
|
|
55
|
+
* list they are counting from.
|
|
56
|
+
*
|
|
57
|
+
* ## The default, and why it is not the same everywhere
|
|
58
|
+
*
|
|
59
|
+
* The two candidate defaults fail in opposite directions. Trusting the
|
|
60
|
+
* LEFTMOST hop keeps Aglyn's own cloud correct and leaves every self-host
|
|
61
|
+
* spoofable. Trusting the RIGHTMOST keeps self-hosts correct and would be a
|
|
62
|
+
* silent behavior change on Aglyn's own production.
|
|
63
|
+
*
|
|
64
|
+
* Neither has to be guessed, because the platform can be detected. Vercel sets
|
|
65
|
+
* `VERCEL` in the runtime environment — the same signal `deployment-shape.ts`
|
|
66
|
+
* already keys on — and it terminates every request at its own edge. So:
|
|
67
|
+
*
|
|
68
|
+
* - **Platform detected** → platform mode. Read `x-vercel-forwarded-for`
|
|
69
|
+
* first: Vercel computes it and strips any inbound copy, so on a Vercel
|
|
70
|
+
* request it is the one address value a caller cannot influence. That is
|
|
71
|
+
* the same trust `request-geo.ts` already places in `x-vercel-ip-country`
|
|
72
|
+
* to run the sanctions gate, so it is not a new assumption. If it is
|
|
73
|
+
* absent, fall back to the LEFTMOST `x-forwarded-for` hop, which is
|
|
74
|
+
* precisely what every call site did before this module existed — so
|
|
75
|
+
* nothing on Aglyn's deployment can read differently than it did.
|
|
76
|
+
*
|
|
77
|
+
* - **No platform detected** (a container, a bare Node process, a developer's
|
|
78
|
+
* machine) → one trusted proxy, so the RIGHTMOST hop. That is correct for
|
|
79
|
+
* both proxy styles at the depth the shipped `docker-compose.yml` describes:
|
|
80
|
+
* an overwriting proxy leaves a single entry, where rightmost and leftmost
|
|
81
|
+
* are the same value; an appending proxy leaves the real client last.
|
|
82
|
+
*
|
|
83
|
+
* An operator with more than one proxy in front sets the real number. Getting
|
|
84
|
+
* that number too LOW names an intermediate proxy instead of the visitor,
|
|
85
|
+
* which over-counts — several visitors share one bucket and the limiter
|
|
86
|
+
* refuses sooner. Getting it too HIGH is the direction that matters, and it
|
|
87
|
+
* cannot hand out a forged address here: a chain shorter than the configured
|
|
88
|
+
* depth is clamped to its leftmost entry, and every entry of such a chain was
|
|
89
|
+
* still written by a trusted proxy.
|
|
90
|
+
*
|
|
91
|
+
* ## What this will not do
|
|
92
|
+
*
|
|
93
|
+
* ⛔ It never invents an address. When nothing readable is present the answer
|
|
94
|
+
* is `null` and the caller decides. Returning a placeholder like `'unknown'`
|
|
95
|
+
* would put every anonymous caller in one rate-limit bucket, which is a denial
|
|
96
|
+
* of service the limiter inflicts on itself.
|
|
97
|
+
*
|
|
98
|
+
* ⛔ No trusted-CIDR matching. A hop count answers the same question with
|
|
99
|
+
* configuration an operator can actually get right, and a CIDR list that is
|
|
100
|
+
* subtly wrong fails open in exactly the way this module exists to prevent.
|
|
101
|
+
*
|
|
102
|
+
* ⛔ Not for an edge bundle as written. `AGLYN_TRUSTED_PROXY_COUNT` is read
|
|
103
|
+
* from `process.env` at call time, so it is a genuine runtime variable an
|
|
104
|
+
* operator can change without rebuilding — unlike the geo header names, which
|
|
105
|
+
* `apps/console/middleware.ts` drags into the edge bundle and which therefore
|
|
106
|
+
* have to be mapped through `next.config.js` and fixed at build. Nothing
|
|
107
|
+
* reads an address in middleware today. Anything that starts to must map the
|
|
108
|
+
* variable through both `next.config.js` files first, or the edge will read
|
|
109
|
+
* `undefined` and silently fall back to the default.
|
|
110
|
+
*/
|
|
111
|
+
import type { HeaderReader } from './request-geo';
|
|
112
|
+
/** The environment variable naming how many proxies sit in front of the app. */
|
|
113
|
+
export declare const TRUSTED_PROXY_COUNT_VAR = "AGLYN_TRUSTED_PROXY_COUNT";
|
|
114
|
+
/**
|
|
115
|
+
* The trusted depth assumed when nothing is configured and no platform edge is
|
|
116
|
+
* detected: one reverse proxy, which is the shape `docker-compose.yml` and the
|
|
117
|
+
* self-hosting runbook describe.
|
|
118
|
+
*/
|
|
119
|
+
export declare const DEFAULT_TRUSTED_PROXY_COUNT = 1;
|
|
120
|
+
/**
|
|
121
|
+
* `null` means "a platform edge normalizes the header, trust what it presents".
|
|
122
|
+
* A number is a literal count of proxies in front, and `0` means none — a
|
|
123
|
+
* process reachable directly from the internet, where every forwarding header
|
|
124
|
+
* is caller-supplied text and only the transport peer is a fact.
|
|
125
|
+
*/
|
|
126
|
+
export type TrustedProxyDepth = number | null;
|
|
127
|
+
/**
|
|
128
|
+
* The key fragment a control uses when it has no address and cannot simply
|
|
129
|
+
* skip — and the decision every caller of {@link readClientIp} has to make.
|
|
130
|
+
*
|
|
131
|
+
* Most address-keyed controls in this codebase SKIP when the address is
|
|
132
|
+
* `null`. A budget keyed on a placeholder is one budget shared by everybody,
|
|
133
|
+
* so a deployment whose proxy names no caller would refuse password resets,
|
|
134
|
+
* sign-ins, org creation and site creation for all of its users at once — a
|
|
135
|
+
* denial of service the limiter inflicts on itself, and a worse outcome than
|
|
136
|
+
* the control not running on a deployment that cannot identify anybody. Those
|
|
137
|
+
* controls each have a second key — a uid, an email address, a site — that
|
|
138
|
+
* still applies.
|
|
139
|
+
*
|
|
140
|
+
* The exception is a control whose job is COST rather than identity: the
|
|
141
|
+
* unauthenticated beacons and the pre-auth REST budget bound how much
|
|
142
|
+
* unauthenticated work a stranger can cause, they answer the same way whether
|
|
143
|
+
* or not the limit bites, and they have no second key. Skipping those would
|
|
144
|
+
* leave an unauthenticated Firestore writer unbounded on exactly the
|
|
145
|
+
* misconfigured deployment that produced the missing address. They keep
|
|
146
|
+
* counting, under this bucket, which costs telemetry rather than service.
|
|
147
|
+
*
|
|
148
|
+
* Spelled so it cannot be mistaken for an address, and reached only when NO
|
|
149
|
+
* source produced one — not merely when `x-forwarded-for` was absent.
|
|
150
|
+
*/
|
|
151
|
+
export declare const NO_CLIENT_ADDRESS_BUCKET = "no-address";
|
|
152
|
+
/** Node-style header records alongside a `Headers`-shaped reader. */
|
|
153
|
+
export type ClientIpHeaders = HeaderReader | Record<string, string | string[] | undefined>;
|
|
154
|
+
export interface ClientIpOptions {
|
|
155
|
+
/**
|
|
156
|
+
* Overrides the configured depth. Tests pass this; production code should
|
|
157
|
+
* not, so an operator's configuration is the only thing that decides.
|
|
158
|
+
*/
|
|
159
|
+
trustedProxyCount?: TrustedProxyDepth;
|
|
160
|
+
/**
|
|
161
|
+
* The transport peer — `req.socket.remoteAddress` on a node-style handler.
|
|
162
|
+
* Consulted last, and only because it is the one address the process knows
|
|
163
|
+
* first-hand. Behind a proxy that sets no forwarding header at all it is the
|
|
164
|
+
* proxy's own address, which is a single shared bucket rather than a
|
|
165
|
+
* visitor; that is a misconfiguration the self-hosting docs name, not a
|
|
166
|
+
* reading this module can improve on.
|
|
167
|
+
*/
|
|
168
|
+
remoteAddress?: string | null;
|
|
169
|
+
/** Injectable for tests; defaults to `process.env`. */
|
|
170
|
+
env?: Record<string, string | undefined>;
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* How many proxies to trust, from configuration or from the runtime.
|
|
174
|
+
*
|
|
175
|
+
* Read per call rather than frozen at module scope: this is a runtime
|
|
176
|
+
* variable, and a module-scope snapshot would make it unchangeable without a
|
|
177
|
+
* rebuild for no reason (see the edge-bundle note in the module comment).
|
|
178
|
+
*/
|
|
179
|
+
export declare function resolveTrustedProxyCount(env?: Record<string, string | undefined>): TrustedProxyDepth;
|
|
180
|
+
/**
|
|
181
|
+
* The one spelling of an address this module ever returns, or `null`.
|
|
182
|
+
*
|
|
183
|
+
* Normalization is not cosmetic. A rate-limit key is an exact string, so
|
|
184
|
+
* `2001:DB8::1` and `2001:db8::1`, or the same address with and without a
|
|
185
|
+
* source port, would be two budgets for one visitor — the bypass again, in
|
|
186
|
+
* miniature.
|
|
187
|
+
*
|
|
188
|
+
* - a port is dropped: it changes per connection,
|
|
189
|
+
* - `[…]` brackets and an IPv6 zone (`%eth0`) are dropped,
|
|
190
|
+
* - an IPv4-mapped IPv6 (`::ffff:1.2.3.4`) collapses to its IPv4 form, so a
|
|
191
|
+
* node socket address and a proxy's header value share one bucket,
|
|
192
|
+
* - anything that is not an address — `unknown`, RFC 7239's obfuscated
|
|
193
|
+
* `_hidden` identifiers, a hostname, a header some proxy passed through
|
|
194
|
+
* under this name — is `null` rather than a key.
|
|
195
|
+
*/
|
|
196
|
+
export declare function normalizeClientIp(raw: string | null | undefined): string | null;
|
|
197
|
+
/**
|
|
198
|
+
* The caller's address, or `null` when nothing readable identifies them.
|
|
199
|
+
*
|
|
200
|
+
* Sources in order, and the order is the security property: a reading that
|
|
201
|
+
* depends on the trusted depth always wins, and the single-valued fallbacks
|
|
202
|
+
* only apply when the chain reading produced nothing at all. A caller cannot
|
|
203
|
+
* demote the reader to a weaker source, because a proxy that writes
|
|
204
|
+
* `x-forwarded-for` writes it on every request — the fallbacks are reachable
|
|
205
|
+
* only on a deployment whose proxy sets something else, or on none.
|
|
206
|
+
*
|
|
207
|
+
* 1. the platform edge's own value, in platform mode,
|
|
208
|
+
* 2. `x-forwarded-for` at the trusted hop,
|
|
209
|
+
* 3. `x-real-ip`, single-valued and written by the proxy,
|
|
210
|
+
* 4. `Forwarded` (RFC 7239) at the trusted hop,
|
|
211
|
+
* 5. the transport peer, when the caller supplied one.
|
|
212
|
+
*/
|
|
213
|
+
export declare function readClientIp(headers: ClientIpHeaders, options?: ClientIpOptions): string | null;
|