@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,344 @@
|
|
|
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 client-address reader (AGL-2014).
|
|
18
|
+
*
|
|
19
|
+
* Sits beside `request-geo.ts` and does the same job for a different signal:
|
|
20
|
+
* read a fact about the caller off the request, vendor-neutrally, and return
|
|
21
|
+
* nothing rather than a guess when it cannot.
|
|
22
|
+
*
|
|
23
|
+
* ## The failure this exists for
|
|
24
|
+
*
|
|
25
|
+
* Roughly twenty call sites read `x-forwarded-for` and took element `[0]` as
|
|
26
|
+
* the visitor's address. That is correct only where the edge OVERWRITES the
|
|
27
|
+
* header. A default self-host does not overwrite it: nginx's
|
|
28
|
+
* `$proxy_add_x_forwarded_for` and the usual Traefik/Caddy chains APPEND, so a
|
|
29
|
+
* caller who sends `X-Forwarded-For: 1.2.3.4` arrives at the app as
|
|
30
|
+
* `1.2.3.4, <their real address>` and element `[0]` is whatever they typed.
|
|
31
|
+
*
|
|
32
|
+
* Every rate limiter in the product keys on that value, so on a default Docker
|
|
33
|
+
* install it was a rate-limit bypass by header: change one character per
|
|
34
|
+
* request and every limiter hands out a fresh budget. Nothing errors and
|
|
35
|
+
* nothing is logged. The same value is stored as clickwrap evidence and shown
|
|
36
|
+
* to an account owner in a new-device sign-in alert, where a forged address is
|
|
37
|
+
* durable rather than merely a bypass.
|
|
38
|
+
*
|
|
39
|
+
* Binding the containers to loopback in `docker-compose.yml` forces traffic
|
|
40
|
+
* through the operator's proxy. It does not help here: the proxy appending is
|
|
41
|
+
* exactly the case that remains.
|
|
42
|
+
*
|
|
43
|
+
* ## Which hop is the client
|
|
44
|
+
*
|
|
45
|
+
* With N appending proxies in front, the last N entries of `x-forwarded-for`
|
|
46
|
+
* were written by those proxies and are the only ones a caller cannot forge.
|
|
47
|
+
* The outermost trusted proxy wrote the address IT saw — the real client — so
|
|
48
|
+
* the client is the Nth entry counted from the RIGHT, and everything to its
|
|
49
|
+
* left is caller-supplied text that must be ignored.
|
|
50
|
+
*
|
|
51
|
+
* The count is the configuration, because it is the only thing the app cannot
|
|
52
|
+
* work out for itself. It is deliberately not an index: an operator running
|
|
53
|
+
* one reverse proxy sets `1`, and never has to reason about which end of the
|
|
54
|
+
* list they are counting from.
|
|
55
|
+
*
|
|
56
|
+
* ## The default, and why it is not the same everywhere
|
|
57
|
+
*
|
|
58
|
+
* The two candidate defaults fail in opposite directions. Trusting the
|
|
59
|
+
* LEFTMOST hop keeps Aglyn's own cloud correct and leaves every self-host
|
|
60
|
+
* spoofable. Trusting the RIGHTMOST keeps self-hosts correct and would be a
|
|
61
|
+
* silent behavior change on Aglyn's own production.
|
|
62
|
+
*
|
|
63
|
+
* Neither has to be guessed, because the platform can be detected. Vercel sets
|
|
64
|
+
* `VERCEL` in the runtime environment — the same signal `deployment-shape.ts`
|
|
65
|
+
* already keys on — and it terminates every request at its own edge. So:
|
|
66
|
+
*
|
|
67
|
+
* - **Platform detected** → platform mode. Read `x-vercel-forwarded-for`
|
|
68
|
+
* first: Vercel computes it and strips any inbound copy, so on a Vercel
|
|
69
|
+
* request it is the one address value a caller cannot influence. That is
|
|
70
|
+
* the same trust `request-geo.ts` already places in `x-vercel-ip-country`
|
|
71
|
+
* to run the sanctions gate, so it is not a new assumption. If it is
|
|
72
|
+
* absent, fall back to the LEFTMOST `x-forwarded-for` hop, which is
|
|
73
|
+
* precisely what every call site did before this module existed — so
|
|
74
|
+
* nothing on Aglyn's deployment can read differently than it did.
|
|
75
|
+
*
|
|
76
|
+
* - **No platform detected** (a container, a bare Node process, a developer's
|
|
77
|
+
* machine) → one trusted proxy, so the RIGHTMOST hop. That is correct for
|
|
78
|
+
* both proxy styles at the depth the shipped `docker-compose.yml` describes:
|
|
79
|
+
* an overwriting proxy leaves a single entry, where rightmost and leftmost
|
|
80
|
+
* are the same value; an appending proxy leaves the real client last.
|
|
81
|
+
*
|
|
82
|
+
* An operator with more than one proxy in front sets the real number. Getting
|
|
83
|
+
* that number too LOW names an intermediate proxy instead of the visitor,
|
|
84
|
+
* which over-counts — several visitors share one bucket and the limiter
|
|
85
|
+
* refuses sooner. Getting it too HIGH is the direction that matters, and it
|
|
86
|
+
* cannot hand out a forged address here: a chain shorter than the configured
|
|
87
|
+
* depth is clamped to its leftmost entry, and every entry of such a chain was
|
|
88
|
+
* still written by a trusted proxy.
|
|
89
|
+
*
|
|
90
|
+
* ## What this will not do
|
|
91
|
+
*
|
|
92
|
+
* ⛔ It never invents an address. When nothing readable is present the answer
|
|
93
|
+
* is `null` and the caller decides. Returning a placeholder like `'unknown'`
|
|
94
|
+
* would put every anonymous caller in one rate-limit bucket, which is a denial
|
|
95
|
+
* of service the limiter inflicts on itself.
|
|
96
|
+
*
|
|
97
|
+
* ⛔ No trusted-CIDR matching. A hop count answers the same question with
|
|
98
|
+
* configuration an operator can actually get right, and a CIDR list that is
|
|
99
|
+
* subtly wrong fails open in exactly the way this module exists to prevent.
|
|
100
|
+
*
|
|
101
|
+
* ⛔ Not for an edge bundle as written. `AGLYN_TRUSTED_PROXY_COUNT` is read
|
|
102
|
+
* from `process.env` at call time, so it is a genuine runtime variable an
|
|
103
|
+
* operator can change without rebuilding — unlike the geo header names, which
|
|
104
|
+
* `apps/console/middleware.ts` drags into the edge bundle and which therefore
|
|
105
|
+
* have to be mapped through `next.config.js` and fixed at build. Nothing
|
|
106
|
+
* reads an address in middleware today. Anything that starts to must map the
|
|
107
|
+
* variable through both `next.config.js` files first, or the edge will read
|
|
108
|
+
* `undefined` and silently fall back to the default.
|
|
109
|
+
*/ /** The environment variable naming how many proxies sit in front of the app. */ export const TRUSTED_PROXY_COUNT_VAR = 'AGLYN_TRUSTED_PROXY_COUNT';
|
|
110
|
+
/**
|
|
111
|
+
* The trusted depth assumed when nothing is configured and no platform edge is
|
|
112
|
+
* detected: one reverse proxy, which is the shape `docker-compose.yml` and the
|
|
113
|
+
* self-hosting runbook describe.
|
|
114
|
+
*/ export const DEFAULT_TRUSTED_PROXY_COUNT = 1;
|
|
115
|
+
/**
|
|
116
|
+
* The key fragment a control uses when it has no address and cannot simply
|
|
117
|
+
* skip — and the decision every caller of {@link readClientIp} has to make.
|
|
118
|
+
*
|
|
119
|
+
* Most address-keyed controls in this codebase SKIP when the address is
|
|
120
|
+
* `null`. A budget keyed on a placeholder is one budget shared by everybody,
|
|
121
|
+
* so a deployment whose proxy names no caller would refuse password resets,
|
|
122
|
+
* sign-ins, org creation and site creation for all of its users at once — a
|
|
123
|
+
* denial of service the limiter inflicts on itself, and a worse outcome than
|
|
124
|
+
* the control not running on a deployment that cannot identify anybody. Those
|
|
125
|
+
* controls each have a second key — a uid, an email address, a site — that
|
|
126
|
+
* still applies.
|
|
127
|
+
*
|
|
128
|
+
* The exception is a control whose job is COST rather than identity: the
|
|
129
|
+
* unauthenticated beacons and the pre-auth REST budget bound how much
|
|
130
|
+
* unauthenticated work a stranger can cause, they answer the same way whether
|
|
131
|
+
* or not the limit bites, and they have no second key. Skipping those would
|
|
132
|
+
* leave an unauthenticated Firestore writer unbounded on exactly the
|
|
133
|
+
* misconfigured deployment that produced the missing address. They keep
|
|
134
|
+
* counting, under this bucket, which costs telemetry rather than service.
|
|
135
|
+
*
|
|
136
|
+
* Spelled so it cannot be mistaken for an address, and reached only when NO
|
|
137
|
+
* source produced one — not merely when `x-forwarded-for` was absent.
|
|
138
|
+
*/ export const NO_CLIENT_ADDRESS_BUCKET = 'no-address';
|
|
139
|
+
/**
|
|
140
|
+
* An upper bound on a configured depth, so a typo cannot express a chain
|
|
141
|
+
* nobody runs. Past this the value is treated as unset rather than obeyed.
|
|
142
|
+
*/ const MAX_TRUSTED_PROXIES = 32;
|
|
143
|
+
/**
|
|
144
|
+
* How many proxies to trust, from configuration or from the runtime.
|
|
145
|
+
*
|
|
146
|
+
* Read per call rather than frozen at module scope: this is a runtime
|
|
147
|
+
* variable, and a module-scope snapshot would make it unchangeable without a
|
|
148
|
+
* rebuild for no reason (see the edge-bundle note in the module comment).
|
|
149
|
+
*/ export function resolveTrustedProxyCount(env = process.env) {
|
|
150
|
+
var _env_TRUSTED_PROXY_COUNT_VAR;
|
|
151
|
+
const raw = String((_env_TRUSTED_PROXY_COUNT_VAR = env[TRUSTED_PROXY_COUNT_VAR]) != null ? _env_TRUSTED_PROXY_COUNT_VAR : '').trim();
|
|
152
|
+
if (raw) {
|
|
153
|
+
// Whole, non-negative, and small. A junk value must not silently become a
|
|
154
|
+
// depth: `NaN` would compare false everywhere and quietly read the
|
|
155
|
+
// leftmost hop, which is the bypass this module exists to close.
|
|
156
|
+
const parsed = Number(raw);
|
|
157
|
+
if (Number.isInteger(parsed) && parsed >= 0 && parsed <= MAX_TRUSTED_PROXIES) {
|
|
158
|
+
return parsed;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
// The platform's own edge. Detected, not guessed — and detected from the
|
|
162
|
+
// runtime environment rather than from the presence of a `x-vercel-*`
|
|
163
|
+
// header, which an operator's proxy could pass through from a caller.
|
|
164
|
+
if (env['VERCEL']) return null;
|
|
165
|
+
return DEFAULT_TRUSTED_PROXY_COUNT;
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* The address Vercel computed for the caller.
|
|
169
|
+
*
|
|
170
|
+
* Vercel sets every `x-vercel-*` header itself and overwrites any inbound
|
|
171
|
+
* copy, so on a Vercel request this is not caller-supplied. It is read only
|
|
172
|
+
* in platform mode, so an operator's proxy forwarding a forged
|
|
173
|
+
* `x-vercel-forwarded-for` reaches nothing.
|
|
174
|
+
*/ const PLATFORM_ADDRESS_HEADER = 'x-vercel-forwarded-for';
|
|
175
|
+
/** Wrap either header shape in the `Headers`-like reader the rest uses. */ function readerFor(headers) {
|
|
176
|
+
if (typeof (headers == null ? void 0 : headers.get) === 'function') {
|
|
177
|
+
return headers;
|
|
178
|
+
}
|
|
179
|
+
const record = headers != null ? headers : {};
|
|
180
|
+
const lowered = {};
|
|
181
|
+
for (const [key, value] of Object.entries(record)){
|
|
182
|
+
if (value === undefined) continue;
|
|
183
|
+
// A repeated header arrives as an array in node. Joining with `,` restores
|
|
184
|
+
// the single-list form `Headers.get` would have produced, so the hop
|
|
185
|
+
// arithmetic below counts the same entries either way.
|
|
186
|
+
lowered[key.toLowerCase()] = Array.isArray(value) ? value.join(',') : String(value);
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
get: (name)=>{
|
|
190
|
+
var _lowered_name_toLowerCase;
|
|
191
|
+
return (_lowered_name_toLowerCase = lowered[name.toLowerCase()]) != null ? _lowered_name_toLowerCase : null;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
/** RFC 7239 says an unresolvable node is `unknown`; squid writes it too. */ const NOT_AN_ADDRESS = new Set([
|
|
196
|
+
'unknown',
|
|
197
|
+
'null',
|
|
198
|
+
'undefined'
|
|
199
|
+
]);
|
|
200
|
+
const IPV4 = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
|
|
201
|
+
const IPV6 = /^[0-9a-f:]+$/;
|
|
202
|
+
/**
|
|
203
|
+
* The one spelling of an address this module ever returns, or `null`.
|
|
204
|
+
*
|
|
205
|
+
* Normalization is not cosmetic. A rate-limit key is an exact string, so
|
|
206
|
+
* `2001:DB8::1` and `2001:db8::1`, or the same address with and without a
|
|
207
|
+
* source port, would be two budgets for one visitor — the bypass again, in
|
|
208
|
+
* miniature.
|
|
209
|
+
*
|
|
210
|
+
* - a port is dropped: it changes per connection,
|
|
211
|
+
* - `[…]` brackets and an IPv6 zone (`%eth0`) are dropped,
|
|
212
|
+
* - an IPv4-mapped IPv6 (`::ffff:1.2.3.4`) collapses to its IPv4 form, so a
|
|
213
|
+
* node socket address and a proxy's header value share one bucket,
|
|
214
|
+
* - anything that is not an address — `unknown`, RFC 7239's obfuscated
|
|
215
|
+
* `_hidden` identifiers, a hostname, a header some proxy passed through
|
|
216
|
+
* under this name — is `null` rather than a key.
|
|
217
|
+
*/ export function normalizeClientIp(raw) {
|
|
218
|
+
var _value_match;
|
|
219
|
+
let value = String(raw != null ? raw : '').trim().replace(/^"|"$/g, '').trim().toLowerCase();
|
|
220
|
+
if (!value) return null;
|
|
221
|
+
// RFC 7239 obfuscated identifiers are deliberately not addresses.
|
|
222
|
+
if (value.startsWith('_')) return null;
|
|
223
|
+
if (NOT_AN_ADDRESS.has(value)) return null;
|
|
224
|
+
if (value.startsWith('[')) {
|
|
225
|
+
// `[2001:db8::1]:443` — brackets exist precisely to make the port
|
|
226
|
+
// unambiguous, so this is the only form a port may be stripped from.
|
|
227
|
+
const close = value.indexOf(']');
|
|
228
|
+
if (close < 0) return null;
|
|
229
|
+
value = value.slice(1, close);
|
|
230
|
+
} else if (((_value_match = value.match(/:/g)) != null ? _value_match : []).length === 1) {
|
|
231
|
+
// Exactly one colon can only be `host:port`; a bare IPv6 has more.
|
|
232
|
+
value = value.slice(0, value.indexOf(':'));
|
|
233
|
+
}
|
|
234
|
+
// A zone index identifies a local interface, not a caller.
|
|
235
|
+
const zone = value.indexOf('%');
|
|
236
|
+
if (zone >= 0) value = value.slice(0, zone);
|
|
237
|
+
if (!value) return null;
|
|
238
|
+
const mapped = /^::ffff:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/.exec(value);
|
|
239
|
+
if (mapped) value = mapped[1];
|
|
240
|
+
const v4 = IPV4.exec(value);
|
|
241
|
+
if (v4) {
|
|
242
|
+
// `999.1.1.1` matches the shape and is not an address. Leading zeros are
|
|
243
|
+
// rejected with it: `010.0.0.1` and `10.0.0.1` are the same host to some
|
|
244
|
+
// resolvers and two different rate-limit keys here.
|
|
245
|
+
for(let i = 1; i <= 4; i += 1){
|
|
246
|
+
const octet = v4[i];
|
|
247
|
+
if (octet.length > 1 && octet.startsWith('0')) return null;
|
|
248
|
+
if (Number(octet) > 255) return null;
|
|
249
|
+
}
|
|
250
|
+
return value;
|
|
251
|
+
}
|
|
252
|
+
// Loose on IPv6 by design: the job is to reject text that is not an address,
|
|
253
|
+
// not to re-implement a parser. It must contain a colon to get here, so a
|
|
254
|
+
// hostname or a stray token cannot pass.
|
|
255
|
+
if (value.includes(':') && IPV6.test(value)) return value;
|
|
256
|
+
return null;
|
|
257
|
+
}
|
|
258
|
+
/** Split a comma-separated forwarding header into its raw entries. */ function entriesOf(value) {
|
|
259
|
+
return String(value != null ? value : '').split(',').map((entry)=>entry.trim()).filter(Boolean);
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* The entry a chain of `length` hops attributes to the client, at `depth`
|
|
263
|
+
* trusted proxies.
|
|
264
|
+
*
|
|
265
|
+
* Clamped when the chain is SHORTER than configured. That happens when an
|
|
266
|
+
* outer proxy overwrites rather than appends, and every entry of such a chain
|
|
267
|
+
* was still written by a trusted proxy — so the leftmost is the honest answer
|
|
268
|
+
* rather than a reason to refuse. It is not clamped at the other end: a chain
|
|
269
|
+
* LONGER than configured is the attack shape, and the extra entries on the
|
|
270
|
+
* left are exactly what must be ignored.
|
|
271
|
+
*/ function clientIndex(length, depth) {
|
|
272
|
+
return Math.max(0, length - depth);
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* The `for=` values of an RFC 7239 `Forwarded` header, left to right.
|
|
276
|
+
*
|
|
277
|
+
* Comma-splitting is a simplification: a quoted `for=` value may in principle
|
|
278
|
+
* contain a comma. No proxy in the wild emits one, and the alternative is a
|
|
279
|
+
* full parameter parser for a header that is the third fallback here.
|
|
280
|
+
*/ function forwardedEntries(value) {
|
|
281
|
+
const out = [];
|
|
282
|
+
for (const element of entriesOf(value)){
|
|
283
|
+
for (const param of element.split(';')){
|
|
284
|
+
const [name, ...rest] = param.split('=');
|
|
285
|
+
if (name.trim().toLowerCase() !== 'for') continue;
|
|
286
|
+
out.push(rest.join('=').trim());
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
return out;
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* The caller's address, or `null` when nothing readable identifies them.
|
|
294
|
+
*
|
|
295
|
+
* Sources in order, and the order is the security property: a reading that
|
|
296
|
+
* depends on the trusted depth always wins, and the single-valued fallbacks
|
|
297
|
+
* only apply when the chain reading produced nothing at all. A caller cannot
|
|
298
|
+
* demote the reader to a weaker source, because a proxy that writes
|
|
299
|
+
* `x-forwarded-for` writes it on every request — the fallbacks are reachable
|
|
300
|
+
* only on a deployment whose proxy sets something else, or on none.
|
|
301
|
+
*
|
|
302
|
+
* 1. the platform edge's own value, in platform mode,
|
|
303
|
+
* 2. `x-forwarded-for` at the trusted hop,
|
|
304
|
+
* 3. `x-real-ip`, single-valued and written by the proxy,
|
|
305
|
+
* 4. `Forwarded` (RFC 7239) at the trusted hop,
|
|
306
|
+
* 5. the transport peer, when the caller supplied one.
|
|
307
|
+
*/ export function readClientIp(headers, options = {}) {
|
|
308
|
+
const reader = readerFor(headers);
|
|
309
|
+
const depth = options.trustedProxyCount !== undefined ? options.trustedProxyCount : resolveTrustedProxyCount(options.env);
|
|
310
|
+
if (depth === null) {
|
|
311
|
+
const platform = normalizeClientIp(reader.get(PLATFORM_ADDRESS_HEADER));
|
|
312
|
+
if (platform) return platform;
|
|
313
|
+
}
|
|
314
|
+
// Depth 0 is "nothing is in front of me", so every forwarding header is
|
|
315
|
+
// caller-supplied and none of them may be read. Skipping straight to the
|
|
316
|
+
// peer is the whole point of offering the value.
|
|
317
|
+
if (depth !== 0) {
|
|
318
|
+
// In platform mode the edge presents one authoritative value, so the
|
|
319
|
+
// leftmost entry is the client — which is also, exactly, what every call
|
|
320
|
+
// site read before this module existed.
|
|
321
|
+
const hops = depth === null ? 1 : depth;
|
|
322
|
+
const forwardedFor = entriesOf(reader.get('x-forwarded-for'));
|
|
323
|
+
if (forwardedFor.length) {
|
|
324
|
+
const index = depth === null ? 0 : clientIndex(forwardedFor.length, hops);
|
|
325
|
+
// Deliberately does NOT slide to a neighbouring entry when the trusted
|
|
326
|
+
// hop is unreadable. Letting content choose the position is how a
|
|
327
|
+
// spoofer would push the reader back onto their own text; falling
|
|
328
|
+
// through to the next SOURCE cannot be steered that way.
|
|
329
|
+
const hop = normalizeClientIp(forwardedFor[index]);
|
|
330
|
+
if (hop) return hop;
|
|
331
|
+
}
|
|
332
|
+
const real = normalizeClientIp(reader.get('x-real-ip'));
|
|
333
|
+
if (real) return real;
|
|
334
|
+
const forwarded = forwardedEntries(reader.get('forwarded'));
|
|
335
|
+
if (forwarded.length) {
|
|
336
|
+
const index = depth === null ? 0 : clientIndex(forwarded.length, hops);
|
|
337
|
+
const hop = normalizeClientIp(forwarded[index]);
|
|
338
|
+
if (hop) return hop;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
return normalizeClientIp(options.remoteAddress);
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
//# sourceMappingURL=request-ip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/request-ip.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 client-address reader (AGL-2014).\n *\n * Sits beside `request-geo.ts` and does the same job for a different signal:\n * read a fact about the caller off the request, vendor-neutrally, and return\n * nothing rather than a guess when it cannot.\n *\n * ## The failure this exists for\n *\n * Roughly twenty call sites read `x-forwarded-for` and took element `[0]` as\n * the visitor's address. That is correct only where the edge OVERWRITES the\n * header. A default self-host does not overwrite it: nginx's\n * `$proxy_add_x_forwarded_for` and the usual Traefik/Caddy chains APPEND, so a\n * caller who sends `X-Forwarded-For: 1.2.3.4` arrives at the app as\n * `1.2.3.4, <their real address>` and element `[0]` is whatever they typed.\n *\n * Every rate limiter in the product keys on that value, so on a default Docker\n * install it was a rate-limit bypass by header: change one character per\n * request and every limiter hands out a fresh budget. Nothing errors and\n * nothing is logged. The same value is stored as clickwrap evidence and shown\n * to an account owner in a new-device sign-in alert, where a forged address is\n * durable rather than merely a bypass.\n *\n * Binding the containers to loopback in `docker-compose.yml` forces traffic\n * through the operator's proxy. It does not help here: the proxy appending is\n * exactly the case that remains.\n *\n * ## Which hop is the client\n *\n * With N appending proxies in front, the last N entries of `x-forwarded-for`\n * were written by those proxies and are the only ones a caller cannot forge.\n * The outermost trusted proxy wrote the address IT saw — the real client — so\n * the client is the Nth entry counted from the RIGHT, and everything to its\n * left is caller-supplied text that must be ignored.\n *\n * The count is the configuration, because it is the only thing the app cannot\n * work out for itself. It is deliberately not an index: an operator running\n * one reverse proxy sets `1`, and never has to reason about which end of the\n * list they are counting from.\n *\n * ## The default, and why it is not the same everywhere\n *\n * The two candidate defaults fail in opposite directions. Trusting the\n * LEFTMOST hop keeps Aglyn's own cloud correct and leaves every self-host\n * spoofable. Trusting the RIGHTMOST keeps self-hosts correct and would be a\n * silent behavior change on Aglyn's own production.\n *\n * Neither has to be guessed, because the platform can be detected. Vercel sets\n * `VERCEL` in the runtime environment — the same signal `deployment-shape.ts`\n * already keys on — and it terminates every request at its own edge. So:\n *\n * - **Platform detected** → platform mode. Read `x-vercel-forwarded-for`\n * first: Vercel computes it and strips any inbound copy, so on a Vercel\n * request it is the one address value a caller cannot influence. That is\n * the same trust `request-geo.ts` already places in `x-vercel-ip-country`\n * to run the sanctions gate, so it is not a new assumption. If it is\n * absent, fall back to the LEFTMOST `x-forwarded-for` hop, which is\n * precisely what every call site did before this module existed — so\n * nothing on Aglyn's deployment can read differently than it did.\n *\n * - **No platform detected** (a container, a bare Node process, a developer's\n * machine) → one trusted proxy, so the RIGHTMOST hop. That is correct for\n * both proxy styles at the depth the shipped `docker-compose.yml` describes:\n * an overwriting proxy leaves a single entry, where rightmost and leftmost\n * are the same value; an appending proxy leaves the real client last.\n *\n * An operator with more than one proxy in front sets the real number. Getting\n * that number too LOW names an intermediate proxy instead of the visitor,\n * which over-counts — several visitors share one bucket and the limiter\n * refuses sooner. Getting it too HIGH is the direction that matters, and it\n * cannot hand out a forged address here: a chain shorter than the configured\n * depth is clamped to its leftmost entry, and every entry of such a chain was\n * still written by a trusted proxy.\n *\n * ## What this will not do\n *\n * ⛔ It never invents an address. When nothing readable is present the answer\n * is `null` and the caller decides. Returning a placeholder like `'unknown'`\n * would put every anonymous caller in one rate-limit bucket, which is a denial\n * of service the limiter inflicts on itself.\n *\n * ⛔ No trusted-CIDR matching. A hop count answers the same question with\n * configuration an operator can actually get right, and a CIDR list that is\n * subtly wrong fails open in exactly the way this module exists to prevent.\n *\n * ⛔ Not for an edge bundle as written. `AGLYN_TRUSTED_PROXY_COUNT` is read\n * from `process.env` at call time, so it is a genuine runtime variable an\n * operator can change without rebuilding — unlike the geo header names, which\n * `apps/console/middleware.ts` drags into the edge bundle and which therefore\n * have to be mapped through `next.config.js` and fixed at build. Nothing\n * reads an address in middleware today. Anything that starts to must map the\n * variable through both `next.config.js` files first, or the edge will read\n * `undefined` and silently fall back to the default.\n */\n\nimport type { HeaderReader } from './request-geo'\n\n/** The environment variable naming how many proxies sit in front of the app. */\nexport const TRUSTED_PROXY_COUNT_VAR = 'AGLYN_TRUSTED_PROXY_COUNT'\n\n/**\n * The trusted depth assumed when nothing is configured and no platform edge is\n * detected: one reverse proxy, which is the shape `docker-compose.yml` and the\n * self-hosting runbook describe.\n */\nexport const DEFAULT_TRUSTED_PROXY_COUNT = 1\n\n/**\n * `null` means \"a platform edge normalizes the header, trust what it presents\".\n * A number is a literal count of proxies in front, and `0` means none — a\n * process reachable directly from the internet, where every forwarding header\n * is caller-supplied text and only the transport peer is a fact.\n */\nexport type TrustedProxyDepth = number | null\n\n/**\n * The key fragment a control uses when it has no address and cannot simply\n * skip — and the decision every caller of {@link readClientIp} has to make.\n *\n * Most address-keyed controls in this codebase SKIP when the address is\n * `null`. A budget keyed on a placeholder is one budget shared by everybody,\n * so a deployment whose proxy names no caller would refuse password resets,\n * sign-ins, org creation and site creation for all of its users at once — a\n * denial of service the limiter inflicts on itself, and a worse outcome than\n * the control not running on a deployment that cannot identify anybody. Those\n * controls each have a second key — a uid, an email address, a site — that\n * still applies.\n *\n * The exception is a control whose job is COST rather than identity: the\n * unauthenticated beacons and the pre-auth REST budget bound how much\n * unauthenticated work a stranger can cause, they answer the same way whether\n * or not the limit bites, and they have no second key. Skipping those would\n * leave an unauthenticated Firestore writer unbounded on exactly the\n * misconfigured deployment that produced the missing address. They keep\n * counting, under this bucket, which costs telemetry rather than service.\n *\n * Spelled so it cannot be mistaken for an address, and reached only when NO\n * source produced one — not merely when `x-forwarded-for` was absent.\n */\nexport const NO_CLIENT_ADDRESS_BUCKET = 'no-address'\n\n/** Node-style header records alongside a `Headers`-shaped reader. */\nexport type ClientIpHeaders =\n | HeaderReader\n | Record<string, string | string[] | undefined>\n\nexport interface ClientIpOptions {\n /**\n * Overrides the configured depth. Tests pass this; production code should\n * not, so an operator's configuration is the only thing that decides.\n */\n trustedProxyCount?: TrustedProxyDepth\n /**\n * The transport peer — `req.socket.remoteAddress` on a node-style handler.\n * Consulted last, and only because it is the one address the process knows\n * first-hand. Behind a proxy that sets no forwarding header at all it is the\n * proxy's own address, which is a single shared bucket rather than a\n * visitor; that is a misconfiguration the self-hosting docs name, not a\n * reading this module can improve on.\n */\n remoteAddress?: string | null\n /** Injectable for tests; defaults to `process.env`. */\n env?: Record<string, string | undefined>\n}\n\n/**\n * An upper bound on a configured depth, so a typo cannot express a chain\n * nobody runs. Past this the value is treated as unset rather than obeyed.\n */\nconst MAX_TRUSTED_PROXIES = 32\n\n/**\n * How many proxies to trust, from configuration or from the runtime.\n *\n * Read per call rather than frozen at module scope: this is a runtime\n * variable, and a module-scope snapshot would make it unchangeable without a\n * rebuild for no reason (see the edge-bundle note in the module comment).\n */\nexport function resolveTrustedProxyCount(\n env: Record<string, string | undefined> = process.env,\n): TrustedProxyDepth {\n const raw = String(env[TRUSTED_PROXY_COUNT_VAR] ?? '').trim()\n if (raw) {\n // Whole, non-negative, and small. A junk value must not silently become a\n // depth: `NaN` would compare false everywhere and quietly read the\n // leftmost hop, which is the bypass this module exists to close.\n const parsed = Number(raw)\n if (Number.isInteger(parsed) && parsed >= 0 && parsed <= MAX_TRUSTED_PROXIES) {\n return parsed\n }\n }\n // The platform's own edge. Detected, not guessed — and detected from the\n // runtime environment rather than from the presence of a `x-vercel-*`\n // header, which an operator's proxy could pass through from a caller.\n if (env['VERCEL']) return null\n return DEFAULT_TRUSTED_PROXY_COUNT\n}\n\n/**\n * The address Vercel computed for the caller.\n *\n * Vercel sets every `x-vercel-*` header itself and overwrites any inbound\n * copy, so on a Vercel request this is not caller-supplied. It is read only\n * in platform mode, so an operator's proxy forwarding a forged\n * `x-vercel-forwarded-for` reaches nothing.\n */\nconst PLATFORM_ADDRESS_HEADER = 'x-vercel-forwarded-for'\n\n/** Wrap either header shape in the `Headers`-like reader the rest uses. */\nfunction readerFor(headers: ClientIpHeaders): HeaderReader {\n if (typeof (headers as HeaderReader)?.get === 'function') {\n return headers as HeaderReader\n }\n const record = (headers ?? {}) as Record<string, string | string[] | undefined>\n const lowered: Record<string, string> = {}\n for (const [key, value] of Object.entries(record)) {\n if (value === undefined) continue\n // A repeated header arrives as an array in node. Joining with `,` restores\n // the single-list form `Headers.get` would have produced, so the hop\n // arithmetic below counts the same entries either way.\n lowered[key.toLowerCase()] = Array.isArray(value) ? value.join(',') : String(value)\n }\n return { get: (name: string) => lowered[name.toLowerCase()] ?? null }\n}\n\n/** RFC 7239 says an unresolvable node is `unknown`; squid writes it too. */\nconst NOT_AN_ADDRESS = new Set(['unknown', 'null', 'undefined'])\n\nconst IPV4 = /^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$/\nconst IPV6 = /^[0-9a-f:]+$/\n\n/**\n * The one spelling of an address this module ever returns, or `null`.\n *\n * Normalization is not cosmetic. A rate-limit key is an exact string, so\n * `2001:DB8::1` and `2001:db8::1`, or the same address with and without a\n * source port, would be two budgets for one visitor — the bypass again, in\n * miniature.\n *\n * - a port is dropped: it changes per connection,\n * - `[…]` brackets and an IPv6 zone (`%eth0`) are dropped,\n * - an IPv4-mapped IPv6 (`::ffff:1.2.3.4`) collapses to its IPv4 form, so a\n * node socket address and a proxy's header value share one bucket,\n * - anything that is not an address — `unknown`, RFC 7239's obfuscated\n * `_hidden` identifiers, a hostname, a header some proxy passed through\n * under this name — is `null` rather than a key.\n */\nexport function normalizeClientIp(raw: string | null | undefined): string | null {\n let value = String(raw ?? '')\n .trim()\n .replace(/^\"|\"$/g, '')\n .trim()\n .toLowerCase()\n if (!value) return null\n // RFC 7239 obfuscated identifiers are deliberately not addresses.\n if (value.startsWith('_')) return null\n if (NOT_AN_ADDRESS.has(value)) return null\n\n if (value.startsWith('[')) {\n // `[2001:db8::1]:443` — brackets exist precisely to make the port\n // unambiguous, so this is the only form a port may be stripped from.\n const close = value.indexOf(']')\n if (close < 0) return null\n value = value.slice(1, close)\n } else if ((value.match(/:/g) ?? []).length === 1) {\n // Exactly one colon can only be `host:port`; a bare IPv6 has more.\n value = value.slice(0, value.indexOf(':'))\n }\n\n // A zone index identifies a local interface, not a caller.\n const zone = value.indexOf('%')\n if (zone >= 0) value = value.slice(0, zone)\n if (!value) return null\n\n const mapped = /^::ffff:(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/.exec(value)\n if (mapped) value = mapped[1]\n\n const v4 = IPV4.exec(value)\n if (v4) {\n // `999.1.1.1` matches the shape and is not an address. Leading zeros are\n // rejected with it: `010.0.0.1` and `10.0.0.1` are the same host to some\n // resolvers and two different rate-limit keys here.\n for (let i = 1; i <= 4; i += 1) {\n const octet = v4[i]\n if (octet.length > 1 && octet.startsWith('0')) return null\n if (Number(octet) > 255) return null\n }\n return value\n }\n // Loose on IPv6 by design: the job is to reject text that is not an address,\n // not to re-implement a parser. It must contain a colon to get here, so a\n // hostname or a stray token cannot pass.\n if (value.includes(':') && IPV6.test(value)) return value\n return null\n}\n\n/** Split a comma-separated forwarding header into its raw entries. */\nfunction entriesOf(value: string | null): string[] {\n return String(value ?? '')\n .split(',')\n .map((entry) => entry.trim())\n .filter(Boolean)\n}\n\n/**\n * The entry a chain of `length` hops attributes to the client, at `depth`\n * trusted proxies.\n *\n * Clamped when the chain is SHORTER than configured. That happens when an\n * outer proxy overwrites rather than appends, and every entry of such a chain\n * was still written by a trusted proxy — so the leftmost is the honest answer\n * rather than a reason to refuse. It is not clamped at the other end: a chain\n * LONGER than configured is the attack shape, and the extra entries on the\n * left are exactly what must be ignored.\n */\nfunction clientIndex(length: number, depth: number): number {\n return Math.max(0, length - depth)\n}\n\n/**\n * The `for=` values of an RFC 7239 `Forwarded` header, left to right.\n *\n * Comma-splitting is a simplification: a quoted `for=` value may in principle\n * contain a comma. No proxy in the wild emits one, and the alternative is a\n * full parameter parser for a header that is the third fallback here.\n */\nfunction forwardedEntries(value: string | null): string[] {\n const out: string[] = []\n for (const element of entriesOf(value)) {\n for (const param of element.split(';')) {\n const [name, ...rest] = param.split('=')\n if (name.trim().toLowerCase() !== 'for') continue\n out.push(rest.join('=').trim())\n break\n }\n }\n return out\n}\n\n/**\n * The caller's address, or `null` when nothing readable identifies them.\n *\n * Sources in order, and the order is the security property: a reading that\n * depends on the trusted depth always wins, and the single-valued fallbacks\n * only apply when the chain reading produced nothing at all. A caller cannot\n * demote the reader to a weaker source, because a proxy that writes\n * `x-forwarded-for` writes it on every request — the fallbacks are reachable\n * only on a deployment whose proxy sets something else, or on none.\n *\n * 1. the platform edge's own value, in platform mode,\n * 2. `x-forwarded-for` at the trusted hop,\n * 3. `x-real-ip`, single-valued and written by the proxy,\n * 4. `Forwarded` (RFC 7239) at the trusted hop,\n * 5. the transport peer, when the caller supplied one.\n */\nexport function readClientIp(\n headers: ClientIpHeaders,\n options: ClientIpOptions = {},\n): string | null {\n const reader = readerFor(headers)\n const depth =\n options.trustedProxyCount !== undefined\n ? options.trustedProxyCount\n : resolveTrustedProxyCount(options.env)\n\n if (depth === null) {\n const platform = normalizeClientIp(reader.get(PLATFORM_ADDRESS_HEADER))\n if (platform) return platform\n }\n\n // Depth 0 is \"nothing is in front of me\", so every forwarding header is\n // caller-supplied and none of them may be read. Skipping straight to the\n // peer is the whole point of offering the value.\n if (depth !== 0) {\n // In platform mode the edge presents one authoritative value, so the\n // leftmost entry is the client — which is also, exactly, what every call\n // site read before this module existed.\n const hops = depth === null ? 1 : depth\n\n const forwardedFor = entriesOf(reader.get('x-forwarded-for'))\n if (forwardedFor.length) {\n const index = depth === null ? 0 : clientIndex(forwardedFor.length, hops)\n // Deliberately does NOT slide to a neighbouring entry when the trusted\n // hop is unreadable. Letting content choose the position is how a\n // spoofer would push the reader back onto their own text; falling\n // through to the next SOURCE cannot be steered that way.\n const hop = normalizeClientIp(forwardedFor[index])\n if (hop) return hop\n }\n\n const real = normalizeClientIp(reader.get('x-real-ip'))\n if (real) return real\n\n const forwarded = forwardedEntries(reader.get('forwarded'))\n if (forwarded.length) {\n const index = depth === null ? 0 : clientIndex(forwarded.length, hops)\n const hop = normalizeClientIp(forwarded[index])\n if (hop) return hop\n }\n }\n\n return normalizeClientIp(options.remoteAddress)\n}\n"],"names":["TRUSTED_PROXY_COUNT_VAR","DEFAULT_TRUSTED_PROXY_COUNT","NO_CLIENT_ADDRESS_BUCKET","MAX_TRUSTED_PROXIES","resolveTrustedProxyCount","env","process","raw","String","trim","parsed","Number","isInteger","PLATFORM_ADDRESS_HEADER","readerFor","headers","get","record","lowered","key","value","Object","entries","undefined","toLowerCase","Array","isArray","join","name","NOT_AN_ADDRESS","Set","IPV4","IPV6","normalizeClientIp","replace","startsWith","has","close","indexOf","slice","match","length","zone","mapped","exec","v4","i","octet","includes","test","entriesOf","split","map","entry","filter","Boolean","clientIndex","depth","Math","max","forwardedEntries","out","element","param","rest","push","readClientIp","options","reader","trustedProxyCount","platform","hops","forwardedFor","index","hop","real","forwarded","remoteAddress"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6FC,GAID,8EAA8E,GAC9E,OAAO,MAAMA,0BAA0B,4BAA2B;AAElE;;;;CAIC,GACD,OAAO,MAAMC,8BAA8B,EAAC;AAU5C;;;;;;;;;;;;;;;;;;;;;;;CAuBC,GACD,OAAO,MAAMC,2BAA2B,aAAY;AA0BpD;;;CAGC,GACD,MAAMC,sBAAsB;AAE5B;;;;;;CAMC,GACD,OAAO,SAASC,yBACdC,MAA0CC,QAAQD,GAAG;QAElCA;IAAnB,MAAME,MAAMC,QAAOH,+BAAAA,GAAG,CAACL,wBAAwB,YAA5BK,+BAAgC,IAAII,IAAI;IAC3D,IAAIF,KAAK;QACP,0EAA0E;QAC1E,mEAAmE;QACnE,iEAAiE;QACjE,MAAMG,SAASC,OAAOJ;QACtB,IAAII,OAAOC,SAAS,CAACF,WAAWA,UAAU,KAAKA,UAAUP,qBAAqB;YAC5E,OAAOO;QACT;IACF;IACA,yEAAyE;IACzE,sEAAsE;IACtE,sEAAsE;IACtE,IAAIL,GAAG,CAAC,SAAS,EAAE,OAAO;IAC1B,OAAOJ;AACT;AAEA;;;;;;;CAOC,GACD,MAAMY,0BAA0B;AAEhC,yEAAyE,GACzE,SAASC,UAAUC,OAAwB;IACzC,IAAI,QAAQA,2BAAD,AAACA,QAA0BC,GAAG,MAAK,YAAY;QACxD,OAAOD;IACT;IACA,MAAME,SAAUF,kBAAAA,UAAW,CAAC;IAC5B,MAAMG,UAAkC,CAAC;IACzC,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAOC,OAAO,CAACL,QAAS;QACjD,IAAIG,UAAUG,WAAW;QACzB,2EAA2E;QAC3E,qEAAqE;QACrE,uDAAuD;QACvDL,OAAO,CAACC,IAAIK,WAAW,GAAG,GAAGC,MAAMC,OAAO,CAACN,SAASA,MAAMO,IAAI,CAAC,OAAOnB,OAAOY;IAC/E;IACA,OAAO;QAAEJ,KAAK,CAACY;gBAAiBV;oBAAAA,4BAAAA,OAAO,CAACU,KAAKJ,WAAW,GAAG,YAA3BN,4BAA+B;;IAAK;AACtE;AAEA,0EAA0E,GAC1E,MAAMW,iBAAiB,IAAIC,IAAI;IAAC;IAAW;IAAQ;CAAY;AAE/D,MAAMC,OAAO;AACb,MAAMC,OAAO;AAEb;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASC,kBAAkB1B,GAA8B;QAiBlDa;IAhBZ,IAAIA,QAAQZ,OAAOD,cAAAA,MAAO,IACvBE,IAAI,GACJyB,OAAO,CAAC,UAAU,IAClBzB,IAAI,GACJe,WAAW;IACd,IAAI,CAACJ,OAAO,OAAO;IACnB,kEAAkE;IAClE,IAAIA,MAAMe,UAAU,CAAC,MAAM,OAAO;IAClC,IAAIN,eAAeO,GAAG,CAAChB,QAAQ,OAAO;IAEtC,IAAIA,MAAMe,UAAU,CAAC,MAAM;QACzB,kEAAkE;QAClE,qEAAqE;QACrE,MAAME,QAAQjB,MAAMkB,OAAO,CAAC;QAC5B,IAAID,QAAQ,GAAG,OAAO;QACtBjB,QAAQA,MAAMmB,KAAK,CAAC,GAAGF;IACzB,OAAO,IAAI,EAACjB,eAAAA,MAAMoB,KAAK,CAAC,iBAAZpB,eAAqB,EAAE,EAAEqB,MAAM,KAAK,GAAG;QACjD,mEAAmE;QACnErB,QAAQA,MAAMmB,KAAK,CAAC,GAAGnB,MAAMkB,OAAO,CAAC;IACvC;IAEA,2DAA2D;IAC3D,MAAMI,OAAOtB,MAAMkB,OAAO,CAAC;IAC3B,IAAII,QAAQ,GAAGtB,QAAQA,MAAMmB,KAAK,CAAC,GAAGG;IACtC,IAAI,CAACtB,OAAO,OAAO;IAEnB,MAAMuB,SAAS,gDAAgDC,IAAI,CAACxB;IACpE,IAAIuB,QAAQvB,QAAQuB,MAAM,CAAC,EAAE;IAE7B,MAAME,KAAKd,KAAKa,IAAI,CAACxB;IACrB,IAAIyB,IAAI;QACN,yEAAyE;QACzE,yEAAyE;QACzE,oDAAoD;QACpD,IAAK,IAAIC,IAAI,GAAGA,KAAK,GAAGA,KAAK,EAAG;YAC9B,MAAMC,QAAQF,EAAE,CAACC,EAAE;YACnB,IAAIC,MAAMN,MAAM,GAAG,KAAKM,MAAMZ,UAAU,CAAC,MAAM,OAAO;YACtD,IAAIxB,OAAOoC,SAAS,KAAK,OAAO;QAClC;QACA,OAAO3B;IACT;IACA,6EAA6E;IAC7E,0EAA0E;IAC1E,yCAAyC;IACzC,IAAIA,MAAM4B,QAAQ,CAAC,QAAQhB,KAAKiB,IAAI,CAAC7B,QAAQ,OAAOA;IACpD,OAAO;AACT;AAEA,oEAAoE,GACpE,SAAS8B,UAAU9B,KAAoB;IACrC,OAAOZ,OAAOY,gBAAAA,QAAS,IACpB+B,KAAK,CAAC,KACNC,GAAG,CAAC,CAACC,QAAUA,MAAM5C,IAAI,IACzB6C,MAAM,CAACC;AACZ;AAEA;;;;;;;;;;CAUC,GACD,SAASC,YAAYf,MAAc,EAAEgB,KAAa;IAChD,OAAOC,KAAKC,GAAG,CAAC,GAAGlB,SAASgB;AAC9B;AAEA;;;;;;CAMC,GACD,SAASG,iBAAiBxC,KAAoB;IAC5C,MAAMyC,MAAgB,EAAE;IACxB,KAAK,MAAMC,WAAWZ,UAAU9B,OAAQ;QACtC,KAAK,MAAM2C,SAASD,QAAQX,KAAK,CAAC,KAAM;YACtC,MAAM,CAACvB,MAAM,GAAGoC,KAAK,GAAGD,MAAMZ,KAAK,CAAC;YACpC,IAAIvB,KAAKnB,IAAI,GAAGe,WAAW,OAAO,OAAO;YACzCqC,IAAII,IAAI,CAACD,KAAKrC,IAAI,CAAC,KAAKlB,IAAI;YAC5B;QACF;IACF;IACA,OAAOoD;AACT;AAEA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASK,aACdnD,OAAwB,EACxBoD,UAA2B,CAAC,CAAC;IAE7B,MAAMC,SAAStD,UAAUC;IACzB,MAAM0C,QACJU,QAAQE,iBAAiB,KAAK9C,YAC1B4C,QAAQE,iBAAiB,GACzBjE,yBAAyB+D,QAAQ9D,GAAG;IAE1C,IAAIoD,UAAU,MAAM;QAClB,MAAMa,WAAWrC,kBAAkBmC,OAAOpD,GAAG,CAACH;QAC9C,IAAIyD,UAAU,OAAOA;IACvB;IAEA,wEAAwE;IACxE,yEAAyE;IACzE,iDAAiD;IACjD,IAAIb,UAAU,GAAG;QACf,qEAAqE;QACrE,yEAAyE;QACzE,wCAAwC;QACxC,MAAMc,OAAOd,UAAU,OAAO,IAAIA;QAElC,MAAMe,eAAetB,UAAUkB,OAAOpD,GAAG,CAAC;QAC1C,IAAIwD,aAAa/B,MAAM,EAAE;YACvB,MAAMgC,QAAQhB,UAAU,OAAO,IAAID,YAAYgB,aAAa/B,MAAM,EAAE8B;YACpE,uEAAuE;YACvE,kEAAkE;YAClE,kEAAkE;YAClE,yDAAyD;YACzD,MAAMG,MAAMzC,kBAAkBuC,YAAY,CAACC,MAAM;YACjD,IAAIC,KAAK,OAAOA;QAClB;QAEA,MAAMC,OAAO1C,kBAAkBmC,OAAOpD,GAAG,CAAC;QAC1C,IAAI2D,MAAM,OAAOA;QAEjB,MAAMC,YAAYhB,iBAAiBQ,OAAOpD,GAAG,CAAC;QAC9C,IAAI4D,UAAUnC,MAAM,EAAE;YACpB,MAAMgC,QAAQhB,UAAU,OAAO,IAAID,YAAYoB,UAAUnC,MAAM,EAAE8B;YACjE,MAAMG,MAAMzC,kBAAkB2C,SAAS,CAACH,MAAM;YAC9C,IAAIC,KAAK,OAAOA;QAClB;IACF;IAEA,OAAOzC,kBAAkBkC,QAAQU,aAAa;AAChD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
import type { AglynNodeSchema, NodeId } from '../foundation';
|
|
18
|
+
/**
|
|
19
|
+
* Named-token substitution (AGL-105): replaces `{{name}}` occurrences in
|
|
20
|
+
* every node's string props with the provided values — used for
|
|
21
|
+
* entry-template screens where the tenant injects `entry.title`,
|
|
22
|
+
* `entry.body`, etc. Only the provided names are touched, so host variable
|
|
23
|
+
* and function tokens pass through to the regular binding resolver.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveNamedTokens<N extends AglynNodeSchema = AglynNodeSchema>(nodes: Record<NodeId, N>, tokens: Record<string, string> | null | undefined): Record<NodeId, N>;
|
|
26
|
+
export default resolveNamedTokens;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
17
|
+
function escapeRegExp(value) {
|
|
18
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
19
|
+
}
|
|
20
|
+
function substitute(value, pattern, tokens) {
|
|
21
|
+
if (typeof value === 'string') {
|
|
22
|
+
return value.replace(pattern, (_, name)=>{
|
|
23
|
+
var _tokens_name;
|
|
24
|
+
return (_tokens_name = tokens[name]) != null ? _tokens_name : '';
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
if (Array.isArray(value)) {
|
|
28
|
+
return value.map((entry)=>substitute(entry, pattern, tokens));
|
|
29
|
+
}
|
|
30
|
+
if (value && typeof value === 'object') {
|
|
31
|
+
const next = {};
|
|
32
|
+
for (const [key, entry] of Object.entries(value)){
|
|
33
|
+
next[key] = substitute(entry, pattern, tokens);
|
|
34
|
+
}
|
|
35
|
+
return next;
|
|
36
|
+
}
|
|
37
|
+
return value;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Named-token substitution (AGL-105): replaces `{{name}}` occurrences in
|
|
41
|
+
* every node's string props with the provided values — used for
|
|
42
|
+
* entry-template screens where the tenant injects `entry.title`,
|
|
43
|
+
* `entry.body`, etc. Only the provided names are touched, so host variable
|
|
44
|
+
* and function tokens pass through to the regular binding resolver.
|
|
45
|
+
*/ export function resolveNamedTokens(nodes, tokens) {
|
|
46
|
+
const names = Object.keys(tokens != null ? tokens : {});
|
|
47
|
+
if (!tokens || names.length === 0) return nodes;
|
|
48
|
+
const pattern = new RegExp(`\\{\\{\\s*(${names.map(escapeRegExp).join('|')})\\s*\\}\\}`, 'g');
|
|
49
|
+
const next = {};
|
|
50
|
+
for (const [id, node] of Object.entries(nodes)){
|
|
51
|
+
next[id] = (node == null ? void 0 : node.props) ? _extends({}, node, {
|
|
52
|
+
props: substitute(node.props, pattern, tokens)
|
|
53
|
+
}) : node;
|
|
54
|
+
}
|
|
55
|
+
return next;
|
|
56
|
+
}
|
|
57
|
+
export default resolveNamedTokens;
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=resolve-named-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/resolve-named-tokens.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { AglynNodeSchema, NodeId } from '../foundation'\n\nfunction escapeRegExp(value: string) {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nfunction substitute(value: unknown, pattern: RegExp, tokens: Record<string, string>): unknown {\n if (typeof value === 'string') {\n return value.replace(pattern, (_, name: string) => tokens[name] ?? '')\n }\n if (Array.isArray(value)) {\n return value.map((entry) => substitute(entry, pattern, tokens))\n }\n if (value && typeof value === 'object') {\n const next: Record<string, unknown> = {}\n for (const [key, entry] of Object.entries(value)) {\n next[key] = substitute(entry, pattern, tokens)\n }\n return next\n }\n return value\n}\n\n/**\n * Named-token substitution (AGL-105): replaces `{{name}}` occurrences in\n * every node's string props with the provided values — used for\n * entry-template screens where the tenant injects `entry.title`,\n * `entry.body`, etc. Only the provided names are touched, so host variable\n * and function tokens pass through to the regular binding resolver.\n */\nexport function resolveNamedTokens<N extends AglynNodeSchema = AglynNodeSchema>(\n nodes: Record<NodeId, N>,\n tokens: Record<string, string> | null | undefined,\n): Record<NodeId, N> {\n const names = Object.keys(tokens ?? {})\n if (!tokens || names.length === 0) return nodes\n const pattern = new RegExp(\n `\\\\{\\\\{\\\\s*(${names.map(escapeRegExp).join('|')})\\\\s*\\\\}\\\\}`,\n 'g',\n )\n const next: Record<NodeId, N> = {}\n for (const [id, node] of Object.entries(nodes)) {\n next[id] = node?.props\n ? { ...node, props: substitute(node.props, pattern, tokens) as any }\n : node\n }\n return next\n}\n\nexport default resolveNamedTokens\n"],"names":["escapeRegExp","value","replace","substitute","pattern","tokens","_","name","Array","isArray","map","entry","next","key","Object","entries","resolveNamedTokens","nodes","names","keys","length","RegExp","join","id","node","props"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC;AAID,SAASA,aAAaC,KAAa;IACjC,OAAOA,MAAMC,OAAO,CAAC,uBAAuB;AAC9C;AAEA,SAASC,WAAWF,KAAc,EAAEG,OAAe,EAAEC,MAA8B;IACjF,IAAI,OAAOJ,UAAU,UAAU;QAC7B,OAAOA,MAAMC,OAAO,CAACE,SAAS,CAACE,GAAGC;gBAAiBF;oBAAAA,eAAAA,MAAM,CAACE,KAAK,YAAZF,eAAgB;;IACrE;IACA,IAAIG,MAAMC,OAAO,CAACR,QAAQ;QACxB,OAAOA,MAAMS,GAAG,CAAC,CAACC,QAAUR,WAAWQ,OAAOP,SAASC;IACzD;IACA,IAAIJ,SAAS,OAAOA,UAAU,UAAU;QACtC,MAAMW,OAAgC,CAAC;QACvC,KAAK,MAAM,CAACC,KAAKF,MAAM,IAAIG,OAAOC,OAAO,CAACd,OAAQ;YAChDW,IAAI,CAACC,IAAI,GAAGV,WAAWQ,OAAOP,SAASC;QACzC;QACA,OAAOO;IACT;IACA,OAAOX;AACT;AAEA;;;;;;CAMC,GACD,OAAO,SAASe,mBACdC,KAAwB,EACxBZ,MAAiD;IAEjD,MAAMa,QAAQJ,OAAOK,IAAI,CAACd,iBAAAA,SAAU,CAAC;IACrC,IAAI,CAACA,UAAUa,MAAME,MAAM,KAAK,GAAG,OAAOH;IAC1C,MAAMb,UAAU,IAAIiB,OAClB,CAAC,WAAW,EAAEH,MAAMR,GAAG,CAACV,cAAcsB,IAAI,CAAC,KAAK,WAAW,CAAC,EAC5D;IAEF,MAAMV,OAA0B,CAAC;IACjC,KAAK,MAAM,CAACW,IAAIC,KAAK,IAAIV,OAAOC,OAAO,CAACE,OAAQ;QAC9CL,IAAI,CAACW,GAAG,GAAGC,CAAAA,wBAAAA,KAAMC,KAAK,IAClB,aAAKD;YAAMC,OAAOtB,WAAWqB,KAAKC,KAAK,EAAErB,SAASC;aAClDmB;IACN;IACA,OAAOZ;AACT;AAEA,eAAeI,mBAAkB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
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
|
+
* A Styles-panel font size must beat the theme's responsive type ramp.
|
|
19
|
+
*
|
|
20
|
+
* `createResponsiveTheme` finishes with MUI's `responsiveFontSizes`, which
|
|
21
|
+
* bakes a per-breakpoint `fontSize` into each ramped typography VARIANT as
|
|
22
|
+
* literal `@media (min-width:…px)` keys. Emotion serialises a style object's
|
|
23
|
+
* plain properties before its at-rules, and the variant is serialised before
|
|
24
|
+
* the `sx` prop, so the emitted rule for one element reads:
|
|
25
|
+
*
|
|
26
|
+
* ```css
|
|
27
|
+
* .css-x { font-size: 1.5625rem; …… font-size: 44px; } ← variant, then sx
|
|
28
|
+
* @media (min-width:1536px) { .css-x { font-size: 2.125rem; } } ← variant ramp
|
|
29
|
+
* ```
|
|
30
|
+
*
|
|
31
|
+
* Both declarations sit on the same class, so the LAST one wins — and the
|
|
32
|
+
* variant's ramp is last. An author who typed 44 into Font Size at "all
|
|
33
|
+
* screen sizes" got 34px on a desktop viewport, with nothing in the panel
|
|
34
|
+
* to explain it. The value was stored correctly and reported correctly; only
|
|
35
|
+
* the cascade disagreed.
|
|
36
|
+
*
|
|
37
|
+
* The canvas never showed the bug, which is why it survived: the besigner
|
|
38
|
+
* renders through `createDevicePinnedTheme`, which flattens every variant's
|
|
39
|
+
* media keys at the artboard width before the leaf mounts. So the ramp was
|
|
40
|
+
* already gone there and the author's value won — the editor and the
|
|
41
|
+
* published page genuinely disagreed.
|
|
42
|
+
*
|
|
43
|
+
* The fix is one line of cascade position, not a new precedence rule: a
|
|
44
|
+
* scalar `fontSize` is re-expressed as `{ xs: value }`. `xs` is `min-width:0`
|
|
45
|
+
* and therefore always matches, so the RESOLVED value is unchanged for every
|
|
46
|
+
* viewport; it simply moves the declaration out of the base block and into an
|
|
47
|
+
* at-rule that Emotion emits after the variant's, restoring "the author's
|
|
48
|
+
* explicit choice wins". A `fontSize` the author already scoped per
|
|
49
|
+
* breakpoint is left exactly as written — those breakpoints are a deliberate
|
|
50
|
+
* ramp of their own and already sort after the variant.
|
|
51
|
+
*
|
|
52
|
+
* Scoped to the sx object's TOP level — the element's own styles, which are
|
|
53
|
+
* the only ones competing with the element's own variant. A `fontSize` nested
|
|
54
|
+
* under a descendant selector (`'& .price': { fontSize: 12 }`) is left alone:
|
|
55
|
+
* it is not in that contest, and rewriting it would grow the stylesheet for
|
|
56
|
+
* nothing.
|
|
57
|
+
*/
|
|
58
|
+
/**
|
|
59
|
+
* Typography properties `responsiveFontSizes` ramps, and therefore the ones
|
|
60
|
+
* whose author value can lose to a variant at-rule.
|
|
61
|
+
*
|
|
62
|
+
* `fontSize` alone: MUI's ramp only rewrites `fontSize`, and only aligns
|
|
63
|
+
* `lineHeight` when `disableAlign` is off AND the variant's line height is a
|
|
64
|
+
* unitless number — the console theme's ramped variants (h1–h3) all carry
|
|
65
|
+
* unitless line heights, and the emitted CSS carries no `line-height` inside
|
|
66
|
+
* the ramp's media queries. Adding properties here that the theme does not
|
|
67
|
+
* ramp would emit at-rules that change nothing.
|
|
68
|
+
*/
|
|
69
|
+
export declare const RAMPED_TYPOGRAPHY_PROPERTIES: readonly ["fontSize"];
|
|
70
|
+
/**
|
|
71
|
+
* Pins scalar ramped-typography values into the `xs` slice so they sort
|
|
72
|
+
* after the theme's variant ramp. Identity-preserving: an sx carrying no
|
|
73
|
+
* scalar `fontSize` comes back as the very same object, so the hot render
|
|
74
|
+
* path allocates nothing in the overwhelmingly common case.
|
|
75
|
+
*/
|
|
76
|
+
export declare function pinRampedTypographySx<T>(sx: T): T;
|
|
77
|
+
export default pinRampedTypographySx;
|