@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,102 @@
|
|
|
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
|
+
* Code running in our pages that no deployment of ours served (AGL-2786).
|
|
18
|
+
*
|
|
19
|
+
* Two collectors have to tell our code from somebody else's running inside
|
|
20
|
+
* the same document, and both answer it from a URL: the CSP collector off a
|
|
21
|
+
* violation's source or blocked URI, the error beacon off every frame of a
|
|
22
|
+
* stack. They read ONE list, because a second copy fails silently — a scheme
|
|
23
|
+
* learned in one place goes on paging from the other.
|
|
24
|
+
*
|
|
25
|
+
* Pure and framework-free: the beacon ships in every page's client bundle and
|
|
26
|
+
* the ingestion routes run the same rule on the server, so nothing here may
|
|
27
|
+
* reach `window` or a Node builtin.
|
|
28
|
+
*/ /**
|
|
29
|
+
* Schemes no deployment of ours serves a script from.
|
|
30
|
+
*
|
|
31
|
+
* - Extension content scripts, the overwhelming majority of CSP reports on
|
|
32
|
+
* any real deployment: `chrome-extension:`, `moz-extension:`,
|
|
33
|
+
* `safari-extension:`, `safari-web-extension:`, `edge-extension:`.
|
|
34
|
+
* - `webkit-masked-url:` — Safari's redaction of the same thing. Opaque, so
|
|
35
|
+
* it can never be actioned, and it arrives in volume.
|
|
36
|
+
* - `chrome:`, `resource:`, `asset:` — the browser's and the embedding app's
|
|
37
|
+
* own internals.
|
|
38
|
+
* - `iabjs:` — the scheme Meta's Facebook/Instagram Android in-app browser
|
|
39
|
+
* evaluates its own scripts under. Measured 2026-09-10 in `client-errors`:
|
|
40
|
+
* `Error invoking postMessage: Java object is gone`, every frame under
|
|
41
|
+
* `iabjs://navigation_performance_logger_android`, thrown by the webview's
|
|
42
|
+
* native bridge as the page unloaded.
|
|
43
|
+
*
|
|
44
|
+
* Schemes, not vendors or function names: a new webview adds a scheme at
|
|
45
|
+
* most, and nothing on this list can ever be ours.
|
|
46
|
+
*/ export const FOREIGN_SCRIPT_SCHEMES = [
|
|
47
|
+
'chrome-extension:',
|
|
48
|
+
'moz-extension:',
|
|
49
|
+
'safari-extension:',
|
|
50
|
+
'safari-web-extension:',
|
|
51
|
+
'edge-extension:',
|
|
52
|
+
'webkit-masked-url:',
|
|
53
|
+
'chrome:',
|
|
54
|
+
'resource:',
|
|
55
|
+
'asset:',
|
|
56
|
+
'iabjs:'
|
|
57
|
+
];
|
|
58
|
+
/** Is this URL under a scheme no deployment of ours serves? */ export function isForeignScriptUrl(value) {
|
|
59
|
+
const lowered = value.toLowerCase();
|
|
60
|
+
return FOREIGN_SCRIPT_SCHEMES.some((scheme)=>lowered.startsWith(scheme));
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Every URL a stack frame points at, whichever engine produced the stack.
|
|
64
|
+
*
|
|
65
|
+
* One pattern covers both formats because the frame's URL is always followed
|
|
66
|
+
* by `:line:col`: V8 writes `at fn (URL:1:2)` and `at URL:1:2`, WebKit and
|
|
67
|
+
* Firefox write `fn@URL:1:2` and `@URL:1:2`. Matching on the suffix rather
|
|
68
|
+
* than on the prefix means neither engine needs its own branch, and a format
|
|
69
|
+
* this code has never seen degrades to "no frames parsed" rather than to a
|
|
70
|
+
* wrong answer.
|
|
71
|
+
*
|
|
72
|
+
* ANY scheme, not a list of web ones. A frame the pattern cannot read does
|
|
73
|
+
* not parse, and a stack made only of such frames reads as "no frames" —
|
|
74
|
+
* which every caller treats as no evidence and keeps. That is how an
|
|
75
|
+
* `iabjs://` stack came to be reported as ours.
|
|
76
|
+
*/ export function stackFrameUrls(stack) {
|
|
77
|
+
const urls = [];
|
|
78
|
+
const frame = /([a-z][a-z0-9+.-]*:\/\/[^\s()]+?):\d+:\d+/gi;
|
|
79
|
+
let match;
|
|
80
|
+
while((match = frame.exec(stack)) !== null)urls.push(match[1]);
|
|
81
|
+
return urls;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Was every frame of this stack evaluated under a foreign scheme?
|
|
85
|
+
*
|
|
86
|
+
* ⚑ `every`, never `some`: injected code calling into ours is OUR bug the
|
|
87
|
+
* moment one of our frames is on the stack, so a single first-party frame —
|
|
88
|
+
* a served chunk, a CDN asset, the document itself — keeps the report.
|
|
89
|
+
*
|
|
90
|
+
* No frames parsed is not evidence of anything, so it is false.
|
|
91
|
+
*
|
|
92
|
+
* The document is NOT foreign here. The beacon also drops a stack whose
|
|
93
|
+
* frames are the document (see `isInjectedThirdPartyFrame`), but only for an
|
|
94
|
+
* uncaught error, in the browser, against the page's own URL. Anything
|
|
95
|
+
* reading a stack without that context must not guess.
|
|
96
|
+
*/ export function isForeignScriptStack(stack) {
|
|
97
|
+
const urls = stackFrameUrls(stack);
|
|
98
|
+
if (!urls.length) return false;
|
|
99
|
+
return urls.every((url)=>isForeignScriptUrl(url));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
//# sourceMappingURL=foreign-script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/foreign-script.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 * Code running in our pages that no deployment of ours served (AGL-2786).\n *\n * Two collectors have to tell our code from somebody else's running inside\n * the same document, and both answer it from a URL: the CSP collector off a\n * violation's source or blocked URI, the error beacon off every frame of a\n * stack. They read ONE list, because a second copy fails silently — a scheme\n * learned in one place goes on paging from the other.\n *\n * Pure and framework-free: the beacon ships in every page's client bundle and\n * the ingestion routes run the same rule on the server, so nothing here may\n * reach `window` or a Node builtin.\n */\n\n/**\n * Schemes no deployment of ours serves a script from.\n *\n * - Extension content scripts, the overwhelming majority of CSP reports on\n * any real deployment: `chrome-extension:`, `moz-extension:`,\n * `safari-extension:`, `safari-web-extension:`, `edge-extension:`.\n * - `webkit-masked-url:` — Safari's redaction of the same thing. Opaque, so\n * it can never be actioned, and it arrives in volume.\n * - `chrome:`, `resource:`, `asset:` — the browser's and the embedding app's\n * own internals.\n * - `iabjs:` — the scheme Meta's Facebook/Instagram Android in-app browser\n * evaluates its own scripts under. Measured 2026-09-10 in `client-errors`:\n * `Error invoking postMessage: Java object is gone`, every frame under\n * `iabjs://navigation_performance_logger_android`, thrown by the webview's\n * native bridge as the page unloaded.\n *\n * Schemes, not vendors or function names: a new webview adds a scheme at\n * most, and nothing on this list can ever be ours.\n */\nexport const FOREIGN_SCRIPT_SCHEMES: readonly string[] = [\n 'chrome-extension:',\n 'moz-extension:',\n 'safari-extension:',\n 'safari-web-extension:',\n 'edge-extension:',\n 'webkit-masked-url:',\n 'chrome:',\n 'resource:',\n 'asset:',\n 'iabjs:',\n]\n\n/** Is this URL under a scheme no deployment of ours serves? */\nexport function isForeignScriptUrl(value: string): boolean {\n const lowered = value.toLowerCase()\n return FOREIGN_SCRIPT_SCHEMES.some((scheme) => lowered.startsWith(scheme))\n}\n\n/**\n * Every URL a stack frame points at, whichever engine produced the stack.\n *\n * One pattern covers both formats because the frame's URL is always followed\n * by `:line:col`: V8 writes `at fn (URL:1:2)` and `at URL:1:2`, WebKit and\n * Firefox write `fn@URL:1:2` and `@URL:1:2`. Matching on the suffix rather\n * than on the prefix means neither engine needs its own branch, and a format\n * this code has never seen degrades to \"no frames parsed\" rather than to a\n * wrong answer.\n *\n * ANY scheme, not a list of web ones. A frame the pattern cannot read does\n * not parse, and a stack made only of such frames reads as \"no frames\" —\n * which every caller treats as no evidence and keeps. That is how an\n * `iabjs://` stack came to be reported as ours.\n */\nexport function stackFrameUrls(stack: string): string[] {\n const urls: string[] = []\n const frame = /([a-z][a-z0-9+.-]*:\\/\\/[^\\s()]+?):\\d+:\\d+/gi\n let match: RegExpExecArray | null\n while ((match = frame.exec(stack)) !== null) urls.push(match[1])\n return urls\n}\n\n/**\n * Was every frame of this stack evaluated under a foreign scheme?\n *\n * ⚑ `every`, never `some`: injected code calling into ours is OUR bug the\n * moment one of our frames is on the stack, so a single first-party frame —\n * a served chunk, a CDN asset, the document itself — keeps the report.\n *\n * No frames parsed is not evidence of anything, so it is false.\n *\n * The document is NOT foreign here. The beacon also drops a stack whose\n * frames are the document (see `isInjectedThirdPartyFrame`), but only for an\n * uncaught error, in the browser, against the page's own URL. Anything\n * reading a stack without that context must not guess.\n */\nexport function isForeignScriptStack(stack: string): boolean {\n const urls = stackFrameUrls(stack)\n if (!urls.length) return false\n return urls.every((url) => isForeignScriptUrl(url))\n}\n"],"names":["FOREIGN_SCRIPT_SCHEMES","isForeignScriptUrl","value","lowered","toLowerCase","some","scheme","startsWith","stackFrameUrls","stack","urls","frame","match","exec","push","isForeignScriptStack","length","every","url"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;CAYC,GAED;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,MAAMA,yBAA4C;IACvD;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAA;AAED,6DAA6D,GAC7D,OAAO,SAASC,mBAAmBC,KAAa;IAC9C,MAAMC,UAAUD,MAAME,WAAW;IACjC,OAAOJ,uBAAuBK,IAAI,CAAC,CAACC,SAAWH,QAAQI,UAAU,CAACD;AACpE;AAEA;;;;;;;;;;;;;;CAcC,GACD,OAAO,SAASE,eAAeC,KAAa;IAC1C,MAAMC,OAAiB,EAAE;IACzB,MAAMC,QAAQ;IACd,IAAIC;IACJ,MAAO,AAACA,CAAAA,QAAQD,MAAME,IAAI,CAACJ,MAAK,MAAO,KAAMC,KAAKI,IAAI,CAACF,KAAK,CAAC,EAAE;IAC/D,OAAOF;AACT;AAEA;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASK,qBAAqBN,KAAa;IAChD,MAAMC,OAAOF,eAAeC;IAC5B,IAAI,CAACC,KAAKM,MAAM,EAAE,OAAO;IACzB,OAAON,KAAKO,KAAK,CAAC,CAACC,MAAQjB,mBAAmBiB;AAChD"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* The two audiences of a tripped form-submission abuse ceiling (AGL-1666).
|
|
19
|
+
*
|
|
20
|
+
* AGL-1655 made the ceiling refuse correctly and bill nothing, but it refused
|
|
21
|
+
* into silence: the visitor got the component's generic "something went
|
|
22
|
+
* wrong" and the site's owner got a Firestore document. This module holds the
|
|
23
|
+
* words both of them see, in one place, because the two are constrained in
|
|
24
|
+
* OPPOSITE directions and a single file is the only way to keep that visible:
|
|
25
|
+
*
|
|
26
|
+
* - The **visitor** is a stranger to the site. They must be told plainly
|
|
27
|
+
* that their message did not arrive, and must NOT be told why — that this
|
|
28
|
+
* site passed an abuse threshold is the owner's business, not a caller's.
|
|
29
|
+
* - The **owner** needs exactly the withheld half: the count, the ceiling,
|
|
30
|
+
* and when it lifts.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* Refusal code carried by the abuse-ceiling 429 (AGL-1655).
|
|
34
|
+
*
|
|
35
|
+
* The Free plan's monthly wall answers 429 too, so the STATUS identifies
|
|
36
|
+
* nothing — this code is the whole discriminator, and one means "the customer
|
|
37
|
+
* needs a bigger plan" while the other means "this site is being flooded".
|
|
38
|
+
* Shared rather than restated so the producer and the consumer cannot drift.
|
|
39
|
+
*/
|
|
40
|
+
export declare const FORM_ABUSE_CEILING_CODE = "form-abuse-ceiling";
|
|
41
|
+
/**
|
|
42
|
+
* The month key both the billable counter and the refusal counter are keyed
|
|
43
|
+
* by. UTC, matching the month boundary the ceiling resets on.
|
|
44
|
+
*/
|
|
45
|
+
export declare function submissionMonthKey(now?: Date): string;
|
|
46
|
+
/** What the visitor is shown when a site's form is not accepting. */
|
|
47
|
+
export interface FormUnavailableNotice {
|
|
48
|
+
/** The whole message. Fixed copy — never the server's terse `error`. */
|
|
49
|
+
message: string;
|
|
50
|
+
/**
|
|
51
|
+
* An alternative way to reach the site, when the site publishes one
|
|
52
|
+
* (`business.supportEmail`, the token whose own description is "where
|
|
53
|
+
* visitors should write for help"). Absent when it does not.
|
|
54
|
+
*/
|
|
55
|
+
contact?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* The visitor's sentence.
|
|
59
|
+
*
|
|
60
|
+
* Three things it must not do, all of which the generic error branch did or
|
|
61
|
+
* a friendlier rewrite would:
|
|
62
|
+
*
|
|
63
|
+
* 1. **Not blame the visitor.** They filled in a form correctly. Nothing
|
|
64
|
+
* about their message, their address or their retry is the reason.
|
|
65
|
+
* 2. **Not explain.** "Unusual volume", "temporarily over its limit", even
|
|
66
|
+
* "this site is receiving too many messages" all tell a stranger
|
|
67
|
+
* something about the site owner's account that the owner never chose to
|
|
68
|
+
* publish. The refusal is the owner's problem to see, not the caller's.
|
|
69
|
+
* 3. **Not sound delivered.** "We'll get back to you", or anything ending
|
|
70
|
+
* in a thank-you, converts a lost lead into a person waiting for a reply
|
|
71
|
+
* that is never coming. So it says, in as many words, that the message
|
|
72
|
+
* was not sent.
|
|
73
|
+
*
|
|
74
|
+
* What is left is short on purpose. The one genuinely useful thing to add is
|
|
75
|
+
* a door that still opens, which is why `contact` rides along.
|
|
76
|
+
*/
|
|
77
|
+
export declare const FORM_UNAVAILABLE_MESSAGE: string;
|
|
78
|
+
/**
|
|
79
|
+
* Does this refused submit mean "this site's form is not accepting", rather
|
|
80
|
+
* than "something broke"?
|
|
81
|
+
*
|
|
82
|
+
* Takes the BODY only, deliberately. The obvious signature — `(status, body)`,
|
|
83
|
+
* matching `parseLockdownRefusal` — invites a caller to gate on the status
|
|
84
|
+
* first, and the status is precisely what does not distinguish this refusal
|
|
85
|
+
* from the Free plan's monthly wall. A caller holding only this function
|
|
86
|
+
* cannot make that mistake.
|
|
87
|
+
*
|
|
88
|
+
* Returns `null` for every other body, so a caller's existing generic error
|
|
89
|
+
* branch keeps handling real failures. Dressing a 500 as a deliberate pause
|
|
90
|
+
* would be the same class of lie in the other direction.
|
|
91
|
+
*/
|
|
92
|
+
export declare function parseFormUnavailableRefusal(body: unknown): FormUnavailableNotice | null;
|
|
93
|
+
/** What the site's owner is shown while their form is paused. */
|
|
94
|
+
export interface FormsPausedOwnerNotice {
|
|
95
|
+
title: string;
|
|
96
|
+
/** What happened, how many, and that none of it is billed. */
|
|
97
|
+
message: string;
|
|
98
|
+
/** When it lifts, as a local-reading sentence — never a raw month key. */
|
|
99
|
+
until: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* The moment the ceiling resets: 00:00 UTC on the first of next month, which
|
|
103
|
+
* is the same boundary AGL-1655's `Retry-After` points at and the same one
|
|
104
|
+
* the `YYYY-MM` counter key rolls over on.
|
|
105
|
+
*/
|
|
106
|
+
export declare function formCeilingResetAt(now?: Date): Date;
|
|
107
|
+
/**
|
|
108
|
+
* The honeypot's month, as the one sentence every surface renders (AGL-1831
|
|
109
|
+
* staff chip tooltip, AGL-1836 owner inbox notice).
|
|
110
|
+
*
|
|
111
|
+
* The framing is the point, and it is why the sentence lives here instead of
|
|
112
|
+
* in either component: the count reports the honeypot WORKING — caught and
|
|
113
|
+
* dropped, nothing stored, nothing billed — not something wrong. A surface
|
|
114
|
+
* that restated it could drift into alarm ("N spam attacks!") and train the
|
|
115
|
+
* owner to fear the number that should reassure them. It is also the
|
|
116
|
+
* AGL-1664 revisit input: spam creeping toward ~20% of a paying host's
|
|
117
|
+
* submissions is the trigger for reopening the App Check / CAPTCHA call.
|
|
118
|
+
*
|
|
119
|
+
* Returns `null` below one catch, same rule as `formSubmissionsPausedNotice`
|
|
120
|
+
* and for the same reason — the counter document persists from its first
|
|
121
|
+
* catch forever, and a reassuring zero trains the reader to ignore the row.
|
|
122
|
+
*/
|
|
123
|
+
export declare function formSpamCaughtNotice(input: {
|
|
124
|
+
spam: number;
|
|
125
|
+
}): string | null;
|
|
126
|
+
/**
|
|
127
|
+
* The owner's notice — the half deliberately withheld from the visitor.
|
|
128
|
+
*
|
|
129
|
+
* Shaped like `LockdownRefusalNotice` ({title, message, until}) so the
|
|
130
|
+
* console renders it with the same three lines `LockdownNotice` already
|
|
131
|
+
* establishes for "a thing is blocked, here is why and how it ends". The
|
|
132
|
+
* console surface for a blocked thing should not look different depending on
|
|
133
|
+
* which subsystem blocked it.
|
|
134
|
+
*
|
|
135
|
+
* Returns `null` below one refusal, so a quiet month renders nothing at all
|
|
136
|
+
* rather than a reassuring zero — the counter document exists from the first
|
|
137
|
+
* trip and never goes away, and "0 refused" on every subsequent month is
|
|
138
|
+
* noise that trains the owner to ignore the row that will one day be real.
|
|
139
|
+
*/
|
|
140
|
+
export declare function formSubmissionsPausedNotice(input: {
|
|
141
|
+
/** Refusals recorded for the month being displayed. */
|
|
142
|
+
refused: number;
|
|
143
|
+
/** The site's ceiling, from the counter document. Omitted if unknown. */
|
|
144
|
+
ceiling?: number;
|
|
145
|
+
now?: Date;
|
|
146
|
+
}): FormsPausedOwnerNotice | null;
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { _ as _extends } from "@swc/helpers/_/_extends";
|
|
2
|
+
/**
|
|
3
|
+
* @license
|
|
4
|
+
* Copyright 2026 Aglyn LLC
|
|
5
|
+
*
|
|
6
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
* you may not use this file except in compliance with the License.
|
|
8
|
+
* You may obtain a copy of the License at
|
|
9
|
+
*
|
|
10
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
*
|
|
12
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
* See the License for the specific language governing permissions and
|
|
16
|
+
* limitations under the License.
|
|
17
|
+
*/ /**
|
|
18
|
+
* The two audiences of a tripped form-submission abuse ceiling (AGL-1666).
|
|
19
|
+
*
|
|
20
|
+
* AGL-1655 made the ceiling refuse correctly and bill nothing, but it refused
|
|
21
|
+
* into silence: the visitor got the component's generic "something went
|
|
22
|
+
* wrong" and the site's owner got a Firestore document. This module holds the
|
|
23
|
+
* words both of them see, in one place, because the two are constrained in
|
|
24
|
+
* OPPOSITE directions and a single file is the only way to keep that visible:
|
|
25
|
+
*
|
|
26
|
+
* - The **visitor** is a stranger to the site. They must be told plainly
|
|
27
|
+
* that their message did not arrive, and must NOT be told why — that this
|
|
28
|
+
* site passed an abuse threshold is the owner's business, not a caller's.
|
|
29
|
+
* - The **owner** needs exactly the withheld half: the count, the ceiling,
|
|
30
|
+
* and when it lifts.
|
|
31
|
+
*/ /**
|
|
32
|
+
* Refusal code carried by the abuse-ceiling 429 (AGL-1655).
|
|
33
|
+
*
|
|
34
|
+
* The Free plan's monthly wall answers 429 too, so the STATUS identifies
|
|
35
|
+
* nothing — this code is the whole discriminator, and one means "the customer
|
|
36
|
+
* needs a bigger plan" while the other means "this site is being flooded".
|
|
37
|
+
* Shared rather than restated so the producer and the consumer cannot drift.
|
|
38
|
+
*/ export const FORM_ABUSE_CEILING_CODE = 'form-abuse-ceiling';
|
|
39
|
+
/**
|
|
40
|
+
* The month key both the billable counter and the refusal counter are keyed
|
|
41
|
+
* by. UTC, matching the month boundary the ceiling resets on.
|
|
42
|
+
*/ export function submissionMonthKey(now = new Date()) {
|
|
43
|
+
return now.toISOString().slice(0, 7);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The visitor's sentence.
|
|
47
|
+
*
|
|
48
|
+
* Three things it must not do, all of which the generic error branch did or
|
|
49
|
+
* a friendlier rewrite would:
|
|
50
|
+
*
|
|
51
|
+
* 1. **Not blame the visitor.** They filled in a form correctly. Nothing
|
|
52
|
+
* about their message, their address or their retry is the reason.
|
|
53
|
+
* 2. **Not explain.** "Unusual volume", "temporarily over its limit", even
|
|
54
|
+
* "this site is receiving too many messages" all tell a stranger
|
|
55
|
+
* something about the site owner's account that the owner never chose to
|
|
56
|
+
* publish. The refusal is the owner's problem to see, not the caller's.
|
|
57
|
+
* 3. **Not sound delivered.** "We'll get back to you", or anything ending
|
|
58
|
+
* in a thank-you, converts a lost lead into a person waiting for a reply
|
|
59
|
+
* that is never coming. So it says, in as many words, that the message
|
|
60
|
+
* was not sent.
|
|
61
|
+
*
|
|
62
|
+
* What is left is short on purpose. The one genuinely useful thing to add is
|
|
63
|
+
* a door that still opens, which is why `contact` rides along.
|
|
64
|
+
*/ export const FORM_UNAVAILABLE_MESSAGE = 'This form isn’t accepting messages right now, so your message was not ' + 'sent. Please try again later.';
|
|
65
|
+
/**
|
|
66
|
+
* A site's published support address is author-written, so it is validated
|
|
67
|
+
* before being rendered as a link rather than trusted. Conservative on
|
|
68
|
+
* purpose: a rejected address costs the visitor a convenience, an accepted
|
|
69
|
+
* junk one costs them a bounced email and the site a lead it never learns it
|
|
70
|
+
* lost. The `mailto:` scheme is written by the renderer, not taken from here,
|
|
71
|
+
* so this is a plausibility check and not the injection defence.
|
|
72
|
+
*/ const CONTACT_EMAIL_PATTERN = /^[^\s@<>"']+@[^\s@<>"'.]+(\.[^\s@<>"'.]+)+$/;
|
|
73
|
+
/**
|
|
74
|
+
* Does this refused submit mean "this site's form is not accepting", rather
|
|
75
|
+
* than "something broke"?
|
|
76
|
+
*
|
|
77
|
+
* Takes the BODY only, deliberately. The obvious signature — `(status, body)`,
|
|
78
|
+
* matching `parseLockdownRefusal` — invites a caller to gate on the status
|
|
79
|
+
* first, and the status is precisely what does not distinguish this refusal
|
|
80
|
+
* from the Free plan's monthly wall. A caller holding only this function
|
|
81
|
+
* cannot make that mistake.
|
|
82
|
+
*
|
|
83
|
+
* Returns `null` for every other body, so a caller's existing generic error
|
|
84
|
+
* branch keeps handling real failures. Dressing a 500 as a deliberate pause
|
|
85
|
+
* would be the same class of lie in the other direction.
|
|
86
|
+
*/ export function parseFormUnavailableRefusal(body) {
|
|
87
|
+
if (!body || typeof body !== 'object') return null;
|
|
88
|
+
const payload = body;
|
|
89
|
+
if (payload.code !== FORM_ABUSE_CEILING_CODE) return null;
|
|
90
|
+
const contact = typeof payload.contact === 'string' && payload.contact.trim() ? payload.contact.trim() : undefined;
|
|
91
|
+
return _extends({
|
|
92
|
+
message: FORM_UNAVAILABLE_MESSAGE
|
|
93
|
+
}, contact && CONTACT_EMAIL_PATTERN.test(contact) ? {
|
|
94
|
+
contact
|
|
95
|
+
} : {});
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* The moment the ceiling resets: 00:00 UTC on the first of next month, which
|
|
99
|
+
* is the same boundary AGL-1655's `Retry-After` points at and the same one
|
|
100
|
+
* the `YYYY-MM` counter key rolls over on.
|
|
101
|
+
*/ export function formCeilingResetAt(now = new Date()) {
|
|
102
|
+
return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1));
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* The honeypot's month, as the one sentence every surface renders (AGL-1831
|
|
106
|
+
* staff chip tooltip, AGL-1836 owner inbox notice).
|
|
107
|
+
*
|
|
108
|
+
* The framing is the point, and it is why the sentence lives here instead of
|
|
109
|
+
* in either component: the count reports the honeypot WORKING — caught and
|
|
110
|
+
* dropped, nothing stored, nothing billed — not something wrong. A surface
|
|
111
|
+
* that restated it could drift into alarm ("N spam attacks!") and train the
|
|
112
|
+
* owner to fear the number that should reassure them. It is also the
|
|
113
|
+
* AGL-1664 revisit input: spam creeping toward ~20% of a paying host's
|
|
114
|
+
* submissions is the trigger for reopening the App Check / CAPTCHA call.
|
|
115
|
+
*
|
|
116
|
+
* Returns `null` below one catch, same rule as `formSubmissionsPausedNotice`
|
|
117
|
+
* and for the same reason — the counter document persists from its first
|
|
118
|
+
* catch forever, and a reassuring zero trains the reader to ignore the row.
|
|
119
|
+
*/ export function formSpamCaughtNotice(input) {
|
|
120
|
+
const spam = Math.floor(Number(input.spam) || 0);
|
|
121
|
+
if (spam < 1) return null;
|
|
122
|
+
return `${spam.toLocaleString()} bot submission${spam === 1 ? '' : 's'} ` + `${spam === 1 ? 'was' : 'were'} caught and dropped by the honeypot ` + `this month — nothing was stored or billed.`;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The owner's notice — the half deliberately withheld from the visitor.
|
|
126
|
+
*
|
|
127
|
+
* Shaped like `LockdownRefusalNotice` ({title, message, until}) so the
|
|
128
|
+
* console renders it with the same three lines `LockdownNotice` already
|
|
129
|
+
* establishes for "a thing is blocked, here is why and how it ends". The
|
|
130
|
+
* console surface for a blocked thing should not look different depending on
|
|
131
|
+
* which subsystem blocked it.
|
|
132
|
+
*
|
|
133
|
+
* Returns `null` below one refusal, so a quiet month renders nothing at all
|
|
134
|
+
* rather than a reassuring zero — the counter document exists from the first
|
|
135
|
+
* trip and never goes away, and "0 refused" on every subsequent month is
|
|
136
|
+
* noise that trains the owner to ignore the row that will one day be real.
|
|
137
|
+
*/ export function formSubmissionsPausedNotice(input) {
|
|
138
|
+
var _input_now;
|
|
139
|
+
const refused = Math.floor(Number(input.refused) || 0);
|
|
140
|
+
if (refused < 1) return null;
|
|
141
|
+
const now = (_input_now = input.now) != null ? _input_now : new Date();
|
|
142
|
+
const ceiling = typeof input.ceiling === 'number' && Number.isFinite(input.ceiling) ? Math.floor(input.ceiling) : undefined;
|
|
143
|
+
const reset = formCeilingResetAt(now).toLocaleDateString(undefined, {
|
|
144
|
+
year: 'numeric',
|
|
145
|
+
month: 'long',
|
|
146
|
+
day: 'numeric',
|
|
147
|
+
// The boundary is a UTC instant; rendering it in the reader's zone would
|
|
148
|
+
// move a 1 September reset to 31 August for most of the Americas.
|
|
149
|
+
timeZone: 'UTC'
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
title: 'Form submissions are paused',
|
|
153
|
+
message: `${refused.toLocaleString()} submission${refused === 1 ? '' : 's'} ` + `to this site ${refused === 1 ? 'has' : 'have'} been refused this month` + (ceiling ? ` after it passed ${ceiling.toLocaleString()} submissions` : '') + '. Refused submissions are not stored and are not billed. This ' + 'usually means a bot is filling in one of your forms — if it is real ' + 'traffic, contact support and we will raise the limit.',
|
|
154
|
+
until: `Submissions start being accepted again on ${reset}.`
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
//# sourceMappingURL=form-abuse-ceiling.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/form-abuse-ceiling.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 two audiences of a tripped form-submission abuse ceiling (AGL-1666).\n *\n * AGL-1655 made the ceiling refuse correctly and bill nothing, but it refused\n * into silence: the visitor got the component's generic \"something went\n * wrong\" and the site's owner got a Firestore document. This module holds the\n * words both of them see, in one place, because the two are constrained in\n * OPPOSITE directions and a single file is the only way to keep that visible:\n *\n * - The **visitor** is a stranger to the site. They must be told plainly\n * that their message did not arrive, and must NOT be told why — that this\n * site passed an abuse threshold is the owner's business, not a caller's.\n * - The **owner** needs exactly the withheld half: the count, the ceiling,\n * and when it lifts.\n */\n\n/**\n * Refusal code carried by the abuse-ceiling 429 (AGL-1655).\n *\n * The Free plan's monthly wall answers 429 too, so the STATUS identifies\n * nothing — this code is the whole discriminator, and one means \"the customer\n * needs a bigger plan\" while the other means \"this site is being flooded\".\n * Shared rather than restated so the producer and the consumer cannot drift.\n */\nexport const FORM_ABUSE_CEILING_CODE = 'form-abuse-ceiling'\n\n/**\n * The month key both the billable counter and the refusal counter are keyed\n * by. UTC, matching the month boundary the ceiling resets on.\n */\nexport function submissionMonthKey(now: Date = new Date()): string {\n return now.toISOString().slice(0, 7)\n}\n\n/** What the visitor is shown when a site's form is not accepting. */\nexport interface FormUnavailableNotice {\n /** The whole message. Fixed copy — never the server's terse `error`. */\n message: string\n /**\n * An alternative way to reach the site, when the site publishes one\n * (`business.supportEmail`, the token whose own description is \"where\n * visitors should write for help\"). Absent when it does not.\n */\n contact?: string\n}\n\n/**\n * The visitor's sentence.\n *\n * Three things it must not do, all of which the generic error branch did or\n * a friendlier rewrite would:\n *\n * 1. **Not blame the visitor.** They filled in a form correctly. Nothing\n * about their message, their address or their retry is the reason.\n * 2. **Not explain.** \"Unusual volume\", \"temporarily over its limit\", even\n * \"this site is receiving too many messages\" all tell a stranger\n * something about the site owner's account that the owner never chose to\n * publish. The refusal is the owner's problem to see, not the caller's.\n * 3. **Not sound delivered.** \"We'll get back to you\", or anything ending\n * in a thank-you, converts a lost lead into a person waiting for a reply\n * that is never coming. So it says, in as many words, that the message\n * was not sent.\n *\n * What is left is short on purpose. The one genuinely useful thing to add is\n * a door that still opens, which is why `contact` rides along.\n */\nexport const FORM_UNAVAILABLE_MESSAGE =\n 'This form isn’t accepting messages right now, so your message was not ' +\n 'sent. Please try again later.'\n\n/**\n * A site's published support address is author-written, so it is validated\n * before being rendered as a link rather than trusted. Conservative on\n * purpose: a rejected address costs the visitor a convenience, an accepted\n * junk one costs them a bounced email and the site a lead it never learns it\n * lost. The `mailto:` scheme is written by the renderer, not taken from here,\n * so this is a plausibility check and not the injection defence.\n */\nconst CONTACT_EMAIL_PATTERN = /^[^\\s@<>\"']+@[^\\s@<>\"'.]+(\\.[^\\s@<>\"'.]+)+$/\n\n/**\n * Does this refused submit mean \"this site's form is not accepting\", rather\n * than \"something broke\"?\n *\n * Takes the BODY only, deliberately. The obvious signature — `(status, body)`,\n * matching `parseLockdownRefusal` — invites a caller to gate on the status\n * first, and the status is precisely what does not distinguish this refusal\n * from the Free plan's monthly wall. A caller holding only this function\n * cannot make that mistake.\n *\n * Returns `null` for every other body, so a caller's existing generic error\n * branch keeps handling real failures. Dressing a 500 as a deliberate pause\n * would be the same class of lie in the other direction.\n */\nexport function parseFormUnavailableRefusal(\n body: unknown,\n): FormUnavailableNotice | null {\n if (!body || typeof body !== 'object') return null\n const payload = body as { code?: unknown; contact?: unknown }\n if (payload.code !== FORM_ABUSE_CEILING_CODE) return null\n const contact =\n typeof payload.contact === 'string' && payload.contact.trim()\n ? payload.contact.trim()\n : undefined\n return {\n message: FORM_UNAVAILABLE_MESSAGE,\n ...(contact && CONTACT_EMAIL_PATTERN.test(contact) ? { contact } : {}),\n }\n}\n\n/** What the site's owner is shown while their form is paused. */\nexport interface FormsPausedOwnerNotice {\n title: string\n /** What happened, how many, and that none of it is billed. */\n message: string\n /** When it lifts, as a local-reading sentence — never a raw month key. */\n until: string\n}\n\n/**\n * The moment the ceiling resets: 00:00 UTC on the first of next month, which\n * is the same boundary AGL-1655's `Retry-After` points at and the same one\n * the `YYYY-MM` counter key rolls over on.\n */\nexport function formCeilingResetAt(now: Date = new Date()): Date {\n return new Date(Date.UTC(now.getUTCFullYear(), now.getUTCMonth() + 1, 1))\n}\n\n/**\n * The honeypot's month, as the one sentence every surface renders (AGL-1831\n * staff chip tooltip, AGL-1836 owner inbox notice).\n *\n * The framing is the point, and it is why the sentence lives here instead of\n * in either component: the count reports the honeypot WORKING — caught and\n * dropped, nothing stored, nothing billed — not something wrong. A surface\n * that restated it could drift into alarm (\"N spam attacks!\") and train the\n * owner to fear the number that should reassure them. It is also the\n * AGL-1664 revisit input: spam creeping toward ~20% of a paying host's\n * submissions is the trigger for reopening the App Check / CAPTCHA call.\n *\n * Returns `null` below one catch, same rule as `formSubmissionsPausedNotice`\n * and for the same reason — the counter document persists from its first\n * catch forever, and a reassuring zero trains the reader to ignore the row.\n */\nexport function formSpamCaughtNotice(input: { spam: number }): string | null {\n const spam = Math.floor(Number(input.spam) || 0)\n if (spam < 1) return null\n return (\n `${spam.toLocaleString()} bot submission${spam === 1 ? '' : 's'} ` +\n `${spam === 1 ? 'was' : 'were'} caught and dropped by the honeypot ` +\n `this month — nothing was stored or billed.`\n )\n}\n\n/**\n * The owner's notice — the half deliberately withheld from the visitor.\n *\n * Shaped like `LockdownRefusalNotice` ({title, message, until}) so the\n * console renders it with the same three lines `LockdownNotice` already\n * establishes for \"a thing is blocked, here is why and how it ends\". The\n * console surface for a blocked thing should not look different depending on\n * which subsystem blocked it.\n *\n * Returns `null` below one refusal, so a quiet month renders nothing at all\n * rather than a reassuring zero — the counter document exists from the first\n * trip and never goes away, and \"0 refused\" on every subsequent month is\n * noise that trains the owner to ignore the row that will one day be real.\n */\nexport function formSubmissionsPausedNotice(input: {\n /** Refusals recorded for the month being displayed. */\n refused: number\n /** The site's ceiling, from the counter document. Omitted if unknown. */\n ceiling?: number\n now?: Date\n}): FormsPausedOwnerNotice | null {\n const refused = Math.floor(Number(input.refused) || 0)\n if (refused < 1) return null\n const now = input.now ?? new Date()\n const ceiling =\n typeof input.ceiling === 'number' && Number.isFinite(input.ceiling)\n ? Math.floor(input.ceiling)\n : undefined\n const reset = formCeilingResetAt(now).toLocaleDateString(undefined, {\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n // The boundary is a UTC instant; rendering it in the reader's zone would\n // move a 1 September reset to 31 August for most of the Americas.\n timeZone: 'UTC',\n })\n return {\n title: 'Form submissions are paused',\n message:\n `${refused.toLocaleString()} submission${refused === 1 ? '' : 's'} ` +\n `to this site ${refused === 1 ? 'has' : 'have'} been refused this month` +\n (ceiling\n ? ` after it passed ${ceiling.toLocaleString()} submissions`\n : '') +\n '. Refused submissions are not stored and are not billed. This ' +\n 'usually means a bot is filling in one of your forms — if it is real ' +\n 'traffic, contact support and we will raise the limit.',\n until: `Submissions start being accepted again on ${reset}.`,\n }\n}\n"],"names":["FORM_ABUSE_CEILING_CODE","submissionMonthKey","now","Date","toISOString","slice","FORM_UNAVAILABLE_MESSAGE","CONTACT_EMAIL_PATTERN","parseFormUnavailableRefusal","body","payload","code","contact","trim","undefined","message","test","formCeilingResetAt","UTC","getUTCFullYear","getUTCMonth","formSpamCaughtNotice","input","spam","Math","floor","Number","toLocaleString","formSubmissionsPausedNotice","refused","ceiling","isFinite","reset","toLocaleDateString","year","month","day","timeZone","title","until"],"mappings":";AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;CAcC,GAED;;;;;;;CAOC,GACD,OAAO,MAAMA,0BAA0B,qBAAoB;AAE3D;;;CAGC,GACD,OAAO,SAASC,mBAAmBC,MAAY,IAAIC,MAAM;IACvD,OAAOD,IAAIE,WAAW,GAAGC,KAAK,CAAC,GAAG;AACpC;AAcA;;;;;;;;;;;;;;;;;;;CAmBC,GACD,OAAO,MAAMC,2BACX,2EACA,gCAA+B;AAEjC;;;;;;;CAOC,GACD,MAAMC,wBAAwB;AAE9B;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASC,4BACdC,IAAa;IAEb,IAAI,CAACA,QAAQ,OAAOA,SAAS,UAAU,OAAO;IAC9C,MAAMC,UAAUD;IAChB,IAAIC,QAAQC,IAAI,KAAKX,yBAAyB,OAAO;IACrD,MAAMY,UACJ,OAAOF,QAAQE,OAAO,KAAK,YAAYF,QAAQE,OAAO,CAACC,IAAI,KACvDH,QAAQE,OAAO,CAACC,IAAI,KACpBC;IACN,OAAO;QACLC,SAAST;OACLM,WAAWL,sBAAsBS,IAAI,CAACJ,WAAW;QAAEA;IAAQ,IAAI,CAAC;AAExE;AAWA;;;;CAIC,GACD,OAAO,SAASK,mBAAmBf,MAAY,IAAIC,MAAM;IACvD,OAAO,IAAIA,KAAKA,KAAKe,GAAG,CAAChB,IAAIiB,cAAc,IAAIjB,IAAIkB,WAAW,KAAK,GAAG;AACxE;AAEA;;;;;;;;;;;;;;;CAeC,GACD,OAAO,SAASC,qBAAqBC,KAAuB;IAC1D,MAAMC,OAAOC,KAAKC,KAAK,CAACC,OAAOJ,MAAMC,IAAI,KAAK;IAC9C,IAAIA,OAAO,GAAG,OAAO;IACrB,OACE,GAAGA,KAAKI,cAAc,GAAG,eAAe,EAAEJ,SAAS,IAAI,KAAK,IAAI,CAAC,CAAC,GAClE,GAAGA,SAAS,IAAI,QAAQ,OAAO,oCAAoC,CAAC,GACpE,CAAC,0CAA0C,CAAC;AAEhD;AAEA;;;;;;;;;;;;;CAaC,GACD,OAAO,SAASK,4BAA4BN,KAM3C;QAGaA;IAFZ,MAAMO,UAAUL,KAAKC,KAAK,CAACC,OAAOJ,MAAMO,OAAO,KAAK;IACpD,IAAIA,UAAU,GAAG,OAAO;IACxB,MAAM3B,OAAMoB,aAAAA,MAAMpB,GAAG,YAAToB,aAAa,IAAInB;IAC7B,MAAM2B,UACJ,OAAOR,MAAMQ,OAAO,KAAK,YAAYJ,OAAOK,QAAQ,CAACT,MAAMQ,OAAO,IAC9DN,KAAKC,KAAK,CAACH,MAAMQ,OAAO,IACxBhB;IACN,MAAMkB,QAAQf,mBAAmBf,KAAK+B,kBAAkB,CAACnB,WAAW;QAClEoB,MAAM;QACNC,OAAO;QACPC,KAAK;QACL,yEAAyE;QACzE,kEAAkE;QAClEC,UAAU;IACZ;IACA,OAAO;QACLC,OAAO;QACPvB,SACE,GAAGc,QAAQF,cAAc,GAAG,WAAW,EAAEE,YAAY,IAAI,KAAK,IAAI,CAAC,CAAC,GACpE,CAAC,aAAa,EAAEA,YAAY,IAAI,QAAQ,OAAO,wBAAwB,CAAC,GACvEC,CAAAA,UACG,CAAC,iBAAiB,EAAEA,QAAQH,cAAc,GAAG,YAAY,CAAC,GAC1D,EAAC,IACL,mEACA,yEACA;QACFY,OAAO,CAAC,0CAA0C,EAAEP,MAAM,CAAC,CAAC;IAC9D;AACF"}
|
|
@@ -0,0 +1,198 @@
|
|
|
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
|
+
* What a form's DESIGN must still satisfy for its submissions to arrive.
|
|
19
|
+
*
|
|
20
|
+
* A reusable component is only ever drawn: the worst an author can do to one
|
|
21
|
+
* is make it ugly, and the page still renders. A form is drawn AND it is a
|
|
22
|
+
* contract — `/api/forms/submit` keys submissions on its id, reads consent out
|
|
23
|
+
* of a field it names, and creates a lead from an address it expects to find.
|
|
24
|
+
* Every one of those couplings is resolved by NAME at submit time, so the
|
|
25
|
+
* design can break them, and breaking them is silent in every case: the form
|
|
26
|
+
* still renders, the visitor still submits, the row still lands, and the thing
|
|
27
|
+
* the merchant believed they were collecting is simply not there.
|
|
28
|
+
*
|
|
29
|
+
* That asymmetry is the whole reason this module exists. Publishing a form is
|
|
30
|
+
* not "save the drawing"; it is "promise the server can still read this".
|
|
31
|
+
*
|
|
32
|
+
* ## The six silent failures, and why each one is checked here
|
|
33
|
+
*
|
|
34
|
+
* Every check below corresponds to something a design can do that produces NO
|
|
35
|
+
* error at submit time. A design that fails loudly needs no guard — the author
|
|
36
|
+
* finds out. These are the ones where nobody finds out.
|
|
37
|
+
*
|
|
38
|
+
* 1. **The form node stops naming this form.** Submissions carry `formId` and
|
|
39
|
+
* the route stamps it only after verifying it against this host's forms;
|
|
40
|
+
* the Inbox's per-form list is an equality on it. Clear or rebind it and
|
|
41
|
+
* every later submission is unattributable — while still landing in the
|
|
42
|
+
* Inbox, so nothing looks broken and the form's own list just stops
|
|
43
|
+
* growing.
|
|
44
|
+
* 2. **A field with no name.** `formFieldDeclsFromNodes` drops it, and the
|
|
45
|
+
* runtime falls back to `name = fieldName || 'field'`, so several unnamed
|
|
46
|
+
* inputs collapse onto ONE submission key. The visitor types, the value is
|
|
47
|
+
* posted, and it is not retrievable under any name the author knows.
|
|
48
|
+
* 3. **Two fields sharing a name.** `FormData` joins entries under one key,
|
|
49
|
+
* so the second input contributes no separate value and the declaration
|
|
50
|
+
* keeps only the first. Two questions, one answer.
|
|
51
|
+
* 4. **Lead routing with nothing to extract an address from.**
|
|
52
|
+
* `routing.lead` only ever fires when `extractEmailFromFields` finds one,
|
|
53
|
+
* and that prefers a key matching `/email/i` before falling back to any
|
|
54
|
+
* email-shaped value. A form with no such field can still route to leads
|
|
55
|
+
* on paper and never create one.
|
|
56
|
+
* 5. **Lead routing with nothing that records consent.** The route files
|
|
57
|
+
* the lead either way, and stamps an opt-in on it only from the field the
|
|
58
|
+
* form declares or from an undeclared field on the closed name list it
|
|
59
|
+
* falls back to. A form with neither files leads nobody may email — the
|
|
60
|
+
* send-time consent join refuses every one — so the sales team works a
|
|
61
|
+
* list the campaigns cannot reach, and nothing at submit time says so.
|
|
62
|
+
* 6. **A consent field that no longer exists.** `readFormDeclaredConsent`
|
|
63
|
+
* looks up exactly `consentFieldName`. Rename or delete that field and it
|
|
64
|
+
* returns `false` forever — the form keeps collecting the tick and the
|
|
65
|
+
* opt-in stops being recorded. This is the one with consequences outside
|
|
66
|
+
* the product, since an advertising basis that quietly stops is
|
|
67
|
+
* indistinguishable downstream from one that was never given.
|
|
68
|
+
*
|
|
69
|
+
* ## What is NOT checked
|
|
70
|
+
*
|
|
71
|
+
* Anything the author can see. A missing label, an empty select, a field in
|
|
72
|
+
* the wrong order — those are visible on the canvas and are the author's to
|
|
73
|
+
* judge. This module is only for couplings that are invisible at design time
|
|
74
|
+
* and asymptomatic at run time.
|
|
75
|
+
*
|
|
76
|
+
* Pure and dependency-free, like `forms.ts` beside it: it reaches client
|
|
77
|
+
* bundles through `app-utils/index`, so nothing here may import a Node
|
|
78
|
+
* builtin.
|
|
79
|
+
*/
|
|
80
|
+
import type { AglynNodeSchema, NodeId } from '../foundation/definitions/components.types';
|
|
81
|
+
import { type FormDocument } from './forms';
|
|
82
|
+
/**
|
|
83
|
+
* Which coupling a violation is about.
|
|
84
|
+
*
|
|
85
|
+
* A code rather than a message so a caller can decide presentation — the
|
|
86
|
+
* besigner shows these beside the offending node, the API route puts them in
|
|
87
|
+
* a 422 body — without either one parsing prose.
|
|
88
|
+
*/
|
|
89
|
+
export type FormContractViolationCode = 'forms-off-for-site' | 'form-node-missing' | 'form-id-unbound' | 'field-unnamed' | 'field-name-duplicated' | 'lead-routing-has-no-email-field' | 'lead-routing-has-no-consent-field' | 'consent-field-missing';
|
|
90
|
+
/** One way this design would fail to keep the server's side of the bargain. */
|
|
91
|
+
export interface FormContractViolation {
|
|
92
|
+
code: FormContractViolationCode;
|
|
93
|
+
/** The node the author has to fix, when a single node is at fault. */
|
|
94
|
+
nodeId?: NodeId;
|
|
95
|
+
/** The name at issue, for the two checks that are about names. */
|
|
96
|
+
fieldName?: string;
|
|
97
|
+
/** Author-facing, and stated as the CONSEQUENCE rather than the rule. */
|
|
98
|
+
message: string;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Whether a submission carrying these fields could yield an address to key
|
|
102
|
+
* a lead on — the one precondition of lead routing (AGL-2612).
|
|
103
|
+
*
|
|
104
|
+
* Exported because the check is asked in two places that never see a node
|
|
105
|
+
* tree: the form's own page decides whether to offer the routing switch, and
|
|
106
|
+
* the CRM's Leads section offers to turn routing on for a form from the
|
|
107
|
+
* declared field list alone. Both must agree with the publish check here or
|
|
108
|
+
* a switch flipped on one surface is refused on the next.
|
|
109
|
+
*/
|
|
110
|
+
export declare function formFieldsCanYieldAnEmail(fields: ReadonlyArray<{
|
|
111
|
+
fieldName: string;
|
|
112
|
+
fieldType: string;
|
|
113
|
+
}>): boolean;
|
|
114
|
+
/**
|
|
115
|
+
* Whether a submission carrying these fields could record an opt-in — the
|
|
116
|
+
* other precondition of lead routing, and the one that decides whether a
|
|
117
|
+
* lead is worth filing: a lead nobody consented with is one the campaigns
|
|
118
|
+
* refuse at send time.
|
|
119
|
+
*
|
|
120
|
+
* Consent is recorded from the field the form DECLARES, or, when it declares
|
|
121
|
+
* none, from an undeclared field the route recognizes by name. Whether a
|
|
122
|
+
* declared field still exists is `consent-field-missing`'s question, asked
|
|
123
|
+
* separately so a lost field is reported once, as the loss it is.
|
|
124
|
+
*
|
|
125
|
+
* Exported for the same two surfaces as {@link formFieldsCanYieldAnEmail}:
|
|
126
|
+
* the switch on the form's page and the Leads section's offer must refuse
|
|
127
|
+
* what the publish check would refuse.
|
|
128
|
+
*/
|
|
129
|
+
export declare function formFieldsCaptureConsent(fields: ReadonlyArray<{
|
|
130
|
+
fieldName: string;
|
|
131
|
+
}>, consentFieldName: string | null | undefined): boolean;
|
|
132
|
+
/**
|
|
133
|
+
* A site that switched Forms off (AGL-3029) publishes no form — neither a form
|
|
134
|
+
* design nor a page, layout or component that carries one.
|
|
135
|
+
*
|
|
136
|
+
* Not one of the six silent failures above, and checked ahead of all of them:
|
|
137
|
+
* on such a site the published page does not draw a form and `/api/forms/submit`
|
|
138
|
+
* refuses every submission, so publishing one would put a hole on a live page
|
|
139
|
+
* while the author believed they had shipped a form. Refusing it is what makes
|
|
140
|
+
* the empty space on a page published BEFORE the switch the only kind there is.
|
|
141
|
+
*/
|
|
142
|
+
export declare const FORMS_OFF_FOR_SITE_VIOLATION: FormContractViolation;
|
|
143
|
+
/**
|
|
144
|
+
* Whether a node map carries a form: a `form` node anywhere in it, bound to
|
|
145
|
+
* an entity or drawn inline. Read by `componentId`, which every form node has
|
|
146
|
+
* carried from the start, rather than by the `pluginId` a node was stamped
|
|
147
|
+
* with when it was placed.
|
|
148
|
+
*/
|
|
149
|
+
export declare function nodesCarryForm(nodes: Record<NodeId, AglynNodeSchema | undefined> | undefined | null): boolean;
|
|
150
|
+
/**
|
|
151
|
+
* The same refusal, for a page, layout or component that CARRIES a form: the
|
|
152
|
+
* sentence names the two ways forward, because removing the form publishes
|
|
153
|
+
* the rest of the page.
|
|
154
|
+
*/
|
|
155
|
+
export declare const FORMS_OFF_FOR_SITE_PAGE_VIOLATION: FormContractViolation;
|
|
156
|
+
/**
|
|
157
|
+
* The refusal for publishing a page, layout or component that carries a form
|
|
158
|
+
* on a site that switched Forms off, or `null` (AGL-3029). `formsOnForSite`
|
|
159
|
+
* absent means the caller could not tell, which refuses nothing.
|
|
160
|
+
*/
|
|
161
|
+
export declare function formsOffPublishViolation(nodes: Record<NodeId, AglynNodeSchema | undefined> | undefined | null, formsOnForSite: boolean | undefined): FormContractViolation | null;
|
|
162
|
+
/**
|
|
163
|
+
* Everything this design would break, or an empty array.
|
|
164
|
+
*
|
|
165
|
+
* @param options.form the stored document, for what it ROUTES and what it
|
|
166
|
+
* names as its consent field. `routing` and
|
|
167
|
+
* `consentFieldName` are the only two parts read: the
|
|
168
|
+
* stored `fields` are the previous design's output,
|
|
169
|
+
* not a contract the new one owes anything to.
|
|
170
|
+
* @param options.formId the id this design is the design OF.
|
|
171
|
+
* @param options.nodes the flat node map, canvas or published.
|
|
172
|
+
* @param options.formNodeId the `form` node inside it.
|
|
173
|
+
* @param options.formsOnForSite whether Forms runs on the site the form is
|
|
174
|
+
* published to; `false` refuses the design outright.
|
|
175
|
+
* Absent, the caller could not tell, and nothing is
|
|
176
|
+
* refused for it.
|
|
177
|
+
*/
|
|
178
|
+
export declare function checkFormContract(options: {
|
|
179
|
+
form: Pick<FormDocument, 'routing' | 'consentFieldName'> | null | undefined;
|
|
180
|
+
formId: string;
|
|
181
|
+
nodes: Record<NodeId, AglynNodeSchema | undefined> | undefined | null;
|
|
182
|
+
formNodeId: NodeId | undefined | null;
|
|
183
|
+
/** Overridable for a host whose plugin registers these under other ids. */
|
|
184
|
+
componentIds?: {
|
|
185
|
+
form?: string;
|
|
186
|
+
formField?: string;
|
|
187
|
+
};
|
|
188
|
+
formsOnForSite?: boolean;
|
|
189
|
+
}): FormContractViolation[];
|
|
190
|
+
/**
|
|
191
|
+
* Whether this design may be published.
|
|
192
|
+
*
|
|
193
|
+
* Every violation is blocking. There is no advisory tier because there is no
|
|
194
|
+
* violation here an author would be right to ship: each one names data that
|
|
195
|
+
* silently fails to arrive, and a warning that can be clicked past is how a
|
|
196
|
+
* silent failure ships anyway.
|
|
197
|
+
*/
|
|
198
|
+
export declare function formContractIsSatisfied(violations: FormContractViolation[]): boolean;
|